<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:activity="http://activitystrea.ms/spec/1.0/" ><channel><title>明月の開発ストーリ</title><link>https://www.nowonbun.com</link><description>開発はいつも楽しい。最高のデベロッパーになるまで。プログラム専門ブラグ。</description><language>ja</language><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate><generator>nowonbun@gmail.com</generator><managingEditor>nowonbun@gmail.com</managingEditor><webMaster>nowonbun@gmail.com</webMaster><item><title>明月の開発ストーリ</title><link>https://www.nowonbun.com/index.html</link><description>明月の開発ストーリ</description><category>明月の開発ストーリ</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/index.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>check</title><link>https://www.nowonbun.com/333.html</link><description>&lt;p&gt;check&lt;/p&gt;</description><category>Other</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/333.html</guid><pubDate>Wed, 10 Apr 2024 19:03:53 +0900</pubDate></item><item><title>[Java] 64.Spring bootとReactを連結する方法(Buildする方法)</title><link>https://www.nowonbun.com/332.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はspring bootとreactを連結する方法(buildする方法)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近のプロジェクトのトレンドはフロントエンドとサーバーサイドの区分して作業します。実はこのように割り振って作業することはずいぶん前からのトレンドなんですが、私が遅い感じがありますね。私は最近までjavascriptとjqueryを使って画面とプログラムを作成しました。&lt;/p&gt;&lt;p&gt;プロジェクトを一人でやったことではないですが、この状況をそんなに悪いとは思わなかったんです。jqueryでも十分にspa(single page application)を実装できるし、私の感じではjqueryでシステムが遅いとも思わなかったんです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;しかし、jqueryからreactに変わらなければならないと思ったことが、一つ目はライブラリがもうjqueryを依存しない、使わないことです。そうするとjqueryを使う必要があるかと思いからです。&lt;/p&gt;&lt;p&gt;その同時に数多くのライブラリがangular、vue、reactを支援するし、その中でreactを選択した理由は単純にダウンロードが多いし、大勢の人が使うフレームワークだと思って選択しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前には画面を作成する時はただeclipseからhtmlを作成し、css、jsを作成しましたが、reactの場合はeclipseから作成することが簡単ではありません。&lt;/p&gt;&lt;p&gt;なのでreactはnode.jsを使ってvisual studio codeで開発してspring bootはintellijやeclipseで開発します。&lt;/p&gt;&lt;p&gt;各、別のideツールで開発すれば最終的にbuildしたら結果物が別に生成されるので、一つに合わせる作業が必要でしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;eclipseでspring bootの開発環境を設定する方法は以前に説明しました。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/323.html&quot; target=&quot;_blank&quot;&gt;[java] 57. eclipseでspring bootを設定する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてreactをvisual studio codeで開発環境を設定する方法も説明しました。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/331.html&quot; target=&quot;_blank&quot;&gt;[javascript] node.jsをインストールしてreactを使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それなら一旦、二つの開発環境を連結する方法は凄く簡単です。&lt;/p&gt;&lt;p&gt;reactのpackage.jsonファイルにspring bootのアドレスを連結すれば良いでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2347&quot; data-filename=&quot;001.png&quot; style=&quot;width: 355px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2348&quot; data-filename=&quot;002.png&quot; style=&quot;width: 211px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私はeclipseからspring bootのポートを8081で設定して、reactからproxyを8081に接続することに合わせました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてeclipseから下記とおりなデータを取得する関数を作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2349&quot; style=&quot;width: 788px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2350&quot; data-filename=&quot;004.png&quot; style=&quot;width: 418px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;spring bootとreactが連結されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はフロントエンドとサーバーサイドを一緒に開発するので、一つのローカルで作業しますが、もし、複数の人と割り振りされてうるならその仕様に合わせる開発サーバーにproxyを連結すれば良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでが開発環境でbuild設定を合わせます。&lt;/p&gt;&lt;p&gt;buildはまずフロントエンドのreactソースをビルドします。　そうするとhtmlとcss、jsを生成します。それをspring bootのstaticフォルダーに格納してspring bootをビルドします。&lt;/p&gt;&lt;p&gt;私の話はしやすいですが、実際に設定することは簡単ではなかったんです。それでグーグルを参照しました。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://github.com/eirslett/frontend-maven-plugin/issues/872&quot; target=&quot;_blank&quot;&gt;https://github.com/eirslett/frontend-maven-plugin/issues/872&lt;/a&gt;&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://github.com/eirslett/frontend-maven-plugin&quot; target=&quot;_blank&quot;&gt;https://github.com/eirslett/frontend-maven-plugin&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならspring bootのpom.xmlの設定を確認しましょう。&lt;/p&gt;&lt;p&gt;上でnode.jsとnpmのバージョンを実行する環境で合わせなければならないです。&lt;/p&gt;&lt;p&gt;コンソールからnpm versionコマンドで確認することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2351&quot; data-filename=&quot;005.png&quot; style=&quot;width: 232px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;設定は完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからビルドしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2352&quot; style=&quot;width: 790px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ログにreactがビルドすることを確認できますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2353&quot; data-filename=&quot;007.png&quot; style=&quot;width: 805px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;buildが完了しました。それならtargetフォルダーにjarファイルが生成されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、ウィンドウから圧縮内容を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2354&quot; data-filename=&quot;008.png&quot; style=&quot;width: 539px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jarファイル中でreactのhtmlとjs、cssが作成されてファイルがあることを確認できるでしょう。&lt;/p&gt;&lt;p&gt;それならjarファイルを実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2355&quot; data-filename=&quot;009.png&quot; style=&quot;width: 745px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行は問題なしでできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2356&quot; data-filename=&quot;010.png&quot; style=&quot;width: 399px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;画面も問題ないで実行できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからreactとspring bootを設定する開発環境設定は完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでspring bootとreactを連結する方法(buildする方法)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/332.html</guid><pubDate>Fri, 25 Mar 2022 21:04:05 +0900</pubDate></item><item><title>[Javascript] Node.jsをインストールしてReactを使う方法</title><link>https://www.nowonbun.com/331.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はnode.jsをインストールしてreactを使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私がアルバイトや勉強した時期を除いて、学校を卒業してプログラムを開発した経験が約14年から15年間になります。&lt;/p&gt;&lt;p&gt;始めから「ウェブ開発しよう」と思ってからやったことではなくcs(client server)プログラムから組み込み開発などの様々な分野でさまようした後、結局に需要が多いのウェブ開発者になりました。&lt;/p&gt;&lt;p&gt;ウェブというのは初期にはそんなに難しいと思わなかったですが、どの分野でも同じですが、知る深さが深くなるほど知るべきな規約も多いし、毎日に出るライブラリとフレームワークなどを学ばなければならないことが凄く多いですね。実はそれがウェブ開発の面白さかも知れません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;人により開発の価値観が違いますが、私の場合は新しいライブラリとフレームワークを早く学んで使うスタイルではありません。理由は様々がありますが、安定性の理由ですね。&lt;/p&gt;&lt;p&gt;javaの場合は始めjava servlet環境から始まってstruts(ストラッツ)、spring web framework、spring bootまで使いました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にはjava servletをかなり長い時間で使いましたが、フレームワークの必要性を感じて、struts(ストラッツ)を使った時がありました。始めにはservletより早い開発と特別な概念で良いと思いましたが、strutsが思ったより問題が多かったんです。structの問題なら代表的なことがセキュリティイッシューですね。&lt;/p&gt;&lt;p&gt;今でも理解できないことがservletにもできるinjection問題がstrutsにはなぜできないかな。。それでプロジェクトと関係ない回避コードもたくさん作るし、どの場合はフレームワークのライブラリのほぼを継承して再定義した時もありましたね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その経験があるので、フレームワークとライブラリを使いことが厳しくなりました。フレームワークというのは使ったら途中で変わることがずいぶん難しいでしょう。つまり、プロジェクトでstrutsを使いながらspringが良いと思ってフレームワークを簡単に変更できることがありません。普通は初めからやり直しするケースが多いです。&lt;/p&gt;&lt;p&gt;なので、spring web frameworkがトレンドになる時にも相当にjava servletを使って私のフレームワーク(?)を構築して使いました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;経歴の半ばまで多いチーム員とプロジェクトをやることより3~4人でやることが多いので、その方法が問題になるか大変な時が無かったんです。ただ、必要なら私が説明するし作ったら良いからです。&lt;/p&gt;&lt;p&gt;チーム員が多くなるし、様々なシステムと共に使う場合(microservices architecture)が出来てから大勢の人達と共有が可能なフレームワークを使う必要性を感じてspring web frameworkからspring bootまで使うことになりました。&lt;/p&gt;&lt;p&gt;今、思えばspringは凄く良い概念で良いframeworkだと思います、思いより単純な概念でセキュリティイッシューの影響も少ないです。初めからspringを使ったらどうでしょうと思う時もありました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それと似ている状況でjavascriptもずいぶん長い時間でバニラバージョンを使うしjqueryのsizzleエンジンが楽なのでjqueryも相当の時間で使いました。&lt;/p&gt;&lt;p&gt;それでes6(2015)バージョンでsizzleの概念がjavascriptのバニラバージョンでも含まれてjqueryを使う理由も無くなりましたね。でも、まだ多いライブラリがjqueryを依存しているし、作らさせたのでずっと使いましたが、最近多いライブラリがjqueryの除きを始まりました。&lt;/p&gt;&lt;p&gt;そして最近の多いフロントエンド開発者がjqueryを悪い評価する方も多くなりました。代表的にjqueryが凄く遅いということですが、私はjqueryが遅いと感じたことがないですが。。。&lt;/p&gt;&lt;p&gt;決定的に私はbootscript5からjqueryを除くという話でショックを受け取って、これからはjqueryを外して新しいjavascriptフレームワークを使わなければならないと思いました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その間に最近フロントエンドの開発スタイルはspa(single page application)だし、それを効果的に支援するフレームワークを探す中でreactを見つけて使いました。reactの感じはまだかなり良いと思うフレームワークです。&lt;/p&gt;&lt;p&gt;実は以前にangularを使った時がありますが、angularは概念は難しかったんです。もちろん、頑張って学んだら使えると思いますが、既存のjavascript(typescript)のスタイルで作成してもngだし、angularだけの規約を合わせて作成しなければならない様々な難しいことがありました。&lt;/p&gt;&lt;p&gt;angularを好きで専門にする方も多いので悪く評価がしません。ただ、私とは合わなかったんです。もしかして分からないですね。将来にはangularを使うかも。。&lt;/p&gt;&lt;p&gt;それで今は一応、reactを選択して始まります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reactを始まる前に知るべきなことがnode.jsとtypescriptです。&lt;/p&gt;&lt;p&gt;実はjavasciprtというのはウェブ専用スクリプト言語です。それで私がスクリプト言語を学ぶ時にローカルはファイソン、ウェブサーバーはphp、ウェブクライアントはジャバスクリプトで区分して使いました。なのでジャバスクリプトを誰でもローカルで使うと思わなかったんですね。&lt;/p&gt;&lt;p&gt;それをグーグルはローカルで使いたかったかも知りません。それをサーバー言語に使えるようなライブラリがnode.jsです。もっと複雑な履歴がありますが、それは重要ではないので、ただローカルで使うジャバスクリプトだと思えば良いでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reactはウェブブラウザで動くフレームワークですが、なぜnode.jsが必要かな?というなぜができます。&lt;/p&gt;&lt;p&gt;今は業務がフロントエンド、サーバーサイドということに完全に区別になっています。私がウェブ開発した時代にはフロントエンド開発者やウェブデザイナーがcssやhtml、javascriptで作ってもサーバーサイド開発者がそれをサーバー環境に合わせてパーシング作業をしなければならなかったんです。&lt;/p&gt;&lt;p&gt;またはフロントエンド開発者が自分の혹은pcに同じサーバープログラムをインストールしてその上で作業することか。。完璧な分離が出来ませんでした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今はnode.jsでフロントエンド開発者のためのウェブサーバーを構築して、proxy設定でサーバーサイドを連結して使います。そして最終的に配布する時だけnode.jsでビルドしたファイルをサーバーサイドの開発コードに入れて最終コンパイルにするとプロジェクトが完成になるでしょう。&lt;/p&gt;&lt;p&gt;もちろん、プールスタックならサーバーサイドやフロントエンドを同時に開発することができるので、node.jsが要らないかも知りませんが、ただideで開発することよりnode.jsを利用するとフロントエンドは凄く楽でしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;node.jsをインストールする方法はただ、インストールファイルをダウンロードして実行すれば良いです。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://nodejs.org/ja/&quot; target=&quot;_blank&quot;&gt;https://nodejs.org/ja/ &lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2333&quot; data-filename=&quot;001-1.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最新バージョンが良いですが、私は安定化になったltsバージョンを選択するので、ltsバージョンをインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2334&quot; data-filename=&quot;002.png&quot; style=&quot;width: 492px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;始めはローディング時間がかかりますが、１分ごろ待つならインストール画面が出ます。&lt;/p&gt;&lt;p&gt;そして適当な場所でインストールしたら良いでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2335&quot; data-filename=&quot;003.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてインストールが完了しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2336&quot; style=&quot;width: 495px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これから適当なところでjavascriptを作成してウェブサーバーを立ち上げましょう。&lt;/p&gt;&lt;p&gt;コンソールにnode index.jsのコマンドでサーバーを起動しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2337&quot; data-filename=&quot;005.png&quot; style=&quot;width: 440px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2338&quot; style=&quot;width: 423px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ブラウザにhello worldが見えますね。ここまでプロジェクトの開発準備は終わりました。&lt;/p&gt;&lt;p&gt;参考にフロントエンドの場合は開発ideをvisual studio codeで使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これでreactのフレームワークを使いましょう。&lt;/p&gt;&lt;p&gt;フロントエンドを開発すると思っても上みたいにサーバーソースをすべて作成する必要がありません。フロントエンドのプロジェクトは基本的に作成されている形があります。&lt;/p&gt;&lt;p&gt;reactの場合も同じです。コンソールに下記のコマンドで作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2339&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最後にhappy hacking!が出たらインストールが完了したことです。私も始めhacking!という言葉でビックリしましたが、楽しいプログラミングという意味だと言います。詳細のは私もよく分かりません。ただ、問題ありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上でmy-appのオプションを設定したので、my-appで生成されました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2340&quot; data-filename=&quot;008.png&quot; style=&quot;width: 163px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;my-appからサーバーを起動しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2341&quot; data-filename=&quot;009.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンソールに上みたいなログが出たら実行されました。その後、ブラウザにhttp://localhost:3000で接続します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2342&quot; data-filename=&quot;010.png&quot; style=&quot;width: 568px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいな画面が表示されたら設定が完了されたことです。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;これからディレクトリを確認すると下記の構造になっています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2343&quot; data-filename=&quot;011.png&quot; style=&quot;width: 294px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2344&quot; data-filename=&quot;012.png&quot; style=&quot;width: 643px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;確かにjavascriptでウェブフロントエンドを開発すると説明しましたが、javascript(.js)ファイルはないでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿ですべてを説明するのは難しくて、typescriptに関して簡単に説明します。&lt;/p&gt;&lt;p&gt;javascriptはスクリプト言語なので、コードにエラーがあるとその部分が実行する前には分かりません。&lt;/p&gt;&lt;p&gt;上のソースはfunc関数を呼び出す前にはエラーが発生しません。つまり、人がミスで間違って作成しても実行は問題なくできるということです。&lt;/p&gt;&lt;p&gt;そのことでソースがサービスにデプロイされて、どの時点でユーザが実行してエラーが発生したらそれがバグです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで我々はjavascriptも機械的な検査で文法で問題があるかを事前に知る必要があります。&lt;/p&gt;&lt;p&gt;그것이 typescript입니다. &lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;typescriptはjavascriptと文法が違います。多い差異があることではなく、変数にデータタイプを明示することか上みたいにパラメータが必要な関数でパラメータ無しで呼び出すエラーを探す役割をします。&lt;/p&gt;&lt;p&gt;つまり、typescriptで少し厳しい文法で作成して多いバグをなくしてjavascriptファイルをoutputする機能になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私は上でreactの基本フレームワークをダウンロードする時、--template typescriptと言うオプションを付けました。それでtypescript形式で生成されました。&lt;/p&gt;&lt;p&gt;もしかしてtypescriptタイプが要らないなら--template typescriptを省略するとjsファイルでreactが生成されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のプロジェクトをbuildしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2345&quot; data-filename=&quot;013.png&quot; style=&quot;width: 534px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすると最終結果はjsファイルで作成されるでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2346&quot; data-filename=&quot;014.png&quot; style=&quot;width: 297px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのファイルをサーバーサイドにコピーするとreactフレームワークを使えます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでは私がnode.jsをインストールしてreactフレームワークをダウンロードして実行する方法まで説明しました。&lt;/p&gt;&lt;p&gt;次の投稿ではtypescriptとreactに関してもっと詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでnode.jsをインストールしてreactを使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/331.html</guid><pubDate>Wed, 23 Mar 2022 18:03:14 +0900</pubDate></item><item><title>[Java] 63. Spring bootでcronスケジューラとComponentアノテーション</title><link>https://www.nowonbun.com/330.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのspring bootでcronスケジューラとcomponentアノテーションに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私が以前にweb frameworkでcronスケジューラを使ったことがあります。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/186.html&quot; target=&quot;_blank&quot;&gt;[java] jspのspring環境でschedulerのcronを使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がウェブサーバーを運用したらブラウザ(browser)から要請により実行処理することではなく、決めている時間にプログラム内部のキャッシュ管理とかデータベースのデータ管理など様々な処理をしなければならない時があります。&lt;/p&gt;&lt;p&gt;もちろん、windowサーバーならウィンドウスケジューラがあるしlinuxサーバならcrontabスケジューラがあります。ウェブサーバーと独立でスケジューラを運用して使ってもよろしいですが、システム内部で運用しなければならない時があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cronスケジューラをプログラム中で実装したら一つの問題点があります。&lt;/p&gt;&lt;p&gt;例えば、決まってる時間にメールを転送するロジックがあり、それをプログラムのcronスケジューラにより実装しました。そして偶然にこのウェブサーバーがロードバランシングで分散処理になっています。&lt;/p&gt;&lt;p&gt;そうするとスケジューラにより様々で重複実行になります。そのため、cronスケジューラを作成する時にはいつもこの部分を考えて実装しなければならないです。(私がこのバカ―な経験を持っていることではないです。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;spring bootでcronスケジューラを使うのは凄く簡単です。別にpom.xmlライブラリを追加する必要もありません。&lt;/p&gt;&lt;p&gt;この部分は以前のweb frameworkより凄く楽ですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;spring bootを実行するmain関数があるクラスに@enableschedulingアノテーションを追加することでできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2326&quot; style=&quot;width: 503px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいにアノテーションだけ追加するとcronスケジューラを使いましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとこれからcronスケジューラを使うためにbeanを追加しましょう。&lt;/p&gt;&lt;p&gt;ここで@componentアノテーションを追加してspring beanに登録しましょう。&lt;/p&gt;&lt;p&gt;そしてスケジューリングする関数に@scheduledアノテーションを追加して文法を利用してスケジュールを設定しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでは私が10秒単位で実行することに設定しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2327&quot; style=&quot;width: 702px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでscheduledアノテーションに設定するcron文法があります。&lt;/p&gt;&lt;p&gt;この部分は以前に説明したことがありますが、また整理してみましょう。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/186.html&quot; target=&quot;_blank&quot;&gt;[java] jspのspring環境でschedulerのcronを使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず文法はスペースで区切りで総７個単位があるし、最後の一つは省略ができます。&lt;/p&gt;&lt;p&gt;まず、上の例はあすとアスタリスクマーク(*)をしましたが、この意味は毎秒、毎分を意味します。つまり、上は毎秒で実行するという意味です。&lt;/p&gt;&lt;p&gt;アスタリスクマークではなく、普通は数字を使いますが、単位ではなく指定時間になります。&lt;/p&gt;&lt;p&gt;つまり、「1 1 1 1 1 *」の意味は1月1日1時1分1秒に実行する意味です。6番目は曜日ですが、 「1 1 1 1 1 1」の意味は1月1日1時1分1秒の日曜にに実行するという意味ですが、1月1日が日曜日ではなければ実行しません。&lt;/p&gt;&lt;p&gt;参考に曜日は1が日曜日から2は月曜日、3は火曜日。。。順で7は土曜日の意味を持っています。&lt;/p&gt;&lt;p&gt;ここで我々は複数の時間を設定することができますが、コンマ(,)の区切りで設定します。「1,11 * * * * *」は毎分1秒と11秒に実行するという意味です。&lt;/p&gt;&lt;p&gt;また、指定時間ではなく、単位時間で設定したい時もありますね。つまり、10秒単位、5分単位で処理したいです。その場合は0/単位時間を入れたらできますが、「0/10 * * * * *」は10秒単位になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その以外の特殊表現式もあります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;    &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;     &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;       &lt;th style=&quot;white-space: nowrap;&quot;&gt;表現式&lt;/th&gt;       &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;     &lt;/thead&gt;     &lt;tbody&gt;      &lt;tr&gt;       &lt;td style=&quot;white-space: nowrap;&quot;&gt;*&lt;/td&gt;       &lt;td&gt;allの意味で毎秒、毎分、毎時、毎日、毎月、毎年&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td style=&quot;white-space: nowrap;&quot;&gt;?&lt;/td&gt;       &lt;td&gt;日、曜日だけで使えることで条件なしという意味&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td style=&quot;white-space: nowrap;&quot;&gt;/&lt;/td&gt;       &lt;td&gt;サイクルの繰り返しの意味&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td style=&quot;white-space: nowrap;&quot;&gt;-&lt;/td&gt;       &lt;td&gt;範囲の意味&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td style=&quot;white-space: nowrap;&quot;&gt;l&lt;/td&gt;       &lt;td&gt;日、曜日だけで使えることで最後の日の意味&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td style=&quot;white-space: nowrap;&quot;&gt;w&lt;/td&gt;       &lt;td&gt;日だけで使えることで指定された近い平日&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td style=&quot;white-space: nowrap;&quot;&gt;#&lt;/td&gt;       &lt;td&gt;曜日だけで使えることで週#曜日という意味&lt;/td&gt;      &lt;/tr&gt;     &lt;/tbody&gt;    &lt;/table&gt;   &lt;/div&gt;&lt;p&gt;特殊表現式で「l,w,#」がありますが、「l」は最後の日の意味を持っています。日と曜日だけで使えます。日で「l」を使うと月の最後の日、曜日の場合は土曜日になります。&lt;/p&gt;&lt;p&gt;wは日だけで使えますが、近い平日という意味です。10wの場合は10日が土曜日なら9日、日曜日なら11日に実行する表現式です。&lt;/p&gt;&lt;p&gt;#は曜日に使える表現式です。2#2なら二つ目の週の月曜日に実行する意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cronライブラリを使う時、私はcomponentアノテーションを設定してspring beanを登録しました。&lt;/p&gt;&lt;p&gt;参考でspringにはbeanというアノテーションもあります。&lt;/p&gt;&lt;p&gt;まず、componentというのはクラスに付けるアノテーションですが、springでdi依存性注入するため、使うクラスという意味です。(scan-auto-detection、dependency injection)&lt;/p&gt;&lt;p&gt;つまり、singletonパターンで使うデータ形式のデータではなく、controllerタイプに使うクラスを設定することです。&lt;/p&gt;&lt;p&gt;条件としてはパラメータがないコンストラクタが存在しなければならないし、そのコンストラクタのアクセス修飾子は別に何でも関係ないです。つまり、コンストラクタを作成してないか、作成してもパラメータがないコンストラクタが必ず必要です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2328&quot; style=&quot;width: 358px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、このように作成すれば下記みたいにエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2329&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでbeanアノテーションはcomponentと似ています。でも、beanアノテーションは関数に付けます。&lt;/p&gt;&lt;p&gt;関数はメモリに割り当てる意味がないのに、付けることが意味があるかと思いますが。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;autowiredによりbeanで登録したことを呼び出したら関数が実行した結果がリターンすることになります。でも、これがautowiredで呼び出すたびにbeanが設定された関数が呼び出すことではなく、singletonの概念と似ていることでサーバーが起動する時に、一回に関数を呼び出してその結果をメモリに割り当てします。&lt;/p&gt;&lt;p&gt;そしてautowiredで呼び出すたびにメモリに割り当ているインスタンスを持ち込んで使う構造になります。&lt;/p&gt;&lt;p&gt;これの注意点は返却値が同じインスタンスタイプならエラーが発生する可能性があります。クラス名の場合は同じく作成することができないですが、関数でリターン値は可能性があるから依存性注入でインスタンスを受け取る立場ではどのことを受け取るかのエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2330&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このようにエラーが発生します。つまり、一つのタイプだけbean登録するかbeanにnameを付けてdi側では@qualifierアノテーションで区分することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2331&quot; data-filename=&quot;006.png&quot; style=&quot;width: 380px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2332&quot; data-filename=&quot;007.png&quot; style=&quot;width: 202px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので私はbeanアノテーションは始めからnameを設定しておきます。もちろん、nameはstring値なので、nameデータ値が重なるとエラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでまた他の部分が疑問になりますが、repositoryアノテーション、controllerアノテーション、serviceアノテーションです。&lt;/p&gt;&lt;p&gt;repositoryアノテーション、controllerアノテーション、serviceアノテーションもcomponentアノテーションと似てますが、scan-auto-detectionとdependency injectionを使いますが、componentアノテーションとどの差異があるかな?&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;簡単に思えば、repositoryアノテーション、controllerアノテーション、serviceアノテーションがcomponentアノテーションを継承したアノテーションだと思えば良いでしょう。実際に継承したことではなくて、概念的にそうです。&lt;/p&gt;&lt;p&gt;つまり、上のスケジューラに私がcomponentアノテーションを使って@scheduledアノテーションでcronスケジューラを使いました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そこでcomponentアノテーションの代わりにrepositoryアノテーション、controllerアノテーション、serviceアノテーションを使ったらどうでしょう？作動します。何のエラーが発生せずに作動します。&lt;/p&gt;&lt;p&gt;controllerはcomponent機能+要請マッピングが可能な機能があります。つまり、requestmappingアノテーションを使えるアノテーションということです。&lt;/p&gt;&lt;p&gt;なので、componentアノテーションがあるクラスにrepositoryアノテーション、controllerアノテーション、serviceアノテーションを代わりに使っても問題ないですが、repositoryアノテーション、controllerアノテーション、serviceアノテーションを使うアノテーションにcomponentアノテーションや別のアノテーションを使ったらエラーが発生するでしょう。&lt;/p&gt;&lt;p&gt;controllerアノテーションはrequestmappingを使うアノテーションだと思えばrepositoryアノテーションとは何の差異があるでしょう?&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これが私も正確な意味をよく分かりませんが、jpaを使う時、特定なエラー、つまりデバック中でエラーを取れない要素(runtimexception)がありますが、こんなエラーを追加する機能だと言いますね。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.baeldung.com/spring-component-repository-service&quot; target=&quot;_blank&quot;&gt;https://www.baeldung.com/spring-component-repository-service&lt;/a&gt;&lt;/p&gt;&lt;p&gt;実は私もこれが何の意味か分からなくて様々なテストをしましたが、まだ明確な差異を分かりません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;serviceアノテーションは現在にはcomponentアノテーションと差異がないアノテーションだと言いますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、我々がcomponentアノテーションを使っても良いですが、業務的にrepositoryアノテーション、controllerアノテーション、serviceアノテーションで区分して使うでしょう。componentアノテーションだけならプロジェクトが大きくなると少し迷う要素がありますね。&lt;/p&gt;&lt;p&gt;controllerアノテーションはrequestmapping用で使うし、我々が機能的な関数などを作成する時にはserviceアノテーション、データと関係あるものはrepositoryアノテーションを使う方が良い思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのspring bootでcronスケジューラとcomponentアノテーションに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/330.html</guid><pubDate>Wed, 16 Mar 2022 18:59:03 +0900</pubDate></item><item><title>[Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)</title><link>https://www.nowonbun.com/329.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのspring bootでweb-filterを設定する方法(spring security)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私も実はspring securityに関して詳細的までは知りません。 関連仕様書とドキュメントを見たけれど、量も多すぎるし、すべて内容をちゃんと活用することができるかと疑問もあります。ただ、「ブラウザからの要請(request)がある時、controllerから処理する前にfilterとして呼び出されること」ほど知っています。 web frameworkを使った際にもただセッション確認してuserインスタンスがあれば認証だし、それではなければ認証失敗するほど設定することがすべてだと思います。&lt;/p&gt;&lt;p&gt;それで今回にspring bootを全般的に整理するところ、web-filterに関してどのように整理するほうが良いかを凄く悩みしました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;含めて今回に私がweb frameworkからspring bootに移行する作業しながら、もう一つの目標を設定したのはフロントエンド(front-end)とバックエンド(back-end)の完全な分離を目標で作業しています。&lt;/p&gt;&lt;p&gt;そのために適用しなければならないことがセッションを利用したログイン認証ではなくjwt(json web token)を利用してログイン管理がならなければならないです。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/328.html&quot; target=&quot;_blank&quot;&gt;[java] jwt(json web token)を発行、確認する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;以前から私がフロントエンドのフレームワーク(angular, vue, react)を使いたいでしたが、いつもセッションを完全に分離しなければならないという限界がありました。&lt;/p&gt;&lt;p&gt;spa(single page application)の環境にはメインページのpage requestが最初に一回だけ発生して、javascriptを利用して動的にdomとヘッダーを設定する環境になりますが、その場合にページのクッキーとセッション、変数のデータ管理、そして非同期で要請するajaxのクッキーとセッション、変数のデータ管理がずいぶん複雑になるでしょう。&lt;/p&gt;&lt;p&gt;私だけそうかも知りません。この部分は各の経験により感じる部分の差異があると思いますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一旦、この投稿の目標はspring bootにてweb-filterを使ってjwt(json web token)を利用して認証するプログラムを作成することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、私がjwt認証するためにaccess tokenとrefresh tokenを実装しなければならないでした。&lt;/p&gt;&lt;p&gt;まず、以前のプロジェクトからpom.xmlにjwtライブラリを追加しました。&lt;/p&gt;&lt;p&gt;レポジトリ - &lt;a href=&quot;https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt/0.9.1&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt/0.9.1&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2314&quot; style=&quot;width: 791px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてfilterパッケージを生成して、jwt(json web token)を扱うproviderクラスを生成しましょう。&lt;/p&gt;&lt;p&gt;ここまでjwt(json web token)を発行して値を取得します。そしてクッキーに登録、削除するクラスを作成しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これでspring securityライブラリからフィルター(filter)設定しましょう。&lt;/p&gt;&lt;p&gt;reference - &lt;a href=&quot;https://qiita.com/nyasba/items/f9b1b6be5540743f8bac&quot; target=&quot;_blank&quot;&gt;https://qiita.com/nyasba/items/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;reference - &lt;a href=&quot;https://www.baeldung.com/spring-security-login&quot; target=&quot;_blank&quot;&gt;https://www.baeldung.com/spring-security-login&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、pom.xmlにライブラリを追加しましょう。&lt;/p&gt;&lt;p&gt;レポジトリ - &lt;a href=&quot;https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security/2.6.4&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security/2.6.4&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2315&quot; data-filename=&quot;012.png&quot; style=&quot;width: 750px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースをみれば私がpassurl値を使いました。&lt;/p&gt;&lt;p&gt;このことが私が以前から使った方法ですが。。。他の方の投稿を見るとhttpsecurityインスタンスで綺麗に例外処理しますが、私はどのように設定してもフィルターが綺麗に設定できないですね。&lt;/p&gt;&lt;p&gt;私がどのようにフィルター設定になるかを理解できないらしいです。なので、私は上の方法で設定しました。&lt;/p&gt;&lt;p&gt;ここまでがjwt認証処理です。私もspring security仕様をはっきり知らないので、様々なブログと投稿を参照して作成しました。でも、私の場合はかなりシンプルに作成されましたね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実際にcontrollerからはどのように動くかを確認しましょう。&lt;/p&gt;&lt;p&gt;私はaccessトークンにuserクラスをシリアル化して格納しました。理由は以前、sessionを使う時に、クラスをシリアル化して格納して、ユーザ情報をデータベース接続せずに、セッションが受け取って使いました。&lt;/p&gt;&lt;p&gt;でも、jwtを使ったらidでデータベースを検索する作業が発生するため、session見たいにシリアル化して格納しました。私は例のため、ただ、シリアル化しましたが、実際に使うとシリアル化を一回に変造するほうがセキュリティとして良いでしょう。&lt;/p&gt;&lt;p&gt;これから実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2316&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;始めにルートページやindex.htmlを接続するとエラーが発生します。認証でエラーが発生したことです。&lt;/p&gt;&lt;p&gt;ログインしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2317&quot; style=&quot;width: 848px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2318&quot; data-filename=&quot;004.png&quot; style=&quot;width: 788px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;正常コード200が出力させ、responseにはset-cookieヘッダーでクッキーがブラウザのデータに格納されることを確認できるでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、ルートページやindex.htmlを接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2319&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は正常認証にさせページが正常に出力しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、access-tokenを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2320&quot; style=&quot;width: 524px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2321&quot; style=&quot;width: 827px;&quot; data-filename=&quot;007.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;refresh-tokenがありますが、ルートページには認証失敗になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、refreshページでaccess-tokenを更新しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2322&quot; data-filename=&quot;008.png&quot; style=&quot;width: 775px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;access-tokenが更新することを確認できるでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2323&quot; data-filename=&quot;009.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、ルートページが正常に開くことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はログアウトです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2324&quot; style=&quot;width: 848px;&quot; data-filename=&quot;010.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クッキーが削除しました。refreshページに接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2325&quot; style=&quot;width: 740px;&quot; data-filename=&quot;011.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;refresh-tokenがないので、エラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで私が思う通りに作成できました。&lt;/p&gt;&lt;p&gt;少し、理解しやすくため、すべてクッキーで作業しましたが、もっとセキュリティを厳しくするためにはaccess-tokenの場合はヘッダーからデータを受け取って要請(request)はform-dataでやり取りしてブラウザメモリからも見えなくする方法がもっと良いと思います。&lt;/p&gt;&lt;p&gt;それじゃなければ、トークンにもっと暗号化されたデータをいれてvalidate(検証)をもっと複雑にする方法もあるでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのspring bootでweb-filterを設定する方法(spring security)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/329.html</guid><pubDate>Tue, 15 Mar 2022 22:20:38 +0900</pubDate></item><item><title>[Java] JWT(Json Web Token)を発行、確認する方法</title><link>https://www.nowonbun.com/328.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでjwt(json web token)を発行、確認する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私は今までウェブ環境でログイン、ログアウト機能を作成する時、普通セッションを利用する方法でログイン、ログアウトを使いました。実は最近までそのように使いました。&lt;/p&gt;&lt;p&gt;セッションを利用して情報を扱ってもクッキーのセッションidを奪われたらセキュリティで問題があることは同じですが、私が知る限り、一番よく使う認証方法ではないかと思いますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近、プロジェクトスタイルがマイクロサービスアーキテクチャでモジュール別にサーバーを分割するか大容量トラフィックに合わせてウェブサーバーロードバランシングで複数のサーバーにトラフィック分散形式で構成をします。&lt;/p&gt;&lt;p&gt;その場合、問題はログインセッションをどのように構成することでしょう。解決する方法では一つのセッションサーバーを構成してredisデータベースを置いて各サーバーでセッションチェックすることで対応することが可能でしょう。&lt;/p&gt;&lt;p&gt;それでも欠点があり、マイクロサービスでウェブサーバーを極端的に分割すればセッションサーバーに負荷になるし、様々な問題が発生する可能性があります。&lt;/p&gt;&lt;p&gt;実は私の場合はその状況でjwtを使ったことではなく、プロントエンドとサーバーサイドの作業を分離するところでセキュリティを考える場合、もっと効果的にログイン管理機能を使う方法がないと思うところでjwtということを知ることになりました。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://jwt.io/introduction&quot; target=&quot;_blank&quot;&gt;https://jwt.io/introduction&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jwtの機能を理解することで時間が少しかかりました。考えれば凄く単純な論理式ですが、ログイン情報をサーバーに置かないという固定観念のせいで、この方式がセキュリティで有効かとずっと悩みました。&lt;/p&gt;&lt;p&gt;実は認証だけできると思えばその情報をサーバーのセッションに置く理由がないですが。。思えば今まで何でそんなに非効率的にログイン情報をセッションに置いたかと思われますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2308&quot; style=&quot;width: 768px;&quot; data-filename=&quot;001.jpg&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://ansibytecode.com/jwt-peek-into-the-jargon-java-web-token/&quot; target=&quot;_blank&quot;&gt;https://ansibytecode.com/jwt-peek-into-the-jargon-java-web-token/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;jwtは上のイメージみたいに「xxxxx.xxxxx.xxxxx」の構造になっています。&lt;/p&gt;&lt;p&gt;まず、headerはトークンタイプやアルゴリズム情報に関して設定されています。 &lt;/p&gt;&lt;p&gt;そしてpayloadはセッションみたいに使う情報があります。もちろん、payloadはユーザ情報があればngですね。名前とidごろは良いですが、パスワードや個人情報があれば奪われる可能性があります。&lt;/p&gt;&lt;p&gt;最後、signatureはトークン情報が合ってるかどうかの確認するコードがあります。&lt;/p&gt;&lt;p&gt;つまり、任意で変調して使うことができないようにしたことです。&lt;/p&gt;&lt;p&gt;こんな機能を利用するとクッキーにsession-idを入れてセッションを利用してログインしたかどうかを確認する必要がないでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、単純にjwtでこのトークンは我々のサービスで使うトークンかを確認できるし、もっとセキュリティ的に強化したいなら、発行する時にsignatureをredisのデータベースに格納して正確なログイン可否を判別することがよいでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jwtについてjavaでどのようにtokenを生成するか、そしてその値が合ってるかどうかの確認するような方法に関して説明します。&lt;/p&gt;&lt;p&gt;実はこのjwtはweb環境で使うことですが、ウェブ環境の設定する部分と混ぜて説明すると複雑になるので、単純にコンソールで発行、比較することを説明してそれをログインとweb-filterに代わりに使ったら良いではないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、javaでjwtを使うためにはmavenでライブラリを一つ連結しなければならないです。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt/0.9.1&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt/0.9.1&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2309&quot; style=&quot;width: 791px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私が上のソースでjavax.xml.bindも追加しましたが、これがxmlを分析、生成するライブラリです。web環境ではそれを宣言しなくてもwebライブラリに含ませているライブラリですが、コンソールには別にxmlを分析するライブラリがないので、依存性で宣言しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2310&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、jwt暗号化するところでsecret_keyということが必要です。このsecret_keyというのは固有の暗号化キーでsecret_keyが別のpcから暗号化したトークンデータを持っていれば検証するところでエラーが発生します。&lt;/p&gt;&lt;p&gt;つまり、secret_keyだけ奪われなかったらtokenキーをセキュリティで使うことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このトークンを持って、復号化をします。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://jwt.io&quot; target=&quot;_blank&quot;&gt;https://jwt.io&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2311&quot; style=&quot;width: 848px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jwtサイトで復号化したら我々が入れたデータが表示されます。最後にsignature検証はsecret_keyを我々だけ知っているので正しいかどうかの検査はプログラムだけで確認できます。&lt;/p&gt;&lt;p&gt;ここまでがjwtトークンを作成して検証する部分です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、これをこのままに使うことでは少し危険性があります。なぜならpayload値がそのままに見えるからです。&lt;/p&gt;&lt;p&gt;我々がログイン情報をセッションに入れる時には単純にidだけ格納することではなく、ユーザ情報も入れる場合があります。つまり、凄く機密な情報を格納することは危険性がありますが、簡単な情報は入れたいですね。&lt;/p&gt;&lt;p&gt;でも、payloadの値は上のサイトで復号化になるので、もっと暗号化が必要です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2312&quot; style=&quot;width: 848px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;userクラスを作ってシリアル化してjwtのidに格納します。そうすると直接に情報を解読することはできません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2313&quot; style=&quot;width: 848px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、頭が良い方は後ろに==があることでこれはbase64コードということは分かるでしょう。つまり、base64を復号化すれが分かるではないかと思います。なので、私が任意にデータ「1」を追加しました。つまり、単純にbase64だけでは復号化ができません。&lt;/p&gt;&lt;p&gt;私はそのまま「1」を入れたので分かる人は分かりますが、上のコードをasciiコードで1番目から5番目まで反転データを入れると分析が大変難しくなるでしょう。特に上のデータはjavaクラスのシリアル化になっているので、この程の暗号化なら仕様を分からない以外は復号化が大変難しいでしょう。&lt;/p&gt;&lt;p&gt;そうすれば、ログイン情報をセッションに入れなくても、様々サーバーでsecret_keyと暗復号化する仕様だけ一致すればセッションクラスタリングしなくても情報を共有できるではないかと思いますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでjwt(json web token)を発行、確認する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/328.html</guid><pubDate>Mon, 14 Mar 2022 19:14:02 +0900</pubDate></item><item><title>[Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法</title><link>https://www.nowonbun.com/327.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はspring bootでredisデータベースを利用してセッションクラスタリング設定する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でapacheとspring bootのtomcatを連結してロードバランシングする方法に関して説明しました。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/326.html&quot; target=&quot;_blank&quot;&gt;[java] 60. spring bootでapacheの連結とロードバランシングを設定する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ロードバランシングは一応ウェブ環境で数多くトラフィック(接続)が発生するとウェブサーバーもブラウザ(クライアント)とソケット通信するコネクションがあるリソースなので同時に発生すればその接続と応答が遅くなるしかないです。また、ウェブサーバー環境に要請する処理が複雑になれば処理がもっと遅くなるでしょう。&lt;/p&gt;&lt;p&gt;それで接続キャッシングはapacheで管理して、動的ウェブ処理(htmlパッシング処理)はアプリケーションサーバー(was:tomcat)で管理します。また、その負荷がもっと多くなると、tomcatを複数に分けてロードバランシングで管理することで大容量のトラフィックを処理します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一旦、以前の投稿で簡単に説明しましたが、apacheで同じsessionなら同じtomcatを要請するように設定しましたが、状況により1番のtomcatで要請応答したコネクションが2番のtomcatに転換する場合もあります。&lt;/p&gt;&lt;p&gt;その状況というのはいきなり1番のtomcatがショットダウンしたり、急に一つのサーバーに大容量のトラフィックが発生するとapacheのロードバランシングが移動させます。その以外の様々な状況がありますが、代表的にはその二つのケースではないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで問題が発生することがセッションです。&lt;/p&gt;&lt;p&gt;セッションというのは簡単に説明します。&lt;/p&gt;&lt;p&gt;ブラウザで各サイトに接続するたびにローカルで格納しているデータでクッキーということがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2292&quot; style=&quot;width: 647px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2293&quot; style=&quot;width: 650px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のヘッダー情報は私がブラウザでブラぐを接続する時の接続情報です。ここではクッキーの値がアルゴリズムで暗号化になっています。&lt;/p&gt;&lt;p&gt;暗号化になっていても、このクッキーというのはブラウザでデータを見ることができます。このデータをなぜブラウザで持っているかを説明するとブラウザの歴史の内容まで説明しなければならないので説明しにくいですが、簡単に説明するとウェブプロトコール仕様はソケット非同期の形、つまり、ソケットで要請する時接続して応答すると接続を切断する流れです。&lt;/p&gt;&lt;p&gt;つまり、ウェブサーフィンする時にウェブサーバーとずっと連結しているままではなく、ページ移動する時だけサーバーに要請してデータを取得する流れですえん。でも、ウェブサーバーに接続する人が私だけではなく、数多い人が同時に接続すると思えば要請が誰の要請が分からないでしょう。&lt;/p&gt;&lt;p&gt;そのために要請するたびにデータを送って区分をするためにクッキーというのがありますが、このクッキーの問題がセキュリティが悪いですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のイメージでもブラウザの開発モードで値がすべて見えますね。それでその値をクライアント(ブラウザユーザー)には見えないのために無作為のユニーク文字列を生成してクッキーキーで設定してサーバーのメモリあるいはファイルでデータを格納する流れがセッションということです。&lt;/p&gt;&lt;p&gt;セッションというのはtomcatサーバーではメモリのデータを格納します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでロードバランシングの状況でユーザーが1番のtomcatに接続してセッション情報、ログイン情報を持っていいる状況で2番のtomcatに転換する状況に発生するとどうようになるでしょう？&lt;/p&gt;&lt;p&gt;そうです。2番のtomcatにはセッション情報をもってないため、ログインが解けることになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでこのセッション情報を1番のtomcatと2番のtomcat、または数多くのtomcatのセッションは共有されなければならないです。それをセッションクラスタリングと言います。&lt;/p&gt;&lt;p&gt;セッションクラスタリングの方法は様々方法がありますが、共有ファイルサーバーでファイルでセッションを管理することもできるし、データベースで管理することもありす、様々な方法があります。でも、ロードバランシングの段階まで届いたらもう大容量のトラフィックの条件になったと意味でしょう。&lt;/p&gt;&lt;p&gt;つまり、共有セッションに値を追加、修正、取得の要請、応答が早ければならないし、時間帯別で処理基準が正確に同期化にならなければならないです。(つまり、データベースの処理速度で役0.1秒前に要請した処理(修正)が完了せずに別のサーバーの取得要請が0.2秒前のデータを取得する流れ)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この数多くの条件を満たすデータベースはredisです。&lt;/p&gt;&lt;p&gt;redisデータベースが万能ではありませんが、個人的にセッションクラスタリングで一番早いし正確だと思います。個人的の考えなので別の意見がもちろんあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;redisデータベースをインストールする方法と使い方に関しては別の投稿で説明したことがあります。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/319.html&quot; target=&quot;_blank&quot;&gt;[centos] redisデータベースをインストールする方法とコマンドを使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからspring bootでredisを使うためにはまず、spring bootウィザードでredisライブラリを追加するかpom.xmlを追加しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2294&quot; style=&quot;width: 539px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考でこれがeclipseのバグかどうか知りませんが、ウィザードで設定すると既存に選択したことをすべて選択しなければならないです。以前に選択したことを選択しなくてfinishを押下すると既存のライブラリがすべて解除される現象になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2295&quot; style=&quot;width: 553px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2296&quot; style=&quot;width: 839px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pom.xmlにライブラリが追加されることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;またはウィザードではなく直接にpom.xmlに追加する方法もあります。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2297&quot; data-filename=&quot;006.png&quot; style=&quot;width: 533px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして我々はspring bootでただ、redisを使うことではなくセッションクラスタリングで使うでしょう。その為、セッションクラスタリングのライブラリも追加しましょう。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2298&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;mavenライブラリの追加は完了しました。&lt;/p&gt;&lt;p&gt;実際のプロジェクトでsessionをredisデータベースで使うように設定しましょう。&lt;/p&gt;&lt;p&gt;spring bootのmain関数があるクラスに@enableredishttpsessionアノテーションを追加することでセッションをredis データベースで使うことになります。&lt;/p&gt;&lt;p&gt;ソース設定が完了したら、application.propertiesで redisデータベース情報を設定しましょう。&lt;/p&gt;&lt;p&gt;私はlocalhostにインストールされていることではなく、別のサーバーに設定されているのでipアドレスとを入力しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2299&quot; style=&quot;width: 280px;&quot; data-filename=&quot;008-1.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして既存のプロジェクトにはただ、画面にhello world表示することしかないので、セッションを格納するコードを作成しましょう。&lt;/p&gt;&lt;p&gt;メイン画面にはセッションの値があればsessionのキーで値を取得して画面に出力します。&lt;/p&gt;&lt;p&gt;そしてsetsessiondata.jsonのアドレスで非同期の形のdata値を受け取ります。そしてsessionのキーでデータをセッションに格納します。&lt;/p&gt;&lt;p&gt;上の仕様に合わせてhtmlファイルも修正しましょう。&lt;/p&gt;&lt;p&gt;最初、spanタグにはsessionから取得した値を出力して、次のラインではtextboxとbuttonでsetsessiondata.jsonの非同期アドレスでセッションを登録します。&lt;/p&gt;&lt;p&gt;その後でページをリフレッシュすると画面にセッション値が出力される流れで作成しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2300&quot; style=&quot;width: 372px;&quot; data-filename=&quot;009.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;テキストで値を入れてボタンを押下しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2301&quot; data-filename=&quot;010.png&quot; style=&quot;width: 565px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンソールでokがなったことを確認できます。また、ページを再要請しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2302&quot; data-filename=&quot;011.png&quot; style=&quot;width: 362px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすると画面に(9091)hello worldという結果が表示することを確認できます。&lt;/p&gt;&lt;p&gt;9091の理由はajp例で設定した値です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2303&quot; data-filename=&quot;012.png&quot; style=&quot;width: 610px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実際にredisデータベースを確認するとsessionが登録されていることを確認できます。&lt;/p&gt;&lt;p&gt;ここまでspring bootでredisデータベースを利用したセッションクラスタリングが設定されていることを確認できます。&lt;/p&gt;&lt;p&gt;それならロードバランシング環境にもしっかり動いているかを確認しましょう。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/326.html&quot; target=&quot;_blank&quot;&gt;[java] 60. spring bootでapacheの連結とロードバランシングを設定する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例で設定したことと同じく、apacheを実行してspring bootプロジェクトを二つの場所にコピーして実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2304&quot; style=&quot;width: 353px;&quot; data-filename=&quot;013.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行してテキストにデータを入力してボタンを押下した後でセッションを確認すれば上の例では9092の二つ目のtomcatに連結されていることを確認できます。&lt;/p&gt;&lt;p&gt;ここで、私が二つ目のtomcatを実行中止します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2305&quot; style=&quot;width: 848px;&quot; data-filename=&quot;014.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;終了しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2306&quot; style=&quot;width: 848px;&quot; data-filename=&quot;015.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;2番目のサーバーが確実にショットダウンしたことを確認できます。&lt;/p&gt;&lt;p&gt;それでまた、ウェブページをリフレッシュしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2307&quot; style=&quot;width: 572px;&quot; data-filename=&quot;016.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ajpポートが9092サーバーは確実にショットダウンしましたが、ajpポートが9091が1番サーバーはそのままにセッションを保持することを確認できます。&lt;/p&gt;&lt;p&gt;サーバーが一つショットダウンしてもウェブサーバーがそのままに運用できることを確認できますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでspring bootでredisデータベースを利用してセッションクラスタリング設定する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/327.html</guid><pubDate>Tue, 1 Mar 2022 18:25:39 +0900</pubDate></item><item><title>[Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法</title><link>https://www.nowonbun.com/326.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はspring bootでapacheの連結とロードバランシングを設定する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;spring bootにはtomcatが内蔵しているので、すぐビルドして配布してもウェブサーバーで運用可能です。つまり、複雑なtomcat設定が必要ないです。&lt;/p&gt;&lt;p&gt;このウェブというのはブラウザから要請と応答処理で接続からパーシングまで様々な処理があります。でもトラフィック(接続者)が多くなるとtomcatサーバーだけでは足りないので、apacheとtomcatで分割して役割を割り振りします。&lt;/p&gt;&lt;p&gt;役割というのはブラウザの要請と応答処理、様々なプロトコール処理をapacheに任せて、tomcatはhtmlパーシングとセッション管理の役割をします。&lt;/p&gt;&lt;p&gt;それでapacheサーバーとtomcatサーバーを連結する方法がありますが、以前の投稿でapacheとtomcatを連結する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/102.html&quot; target=&quot;_blank&quot;&gt;[centos] apacheとtomcatの連携&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、spring bootにはtomcatがフレームワークの中で含めている形になっています。それでtomcatの設定(以前のserver.xml)をプロジェクトの中で設定しなければならないです。&lt;/p&gt;&lt;p&gt;まず、以前のプロジェクトから@configurationアノテーションを宣言したajpconfigクラスファイルを生成しましょう。&lt;/p&gt;&lt;p&gt;ajpconfigクラスを上みたいに作成してapplication.propertiesにtomcat.ajp.portを追加しましょう。&lt;/p&gt;&lt;p&gt;apache設定の場合あｈmod_jk.soファイルをインストールしてhttpd.configファイルを修正するし、workers.propertieファイルを追加します。(windowの場合あｈapache loungeからダウンロードします。 リンク - &lt;a href=&quot;https://www.apachelounge.com/download/&quot; target=&quot;_blank&quot;&gt;https://www.apachelounge.com/download/&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;これからapacheを起動してイクリプスからspring bootを起動しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2285&quot; style=&quot;width: 848px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ajpプロトコールが起動されることを確認できます。&lt;/p&gt;&lt;p&gt;apacheで80を接続するとtomcatと連結したことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2286&quot; style=&quot;width: 374px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、トラフィック(接続者)がもっと増えてapacheとtomcatだけで足りない時期が来ました。そうすると普通のウェブ要請と応答処理で一番時間が掛かる部分がtomcatのhtmlパーシング部分です。&lt;/p&gt;&lt;p&gt;仕様によりその結果がいつも違うので要請によるhtmlを作成するからです。そうするとapacheとtomcat環境でtomcatを複数に増やして一つのapacheに連結しますが、それをロードバランシングと言います。&lt;/p&gt;&lt;p&gt;これからこのプロジェクトを二つのtomcatサーバーに分けてapacheからロードバランシングしましょう。&lt;/p&gt;&lt;p&gt;まず、二つのサーバーが作動することを確認するため、index画面を修正します。&lt;/p&gt;&lt;p&gt;画面にapplication.propertiesで設定するajpポート番号を画面に表示することで修正しましょう。&lt;/p&gt;&lt;p&gt;そして、イクリプスでは二つのサーバーを起動することができないので、テストが可能なディレクトリにソースをコピーしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2287&quot; data-filename=&quot;003.png&quot; style=&quot;width: 417px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私はdドライブのworkフォルダにコピーしました。&lt;/p&gt;&lt;p&gt;そして各フォルダのapplication.propertiesにhttpを8081と8082で設定するし、ajpを9091と9092で設定して重ならないように設定しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;設定をしてウィンドウの場合はプロジェクトでmvnw.cmdファイルがありますが、それを利用してビルドして実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2288&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;テストが実行してログメッセージが表示しますが、エラーが発生しないと正常に実行されたことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一応、tomcatを実行されてますが、ロードバランシングのため、apache設定を修正して実行しましょう。&lt;/p&gt;&lt;p&gt;上みたいにworks.propertiesにロードバランシング設定をします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからapacheを実行してブラウザから接続しましょう。&lt;/p&gt;&lt;p&gt;そうするとlocalhostに接続するたびに結果が9091になる時もあるし、9092になる場合もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2289&quot; data-filename=&quot;005.png&quot; style=&quot;width: 375px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2290&quot; style=&quot;width: 381px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすると接続の数によりaphacheから二つのtomcatサーバーに分散処理することを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の設定のhttpd.confからjkmanagerを設定しました。&lt;/p&gt;&lt;p&gt;そうするとlocalhost/jkmanager/に接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2291&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;apacheからtomcatサーバーのロードバランシングする状態が表示されますね&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;説明が複雑だったんですが、実際に設定すると以前より簡単になったことを感じられますね。tomcatアプリもフレームワークの中にあるからビルド工程や配布前略の設定が以前よりもっと簡単になるではないかと予想しますね。&lt;/p&gt;&lt;p&gt;次の投稿ではロードバランシングさらたサーバーでセッション共有するセッションクラスタリングに関して説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでspring bootでapacheの連結とロードバランシングを設定する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/326.html</guid><pubDate>Mon, 28 Feb 2022 18:46:57 +0900</pubDate></item><item><title>[Java] 59. Spring bootのJPAでEntityManagerを使い方</title><link>https://www.nowonbun.com/325.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はspring bootのjpaでentitymanagerを使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でspring boot framework環境でjpaを設定して使う方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/324.html&quot; target=&quot;_blank&quot;&gt;[java] 58. eclipseでspring bootのjpaを設定する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;しかし、以前の問題はjparepositoryインターフェースを継承して使うことです。jparepositoryインターフェースのことが問題があることではありません。データベースコネクションを簡単にアクセス可能にするし、トランザクション処理を自動に処理することで凄く楽な部分です。でも、この自動に処理することが問題があることです。&lt;/p&gt;&lt;p&gt;自動というのは初期設定は凄く簡単にすることで良い部分ですが、結局、トランザクションをコントロールすることで限界があることです。例えば、複数のテーブルを同時に入力して処理する途中でエラーが発生します。その場合はすべてロールバックしなければならないですが、トランザクションを一つのテーブルではなく、同時に複数のテーブルを制御することが簡単ではないし、ソースが複雑になる可能性があります。&lt;/p&gt;&lt;p&gt;つまり、jparepositoryもトランザクションを別に取得して制御が可能ですが、統合的(?)な管理がならないので逆にソースが複雑になるし、リソース管理などの明確な流れが制御になれません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、abstractdaoとfactorydaoを作成しましょう。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/90.html&quot; target=&quot;_blank&quot;&gt;[java] 50. jpaプロジェクトでdaoクラスを作成する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/92.html&quot; target=&quot;_blank&quot;&gt;[java] 52. springフレームワークでdaoをfactory method patternを利用して依存性注入する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、abstractdaoの抽象クラスを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2282&quot; style=&quot;width: 848px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースをそのままに継承してdaoを作って実行するとエラーが発生します。&lt;/p&gt;&lt;p&gt;つまり、abstractdaoで11番目のラインの内容を見るとspring bootにはpersistence.xmlファイルがないので、entitymanagerfactoryを取得できません。&lt;/p&gt;&lt;p&gt;76番目のラインと116番目のラインを見るとentitymanagerfactoryからentitymanagerを取得してtransactionを受け取って実行するので、やはりentitymanagerfactoryを取得出来なかったからすべてエラーが発生することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとentitymanagerfactoryを取得して解決したらいいけど。。entitymanagerfactoryを何処で取得するかというとapplicationconfigクラス、つまり@configurationアノテーションが設定されているクラスで依存性注入で取得することができます。&lt;/p&gt;&lt;p&gt;でも、クラスの割り当てる順番はfactorydaoクラスがapplicationconfigより先に生成される部分なので、singletonパターンで解決しなければならないです。&lt;/p&gt;&lt;p&gt;また、abstractdaoを修正します。後でabstractdaoを継承したuserdaoクラスとdaoクラスを管理するfactorydaoクラスを作成しましょう。&lt;/p&gt;&lt;p&gt;transaction関数でapplicationconfigのシングルトンインスタンスを取得してentitymanagerfactoryを取得しましょう。そしてentitymanagerインスタンスを取得します。&lt;/p&gt;&lt;p&gt;その以外のtransactionの内容は同じです。ラムダ式のインターフェースをパラメータで受け取って関数を実行します。&lt;/p&gt;&lt;p&gt;factorydaoはreflection機能を使ってクラスのタイプを受け取ってflyweightパターンでインスタンスを格納して受け取る形のクラスです。&lt;/p&gt;&lt;p&gt;userdaoはデータベースに接続してデータを取得するクラスです。&lt;/p&gt;&lt;p&gt;これからhomecontrollerでuserdaoを依存性注入でインスタンスを取得してデータベースからデータを取得して画面に出力します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2283&quot; style=&quot;width: 451px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;repositoryインターフェースではなく、daoクラスでデータを取得します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;全体的のプロジェクト構造は下記通りになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2284&quot; style=&quot;width: 331px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前のspring web frameworkで構成した方法で構成されました。もちろん、以前のrepository方式が間違っていることではありません。各者の開発のスタイルがあるので、楽な方法で使ったら良いでしょう。&lt;/p&gt;&lt;p&gt;私の場合はtransactionを管理して各クエリで直接にデータベースのデータを管理する方法がもっと直感的だし、管理がしやすいので、私はこの方法が良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでspring bootのjpaでentitymanagerを使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/325.html</guid><pubDate>Fri, 25 Feb 2022 19:20:25 +0900</pubDate></item><item><title>[Java] 58. EclipseでSpring bootのJPAを設定する方法</title><link>https://www.nowonbun.com/324.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はeclipseでspring bootのjpaを設定する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;spring web framework環境でjpaを設定する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/85.html&quot; target=&quot;_blank&quot;&gt;[java] 45. jpaを設定する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的の設定はspring web framework環境で設定することと同じです。差異があればspring web framework는 persistence.xmlで接続環境を設定してspring bootはapplication.propertiesで設定することになります。&lt;/p&gt;&lt;p&gt;spring bootは環境設定ファイルが一つに統合することになるので管理しやすいですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、jpaを連結するためにローカルデータベースにテストテーブルを作成しましょう。&lt;/p&gt;&lt;p&gt;そしてテーブルにテストデータを格納します。&lt;/p&gt;&lt;p&gt;これから上のデータをspring bootを利用して画面に表示しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一応、以前の投稿で作成したプロジェクトでjpaを追加しましょう。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/323.html&quot; target=&quot;_blank&quot;&gt;[java] 57. eclipseでspring bootを設定する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、ウィザードを実行してjpaライブラリを追加しましょう。&lt;/p&gt;&lt;p&gt;プロジェクトでマウス右クリックしてspring의 add starterを実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2269&quot; style=&quot;width: 536px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてこれがeclipseのバグかどうか知らないですが、既存に選択したものが選択されていません。それで選択せずにfinishを押下すると既存に設定したライブラリが解除する状況になります。&lt;/p&gt;&lt;p&gt;なので、以前に設定したものもチェックしなければならないです。(バグらしい。。。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2270&quot; style=&quot;width: 666px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jpaを使うためにはjdbc api、spring data jdbc、spring data jpa、mariadb driverを追加しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2271&quot; style=&quot;width: 553px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;nextボタンを押下するとソース比較画面が表示します。ここでpom.xmlだけ更新することをチェックしてfinishボタンを押下するとmavenアップデートします。&lt;/p&gt;&lt;p&gt;ウィザードを使わなくてpom.xmlを直接に修正する方法もあります。実はウィザードを使うことより直接に環境設定するほうが正確なので、直接にpom.xmlを設定する方法をお勧めです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてeclipseでjpaを使わなければならないので、jpaモードに変更しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2272&quot; style=&quot;width: 657px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2273&quot; style=&quot;width: 585px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;eclipseはspring boot基準ではなく、web framework基準で設定されています。なのでeclipse設定を少し変わらなければならないです。&lt;/p&gt;&lt;p&gt;まず、ソースの中でmeta-inf/persistence.xmlファイルを消しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2274&quot; data-filename=&quot;006.png&quot; style=&quot;width: 325px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとeclipseでmeta-inf/persistence.xmlファイルがないということにエラー表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2275&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;window -&amp;gt; preferencesタブでjava persistence -&amp;gt; jpa -&amp;gt; errors/warningsのproject -&amp;gt; no persistence.xml file found in projectをignoreに変更します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2276&quot; style=&quot;width: 848px;&quot; data-filename=&quot;008.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;エラーメッセージが無くなりました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてこれからデータベースからentityを作成しましょう。プロジェクトでマウス右クリックします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2277&quot; data-filename=&quot;009.png&quot; style=&quot;width: 688px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2278&quot; style=&quot;width: 552px;&quot; data-filename=&quot;010.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスを生成するとmodel.entityクラスが作成されることを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2279&quot; data-filename=&quot;011.png&quot; style=&quot;width: 324px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これをspringboottestapplicationクラスの下位パッケージに移動します。以前のcontroller見たいにscanbasepackagesを合わせなかったらエラーが発生します。やはりscanbasepackagesを設定すると別のパッケージに設定することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからapplication.propertiesで接続情報を設定しましょう。&lt;/p&gt;&lt;p&gt;データベース接続を設定したらレポジトリインターフェースを生成して画面に出力しましょう。&lt;/p&gt;&lt;p&gt;spring bootにはtransactionを設定しなくてもrepositoryを通ってデータを取得することができます。&lt;/p&gt;&lt;p&gt;レポジトリインターフェースを生成すると、既存のcontrollerのhomecontrollerに依存性追加(@autowired)をします。&lt;/p&gt;&lt;p&gt;rootページが呼び出したらuserrepositoryからnowonbunのキーでデータを取得することができます。そしてthymeleafテンプレートにnameデータを表示します。&lt;/p&gt;&lt;p&gt;下記みたいなプロジェクト構造になりますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2280&quot; style=&quot;width: 330px;&quot; data-filename=&quot;012.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならプロジェクトを実行すると下記みたいに結果が表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2281&quot; style=&quot;width: 422px;&quot; data-filename=&quot;013.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;userテーブルのnowonbunのレコードのname値がhelloなので正常にデータベースからデータを取得して出力した結果です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;設定方法が違うことだけで、entityを扱う方法は以前のweb frameworkと同じです。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/86.html&quot; target=&quot;_blank&quot;&gt;[java] 46. jpaのentityクラスの基本設定(@generatedvalue、 @manytomany)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/87.html&quot; target=&quot;_blank&quot;&gt;[java] 47. jpaのentityクラスのリファレンス設定(cascade, fetch)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;既存のweb frameworkには私がdaoを生成してfactorydaoを利用してトランザクションを管理しました。&lt;/p&gt;&lt;p&gt;spring bootにはrepositoryインターフェースを作成して依存性注入されたインスタンスで自動にトランザクションを管理しますね。実は自動という表現しますが、これがcommit rollbackをどのように管理しなければならないかエラーが発生する時にどのようにrollbackをしなければならないかに関して不明確です。&lt;/p&gt;&lt;p&gt;それでspring bootにもentitymanagerを取得してトランザクションを直接に管理する方法があります。次の投稿ではspring bootでdaoとfactory、実際的にトランザクション管理する方法に関して説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでeclipseでspring bootのjpaを設定する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/324.html</guid><pubDate>Wed, 23 Feb 2022 18:13:04 +0900</pubDate></item><item><title>[Java] 57. EclipseでSpring bootを設定する方法</title><link>https://www.nowonbun.com/323.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はeclipseでspring bootを設定する方法に関する説明です。&lt;/p&gt;&lt;p&gt;最近、私が色々のイッシューでフレームワークをspring web frameworkからspring bootに乗り換えました。spring bootが楽だというのは以前から知ってましたが。。&lt;/p&gt;&lt;p&gt;個人的に何かが自動に設定されることを好きではありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;理由は様々がありますが、その中で問題が発生する時に。。何処でエラーが発生したか明確に分かりにくいことが一番の理由ですね。そのため、私は一からすべてを設定して作成することを好きです。(「プログラムは自動に処理することは絶対ない! 何処かで処理するはずだ」という傾向です。つまり、バグも何処かで間違って処理したので発生するはずだと思いです。)&lt;/p&gt;&lt;p&gt;でも、一つ一つ設定して作成することが利点だけあることではありません。生産性が悪いし設定することが多すぎるので管理が大変になることが大問題ですね。それで安定性が100%に確保してないライブラリは使わないです。特にオプーンライブラリ。。(昔の人。。おじちゃん。。(笑))&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私も生産性も凄く重要だと思います。でもバグが発生して、そのバグを把握することが大変だし、回避が難しいなら。使わない方が良いと思って今までspring bootを使わなかったんですね。&lt;/p&gt;&lt;p&gt;でも、最近個人イッシューで。。spring boot frameworkを主に使った人が以前より増えたし、逆にweb frameworkを使う人が少なくなって。。プロジェクトを一人でやることでもないし。。&lt;/p&gt;&lt;p&gt;一人でspring bootを使わないということもできないので、spring bootを使うことにしました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも。。凄く良いですね。。spring boot。。凄く楽ですね。何で今まで使わなかったんだろうと思うほどに安定性も良いし楽ですね。&lt;/p&gt;&lt;p&gt;特に、配布前略やビルド工程を設定することで凄く楽ですね。。ただ、一つのサーバーにウェブアプリケーションのトムキャットが多くなる問題はありますね。これも設定を出来るかと知りません。まだ、私も知らない部分が多いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで今までweb frameworkで設定した部分をspring bootにはどのようにsっていするか、開発環境を設定するかを説明します。&lt;/p&gt;&lt;p&gt;intellijはultimateバージョンをインストールするとspring bootライブラリも自動にインストールします。intellijは楽だし、良いですが、有料なので、家にはeclipseを使うべきです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、eclipseをインストールしなければならないですが、これは以前の方法と同じです。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/41.html&quot; target=&quot;_blank&quot;&gt;[java] 1. javaとは？、javaインストール、eclipseインストール&lt;/a&gt;&lt;/p&gt;&lt;p&gt;eclipseダウンロードリンク - &lt;a href=&quot;https://www.eclipse.org/downloads/packages/&quot; target=&quot;_blank&quot;&gt;https://www.eclipse.org/downloads/packages/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2252&quot; style=&quot;width: 848px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;適当なところで圧縮を解凍します。私はd:\eclipseフォルドにインストールしました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2253&quot; data-filename=&quot;002.png&quot; style=&quot;width: 407px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;イクリプスを実行してプロジェクト生成ウィザードを実行するとまだ、spring bootを生成する領域がありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2254&quot; data-filename=&quot;003.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;help -&amp;gt; eclipse marketplaceを選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2255&quot; style=&quot;width: 320px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして検索テキストで「sts」で検索しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうしたらspring tools 4が検索されますが、インストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2256&quot; style=&quot;width: 517px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2257&quot; style=&quot;width: 478px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;右下のツールバーを見るとインストール状況が見えますが、インストール完了するまで待ちましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2258&quot; data-filename=&quot;007.png&quot; style=&quot;width: 653px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストール完了するとeclipseが再起動します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてまた、プロジェクト生成ウィザードを開くとspring bootカテゴリーが生成されたことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2259&quot; style=&quot;width: 511px;&quot; data-filename=&quot;008.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;spring starter projectを選択してプロジェクトを生成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2260&quot; data-filename=&quot;009.png&quot; style=&quot;width: 553px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロジェクト名と基本パッケージ設定、mavenで使うgroupとバージョン設定をしてnextを押下しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;spring bootは始めに生成する時に基本dependenciesを設定することができますが、ウェブ環境ならspring boot devtools、thymeleaf、spring webを設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2261&quot; data-filename=&quot;010.png&quot; style=&quot;width: 553px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;spring boot devtoolsは開発する時に良いライブラリだし、spring webはweb frameworkライブラリです。&lt;/p&gt;&lt;p&gt;devtoolsをチェックしなくても開発することでは問題ないですが、なかればデバッグ中でソース修正するとテンプレートキャッシング設定やトムキャット再起動などの不便なところがあるので設定するほうがよいでしょう。後でリリーズ(production deploy)する時にpom.xmlから除いたら良いです。&lt;/p&gt;&lt;p&gt;spring webは既存おweb frameworkです。差異は以前にはxmlでweb frameworkを設定しなければならないことが多かったんですが、spring bootからはapplication.propertiesですべての設定が統合されているので設定が楽になりました。&lt;/p&gt;&lt;p&gt;thymeleafはテンプレートフレームワークです。私はspring bootを使う前にはjstl(jsp)をよく使いましたが、spring boot空はthymeleafテンプレートフレームワークがお勧めですね。&lt;/p&gt;&lt;p&gt;性能に関しては個人的に様々にテストをしましたが、別に差異を感じられませんでした。可読性はjspよりthymeleafが綺麗な感じでした。でもthymeleafは構造が普通ではないので。。thymeleafの文法では別に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最後にfinishを押下してプロジェクトを生成しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロジェクトを生成した後に何分を待ってたらプロジェクトが生成されますが、下記通りの構造になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2262&quot; style=&quot;width: 299px;&quot; data-filename=&quot;011.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、設定する部分がapplication.propertiesです。&lt;/p&gt;&lt;p&gt;そして基本的にcontrollerクラスを生成する時は@springbootapplicationアノテーションとmain関数があるクラスと同じパッケージあるいは下位パッケージにcontrollerを設定することができます。&lt;/p&gt;&lt;p&gt;私は下位パッケージを生成してhomecontrollerを生成しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2263&quot; data-filename=&quot;012.png&quot; style=&quot;width: 332px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;同じパッケージではないところで設定したいなら、@springbootapplicationアノテーションにscanbasepackages値を設定したら良いでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2264&quot; data-filename=&quot;013.png&quot; style=&quot;width: 570px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はコントローラーに呼び出すthymeleafテンプレートを設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2265&quot; style=&quot;width: 330px;&quot; data-filename=&quot;014.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;index関数ではhome/indexファイルを呼び出したので、homeフォルダー下のindex.htmlファイルを生成します。&lt;/p&gt;&lt;p&gt;テンプレートファイルまで生成したらこれから実行しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行する方法はproject explorerのプロジェクトでマウス右クリックするかmain関数があるところでマウス右クリックするとrun asあるいはdebug asのspring boot appメニューがありましてクリックすると実行できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2266&quot; style=&quot;width: 628px;&quot; data-filename=&quot;015.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2267&quot; data-filename=&quot;016.png&quot; style=&quot;width: 781px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行すると上のログが発生しますが、application.propertiesで設定したポートに接続すると正常に実行することを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2268&quot; style=&quot;width: 406px;&quot; data-filename=&quot;017.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでがspring bootの基本的の設定です。&lt;/p&gt;&lt;p&gt;これからjpaもweb frameworkと設定が違うのでまた、設定をしなければならないですし、apache連結などもまた確認しなければならないですね。&lt;/p&gt;&lt;p&gt;thymeleaf文法も整理が必要だし、始めテンプレートウィザードを見ると基本的に支援するライブラリが多いらしいですが、一つ一つ確認しなければならないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでeclipseでspring bootを設定する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/323.html</guid><pubDate>Tue, 22 Feb 2022 19:06:57 +0900</pubDate></item><item><title>[Python] Redisデータベースに接続して使い方</title><link>https://www.nowonbun.com/322.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでredisデータベースに接続して使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;redisデータベースはrdb種類ではなく、nosql種類のkey-valueタイプのデータベースです。簡単に共有メモリのデータベースです。以前の投稿でlinux環境にインストール及び使い方に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/319.html&quot; target=&quot;_blank&quot;&gt;[centos] redisデータベースをインストールする方法とコマンドを使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのredisデータベースをpythonで使ってみましょう。&lt;/p&gt;&lt;p&gt;pythonでredisデータベースを使うためにはredisライブラリをインストールするべきです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2245&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私はもうインストールされているのでインストール済みで表示しますね。インストールをしてない方は上のコマンドでインストールしたら良いでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールしたらpythonソースでredisを使ってみましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2246&quot; data-filename=&quot;002.png&quot; style=&quot;width: 214px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2247&quot; data-filename=&quot;003.png&quot; style=&quot;width: 260px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的な使い方はkeyを利用してデータを入力して取得する関数です。&lt;/p&gt;&lt;p&gt;接続方法にはstrictredis関数を利用して直接にconnectionを取得する方法があるし、poolをまず生成してpoolからconnectionを取得する方法があります。&lt;/p&gt;&lt;p&gt;どっちらかが良いか言うことは難しいですが、poolがコネクションを管理するので、リソース管理ではpoolの方が良いでしょう。上の例はシングルプロセスで動いているのでpoolを使わなくても特にコネクション管理が必要ないですが、マルチスレッド環境ならconnection管理が必要なのでpoolを使う方が良いということです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2248&quot; style=&quot;width: 265px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2249&quot; style=&quot;width: 257px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースはキーの満了時間設定です。単位は秒単位で設定できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;次はredisで使うlistとmap、set、sortedsetのデータタイプです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2250&quot; data-filename=&quot;006.png&quot; style=&quot;width: 322px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2251&quot; style=&quot;width: 366px;&quot; data-filename=&quot;007.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonは使う人により実装する仕方が違いますが、私はpythonでプログラムを作ることよりプロジェクトの補助手段としてバッチスクリプトなどを作成して使うことでよく活用します。&lt;/p&gt;&lt;p&gt;その状況で様々なローカルでデータを共有するかjavaやc#でredisを使うならその値を確認してテストする目的でよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでredisデータベースに接続して使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/322.html</guid><pubDate>Mon, 21 Feb 2022 18:24:37 +0900</pubDate></item><item><title>[Java] Redisデータベースを接続して使い方(Jedisライブラリ)</title><link>https://www.nowonbun.com/321.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでredisデータベースを接続して使い方(jedisライブラリ)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;redisデータベースはrdb種類ではなく、nosql種類のkey-valueタイプのデータベースです。簡単に共有メモリのデータベースです。&lt;/p&gt;&lt;p&gt;以前の投稿でlinux環境にインストール及び使い方に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.nowonbun.com/319.html&quot; target=&quot;_blank&quot;&gt;[centos] redisデータベースをインストールする方法とコマンドを使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのredisデータベースをjavaで使ってみましょう。&lt;/p&gt;&lt;p&gt;javaでredisデータベースを使うためにmavenを通ってjedisライブラリをインストールしなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2236&quot; data-filename=&quot;001.png&quot; style=&quot;width: 658px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リポジトリ - &lt;a href=&quot;https://mvnrepository.com/artifact/redis.clients/jedis/4.1.1&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/redis.clients/jedis/4.1.1&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2237&quot; style=&quot;width: 494px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先に基本的にredisデータベースに値を格納して取得するコード作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2238&quot; data-filename=&quot;003.png&quot; style=&quot;width: 185px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2239&quot; style=&quot;width: 262px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースにはtestキーでhello world値を格納しました。そしてtest1で満了時間60秒のhello world expire値を格納しました。&lt;/p&gt;&lt;p&gt;そしてtestとtest1のキーでデータを取得すると上で格納したhello world値が出力します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関連関数に関してはapiドキュメントを参照してください。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://javadoc.io/doc/redis.clients/jedis/latest/index.html&quot; target=&quot;_blank&quot;&gt;https://javadoc.io/doc/redis.clients/jedis/latest/index.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースは単純にkeyキーを利用してデータを格納して取得する処理です。&lt;/p&gt;&lt;p&gt;そうすると実践でプログラムを作成する時によく使われるコードを作成して見ましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2240&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;nodeクラスのインスタンスを生成してシリアル化してbyteタイプで変換しました。そしてbyteタイプで変換する値をredisデータベースに入力しました。&lt;/p&gt;&lt;p&gt;また、格納したデータを取得しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2241&quot; data-filename=&quot;006.png&quot; style=&quot;width: 158px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;redisデータベースでnodeキーになっているbyte値を取得して逆直列化してnodeクラスに変換します。&lt;/p&gt;&lt;p&gt;print関数を呼び出すと入力したhello world値を出力します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;シリアル化すると同じjava言語のプログラムでは問題ありませんが、別の言語のプログラムでは使えません。それでjsonのstringタイプに変換して使いましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2242&quot; data-filename=&quot;007.png&quot; style=&quot;width: 256px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;nodeインスタンスをgsonライブラリ利用してjsonタイプのstringデータに変換しました。その後でstringデータをredisに格納しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2243&quot; data-filename=&quot;008.png&quot; style=&quot;width: 173px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;redisデータベースにnodeキーでjsonのstringタイプのデータを取得します。&lt;/p&gt;&lt;p&gt;そしてデータをgsonライブラリ利用してnodeクラスで変換します。そしてprint関数を呼び出すと入力したhello world値が出力しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;次はredisで使えるlistとmap、sortedsetのデータタイプです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2244&quot; style=&quot;width: 175px;&quot; data-filename=&quot;009.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上はredisでlistとmap、sortedsetで使えるタイプです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実は私はよく使わないタイプです。&lt;/p&gt;&lt;p&gt;redisプログラムのアルゴリズムが悪く思わないですが、redisデータベースの性能に関するボトルネックやアルゴリズムの性能がc#の基本listやdictionaryよりもっと良いと思わないので、可能ならデータをそのままに取得してプログラム内で処理することをよく使います。&lt;/p&gt;&lt;p&gt;私がまだ、redisの経験が多くないので正確に分かりないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでredisデータベースを接続して使い方(jedisライブラリ)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/321.html</guid><pubDate>Wed, 16 Feb 2022 18:14:39 +0900</pubDate></item><item><title>[C#] Redisのデータベースを接続して使い方</title><link>https://www.nowonbun.com/320.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でredisのデータベースを接続して使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;redisデータベースはrdb種類ではなく、nosql種類のkey-valueタイプのデータベースです。簡単に共有メモリのデータベースです。&lt;/p&gt;&lt;p&gt;以前の投稿でlinux環境にインストール及び使い方に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;リング - &lt;a href=&quot;https://www.nowonbun.com/319.html&quot; target=&quot;_blank&quot;&gt;[centos] redisデータベースをインストールする方法とコマンドを使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのredisデータベースをc#で使ってみましょう。&lt;/p&gt;&lt;p&gt;まず、c#で使うためにはnugetを利用してstackexchange.redisライブラリをインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2226&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2227&quot; style=&quot;width: 459px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ライブラリがインストールされたらredisデータベースに値を格納して取得しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2228&quot; data-filename=&quot;003.png&quot; style=&quot;width: 200px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2229&quot; style=&quot;width: 272px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースでtestのキーでhello worldを格納しました。そして10分後では自動にkey-valueが消えます。&lt;/p&gt;&lt;p&gt;そしてtestキーで取得すると入力したデータがコンソールに出よくします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関連な関数に関してはapiドキュメントを参照してください。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://stackexchange.github.io/stackexchange.redis/&quot; target=&quot;_blank&quot;&gt;https://stackexchange.github.io/stackexchange.redis/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上には単純にkeyでデータの値を格納して取得する基本的な処理です。&lt;/p&gt;&lt;p&gt;そうすると実践でプログラムを作成する時によく使われるコードを作成して見ましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2230&quot; style=&quot;width: 181px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2231&quot; style=&quot;width: 848px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースでnodeクラスのインスタンスをシリアル化で利用してbyteに変換して、またstringタイプに変換してredisデータベースに入力しました。&lt;/p&gt;&lt;p&gt;そうするとこのことで別のプログラムで取得できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2232&quot; data-filename=&quot;007.png&quot; style=&quot;width: 194px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;別のプログラムで生成したnodeインスタンスをredisデータベースに格納して、また、別のプログラムで取得してインスタンスに変換して使うことを確認しました。&lt;/p&gt;&lt;p&gt;この意味はシリアル化を通ってクラス形式で様々なプログラムで値を共有できるという意味です。c#のシリアル化なので、別の言語プログラムでは使うことは出来ずに、同じ言語のc#だけで使うことが可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;別の言語で使うためにはjsonタイプで変換して使うなら言語が違くても値を共有することが可能ですね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2230&quot; style=&quot;width: 181px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2233&quot; data-filename=&quot;008.png&quot; style=&quot;width: 341px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のシリアル化を通ってstringに変換してredisデータベースに格納することと似てますが、今回はシリアル化ではなくjson構造タイプに変換して入力しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2234&quot; style=&quot;width: 184px;&quot; data-filename=&quot;009.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;redisデータベースでtest1のkey値でjsonタイプのstring値を取得した後、nodeインスタンスで変換しました。&lt;/p&gt;&lt;p&gt;結果はprint関数を呼び出すと上で入力したtestの値がコンソール出力します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;次はredisで使えるlistとmap、sortedsetのデータタイプです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2235&quot; data-filename=&quot;010.png&quot; style=&quot;width: 207px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上はredisでlistとmap、sortedsetで使えるタイプです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実は私はよく使わないタイプです。&lt;/p&gt;&lt;p&gt;redisプログラムのアルゴリズムが悪く思わないですが、redisデータベースの性能に関するボトルネックやアルゴリズムの性能がc#の基本listやdictionaryよりもっと良いと思わないので、可能ならデータをそのままに取得してプログラム内で処理することをよく使います。&lt;/p&gt;&lt;p&gt;私がまだ、redisの経験が多くないので正確に分かりないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でredisのデータベースを接続して使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/320.html</guid><pubDate>Wed, 16 Feb 2022 16:06:46 +0900</pubDate></item><item><title>[CentOS] Redisデータベースをインストールする方法とコマンドを使い方</title><link>https://www.nowonbun.com/319.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はcentosでredisデータベースをインストールする方法とコマンドを使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;redisとはrdbタイプとは別のnosqlタイプのデータベースです。つまり、sqlでデータを入力、取得するデータベースではなく、特定なapiを通って扱うデータベースです。&lt;/p&gt;&lt;p&gt;構造はkey - valueの構造で、inmemory構造になっているのでデータ挿入が早いし、検索が早くなるデータベースになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;redisに関する定義や内容はグーグルを利用して調査すると様々な正確な定義と説明があります。&lt;/p&gt;&lt;p&gt;私が少し理解しやすく説明するとただshare memory、つまり、メモリを共有するシステムだと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通にプログラムを起動するとプログラム中の変数などを通ってメモリにデータを割り当てします。そのメモリに割り当てしたデータはosのプロセスメモリ保護機能で別のプログラムで該当なメモリにアクセスができません。&lt;/p&gt;&lt;p&gt;つまり、aプログラムとbプログラムを実行して、bプログラムで割り当てたクラスのデータをaプログラムで使いたいと思えば、ソケット通信を通ってデータを共有します。一般的な方法です。&lt;/p&gt;&lt;p&gt;もしかして、ここでプログラムが一つを追加するとメモリ共有の流れが複雑になります。bプログラムで生成されたメモリデータをaプログラムで修正します。その後、bプログラムはcプログラムに値が更新されたことを通報します。&lt;/p&gt;&lt;p&gt;また、ここでプログラムを一つを追加します。つまり、プログラムが増えるほど流れがもっと複雑になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もちろん、file ioで共有することができますが、それならioのconnectionの流れに関して考えなければならないです。つまり、ファイルにデータを書き込みする役でconnectionを繋いでるなら別のプログラムではファイル修正が不可能です。&lt;/p&gt;&lt;p&gt;様々な不便な流れと規約ができますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすると一番しやすく解決する方法はmap構造になるメモリとソケット通信でset、getでmapメモリにアクセスが可能なプログラムがあれば良いです。そのプログラムがredisです。&lt;/p&gt;&lt;p&gt;redisプログラムはjavaではmap、c#ではdictionary構造の変数一つとソケットを通って外部でデータを格納、取得することが可能なプログラムです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;centosでは簡単にyumでインストールが可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2206&quot; style=&quot;width: 848px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2207&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2208&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして環境設定は「/etc/redis.conf」のパスにあります。環境設定に関しては下記で詳細に説明します。&lt;/p&gt;&lt;p&gt;一応、yumで簡単にインストールができますが、バージョンが低いですね。。 redisのホームページでは6.2バージョンがありますが、yumでは3.xバージョンですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとホームページでダウンロードしてインストールしましょう。&lt;/p&gt;&lt;p&gt;参照 - &lt;a href=&quot;https://redis.io/download&quot; target=&quot;_blank&quot;&gt;https://redis.io/download&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてリンクアドレスをコピーしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2209&quot; data-filename=&quot;004.png&quot; style=&quot;width: 454px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてwgetでダウンロードします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2210&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして圧縮を解凍してビルとしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2211&quot; data-filename=&quot;006.png&quot; style=&quot;width: 460px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールが完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先にサービスの登録ファイルを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2212&quot; data-filename=&quot;007.png&quot; style=&quot;width: 706px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからredisを実行しましょう。&lt;/p&gt;&lt;p&gt;実行してsrcフォルドのredis-cliを実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2213&quot; data-filename=&quot;008.png&quot; style=&quot;width: 303px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでの画面が表示するとインストールが完了し、実行されることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからredisコマンドでデータを格納、取得しましょう。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;redisコマンド&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;redisで使えるコマンドはすごく多いです。&lt;/p&gt;&lt;p&gt;参照 - &lt;a href=&quot;https://redis.io/commands&quot; target=&quot;_blank&quot;&gt;https://redis.io/commands&lt;/a&gt;&lt;/p&gt;&lt;p&gt;でも、よく使うコマンドは多くないです。よく使うコマンドだけ整理します。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;コマンド&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;set [key] [value]&lt;/td&gt;        &lt;td&gt;keyの値をキーでデータを格納する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;get [key]&lt;/td&gt;        &lt;td&gt;keyの値をキーでデータを取得する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;rename [key] [newkey]&lt;/td&gt;        &lt;td&gt;keyの値を変更する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;keys [pattern]&lt;/td&gt;        &lt;td&gt;keyを検索する。「*を入れるとすべてキーを取得する。」&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;exists [key]&lt;/td&gt;        &lt;td&gt;keyが存在するかを確認する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;del [key]&lt;/td&gt;        &lt;td&gt;keyの値をキーでデータを削除する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;flushall&lt;/td&gt;        &lt;td&gt;すべてキーを削除する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;append [key] [value]&lt;/td&gt;        &lt;td&gt;keyの値をキーでデータの値を追加する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;setex [key] [seconds] [value]&lt;/td&gt;        &lt;td&gt;keyの値をキーでデータの満了時間を設定する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;ttl [key]&lt;/td&gt;        &lt;td&gt;keyの値をキーでデータの満了時間を確認する。-1の場合、満了時間が設定しないこと。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;save&lt;/td&gt;        &lt;td&gt;現在、redisのデータの状態をバックアップする。ファイル名はconfigで設定する。&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2214&quot; data-filename=&quot;009.png&quot; style=&quot;width: 288px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;redis環境設定&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;redisの環境設定はバージョンより差異があります。確認してから設定しなければならないです。&lt;/p&gt;&lt;p&gt;参照 - &lt;a href=&quot;https://redis.io/topics/config&quot; target=&quot;_blank&quot;&gt;https://redis.io/topics/config&lt;/a&gt;&lt;/p&gt;&lt;p&gt;詳細的な設定だけバージョンより違いますが、よく使うポート設定とbind設定は似ているから確認すれば良いです。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;環境設定&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;bind [ip] ...&lt;/td&gt;        &lt;td&gt;許可するip設定&lt;br&gt; 例) bind 192.168.0.100 192.168.0.100 (該当なipだけ許可) &lt;br&gt; 例) bind 127.0.0.1 -::1 (ローカルだけ許可) &lt;br&gt; 例) bind * -::* (すべてip許可)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;protected-mode [boolean]&lt;/td&gt;        &lt;td&gt;保護モードが活性化しているとローカルだけ接続を許す。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;port [number]&lt;/td&gt;        &lt;td&gt;ポート設定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;dir [direcotry path]&lt;/td&gt;        &lt;td&gt;作業のディレクトリ設定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;dbfilename [filename]&lt;/td&gt;        &lt;td&gt;バックアップファイル名を設定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;save [seconds][changes]&lt;/td&gt;        &lt;td&gt;指定された時間の間にキーが指定された個数ほど更新するとバックアップ &lt;br&gt; # save 900 1 (900秒(15分)間で少なくとも一つ以上のキーが更新すると格納する。)&lt;/td&gt;      &lt;/tr&gt;       &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2215&quot; data-filename=&quot;010.png&quot; style=&quot;width: 641px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;redisに関しては4~5年前から知っていましたが、活用する部分では必要性を感じ無かったんですが、1~2年前からウェブサーバーのセッションクラスタリングで性能が良いって聞いて後からずっと使っているデータベースです。&lt;/p&gt;&lt;p&gt;セッションクラスタリングだけではなく、様々なシステムでシェアーメモリとして使うことが思ったより使いやすいしインストールも簡単なので最近はよく使うことになりました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もちろん、プログラム間でデータをやり取りする時には直接なソケット通信が性格ですが、同じサーバーで複数のプログラムを起動するかマイクロサービス、つまり一つのドメインで様々なサーバーで分割してプログラムを作成する時にかなり便利に使えます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでcentosでredisデータベースをインストールする方法とコマンドを使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/319.html</guid><pubDate>Mon, 14 Feb 2022 18:37:17 +0900</pubDate></item><item><title>[Design pattern] 3-6. ステートパターン(State pattern)</title><link>https://www.nowonbun.com/318.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのステートパターン(state pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ステートという意味では状態です。つまり、クラスの状態により処理する結果が別々になる意味です。&lt;/p&gt;&lt;p&gt;よく見るとストラテジーパターンと似ている構造になりますが。。。&lt;/p&gt;&lt;p&gt;差異を置いたらストラテジーパターンはストラテジーインスタンスにより外部の値が変わることだし、ステートパターンはステートインスタンスにより内部の値が変わることだと思います。&lt;/p&gt;&lt;p&gt;実は、デザインパターンというのは実務でこれはこのパターンという定義されていることではなく、その内容だけ理解して使ったら良いでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2202&quot; style=&quot;width: 600px;&quot; data-filename=&quot;001.jpg&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/state_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/state_pattern&lt;/a&gt;&lt;/span&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2203&quot; data-filename=&quot;002.png&quot; style=&quot;width: 215px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ストラテジーパターンには多分、run関数に何かの値を受け取ります。つまり、run関数で値を受け取ってストラテジーパターンにより別の値がリターンすることだし、ステートパターンはrunの関数で値を受け取ることではないですが、ステートインスタンスにより内部処理が変わったということです。&lt;/p&gt;&lt;p&gt;私が知っているストラテジーパターンとステートパターンの差異はこれです。実は私も実務でストラテジーパターン、ステートパターンを区切りして使うことではありません。ただ仕様に合わせてパターンを使うことで。。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2204&quot; data-filename=&quot;003.png&quot; style=&quot;width: 176px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ステートパターンもストラテジーパターンと同じ構造でflyweightパターンを使ってステートパターンのインスタンス生成を最小化にしました。そしてインスタンスの再使用率を高めにしてシステムの性能を上げられます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2205&quot; data-filename=&quot;004.png&quot; style=&quot;width: 213px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ステートパターンもストラテジーパターンと同じ目的で使います。クラスの結合度を低くして再使用率を高めにするために使うでしょう。&lt;/p&gt;&lt;p&gt;ただ、その差異はストラテジーパターンは外部の値がパターンにより別々の結果を出すこと、ステートパターンはパターンにより内部値が別々の結果を出すことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのステートパターン(state pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/318.html</guid><pubDate>Wed, 17 Nov 2021 20:05:36 +0900</pubDate></item><item><title>[Design pattern] 3-5. メメントパターン(Memento pattern)</title><link>https://www.nowonbun.com/317.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのメメントパターン(memento pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メメントパターンはクラスの現在の状況を別にクラスに格納するパターンです。&lt;/p&gt;&lt;p&gt;クラスのデータを格納する型ではメメントパターンではなく、クラスのコピー(インスタンスのコピー)で現在状況を格納することができます。でも、そのようにすると現在のインスタンスオブジェクトではなく、新しいインスタンスオブジェクトを生成することで、もしオブジェクト中でリソース(ioやsocket)を使っている場合は新しいコネクションを生成しなければならない問題もあります。&lt;/p&gt;&lt;p&gt;つまり、メメントパターンはインスタンスのオブジェクトは変わらず、中の値だけ更新して、状態を復旧する役割をするパターンがメメントパターンです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2198&quot; style=&quot;width: 680px;&quot; data-filename=&quot;001.jpg&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/memento_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/memento_pattern&lt;/a&gt;&lt;/span&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2199&quot; data-filename=&quot;002.png&quot; style=&quot;width: 271px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でnodeクラスの状態を格納するmementoインスタンスを取得しました。&lt;/p&gt;&lt;p&gt;このmementoクラスで該当なクラスをファイルに書き出しするし、また、ファイルから読み込んでnodeインスタンスに更新するとデータが以前データに復旧することを確認できます。&lt;/p&gt;&lt;p&gt;例えば、ゲームの中でファイルにセーブしてまたファイルから読み込んで現在の状態を復旧することと同じ流れのパターンです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2200&quot; data-filename=&quot;003.png&quot; style=&quot;width: 185px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c/c++で作成したソースの構造と似ています。ただ、memenoクラスをnodeクラスのインラインで作成しました。&lt;/p&gt;&lt;p&gt;つまり、mementoクラスの仕様は状態を格納する役割があるので、nodeクラスの以外ではデータ設定ができないようにすることが基本ルールです。&lt;/p&gt;&lt;p&gt;メメントのインスタンスの値を外部で設定することが可能にすると、それはメメントのパターンではなく、単純なパラメータをやり取りのクラスの役割になることです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2201&quot; data-filename=&quot;004.png&quot; style=&quot;width: 233px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#もjavaと似ている構造なソースです。mementoクラスがnodeクラスにインラインで設定して、nodeクラスの外部では設定できないように作成しました。&lt;/p&gt;&lt;p&gt;でも、c#はインラインクラスでも、publicではなければアクセスができないので、reflectionの機能を利用して直接にprivate変数を設定できるように作成しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのメメントパターン(memento pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/317.html</guid><pubDate>Tue, 16 Nov 2021 20:02:25 +0900</pubDate></item><item><title>[Design pattern] 3-4. イテレータパターン(Iterator pattern)</title><link>https://www.nowonbun.com/316.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのイテレータパターン(iterator pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;イテレータパターン(iterator pattern)は我々がデザインパターンを知らない状況でもよく使うパターンです。c#にはlistをforeachで使うパターンだし、javaにはfor(var x : list)の型でよく使うパターンです。&lt;/p&gt;&lt;p&gt;一般的に配列(array)には当たり前にindexで配列を参照するのでイテレータパターンが意味がありませんが、連結リスト(linkedlist)なら話が違います。&lt;/p&gt;&lt;p&gt;get(100)を取得するためにはindex 0から100まで移動するので実際にforで使うことならすごく遅くなります。&lt;/p&gt;&lt;p&gt;例えば、0番目はリストの最初なので問題がありませんが、forの1になると0を参照して1番目を取得します。また、2になると0を参照して1に移動、2を取得します。3になると0を参照して1に移動、2に移動して3を取得します。&lt;/p&gt;&lt;p&gt;なのでイテレータパターンを利用して毎回に参照するたびにポインタを移動して探す必要がなしで現在の位置を格納して現在の値をリターン、そして次のポインタに移動する型のパターンが必要です。&lt;/p&gt;&lt;p&gt;実務ではこれを実装する必要がなしで、listタイプはすべてイテレータパターンを継承しているのでforeachで使ったら自動にイテレータパターン(iterator pattern)に変わるにで、ただこのパターンの内容だけ認知して応用して使うと良いでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2194&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 590px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/iterator_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/iterator_pattern&lt;/a&gt;&lt;/span&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2195&quot; data-filename=&quot;002.png&quot; style=&quot;width: 264px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々が実際にプログラムで使うイテレータパターンはforを利用して値のポインタを取得、一連の順番とおりに出力するパターンです。&lt;/p&gt;&lt;p&gt;実は私がc/c++でイテレータパターンを実装しようと思いましたが、難しいですね。c/c++を使うのも古くなったし、いざ実装するのが簡単ではありません。それでここではただイテレータパターンを使う方法だけ説明します。&lt;/p&gt;&lt;p&gt;もし、イテレータパターンを実装する人がいらっしゃいならお知らせてください。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2196&quot; style=&quot;width: 142px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は簡単な連結リストのアルゴリズムです。&lt;/p&gt;&lt;p&gt;そして任意で連結リストのlinkedlistクラスをforの繰り返し文にイテレータパターン(iterator pattern)でデータが順番とおりに出力されることを確認できます。&lt;/p&gt;&lt;p&gt;つまり、forの繰り返し文にイテレータパターンを使いたいならiterableのインターフェースを継承したら良いです。&lt;/p&gt;&lt;p&gt;iterableのインターフェースにはiterator関数を再定義しなければならないですが、iterator関数の返却値はiteratorのインターフェースの型です。&lt;/p&gt;&lt;p&gt;それなら、iteratorのインターフェースを継承するitrクラスを生成してitrクラスはhasnext関数とnext関数を再定義しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、forでイテレータパターンを使うならhasnext関数を呼び出して、値があるかどうかのtrue、falseの値を受け取って、trueならnext関数を呼び出します。&lt;/p&gt;&lt;p&gt;next関数には値をリターンを受け取りますが、次のポインタの位置に移動するべきに処理もしなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのように最後にhasnext関数からfalseの値が受け取るとfor文から抜け出します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2197&quot; style=&quot;width: 174px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;内容はjavaの例と同じです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;イテレータパターン(iterator pattern)は我々がパターンを知っても知らなくてもよく使うパターンです。特に、大容量の値をqueueやlinkedlistで使う場合によく使うパターンの中で一つです。&lt;/p&gt;&lt;p&gt;アルゴリズムの特性上にfor(int i=0;i&amp;lt;size;i++)の形式で実装したら二中探索になるので性能上で多い問題が発生することがあります。&lt;/p&gt;&lt;p&gt;そして仕様によりプログラム上でイテレータパターン(iterator pattern)を実行しなければならないこともあります。&lt;/p&gt;&lt;p&gt;その場合は単純なlinkedlistのfifo式のアルゴリズムではなく、キャッシュアルゴリズムのlru(least recently used)やlfu(least frequency used)で応用して使う場合もあるでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのイテレータパターン(iterator pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/316.html</guid><pubDate>Mon, 15 Nov 2021 19:32:13 +0900</pubDate></item><item><title>[CentOS] Linux環境(CentOS)でCassandra(NoSQL DB)をインストールする方法(DBeaverブラウザでNoSQL使い方)</title><link>https://www.nowonbun.com/315.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;この投稿はlinux環境(centos)でcassandra(nosql db)をインストールする方法(dbeaverブラウザでnosql使い方)に関する説明です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;プログラムを作成すると主に使うデータベースはrdbms(関係型データベース)だと思います。rdbmsだというと何のデータベースと思われますが、オラクルやms sql server, mysql, mariadb, postgresなどのデータベースの意味です。&lt;/p&gt;&lt;p&gt;このrdbmsは多い利点があります、インストールがしやすいし、クエリ検索も早いし、管理もしやすいし、等々のすごく良い利点がありますが、欠点は拡張性とデータ量に対する性能があります。&lt;/p&gt;&lt;p&gt;最近はサーバの性能は過去に比べて非常によくなりまして、大容量のデータもrdbmsで処理ができるようになりましたが、でも、いつかはデータ量に比べて性能が限界に届きます。軽くにrdbmsは一つのサーバでインストールするのでサーバのハードウェアの容量の限界に届きます。&lt;/p&gt;&lt;p&gt;そのことでrdbmsを拡張すると思えば、そのことが簡単ではありません。クラスタリングするのは一般的に設定することも難しいし、管理することでも簡単ではありません。この欠点を解決するのがnosqlです。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;このnosqlはrdbmsのデータベースに慣れている方が使うのはすごく不便ですね。joinもできないし、様々な制約も多いです。&lt;/p&gt;&lt;p&gt;でも、データベース量に対する性能でも問題ないし、拡張性もすごくいいことなので大容量のデータを扱うプロジェクトならnosqlを使うことも悪くないでしょう。&lt;/p&gt;&lt;p&gt;nosqlとrdbmsに関する差異と説明は別の投稿で詳細に説明します。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;nosqlもデータベース種類が多いです。この投稿ではapache財団のnosqlのcassandraをインストールしましょう。&lt;/p&gt;&lt;p&gt;まず、nosqlをインストールするためにはjava 1.8以上とpython 2.xです。&lt;/p&gt;&lt;p&gt;javaをインストールする方法に関しては以前の投稿で説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/100.html&quot; target=&quot;_blank&quot;&gt;[centos] java インストール&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;pythonの場合は3.xがインストールされたらcqlshが実行されません。そのため、2.xがインストールされなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2173&quot; data-filename=&quot;001.png&quot; style=&quot;width: 717px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私はpython2がもうインストールされています。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;これからcassandraをインストールするためにyum repositoryに追加しましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://cassandra.apache.org/download/&quot; target=&quot;_blank&quot;&gt;https://cassandra.apache.org/download/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ここでbaseurlにバージョン別で追加することができますが、40xはまだ、alphaバージョンなので311xバージョンでインストールします。(参考にcassandraはバージョン別で使い方が少し違います。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2174&quot; style=&quot;width: 551px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のrepoを作成してyumを利用してインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2175&quot; style=&quot;width: 681px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールが完了しました。多分、インストールすることで10分も掛からないと思います。&lt;/p&gt;&lt;p&gt;参考 - インストールディレクトリ /var/lib/cassandra (もし、後で削除する時にここも一緒に削除しなければならないです。yumだけでは完全に削除ができません。)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;そしてcassandraを実行する前に様々な環境設定を修正しなければならないです。&lt;/p&gt;&lt;p&gt;まず、起動する時に設定環境設定です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2176&quot; data-filename=&quot;004.png&quot; style=&quot;width: 577px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてcassandraの環境設定です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2177&quot; style=&quot;width: 536px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイルの真ん中ごろにauthenticatorがあります。&lt;/p&gt;&lt;p&gt;現在は認証がパスワード無しで接続が可能になり、すべてのユーザが接続することになっています。&lt;/p&gt;&lt;p&gt;これをpasswordauthenticatorに修正します。パスワード接続する認証と意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2178&quot; data-filename=&quot;006.png&quot; style=&quot;width: 359px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は設定はリモート接続を可能にする設定です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;初期設定はlocalhostに設定して、broadcast_rpc_addressがコメントになっています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2179&quot; style=&quot;width: 321px;&quot; data-filename=&quot;007.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この部分のrpc_addressを0.0.0.0に設定してbroadcast_rpc_addressのコメントを解除して1.2.3.4に設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2180&quot; data-filename=&quot;008.png&quot; style=&quot;width: 272px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cassandraの設定は完了しました。cassandraを起動しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2181&quot; data-filename=&quot;009.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;systemctl status cassandra.serviceのコマンドでactiveになっているかを確認してnodetool statusで現在にcassandraの状態を確認できます。&lt;/p&gt;&lt;p&gt;ここまで問題なかったらインストールが完了したことです。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;これからデータベース(keyspace)を作成してユーザを追加しましょう。&lt;/p&gt;&lt;p&gt;初期ユーザとパスワードはcassandra//cassandraです。&lt;/p&gt;&lt;p&gt;まず、ユーザを作成します。そしてcassandraのidを削除します。初期idがあるとセキュリティで問題になりますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2182&quot; data-filename=&quot;010.png&quot; style=&quot;width: 688px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考に接続中の状態ならユーザを削除できません。それでユーザ生成した後に接続終了して生成したidでログインした後cassandraユーザを削除します。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;これからデータベース(keyspace)を削除します。nosqlはデータベース(スキーマ)をkeyspaceと言います。&lt;/p&gt;&lt;p&gt;一応、テストでインストールすることなのでsimplestrategyで作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2183&quot; data-filename=&quot;011.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでカサンドラのインストールと設定は終わりました。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;これからはquery browserで接続して使う方法です。&lt;/p&gt;&lt;p&gt;nosqlを使うことで大変なことの一つが良いquery browser(クエリ探索機)がないことです。私の場合は以前にはsql developerやa5m2をよく使いまいs田が、このnosqlのためdbeaverに変わりました。&lt;/p&gt;&lt;p&gt;変わった理由はnosqlのブラウザ機能を支援することですね。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/255.html&quot; target=&quot;_blank&quot;&gt;[tools] dbeaver(無料sql queryブラウザツール)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;でも、dbeaverを実行するとnosql connectionはありません。ドライバを追加しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2184&quot; data-filename=&quot;012.png&quot; style=&quot;width: 602px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はもう追加されていますが、始めに使う方ならないと思います。databaseのメニュータブからdriver managerでnewを追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2185&quot; data-filename=&quot;013.png&quot; style=&quot;width: 422px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;driver nameは適当に作成して、class nameとurl templateは下記とおりに作成します。&lt;/p&gt;&lt;p&gt;そしてポートは9042で設定します。9042はカサンドラの基本ポートです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2186&quot; data-filename=&quot;014.png&quot; style=&quot;width: 675px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてadd artifactをクリックしてドライバを設定します。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://mvnrepository.com/artifact/com.github.adejanovski/cassandra-jdbc-wrapper/3.1.0&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/com.github.adejanovski/cassandra-jdbc-wrapper/3.1.0&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2187&quot; data-filename=&quot;015.png&quot; style=&quot;width: 458px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2188&quot; data-filename=&quot;016.png&quot; style=&quot;width: 316px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;driverを追加してconnectionを追加すると我々が追加したcassandraがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2189&quot; style=&quot;width: 600px;&quot; data-filename=&quot;017.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして我々がインストールしたcassandraの情報で設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2190&quot; data-filename=&quot;018.png&quot; style=&quot;width: 600px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;tset connectionを実行しましょう。(driver download画面に出るとそのままにインストールしたら良いでしょう。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2191&quot; data-filename=&quot;019.png&quot; style=&quot;width: 598px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてテーブルを一つ生成してテストをしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2192&quot; style=&quot;width: 546px;&quot; data-filename=&quot;020.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2193&quot; style=&quot;width: 413px;&quot; data-filename=&quot;021.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cassandraが実行していることとブラウザから接続してデータを取得することまでできることが確認できます。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ここまでlinux環境(centos)でcassandra(nosql db)をインストールする方法(dbeaverブラウザでnosql使い方)に関する説明でした。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/315.html</guid><pubDate>Fri, 12 Nov 2021 17:36:39 +0900</pubDate></item><item><title>[Design pattern] 3-3. コマンドパターン(Command pattern)</title><link>https://www.nowonbun.com/314.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのコマンドパターン(command pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コマンドパターン(command pattern)は少し複雑なパターンですが、簡単に言うと発動子(invoker)が受信子(receiver)を実行するためのコマンド(command)を中に置くパターンです。&lt;/p&gt;&lt;p&gt;普通のコマンドパターンの例なら電灯の例で説明しますが、スウィッチ(invoker)があり、電灯(receiver)があります、それを電源のonとoffのコマンド(command)が型です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2169&quot; style=&quot;width: 660px;&quot; data-filename=&quot;001.jpg&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/command_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/command_pattern&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2170&quot; data-filename=&quot;002.png&quot; style=&quot;width: 316px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみると理解しやすくなります。コマンドパターンは発動子(invoker)の関数をクラス別に分け割ったことです。&lt;/p&gt;&lt;p&gt;関数はインスタンスで実装することができないので、関数別でインスタンスを作った型がコマンドパターン(command pattern)です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2171&quot; style=&quot;width: 195px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関数をクラスのインスタンスで生成ができれば、上みたいにlistなどで命令順番を設定することもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2172&quot; data-filename=&quot;004.png&quot; style=&quot;width: 275px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コマンドパターンは重要なポイントは発動子(invoker)の関数をクラス別で割り分けしたことです。つまり、様々な関数を複合的にコマンドパターンで作成することができます。&lt;/p&gt;&lt;p&gt;ここでの例は発動子(invoker)のクラスを一つだけ生成してコマンドパターンを作りましたが、数多く発動子クラスをコマンドパターン別で割り分けてストラテジーパターンとともに使うことができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのコマンドパターン(command pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/314.html</guid><pubDate>Fri, 5 Nov 2021 17:02:32 +0900</pubDate></item><item><title>[Window] apache-tomcatでロードバランシング(Load balancing)する方法とセッションクラスタリング（セッション共有）</title><link>https://www.nowonbun.com/313.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;この投稿はapache-tomcatでロードバランシング(load balancing)する方法とセッションクラスタリング（セッション共有）に関する説明です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;以前の投稿で私がapacheとtomcatを連携する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/102.html&quot; target=&quot;_blank&quot;&gt;[centos] apacheとtomcatの連携&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;その時にはapache-tomcatの1:1の連携だったんですが、今回はapacheから数多くのtomcatを連結してトラフィックを分散する方法です。運用中でウェブサイトで接続者が多くなると始めに構成することがapache-tomcatとの分散です。&lt;/p&gt;&lt;p&gt;動的なウェブサイトなら以外にこのweb servletで処理トラフィックが多くなります。なぜならservletでデータベース接続もしなければならないし、様々な設定ファイルを読み込し、複雑な仕様だったらservletで処理することが多くなります。&lt;/p&gt;&lt;p&gt;これを数多くのサーバで運用してapacheでトラフィックを集まってロードバランシング、つまり、トラフィックに合わせてservletを分散してサイトがトラフィックにより遅くなることを少しでも改善することではないかと思います。&lt;/p&gt;&lt;p&gt;apache段階でのトラフィックが多くなるとdns段階でapache分散するべきですね。私もそこまでの作業をしたことがないので、正確に言うことは難しいです。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;apacheでmod_jkを連携するためにはworkers.propertiesを修正しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2158&quot; data-filename=&quot;001.png&quot; style=&quot;width: 602px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;httpd.confにはworker listを設定すれば良いでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2159&quot; style=&quot;width: 597px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればjkmanagerを別途に設定しました。jkmanagerはapache - tomcatを連結する時にロードバランシングの状態を確認できるページです。apache-tomcatで数多くのサーバを管理する時、しっかり連携されているかを確認するページです。&lt;/p&gt;&lt;p&gt;もし、一つのtomcatが問題になると状態ページでその結果を知らせてくれます。&lt;/p&gt;&lt;p&gt;ここまで設定すっればロードバランシング設定は完了です。でも実際にウェブサーバを運用すればロードバランシングだけ設定する場合にセッション共有がしなかったので、変な現象が発生します。。代表的に急にログアウトされる場合があります。&lt;/p&gt;&lt;p&gt;なぜならtomcat1でログインしました。tomcat1にはログイン情報をsessionに入れ、session確認でログイン可否をチェックします。&lt;/p&gt;&lt;p&gt;でも、tomcat2にはログインセッションがないので、tomcat1からtomcat2に変更されたらセッションが違いのでログアウトされる現象になります。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;それでtomcat1とtomcat2のセッションを共有しなければならないですが、それをセッションクラスタリングと言います。&lt;/p&gt;&lt;p&gt;tomcatの以前のバージョンにはセッションクラスタリング設定がかなり複雑だったんです。でも、私はtomcat 9で確認しましたが、clusterがコメントされていることを解除することだけでセッションクラスタリングが開始します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2160&quot; style=&quot;width: 846px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして各、web.xmlにタグ要素を一つ追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2161&quot; data-filename=&quot;004.png&quot; style=&quot;width: 430px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私はテストのため、tomcat1のindexファイルにはserver1と表示するし、tomcat2のindexファイルにはserver2と表示しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2162&quot; style=&quot;width: 339px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2163&quot; style=&quot;width: 348px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私が様々なブラウザで接続するとserver1という場合もあるし、server2という場合もあります。apacheでトラフィックによりtomcatを分散して呼び出します。&lt;/p&gt;&lt;p&gt;参考に私がtomcat1は8180でweb portを起動してtomcat2は8280ポートでweb portを起動しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2164&quot; data-filename=&quot;007.png&quot; style=&quot;width: 452px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;server1でsessionをtestの値で格納しましたが、server2でもsession値があることを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2165&quot; style=&quot;width: 848px;&quot; data-filename=&quot;008.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ログでもセッションクラスタリングが動いていることを確認できます。&lt;/p&gt;&lt;p&gt;そして先に設定したmod_jk状態ページを確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2166&quot; style=&quot;width: 848px;&quot; data-filename=&quot;009.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;こんなにajp13でtomcatが二つが付いていることを確認できます。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ここで私がtomcat2サーバを停止しました。また、mod_jkをみればworker2がidleになったことを確認できます。idleならサーバが落ちたっていう意味ではないですが、応答なしという意味ですね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2167&quot; data-filename=&quot;010.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、tomcat2を起動すればしっかり作動します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2168&quot; data-filename=&quot;011.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この意味はどの側でサーバが問題になって接続できない状況になっても、残りサーバがしっかり作動するとサイトはいつでも正常作動するので、サービス運用上でも安定性を保証できます。&lt;/p&gt;&lt;p&gt;apache2 2台 - tomcat 2台で運用するとサーバダウンの問題はほぼないでしょう。&lt;/p&gt;&lt;p&gt;reference - &lt;a href=&quot;https://tomcat.apache.org/connectors-doc/common_howto/loadbalancers.html&quot; target=&quot;_blank&quot;&gt;https://tomcat.apache.org/connectors-doc/common_howto/loadbalancers.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;reference - &lt;a href=&quot;https://tomcat.apache.org/connectors-doc/common_howto/workers.html&quot; target=&quot;_blank&quot;&gt;https://tomcat.apache.org/connectors-doc/common_howto/workers.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ここまでapache-tomcatでロードバランシング(load balancing)する方法とセッションクラスタリング（セッション共有）に関する説明でした。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Window</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/313.html</guid><pubDate>Fri, 5 Nov 2021 17:00:24 +0900</pubDate></item><item><title>[Window] Apacheでmod_jkとmod_proxyの差異、apacheでtomcatのwebsocketのプロキシフォーワードする方法</title><link>https://www.nowonbun.com/312.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;この投稿はapacheでmod_jkとmod_proxyの差異、apacheでtomcatのwebsocketのプロキシフォーワードする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;以前にtomcatとapacheを連携する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/102.html&quot; target=&quot;_blank&quot;&gt;[centos] apacheとtomcatの連携&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/311.html&quot; target=&quot;_blank&quot;&gt;[php] apache環境の同じホスト中でphpとjava(servlet)を同時に起動、運用する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;上のリンクを見るとapacheとtomcatを連携する方法に関してmod_jkを利用する方法があるし、mod_proxyを利用する方法があります。&lt;/p&gt;&lt;p&gt;始めのリンクはmod_jkでapacheとtomcatを連携する方法で説明したし、二つ目はmod_proxyでapacheとtomcatを連携してcomplex languageを使う方法に関して説明しました。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;二つの連携方法に関して各の特徴がありますが、mod_jkで連携する方がapacheとtomcatを完全に連結することです。&lt;/p&gt;&lt;p&gt;つまり、仮想ディレクトリを作成するならapacheだけ設定することではなく、tomcatにも設定をしなければならないです。もちろん、apacheにも仮想ディレクトリを設定することが可能ですが、様々な問題が発生する可能性があります。&lt;/p&gt;&lt;p&gt;mod_jkで連携したvirtualhostですが、ここで私が「jkmount /* websocketex」を「jkmount　/java/* websocketex」に設定を変わると「localhost/java」や「localhost:8009/」をフォーワードすることではなく、「localhost:8009/java」を指すことになります。&lt;/p&gt;&lt;p&gt;つまり、tomcatにも仮想ディレクトリを合わせなければならないです。このように設定するとかなり複雑になります。なぜならルートは仮想ディレクトリに使うことができなくなったからです。&lt;/p&gt;&lt;p&gt;でも、complex languageにはルート(/)をphpで使って「proxypass /java ajp://localhost:8009/」を使う場合は「localhost/java」が「localhost:8009/」にフォーワードすることになります。&lt;/p&gt;&lt;p&gt;つまり、tomcatのajpアドレスだけ合わせるとその以外にtomcatには別の仮想ディレクトリ設定が必要がないです。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;そうするとここでmod_jkよりtomcat設定変更が必要ないmod_proxyを連結する方が便利ではないかと思います。&lt;/p&gt;&lt;p&gt;(mod_proxyはapacheの基本モジュールだし、mod_jkの場合はconnectorをダウンロードするべきな面倒もあります。)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;でも、mod_jkの場合はapacheとtomcat間の2進パケット転送サイズが64kbだし、mod_proxyは8kbです。つまり、性能側ではmod_jkがmod_proxyより圧倒的によいし、ロードバランシングすることも柔軟して適用することが可能です。&lt;/p&gt;&lt;p&gt;(ajpはapacheとtomcat間の2進パケットですが、結局にapacheとtomcat間に内部通信を利用して送受信することです。)&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://javafatihk.blogspot.com/2014/11/modjk-modproxy-and-modproxyajp.html&quot; target=&quot;_blank&quot;&gt;http://javafatihk.blogspot.com/2014/11/modjk-modproxy-and-modproxyajp.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一つのサーバには様々な言語の特性を使うためにmod_proxyが良いと思いますが、トラフィックが多い数多いサーバや性能が考慮することならmod_jkを使うことが良いでしょう。(トラフィックが多いウェブサービスなら1kb差異は大きい差異です。)&lt;/p&gt;&lt;p&gt;でも、そのように認知したことはapache 2.2の時代の話です。現在はapacheのバージョンが2.4で以前より良く改善したと聞きました。(最近は性能差異が大きくないと言いますね。そうするとmod_proxyが便利だから選択肢の余地がないけど。。。)&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://cwiki.apache.org/confluence/display/tomcat/connectors&quot; target=&quot;_blank&quot;&gt;https://cwiki.apache.org/confluence/display/tomcat/connectors&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;そうするとapacheとtomcat間にwebsocketを連結しましょう。&lt;/p&gt;&lt;p&gt;実はこれを説明するためにmod_jkとmod_proxyの特性が必要です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;websocketはウェブサーバとブラウザ間に同じhttpプロトコールを利用することですが、ウェブの場合は非同期(要請応答した後、ソケット接続が切り捨てる。)、websocketは同期(接続した後にも連結を保持)のソケット通信方式です。&lt;/p&gt;&lt;p&gt;apacheとtomcat間のajpプロトコールは同期通信方式ではありません。なので別に連結する方法が必要です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;まず、トムキャット側のjavaソースは以前にwebsocketに関して説明したことがあるので、ソースをそのままに使います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/168.html&quot; target=&quot;_blank&quot;&gt;[java] websocket (ウェブソケット)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;私はtomcatを基本ポートでhttpは8080、ajpは8009で設定しました。apacheの場合は80で設定しました。&lt;/p&gt;&lt;p&gt;ウェブソケットで接続するアドレスはapacheを通ってtomcatに接続しなければならないので80ポートで接続します。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;また、apacheの設定に戻りましょう。&lt;/p&gt;&lt;p&gt;ここではmod_jkで設定するつもりですが、以前の投稿はwindowだはなく、centosでmod_jkを連携する方法に関して説明しました。&lt;/p&gt;&lt;p&gt;(参考でmod_proxyを使う人がいらっしゃるとwebsocketは設定はmod_jkとmod_proxyが設定が同じなので、mod_jk設定は飛び越えて下のwebsocket設定部分から見ると良いでしょう。(link - &lt;a href=&quot;#apache_websocket_flag&quot;&gt;apache websocket設定&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;今回はwindowで設定をします。&lt;/p&gt;&lt;p&gt;windowバージョンのmod_jkは別にコンパイルする必要なく、apacheloungeからダウンロードが可能です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.apachelounge.com/download/&quot; target=&quot;_blank&quot;&gt;https://www.apachelounge.com/download/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2150&quot; data-filename=&quot;001.png&quot; style=&quot;width: 811px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ダウンロードしたら圧縮ファイルの中でmod_jk.soファイルがありますが、apacheのmodulesフォルダにコピーしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2151&quot; data-filename=&quot;002.png&quot; style=&quot;width: 270px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その後からはcentosと設定が同じです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/102.html&quot; target=&quot;_blank&quot;&gt;[centos] apacheとtomcatの連携&lt;/a&gt;&lt;/p&gt;&lt;p&gt;このように設定してapacheとトムキャット(eclipseでのデバッグ環境)で起動します。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;そうしてウェブ環境をみるとwebsocketが接続ができません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2152&quot; style=&quot;width: 524px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;eclipseでコンソールログを見てもエラーが発生しています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2153&quot; style=&quot;width: 785px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;div id=&quot;apache_websocket_flag&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;「java.lang.unsupportedoperationexception: http upgrade is not supported by this protocol」エラーが発生しました。実はこの問題で設定が必要です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ここで上で説明したとおりにapacheでwebsocket設定を追加しなければならないです。&lt;/p&gt;&lt;p&gt;httpd.confからmod_proxy.soとmod_proxy_wstunnel.soのコメントを解除しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2154&quot; data-filename=&quot;005.png&quot; style=&quot;width: 775px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして一番下の部分でwebsocketアドレスを入力します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2155&quot; data-filename=&quot;006.png&quot; style=&quot;width: 695px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてapacheを再起動してブラウザに接続するとwebsocketが接続されることを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2156&quot; data-filename=&quot;007.png&quot; style=&quot;width: 507px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2157&quot; style=&quot;width: 726px;&quot; data-filename=&quot;008.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://community.bitnami.com/t/tomcat-8-websockets/39477&quot; target=&quot;_blank&quot;&gt;https://community.bitnami.com/t/tomcat-8-websockets/39477&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ここまでapacheでmod_jkとmod_proxyの差異、apacheでtomcatのwebsocketのプロキシフォーワードする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Window</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/312.html</guid><pubDate>Fri, 5 Nov 2021 16:56:55 +0900</pubDate></item><item><title>[PHP] Apache環境の同じホスト中でPHPとJava(Servlet)を同時に起動、運用する方法</title><link>https://www.nowonbun.com/311.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;この投稿はapache環境の同じホスト中でphpとjava(servlet)を同時に起動、運用する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;phpのウェブプログラムスクリプト言語は魅力が多い言語です。もちろん、javaのservletも多い利点がある言語です。&lt;/p&gt;&lt;p&gt;私が考えるphpのウェブプログラム言語の一番の利点はコンパイルとビルド、デプロイ(deploy)が必要ないことです。これが別になにと思いますが、実務では差異が大きいでしょう。&lt;/p&gt;&lt;p&gt;例えば、サービス運用中のプログラムで致命的なエラーやバグが発生しました。それなら当たり前に直すべきです。そうするとどのように修正するか、javaならtomcatをshutdownしてデプロイして再起動しなければならないです。&lt;/p&gt;&lt;p&gt;その間にサーバは落ちます。もし、これが接続が多い時間帯なら考えましょう。バグを目前にあっても修正できません。もちろん、バグの種類により違いますが、サーバを落ちることはもっと大きいリスクを発生する可能性があるからです。&lt;/p&gt;&lt;p&gt;でも、phpの場合はどうでしょう?ただ、ソースを修正すればよいでしょう。コンパイルとビルド、デプロイが要らないのでサーバ再起動が必要なし、修正したすぐ反映です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;javaはphpよりもっといい利点がないかというと、スレッド管理です。単純なホームページやデータベースのデータを取得して見せる簡単なウェブページならjavaで開発する必要があるかなと思いますが、スレッド管理が必要なサービスなら話が違います。&lt;/p&gt;&lt;p&gt;どのシステムの他の管理システムやウェブのrequest、response管理だけではなく、継続的にシステムが動いているプログラムならphpで実装が不可能でしょう。率直に不可能ではありませんが、safe threadではなく、non thread phpで作成すればいいですが、これがメモリ管理が難しいと聞きました。(実際に私も使ったことがないので。。。)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;それならまず、apacheでphpサーバーを構築しましょう。&lt;/p&gt;&lt;p&gt;これは以前に説明した構築の方法と同じです。そのため、別にphpを構築する方法は省略します。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/137.html&quot; target=&quot;_blank&quot;&gt;[php] php 開発環境設定とeclipse(ide)の設定&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;まず、index.phpにphpinfo()を呼び出して画面に表示しましょう。를 호출해서 화면에 표시합니다.&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2143&quot; data-filename=&quot;001.png&quot; style=&quot;width: 561px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2144&quot; style=&quot;width: 848px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これがapacheにトムキャット(java)を仮想ディレクトリに連結します。まず、apacheのhttpd.confのファイルを開いて中間のproxyモジュールのコメントを解除します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2145&quot; style=&quot;width: 811px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてhttpd.confの一番下にproxyでトムキャットのajpを連結します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2146&quot; data-filename=&quot;004.png&quot; style=&quot;width: 700px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私は一応、デバッグで確認するつもりなのでeclipseで連結しますが、本サーバではtomcatで連結すればよいでしょう。&lt;/p&gt;&lt;p&gt;まず、eclipseのサーバ情報を確認してajpのポート番号を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2147&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考にservlet構築は下記のリンクを参照してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/78.html&quot; target=&quot;_blank&quot;&gt;[java] 38. javaでウェブサービスプロジェクト(jsp servlet)を作成する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;そしてcombinephpというのはプロジェクトを生成して、javathreadというサーブレットを生成しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2148&quot; style=&quot;width: 848px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javathreadのクラスにはthreadpoolを一つ生成してphpからjavaのthreadを管理してリターンを受け取るように作成しましょう。&lt;/p&gt;&lt;p&gt;上のソースは/java/javathreadが要請された場合にスレッドを生成するクラスです。現在にスレッドが実行中なら生成せずに、実行中のスレッドのカウンター値をリターンします。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;また、php画面に戻ってajaxで上のjava servletを要請しましょう。&lt;/p&gt;&lt;p&gt;上まで生成が完了されたらapacheのphpページのlocalhost/index.phpから確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2149&quot; style=&quot;width: 848px;&quot; data-filename=&quot;007.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を見るとphpのソースからajaxでjavaのサーブレットを呼び出して値を受け取りました。ここで重要なポイントはphpのホストとjavaのホストは同じlocalhostと言うことです。別のポートから開いたことでもなく、同じポートの80からphpとjavaが一緒に動いていることです。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;このように運用するとphpの生産性をもってjavaの拡張性を同時に実装することができることです。また、オープンライブラリだけでもphpも多いですが、javaが圧倒的に多いのでphp環境のプログラムでjavaのライブラリを使えるということです。&lt;/p&gt;&lt;p&gt;例えば、poiというライブラリですね。phpは私が知ってる限り、poiライブラリがありません。つまり、エクセルやパワーポイントを作成することが難しいということです。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;もちろん、二つ言語を同時に使うことで問題は二つの言語を知っているべきだし、別の構造の言語なのでセッション共有ができないです。&lt;/p&gt;&lt;p&gt;正確に言えばセッション共有ができないことより一般的な方法ではなく、fileやデータベース単位のセッションを実装しなければならない面倒がありますね。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ここまでapache環境の同じホスト中でphpとjava(servlet)を同時に起動、運用する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/311.html</guid><pubDate>Fri, 5 Nov 2021 16:53:16 +0900</pubDate></item><item><title>[C#] 61. ウィンドウフォーム(Window form)でスレッド(Thread)を使い方、クロススレッド問題解決</title><link>https://www.nowonbun.com/310.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のウィンドウフォーム(window form)でスレッド(thread)を使い方、クロススレッド問題解決に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でc#のスレッドに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/38.html&quot; target=&quot;_blank&quot;&gt;[c#] 37. スレッド(thread)を使い方、thread.sleep関数を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドはプログラム内で並列処理することの意味です。まずウィンドウはシングルスレッドの無限ループで動いています。&lt;/p&gt;&lt;p&gt;でも、我々がボタンのクリックイベントでループを実行するロジックを作りましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2139&quot; data-filename=&quot;001.png&quot; style=&quot;width: 362px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを実行してボタンを押下するとループが終わるまでウィンドウフォームは動きません。時間が流れたら応答なしになってプログラムが凍っている時もあります。&lt;/p&gt;&lt;p&gt;つまり、ウィンドウはシングルスレッド状況なのでその関数のスタックに掛けると処理が終わるまで動きません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとボタンを押下する時、複雑な処理をすると思えばどのように処理するでしょう?スレッドを利用すれば良いでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2140&quot; style=&quot;width: 619px;&quot; data-filename=&quot;002.gif&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ボタンをクリックしてコンソールに1ずつに出力してもウィンドウが凍らないことを確認できます。&lt;/p&gt;&lt;p&gt;そうすると今回はコンソールに出力することではなく、ウィンドウのコントロールで出力するように作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2141&quot; style=&quot;width: 691px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ボタンをクリックするとすぐエラーが発生します。&lt;/p&gt;&lt;p&gt;理由はwindowで動いているスレッドとスレッドプールで動いているスレッドが同期化されてないからです。&lt;/p&gt;&lt;p&gt;スレッド間に同期化しようと思えば、お互いにlockを設定して同期化すればよいのに、ウィンドウメッセージを動いているスレッドにlockを掛ける方法がありません。&lt;/p&gt;&lt;p&gt;これをc#ウィンドウ開発ではクロススレッド問題と言います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これを解決する方法が各コントロールにあるinvoke関数を利用してvisitorパターン、つまりコールバック関数という方法で処理ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2142&quot; data-filename=&quot;004.png&quot; style=&quot;width: 264px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ソース上にstatic utilクラスを作成してcontrolクラスの拡張関数を作成しました。そしてスレッドプールの中でlabel1インスタンスにinvokecontrol関数を呼び出してラムダ式でコールバック関数を作成しました。&lt;/p&gt;&lt;p&gt;ボタンをクリックするとlabelに数字が1秒単位で更新することを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のウィンドウフォーム(window form)でスレッド(thread)を使い方、クロススレッド問題解決に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/310.html</guid><pubDate>Thu, 4 Nov 2021 19:30:43 +0900</pubDate></item><item><title>[Design pattern] 3-2. 責任の連鎖パターン(Chain of responsibility pattern)</title><link>https://www.nowonbun.com/309.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンの責任の連鎖パターン(chain of responsibility pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;責任の連鎖パターンとはクラス間に連結リストアルゴリズムを掛けて、特定な関数を実行すると連鎖的に実行するパターンということです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2135&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 700px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/chain-of-responsibility_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/chain-of-responsibility_pattern&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;これがすごくよく使うパターンではないですが、ログ処理や一つの処理で様々な結果を同時に作成する時に使うパターンです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2136&quot; data-filename=&quot;002.png&quot; style=&quot;width: 302px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ソースコードを作成したら完全に連結リストのアルゴリズムになりました。連結リストのアルゴリズムをよく知っている方はよく目に入れると思いますが、アルゴリズムの分野が弱い方はすごく複雑に見える可能性がありますね。&lt;/p&gt;&lt;p&gt;内容は私がloggermanagerにconsoleloggerとfileloggerのインスタンスを格納しました。そしてwrite関数を呼び出したら順番とおりにコンソールに出力されますね。&lt;/p&gt;&lt;p&gt;つまり、setloggerの関数でインスタンスを格納した数程、write関数で連鎖的に出力するパターンです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2137&quot; data-filename=&quot;003.png&quot; style=&quot;width: 227px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaには連結リストのlinkedlistクラスがあります。つまり、javaには連結リストが実装されているのでそれを使ったら良いでしょう。&lt;/p&gt;&lt;p&gt;もちろん、必ずlinkedlistを使う必要なく、arraylistでも構いません。つまり、責任の連鎖パターン(chain of responsibility pattern)はポインターで連結すると言いますが、c/c++にもvectorオブジェクトを使っても実装することでは問題ないでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2138&quot; style=&quot;width: 308px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;loggermanagerというクラスが必要なく、loggerクラスに次のポインタを連結して最初に生成されたインスタンスの関数を呼び出すと連鎖的に実行する方法もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;責任の連鎖パターンはクラスの結合度を弱くして様々な応用にかなり良いパターンですが、以外に使用頻度が低いパターンです。適応する仕様が多くないからではないかな。&lt;/p&gt;&lt;p&gt;ほとんどファサードパターンとストラテジーパターンで解決される仕様が多いからかな&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンの責任の連鎖パターン(chain of responsibility pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/309.html</guid><pubDate>Thu, 4 Nov 2021 19:28:32 +0900</pubDate></item><item><title>[Design pattern] 3-1. ストラテジーパターン(Strategy pattern)</title><link>https://www.nowonbun.com/308.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのストラテジーパターン(strategy pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿からは振り舞パターンに関する説明です。&lt;/p&gt;&lt;p&gt;生成パターンはプログラムでインスタンスをどのように生成するかに関する型だし、構造パターンはインターフェースと抽象クラス、そして一般クラス間の構造的な定義に関する型です。&lt;/p&gt;&lt;p&gt;振り舞パターンはクラスとアルゴリズムを実際のプログラムでどのように使うかに関する説明するパターンです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その中でストラテジーパターンは戦略という意味があるパターンですが、使うクラスに入力されるクラスのインスタンスにタイプにより結果を別にするパターンと言います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2131&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 650px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/strategy_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/strategy_pattern&lt;/a&gt;&lt;/span&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2132&quot; data-filename=&quot;002.png&quot; style=&quot;width: 255px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;すごく単純な構造です。processクラスにストラテジーパターンを設定しなければそのまま10の値が出力されるし、normalstrategyインスタンスを入力すると100の値が出力、specialstrategyインスタンスを入力すると1000が出力されます。&lt;/p&gt;&lt;p&gt;仕様に違いますが、ストラテジーパターンのクラスをフライウェイトパターンと一緒に使えばクラスの再使用率が高めるし、性能改善にもいい利点があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2133&quot; data-filename=&quot;003.png&quot; style=&quot;width: 157px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はストラテジーパターンにflyweightパターンを追加してストラテジーパターンのインスタンスを取得する時、メモリ使用を最小にしてクラスの再使用率を高めにしました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2134&quot; data-filename=&quot;004.png&quot; style=&quot;width: 176px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ストラテジーパターンはできればクラスの結合度を低くして再使用率を高めにして性能改善がメイン目標です。そしてクラスはできれば分ける作業によりプログラムのutテストや個別テストが良いと利点があります。&lt;/p&gt;&lt;p&gt;でも、このストラテジーパターンの欠点はクラスを分けすぎることでストラテジーパターンで分散化すると可読性が悪くなることがあります。&lt;/p&gt;&lt;p&gt;そしてクラス作成が多くなるので、プロジェクト管理が難しくなるし、プロジェクト難易度が高くなる問題があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのストラテジーパターン(strategy pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/308.html</guid><pubDate>Wed, 3 Nov 2021 18:38:52 +0900</pubDate></item><item><title>[C#] 60. ウィンドウフォーム(Window form)のイベント設定する方法</title><link>https://www.nowonbun.com/307.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のウィンドウフォーム(window form)のイベント設定する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でウィンドウフォームにコントルールを追加してcontrolクラスを継承してコントロールを作成する方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/303.html&quot; target=&quot;_blank&quot;&gt;[c#] 59. ウィンドウフォーム(window form)にコントロール(control)を使い方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コントロールというのはフォームで動的に動いているオブジェクトという意味ですね。ユーザから入力を受け取るか(textbox)、マウスからクリックのアクションを受け取るか(button)、データを表示する(gridview)などの様々なコントロールがあります。&lt;/p&gt;&lt;p&gt;このコントロールの状態が更新する時に発生する処理をイベントと言います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的にコントロールのイベントを受け取る方法が二つの方法があります。&lt;/p&gt;&lt;p&gt;始めはオブジェクトの再定義(override)する方法があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2126&quot; data-filename=&quot;001.png&quot; style=&quot;width: 279px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ボタンをクリックするとコンソールにclickの値が出力されます。&lt;/p&gt;&lt;p&gt;でも、上みたいにイベントを設定することになったら基本的に提供するコントロールを使うためにはすべてのコントロールクラスを継承して再定義しなければならないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;二つ目はeventキーワードを利用するイベント設定です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2127&quot; data-filename=&quot;002.png&quot; style=&quot;width: 273px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;eventを利用してクリックイベントを追加する方法です。eventキーワードに関しては以前の投稿で説明したことがあるのでご参考してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/26.html&quot; target=&quot;_blank&quot;&gt;[c#] 25. イベント(event)キーワードを使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;二つの方法ではどの方法が良いかというと仕様別で差異があります。&lt;/p&gt;&lt;p&gt;一応、overrideとeventキーワードを利用するイベントでどの流れで動いているかを説明します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2128&quot; data-filename=&quot;003.png&quot; style=&quot;width: 266px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行順番を見ると再定義したonclick関数が呼び出されます。その後でeventキーワードのイベント関数が呼び出されます。そしてまた、onclick関数のコンソールに出力が実行します。&lt;/p&gt;&lt;p&gt;つまり、外部クラスのイベントを発生する前には再定義したonclick関数が呼び出されるし、base.onclickを通って外部eventキーワードの関数を実行して、再定義した関数に戻ってスタックが終了します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もし、base.onclick関数をコメントしたらどうでしょう?外部に登録したeventキーワードの関数が実行されません。&lt;/p&gt;&lt;p&gt;そしてbase.onclickの呼び出すところでeventargsクラスで情報を 클래스로 정보를 やり取りしますが、パラメータの値を再定義すれば?onclickのデータとeventキーワードから発生した関数の間でデータをやり取りすることができることです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2129&quot; data-filename=&quot;004.png&quot; style=&quot;width: 269px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれとbutton1はcustombutton1クラスのインスタンスを生成するし、button2はcustombutton2クラスのインスタンスを生成します。&lt;/p&gt;&lt;p&gt;そしてclickイベントを追加する時には同じデリゲートタイプなので同じ関数(button_click)を設定することが可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、実行して上のボタンをクリックするとcustombutton1の値を出力するし、下のボタンをクリックするとcustombutton2の値をコンソールに出力することを確認できます。&lt;/p&gt;&lt;p&gt;つまり、再定義関数(override)とイベントのデリゲート関数間にデータを上の例みたいに設定することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、デリゲート関数をみるとobject senderがあります。&lt;/p&gt;&lt;p&gt;これが何かというとクリックしたインスタンスオブジェクトです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2130&quot; data-filename=&quot;005.png&quot; style=&quot;width: 277px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、別にeventargsのクラスを再生成して値をやり取りする必要なくて、buttonのクラスを継承すれば継承したbuttonにやり取りデータを含める方が実装しやすいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして、イベントデリゲート関数はラムダ式の関数で切り替えることが可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2126&quot; data-filename=&quot;001.png&quot; style=&quot;width: 279px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;改めて要約すると一般的にイベントはクラス外部ではeventキーワードを利用してイベント追加、クラス内部ではoverrideの再定義を利用してイベントを追加します。&lt;/p&gt;&lt;p&gt;overrideで再定義した関数にはbase.onclick(e);の前後のステップで外部イベントとの実行順番を設定することができます。&lt;/p&gt;&lt;p&gt;パラメータは基本的にobjectタイプとeventargsタイプ、あるいはeventargsを継承したタイプですが、objectタイプはイベントの主体になるインスタンスの値、つまり、buttonクリックならbuttonのインスタンス値があります。&lt;/p&gt;&lt;p&gt;様々で再使用が多いイベントならデリゲート関数で作成するべきですが、一回性ならラムダ式で作成することがコーディングルールです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のウィンドウフォーム(window form)のイベント設定する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/307.html</guid><pubDate>Tue, 2 Nov 2021 21:18:08 +0900</pubDate></item><item><title>[Design pattern] 2-7. ファサードパターン(Facade pattern)</title><link>https://www.nowonbun.com/306.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はファサードパターン(facade pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファサードパターンはデザインパターンで一番よく使うパターンの中で、我々がデザインパターンを知らなくても自然に使うパターンではないかと思います。&lt;/p&gt;&lt;p&gt;このパターンを簡単に説明すると以前に生成されたオブジェクトや関数を仕様により合わせて配置する構造です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2122&quot; style=&quot;width: 577px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/facade_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/facade_pattern&lt;/a&gt;&lt;/span&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2123&quot; data-filename=&quot;002.png&quot; style=&quot;width: 243px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を説明すると、main関数には、ファサードパターンのクラスで設定したrunaやrunb関数を実行することで、仕様により順番とおりに実行する構造です。&lt;/p&gt;&lt;p&gt;つまり、facadeクラスには処理する順番を設定して、main関数にはruna関数を呼び出すことで処理が開始される型の構造になっています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2124&quot; data-filename=&quot;003.png&quot; style=&quot;width: 234px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファサードパターンだっても別にクラスを生成する必要はなくて、controllerの型でオブジェクトの各処理はprivateで処理して、クラスの外部ではファサードパターンでアクセスが可能にするようにexectype1関数やexectype2関数みたいに作成することが一般的ですね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2125&quot; data-filename=&quot;004.png&quot; style=&quot;width: 466px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実務でよく使うファサードパターンで例を作成しました。&lt;/p&gt;&lt;p&gt;実は上にはファサードパターンだけではなく、interpreterパターンも含めています。main関数には我々がwebでよく使うurlの値を入れました。&lt;/p&gt;&lt;p&gt;実は文字列切りは正規表現式を利用して切り分けるべきですが、個人的に正規表現式が得意な分野でもないし、面倒なのでただsplitで切り分けました。&lt;/p&gt;&lt;p&gt;つまり、mvcモデルで上みたいにウェブブラウザで呼び出すとroute関数を通って関数を探すことになります。そしてパラメータに合わせてパラメータクラスのインスタンスも生成して呼び出しすることになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々はそのfacadeパターンで作成されているフレームワークで要請メソッドだけ作成すればよいでしょう。つまり、フレームワークのmvc構造はfacadeパターンで実装されていることです。&lt;/p&gt;&lt;p&gt;実はfacadeパターンはこのパターンを知らなくても、もうプログラムを作成する時によく使う方法ですね。&lt;/p&gt;&lt;p&gt;でも、少し理論的なパターン流れを分かれば、上みたいにreflection機能まで追加して応用が可能なパターンを実装することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでファサードパターン(facade pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/306.html</guid><pubDate>Tue, 2 Nov 2021 19:32:31 +0900</pubDate></item><item><title>[Design pattern] 2-6. プロキシパターン(Proxy pattern)</title><link>https://www.nowonbun.com/305.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのプロキシパターン(proxy pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロキシパターンはデコレーターパターンと似ているな構造を構成していますが、デコレータパターンは継承したインターフェースでコンストラクタから同じインターフェースを継承したインスタンスを受け取って内容を追加する内容なら、プロキシパターンは継承したインターフェースでクラス内部で同じインターフェースを継承したインスタンスを生成するパターンです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2118&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 620px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/proxy_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/proxy_pattern&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2119&quot; data-filename=&quot;002.png&quot; style=&quot;width: 123px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の構造がプロキシパターンの基本構造です。nodeproxyクラスのコンストラクタからinodeインターフェースを継承したnodeクラスのインスタンスを生成します。そしてprint関数にはnodeインスタンスのprint関数を呼び出します。&lt;/p&gt;&lt;p&gt;普通はnodeクラスをnodeproxyクラスのインラインクラスに作成する場合もあります。&lt;/p&gt;&lt;p&gt;上みたいになぜこのように作成するかと思われますね。ただ、proxyクラスではなく、nodeクラスのインスタンスを生成すればよいのに。。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2120&quot; data-filename=&quot;003.png&quot; style=&quot;width: 171px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;proxyクラスのコンストラクタのパラメータにより内部のメンバー変数のinode nodeに生成されたインスタンスが違います。&lt;/p&gt;&lt;p&gt;つまり、パラメータやデータによりインスタンスを区分する時に使うパターンだということです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2121&quot; data-filename=&quot;004.png&quot; style=&quot;width: 173px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回にはnode1クラスとnode2クラスをnodeproxyクラスのインラインクラスに作成しました。&lt;/p&gt;&lt;p&gt;そしてインスタンスをコンストラクタから生成することではなく、print関数から生成します。つまり、もしnodeクラスが多いデータを持っていることやリソースを使うクラスなら、上みたいにコンストラクタではなく、関数を呼び出す時にインスタンスを生成することで性能を考えて設計することができる利点もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の考えはパターン構造としては生成パターンのファクトリーメソッドパターンとflyweightパターン、デコレーターパターンをよく使う状況でプロキシパターンがよく使うかなと思うパターンですね。そうからかな、実際によく使うパターンではありません。&lt;/p&gt;&lt;p&gt;また、似ている構造でインターフェースを継承せずに、メンバー変数に様々のクラスのインスタンスを入れて使いますね。でも、仕様によりプロキシパターンがもっと最適な場合もあるので、仕様によりパターンを使ったら良いでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのプロキシパターン(proxy pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/305.html</guid><pubDate>Mon, 1 Nov 2021 19:42:44 +0900</pubDate></item><item><title>[Design pattern] 2-5. フライウェイトパターン(Flyweight pattern)</title><link>https://www.nowonbun.com/304.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのフライウェイトパターン(flyweight pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;フライウェイトパターン(flyweight pattern)という英語の意味は軽量化するという意味です。なので、インスタンスの生成を最小化してメモリの使用をできれば節約する方法です。&lt;/p&gt;&lt;p&gt;構造パターンのシングルトンバージョンだと思えば良いでしょう。でもsingletonみたいにstaticを利用することではなく、普通のmap(dictionary)を利用します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2114&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 720px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/flyweight_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/flyweight_pattern&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2115&quot; style=&quot;width: 207px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;builderというクラスでgetnodeからnodeインスタンスを取得します。&lt;/p&gt;&lt;p&gt;そのことでaのキーで取得した時にはcountが2になりました。その意味はaを二回呼び出しましたが、インスタンスは同じという意味ですね。つまり、二回目から呼び出したらインスタンスを新しく生成しなくて、mapに同じインスタンスを取得することがフライウェイトパターンです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2116&quot; data-filename=&quot;003.png&quot; style=&quot;width: 353px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はフライウェイトパターンは上のファクトリーメソッドパターンとともによく使います。factoryでインスタンスを生成せずに一回生成されたインスタンスは再使用ということです。&lt;/p&gt;&lt;p&gt;でも、ファクトリ―メソッドパターンなのでclassを追加するたびにfactory関数を修正しなければならないですね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2117&quot; data-filename=&quot;004.png&quot; style=&quot;width: 227px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のれ例ではjavaの例と似ていますが、factorydao中をreflectionとgeneric機能を利用してインスタンスを取得することにしました。&lt;/p&gt;&lt;p&gt;このパターンどのところで使うかと思えば、ormフレームワークのdaoを取得する関数で使う方法です。特にspringで依存性注入でdaoを取得する時に、フレームワークでは上みたいな構造でインスタンスを取得することです。&lt;/p&gt;&lt;p&gt;つまり、一回に生成されたインスタンスは再使用しようという意味ですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのフライウェイトパターン(flyweight pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/304.html</guid><pubDate>Fri, 29 Oct 2021 19:48:27 +0900</pubDate></item><item><title>[C#] 59. ウィンドウフォーム(Window form)にコントロール(Control)を使い方法</title><link>https://www.nowonbun.com/303.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のウィンドウフォーム(window form)にコントロール(control)を使い方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でwindow formを作成する方法に関して簡単に説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/301.html&quot; target=&quot;_blank&quot;&gt;[c#] 58. ウィンドウフォーム(window form)を作成する方法、そしてウィンドウメッセージとキュー&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一般的に我々がウィンドウプログラムを作成するとよく使うクラスはたぶんコントロール(control)オブジェクトです。&lt;/p&gt;&lt;p&gt;このコントロールオブジェクトは基本的に.net frameworkから提供しています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2106&quot; style=&quot;width: 700px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はこの基本的なコントロール(control)だけ使ってもほぼすべてのウィンドウプログラムを作成することができます。仕様により必要なコントロール(control)を開発することができますが、私の考えで多いプロジェクトが基本的に提供するコントロールだけで十分に開発ができると思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、フォームにコントロールを追加する方法はデザイン画面でドラッグアンドドロップ(drag and drop)を利用して追加することがあるし、form1.designer.csページでソースを作成して追加することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2107&quot; data-filename=&quot;002.png&quot; style=&quot;width: 662px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;様々な簡単なコントロールを追加する部分はやはりデザイン環境で作業することが便利ですが、デザインで追加すると精密な設定は大変な部分があります。&lt;/p&gt;&lt;p&gt;そうならform1.designer.csで追加する方法です。&lt;/p&gt;&lt;p&gt;私がwindowフォームでコントロールを作成する方法はいったんdesignerソース画面で使うコントロールメンバー変数とインスタンス生成、そしてname設定(これが一番重要)、text設定、そしてcontrols.addを通ってwindowフォームにコントロール設定を追加します。次はまた、デザイン`モード画面に戻ってコントロールをウィンドウフォームに合わせて配置、サイズ設定をします。&lt;/p&gt;&lt;p&gt;そしてまた、ソースに戻って精密な設定をします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2108&quot; data-filename=&quot;003.png&quot; style=&quot;width: 277px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なぜ、このように複雑に作るかなと思いますが、率直にvisual studioに提供するデザインモードはすごく便利です。でも、自動設定が多すぎるので気づかなくソースが作成されてしまうことも多いです。&lt;/p&gt;&lt;p&gt;例えば、name項目です。このname項目はwindow formで別に要らないとみえますが、実は識別ですごく重要な部分です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がメンバー変数を宣言してメンバー変数で直接にコントロールインスタンスを取得すれば問題がなさそうですが、それがformのクラス内だけですね。他のコントロールではどうでしょう?formのインスタンスを渡しでメンバー変数をすべてプロパティ化して取得しない以上どのコントロールがどのコントロールかわ分かりません。&lt;/p&gt;&lt;p&gt;これに関してが投稿の下で詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので、デザインモード그で作成することも重要ですが、form.designer.csソースファイルにもしっかり作成されているか、任意の変数名ではなく、少し区別しやすい変数名で作成されているか程を確認するためにもソースでも作成する方が良いでしょう。&lt;/p&gt;&lt;p&gt;ここまでformからcontrolを追加することを説明しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならこのcontrolに関して詳細に説明します。&lt;/p&gt;&lt;p&gt;windowで提供するすべてのコントロールはcontrolクラスを継承しています。まるでクラスがobjectクラスを継承したこととみたいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2109&quot; data-filename=&quot;004.png&quot; style=&quot;width: 475px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2110&quot; style=&quot;width: 459px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;buttonだけみてもbuttonbaseを継承してbuttonbaseはcontrolを継承しました。&lt;/p&gt;&lt;p&gt;つまり、我々がこのcontrolを継承したらコントロールを作ることができるという意味ですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとクラスを追加してコントロールを作りましょう。&lt;/p&gt;&lt;p&gt;実はonpaintに関して説明するためにはgdiに関して知るべきですが、gdiは別の投稿で詳細に説明してここには簡単に上みたいに作成しましょう。&lt;/p&gt;&lt;p&gt;testcontrolはインスタンス外部で設定することができません。設定すると思っても何も処理が行わないでしょう。そうするとtextを何処で設定するかというとコンストラクタがhello worldで設定しました。&lt;/p&gt;&lt;p&gt;そしてまた、visual studioのデザインモードの画面に行きましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2111&quot; style=&quot;width: 566px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとtoolboxにtestcontrolが追加されたことを確認できます。(もしなければf5を押下してデバックすしたら見えします。)&lt;/p&gt;&lt;p&gt;そうならまた、buttonみたいにドラッグアンドドロップ(drag and drop)でコントロールを追加しましょう。そしてform.designer.csにも変数名とnameなどを設定しましょう。&lt;/p&gt;&lt;p&gt;上みたいに設定して実行すればウィンドウフォームからラベルみたいにコントロールが追加されたことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2112&quot; data-filename=&quot;007.png&quot; style=&quot;width: 274px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これから私が作成したコントロールでbuttonのイベント受け取りましょう。&lt;/p&gt;&lt;p&gt;buttonイベントでクリックするとテキスト内容がhello worldからclick!に変更する内容です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2113&quot; data-filename=&quot;008.png&quot; style=&quot;width: 265px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行してボタンをクリックするとtestcontrolのtextがhello worldからclick!に更新されたことを確認できます。&lt;/p&gt;&lt;p&gt;上のソースをみればcontrolからformのインスタンスを取得する関数はfindform()です。もちろん、コンストラクタでコントロールを生成する時、formのインスタンスをパラメータに渡すことも可能ですが、window formを作成する時にソースコード規約を守らないとvisual studioのデザインモードがエラーが発生する可能性があります。&lt;/p&gt;&lt;p&gt;それで一般的にcontrolではformのインスタンスをfindform()関数を利用して取得します。そうするとformのインスタンスからボタンインスタンスをどのように探すか?&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうです。上で設定したcontrolのnameで探します。もちろん、ボタンのインスタンスをプロパティでpublicを設定すればnameで探す必要がありませんが、実際にウィンドウプログラムを開発するとすごく多いコントロールを使うことになります。&lt;/p&gt;&lt;p&gt;そうならすべてのコントロールをプロパティに設定するとソースがかなり汚くなりますね。また、findformで取得するタイプはformクラスタイプです。そうならform1で強制キャストして型変更もやるべきですね。&lt;/p&gt;&lt;p&gt;上の例ではdialog型の一つのフォーム(smi:single document interface)ですが、mdi(multiple document interface)型ならformもコントロールほと使うでしょう。&lt;/p&gt;&lt;p&gt;マルチform環境でtestcontrolを使うと思えば、強制キャストするとエラーが発生する可能性が高いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので、コントロールでフォームインスタンスを取得する方法はfindform()関数ろ利用して、コントロールを探す方法はnameを利用して探す方法が安全です。&lt;/p&gt;&lt;p&gt;なのでコントロールでnameを設定するのは識別ために重要な作業になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のウィンドウフォーム(window form)にコントロール(control)を使い方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/303.html</guid><pubDate>Fri, 29 Oct 2021 19:45:43 +0900</pubDate></item><item><title>[Design pattern] 2-4. デコレーターパターン(Decorator pattern)</title><link>https://www.nowonbun.com/302.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのデコレーターパターン(decorator pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;デコレーターという英語の意味では飾るという意味です。その意味でデコレーターパターンはインターフェースから継承したクラスの機能を拡張するためのパターンだと言えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2098&quot; data-filename=&quot;001.png&quot; style=&quot;width: 400px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/decorator_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/decorator_pattern&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2099&quot; data-filename=&quot;002.png&quot; style=&quot;width: 251px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみると始めのnodeクラスからは単純なnode-&amp;gt;print()の出力だけあるでしょう。&lt;/p&gt;&lt;p&gt;でも、nodetimedecoratorのデコレーターを追加して、nodelogdecoratorのデコレーターを追加しました。&lt;/p&gt;&lt;p&gt;結果はnodelogdecoratorのprintが呼び出してnodetimedecoratorのprintが呼び出して、最終的にnodeクラスのprintが呼び出されました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2100&quot; style=&quot;width: 408px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;デコレーター構造は抽象クラスからインターフェースを継承してコンストラクタには継承したインターフェースを継承したインスタンスを受け取ります。&lt;/p&gt;&lt;p&gt;そしてデコレーター抽象クラスを継承したクラスにはインターフェースの定義により作成してメンバー変数にある継承したインターフェースのインスタンスを実行します。&lt;/p&gt;&lt;p&gt;そうならデコレータークラスはinodeを継承したすべてのインスタンスの抽象化された関数にデータを追加することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2101&quot; data-filename=&quot;004.png&quot; style=&quot;width: 160px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はデコレーターパターンでファクトリーメソッドパターンを追加したことです。&lt;/p&gt;&lt;p&gt;getnodefactory関数でcaltypeタイプのパラメータの結果により取得するインスタンス種類が違いますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;個人的に構造パターンの中でファサードパターン(facade　pattern)の以外によく使うパターンではないかと思います。例えば、フレームワークや.net frameworkで提供する基本クラスを仕様により変更することが多いですが、その場合、デコレーターパターンを適用するとすごくコーディングが楽になることを感じますね。&lt;/p&gt;&lt;p&gt;特にログ処理クラスやデータベースのデータ処理クラスでよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのデコレーターパターン(decorator pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/302.html</guid><pubDate>Thu, 28 Oct 2021 20:11:13 +0900</pubDate></item><item><title>[C#] 58. ウィンドウフォーム(Window form)を作成する方法、そしてウィンドウメッセージとキュー</title><link>https://www.nowonbun.com/301.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でウィンドウフォーム(window form)を作成する方法、そしてウィンドウメッセージとキューに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#という言語はms社で開発した言語でwindow osに環境で特化されています。つまり、c#言語で我々がよく使うウィンドウ環境でウィンドウプログラムを開発することができます。&lt;/p&gt;&lt;p&gt;javaやその以外のpythonなどを通ってウィンドウプログラムを作れないということではありませんが、でも、ウィンドウがms社の製品なのでc#からwindow apiを使うのがもっとしやすいです。&lt;/p&gt;&lt;p&gt;実は、c#言語を勉強することはウィンドウプログラムを作るためというのも間違ってありません。最近、ゲームエンジンでよく使うunityも基本的に使う言語もc#です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それなら簡単にウィンドウフォームを作成しましょう。&lt;/p&gt;&lt;p&gt;visual studioを起動してプロジェクト作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2065&quot; data-filename=&quot;001.png&quot; style=&quot;width: 368px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとwindow forms app項目が二つが出ます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2072&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一つはcore用だし、もう一つは.net framework用です。core用を使っても構いないですが、window formは基本的にwindow環境で実行するプログラムなのに、coreを選択する必要はありません。&lt;/p&gt;&lt;p&gt;最近に使うwindow 10には基本的に.net frameworkがインストールされていますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてプロジェクト名を入力してプロジェクト作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2061&quot; data-filename=&quot;003.png&quot; style=&quot;width: 648px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならvisual studioに基本的にwindow formが生成されています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2059&quot; style=&quot;width: 573px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのままにf5(starting debugging)を押下するとウィンドウにウィンドウプログラムが実行されていることを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2057&quot; data-filename=&quot;005.png&quot; style=&quot;width: 330px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はここまでしてもウィンドウプログラムを一つ作ったことと同じ意味ですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで我々がウィンドウフォームにボタンを一つ追加しましょう。&lt;/p&gt;&lt;p&gt;visual studioの隣を見るとtoolboxがあることを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2071&quot; data-filename=&quot;006.png&quot; style=&quot;width: 255px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そこでbuttonを探してフォームにマウスを押下しながら引き付けます。(drag-and-drop)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2062&quot; data-filename=&quot;007.png&quot; style=&quot;width: 662px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとフォームにボタンが生成されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとボタンをダブルクリックしましょう。&lt;/p&gt;&lt;p&gt;そうなるとソース画面に変わったことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2064&quot; data-filename=&quot;008.png&quot; style=&quot;width: 458px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;何かを知らないですが、button1_clickという関数がありますね。ここでクリックする時に動作するソースを実装するらしいです。&lt;/p&gt;&lt;p&gt;button1_click関数の中にmessagebox.show(&quot;hello world&quot;)を入力してまた、f5(starting debugging)を押下してデバックしましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行するとウィンドウプログラムが実行されてその中でボタンがあることを確認できます。ボタンをクリックするとメッセージボックスにhello worldという文字があることを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2075&quot; style=&quot;width: 263px;&quot; data-filename=&quot;009.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでが基本的なウィンドウプログラム作成する流れです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ソースに関して少し詳細に説明します。&lt;/p&gt;&lt;p&gt;隣のエクスプローラーを見るとform1.csファイルがあり、form1.desiner.csファイルとform1.resxファイルがあります。&lt;/p&gt;&lt;p&gt;そしてprogram.csファイルがありますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2068&quot; style=&quot;width: 320px;&quot; data-filename=&quot;010.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、program.csファイルを開くと下記通りのソースがあります。&lt;/p&gt;&lt;p&gt;基本的に上のソース構造はconsoleで作成した構造と同じです。つまり、プログラムはmain関数で実行することです。&lt;/p&gt;&lt;p&gt;改めて言えば、コンソールプロジェクトでsystem.windows.formsライブラリを連結して上と同じソースを作成すれば同じウィンドウプログラムが実行されるという意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2058&quot; style=&quot;width: 345px;&quot; data-filename=&quot;011.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2060&quot; data-filename=&quot;012.png&quot; style=&quot;width: 773px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでまた、知りたいのがコンソールウィンドウはないか?と思えますが、エクスプローラーでプロジェクトをマウス右クリックするとpropertiesというメニューがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2066&quot; data-filename=&quot;013.png&quot; style=&quot;width: 460px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クリックすると設定画面がでますが、そこでoutput typeの項目がwindows applicationになっています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一応、配布する時にはwindows applicationに変更しなければならないですが、我々は一応開発しなければならないのでconsole applicationに変更しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2063&quot; data-filename=&quot;014.png&quot; style=&quot;width: 779px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、f5(starting debugging)を押下してデバックするとconsoleウィンドウが出ることを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2056&quot; data-filename=&quot;015.png&quot; style=&quot;width: 300px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、ソースに戻って、program.csファイルにはnew form1()でインスタンスを生成してapplication.runで実行することを確認できます。&lt;/p&gt;&lt;p&gt;このapplication.runは後でまた説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;new form1でインスタンスが生成されたからform1.csを確認するべきですね。&lt;/p&gt;&lt;p&gt;多分、form1.csファイルをクリックするとデザインウィンドウが表示されますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでマウス右クリックしてview codeでソースを見ましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2067&quot; data-filename=&quot;016.png&quot; style=&quot;width: 523px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先に、我々がボタンをクリックすると実行するソースがありますね。確実に構造はform1のクラスだし、formクラスを継承しました。&lt;/p&gt;&lt;p&gt;コンストラクタではinitializecomponent関数が実行され、button1_clickという関数があり、クリックすると実行しますね。これだけ見ると実はプログラムが理解できません。すべて自動に処理するか？プログラムでは自動っていうのはありません。すべての動作には理由があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとform1.desiner.csファイルを見ましょう。&lt;/p&gt;&lt;p&gt;form1クラスがpartialで分割されています。&lt;/p&gt;&lt;p&gt;reference - &lt;a href=&quot;https://www.nowonbun.com/290.html&quot; target=&quot;_blank&quot;&gt;[c#] 55.namespaceとusing、そしてpartialの使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;そしてbutton1クラスがメンバー変数にあり、initializecomponent関数の中でインスタンスを生成しますね。&lt;/p&gt;&lt;p&gt;そして様々な複雑な設定は一応無視して、this.button1.clickという関数を見ると、イベントを追加する関数ですね。&lt;/p&gt;&lt;p&gt;つまり、form1.csファイルの中である関数はbuttonでクリックすると発生するイベント関数でしだ。&lt;/p&gt;&lt;p&gt;reference - &lt;a href=&quot;https://www.nowonbun.com/26.html&quot; target=&quot;_blank&quot;&gt;[c#] 25. イベント(event)キーワードを使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとwindowの属性を変更するならform.designer.csで修正するべきか?&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2070&quot; data-filename=&quot;021.png&quot; style=&quot;width: 520px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;visual studioは親切にデザイン画面の右下のプロパティ設定をみると属性を設定する項目があります。下に属性説明までありますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ほとんどformの構造は分かりました。一応、form1はformクラスを継承しました。&lt;/p&gt;&lt;p&gt;つまり、formから基本的にウィンドウフォームを描画するし、様々な設定そしますが、我々が設定を変更する部分は継承して再定義する型でプログラムが構成されています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとwindowとはどの方法でプログラムが動くかを説明します。&lt;/p&gt;&lt;p&gt;windowは基本的にスレッド環境で無限ループ中です。一番比較しやすい例がフリップブックがあります。&lt;/p&gt;&lt;p&gt;フリップブックとは我々が子供時代に、教科書の最初の章に絵を描き、第2章に少し動く絵を描き、第3章にさらに動く絵を描いて、最後に本をめくるとまるで絵が動くように見えるものがあります。&lt;/p&gt;&lt;p&gt;windowも同じく、スレッドで連続的に画面に描くことです。それが1秒で20章なら20フレーム(20fps)、40章なら40フレーム(fps)で表現することです。ウィンドウフォームは我々がfpsを設定することではありませんが、その仕組みで画面に描画されることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;連続に画面に描画することは分かるが、そうするとボタンクリックのイベントや処理は別のスレッドで実行されることか？違います。&lt;/p&gt;&lt;p&gt;複数のスレッドを使うことになると同期化の問題が発生します。各スレッドでどの時点でデータを受け取るかに関する問題でしょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/40.html&quot; target=&quot;_blank&quot;&gt;[c#] 39. lockキーワードとdeadlock(デッドロック)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;同期化の問題が発生するためウィンドウは基本的に単一スレッドで無限ループを実行されています。&lt;/p&gt;&lt;p&gt;例えば、button1_clickでmessagebox.show()を使いましたが、今回はforを使って0から1000までthread.sleepを入れて実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2069&quot; style=&quot;width: 349px;&quot; data-filename=&quot;017.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを実行してボタンを押下するとコンソールウィンドウでi値が出力されていることを確認できます。でもウィンドウを操作しようと思えば動けません。少し時間が流れると応答なしでプログラムが凍っていることを確認できます。&lt;/p&gt;&lt;p&gt;つまり、単一スレッドで関数などで上みたいにインタラプトを掛けるとプログラムが止まってしまいます。そうするとウィンドウプログラムでは時間が掛かる作業をすればダメかな?それはウィンドウスレッドを利用すれば良いですが、それは別の投稿で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、ウィンドウの説明に戻って、ウィンドウは単一スレッドで無限ループをします。そうすると、上みたいなクリックやイベント処理が発生する時、どの流れで発生するかというとウィンドウメッセージキューがあります。(キューアルゴリズムのfilo構造です。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2073&quot; data-filename=&quot;018.png&quot; style=&quot;width: 771px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://www.researchgate.net/figure/window-based-messaging-process-the-function-prototype-of-postthreadmessage-is-bool_fig3_339679677&quot; target=&quot;_blank&quot;&gt;https://www.researchgate.net&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;説明が難しいですが、上のイメージ通りにウィンドウが動いています。システムでウィンドウ生成!するとシステムからウィンドウにメッセージを送信します。例えば、描画して!、どの関数を実行!してというメッセージですね。&lt;/p&gt;&lt;p&gt;そうすると我々のプログラムではメッセージを受け取ってどの位置にありますとか実行しましたとかの返却メッセージをシステムに送信するとシステムからモニターにウィンドウを描画することです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2074&quot; style=&quot;width: 337px;&quot; data-filename=&quot;019.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;wndprocという関数をformクラスから再定義してconsoleにメッセージを出力すると何かのデータが連続に出力することを確認できます。&lt;/p&gt;&lt;p&gt;これがメッセージ番号ですが、実はc#ではメッセージキューを直接にコントロールする必要がありません。&lt;/p&gt;&lt;p&gt;なので、この識別コードに関する値がc#には定義されてありませんが、c++(mfc)には定義されています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2076&quot; data-filename=&quot;020.png&quot; style=&quot;width: 481px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の識別コードでシステムからウィンドウフォームに連続にメッセージを送信するとウィンドウにはそのメッセージを受け取って処理することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はc#にはwndproc関数まで再定義して使うことはありません。&lt;/p&gt;&lt;p&gt;私も実務ではwindowプログラムプロジェクトを一回だけやりましたが、その時には私がc#をよく知らなかったので、wndproc関数に様々な処理を付けて開発した記憶がありますね。c#にはほぼすべてのメッセージがイベントあるいはvirtualで再定義できるようにクラスが作成されています。&lt;/p&gt;&lt;p&gt;個人的な経験ではc++(mfc)はその機能がありません。なので、イベントや特定処理をmessageで処理した記憶がありますね。window messageは一つのプログラムだけ使うことではなく、システム全体に運用することなので、たまに、messageでインスタンスのアドレスやデータを間違って送ると、受け取る側でデータが受け取れなくてオブジェクトを探した記憶があります。&lt;/p&gt;&lt;p&gt;どの時は別のプログラムにデータを間違って送ってプログラムが可笑しくなる可能性もあります。参考に以前にスタークラフトやディアブロでゲームマップハッキングツールがこのwindow messageを利用してプログラムの中の値を変造することです。特定値が更新するとマップがすべて見えることかなど&lt;/p&gt;&lt;p&gt;c++(mfc)に比べたらc#は革命的にウィンドウ開発がしやすくなりました。たぶん、この部分せいでc++(mfc)がc#より相手的に難しいと言うらしいですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でウィンドウフォーム(window form)を作成する方法、そしてウィンドウメッセージとキューに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/301.html</guid><pubDate>Wed, 27 Oct 2021 20:35:44 +0900</pubDate></item><item><title>[Design pattern] 2-3. ブリッジパターン(Bridge pattern)</title><link>https://www.nowonbun.com/300.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのブリッジパターン(bridge pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ブリッジパターンとは概念として抽象部の処理と実装部の処理を独立的に使えるような方法です。理解しやすく言えば、抽象部は、つまりインターフェースから関数に関する処理を定義すると、継承した実装部、つまり、クラスには受け取ったインスタンスにより別の結果を実装する構造です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2051&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 580px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/bridge_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/bridge_pattern&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2049&quot; data-filename=&quot;002.png&quot; style=&quot;width: 181px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみればbridgeのクラスにどのインスタンスを渡すことにより結果が違います。つまり、node1インスタンスを渡すとnode1の結果がコンソールに出力するし、node2インスタンスを渡すとnode2の結果がコンソールに出力されます。&lt;/p&gt;&lt;p&gt;bridgeクラスはinodeクラスの実行に関する定義を実装することでそのデータ値により結果が別々に出力されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2050&quot; data-filename=&quot;003.png&quot; style=&quot;width: 160px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaの例もc++と似ている構造です。ブリッジパターンはほぼ規格されたパターンかな?別の型で応用しようと思うが、良い例がないですね。&lt;/p&gt;&lt;p&gt;私が知らない可能性もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2048&quot; data-filename=&quot;004.png&quot; style=&quot;width: 286px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このブリッジパターンは我々が良く使うmvc型のフレームワークでよく見えるパターンです。&lt;/p&gt;&lt;p&gt;client(browser)から要請が来るとパラメータをmodelクラスにインスタンス生成してcontrollerを呼び出して実際に我々が作成する実装部はcontrollerのexecute関数です。&lt;/p&gt;&lt;p&gt;抽象部分はすべてフレームワークで実行されていますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのブリッジパターン(bridge pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/300.html</guid><pubDate>Wed, 27 Oct 2021 20:32:21 +0900</pubDate></item><item><title>[Design pattern] 2-2. コンポジットパターン(Composite pattern)</title><link>https://www.nowonbun.com/299.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのコンポジットパターン(composite pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンポジットパターン、合成パターンと呼ばれるパターンです。一つのクラスと複合クラス(つまり、リスト)を同一な構成して使うパターンという意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2043&quot; style=&quot;width: 600px;&quot; data-filename=&quot;001.jpg&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/composite_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/composite_pattern&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2040&quot; data-filename=&quot;002.png&quot; style=&quot;width: 202px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンポジットパターンの基本的な型です。共通のインターフェースに一つは単一実行に関するインスタンスにprint関数を再定義して、一つは複数のインスタンスに関するprint関数を再定義して実行しました。&lt;/p&gt;&lt;p&gt;つまり、コンポジットクラスは同じなインターフェースから継承してリストタイプのメンバー変数を生成し、add関数を通って同じインターフェースを継承したインスタンスを受け取って同じ関数名を実行する型のパターンです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2041&quot; data-filename=&quot;003.png&quot; style=&quot;width: 176px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通はlistをメンバー変数に実装しますが、listを継承して実装することもできます。&lt;/p&gt;&lt;p&gt;個人的にlistを継承するほうが別にadd関数やremove関数を実装する必要がなくて便利だと思いますが、仕様によりメンバー変数でlistの関数を隠すことやアダプターパターンで別の型に変換する可能性もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2042&quot; style=&quot;width: 223px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一つのクラスに対するパターンではありません。&lt;/p&gt;&lt;p&gt;inodeを継承したすべてのインスタンスを同じ構造のcompositeクラスで一括的に実行するための目的です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのコンポジットパターン(composite pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/299.html</guid><pubDate>Wed, 27 Oct 2021 20:30:54 +0900</pubDate></item><item><title>[Design pattern] 2-1. アダプターパターン(Adapter pattern)</title><link>https://www.nowonbun.com/298.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのアダプターパターン(adapter pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アダプターパターンからは構造パターンです。構造パターンとは様々なクラスやオブジェクトを組み合わせてもっと大きい構造を作るパターンです。以前の生成パターンはnewキーワードを利用してインスタンスを生成する型がメインだったら、構造パターンはクラスやオブジェクトの構造をどのように構成するかをメインに考えるパターンです。&lt;/p&gt;&lt;p&gt;アダプターパターンはインターフェースに連結されてない他のクラスを同じインターフェースの型に変換することが目標です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2035&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 640px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/adapter_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/adapter_pattern&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2032&quot; data-filename=&quot;002.png&quot; style=&quot;width: 258px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば私がmain関数でinodeインターフェースタイプのインスタンスをvectorを使って格納するため、宣言しました。&lt;/p&gt;&lt;p&gt;でも、node2クラスはinodeインターフェースを継承したクラスではないので、inodeインターフェースグループに格納することができません。クラス構造は似てますが。。。&lt;/p&gt;&lt;p&gt;node2をinodeから継承したら簡単に解決するかも知れませんが、状況によりnode2クラスを修正したらダメなら上みたいにadapterクラスを作成してnode2クラスをinodeインターフェースから継承したらしく使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2034&quot; style=&quot;width: 177px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;adapterパターンが必ずクラスだけ使うことではありません。上みたいにinterfaceアダプタークラスを作成してinodeanotherから継承したクラスはinodeインターフェースを化粧したアダプタークラスに変換することが可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2033&quot; data-filename=&quot;004.png&quot; style=&quot;width: 193px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アダプターパターンは基本的にコンストラクタでタイプを変更しようと思うクラスのインスタンスを受け取って新しいクラスで包むことです。&lt;/p&gt;&lt;p&gt;でも、必ずコンストラクタでインスタンスを受け取ることではなく、上みたいに継承を利用してアダプターパターンを実装することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのアダプターパターン(adapter pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/298.html</guid><pubDate>Tue, 26 Oct 2021 19:12:40 +0900</pubDate></item><item><title>[Project design] プログラム最終テスト - ST(System test(Standard, Scenario))</title><link>https://www.nowonbun.com/297.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はプログラム最終テスト - st(system test(standard, scenario))に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムが納品する前のテストでstテストと言います。略語がsystem testと言いますが、人によりstandard(ステンダード:標準)やscenarioテストという人もいます。&lt;/p&gt;&lt;p&gt;略語の解析だけ違いますが、みんな認識するのはテストの流れは似ています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にテスト範囲に関して説明したことがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2014&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の流れでテストが実施しますが、最終テストは基本設計に対するテストです。&lt;/p&gt;&lt;p&gt;つまり、以前の単体テスト(ut)や結合テスト(it)にはプログラムに関するバグや操作に関するテストがメイン項目だと、stにはプログラムの仕様によるテストがメインです。つまり、プログラム的なバグではなく、論理的なバグに関するテストです。&lt;/p&gt;&lt;p&gt;例えば、特定要請ページで生成だれたデータを特定な流れにより計算して最終的なデータが表示されることが正確かというテストです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前のテストまではプログラムツールやライブラリを通って自動化テストをできることならstはすべてのテストケースは人が実施して値が正確かを確認しなければならないです。&lt;/p&gt;&lt;p&gt;テストの方法に関してはプログラムの種類や型により違います。&lt;/p&gt;&lt;p&gt;例えば、ゲームの場合は普通にアルファー、クローズベータ、オープンベータのタイプでテストが行う場合が多いし、一般プログラムツールに関してもunstableバージョン、stableバージョン(安定化バージョン)を区分してunstableバージョンがテストバージョン、stableやltsバージョンが正式なバージョンになります。&lt;/p&gt;&lt;p&gt;そしてウェブ環境にはテストバージョン(dev環境バージョン)、正式バージョン(productionバージョン、本番バージョン)で区分して配布する(deploy)場合もあります。これはプログラムの種類やバグの重要性により方法と期間が区分になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stテスト仕様書を作成する時にはステップ数、つまり、テストの項目数は普通はプログラムコードライン数の5~10%を作成します。&lt;/p&gt;&lt;p&gt;つまり、プログラムのコードが総10万ラインだとテスト項目を5千件から1万件ほどを作成します。テストの仕様書の内容は基本設計により論理的なデータ確認なので、単純なutやitで確認したものでは除きます。&lt;/p&gt;&lt;p&gt;例えば、pdfや帳票を出力するボタンを押下する時にちゃんとダウンロードができるかどうかはstの項目ではありません。stの項目はpdfにデータがちゃんと載せているかを確認することですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stの項目だと言えば、どの特定な権限を持っている場合、依頼ページからデータが生成されるか、別の権限を持っている場合はデータ生成ができなくなるか、あるいは権限によりデータがちゃんと見えるかとかデータ計算は仕様とおりに計算されているかの検査です。&lt;/p&gt;&lt;p&gt;もちろん、it部分と重ねている部分もあると思いますが、プログラムも結局人が使うツールなので、人が操作する時に、感じるスクリプトと動きが自然するか、パフォーマンス、データの正確度に関するテストですね。&lt;/p&gt;&lt;p&gt;例えば、ウェブテーブルタグには値が正確に表示されますが、画面が見にくい表示され、人が間違って認知する確率があるかボタンを探すのが大変かの様々に関する検査です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stはプログラムを納品する前の最終テストだからプロジェクトの権限に関しても重要です。&lt;/p&gt;&lt;p&gt;プロジェクトのチームを構成する時、メインメンバーがpm(project manager)とシニアプログラマー(senior developer)と品質管理者(quality manager)ですが、pmはプロジェクトのスケジュールと全体的な管理、シニアプログラマーは開発に関する総責任者、品質管理者はプロジェクトのテストを責任します。&lt;/p&gt;&lt;p&gt;プロジェクトのサイズと構成によりその責任が違いますが、普通はプログラムのエラーや要求事項に関するエラーなら品質管理者(quality manager)が責任する場合が多いです。(これがプログラムのタイプや比重により構成が変わる部分ですが、普通はpmとシニアプログラマー、品質管理者に分けます。)&lt;/p&gt;&lt;p&gt;そのため、品質管理者がプロジェクトの中で権限が強いし、プロジェクトのstの領域はかなり重要な部分です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロジェクトの特性によりstの期間と人力が変わるし、そのため、プログラムの値段も変わる場合もたくさんあります。&lt;/p&gt;&lt;p&gt;中大型のミドルウェアやofflineプログラムの場合は配布した後でバッチや修正配布が可能な場合はstの期間と人力の値段に下がる場合もあるので、プログラムの値段が下がる場合もあります。&lt;/p&gt;&lt;p&gt;なので、offline製品よりonline製品がもっと安い場合もあります。でも、それがstの値段算出によりなのでonlineだって無条件に安いということではありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ほとんどのフトウェアプログラムはofflineやonlineでも簡単にアップデートが不可能な製品が多いです。例えば、基幹産業(鉄道、飛行機、電気、ガス)や金融、医療などのソフトウェアは一回にインストールされたらアップデートが難しいです。なのでプログラムの製造値段もすごく高いですが、テスト工程の値段もすごく高いです。&lt;/p&gt;&lt;p&gt;ウェブサービスだと言っても社内seポータルサービスが開始するとその仕様により会社の組織が構成され業務標準になる場合が多いので、間違って作成してデータが間違って格納されたら途中で修正するのが考えより簡単ではありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;小さいプロジェクトなら普通の開発者がテストまで実施して納品する場合もありますが、その時にしっかりテストを行わなくてバグが発生する場合も多いです。&lt;/p&gt;&lt;p&gt;理由はutやitの技術的なテストが終わってstでまたテストする項目があるかと思いがあるからですね。私も新人の時に、いや今でもたまに行うミスですね。&lt;/p&gt;&lt;p&gt;その時の私の経験ではutやitのミスで発生したバグより、stで発生したバグがもっと致命的なバグも結構あるでしょう。&lt;/p&gt;&lt;p&gt;例えば、ユーザが作動するために特定なデータが溜まると思えば、間違いデータがそのままで3~4か月ごろに溜まって、後で気づけました。その後でデータを修正しようと思えば、間違いデータがもう何万件に格納されたし、様々なテーブルにレファレンスされ、修正が難しくなりました。&lt;/p&gt;&lt;p&gt;普通、utやitの技術ミスはデータがnullや規則的なバグが多いですが、stに発生するバグはエラーが発生することもないし、不規則的な要素も多いのでデータを確認して修正するためのバッチを作成することも簡単ではありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stの場合は決まている方法論やテスト方法はありません。技術的な要素もないので、説明するのはここまでですね。&lt;/p&gt;&lt;p&gt;stの工程を重要に思って、良い品質なプログラムを作成しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでプログラム最終テスト - st(system test(standard, scenario))に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Project design</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/297.html</guid><pubDate>Tue, 26 Oct 2021 19:10:07 +0900</pubDate></item><item><title>[Project design] プログラム結合テスト - IT(Integration test)</title><link>https://www.nowonbun.com/296.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はプログラム結合テスト - it(integration test)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿で単体テスト(unitテスト)に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/293.html&quot; target=&quot;_blank&quot;&gt;[project design] プログラム検証とテスト - unitテスト&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;単体テストでは関数とクラス単位でテストすることですが、テストの回数がciツールを利用して相当に頻繁にテストをします。&lt;/p&gt;&lt;p&gt;結合テストはunitテストから検証された関数とクラスを全体的に合わせて一つの流れでテストすることです。ウェブプロジェクトには実際にウェブサーバ(開発サーバ - dev server)に配布(deploy)して運用しながら検査することです。開発サーバなので、本データを扱うことではなく、から偽データを使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;テストの範囲は下記の構造により動きます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2014&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結合テストは詳細設計で作成したシークエンスやインターフェースを確認することなので、プロジェクトの仕様をテストすることよりプログラム的な不良要素を検証することです。&lt;/p&gt;&lt;p&gt;例えば、どのデータを渡したらnullエラーが発生するとか、関数によりinputからoutputは正解ですが、関数の順番で値が間違いか((1+2)*3と1+(2*3)の差異)、ウェブ画面から数字を入れなければならないが、テキスト文字が入っている場合に表示するエラーメッセージなどをチェックするテストなら良いでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結合テストは大幅で二つのパターンで実施します。&lt;/p&gt;&lt;p&gt;一つはseleniumというライブラリを使うことと人がいろいろをクリックしながらチェックすることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;seleniumライブラリを利用するのはウェブスクレイピングという技術です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/295.html&quot; target=&quot;_blank&quot;&gt;[python] seleniumライブラリを使う方法(自動ウェブテスト、ウェブスクレイピング)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;seleniumライブラリを通ってテストボットを作成するのはjavaもできるし、c#もできますが、テストの特性上にスクリプト修正が多く発生する領域なので修正するたびにビルドすることより修正と実行が便利なpythonに個人的に良いではないかと思います。&lt;/p&gt;&lt;p&gt;seleniumライブラリを使うことの利点は我々がウェブページを単純な繰り返しなテストはプログラムとして流すことでテスト時間を短縮することができるし、特定な部分を修正して発生するリグレッションテストを簡単にできます。&lt;/p&gt;&lt;p&gt;または、ブラウザによりchromeやie、safariなど、環境によりモバイルやパソコン、タブレットなどをテストをスクリプトで一括的にテストができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、seleniumライブラリを通る検証が利点だけではありません。&lt;/p&gt;&lt;p&gt;seleniumライブラリを利用するのは検証プログラムを作成することになります。それもプログラムだし、そうならプロジェクトの工程になるので、設計やプログラム検証の負担があります。プログラムを作ることは必ず工程を通ることではありませんが、検証は必要なのでどのくらいは設計が必要ですね。&lt;/p&gt;&lt;p&gt;つまり、我々が作ったプロジェクトを検証するプログラムですが、このプログラムがバグを発生して元のプロジェクトのバグを見つけられなかったら、最初のプロジェクトの品質にも問題になります。なので、検証プログラムを作成することもずいぶん費用が発生しますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてこのseleniumライブラリを通ることですべてのテスト検証することではありません。&lt;/p&gt;&lt;p&gt;seleniumライブラリは結局にhtmlタグを通って結果確認ですが、デザインバグや崩れがの場合はチェックができません。&lt;/p&gt;&lt;p&gt;画面サイズにより文字が見えないとかデザインが設計と差異があるかの部分は人がテストするしかありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近はrpaという自動化エミュレータシステムというaiを利用するソフトウェアがありますが、これを利用すると結合テストに関する工程の時間やデザインチェックなどもできると言いますが、ソフトウェア値段が高いし、普遍化されている技術ではありません。これからどのようになるかはまだ知りません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結合テストは納品する前のプログラム的な最終テスト段階なので工程をしっかり設定しないとすごく時間が掛かる部分です。&lt;/p&gt;&lt;p&gt;次の単会はシステムテスト(st)がありますが、その部分はプログラムに関する検証ではなく、仕様に関する検証です。つまり、お客様と仕様をお互いに確認しながら依頼させた部分と内容が合っているか検証になります。ゲームに考えるとベータサービスと同じ意味です。&lt;/p&gt;&lt;p&gt;なので、できれば結合テストで発生するバグをすべて直さなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通、この結合テストを行うのはテスト仕様書を作成します。&lt;/p&gt;&lt;p&gt;このテスト仕様書にはオブジェクトにあkンするテスト、処理テスト、セキュリティテスト、パフォーマンステスト、システムテスト、ログテストなどがあります。&lt;/p&gt;&lt;p&gt;この仕様の項目はプロジェクトより全然違いますが、ウェブ環境のプロジェクトはほぼ似ているじゃないかと思います。&lt;/p&gt;&lt;p&gt;オブジェクトテストはテキストボックス、チェックボックスに関するnull処理、数字だけできるオブジェクトに文字を入れる場合、文字化けなどをチェックする項目です。&lt;/p&gt;&lt;p&gt;処理テストはpost requestする場合にデータベースにデータが正しく格納されるか、データベースの内容が画面に正しく表示されるか、メッセージがちゃんと表示されるかを確認します。&lt;/p&gt;&lt;p&gt;セキュリティテストはinjectに関するテストが多いですが、テキストボックスに特殊文字が入力できるかをチェックして、出来るならsql inject、つまり、sql構文には問題ないか、getタイプによりあるいはスクリプトの変造によりデータフィルターはよく動いてるかのテストです。&lt;/p&gt;&lt;p&gt;パフォーマンステストはブラウザから要請する場合、response時間がどのくらいか、post requestが連続に発生する場合はデータベースに処理する流れ、d-dosの対策などを確認します。&lt;/p&gt;&lt;p&gt;システムテストはメールがちゃんと送信されるか、様々なシステムとソケットや規約でお互いに問題なく通信ができるかを確認します。&lt;/p&gt;&lt;p&gt;ログテストはウェブ上で動作に関するログがちゃんと作成されるかに関するテストです。&lt;/p&gt;&lt;p&gt;その以外のメッセージ確認テスト、エラーテスト、つまり、データベースが落ちた場合、wasサーバが落ちた場合の処理画面、エラーやバグが発生する時に表示される画面などを確認しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを作成すると普通は設計やコード作成する時に時間がたくさん掛かると思います。でも、個人的はit工程がプロジェクト工程が一番重要ではないかと思います。そしてit工程を支援するプログラムがあれば積極的に活用する部分ではないかと思います。hpのfortifyなどを利用してですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この結合テストが製品の品質を決定する部分なので点検する部分も多いし、人もたくさん必要です。&lt;/p&gt;&lt;p&gt;その為、チームを構成すると開発者(プログラマー)が10人ならqaテスターは20人で想定しました。つまり、2倍の人力が必要です。&lt;/p&gt;&lt;p&gt;でも、人力が2倍だっても値段が2倍に掛かることでもありません。もちろん、セキュリティテストやパフォーマンステストみたいな部分は専門的な技術知識も必要ですが、オブジェクトテストの場合は単純なテストなので相手的に人的費用が高くないです。&lt;/p&gt;&lt;p&gt;この部分を考慮してチームを組むと限定な予算でいい品質の製品を作成することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでプログラム結合テスト - it(integration test)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Project design</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/296.html</guid><pubDate>Mon, 25 Oct 2021 20:12:17 +0900</pubDate></item><item><title>[Python] Seleniumライブラリを使う方法(自動ウェブテスト、ウェブスクレイピング)</title><link>https://www.nowonbun.com/295.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでseleniumライブラリを使う方法(自動ウェブテスト、ウェブスクレイピング)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、seleniumとは、ウェブブラウザのドライバーに接続して制御できるライブラリで普通はウェブテストやウェブスクレイピング領域でよく使う技術です。&lt;/p&gt;&lt;p&gt;理解しやすく説明すると、pythonのスクリプトで我々がよく使うクロームブラウザを制御することで特定ボタンを自動にクリックするかウェブページを移動しながらデータを収集してウェブテストやウェブスクレイピングで活用できるライブラリです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にはc#でgeckoブラウザをブラウザをコントロールする方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/212.html&quot; target=&quot;_blank&quot;&gt;[c#] geckoライブラリを利用してウェブスクレイピングする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;seleniumとgeckoブラウザの差異はgeckoブラウザをブラウザのオブジェクトを取得してformコントロールに付けて開発することで実際のブラウザを使うことではなくブラウザのオブジェクトライブラリを使うことです。&lt;/p&gt;&lt;p&gt;でも、seleniumの場合はブラウザのライブラリを利用することではなく、もうpcにインストールされたウェブブラウザをseleniumライブラリを通って制御することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これはもっとユーザ環境みたいに設定ができるのでgeckoブラウザより実際的なウェブテスト環境を構築することができる利点があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このseleniumライブラリを使うためにはpythonからseleniumライブラリをダウンロードしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2026&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私はもうインストールされているとメッセージが出ました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ライブラリをインストールしたら今回はドライバーをインストールしなければならないです。ここではクローム(chrome)の例で説明します。firefoxやieに関しても同じ流れです。&lt;/p&gt;&lt;p&gt;まず、インストールされたクローム(chrome)のバージョンを確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2021&quot; data-filename=&quot;002.png&quot; style=&quot;width: 579px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クローム(chrome)ブラウザの右上のメニューをクリックしてhelp -&amp;gt; about google chromeを押下しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2025&quot; style=&quot;width: 740px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすると上のイメージ通りに現在のバージョンが表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;下記のリンクに移動して小数点前のバージョンを合わせて選択しましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://sites.google.com/a/chromium.org/chromedriver/downloads&quot; target=&quot;_blank&quot;&gt;https://sites.google.com/a/chromium.org/chromedriver/downloads&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2023&quot; data-filename=&quot;004.png&quot; style=&quot;width: 763px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2024&quot; style=&quot;width: 729px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合は79.xxxバージョンだったので、79.xxxをダウンロードしました。そしてウィンドウから使うので、ウィンドウバージョンをダウンロードしました。&lt;/p&gt;&lt;p&gt;圧縮ファイルにはchromedriver.exeがありますが、pythonを実行するファイルフォルダーにコピーして置きましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2022&quot; style=&quot;width: 280px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでseleniumを使うための準備は完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからソースを作成しましょう。&lt;/p&gt;&lt;p&gt;上のソースを実行するとchromeブラウザが実行して動きします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2030&quot; data-filename=&quot;007.png&quot; style=&quot;width: 501px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2028&quot; style=&quot;width: 848px;&quot; data-filename=&quot;008.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ブラウザからブログを接続して検索してデータを取得することまで確認しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうならもっと詳細的にdomを探索するメソッドを関して説明します。&lt;/p&gt;&lt;p&gt;htmlのオブジェクトを取得する方法は総8個があります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;関数名&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;find_element_by_id&lt;/td&gt;        &lt;td&gt;要素の属性idでオブジェクトを探します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;find_element_by_class_name&lt;/td&gt;        &lt;td&gt;要素の属性classが含めているオブジェクトを探します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;find_element_by_name&lt;/td&gt;        &lt;td&gt;要素の属性nameでオブジェクトを探します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;find_element_by_xpath&lt;/td&gt;        &lt;td&gt;xpathを利用してオブジェクトを探します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;find_element_by_link_text&lt;/td&gt;        &lt;td&gt;hyperlinkのテキストを利用してオブジェクトを探します。(完全一致) - 探索がよくできません。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;find_element_by_partial_link_text&lt;/td&gt;        &lt;td&gt;hyperlinkのテキストを利用してオブジェクトを探します。(部分一致) - 探索がよくできません。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;find_element_by_tag_name&lt;/td&gt;        &lt;td&gt;要素のタグ名でオブジェクトを探します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;find_element_by_css_selector&lt;/td&gt;        &lt;td&gt;css selector(sizzle)でオブジェクトを探します。&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;上の探索関数の場合は始めの要素を取得します。複数を探す方法はfind_elementからfind_elementsで探すと複数で要素を探します。&lt;/p&gt;&lt;p&gt;つまり、nameで探す要素が複数の場合は、find_elements_by_nameの関数を利用すればよいでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして複雑なウェブの場合は、xpathを取得することが一番難しいですが、ブラウザの開発モードを利用すると探せます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2029&quot; data-filename=&quot;009.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、開発モードの左上をクリックして探そうと思う要素を選択したら開発モードでタグが選択されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2027&quot; data-filename=&quot;010.png&quot; style=&quot;width: 530px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;選択されたタグでマウスの右クリックしたらcopyメニューがありますが、その中でxpathやcss selectorのパスをコピーできるようなメニューが見えます。単純に直接なパスがコピーされますが、その値を利用して相手パスに修正するとxpathを探せます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その以外にseleniumでよく使う関数は下記の通りです。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;関数名&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;implicitly_wait(秒単位)&lt;/td&gt;        &lt;td&gt;探索する時、objectがなければ待機する時間&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;close()&lt;/td&gt;        &lt;td&gt;ブラウザを終了します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;execute_script(&quot;スクリプト&quot;, 要素)&lt;/td&gt;        &lt;td&gt;該当なページにスクリプトを作成する時に使えます。要素は必須パラメータではなく、要素があれば要素に関するスクリプトが実行されます。なければ全体のページにスクリプトに追加されます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;get_attribute(&quot;属性&quot;)&lt;/td&gt;        &lt;td&gt;属性の値を取得する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;send_keys&lt;/td&gt;        &lt;td&gt;textの場合は値をいれるかキー値を入れると動作します。&lt;br&gt;キーの値は次のリンクを参照してください。&lt;br&gt;link - &lt;a href=&quot;https://selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.keys.html&quot; target=&quot;_blank&quot;&gt;https://selenium.dev/selenium/docs&lt;/a&gt;&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;get_cookies()&lt;/td&gt;        &lt;td&gt;クッキーの値を取得します。(ディクショナリタイプ)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;delete_all_cookies()&lt;/td&gt;        &lt;td&gt;クッキーを削除します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;add_cookie(クッキー)&lt;/td&gt;        &lt;td&gt;クッキーを追加します。(ディクショナリタイプ)&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;次はよく使いませんが、使うなら参考するサイトを纏めます。&lt;/p&gt;&lt;p&gt;アクションに関する関数です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.action_chains.html&quot; target=&quot;_blank&quot;&gt;https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.action_chains.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アラームに関する関数です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.alert.html&quot; target=&quot;_blank&quot;&gt;https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.alert.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;select要素に関する要素です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.selenium.dev/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.select.html&quot; target=&quot;_blank&quot;&gt;https://www.selenium.dev/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.select.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;chromeの設定オプションに関する関数です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.selenium.dev/selenium/docs/api/py/webdriver_chrome/selenium.webdriver.chrome.options.html&quot; target=&quot;_blank&quot;&gt;https://www.selenium.dev/selenium/docs/api/py/webdriver_chrome/selenium.webdriver.chrome.options.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参照サイト&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.browserstack.com/guide/locators-in-selenium&quot; target=&quot;_blank&quot;&gt;https://www.browserstack.com/guide/locators-in-selenium&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://selenium-python.readthedocs.io/&quot; target=&quot;_blank&quot;&gt;https://selenium-python.readthedocs.io/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://pythonbasics.org/selenium-cookies/&quot; target=&quot;_blank&quot;&gt;https://pythonbasics.org/selenium-cookies/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでseleniumライブラリを使う方法(自動ウェブテスト、ウェブスクレイピング)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/295.html</guid><pubDate>Mon, 25 Oct 2021 19:29:00 +0900</pubDate></item><item><title>[Design pattern] 1-5. プロトタイプパターン(Prototype pattern)</title><link>https://www.nowonbun.com/294.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのプロトタイプパターン(prototype pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロトタイプはパターンのアルゴリズムはすごく単純なパターンですが、概念的にポインターとスタック、ヒープメモリに関する概念をよく知らないなら理解するのが難しいパターンです。&lt;/p&gt;&lt;p&gt;我々がプログラム上でクラスのインスタンスを生成すると変数にポインターアドレスが格納されるし、ポインターアドレスによりヒープメモリにインスタンスが割り当てすることです。そのため、変数で新しいインスタンスを生成せずに、等号(equal: =)記号で新しい変数名にインスタンスのアドレスをコピーすると二つの変数で一つのインスタンスを指しているので、変数の間でデータの影響に及ぼします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2015&quot; data-filename=&quot;001.png&quot; style=&quot;width: 212px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;当たり前の話ですが、当然に影響を及ぼします。結果を見るとnode変数とnodeclone変数のメモリアドレスが同じなことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2020&quot; data-filename=&quot;002-1.jpg&quot; style=&quot;width: 600px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のイメージみたいな構造で二つの変数に一つのインスタンスを指しているからです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/12.html&quot; target=&quot;_blank&quot;&gt;[c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/50.html&quot; target=&quot;_blank&quot;&gt;[java] 10. メモリの割り当て(stackメモリとheapメモリ、そしてnew)とcall by reference(ポインタによる参照)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうなら逆にそのインスタンスアドレスをコピーせずに、クラスのデータを同じくしてクラスをコピーすることができないだろうか？&lt;/p&gt;&lt;p&gt;上のクラスはすごく単純な構造なのでnew nodeしてdataの値をコピーすることで可能ですが、複雑なクラスだし、メンバー変数がすべてprivateに設定している場合は単純にコピーすることが難しいですね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2018&quot; style=&quot;width: 650px;&quot; data-filename=&quot;003.jpg&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/prototype_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/prototype_pattern&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2016&quot; data-filename=&quot;004.png&quot; style=&quot;width: 139px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c/c++には単純にclone関数で新しいインスタンスを生成するnewキーワードを使ってthisポインターをパラメータに渡すとインスタンスコピーになります。&lt;/p&gt;&lt;p&gt;結果を見るとdataの値は同じですが、メモリアドレスが違うことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2019&quot; style=&quot;width: 175px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaの場合はcloneableインターフェースを継承してからプロトタイプ関数のclone関数を使えます。そしてobjectクラスにはclone関数がprotectedのアクセス修飾子で設定されているので、publicに再定義しなければならないです。&lt;/p&gt;&lt;p&gt;javaもメンバー変数の値は同じことに確認できますが、メモリアドレスは別なので別のインスタンスということを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2017&quot; style=&quot;width: 224px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#にはjavaと違い、別に継承するインターフェースはありません。javaと同じく、objectクラスにmemberwisecloneの関数がprotectedのアクセス修飾子に設定されているのでpublicに再定義しなければならないです。&lt;/p&gt;&lt;p&gt;結果をみるとメンバー変数の値は同じですが、メモリアドレスが別のことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのプロトタイプパターン(prototype pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/294.html</guid><pubDate>Fri, 22 Oct 2021 19:35:45 +0900</pubDate></item><item><title>[Project design] プログラム検証とテスト - Unitテスト</title><link>https://www.nowonbun.com/293.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はプログラム検証とテスト - unitテストに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムテストというのはプログラム設計と作成よりに凄く重要な作業です。普通に新人開発者やプログラムを始めに勉強するかたにはテストに大事な比重に思わずに工数計算や工程を設定します。少なくても私はその時期がありました。&lt;/p&gt;&lt;p&gt;テストというのはプログラムを商品だと思ったら、商品の品質と関連がある部分だし、サービスが開始する時にはサービスの信頼度に関する問題なので、テストというのは設計と実装よりもっと重要な作業だと思います。&lt;/p&gt;&lt;p&gt;組織により違いますが、実務ではプログラム工程で設計と実装よりテスト工程にもっと重要だと思うし、プロジェクト管理者の中でも品質管理者(テスト管理者)がプロジェクト内で権限が強いの場合もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;テストをすることでプログラムには基本的に人が設計するしコードを作成する作業なので、基本的にミスが必ず発生するという前提で始まります。&lt;/p&gt;&lt;p&gt;テストの段階は大幅で3段階になりますが、単体テスト(ut:　unit test)、結合テスト(it: integration test)、シナリオテストあるいはスタンダードテスト(st: standard test or system test)になります。&lt;/p&gt;&lt;p&gt;そしてテストの設定範囲は単体テスト(ut)はコードミスをチェックするし、結合テスト(it)は詳細設計のインターフェースなどをテスト、システムテストは基本設計及びユーズケースをテストします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2014&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の工程はウォーターフォール工程で設計から開発、そしてテストの機能構造です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムテスト設計と実行も人がすることなので、この過程でもミスが発生する可能性があります。つまり、最悪の結果が設計でミスして、コードも間違って実装、最後にテスト中でも確認ができないとバグが発生することです。&lt;/p&gt;&lt;p&gt;テストというのはプログラムの納品する前の最終確認と同じ意味なので、テストは最小2人以上が一つのチームになり、クロスチェック(cross check)することが重要です。&lt;/p&gt;&lt;p&gt;設計あるいは実装した人がテスト設計を作成します。そしてテストの実行、テスト結果確認に関しては別の人が実施します。私が設計、実装した人がテストまですると自分の論理と計算の影響で、バグを見つけることが難しいですね。&lt;/p&gt;&lt;p&gt;率直にこのようにテストしてもバグは発生しますが、上のルールでするとプログラムを作成する段階でバグを最小まで減らせることができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私もプロジェクトを運用する時に、ウォーターフォール工程を好きではありません。一応、時間がすごく掛かる欠点があるし、ドキュメントも多いので、大変です。&lt;/p&gt;&lt;p&gt;そのため、プログラム作成までアジャイル工程で早めに作業しますが、テストからはアジャイル工程で使う検証プログラムなどを好きではありません。検証プログラムならよく使うseleniumなどのプログラムです。&lt;/p&gt;&lt;p&gt;理由はプログラムを作成してプログラムを検証するプログラムを作成します。少なくてもjavaやpythonスクリプトでselenium作成します。それならその検証プログラムやスクリプトは誰が検証しますか？検証プログラムでもバグがある可能性がありますが。&lt;/p&gt;&lt;p&gt;検証プログラムを検証するプログラムをまた作成します。&lt;/p&gt;&lt;p&gt;大勢な方がアジャイル工程でプログラムを作成して検証プログラムでバグが発生する確率を減らして早い開発が可能と言いますが、検証プログラムは完璧かなという疑問がなります。検証プログラムも人が作成してスクリプトを作成することなので必ずミスがあり、バグが発生する可能性がありますが。。&lt;/p&gt;&lt;p&gt;もちろん、しないより良いですが、検証プログラムを使うとバグが発生する可能性を減らすという話は理解できません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その理由で私が検証プログラムツールを全然使わないことではありません。テストはウォーターフォール工程みたいにut、it,stを分けて作業しますが、utの場合はjavaのjunit,c#はmstestやnunitを利用してitの場合はpythonでseleniumを利用します。&lt;/p&gt;&lt;p&gt;でも、その工程をプログラムに全部任せることではなく、検証プログラム作成する人、実行する人(実行することを目で確認)を分けて作業します。stの場合は絶対に人がテストをします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのテストの工程で本投稿は単体テスト(unitテスト)に関して説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はウェブプロジェクトの経験が多いので、ウェブプロジェクトの経験の重要に説明します。&lt;/p&gt;&lt;p&gt;ウェブプロジェクトの言語はほぼjavaの場合はspring、c#の場合はmvcを使います。phpやnodejsなどのウェブサービスもありますが、比率がjavaとc#よりは少ないですね。&lt;/p&gt;&lt;p&gt;ここで単体テストで検証することはクラスと関数です。&lt;/p&gt;&lt;p&gt;私の場合はviewのhtmlは単体テストで検証することが少し大変です。なので結合テストでやりますね。やりたいならやっても良いですが、htmlタグやcss、スクリプトをすべて検証することにはテスト範囲が大きいです。最近、javascriptはtypescriptがあるのでスクリプトの場合は単体テストを実施しますね。&lt;/p&gt;&lt;p&gt;画面設計は普通は基本設計と詳細設計で作成したものなので、unitテストより結合テスト(it)とシステムテスト(st)にやることが工程として合ってると思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして単体テストでチェックしにくい部分はcontroller関数です。controllerは基本的にmodelクラスのインスタンスを生成してどのように呼ばれるかのクラスですが、特にフレームワークにより呼び出されるクラスです。このクラスにはウェブデータのrequest情報とsession,cookieの情報がありますが、単体テストでその情報をすべて構成してテストするには大変があります。そしてテストで必要なデータや条件が多くなるとミスが発生する可能性が高くなります。&lt;/p&gt;&lt;p&gt;そのため、単体テストで実施するテストは共通クラス(抽象クラス)、modelクラス、utilクラスとその関数のinput、outputです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿で関数を作成する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/286.html&quot; target=&quot;_blank&quot;&gt;[project design] プログラム制作(コーディング) - 関数作成方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうでしょう。私が説明した通りに関数を作成したら、必ずinput、outputに関する定義が明確ですね。なので、この関数に関して可能なinputデータと予想する結果データを考えてunitテストでinput、outputをチェックすることです。&lt;/p&gt;&lt;p&gt;ここの作業はunitテストのプログラムを私が作成してinputとoutputデータのデータセットは別の人が定義して実施するとバグの発生率を減らすことが良いでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスを作成する方法に関しても説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/288.html&quot; target=&quot;_blank&quot;&gt;[project design] プログラム制作(コーディング) - クラス作成方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここではreflection機能を利用してクラスのインスタンスが生成してインスタンス解除までデバッグ表を作成してデータの流れが仕様通りに変更されるかを確認することです。&lt;/p&gt;&lt;p&gt;もちろん、ここも作成はコード作成した人がするし、データセットやデバック表確認は別の人が実施しますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このようにunitテストプログラムを作成するとテスト設計書がなくてもプログラムでテストを確認することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;単体テストはどの工程で作業するかの説明です。&lt;/p&gt;&lt;p&gt;時間の余裕があれば、プログラム作成が終わった後で作成したら良いですが、実務はその程に余裕がないし、別のチーム作業が終わるまで待つことはできません。&lt;/p&gt;&lt;p&gt;私は単体テストのunitテストコードはプログラム作成する時に同時にします。それでソースをgitにコミットしてmasterのブランチにrequestするとマージする担当者がデータセットを準備して流します。もちろん、コードレビューもやりますね。&lt;/p&gt;&lt;p&gt;昔にsvnを使う時には上の作業のため、スクリプトを作成して検証して、複雑だったんですが、最近はjenkins + githubとteamcity + github、bitbucketなどのプログラムが多いので利用すると検証の工程をすごく減らすことができます。&lt;/p&gt;&lt;p&gt;また、別のチームや作業が終わって最終マージ(merge)する時も全体的にunitテストを実施します。結合テストのため、dev環境にアップデートする時(deploy)にも実施します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ただ、説明だけではすごく複雑な設定だし、テストしすぎではないかと思いますが、ciツールをちゃんと設定すると上の工程がすべて自動になります。&lt;/p&gt;&lt;p&gt;私がプログラム作成してunitテストクラスまで作成してcommitします。jenkinsでテストを行います。pr(pull request)をして要請します。ciツールでまた検証します。そのところでokになるとマージします。またciツールで検証します。&lt;/p&gt;&lt;p&gt;スクラムによりciツールがデプロイを実施しますが、その時にまた検証します。もちろん、検証中でエラーが発生すると担当者にエラーを発送します。&lt;/p&gt;&lt;p&gt;(参考にciツールで自動にテストする時にデータセットはすべて別の人が設定します。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;単体テストはこの流れで動くことではないかと思いますね。これが必ず正解なunitテストではなく、私の経験によりこの運用方法が効率的だったということです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでプログラム検証とテスト - unitテストに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Project design</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/293.html</guid><pubDate>Fri, 22 Oct 2021 19:34:09 +0900</pubDate></item><item><title>[C#] 57. コーティング規約</title><link>https://www.nowonbun.com/292.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のコーティング規約に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、コーティング規約に関して簡単に説明すると、コーティング規約は我々がプログラムを作成する時に守らなければならないルールと言います。プログラムの性能と効率性とは関係がないし、複数の人とプログラムを作成する時にソースを見やすくするために決めたルールです。&lt;/p&gt;&lt;p&gt;簡単に例で話すと、関数命名法をみると「動詞 + 名詞」の型で普通は「getdata」名で作成します。でも「dataget」という関数名を作成してもプログラムが動かないということではありません。いや、「abcdefghijklm」という関数名にしてもプログラムが動くことでは何も問題がありません。&lt;/p&gt;&lt;p&gt;でも「getdata」という関数名を作成すると関数のソースを見なくてもこの関数は「どのデータを取得する関数だ」だと予想することができますが、変な関数名で作成すると関数名だけでどの動作するかを分かりません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでmsにはc#をコーディングする時に、関数命名法、ソース内でスペース規則などのルールを設定して使うことでお勧めしています。これをコーディング規約と言います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/inside-a-program/coding-conventions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;msのコーティング標準&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;命名ルール&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;正規化されたクラスの名前に一行目に長く表示されないようにしましょう。つまり、含めているすべてのnamespaceを設定する必要がありません。&amp;lt; p=&quot;&quot;&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;レイアウトルール&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;良いレイアウトルールは、コードの構文を強調して読みやすく作成することです。&lt;/p&gt;&lt;p&gt;1. 基本コード編集ツールの設定 (4文字インデント、スペースで保存されたタブ)を使いましょう。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ショットキーはctrl + k + dです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2013&quot; style=&quot;width: 725px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;link - &lt;a href=&quot;https://docs.microsoft.com/en-us/visualstudio/ide/reference/options-text-editor-csharp-formatting?view=vs-2019&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/en-us/visualstudio/ide/reference/options-text-editor-csharp-formatting?view=vs-2019&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;2. 一行目には一つのステップだけ作成しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;3. 連続的にチェインパターンの関数宣言する時、自動にインデントができないなら、タブ間隔をインデントしましょう。(4スペース)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt; 特にlinq式の場合は.where .selectの連続された処理式が可能ですが、ラインを変わる時には必ずインデントをして区分を決めましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;4. メソッドの定義とプロパティの正義の間には少なくても一つの空白を追加しましょう。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt; これが何の話かをすごく悩みました。&lt;/p&gt;&lt;p&gt;たぶん、メソッドの名とパラメータ間に空白を入れてくださいという意味みたいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;5. 括弧を使って表現式で節を明確にしましょう。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt; ifやforの場合に格好なしでコーディング(一行目コーディング)が可能ですが、お勧めではありません。できれば括弧を入れて確実に区分する方が良いでしょう。&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;コメントルール&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;1. コードの行の末尾にコメントを入れずに、別の行にコメントを作成しましょう。&lt;/p&gt;&lt;p&gt;2. 大文字でコメントテキストを開始します。(英語だけの事項です。)&lt;/p&gt;&lt;p&gt;3. ピリオドがある説明テキストを終了します。(英語だけの事項です。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;4. コメント区分記号(//)とコメントテキスト間に一つの空白を入れましょう。&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;言語ルール&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;1. 文字列データタイプ&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;1-1. 出来ればstring interpolation(補間式)を使いましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/208.html&quot; target=&quot;_blank&quot;&gt;[c#] stringの補間式(interpolation)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;1-2. 多い変数のstringオブジェクトを合併する場合にはstringbuilderを使いましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;2. 暗視的な変数型のタイプ&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;2-1. 変数タイプが正確にあるか別の区分が必要ない場合はvarタイプを使いましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/28.html&quot; target=&quot;_blank&quot;&gt;[c#] 27. varキーワードとdynamicキーワード&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;2-2. タイプが明確ではない場合、dynamicタイプとobjectタイプの場合はvarを使いません。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;2-3. 変数名には変数の型(データタイプ)を暗視する命名はしません。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;2-4. forとforeachでは必ずvarタイプを使いましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;3. unsigned data type&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;一般的にunsigned typeは使いません。例にintタイプで十分に可能な値をunsigned intを使う必要はありません。&lt;/p&gt;&lt;p&gt;4. 配列&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;最大に簡潔に作成しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;5. デリゲート&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;最大に簡潔に作成するし、クラスに依存しないように作成します。(クラスの依存関係は仕様により差異がある。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;6. 例外処理&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;6.1 例外処理はtry~catchを使いましょう。(別の例外処理もあるの???)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;6.2 disposeメソッドの呼び出しコードはusingを使いましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;7. &amp;amp;&amp;amp;と||演算子&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;性能と可読性のためにできれば&amp;amp;と|代わりに&amp;amp;&amp;amp;と||を使いましょう。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;(|と||は使い方が違うではない？bit演算の場合は|が合ってるが、多分true、falseを区分するためにできれば||を使いましょうと意味みたい。いや、使い方が全然違うじゃない。。。。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;8. イベント&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;後で取り除く必要がないevent handlerの場合はラムダ式をお勧めします。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;(確かにラムダ式が便利ですが、ラムダ式だけ作成すると可読性が悪くなりますが。。。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;9. 静的メンバー&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;必ずクラス名を付けましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;10. linq式&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;10-1. 変数名を結果値(リターン値)の予測値で命名しましょう。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;10-2. select結果に匿名クラスを使う場合、属性の始めの文字ど大文字にしましょう。(プロパティ命名法)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;10-3. 結果の変数の値があいまいな場合に明確にしましょう。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;10-4. 結果の変数タイプはvarを使いましょう。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;10-5. インデントはfromに合わせましょう。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt; linq式の方法は上の説明した内容を繰り返してするらしいです。その程に重要って意味ですね。&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;その以外のコードルール&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;以前に私がコードルールを勉強した時とは今のコードルールは全然違いますね。私が覚えているコードルールを追加します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;1. クラスのメンバー変数は必ずprivateで作成しましょう。&lt;/p&gt;&lt;p&gt;2. メンバー変数の始めの文字は小文字で名詞だけ構成します。&lt;/p&gt;&lt;p&gt;3. プロパティの始め文字は大文字です。&lt;/p&gt;&lt;p&gt;4. 関数は「動詞 + 名詞」の型で始め文字と節区分は必ず大文字です。例、getdata, createbuildexcelsheet...&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;参考でjavaの場合は「動詞 + 名詞」の型は同じですが、始め文字は小文字、節区分は大文字です。別のルールなので参考してください。 例) getdata, createbuildexcelsheet..&lt;/p&gt;&lt;p&gt;6. 括弧の前は必ず改行です。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;参考にjavaの場合は括弧の前に開業を入れないルールです。&lt;/p&gt;&lt;p&gt;7. クラスはできればデコレーションパターンで作成しましょう。(interfaceから抽象クラスを継承して、クラスを継承します。)&lt;/p&gt;&lt;p&gt;8. クラス名とファイル名は一致して作成します。&lt;/p&gt;&lt;p&gt;9. ネームスペース名とフォルダ名は一致して作成します。&lt;/p&gt;&lt;p&gt;10. goto文は使いません。&lt;/p&gt;&lt;p&gt;11. if - else文よりif break, continueあるいはif return文を使いましょう。&lt;/p&gt;&lt;p&gt;12. できれば一行目で一つの処理だけ作成しましょう。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;その以外の命名ルールの場合は私が学生時代にコード標準を勉強する時の内容ですが、なぜか今はありません。なぜ無くなったかは分かりませんが、その以外の部分も実務で使っているルールなので知っているなら良いでしょう。&lt;/p&gt;&lt;p&gt;上のc#のコード規約はプログラムのパフォーマンスには影響が全然ありません。ある場合もありますが、普通は可読性を挙がるために存在するルールです。&lt;/p&gt;&lt;p&gt;そして実務ではプロジェクトを一人で進めることより、複数の人で作成する場合が多いので、お互いに不必要なコードの戦いやソース格納所(git)にも不必要なステップができないようにしましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もちろん、大きいプロジェクトや様々な会社が付けて作成する場合は別のコードルールがある場合がありますが、基本コードルールからもっと厳しくする場合が多いです。&lt;/p&gt;&lt;p&gt;または、社内seや学校で作成するプロジェクトや個別のプロジェクトの場合はこのコードルールを無視して作成する場合が多いです。&lt;/p&gt;&lt;p&gt;それが間違いことではありませんが、ルールを合わせなければ、その程オープンapiを使うことで制約させる可能性もありし、作成したライブラリを配布することも何か恥ずかしいですね。その後、可読性がすごく悪くなるのでコードレビューなどで誤解や問題が発生する可能性もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このコードルールは些細で無視しやすい部分ですが、プロジェクトの重要度によりすごく重要な問題がなる可能性もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のコーティング規約に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/292.html</guid><pubDate>Thu, 21 Oct 2021 19:04:52 +0900</pubDate></item><item><title>[C#] 56. 値の初期化及び基本データ値(default)を設定する方法、そして原始データのnull処理、?と??の使い方</title><link>https://www.nowonbun.com/291.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#の値の初期化及び基本データ値(default)を設定する方法、そして原始データのnull処理、?と??の使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がプログラムを作成すると変数の初期値を設定する場合があります。&lt;/p&gt;&lt;p&gt;例えばintタイプのメンバー変数を作成すると初期データを-1にするか? 0にするかの悩みがある場合があります。もちろん、-1に設定するか、0に設定するかに関しては仕様により設定しなければならないですが、int a = 0;式の設定よりもっとプログラムらしいな設定がないかな?&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2006&quot; data-filename=&quot;001.png&quot; style=&quot;width: 161px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればintタイプのdataメンバー変数にdefaultキーワードを使ってintの初期値を設定しました。コンソールに出力すると0の値が出力されますね。&lt;/p&gt;&lt;p&gt;つまり、defaultは該当なデータタイプの初期データの値をリターンするキーワードです。&lt;/p&gt;&lt;p&gt;原始データの場合は初期intの場合0を、floatの場合は0.0を設定します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならここでメンバー変数の値にdefault(int)を外して出力するとどの値がリターンされるかな?&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2006&quot; data-filename=&quot;001.png&quot; style=&quot;width: 161px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;同じの0の値があります。そうれならdefaultを設定する必要がないかな？正解は設定する必要がありません。&lt;/p&gt;&lt;p&gt;基本的にメンバー変数は基本初期値が設定されます。つまり、default(int)を作成しなくてもdefault(int)値で設定することです。でも、仕様によりintの値にnullを許して設定したい場合があります。&lt;/p&gt;&lt;p&gt;つまり、基本値が0ではなくnullをします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2012&quot; style=&quot;width: 185px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データタイプに?を入れたら原始データにnullを許します。そしてdefault(int?)はnullです。つまり、、基本初期値がnullになります。&lt;/p&gt;&lt;p&gt;原始データではないクラスの場合はどうでしょう？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2012&quot; style=&quot;width: 185px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;classは基本的にnullを許すため、?を入れなくてもdefault(string)はnullの値です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすると原始データとclassの差異が何があるので、この差異があるかな?基本的にc#には原始データを構造体(struct)で認識しています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2008&quot; data-filename=&quot;003.png&quot; style=&quot;width: 759px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、構造体はnullを許せません。&lt;/p&gt;&lt;p&gt;私がstructで構造体を生成すると使い方は基本的にclassと似てますがnullを許せません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2010&quot; data-filename=&quot;004.png&quot; style=&quot;width: 561px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;構造体でnullを許すためには?を使わなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでまた知りたいことがメンバー変数はdefaultを使わなくてもクラスの場合はnullになるし構造体(struct)は基本値が設定することが分かりますが、defaultというキーワードは意味がないじゃないかと思います。&lt;/p&gt;&lt;p&gt;でも、ジェネリック(generic)にはクラス内部でデータタイプが決めてないですね。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/33.html&quot; target=&quot;_blank&quot;&gt;[c#] 32. ジェネリックタイプ(generic type)を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ジェネリックというのはクラス内部でデータタイプを設定することではなく、インスタンスを生成する時に設定することで説明しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2011&quot; style=&quot;width: 158px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、ジェネリックではクラスに設定されるか構造体に設定されるかをインスタンスを生成するところで設定するので、内部のジェネリックタイプ(generic)の値はdefaultで値を設定しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の構造体をクラスみたいにnullを許すためにはデータタイプに?を付ければできると説明しました。&lt;/p&gt;&lt;p&gt;追加的の?の使い方がありますが、三元演算子のnullチェックです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2009&quot; data-filename=&quot;006.png&quot; style=&quot;width: 604px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;同然に上みたいに作成すると100%エラーが発生します。なぜなら、nodeの変数はnullですが、インスタンスの関数を実行しようと呼び出しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/12.html&quot; target=&quot;_blank&quot;&gt;[c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので普通はif(node != null) { }のnullをチェックする分岐式を実装します。&lt;/p&gt;&lt;p&gt;でも、?を使ったら上のif(node != null) { }の意味の分岐式が含めることになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2004&quot; data-filename=&quot;007.png&quot; style=&quot;width: 147px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果はnode?.trim()をすると空白がないstringではなく、続けてnullがリターンします。console.writeline関数はnull値が入ると空白がない改行が出力されます。&lt;/p&gt;&lt;p&gt;?の意味はnullではなければ実行するという意味は分かりますが、nullなら別の処理をしたいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2007&quot; data-filename=&quot;008.png&quot; style=&quot;width: 155px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上でnode?.trim()の結果はnodeがnullなので、nullになります。??はnode?.trim()がnullなので、別の値で置換します。つまり、nodeに値があれば値を出力、なければ別の置換される値が出力されることです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2005&quot; data-filename=&quot;009.png&quot; style=&quot;width: 179px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#の値の初期化及び基本データ値(default)を設定する方法、そして原始データのnull処理、?と??の使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/291.html</guid><pubDate>Thu, 21 Oct 2021 18:55:58 +0900</pubDate></item><item><title>[C#] 55.namespaceとusing、そしてpartialの使い方</title><link>https://www.nowonbun.com/290.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でのnamespaceとusing、そしてpartialの使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;c#では最小単位のオブジェクト(object)をクラスだと説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/11.html&quot; target=&quot;_blank&quot;&gt;[c#] 10. クラスを作成する方法(コンストラクタ、デストラクタ)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々が実行関数(main)を使ってもその関数は必ずクラスの中で含めなければならないです。つまり、関数だけには使えません。&lt;/p&gt;&lt;p&gt;それで我々がプログラムを扱ったら様々なライブラリを連結して色々ソースを作成することになります。その場合、クラス名がすべて別々に作成することが可能かな？参考にクラスはオーバーライド(override:同じ名で別の処理)ができないです。&lt;/p&gt;&lt;p&gt;同じ名のクラスを作成すると必ずエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2002&quot; data-filename=&quot;001.png&quot; style=&quot;width: 481px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすると我々がプログラムを作成する時にはそれを気を付けて作成すると思っても、オープンライブラリを連結して使う時にそのライブラリ中であるクラス名が絶対に重複されないか？可能性が十分にあります。&lt;/p&gt;&lt;p&gt;それなら我々がライブラリを連結して使わなければならないなのにクラスが重複になって実行されません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それを避けるためにnamespaceがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2001&quot; data-filename=&quot;002.png&quot; style=&quot;width: 204px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;namespaceを二つに分けてclassを生成すれば同じclass名でも生成が可能です。正解にはtest1.node名とtest2.node名のクラスなので別のクラス名です。&lt;/p&gt;&lt;p&gt;このように別のnamespaceをユニークに指定しておいたら別のライブラリとクラス名が衝突する可能性がありません。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;using&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;でも、namespaceは重複宣言が可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2003&quot; data-filename=&quot;003.png&quot; style=&quot;width: 217px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例ではnamespaceをa、b、cで作成しましたが、この命名が長くなると、インスタンスを生成する時にクラス名が長くなります。&lt;/p&gt;&lt;p&gt;それを短くするためにusingキーワードを使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2003&quot; data-filename=&quot;003.png&quot; style=&quot;width: 217px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;usingを使ってnamespaceを指定するとusingを書いたコードライン以降はa.b.cを書いてなくてもa.b.cのクラスを使えます。&lt;/p&gt;&lt;p&gt;上の例では私が説明しやすくするために一つのページで説明しましたが、普通はクラス別でファイル(.cs)を作成するしnamespace別でフォルダを作成するため、usingをソースの最初のラインに作成します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうなら最初の例みたいに同じクラスはどのように処理するかな？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2001&quot; data-filename=&quot;002.png&quot; style=&quot;width: 204px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この場合はnodeのクラス区分ができないので、usingを使ってもクラスの前でnamespace名を含めて作成しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてクラスがstaticになっている場合はクラスの中のクラスもすべてstaticになっている場合もあります。&lt;/p&gt;&lt;p&gt;それをユーティリティ関数クラスと言います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2003&quot; data-filename=&quot;003.png&quot; style=&quot;width: 217px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;namespaceとクラス名まで省略することができます。&lt;/p&gt;&lt;p&gt;print関数の下で我々がずっと使ったconsole.writelineもconsoleのクラス名を省略しました。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;partial&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;元々は命名法によりnamespaceはフォルダ名、classはファイル名と一致しなければならない規約があります。&lt;/p&gt;&lt;p&gt;なので一つのファイルですべてのソース内容を作成しません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、一つのファイルで一つのクラスを作成すると思っても仕様によりクラスのサイズがすごく大きくなる場合もあります。クラスの一つのソースライン数が何万行になる可能性もあります。&lt;/p&gt;&lt;p&gt;その場合、ソースが長くなるので可読性がすごく悪くなるため、ファイルを分割してクラスを作成したい時もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2003&quot; data-filename=&quot;003.png&quot; style=&quot;width: 217px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;partialキーワードを使ったら二つのファイルで一つのクラスを分割して作成することが可能です。ここの注意点はpartialがないクラスでpartialを使ってクラスを拡張する概念ではありません。&lt;/p&gt;&lt;p&gt;言い直してstringクラスにpartial class stringを使ってもクラス拡張になることではなく、エラーになります。実はクラスがかってに拡張されたらngですね。逆に言えばpartialキーワードを使ったら何処でも拡張ができる概念です。&lt;/p&gt;&lt;p&gt;つまり、ライブラリ配布用(dll)を開発する時には注意しなければならないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でのnamespaceとusing、そしてpartialの使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/290.html</guid><pubDate>Thu, 21 Oct 2021 18:52:48 +0900</pubDate></item><item><title>[C#] 54. Reflection機能を使い方 - Attribute</title><link>https://www.nowonbun.com/289.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でreflection機能を使い方 - attributeに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿までreflection機能を説明しましたが、簡単に要約するとソースにクラスの割り当てやクラス呼び出すことの静的な方法をデータなどにより動的なクラスを割り当てするか関数を呼び出しする方法です。&lt;/p&gt;&lt;p&gt;実はc#にdynamicタイプがあるし、様々なパターンによりフレームワークを作成するかコアークラスを作成することではなければ別に使うことはありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、reflection機能中でattributeによりクラス区分やメソッド呼び出す方法はすごくよく使います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/32.html&quot; target=&quot;_blank&quot;&gt;[c#] 31. アトリビュート(attribute)を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#のアトリビュート(attribute)はメタデータとしての役割だけですが、reflectionの機能と一緒に使うと単純なメタデータの機能だけではなく、プログラムを制御する機能に使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1998&quot; data-filename=&quot;001.png&quot; style=&quot;width: 173px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は簡単にnode1クラスとnode2クラスのアトリビュートを取得する例です。他のreflectionの機能と別に差異がなさそうです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2000&quot; data-filename=&quot;002.png&quot; style=&quot;width: 197px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実際にはアトリビュートのタイプで関数の実行可否や順番を設定するところでよく使います。&lt;/p&gt;&lt;p&gt;例えば、ウェブプロジェクトでアトリビュートを設定すれば、接続するユーザの権限により関数を実行するかどうかの検査やデータにより実行順番を設定することなどを設定することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1999&quot; data-filename=&quot;003.png&quot; style=&quot;width: 192px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はnodeクラスでexecuteorderのアトリビュートが設定されている関数を取得して実行順番が設定されている順番とおりに関数を実行します。&lt;/p&gt;&lt;p&gt;私が任意でアトリビュートにintタイプの値を入れて順番を設定しましたが、データベースやユーザから入力された値により順番を決定することになるとそれがinterpreterパターンになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アトリビュートは上の例みたいにreflectionの動的実行のために使う場合がたくさんあります。実は単純にメタデータのためならただコメントを使う方がよいでしょう。&lt;/p&gt;&lt;p&gt;reflectionとアトリビュートをよく使えば、様々なデザインパターンのアルゴリズムを作成することができるし、このようにフレームワークを作成することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でreflection機能を使い方 - attributeに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/289.html</guid><pubDate>Wed, 20 Oct 2021 19:29:46 +0900</pubDate></item><item><title>[Project design] プログラム制作(コーディング) - クラス作成方法</title><link>https://www.nowonbun.com/288.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はプログラム制作(コーディング) - クラス作成方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でコーディングする時に関数を作成する方法に関して説明しました。作成方法に関しては規約が決めていることや必ずこのように作成しなければならないということではありません。&lt;/p&gt;&lt;p&gt;ただ、私の経験により、このように作成するとプロジェクト管理することで便利だし、もっと直観的なコーディングすることではないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスを作成する方法に関しても自分の規則があります。&lt;/p&gt;&lt;p&gt;ウェブプロジェクトの基準で作成したものなので、c/sやアプリ開発する場合は差異があると思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;オブジェクト指向プログラミング(oop)の4つの特性で抽象化、カプセル化、継承化、多相化(ポリモーフィズム)があります。私の場合はこの4つの特性が何かを深刻に考えたことがあります。&lt;/p&gt;&lt;p&gt;実は我々がプログラム作成する時、4つの特性を無視して開発してもプログラムを作成することで問題がありません。抽象化しなくてもプログラムを作成できないことではないし、カプセル化、つまり、メンバー変数はpublicに設定してクラス外部にも参照することにしてもプログラムがエラーになることでもありません。&lt;/p&gt;&lt;p&gt;もちろん、継承化と多相化(ポリモーフィズム)に関しても同じです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この4つの特性がなにかというとプログラムを作成する時に、もっと可読性をよくなるし、我々がドキュメントを作成しなくても、プログラムのコードを設計図みたいに作成するコーディング技法だと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例えば、我々が人の名前と生年月日を入れると年齢を計算するプログラムを作成すると思いましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1997&quot; style=&quot;width: 270px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースをみれば私がpeopleというクラスを作成しました。コンストラクタで名前と生年だけいれて年齢は計算します。ここで年齢の変数がpublicならどうでしょう？calcoldという関数が意味がなくなります。&lt;/p&gt;&lt;p&gt;つまり、クラスのメンバー変数がクラス外部で修正ができるので無欠性を保証することができません。なのでメンバー変数を読み取り専用に設定するために、関数を通って制御します。それがカプセル化です。&lt;/p&gt;&lt;p&gt;ここで出力をtostringで再定義しましたので、ただpをconsole.writeline関数に入れると自動にtostringを出力することになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このようにクラスの特性を活用してプログラムを作成すればクラスを割りあって使うところではfacadeパターンにより、設計書がなくてもプログラムを作成がしやすいし、可読性もよくなります。&lt;/p&gt;&lt;p&gt;この言語によりクラスの特性は別の投稿で詳細に説明したことがあるから参考してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/54.html&quot; target=&quot;_blank&quot;&gt;[java] 14. オブジェクト指向プログラミング(oop)の4つ特性(カプセル化、抽象化、継承、多相化)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/21.html&quot; target=&quot;_blank&quot;&gt;[c#] 20. オブジェクト指向プログラミング(oop)の4つの原則(カプセル化、抽象化、継承化、多相化(ポリモーフィズム))&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスを作成する方法はoopの特性を従って作ったらいいですが、構成がどうしようかを説明します。&lt;/p&gt;&lt;p&gt;我々がウェブプログラムを作成する時に、データを送受信する部分は一般的にclient(ブラウザ)からserver(was)に送受信する部分とserver(was)からデータベースから送受信する部分があります。&lt;/p&gt;&lt;p&gt;もちろん、仕様により他のウェブサーバや応用プログラミングとソケット通信やhttp通信してデータを送受信する場合もありますが、ここではclient - serverとserver - dbだけ確認しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この流れはclientからserver、そしてdbからデータを取得してserverからclientに返却することが一般的です。そして一つのクラスで要請情報を入れてclientからserverにデータを要請をします。serverからはdbにクエリクラスを生成してデータを取得します。&lt;/p&gt;&lt;p&gt;ここでclientからserverに要請したクラスを変換なしでそのままでデータベースの検索パラメータクラスを作成していまうとセキュリティの問題がある可能性があります。なので、この要請クラスは分離する方がよいでしょう。&lt;/p&gt;&lt;p&gt;また、ウェブページのformデータがデータベースのデータと必ず一致することではないので、分離して管理する方が良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、私はクラスの構成をclient-server間のデータクラスをbeanクラスと言うし、server-db間のデータクラスをmodelクラスと言うことで表現します。&lt;/p&gt;&lt;p&gt;つまり、プロジェクトのクラス構造はbeanクラスのパッケージ、modelクラスのパッケージに分けてclientからserverに要請が来るとbeanクラスで受け取ってserverにはmodelクラスに変換、データベースに検索してmodelクラスをbeanクラスに変換して応答する構成で作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1996&quot; data-filename=&quot;002.png&quot; style=&quot;width: 249px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は理解しやすいためにコンソールプログラムで作成しました。&lt;/p&gt;&lt;p&gt;まず、getタイプでquerystringやpostタイプのpostdataでjsonタイプでデータを受け取ったと思いましょう。&lt;/p&gt;&lt;p&gt;jsonのstringタイプではデータとして扱うことが大変なのでbeanクラスタイプに変換しましょう。また、データベースからクエリの検索条件およびデータを受け取るためにmodelクラスに変換します。&lt;/p&gt;&lt;p&gt;上のソースはブラウザから生年を受け取りますが、検索条件には年齢に変換して検索します。つまり、生年から年齢に変換することが必要ですね。&lt;/p&gt;&lt;p&gt;また、データベースからデータをmodelクラスで受け取ってまたbeanクラスに変換して画面に表示します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;beanとmodelのクラスを合わせて使っても良いですが、場合によりinjectバグが発生する可能性があり、セキュリティの脆弱性が発生する問題があります。なので、beanとmodelを分離して使いましょう。&lt;/p&gt;&lt;p&gt;でも、このままに使うと思えばクラスがとんでもなく多くなります。なので、ここからは抽象化して変数は一緒に使いますが、役割によりbeanとmodelクラスになるように作成したらよいでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;個人的にこのようにプログラムを構成すると作成のご苦労があると思いますが、ソース構造により可読性がすごくよくなります。main関数(controller)とfacadeパターン、strategyパターンで構成もしやすくなるし、ソースを設計図みたいになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでプログラム制作(コーディング) - クラス作成方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Project design</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/288.html</guid><pubDate>Wed, 20 Oct 2021 19:28:17 +0900</pubDate></item><item><title>[C#] 53. Reflection機能を使い方 - Propertyとevent</title><link>https://www.nowonbun.com/287.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でreflection機能を使い方 - propertyとeventに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿までc#のreflectionのclassとmethod、variable(変数)に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/277.html&quot; target=&quot;_blank&quot;&gt;[c#] 50. reflection機能を使い方 - class&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/278.html&quot; target=&quot;_blank&quot;&gt;[c#] 51. reflection機能を使い方 - method&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/280.html&quot; target=&quot;_blank&quot;&gt;[c#] 52. reflection機能を使い方 - variable&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionはクラスの構成要素に関して動的にデータを取得及び呼び出す方法です。&lt;/p&gt;&lt;p&gt;javaにはclassの構成要素が関数とメンバー変数しかないですが、c#の場合はプロパティやイベントなどの特殊機能(?)をもっている関数があります。&lt;/p&gt;&lt;p&gt;プロパティは関数機能と変数の機能を合わせた要素だし、イベントは関数を複数で重畳して呼び出す機能です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/22.html&quot; target=&quot;_blank&quot;&gt;[c#] 21. c#のプロパティ(property)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/26.html&quot; target=&quot;_blank&quot;&gt;[c#] 25. イベント(event)キーワードを使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、プロパティのreflectionは関数のreflectionと似ています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1995&quot; data-filename=&quot;001.png&quot; style=&quot;width: 187px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はnodeクラスのdataプロパティのset関数とget関数を呼び出すreflectionです。&lt;/p&gt;&lt;p&gt;プロパティがoopの規約のためにget、set関数なので、関数のreflectionと差異がありません。プロパティもprivateを設定することができるし、staticで設定することができますが、普通はpublicで設定します。でも、publicではなくても関数のreflectionみたいにbindingflags.public | bindingflags.nonpublic | bindingflags.staticのオプションで取得することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;eventの場合は関数を重畳して一括で呼び出す方法です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1994&quot; style=&quot;width: 170px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例ではgetevent関数を通ってnodeクラスのeventを取得します。&lt;/p&gt;&lt;p&gt;イベントにはdelegateタイプでイベントを追加しますが、delegate.createdelegateを通って関数をデリゲート(関数ポインター)タイプに変換しなければならないです。&lt;/p&gt;&lt;p&gt;そしてevent reflectionを通ってイベントを追加します。私の場合は3回に追加しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はイベントはクラス内部で実行しなければならないです。でも、そうなるとreflection機能ではないでしょう。外部でeventを呼び出すためには実行fieldデータを取得しなければならないです。この部分が面白いことはここではeventをメンバー変数タイプで作成しましたが、メンバー変数で認識します。&lt;/p&gt;&lt;p&gt;eventのアクセス修飾子がpublicですが、privateで認識します。その方法でfieldを取得してeventhandlerのデリーケートタイプで強制キャストしたら関数みたいに呼び出すができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でreflection機能を使い方 - propertyとeventに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/287.html</guid><pubDate>Tue, 19 Oct 2021 21:02:58 +0900</pubDate></item><item><title>[Project design] プログラム制作(コーディング) - 関数作成方法</title><link>https://www.nowonbun.com/286.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はプログラム制作(コーディング) - 関数作成方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実務のプログラムコーディングは工程に話すと普通は生産や作成という表現を使います。ただ、それは言葉の表現で、実際は我々が知っているプログラムコーディング(実装)になります。&lt;/p&gt;&lt;p&gt;実務あるいは工程を設定してプログラムを作成してもプログラムコーディングする方法は普通に開発することと大幅で変わることではありません。前に設計図が作成して置いたらそのままに作成することだけです。&lt;/p&gt;&lt;p&gt;ここでは各のスタイルがあるし、作成方法があるので別に規約を決める必要はありませんが、自分の経験に関して工程の中でプログラムを作成方法を説明しようと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一般的にウォーターフォール工程でプロジェクトを運用したら基本設計と詳細設計の段階でもうプログラム作成に関する設計が作成されたのでそのままに作成すると良いです。別に追加する内容はありません。&lt;/p&gt;&lt;p&gt;私が説明しようと思うのは今まで説明したアジャイル工程と混ぜている工程(設計はアジャイル、テストはウォーターフォール工程)で私のスタイル作成方法があります。&lt;/p&gt;&lt;p&gt;まず、アジャイル工程でプログラム設計書を作成する場合もありますが、普通はjiraやredmineなどのツールを利用してスクラムサイクルを設定してアイテム(ticket)別で作成します。&lt;/p&gt;&lt;p&gt;そのため、詳細設計の段階で抽象クラス、インターフェースを作成します。そのように思ってもプログラムを作成する時になると、予想できなかった共通部品と抽象化が必要なクラスや関数がありますね。&lt;/p&gt;&lt;p&gt;その場合に我々が共通部品を作成する方法に関して説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この共通部品を作成する時、私はフィボナッチ数列のアルゴリズムを考えています。普通はフィボナッチ数列アルゴリズムは再帰関数で作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1991&quot; data-filename=&quot;001.png&quot; style=&quot;width: 272px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実は再帰関数を使うのはプログラムの性能上で悪いです。for文で作成することができるものを再帰関数を作成する必要はありません。&lt;/p&gt;&lt;p&gt;でも、関数を理解するために再帰関数みたいに良い例がありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々が関数を作成することを私の新人の時によくミスした部分ですが、ソースが長いので可読性を上がるために、見やすくために作成したときがあります。&lt;/p&gt;&lt;p&gt;つまり、ソースを上から下まで読み込む部分で一つの関数ですべてのソースを作成することが悪いと思い、関数でソースを分割する役割だと思う時があります。&lt;/p&gt;&lt;p&gt;そのことで関数を考えたら、上のフィボナッチ数列の再帰関数は理解しにくいです。&lt;/p&gt;&lt;p&gt;fibonachi関数で10の値を渡したら、fibonachi(9) + fibonachi(8)を計算して　fibonachi(8) + fibonachi(7) + fibonachi(7) + fibonachi(6)の計算になり、その流れで計算することになると頭が複雑になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々が中学、高校時代に数学時間に学んだ関数方程式があります。f(x)=2x + 1みたいです。&lt;/p&gt;&lt;p&gt;その時、我々がf(1)+f(2)=3+5=8ということを分かっています。このように関数の順番を思わず、パラメータのinputとoutputの結果だけ考えることです。&lt;/p&gt;&lt;p&gt;つまり、fibonachi(1)とfibonachi(2)は1です。fibonachi(3)はfibonachi(2)+fibonachi(1)になり1+1の2になります。fibonachi(4)はfibonachi(3)+fibonachi(2)は3の値になり、fibonachi(5)はfibonachi(4)+fibonachi(3)は5になります。&lt;/p&gt;&lt;p&gt;そのように思ったら再帰関数は目に入って理解しやすいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならフィボナッチ数列の例は簡単なので、少し複雑なハノイアルゴリズムで例を作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1992&quot; data-filename=&quot;002.png&quot; style=&quot;width: 242px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ハノイも再帰関数で表現しますがただデバッグ順番でコンソール出力を考えると計算が難しいです。コンソール出力する前に関数を再帰に呼び出しするし、コンソール出力後も再帰に呼び出しします。&lt;/p&gt;&lt;p&gt;でも、我々はinputとoutputだけ考えましょう。&lt;/p&gt;&lt;p&gt;単純に hanoi(1)はa-&amp;gt;cに移動します。&lt;/p&gt;&lt;p&gt;hanoi(2)は先にhanoi(1)ですが、a-&amp;gt;bです。そして大きい円盤をa-&amp;gt;cに移動します。最後にb-&amp;gt;cに移動します。&lt;/p&gt;&lt;p&gt;言い直して、一番大きい円盤がa-&amp;gt;cに移動します。一番大きい円盤の上にあるものを一応バッファーに移動(a-&amp;gt;b)するし、大きい円盤移動したらバッファーから大きい円盤に移動(b-&amp;gt;c)します。&lt;/p&gt;&lt;p&gt;hanoi(3)はhanoi(2)がbに移動します。つまり、hanoi(2)が実行します。aからｂ、バッファーはcですね。その後でhanoi(2)が終わると、一番大きい円盤がaからcに移動します。&lt;/p&gt;&lt;p&gt;次は、hnnoi(2)がbからcに移動します。つまり、bからｃ、バッファーはaになります。&lt;/p&gt;&lt;p&gt;そのように関数を思えばすごく簡単になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、我々がコーディングする時に、単純に関数の中でコードが長くなることを考えて分割することではなく、上みたいに関数化することを考えて共通関数に作ることです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1993&quot; data-filename=&quot;003.png&quot; style=&quot;width: 400px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実務でよく作成するfacadeパターンで作成してみました。main関数ですべてのロジックを入れることではなく、行為別で関数を結んでmain関数には設計図みたいに実行行為と結果だけ確認します。&lt;/p&gt;&lt;p&gt;つまり、extraction関数には関数の内容に関して考えせずに、extraction(値)ならoutputで何の値がリターンするかを考えてプログラムを作成することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;単純に一部だけですが、そのことに全体をみればmain関数は設計図みたいにどのように作動するかをソースだけで設計がみえます。つまり、設計図が無しで、プログラムのソースだけで設計図みたいに作成することができます。&lt;/p&gt;&lt;p&gt;また、関数の再使用性もすごくよくなるし、詳細設計がなくてもプログラムコーディングだけで設計図に作成する効果もあります。&lt;/p&gt;&lt;p&gt;個人的な考えですが、デザインパターンをよく理解すると詳細設計を省略しても構いないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでプログラム制作(コーディング) - 関数作成方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Project design</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/286.html</guid><pubDate>Tue, 19 Oct 2021 21:01:32 +0900</pubDate></item><item><title>[CentOs] ジェンキンス(Jenkins)をインストールする方法</title><link>https://www.nowonbun.com/285.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はcentosでジェンキンス(jenkins)をインストールする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ジェンキンス(jenkins)とはソフトウェアを開発する時に統合サービスをするツール、つまり、ci(continuous integration)と言います。&lt;/p&gt;&lt;p&gt;統合サービスというツールは我々がプロジェクトを開発する時、一人ではなく、多数の人と開発する時に一つのブランチで統合してアップデートするツールと言います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、ソースを統合するツールとして最近よく使うgitがあり、svnなどがあります。これはソースを統合するツールなのでciツールとは差異があります。&lt;/p&gt;&lt;p&gt;各のローカルpcで開発して我々がgitを通ってコミット及びpull requestをします。でも、これは各の環境で開発したものなので、すべての環境で統合されたということではありません。&lt;/p&gt;&lt;p&gt;つまり、私のローカルではエラーがありませんが、環境が違うと開発環境(dev env)や実際のサーバ(prod env)にアップデートするとエラーが発生する時があります。&lt;/p&gt;&lt;p&gt;代表的にデータベース接続設定やファイルパースなどの差異があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでこのジェンキンスを通って統合環境で再デプロイ(redeploy)をして最終的にサービスを安全に運用するためのツールだと思えば良いでしょう。&lt;/p&gt;&lt;p&gt;ciツールの概念はこれですが、実は上のエラー処理まですべて検証するなら凄く複雑な作業をしなければならないですが、一般的にはソースを再統合して該当なサーバに再ビルドしてデプロイする機能だと思えば良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、centosのこのjenkinsをインストールする方法は二つの方法があります。&lt;/p&gt;&lt;p&gt;yumを通ってinstallする方法があり、ソースをそのままにdeployして使う方法があります。&lt;/p&gt;&lt;p&gt;私もyumを通ってやったことではないので、詳細に説明は大変ですが、yumを通ってインストールする方法は簡単ですが、権限設定が少し複雑だと聞きました。そのため、私はソースをダウンロードしてインストールする方法でやりましょう。(私の個人開発サーバは一台なので二回は大変ですね。)&lt;/p&gt;&lt;p&gt;jenkinsをインストールするためにはjavaが必要だし、tomcatとgit、そしてmavenをインストールしなければならないです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/100.html&quot; target=&quot;_blank&quot;&gt;[centos] java インストール&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/101.html&quot; target=&quot;_blank&quot;&gt;[centos] tomcat インストール方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;gitとmavenは別の投稿がないので、インストールする方法を紹介します。&lt;/p&gt;&lt;p&gt;gitはただyumでインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1960&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;mavenはyumでインストールすると少しめんどくさいことができるので、ただソースをダウンロードした後で圧縮を解凍してpath設定をしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://maven.apache.org/download.cgi&quot; target=&quot;_blank&quot;&gt;https://maven.apache.org/download.cgi&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1956&quot; data-filename=&quot;002.png&quot; style=&quot;width: 629px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして最後に/etc/profileの環境設定です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1957&quot; data-filename=&quot;003.png&quot; style=&quot;width: 325px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1958&quot; data-filename=&quot;004.png&quot; style=&quot;width: 647px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このようにjava、tomcat、gitとmavenをインストールしました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、jenkinsホームページに行ってjenkinsをダウンロードしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.jenkins.io/download/&quot; target=&quot;_blank&quot;&gt;https://www.jenkins.io/download/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1959&quot; style=&quot;width: 687px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最新バージョンをダウンロードしても良いですが、私はもっと安定的なltsバージョンをダウンロードします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1965&quot; style=&quot;width: 595px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてwebappsフォルダに移動してrootフォルダの中をすべて削除してファイルをコピーします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1962&quot; data-filename=&quot;007.png&quot; style=&quot;width: 486px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これでjar xvfコマンドでwarファイルの圧縮を解凍しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1975&quot; style=&quot;width: 601px;&quot; data-filename=&quot;008.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この圧縮が解けたらtomcatを起動します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1974&quot; data-filename=&quot;009.png&quot; style=&quot;width: 601px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私はインストール中でエラーが発生しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1986&quot; style=&quot;width: 848px;&quot; data-filename=&quot;010.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実は以前に私がインストールする時にはcatalina.shでjava_opts=&quot;$java_opts -djava.awt.headless=true&quot;だけ追加したら解決しましたが、今回がなぜできないの？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1964&quot; data-filename=&quot;011.png&quot; style=&quot;width: 434px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.jenkins.io/doc/administration/requirements/jenkins-on-java-11/&quot; target=&quot;_blank&quot;&gt;https://www.jenkins.io/doc/administration/requirements/jenkins-on-java-11/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ジェンキンスはopenjdk 8と11だけ作動するって...;;;&lt;/p&gt;&lt;p&gt;そのため、openjdkをバージョンダウンしました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1970&quot; data-filename=&quot;012.png&quot; style=&quot;width: 600px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaが最近バージョンにより差異がすごくあるので、バージョンアップするたびに頭が可笑しくなる感じです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、起動しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1963&quot; data-filename=&quot;013.png&quot; style=&quot;width: 845px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;正常に作動します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1971&quot; style=&quot;width: 848px;&quot; data-filename=&quot;014.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのパスでパスワードファイルがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1976&quot; style=&quot;width: 728px;&quot; data-filename=&quot;015.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;入力するとpluginをインストールする画面が表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1968&quot; data-filename=&quot;016.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pluginは別にインストールが可能なので一旦、提案するpluginだけインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1973&quot; style=&quot;width: 848px;&quot; data-filename=&quot;017.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それなら始めに管理者のidとパスワード設定画面がでます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1980&quot; data-filename=&quot;018-j.png&quot; style=&quot;width: 784px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてurl設定ですが、ドメインをもっているならドメイン名を入力し、私はテストサーバなのでただipアドレスを入れます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1979&quot; data-filename=&quot;019.png&quot; style=&quot;width: 837px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;設定が完了しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1967&quot; data-filename=&quot;020-j.png&quot; style=&quot;width: 821px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからgithubを連結して作成しましょう。&lt;/p&gt;&lt;p&gt;本人のgithubに接続してプログラムトークンキーを取得しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1983&quot; data-filename=&quot;021.png&quot; style=&quot;width: 225px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;settingsメニューに移動してdeveloper settingsに移動します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1982&quot; style=&quot;width: 769px;&quot; data-filename=&quot;022.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてpersonal access tokensメニューに移動してトークンを生成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1985&quot; data-filename=&quot;023.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;noteにトークン名を作成してrepoとhook、orgを選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1987&quot; style=&quot;width: 746px;&quot; data-filename=&quot;024.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;必要なものがあればもっとクリックしでもいいです。&lt;/p&gt;&lt;p&gt;生成ボタンを押下するとtokensキーが生成されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1969&quot; data-filename=&quot;025.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、ジェンキンス(jenkins)に戻りましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてitemを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1977&quot; data-filename=&quot;041.png&quot; style=&quot;width: 290px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;適当にプロジェクト名を入れてfreestyle projectを選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1972&quot; style=&quot;width: 800px;&quot; data-filename=&quot;042.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてソースを取得するgithubアドレスを入れます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1989&quot; data-filename=&quot;043.png&quot; style=&quot;width: 779px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてcredentialsを追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1984&quot; data-filename=&quot;029.png&quot; style=&quot;width: 774px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてタイプをsecret textに選択してsecretキーをgithubで貰ったtokensキーを入れます。&lt;/p&gt;&lt;p&gt;そしてjenkinsにはcommitする時のidを入れます。(commitする時の識別する名を入れればよいでしょう。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1978&quot; data-filename=&quot;030.png&quot; style=&quot;width: 817px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ブランチは計画したブランチを入れたらよいでしょう。私はただmasterを入れました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1966&quot; data-filename=&quot;031.png&quot; style=&quot;width: 749px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてbuildが終わったら処理するshellコマンドを入れましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1981&quot; data-filename=&quot;032.png&quot; style=&quot;width: 786px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1961&quot; data-filename=&quot;033.png&quot; style=&quot;width: 752px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は私が任意でtomcatを新しく設定してdeployする例を作成しました。&lt;/p&gt;&lt;p&gt;上みたいにシェルコマンドを使ったらgitからpullが完了すると実行されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これから実行ボタンを押下しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1990&quot; data-filename=&quot;044.png&quot; style=&quot;width: 275px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうしてコンソール結果をみるとpullが完了してshellが事項することを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1988&quot; data-filename=&quot;035.png&quot; style=&quot;width: 598px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実際のサーバで確認するとソースがtomcatサーバにしっかり圧縮が解凍したことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでcentosでジェンキンス(jenkins)をインストールする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/285.html</guid><pubDate>Mon, 18 Oct 2021 18:28:58 +0900</pubDate></item><item><title>[Project design] 詳細設計(インターフェース設計と抽象化作業)</title><link>https://www.nowonbun.com/284.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿は詳細設計(インターフェース設計と抽象化作業)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿で基本設計に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/283.html&quot; target=&quot;_blank&quot;&gt;[project design] 基本設計(画面設計とdb設計)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本設計というのは簡単に要約するとプログラムの全体的な構造を設定することです。それなら詳細設計はもっとプログラムをどのように作成するかを設定することです。&lt;/p&gt;&lt;p&gt;基本設計ではユーズケースやアクティブダイアグラムなどを通ってプログラムの要素よりユーザがプログラムをどのように使うか、プログラムの流れはどのようになるかの説明すると思ったら詳細設計はもっと具体的にプログラムの設計になり、プログラムらしい設計になります。&lt;/p&gt;&lt;p&gt;つまり、uml(unified modeling language:統合モデリング言語)にはシークエンスダイアグラムやクラスダイアグラムを利用してプログラム設計することです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1954&quot; data-filename=&quot;001.png&quot; style=&quot;width: 340px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;シークエンスダイアグラム reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/sequence_diagram&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/&lt;/a&gt;&lt;/span&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1955&quot; data-filename=&quot;002.jpg&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;クラスダイアグラム reference - &lt;a href=&quot;https://stackoverflow.com/questions/57690701/modelling-services-in-a-uml-class-diagram&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/&lt;/a&gt;&lt;/span&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この詳細設計する理由としては様々な工程のインターフェースを確定するためです。&lt;/p&gt;&lt;p&gt;今回はウェブプログラムではなく、c/s(clieng-server)プログラムの例で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々が業務c/sプログラムを作成すると思ったら、serverには大幅でnetworkパート、業務パート、core(共通部品)、その他のユーティリティに分けて開発します。一人で開発すると思えば別にパートを分ける理由がないですが、実務では一人で開発する場合が少ないので大幅で4パートで分けて開発すると思いましょう。&lt;/p&gt;&lt;p&gt;詳細設計がなく、すぐ開発を開始すると思えば、各パートでは工数(step count)が設定されます。&lt;/p&gt;&lt;p&gt;それなら、私が業務パートを作成しようと思うと、作成中でcoreの特定なデータを取得するコードを作成すると思いましょう。でも、coreパートではまだその部分が作成せずに、重要度が低く、優先順位で離れています。そうなら我々はそのcoreが作成する時まで今の作業が止まります。&lt;/p&gt;&lt;p&gt;networkを利用してclientにデータを送信しなければならない部分だとnetworkパートが作成する時まで待機するべきです。もっと大きく考えるとclientプログラムはserverプログラムが完成する時まで待機するべきです。&lt;/p&gt;&lt;p&gt;普通のプロジェクトは並列で開始するので、他のパートが完成する時まで待つことはできません。&lt;/p&gt;&lt;p&gt;そのため、詳細設計が必要です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なのでウォーターフォール工程ではシークエンスダイアグラム、クラスダイアグラム、そしてもっと必要ならインターフェースダイアグラムまで必要です。でも、現実は設計図を一つ一つ全部作成する時間がありません。&lt;/p&gt;&lt;p&gt;そのため、私の考えはこの部分の工程を減らすとすごく時間を短縮することが可能ではないかと思いました。でも、省略することでは上の問題な協業作業ができない問題があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので、基本設計と同じ概念でコーディングが設計だと思いで、interfaceとabstractクラスを利用してまだ開発してないですが、インターフェースと抽象化設計で詳細設計ができるではないかと思いました。&lt;/p&gt;&lt;p&gt;interfaceは実際のコードを実装せずにこれから私が何を作成しようかと思う関数を作成します。&lt;/p&gt;&lt;p&gt;そして変数が必要な部分は抽象クラスで先に設定することも良いでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このように作業すると実際にコードを作成しなくてもプロジェクト内でデバッグエラーが発生しません。もちろん、インターフェースだけで実際のインスタンスが生成することはできないので、正常に動くことはしません。&lt;/p&gt;&lt;p&gt;でも、設計かつコーディングが同時に作成するので、時間をすごく短縮することができます。そしてumlダイアグラムより直接にソースを見て判断することなので、個人的に設計可読性もよくなるでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして、私も最近から導入して使う方法で一行のコメントです。(これは状況によりソースが逆に汚くなり、可読性が悪くなる可能性もあります。)&lt;/p&gt;&lt;p&gt;一行コメントすると、コードページが設計図になります。このように作成するとoop特性を無視して関数単位開発することもなくなるし、コーディングのステップの減らす効果もあります。&lt;/p&gt;&lt;p&gt;デザインパターンでfacadeパターンを利用するとすごく綺麗なソースになった時もありました。&lt;/p&gt;&lt;p&gt;この方法では人により差異があるのでお勧めではないですが、少なくとも私の場合はこの方法で成功したプロジェクトがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の方法も基本設計でhtml作成しましょうと同じく、プログラムコードを作成することができなければできない方法です。&lt;/p&gt;&lt;p&gt;チームがすべて開発者になると個人的にすごく便利でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、日本ではウォーターフォール工程でプログラムを納品する時に詳細設計図を提出してくださいという依頼もあるので、依頼条件によりですね。自社siならお勧めです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで詳細設計(インターフェース設計と抽象化作業)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Project design</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/284.html</guid><pubDate>Mon, 18 Oct 2021 18:23:59 +0900</pubDate></item><item><title>[Project design] 基本設計(画面設計とDB設計)</title><link>https://www.nowonbun.com/283.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿は基本設計(画面設計とdb設計) に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にプロジェクト工程に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/279.html&quot; target=&quot;_blank&quot;&gt;[project design] プロジェクトを工程(ウォーターフォール vs アジャイル)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロジェクト工程というのは全体的にプロジェクトをどの順番で進めるかを設定することなら、基本設計はプログラムをどのように作ろうかを設定することです。&lt;/p&gt;&lt;p&gt;ウォーターフォールの工程での基本設計はuml(unified modeling languagu:統合モデリング言語)のユーズケース、アクティブダイアグラムを通ってユーザがプログラムをどの目的で使うかどのように利用するかを設定することです。必ず、ユーズケースやアクティブダイアグラムではなく、ストーリボードを通って設定することも悪くないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1952&quot; style=&quot;width: 600px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;ユーズケースのreference - &lt;a href=&quot;https://www.javatpoint.com/uml-use-case-diagram&quot; target=&quot;_blank&quot;&gt;https://www.javatpoint.com/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1949&quot; style=&quot;width: 564px;&quot; data-filename=&quot;002.gif&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;アクティブダイアグラムのreference - &lt;a href=&quot;https://sourcemaking.com/uml/modeling-business-systems/external-view/activity-diagrams&quot; target=&quot;_blank&quot;&gt;https://sourcemaking.com/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1950&quot; data-filename=&quot;003.jpg&quot; style=&quot;width: 394px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;ストーリボードのreference - &lt;a href=&quot;https://nmasse.com/courses/ecom205/storyboard.php&quot; target=&quot;_blank&quot;&gt;http://nmasse.com/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;この方法の利点はプログラムの目的を正確に設定することができるしプログラムを一緒に作成するメンバーとコミュニケーションがしやすいことと結果物に確実な目標設定が可能なことがあります。問題は工程で上の設計書をすべて作成すると時間がすごく長くなる欠点があります。そして次の工程の詳細設計とコーディングの工程に進める時、お客様とユーザの追加要請事項ができた場合に変更の柔軟性がずいぶん厳しくなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので、私の場合は別にumlやストーリボードの設計を省略する方法です。(もちろん、お客様の要請がある場合は作成しますが、時間と金額に関して説明します。)&lt;/p&gt;&lt;p&gt;でも、すべて省略することではプログラムの目標を設定することが難しいですが、私は画面設計(htmlコードでプログラムを作成)してコメントに利用してストーリボードの流れを作成します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;画面設計というのは別にエクセルやパワーポイントのワードプロセッサーで作成することではなく、apacheを起動してvisual codeを利用して直接にhtmlを作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1953&quot; style=&quot;width: 848px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1948&quot; data-filename=&quot;005.png&quot; style=&quot;width: 662px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この方法の利点はウェブプログラムというのはwas(web application server)からパーシングされたhtmlタイプとデータをブラウザーに転送することです。つまり、ドキュメントで基本設計を作成してもコーディングする時に必ずやるべき作業ということです。&lt;/p&gt;&lt;p&gt;データ領域(.json)は例なので、実際にはすこし差異があるかも知りませんが、htmlで直接に作成して設計するほうが個人的に見やすいし、直感的ではないかと思います。&lt;/p&gt;&lt;p&gt;そして、ユーズケースやアクティブダイアグラムを作成しても正確なプログラムの算出物ではないので、発注者が考えるプログラムと開発者が作成するプログラムの認識差異が発生する可能性があります。でも、htmlを作成する方法で設計書を作成するとそのギャップがずいぶんなくなるし、追加要請や修正があってもどうせ画面を修正しなければならないので、柔軟性がよくなります。&lt;/p&gt;&lt;p&gt;この方法で欠点ももちろんあります。htmlタグとcss、javascriptに関して確実に用法を分からないと作成することができない領域なのでプログラムのスキルがなければ、作成することが大変になります。でも、個人的な考えでウェブ開発者がhtmlタグとcss、javascriptをしらないことは。。でも、たまにいらっしゃってます。ってますね。&lt;/p&gt;&lt;p&gt;そしてhtmlを直接に作成する部分なので、時間もかなり掛かる作業になります。でも、私の考えが開発者がマウスでドキュメントを作成することよりキーボードでいろんなコードを打ちながらドキュメントを作成することが何か格好いいと思う昔の開発者なので個人的にこの方法を好きです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして画面設計はそのようにしてddl(data definition language: データ定義言語)を作成します。&lt;/p&gt;&lt;p&gt;ddlというのは定義言語なので、簡単にデータベースのテーブルを作成することです。そしてそれをスクリプトファイル(.sql)で管理します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1951&quot; style=&quot;width: 574px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、画面設計は違い、ddlで作成したら全体的に関係図をよく理解できません。でも、プログラムを開発するためのいいオープンソースの無料ツールがすごく多いです。&lt;/p&gt;&lt;p&gt;私の場合は最近はdb browserツールでdbeaverがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/255.html&quot; target=&quot;_blank&quot;&gt;[tools] dbeaver(無料sql queryブラウザツール)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これが個人的にデータベースのクエリ分析ツールですごく便利ですが、このツールにはテーブルを作成すると自動にer図(entity relationship diagram)を作成する機能があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1947&quot; data-filename=&quot;007.png&quot; style=&quot;width: 526px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スクリプトを作成する時には関係が良く見えませんでしたが、このようにツールを利用したら別にer図を作成することか、ドキュメントを作成しなくてもいいではないかと思う利点があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;個人的に基本設計はこのようにします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この方法に関して利点はどうせやらなければならない作業を設計するところに含めて、やることで全体工程の時間をすごく短縮することができるし、追加事項、修正に関しても柔軟性がすごく良いでしょう。&lt;/p&gt;&lt;p&gt;欠点はやはり開発の経験がある方やコードに関して知っている方ではないなら作成することができない方法です。つまり、上の方法で運用するためにはチーム員の全体が開発スキルが必要という意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;自分の経験では様々なプロジェクトでチームメンバーの全員が開発者ではない場合も少しあります。(開発者といいますが、タグやデータベースを扱い方法を全然知らない方もいる時も。。。)&lt;/p&gt;&lt;p&gt;もちろん、テストまでやると思えば全員が開発者ではなくても構いないですが、問題はこの方が設計もやることです。それのためか、日本の開発プロジェクトの工程はウォーターフォール工程が多いです。自分はドキュメントで設計だけして、コーティングは他の方に任せること。結局、変なプログラムになること？&lt;/p&gt;&lt;p&gt;日本のプロジェクトの以外にはアメリカなどのプロジェクトはほぼ開発者およびプログラム言語をよく知っている方が比率が高いので上の方法でプロジェクトを進める時が多いです。&lt;/p&gt;&lt;p&gt;もちろん、上の方法論が正解ではないですが、少なくても私の経験には良かったなと思った工程ですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで基本設計(画面設計とdb設計) に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Project design</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/283.html</guid><pubDate>Sun, 17 Oct 2021 21:21:11 +0900</pubDate></item><item><title>[Design pattern] 1-4. デザインパターンの抽象ファクトリーパターン(Abstract factory pattern)</title><link>https://www.nowonbun.com/282.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンの抽象ファクトリーパターン(abstract factory pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;デザインパターンの生成パターンの中で一番複雑なパターンの抽象ファクトリーパターン(abstract factory pattern)です。&lt;/p&gt;&lt;p&gt;構造は複雑ですが、細かく見るとファクトリーメソッドパターンでファクトリーをクラスで作成してその上に抽象インターフェースによりファクトリーを取得するし、そのファクトリーでクラスを取得する構造です。&lt;/p&gt;&lt;p&gt;つまり、ファクトリーメソッドパターンが重畳していると思えば良いです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1946&quot; style=&quot;width: 700px;&quot; data-filename=&quot;001.jpg&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/abstract_factory_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/abstract_factory_pattern&lt;/a&gt;&lt;/span&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1944&quot; style=&quot;width: 182px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればfactoryクラスをgetfactoryという関数からインスタンスを受け取ります。&lt;/p&gt;&lt;p&gt;また、factoryクラスにはgettypedaoを通ってインスタンスを受け取ります。私はここでビルドパターンを通ってidaoを受け取りますが、gettypedaoにパラメータを入れてまたファクトリーメソッドパターンを使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1945&quot; data-filename=&quot;003.png&quot; style=&quot;width: 186px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はjavaで作成した抽象ファクトリーパターン例です。&lt;/p&gt;&lt;p&gt;c/c++と違い、ファクトリークラスの中でビルドパターンを代わりにファクトリーメソッドパターンでインスタンスを取得します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1943&quot; data-filename=&quot;004.png&quot; style=&quot;width: 191px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はc/c++と同じく、ファクトリークラスでビルドパターンでインスタンスを取得して実行します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私がfactoryクラスではなく、一般クラスをdaoというクラス名で作成しました。&lt;/p&gt;&lt;p&gt;なぜならこの抽象ファクトリーパターンがormフレームワークで一番よく使うパターンからです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例えば、データベースの各テーブルのdaoクラスを作成します。でも、仕様によりこれがoracleになれるし、mssqlになれるし、mysql(mariadb)になれる可能性があります。&lt;/p&gt;&lt;p&gt;各データベースのシステムのテーブルの設計構造は同じだと思えば、この抽象ファクトリーパターンを使ったらoracle用dao生成ファクトリーを生成することができるし、mssql用dao生成ファクトリーを生成することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その以外にデータ管理や生成、pdf生成やexcel生成などで仕様により装置を区分する時、該当なクラスの構造は同じく作ろうと思えば、よく使えるパターンです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンの抽象ファクトリーパターン(abstract factory pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/282.html</guid><pubDate>Fri, 15 Oct 2021 19:31:03 +0900</pubDate></item><item><title>[Project design] 要件定義(要求事項整理)</title><link>https://www.nowonbun.com/281.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿は要件定義(要求事項整理)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;要件定義はプログラムの工程に関係せずにどのプロジェクトでも必ず整理しなければならない段階です。要件定義というのはプログラムをなぜ作るか、どのところで活用するか、どのプログラムを作るかを定義することの意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムというのはどのデータや情報を収集してそれをどのように出力することや統計、算出数値を計算することがほとんどです。ほとんどというのはプログラムがデータ収集だけではなく、便利性のためのバッチプログラム、人ができない仕事を代わりにやるロボットや機械をコントロールするためのプログラムも存在します。しかし、私の場合は主なプロジェクトがウェブプログラムだし、ウェブプログラムは普通にデータを収集、掲示の目的が多いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブプログラムというのはもっと詳しく説明すると、普通のプログラム流れが申請や要請などのページでデータを入力するとユーザやプログラムによりデータが収集、加工になり、データが算出して最終的にウェブページにテーブルや統計グラフなどを通って表示することが一般的です。&lt;/p&gt;&lt;p&gt;もちろん、特殊な要請事項により申請や要請は省略してボットや収集、検索プログラムによりデータが自動に生成してウェブにデータ結果が表示する流れも多いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この流れでみると、ウェブプログラムの要件定義の構造はinput -&amp;gt; calculate -&amp;gt; outputの流れで定義されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1942&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は私が簡単に作成した要件定義表です。実務にはもっと詳細な内容がありますが、機能的にinput、calculate、outputの内容があれば、次の段階の設計をするときにどの内容が重要か、コーディングとunitテストの区分とシナリオテストのアクションのタイプを定義する時に明確になります。&lt;/p&gt;&lt;p&gt;上の構造は個人的に私はこのようにすればやりやすかったと意味で、その方法が必ず正解ということではないので、ただ参考だけしたら良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;要件定義の構造を考え終わったら誰からの要件定義かを考えなければならないです。&lt;/p&gt;&lt;p&gt;普通のプログラムは自分が必要から作る場合もありますが、実務は誰からプログラムの開発要請がある場合が多いです。その要請がお客様がなることもあるし、現場の上司や他部署の仲間から必要により開発要請がある場合もあります。&lt;/p&gt;&lt;p&gt;要請の種類は様々ですが、形態はほぼ似てます。&lt;/p&gt;&lt;p&gt;まず、要請者のタイプには管理者がいます。この管理者はプログラムのすべての権限を持っている管理者だし、特にデータが整理された統計や最終的なデータを確認するユーザです。&lt;/p&gt;&lt;p&gt;そして一般ユーザがいます。一般ユーザは権限により閲覧するデータが限定になり、ほとんどデータを入力するユーザです。&lt;/p&gt;&lt;p&gt;次は運用者(オファーレター)がいます。運用者は実際にプログラムの重要トランザクションデータを扱うユーザではなく、マスタデータ、コード追加、管理するユーザです。&lt;/p&gt;&lt;p&gt;最後に開発者がいます。この開発者は私がなれるし、プロジェクトが終わったら引継ぎするユーザになります。環境設定ファイルやシステムファイルを管理するユーザです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;各の要請者のタイプによりプログラムを考える立場が違うし望む要求事項が違います。&lt;/p&gt;&lt;p&gt;つまり、要件定義する時には要請者のタイプを考えて要件定義を構成するほうが良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データのタイプにより要件定義です。&lt;/p&gt;&lt;p&gt;業務によりデータタイプは全然別ですが、普通は一つの大きいデータを置いてデータ追加、修正などを通って完成になるデータが一般的です。&lt;/p&gt;&lt;p&gt;例えば、我々が図書館で本を貸出、管理するプログラムを作成すると考えましょう。&lt;/p&gt;&lt;p&gt;最初に本を借りる時に貸出というデータが生成されます。我々はそれをメインオブジェクト(main entity)と言いましょう。&lt;/p&gt;&lt;p&gt;まず、誰かが本を借りようと思ってパソコンの前で申請ボタンを押したら最初のメインオブジェクト(main entity)が作成されます。&lt;/p&gt;&lt;p&gt;このメインオブジェクト(main entity)はお客様の情報を連結するし、どの本を借りるかの本データ、貸出日付を入れて最終に返却日付まで計算してデータを追加します。&lt;/p&gt;&lt;p&gt;そしてこのメインオブジェクト(main entity)は貸出担当者に移動して担当者が追加内容を入れて承認というデータを追加します。&lt;/p&gt;&lt;p&gt;その後、またこのメインオブジェクト(main entity)を通って最初に作成したユーザに承認という情報を知らせて、データのスケジュールや他のプログラムなどにデータを移動します。&lt;/p&gt;&lt;p&gt;また、スケジュールによりこのメインオブジェクト(main entity)は返却日付が近くになると該当なユーザにメッセージやメールなどを通って返却要請をします。&lt;/p&gt;&lt;p&gt;そしてユーザが返却するためにメインオブジェクト(main entity)に返却ボタンを押すと返却担当者に移動します。そして返却担当者が本を確認して返却完了してメインオブジェクト(main entity)をlogに移動します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はメインオブジェクト(main entity)というのは最初にユーザから生成して途中で業務によりデータ追加、連結をして終わったらデータが終了になる流れです。&lt;/p&gt;&lt;p&gt;つまり、どの業務でもこのメインオブジェクト(main entity)が必ず存在します。まずそのメインデータを把握して次に追加するデータが何か連結するデータが何かを考えながら要件定義を作成することになります。&lt;/p&gt;&lt;p&gt;そしてこのデータをどの流れで作成するかを要件定義を作成します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;要件定義は実は必ずこのようにしなければならないですというのはありません。実務の業務により要件定義のフォーマットがすごく差異があります。&lt;/p&gt;&lt;p&gt;でも、私の場合は上の三つのパターンinput、calculate、outputの要件構造、要請者タイプ、データの構造を分離して考えればほぼ要件定義は整理ができます。&lt;/p&gt;&lt;p&gt;何かのもっと良いアイデアあればコメントをお願いします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで要件定義(要求事項整理)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Project design</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/281.html</guid><pubDate>Fri, 15 Oct 2021 19:28:58 +0900</pubDate></item><item><title>[C#] 52. Reflection機能を使い方 - Variable</title><link>https://www.nowonbun.com/280.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でreflection機能を使い方 - variableに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でreflectionに関するクラスと関数を使い方に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/277.html&quot; target=&quot;_blank&quot;&gt;[c#] 50. reflection機能を使い方 - class&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/278.html&quot; target=&quot;_blank&quot;&gt;[c#] 51. reflection機能を使い方 - method&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionというのはクラスや関数でソースにインスタンス生成(new)や関数を呼び出し(method())の普通の仕方ではなく、動的にreflection機能を利用して生成及び呼び出す方法という意味です。&lt;/p&gt;&lt;p&gt;変数も同じ意味です。特にc#にはクラスの中で変数はオブジェクト指向プログラミング(oop)によるメンバー変数はprivateで生成することが一般的です。&lt;/p&gt;&lt;p&gt;しかし、仕様により強制的に変数の値を変更するかユニットテスト(nunit)を実施する時にデバックの資料で使う場合があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1940&quot; data-filename=&quot;001.png&quot; style=&quot;width: 195px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は一般的なコーティングする方法でnodeクラスのインスタンスを生成する時、コンストラクタに10という値を入れてprint関数を通ってコンソールに出力しました。&lt;/p&gt;&lt;p&gt;当然にmain関数にはnodeのインスタンスのメンバー変数のdataを参照することができません。コンストラクタからデータを入れること以外は値を変更するか値を取得することができなく、print関数を通って出力だけできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1939&quot; style=&quot;width: 181px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でtypeof(node)でnodeクラスのtype構造を取得した後にdataのメンバー変数を取得しました。&lt;/p&gt;&lt;p&gt;そしてコンソールに出力するとメンバー変数の値が出力しました。その後、setvalueを通って値を格納してprint関数を呼び出したら変更された値が出力されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで見るとreflectionを通って関数を取得する場合とすごく似ています。実は同じですね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1941&quot; data-filename=&quot;003.png&quot; style=&quot;width: 243px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はnodeクラスにメンバー変数がありません。ただプロパティだけあります。&lt;/p&gt;&lt;p&gt;でも、私がreflectionを通ってnodeクラスのメンバー変数を取得するとdataのbackingfieldというメンバー変数があります。つまり、プロパティでget、setだけで設定してコンパイルしたら自動にprivate変数が生成されることを確認できます。&lt;/p&gt;&lt;p&gt;つまり、プロパティだけ作成しても内部的にはprivateメンバー変数が生成してoop規約に合わせることを確認できます。&lt;/p&gt;&lt;p&gt;値を設定してプロパティで値を取得すると値が変更されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionはc#のアクセス修飾子を無視してデータを取得するか設定することができます。&lt;/p&gt;&lt;p&gt;一般プログラムを作成する時には使うことをお勧めしないです。可読性やデータ無欠性に悪くなりますね。ただ、nunitテストやデバックプログラムを作成する時に使ったらよいですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でreflection機能を使い方 - variableに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/280.html</guid><pubDate>Fri, 15 Oct 2021 19:27:37 +0900</pubDate></item><item><title>[Project design] プロジェクトを工程(ウォーターフォール vs アジャイル)</title><link>https://www.nowonbun.com/279.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はプロジェクトを工程(ウォーターフォール　vs アジャイル)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通にどのプログラムを作成する時に、多い方がパソコンをパワーを付けて、ideツール(visual studioやeclipse)を実行し、コードを作成してプログラムを作ろうと思います。&lt;/p&gt;&lt;p&gt;私も大学生時代にはそう思ったと思います。&lt;/p&gt;&lt;p&gt;でも、この方法でプログラムを作成すればプログラムが思ったより違うか想像したことよりクオリティ(品質)がすごく悪く完成する場合が多いです。凄く素晴らしいプログラム作成能力や頭が天才ほど良い方にはこんなに作成しても良い品質なプログラムを作られるかもしれませんが、私の場合は思った通りに出来なった場合が多かったんです。&lt;/p&gt;&lt;p&gt;理由はいろいろがあると思いますが、一応始めに考えた計画内容を忘れたり、作成しながら欲心が出来て元々考えた内容より様々な機能を入れ込んだり、テストが足りなくて思われないバグが発生することなどの理由があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;勉強する時にはこのことでプロジェクト失敗にしても別に損害がないですが、実務でそのようにしてプロジェクト失敗にするとすぐ損害になります。&lt;/p&gt;&lt;p&gt;また、勉強する時とは違い、実務では一人ではなく、チーム単位で動くので、チーム員が目標をちゃんと決められないとかプロジェクトの方向が見えないのでチーム内の雰囲気が悪くなる場合もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのようにならないためにはプロジェクトを設計する人には先に工程に関して考えなければならないです。&lt;/p&gt;&lt;p&gt;プロジェクト工程は我々がどのプログラムを作成するかを設定して、そのプログラムを作成するためにはどの過程を通って作成するか、どの方法でテストをするかどの方法で情報を共有するかを設定することだと思えば良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;理論的には代表的にウォーターフォール工程とアジャイル工程があります。&lt;/p&gt;&lt;p&gt;理論的な説明はここで説明することよりウィキペディアで確認する方法が良いです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://ja.wikipedia.org/wiki/%e3%82%a6%e3%82%a9%e3%83%bc%e3%82%bf%e3%83%bc%e3%83%95%e3%82%a9%e3%83%bc%e3%83%ab%e3%83%bb%e3%83%a2%e3%83%87%e3%83%ab&quot; target=&quot;_blank&quot;&gt;https://ja.wikipedia.org/wiki/ウォーターフォール・モデル&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウォーターフォールは簡単に説明すると下記通りの工程です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1937&quot; data-filename=&quot;001.png&quot; style=&quot;width: 319px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;簡単に説明すると要件定義はお客様が作りたい定義、どのデータをどのように出力するか、どの環境で使うかを決定する部分です。普通にはpm(project manager)がお客様と会議などを通って決める部分です。&lt;/p&gt;&lt;p&gt;基本設計はumlで色々なダイアグラムを作成することも良いですが、普通は画面設計とデータベース設計(er)がこの段階で作成します。もっと詳細に作成したいならストリーボードもここで作成します。&lt;/p&gt;&lt;p&gt;詳細設計はプログラム上で抽象クラスはどのように作成するか、クラスの階層構造、共通関数などを設定して最終的にプログラムをどのように作成するかを決める部分です。&lt;/p&gt;&lt;p&gt;開発は言葉とおりにプログラムをコーディングする部分です。&lt;/p&gt;&lt;p&gt;単体テストは関数単位やクラス単位でテストする部分で普通はjunitやnunitなどを利用してプログラム開発する時に同時に作成する時もあります。&lt;/p&gt;&lt;p&gt;結合テストは詳細設計通りにクラス間のインターフェース、オブジェクトのinput、outputが正確に表示されるかのテストです。&lt;/p&gt;&lt;p&gt;スタンダードあるいはシナリオテストは基本設計通りにプログラムが全体的に作動するか、お客様が望む通りに作動するかを確認するテストです。&lt;/p&gt;&lt;p&gt;最後は要件定義通りにお客様に報告して納品することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウォーターフォール工程は利点はプログラムを無欠に作成するができるし(バグがほぼない)、正確な工数計算、チームの割り振りがしやすい、各の役割があるところでチームのないのコミュニケーションがしやすいし(レビュー含め)、プロジェクトの途中でメンバー異常(チーム員外れ)が発生する時にすぐ対処できる形です。&lt;/p&gt;&lt;p&gt;欠点としては工程が多く見えますが、そのほど開発期間が長いです。開発期間が長いというのはお金もかかるという意味ですね。そして工程は柔軟性がないので、詳細設計中でお客様の要請事項、変更事項が発生する時に、新しいブランチに分離することが難しいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アジャイルに関する理論的な説明もウィキペディアを参考してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://ja.wikipedia.org/wiki/%e3%82%a2%e3%82%b8%e3%83%a3%e3%82%a4%e3%83%ab%e3%82%bd%e3%83%95%e3%83%88%e3%82%a6%e3%82%a7%e3%82%a2%e9%96%8b%e7%99%ba&quot; target=&quot;_blank&quot;&gt;https://ja.wikipedia.org/wiki/アジャイルソフトウェア開発&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アジャイルは簡単に説明すると下記通りの工程です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1938&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アジャイルはウォーターフォールと比べて写真では単純に上から下の工程から左から右になれる差異だけだと見えますが、実務は全然違います。&lt;/p&gt;&lt;p&gt;アジャイルは設計と開発の工程をすごく単純な工程で作ることでソースコードを設計図みたいに作成します。&lt;/p&gt;&lt;p&gt;つまり、ウォーターフォールには抽象クラスやインターフェースを作成しなくても結果物を作られますが、アジャイルにはできればできるほど抽象クラスやインターフェースを作成してソースコードの中で設計図を作成する方法です。&lt;/p&gt;&lt;p&gt;そのことように作成して設計段階を省略して要求事項があるたびにすぐ開発する方法です。そして要件定義もバージョンを生成してそのままにブランチを作成してテスト段階に渡す方法ですね。&lt;/p&gt;&lt;p&gt;その部分のスクラムサイクルといいますが、普通は1か月、あるいは2か月単位でサイクルを作成して段階別に開発、テストが行います。&lt;/p&gt;&lt;p&gt;文字で説明しようと思うから正確に説明ができないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例えば、最初に開発する時に、0.01バージョンで要件定義を受け取ります。そして0.01バージョンを開発する時に要件定義には0.02バージョンを受け取ります。&lt;/p&gt;&lt;p&gt;また、0.01バージョンの開発が終わったらテスト工程になりますが、開発工程は0.02を開始します。もちろん、要件定義は0.03バージョンを受け取ります。&lt;/p&gt;&lt;p&gt;そのことに0.01が納品(デプロイ)になるとテスト工程には0.02が開始、開発は0.03を開始、要件定義は0.04を受け取ります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウォーターフォールの場合は要件定義から順番的に行って、途中でブランチが発生しても、最初の要件定義が納品した後に作成することにしますが、アジャイルは並列的に工程が可能です。&lt;/p&gt;&lt;p&gt;アジャイルの利点はプログラムをすごく早く作成することができるし、工程の柔軟性が良いし、正確な工数計算と役割を割り振りしやすいことがあります。&lt;/p&gt;&lt;p&gt;欠点にはアジャイル開発工程のためのチーム員の高いスキルが要求されるし、並列処理なので途中でバグが発生する時に対処することが難しいことがあります(例えば、0.02で致命的なエラーが発生しましたが開発は0.03になっています。その場合にバグを0.03で直してバグがあるままで0.02を納品するか0.03を止まって0.02に戻るかの問題です。)&lt;/p&gt;&lt;p&gt;そのため、アジャイル工程はウォーターフォールに比べて品質が悪い場合があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでが理論的な説明です。実務では上みていに理論通りに動けません。&lt;/p&gt;&lt;p&gt;理由は様々がありますが、やはり一番大きな理由はお金ですね。&lt;/p&gt;&lt;p&gt;ウォーターフォールの場合は良い品質のプログラムが生産しますが、開発期間が長いし、長いというのはお金がかかるという意味です。アジャイルの場合は速く開発ができますが、品質の問題があります。また、工程スキルが高いので費用が高い開発者を使うので凄く削減効果があることではありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;お客様の立場ではシニア開発者の一人、二人と一般開発者を付けてプロジェクトをやりたい時が多いです。&lt;/p&gt;&lt;p&gt;そのことで高い品質と低い値段でプロジェクトを成功することを期待することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので、仕様によりウォーターフォールとアジャイルを混ぜている工程が生成されます。&lt;/p&gt;&lt;p&gt;私の場合はアジャイル方法みたいに設計を省略してフレームワークとコアーを最大に構成して開発からテストを一つのブランチで結んで開発します。&lt;/p&gt;&lt;p&gt;つまり、要件定義から開発までは、アジャイル方法、開発から最終テストまではウォーターフォールの開発工程を作ります。そのようにするとテストで仕方がなく、時間がかかりますが、ウォーターフォールより速いし、コアーやフレームワークはシニア開発者が、process領域、つまり、継承して業務プログラムを作成する部分は一般開発者が任せる工程でするのでバグ発生率も減らすことも可能です。&lt;/p&gt;&lt;p&gt;また、利点はシニア開発は様々なプロジェクトを同時に作成することができます。&lt;/p&gt;&lt;p&gt;例えば、シニア開発者が4人のa、b、c、dがいると思えば、一つのプロジェクトにa、bがシニアを任せるし他のプロジェクトにはc、dがシニアを任せます。一つのプロジェクトの一般開発者はc、dが任せる、他のプロジェクトにはa、bが任せることで担当を混ぜて開発することができます。&lt;/p&gt;&lt;p&gt;ここで一般開発者が投入されると負荷があるプロジェクトに参加するし、様々に工程変更もしやすいです。&lt;/p&gt;&lt;p&gt;欠点は開発者がすごく大変になりますね。スクラムサイクルの恐怖と言います。でも、工数を入れたり、引いたりがしやすいので、休暇や代替工数を入れることもしやすいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はこのタイプでプロジェクトを運用する時が多いですが、全然問題がなかったということではないですが、私の性格にはちょうど合う工程ではないかと思いますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでプロジェクトを工程(ウォーターフォール　vs アジャイル)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Project design</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/279.html</guid><pubDate>Thu, 14 Oct 2021 18:36:04 +0900</pubDate></item><item><title>[C#] 51. Reflection機能を使い方 - Method</title><link>https://www.nowonbun.com/278.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でreflection機能を使い方 - methodに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でreflectionの機能を利用してクラスのインスタンスを生成する方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/277.html&quot; target=&quot;_blank&quot;&gt;[c#] 50. reflection機能を使い方 - class&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionというのは簡単に説明すると、既存、ソースでnewキーワードを使ってインスタンスを生成する方法からstringの値により動的にインスタンスが生成されることということです。&lt;/p&gt;&lt;p&gt;関数(method)も既存、ソース上で関数名を作成して呼び出す方法ではなく、クラス内で関数を探索して動的に実行するための方法ということです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1936&quot; data-filename=&quot;001.png&quot; style=&quot;width: 217px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は既存の方法でprint関数を呼び出す方法です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1936&quot; data-filename=&quot;001.png&quot; style=&quot;width: 217px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はreflectionで関数を探して実行する方法です。ソース上ではstringのデータを利用してprintの値で関数を呼び出します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1935&quot; data-filename=&quot;002.png&quot; style=&quot;width: 185px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のgetmethods関数を利用してnodeクラスにあるすべての関数を取得しました。&lt;/p&gt;&lt;p&gt;でも、c#にはすべてのクラスはobjectクラスを継承します。なので、objectの関数にも実行されます。それでパラメータが無くて、returnタイプがvoidということだけフィルターして実行しました。&lt;/p&gt;&lt;p&gt;結果はa,b,cの関数が実行されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私は例のために上みたいに作成しましたが、reflectionを利用するとユーザの入力値あるいはデータベースやファイルの値により実行できる関数を制御できます。簡単にインタープリターパターン(interpret pattern)を作成することができます。&lt;/p&gt;&lt;p&gt;link - 作成中&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてreflectionを利用すればpublicになっている関数だけではなく、private、protectedのアクセス修飾子にもアクセスができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1936&quot; data-filename=&quot;001.png&quot; style=&quot;width: 217px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でprint関数はprivateで設定されていても、main関数から実行することが確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々が完璧なカプセル化でプロジェクトを作成しました。でもunitテストのために途中で関数がしっかり作動しているかをテストする場合もあります。&lt;/p&gt;&lt;p&gt;祖の場合、reflectionを利用してtestclassを作成してクラスのunitテストをするとソースの修正なしでテストクラスを作成することも可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてstaticとパラメータがある関数にもアクセスが可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1936&quot; data-filename=&quot;001.png&quot; style=&quot;width: 217px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はnodeクラスのprintのstatic関数です。static関数はインスタンスに関係せずに呼び出す関数です。&lt;/p&gt;&lt;p&gt;なので、invoke関数で関数を呼び出す時に、インスタンスの値を代わりにnullを入れます。パラメータの値はinvoke関数の二つ目のパラメータに配列タイプで入力します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionの機能をよく利用すればプログラムをすごく動的に作成することがある利点があります。&lt;/p&gt;&lt;p&gt;classと同じく、デザインパターンと関係がある機能だし、特にnunitのunitテストでよく使う機能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、reflection機能はvisual studioのデバック環境でエラーをキャッチしてくれないので、バグの危険性と可読性が悪くなる欠点があります。&lt;/p&gt;&lt;p&gt;そして一般静的な呼び出しより探索してインスタンスを入れて実行する構造なので性能にも影響がある機能です。なので仕様に合わせて使うことをお勧めです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でreflection機能を使い方 - methodに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/278.html</guid><pubDate>Thu, 14 Oct 2021 18:34:54 +0900</pubDate></item><item><title>[C#] 50. Reflection機能を使い方 - Class</title><link>https://www.nowonbun.com/277.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でreflection機能を使い方 - classに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflection機能とはインスタンスを動的で割り当てするか関数やフィールドおよび属性を動的に呼び出せる機能だという説明になっています。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/reflection&quot; target=&quot;_blank&quot;&gt;https://docs.microsoft.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;この説明は難しいですね。インスタンスを動的で割り当てするというのは我々がクラスのインスタンスを生成する時には普通はnewというキーワードを使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1932&quot; style=&quot;width: 168px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスのインスタンスは基本的にnewを利用して生成するというのは、以前に十分に説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/12.html&quot; target=&quot;_blank&quot;&gt;[c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インスタンスを生成する時、ソースにnew nodeという作成します。reflectionにはこれを静的の表現と言います。&lt;/p&gt;&lt;p&gt;つまり、データや分岐により他のインスタンスを生成したいならifを使ってソースを作成しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1931&quot; style=&quot;width: 172px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればtypeという任意のデータを置いてnode1ならnode1のインスタンスを生成してその以外にはnode2のインスタンスを生成します。&lt;/p&gt;&lt;p&gt;でも、ここで仕様によりnode3のクラスが生成したら? ifを分岐してインスタンス生成する区間を作ることになります。もちろん、クラスをもっと生成するとmain関数がずっと修正が必要になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1934&quot; data-filename=&quot;003.png&quot; style=&quot;width: 168px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このように作成するとクラスが生成してもtype.gettypeのstring値によりインスタンス生成します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、我々がクラスのコンストラクタをprivateで生成することができます。&lt;/p&gt;&lt;p&gt;コンストラクタをprivateで設定をすればnewでインスタンスを生成することができません。コンストラクタが内部だけ生成することに設定したからです。代表的にシングルトンパターンがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/257.html&quot; target=&quot;_blank&quot;&gt;[design pattern] 1-1. シングルトンパターン(singleton pattern)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、reflectionを使ったらコンストラクタをprivateに設定されてもインスタンス生成が可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1933&quot; data-filename=&quot;004.png&quot; style=&quot;width: 157px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;getparameters関数を使ってコンストラクタの種類を取得してlinqのwhereでパラメータがないコンストラクタを一つ取得します。取得すればinvoke関数を使ってインスタンスを生成します。&lt;/p&gt;&lt;p&gt;つまり、パラメータがあるコンストラクタはlinqのwhereによりパラメータの個数やタイプで取得することができるし生成も可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でreflection機能を使い方 - classに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/277.html</guid><pubDate>Wed, 13 Oct 2021 18:34:13 +0900</pubDate></item><item><title>[C#] 49. Operator(演算子)のオーバーロードを使い方</title><link>https://www.nowonbun.com/276.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のoperator(演算子)のオーバーロードを使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#でoperator(演算子)とは足す(+)、引く(-)の記号です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/7.html&quot; target=&quot;_blank&quot;&gt;[c#] 6. 演算子&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;どのプログラムを学んでも始めにみることは演算子じゃないかと思います。&lt;/p&gt;&lt;p&gt;そしてオーバーロード(overrode)の意味はプログラムで再定義という意味です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/14.html&quot; target=&quot;_blank&quot;&gt;[c#] 13. クラスの継承と再定義(override)する方法、overrideとnewの差異&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、operator(演算子)オーバーロードというのは演算子を再定義という意味です。すなわち、我々が使っている足す(+)や引く(-)を単純に数字演算だけではなく、別の処理で再定義することができる意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1930&quot; style=&quot;width: 208px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例が演算子の再定義です。&lt;/p&gt;&lt;p&gt;既存の定数タイプ(int)と実数タイプ(float)には足す(+)や引く(-)を入れたら四則演算になりますが、クラスには上みたいに再定義して使ったらコードステップを減らす効果があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この演算記号はすべて記号が再定義することではありません。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/operator-overloading&quot; target=&quot;_blank&quot;&gt;https://docs.microsoft.com/&lt;/a&gt;&lt;/p&gt;&lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;        &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;            &lt;th&gt;演算子&lt;/th&gt;            &lt;th&gt;説明&lt;/th&gt;        &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td&gt;+x, -x, !x, ~x, ++, --, true, false&lt;/td&gt;            &lt;td&gt;パラメータが一つの演算子として、再定義が可能です。ここでtrue、falseは二つを同時に定義しなければならないoperatorとしてboolタイプで暗黙的型変換で可能な再定義です。&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;x + y, x - y, x * y, x / y, x % y, x &amp;amp; y, x | y, x ^ y, x &amp;lt;&amp;lt; y, x &amp;gt;&amp;gt; y, x == y, x != y, x &amp;lt; y, x &amp;gt; y, x &amp;lt;= y, x &amp;gt;= y&lt;/td&gt;            &lt;td&gt;パラメータが二つの演算子として、再定義が可能です。&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;x &amp;amp;&amp;amp; y, x || y&lt;/td&gt;            &lt;td&gt;再定義不可、true、falseの再定義で認識する。&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;a[i], a?[i]&lt;/td&gt;            &lt;td&gt;演算子の再定義ではないインデクサーで認識する。&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;(t)x&lt;/td&gt;            &lt;td&gt;タイプ変更の再定義、explicit明示的、implicit暗黙的&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;+=, -=, *=, /=, %=, &amp;amp;=, |=, ^=, &amp;lt;&amp;lt;=, &amp;gt;&amp;gt;=&lt;/td&gt;            &lt;td&gt;再定義不可、ただ、パラメータが二つの演算子再定義で実行して代入する。&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;^x, x = y, x.y, x?.y, c ? t : f, x ?? y, x ??= y, x..y, x-&amp;gt;y, =&amp;gt;, f(x), as, await, checked, unchecked, default, delegate, is, nameof, new, sizeof, stackalloc, switch, typeof, with&lt;/td&gt;            &lt;td&gt;再定義不可&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;上の表を参照して演算子再定義ができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実務では演算子再定義をよくしません。以前のc++言語には前処理文で様々なマクロを作るためによく使ったと思いますが、c#にはよく使いません。&lt;/p&gt;&lt;p&gt;多分、可読性の問題ではないかと思います。演算子を再定義して使ったら、後でソースを解析する時には暗号化になることではないかと思います。&lt;/p&gt;&lt;p&gt;例えば、+演算子で引く演算を入れて、-演算子に足す演算を入れたら、ただ、記号では+、-だけ見えることでは足す、引くのが迷ってしまうではないかと思います。そのように実装する人ではなさそうですが。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のoperator(演算子)のオーバーロードを使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/276.html</guid><pubDate>Tue, 12 Oct 2021 18:28:42 +0900</pubDate></item><item><title>[C#] 48. IEnumerableとIEnumerator、そしてyieldキーワード</title><link>https://www.nowonbun.com/275.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はienumerableとienumerator、そしてyieldキーワードに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前に私がlinq式を説明しながらienumerableに関して簡単に説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/33.html&quot; target=&quot;_blank&quot;&gt;[c#] 32. ジェネリックタイプ(generic type)を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ienumerableのインタフェースは繰り返しパターンと関係あるパターンですが、我々がよく使う繰り返しキーワードforeachで使っているインターフェースです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;#&quot; target=&quot;_blank&quot;&gt;作成中&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ienumerableのインタフェースはgetenumerator関数が定義されているし、ienumeratorタイプで返却することになっています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1927&quot; data-filename=&quot;001.png&quot; style=&quot;width: 331px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてienumeratorの場合はforeachで使っているパターンの動作インターフェースとして、現在値に関するプロパティのcurrent、ポイント移動と値が存在するかを確認する関数のmovenext、そしてポインタの位置を初期化する関数resetになっています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1928&quot; style=&quot;width: 291px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1929&quot; data-filename=&quot;003.png&quot; style=&quot;width: 269px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;foeachの繰り返しキーワードはienumerableのインスタンスを継承したクラスの値を使えます。 我々が普通にlistやarrayをforeachに入れて使いますが、このクラスがienumerableのインスタンスを継承したことと同じ意味です。&lt;/p&gt;&lt;p&gt;ienumerableのインタフェースはgetenumerator関数が定義されているし、ienumeratorのインタフェースを継承したインスタンスをリターンします。&lt;/p&gt;&lt;p&gt;ienumeratorのインタフェースにはforeachで使うならreset関数を呼び出してポインタを初期化してforeachで次のポインタに移動する時にmovenextの関数を呼び出して、itemでデータを取得する時にはcurrentプロパティを使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで少し変なコードが見えますが、movenext関数が先に呼び出してcurrentのプロパティからデータを取得します。movenextの返却値は現在の値がnullかどうかに関するチェックだし、ポイントを移動しなければならないです。&lt;/p&gt;&lt;p&gt;currentは現在の値を取得することなのでcurrentではpos - 1で値をリターンするし、movenext関数では現在ポインタの現在のポインタに関するnullチェックでpos &amp;gt;= data.lengtのことで確認してposのポインタを移動します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで我々はyieldキーワードを使ったらienumeratorをもっとしやすく使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1929&quot; data-filename=&quot;003.png&quot; style=&quot;width: 269px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ienumeratorインタフェースを継承したクラスと同じ結果が表示されます。&lt;/p&gt;&lt;p&gt;yieldの場合は呼び出す時たびにreturnの値を別にすることができます。つまり、getenumerator()呼び出しになるとyieldキーワードを把握して一つの関数でなっている連結リストを生成します。&lt;/p&gt;&lt;p&gt;そしてmovenextが呼び出すたびに次のyieldまで実行することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、ienumeratorインターフェースはforeachだけで使うことではなく、linqでも使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1924&quot; data-filename=&quot;004.png&quot; style=&quot;width: 198px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はyieldキーワードはよく使いません。私も文法は分かりますが、かなり不慣れな文法です。もちろん、開発する人により違いますが、私の場合は他の言語(?)にはない文法だし、不慣れな文法で可読性を悪くする理由はないと思います。&lt;/p&gt;&lt;p&gt;実は普通のienumerableやienumeratorを継承して開発することが多くないです。仕様によりキャッシュアルゴリズムを作成するかlistアルゴリズムをもっと効率的に改善することができますが、.net frameworkで提供するlistアルゴリズムが優秀だし、新しいアルゴリズムを作成することでバグに関する安定性を保証することができません。&lt;/p&gt;&lt;p&gt;arrayもあるし、listを使ってもシステムが遅くなることではないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでienumerableとienumerator、そしてyieldキーワードに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/275.html</guid><pubDate>Mon, 11 Oct 2021 19:50:10 +0900</pubDate></item><item><title>[C#] 47. Nugetを使い方(外部ライブラリ)とデータベース(MariaDB(Mysql))を使い方、そしてトランザクション(Transaction)</title><link>https://www.nowonbun.com/274.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でnugetを使い方(外部ライブラリ)とデータベース(mariadb(mysql))を使い方、そしてトランザクション(transaction)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#が言語的で利点だと思う部分は.net framework中で基本的なライブラリがすごく多く含めています。その以外にもvisual studioのideツールもすごく便利だし、同じ製品系(ms製品系)に関しても互換性がすごくいい利点があります。&lt;/p&gt;&lt;p&gt;でも、多いライブラリを含めていると思っても、実際に使ってされるすべてのライブラリを持っていることではありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例えば、基本的にc#ではmssqlデータベースに関する接続ライブラリを持っています。別に外部ライブラリが必要ありません。なので別の種類のデータベースのライブラリは.net frameworkでありません。&lt;/p&gt;&lt;p&gt;つまり、c#を使ったらmssqlを使うことをお勧めすることです。でも、仕様により、あるいは様々な理由で開発言語はc#で開発してもデータベースはoracle(오라클)やmysql(mariadb)を使わなければならない場合もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうなら外部ライブラリを使わなければならないですが、mariadbホームページに接続するとc#ライブラリファイルがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://mariadb.com/kb/en/other-net-connectors/&quot; target=&quot;_blank&quot;&gt;mariadb net-connectors&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1917&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このようにライブラリをダウンロードしてプロジェクトに連結して使ってもよいですが、このようにするとバージョン管理や配布(deploy)や他人とプロジェクトを共有する時、ライブラリ管理などの問題が発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、プロジェクトのライブラリ管理ツールがありますが、javaにはmavenがあるみたいにc#にはnugetがあります。&lt;/p&gt;&lt;p&gt;nugetはvisual studioがインストールされていると別途にインストールする必要はありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1908&quot; data-filename=&quot;002.png&quot; style=&quot;width: 369px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロジェクトでreferencesの項目でマウスの右クリックしてcontextメニューをみればmanage nuget項目があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1914&quot; data-filename=&quot;003.png&quot; style=&quot;width: 832px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;browseタブで検索すればインストールができるライブラリが表示されます。&lt;/p&gt;&lt;p&gt;我々はmariadbを使っているのでmysql.data ライブラリをクリックしてversionを確認してinstallボタンを押下します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1910&quot; data-filename=&quot;004.png&quot; style=&quot;width: 436px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうなら規約が表示されるし、acceptを押下してインストールを開始します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1909&quot; data-filename=&quot;005.png&quot; style=&quot;width: 311px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして、referencesの項目を開いてみるとライブラリが連結されていることを確認できます。&lt;/p&gt;&lt;p&gt;もし、ライブラリが依存性されているライブラリなら(つまり、ライブラリで他のライブラリを参照しているなら)必要なライブラリも自動に連結されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで我々はmariadbを使いますが、なぜmysqlをダウンロードするかをみると実は過去の時にmysqlを無料データベースだったんですが、oracle社に合併されて有料化になりました。&lt;/p&gt;&lt;p&gt;それで以前にmysqlを作ったチームがまた独立して無料時代のソースをフォークして無料データベースのmariadbを作成しました。&lt;/p&gt;&lt;p&gt;なので、mysqlとmariadbは似てますが、別のデータベースです。コードベースはmysqlとmariadbは同じなので、コネクションは同じものを使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;mariadbをインストールする方法は別の投稿で説明しているので参考してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/273.html&quot; target=&quot;_blank&quot;&gt;[window] mariadbをインストールする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データベースがインストールされたら、簡単なテーブルを作成してデータを入れてc#プログラムで検索してみましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1915&quot; data-filename=&quot;006.png&quot; style=&quot;width: 399px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいデータベースにテーブルを作成して簡単なデータを入力しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このデータを利用してc#プログラムでデータを取得しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1912&quot; style=&quot;width: 276px;&quot; data-filename=&quot;007.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;使い方はmssqlで接続する方法と同じです。&lt;/p&gt;&lt;p&gt;executereaderで結果値を受け取ってexecutenonqueryでinsertやupdate、deleteを実行する方法です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/272.html&quot; target=&quot;_blank&quot;&gt;[c#] 46. データベース(mssql)に接続する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうなら少し知りたいことがあります。クエリくぉ実行中でエラーが発生するとどうでしょう？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1916&quot; style=&quot;width: 848px;&quot; data-filename=&quot;008.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;わざとエラーを発生させました。でも、そのエラーがdeleteを実行してエラーを発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1911&quot; data-filename=&quot;009.png&quot; style=&quot;width: 197px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムでエラーが発生するので、プログラムで実行するすべてのクエリは実行取り消しにならなければならないのにテーブルでデータがすべて削除されました。&lt;/p&gt;&lt;p&gt;実際に業務でも処理中でエラーが発生するとプログラム上で実行されたクエリが取り消ししなければならないですが、そうではなければ途中でクエリ処理が止まった不完全なデータになりました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでトランザクションという機能がありますが、その領域中で完全に実行が完了するとすべてクエリが実行する機能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1911&quot; data-filename=&quot;009.png&quot; style=&quot;width: 197px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;insertを実行しましたがトランザクションにより途中でエラーが発生すればinsert実行されないことを確認できます。&lt;/p&gt;&lt;p&gt;つまり、トランザクションは中でクエリをたくさん実行したと思ってもエラーが発生すればデータベースに反映されないような機能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでがtransaction機能ですが上みたいなソースなら何かプログラムらしくない形です。&lt;/p&gt;&lt;p&gt;ここでobserverパターンでプログラムを作成してみましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1913&quot; style=&quot;width: 290px;&quot; data-filename=&quot;010.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はパターンを使ってもっとプログラムらしいなプログラムを作りました。&lt;/p&gt;&lt;p&gt;c#にはormフレームワークというentityフレームワークがあります。直接にデータベースに接続するため、transaction設定してopen、closeなどを作成する場合もありますが、上みたいにデータベースを効率的に接続するため、パターンで組み立ているフレームワークがあります。それがorm(object reference mapping)フレームワークのentityフレームワークがあります。 프레임워크가 있습니다.&lt;/p&gt;&lt;p&gt;entityフレームワークに関しては別の投稿で詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でnugetを使い方(外部ライブラリ)とデータベース(mariadb(mysql))を使い方、そしてトランザクション(transaction)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/274.html</guid><pubDate>Fri, 8 Oct 2021 19:00:07 +0900</pubDate></item><item><title>[Window] MariaDBをインストールする方法</title><link>https://www.nowonbun.com/273.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はwindowにmariadbをインストールする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がプロジェクトを設計してプログラムを作成して一番よく使うプログラムがデータベースです。&lt;/p&gt;&lt;p&gt;データベースの種類はすごく多いですが、その中で無料だし、性能が良いrdbmsプログラムのmariadbをインストールしましょう。&lt;/p&gt;&lt;p&gt;以前の投稿でcentos(linux)環境でインストールしたことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/106.html&quot; target=&quot;_blank&quot;&gt;[centos] mariadb(mysql)をインストール&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;window環境にはlinux環境ほど、複雑ではありません。ただ、インストールファイルをダウンロードしてインストールしたら良いです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://go.mariadb.com/download-mariadb-server-community.html&quot; target=&quot;_blank&quot;&gt;https://go.mariadb.com/download-mariadb-server-community.html&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1907&quot; style=&quot;width: 848px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブページに接続すると名前と職業などの基本情報を入力しますが、正確に入力する必要なしで、簡単に作成してダウンロードしたら良いです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1893&quot; data-filename=&quot;002.png&quot; style=&quot;width: 238px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとosのバージョンを選択する画面が出ますが、我々はwindow環境でインストールするので、window 64を選択してダウンロードしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1890&quot; data-filename=&quot;003.png&quot; style=&quot;width: 723px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ダウンロードが完了すると下記とおりにインストールファイルができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1889&quot; style=&quot;width: 126px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールファイルをダブルクリックして実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1898&quot; data-filename=&quot;005.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ライセンスを同意選択をしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1896&quot; data-filename=&quot;006.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールするドライブを選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1895&quot; data-filename=&quot;007.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;次はrootの基本初期パスワードを設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1894&quot; data-filename=&quot;008.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてservices.mscに表示するサービス名とポート設定ですが、特に設定することではなければdefaultで設定してnextボタンを押下します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1891&quot; data-filename=&quot;009.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;mariadbはオープンソースなので、使用するところでフィードバックが必要ですね。私はチェックボックスを選択せずにnextボタンを押下しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1902&quot; data-filename=&quot;010.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからインストールが始まります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1892&quot; data-filename=&quot;011.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールが完了するとウィンドウメニューでmariadbフォルダが作成されました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1905&quot; style=&quot;width: 313px;&quot; data-filename=&quot;012.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この中でmysql clientをクリックして接続します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1897&quot; data-filename=&quot;013.png&quot; style=&quot;width: 262px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてmysqlデータベースに接続してuser情報を確認します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1904&quot; data-filename=&quot;014.png&quot; style=&quot;width: 637px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてユーザを一つ生成して権限を与えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1903&quot; data-filename=&quot;015.png&quot; style=&quot;width: 606px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからsql　queryの探索機を利用して接続してみましょう。&lt;/p&gt;&lt;p&gt;私はdbeaverというクエリ探索機を使います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/255.html&quot; target=&quot;_blank&quot;&gt;[tools] dbeaver(無料sql queryブラウザツール)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;プログラムを実行して新しい接続コネクションを生成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1900&quot; data-filename=&quot;016.png&quot; style=&quot;width: 201px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1906&quot; data-filename=&quot;017.png&quot; style=&quot;width: 602px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;接続するデータベースを選択して接続情報を入力しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1901&quot; style=&quot;width: 599px;&quot; data-filename=&quot;018.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;test connectionで確認すると接続が成功したことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;接続して簡単なクエリを作成して、正常に動いているかを確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1899&quot; data-filename=&quot;019.png&quot; style=&quot;width: 263px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;検索ができることを確認できました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでwindowにmariadbをインストールする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Window</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/273.html</guid><pubDate>Fri, 8 Oct 2021 18:56:05 +0900</pubDate></item><item><title>[C#] 46. データベース(MSSQL)に接続する方法</title><link>https://www.nowonbun.com/272.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でデータベース(mssql)に接続する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がプログラムを作成すればデータを格納する場合が多いですが、ioを利用するファイルで格納する方法やsocketサーバを利用して他のpcやプログラムを利用して格納する方法などの様々な方法があります。&lt;/p&gt;&lt;p&gt;でも、データを格納する方法で一番しやすいし、検索やフィルターする方法でデータベースを利用する方法があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データベースの種類はすごく多いですが、その中でoracle(オラクル)、mssql(sql-server)、mysqlあるいはmariadbがよく使うデータベースです。&lt;/p&gt;&lt;p&gt;その中でmssqlはms(microsoft)社で提供するデータベースだし、c#もms(microsoft)社で提供するプログラム言語なのでc#では他のデータベースよりmssqlが扱いしやすいです。扱いしやすいより別途のライブラリがなくても使えるデータベースです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、データベースを接続するためにはデータベースをインストールしなければならないですが、それは別途の投稿で説明します。&lt;/p&gt;&lt;p&gt;link - 予定&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データベースがインストールされたら簡単なテーブルを作成してc#プログラムで検索してみましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1888&quot; data-filename=&quot;001.png&quot; style=&quot;width: 347px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例みたいにデータベースでテーブルを作成して簡単なデータを入力しました。&lt;/p&gt;&lt;p&gt;このデータを利用してc#プログラムでデータを取得しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1886&quot; data-filename=&quot;002.png&quot; style=&quot;width: 297px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればデータベースにあるtestのテーブルのデータを読み込んでコンソールに出力しました。&lt;/p&gt;&lt;p&gt;sqlcommandクラスのインスタンスを生成してコネクションを作ってexecutereaderの関数を実行してデータを読み込みました。&lt;/p&gt;&lt;p&gt;そしてexecutereaderの関数のリターン値はsqldatareaderのインスタンスだし、sqldatareaderのread関数を利用してデータを読み込みました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1887&quot; data-filename=&quot;003.png&quot; style=&quot;width: 333px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例ではdeleteとinsertをしてデータを削除と追加しました。&lt;/p&gt;&lt;p&gt;そして関数はexecutereaderの関数ではなく、executenonqueryの関数を使って実行しました。&lt;/p&gt;&lt;p&gt;なぜならdeleteとinsertは検索の結果を取得することではなく、実行だけが重要だからです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の方法は連結指向タイプのデータベース接続だといいます。つまり、データベースからデータを一括に取得することではなく、read()関数を通って一つ一つに取得することです。連結指向タイプでシステムに関する負担は少ないと思いますが、データが多いなら、データベースのlockやトランザクションに問題がある可能性があります。&lt;/p&gt;&lt;p&gt;そのため、レコードを一つ一つに読み込む連結指向タイプではなく、データを一括に取得する非連結指向タイプの接続方法もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1887&quot; data-filename=&quot;003.png&quot; style=&quot;width: 333px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果は連結指向タイプでデータを取得することと同じです。データベースからデータを取得した結果は同じですが、データを取得する方法に関する差異があります。&lt;/p&gt;&lt;p&gt;この場合はデータを一括で取得してdatasetに格納するので、データが多くなるとプログラム側に多いインスタンス生成により逆に遅くなるしメモリ負担になります。代わりにデータベースには一括にselectして結果を送信した後なので、負担がないですね。&lt;/p&gt;&lt;p&gt;仕様に合わせて連結指向タイプで実装するか非連結指向タイプに実装するかを決めたら良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でデータベース(mssql)に接続する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/272.html</guid><pubDate>Thu, 7 Oct 2021 22:27:12 +0900</pubDate></item><item><title>[C#] 45. ネットワークソケット通信(Socket)を使い方</title><link>https://www.nowonbun.com/271.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でネットワークソケット通信(socket)を使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムとプログラム、そしてパソコンとパソコンでデータを送受信することを通信と言います。通信をもっと詳しく説明すると、伝送するパケット(データ)がパソコンのlanカードによってランケーブルに伝送します。ランケーブルに伝送したデータはdnsとルータなどを通って到達しようとpcのlanカードによって最終に目標したプログラムでパケット(データ)を読み込みます。端末と端末の間にデータを通信します。&lt;/p&gt;&lt;p&gt;この時、我々は各端末間にデータ変換や装置間のプロトコール、規約などに関して実装してないです。この通信規約に関してはすべてos側で設定して(osi7階層)、我々はその上で差し込んで使うという意味でsocket通信という言います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://ja.wikipedia.org/wiki/osi%e5%8f%82%e7%85%a7%e3%83%a2%e3%83%87%e3%83%ab&quot; target=&quot;_blank&quot;&gt;osi参照モデル&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;socket通信規約は規則が決めています。 통신 규약은 규칙이 정해져 있습니다.&lt;/p&gt;&lt;p&gt;先に通信を待つ側のpcをサーバというし、portを開いてクライアントの接続を待ちます。そして接続する側をクライアントと言うし、サーバのipとportに接続して通信が繋がります。&lt;/p&gt;&lt;p&gt;サーバとクライアント間の通信はsend、 receiveのタイプでデータを送受信します。そして通信が終わったらclose関数で接続を切ります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1121&quot; data-filename=&quot;001.gif&quot; style=&quot;width: 280px;&quot;&gt;&lt;/p&gt;&lt;p&gt;この規約を利用してc#でソケット通信を作成してみましょう。&lt;/p&gt;&lt;p&gt;先にserverを作成してwindowのtelnetプログラムを利用して接続を確認し、そして仕様に合わせてclientを作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 624px;&quot; src=&quot;./getattachfile.ajax?idx=1884&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の内容はウィンドウtelnetプログラムで私が作ったサーバプログラムに接続する例を作成しました。&lt;/p&gt;&lt;p&gt;先にプログラムを説明すればsocketクラスでサーバのsocketサーバのインスタンスを生成しました。bind関数を使って待機ポートを設定します。&lt;/p&gt;&lt;p&gt;listenで同時接続待機設定をしてaccept関数を通ってクライアントの接続を待機します。&lt;/p&gt;&lt;p&gt;プログラム上ではaccept関数が呼び出したらclient接続が発生する時までプロセスが止まることになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてtelnetプログラムで接続をすることになればaccept関数を通ってクライアントsocketインスタンスをリターンするし、sendとreceive関数を通ってサーバとクライアントからお互いにメッセージを送受信することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は私がmain関数で実装したので、一つのクライアントだけ接続ができます。つまり、クライアントが二つ以上なら接続ができない状況です。&lt;/p&gt;&lt;p&gt;そうならマルチ接続ができるようにはスレッド機能を実装しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 637px;&quot; src=&quot;./getattachfile.ajax?idx=1883&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は始めの例でtaskスレッドを利用してマルチ接続ができるように作成しました。&lt;/p&gt;&lt;p&gt;accept関数はクライアントが接続する前にスレッドが止まる形なので、クライアントで接続すれば並列でまたtaskスレッドを作成してまたループに乗ってacceptに待機状況になります。&lt;/p&gt;&lt;p&gt;ここまで簡単なサーバプログラムが作成されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のプログラムの基盤でまたクライアントを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 619px;&quot; src=&quot;./getattachfile.ajax?idx=1885&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サーバプログラムの仕様に合わせてクライアントを作成しました。&lt;/p&gt;&lt;p&gt;サーバとsend、 receive関数は似てますが、bind、 listen関数の代わりにconnect関数を使ってサーバにsocket接続します。&lt;/p&gt;&lt;p&gt;クライアントは普通の一つのサーバを接続するため、別に並列処理を作成する必要がありません。あればreceive関数だけtaskスレッドに作成して、send, receiveを分離しました。&lt;/p&gt;&lt;p&gt;仕様によりクライアントも様々にサーバを同時に接続することができますが、基本的に一つのサーバに接続をします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でネットワークソケット通信(socket)を使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/271.html</guid><pubDate>Wed, 6 Oct 2021 20:07:44 +0900</pubDate></item><item><title>[C#] 44. ファイル(FileInfo)とディレクトリ(DirectoryInfo)を扱い</title><link>https://www.nowonbun.com/270.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でファイル(fileinfo)とディレクトリ(directoryinfo)を扱いに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でioを通ってファイルを作成して読み込む方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/268.html&quot; target=&quot;_blank&quot;&gt;[c#] 42. ファイルを扱い(io)とファイルメタデータ(fileinfo)を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今度はファイルを作成して読み込みより、ディレクトリとファイルのメタデータを利用してディレクトリとファイルに関する情報を取得して探索する方法に関して説明します。&lt;/p&gt;&lt;p&gt;fileinfoクラスはファイルに関するメタデータ、つまり、ファイルのパス、サイズ、作成日時、修正日時に関する情報があります。&lt;/p&gt;&lt;p&gt;ディレクトリは実際にバイナリデータで存在することではなく、osで管理するメタデータです。fileinfoとみたいにdirectoryinfoがありますが、ディレクトリ(フォルダ)に関する情報があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1878&quot; data-filename=&quot;001.png&quot; style=&quot;width: 436px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイルのメタファイルみたいにディレクトリのメタ情報を取得することができます。&lt;/p&gt;&lt;p&gt;directoryinfoにはfileinfoと違い、ディレクトリを追加、削除があります。&lt;/p&gt;&lt;p&gt;ファイル生成は当該なファイルに関するバイナリデータが必要ですが、ディレクトリの場合はメタデータ追加、削除だけで扱えるからです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1882&quot; data-filename=&quot;002.png&quot; style=&quot;width: 305px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ディレクトリが追加されました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1879&quot; data-filename=&quot;003.png&quot; style=&quot;width: 317px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ディレクトリが削除されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてfileinfoとdirectoryinfoの場合はインスタンスを生成して使わなければならないですが、毎度、メタデータを使うためにインスタンスを生成することには気になります。&lt;/p&gt;&lt;p&gt;それでstaticクラスでもメタデータを取得することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1876&quot; data-filename=&quot;004.png&quot; style=&quot;width: 228px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;existsの関数はfileinfoとdirectoryinfoにもある関数ですが、fileとdirectoryのstaticクラスにもメタデータを使えます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このfileとdirectoryクラスで単純にファイルとディレクトリのメタ情報を取得するクラスですが、探索アルゴリズムを利用して作成すれば簡単なファイル探索プログラムを作成することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1877&quot; data-filename=&quot;005.png&quot; style=&quot;width: 625px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1880&quot; data-filename=&quot;006.png&quot; style=&quot;width: 174px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1881&quot; data-filename=&quot;007.png&quot; style=&quot;width: 278px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でディレクトリからサブディレクトリを呼び出す時にはディレクトリ探索する再帰関数を通ってサブディレクトリとサブファイルを探索します。&lt;/p&gt;&lt;p&gt;再帰関数というのはstack interruptが掛ける作業なので、性能が遅くなるし、overflow可能性もあるので、効率性が悪いですが、ソースがすごく見やすくみえるし、この探索アルゴリズムを作る時にしやすく設計と実装が可能なのでよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でファイル(fileinfo)とディレクトリ(directoryinfo)を扱いに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/270.html</guid><pubDate>Tue, 5 Oct 2021 19:29:34 +0900</pubDate></item><item><title>[C#] 43. ストリーム(Stream)とバイナリ(byte[])、エンコード(Encoding)、そしてusingを使い方とIDisposableインターフェース</title><link>https://www.nowonbun.com/269.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でストリーム(stream)とバイナリ(byte[])、エンコード(encoding)、そしてusingを使い方とidisposableインターフェースに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でファイルを扱い(io)に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/268.html&quot; target=&quot;_blank&quot;&gt;[c#] 42. ファイルを扱い(io)とファイルメタデータ(fileinfo)を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでstringデータをファイルに作成する時、encodingを使ってbyte[]配列に変換してファイルを作成するし、ファイルの内容を読み込む時にはbyte[]配列で読み込んでencodingを使ってstringに変換してコンソールに出力することまで例で説明しました。&lt;/p&gt;&lt;p&gt;我々がファイルを読み込んで作成する時、filestreamというクラスを使ってファイルを作成するし読み込みました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、streamに関する説明ですが、ストリームとは一連のデータ配列という意味です。つまり、一つのデータ値では意味がなく、データの集合あるいは配列が一つのデータとして意味になるという意味です。&lt;/p&gt;&lt;p&gt;我々がstringのデータをbyteに変換したので、utf-8の変換により英語文字の一つが一つの値で配列に格納されていますが、もし英語ではなく日本語ならどのぐらいのバイトになるでしょう？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1873&quot; data-filename=&quot;001-1.png&quot; style=&quot;width: 338px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1875&quot; data-filename=&quot;002-1.png&quot; style=&quot;width: 414px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例で最後の0x2e(46)はasciiコードのピリオドです。その以外の15バイトは日本語です。つまり、ひらがなの一文字で3バイトのサイズを持っています。&lt;/p&gt;&lt;p&gt;この「こ」になるデータは「e3 81 93」ですが、ここで一つのbyteは値は意味がありません。データの意味を持つためには3byteが合わせて、stringに「こ」というデータに認識することです。&lt;/p&gt;&lt;p&gt;これがストリームということです。一つのデータを表現するためには一連の値を配列で表すことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで説明しやすくするためにstringのデータで説明しましたが、プログラムでは使ってるリソースはイメージや動画などのデータのファイルなどがあります。そのデータはすべてバイトになっています。&lt;/p&gt;&lt;p&gt;つまり、このデータは一つのbyteの値では意味がありませんが、byteの値が一連の配列になるとイメージや動画になることです。これをストリームと言います。&lt;/p&gt;&lt;p&gt;例えば、我々がイメージプログラムでイメージをモニターに出力するため、約束したbyteの集合(規約)、データストリームが必要ということです。動画も同じ意味です。画面に連続なイメージを出力するし、合わせてスピーカーに音を出すデータ、約束したbyteの集合を動画データというし、データストリームと言います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このデータを扱うデータはほぼstreamを扱うクラスを持っています。&lt;/p&gt;&lt;p&gt;ioもそうだし、通信を通ってデータ送受信するソケットにもstreamクラスがあります。その以外に、ハードウェアの間にデータを転送することだけではなく、メモリにbyte[]のタイプではなく、ストリームタイプのままで割り当てするmemorystreamもあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このストリームはコネクション(connection)が存在しますが、データのロックと思えば良いです。データストリームは途中でデータが規約に合わせて修正できないと読めないデータになるからです。(check in, check out機能だと思えば?)&lt;/p&gt;&lt;p&gt;それで常にこのストリームは使用が終わったらclose関数でコネクション(connection)を閉めなければならにです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もちろん、プログラムが終了するとプログラムで使ったすべてのコネクションは自動に終了されますが、サーバみたいに24時間に実行しているプログラムならこのリソースコネクションもよく管理しなければならないです。&lt;/p&gt;&lt;p&gt;それで以前にはtry ~ finallyでよく使いましたが、c#にはそれよりもっとシンプルなusingキーワードでコネクションを管理することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1875&quot; data-filename=&quot;002-1.png&quot; style=&quot;width: 414px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果は同じ結果ですが、try ~ finallyよりコードが綺麗です。&lt;/p&gt;&lt;p&gt;usingキーワードはidisposableインターフェースを継承したクラスでスタックが終了すると自動にdispose関数が呼び出します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1874&quot; style=&quot;width: 177px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はusingキーワードを使うためにtestクラスを作成しました。&lt;/p&gt;&lt;p&gt;testクラスはidisposableインスタンスを継承してdispose関数を再定義します。filestreamクラスは上の流れで動くと思えば良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、始めに戻ってエンコードに関して説明します。&lt;/p&gt;&lt;p&gt;上でストリームとは一連のデータの値の配列だと説明しました。そのため、stringのデータをbyte[]に変換しなければならないですが、tochararray関数で変換とencoding.utf8.getbytesで変換する方法があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1871&quot; data-filename=&quot;004-1.png&quot; style=&quot;width: 411px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考でcharとbyteの関係はunsigned char、符号ないcharタイプがbyteタイプです。なので、charとbyteは同じデータを扱うデータタイプです。&lt;/p&gt;&lt;p&gt;それでstringでtochararray関数を使ってcharに変換することができますが、英語やasciiコードで表現する値はencodingで変換することと同じ結果で出力されます。&lt;/p&gt;&lt;p&gt;でも、日本語はasciiコードで表現することができません。つまり、c#だけではなく、メモ帳などの他のプログラムでも読み込まれるためにはエンコードが必要です。上にはutf-8のencodingタイプで変換しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1872&quot; data-filename=&quot;005.png&quot; style=&quot;width: 493px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メモ帳で文字タイプを確認すればutf-8で作成されていることを確認できます。&lt;/p&gt;&lt;p&gt;なので、一般的に文字列(string)をbyte[]に変換する時にはencodingクラスを使ってbyte[]配列に変換してfilestreamでファイルを作成、読み込みします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でストリーム(stream)とバイナリ(byte[])、エンコード(encoding)、そしてusingを使い方とidisposableインターフェースに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/269.html</guid><pubDate>Mon, 4 Oct 2021 18:34:18 +0900</pubDate></item><item><title>[C#] 42. ファイルを扱い(IO)とファイルメタデータ(FileInfo)を使い方</title><link>https://www.nowonbun.com/268.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でファイルを扱い(io)とファイルメタデータ(fileinfo)を使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムで使う代表的な装置リソースならファイル扱い(ファイルで書込、読取、io)と通信ソケット(socket)があります。&lt;/p&gt;&lt;p&gt;このファイル扱いは英語の略語でioといいますが、ioはinput ouputで入出力という意味です。入出力装置ならマウス、キーボード、モニターなどがありますが、プログラムでioといいならファイルを扱うリソースだと思えば良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がプログラムを使う時にプログラムを終了すればメモリに格納したデータはすべてなくなります。そのために、プログラムでデータを保管する方法の一つでファイルで格納する方法があります。&lt;/p&gt;&lt;p&gt;ファイルはbyteタイプで構成されているし、プログラムではunsigned char(byte)で構成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1864&quot; style=&quot;width: 424px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私はdドライブでworkというフォルダでtest.txtというファイルを作成しました。&lt;/p&gt;&lt;p&gt;内容はhello worldで正確にスペースまで11バイトを生成します。結果をみればファイルサイズが11バイトで生成されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイルをtxtファイルで作成し、stringデータをencodingを通ってbyteタイプに変換しました。&lt;/p&gt;&lt;p&gt;そのため、メモ帳で該当のファイルを開くとhello worldの内容が作成されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして、最終的にリソースを使った後にはclose関数で閉めなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はファイルのデータを読み込んでコンソールに表示しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1865&quot; data-filename=&quot;002.png&quot; style=&quot;width: 276px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上はファイルを読み取ってコンソール出力する例です。&lt;/p&gt;&lt;p&gt;ファイルメタデータでファイルの情報を読み取ってファイルサイズ程にbyte配列を生成します。&lt;/p&gt;&lt;p&gt;そしてstreamで読み取ってstringに変換しました。変換した内容をまたコンソールに表示するとhello worldが表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここのencodingとバイナリ(byte[])に関しては別の投稿で詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先、filestreamに関して始めのパラメータは対象ファイルのパス、ファイルモード、ファイルアクセス権限設定でストリームを生成します。&lt;/p&gt;&lt;p&gt;ファイルモードではcreate、open、write、createnew、appendを使ったらcreateはファイルを生成する(既存ファイルがあれば上書き)、createnewもファイル生成しますが、既存ファイルがあればエラーを発生します。&lt;/p&gt;&lt;p&gt;openは既存ファイルを読み取り、writeとappendは書き込みですが、writeは既存の内容を作成して初めから作成すること、appendは既存内容から続けて作成することの差異があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1866&quot; data-filename=&quot;003.png&quot; style=&quot;width: 194px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイルアクセス権限はreadは読み取り、writeは書き込み、readwriteは読み取り、書き込みの機能が同時にあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1867&quot; data-filename=&quot;004.png&quot; style=&quot;width: 200px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてstreamは使った後で必ずcloseでリソースを閉めなければならないです。なぜならstreamがopenになっている状況ならファイルリソースを捕まっているからです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1869&quot; style=&quot;width: 848px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドで並列処理を作成した後、各のスレッドでfilestreamを生成してファイルの書き込みを作成しました。そして最後にstream.close()をコメント処理して実行しました。&lt;/p&gt;&lt;p&gt;そうすれば実行中でエラーが発生しました。エラー内容は他のプロセスで該当のリソースが使っているので、アクセスができませんというエラーが発生しました。&lt;/p&gt;&lt;p&gt;我々が仕事する時にエクセルやファイルを同時に開くと発生するエラーと似ている概念です。streamでファイルリソースを捕まったら他のプログラムや他の実行領域で使われないというエラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてファイルのデータは実はバイナリデータしかありません。上の例でhello worldの11byteのデータを書き込んだらサイズは正確に11byteになることを確認できます。&lt;/p&gt;&lt;p&gt;でも、ファイル情報をみればファイル名から作成日時、変更日時、アクセス日時などのデータがありますが、ファイルにこの情報があることではなく、osでファイルの情報を持っていますが、それをメタデータと言います。&lt;/p&gt;&lt;p&gt;このメタデータはfileinfoクラスを利用して情報を取得、変更することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1868&quot; style=&quot;width: 353px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてこのメタデータは修正も可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1870&quot; style=&quot;width: 421px;&quot; data-filename=&quot;007.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メタデータを修正してファイル情報を確認するとすべて1990年度に作成してアクセスしたことになっていることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でファイルを扱い(io)とファイルメタデータ(fileinfo)を使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/268.html</guid><pubDate>Mon, 4 Oct 2021 18:33:35 +0900</pubDate></item><item><title>[C#] 41. Taskクラスとasync、awaitを使い方</title><link>https://www.nowonbun.com/267.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はtaskクラスとasync、awaitを使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でthreadに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/38.html&quot; target=&quot;_blank&quot;&gt;[c#] 37. スレッド(thread)を使い方、thread.sleep関数を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドとは並列処理だということを何度も説明したので、この投稿では省略します。&lt;/p&gt;&lt;p&gt;threadを生成する時にシステムのリソースを使って逆にthreadが多すぎるならシステムの性能が落ちます。そのためスレッドプールに生成してスレッドの個数制限、スレッドのリソースを再活用してシステムの性能を改善することができます。&lt;/p&gt;&lt;p&gt;でも、スレッドプールはスレッドのステータスを制御することができないので、スレッドが終了する時まで待つ(join)機能を実装しなければならない不便があります。&lt;/p&gt;&lt;p&gt;taskはthreadpool中で動くスレッドだし、threadみたいに簡単に生成してjoin機能まで使える機能があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1861&quot; style=&quot;width: 286px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみれば先にthreadpoolで設定したスレッド制限設定がtaskで宣言したスレッドにも影響されることを確認できます。&lt;/p&gt;&lt;p&gt;つまり、実装はthreadみたいに簡単に使えますが、内容はthreadpoolで動くことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてthreadpoolと違い、return値を受け取ることができて1から5まで足すと15、スレッドが5個なので総合の75の結果が出ることを確認できます。&lt;/p&gt;&lt;p&gt;lockを使えなくても各スレッドで結果の値を受け取ってメインプロセスでスレッドの値を受け取って使えます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてtaskの別の機能はasync、awaitキーワードと密接な関係があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1863&quot; style=&quot;width: 365px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;始めの例と結果は同じですが、taskをもっと扱いやすく実装されています。&lt;/p&gt;&lt;p&gt;asyncが宣言された関数でtaskを生成して実行し、awaitでスレッドが終了するまで待機します。&lt;/p&gt;&lt;p&gt;そして結果をリターンするならmainプロセスで結果を合算して結果が出ることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでtaskとasync、awaitの基本構造です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1862&quot; data-filename=&quot;003.png&quot; style=&quot;width: 272px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;taskでcontinuewithの関数を提供しますが、これは各スレッドが終了すれば続けて処理するラムダ処理です。&lt;/p&gt;&lt;p&gt;状況により他のtaskスレッドを付けることもできるし、様々な実行を連結して実行できる関数です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;taskは.net framework 4.0から追加された機能なので、もし以前のプレームワークならthreadpoolを使わなければならないです。&lt;/p&gt;&lt;p&gt;私も最近までthreadpoolをよく使いましたが、taskスレッドの使い方に適応した後はtaskスレッドがすごく慣れて、threadやthreadpoolはもう使いませんね。&lt;/p&gt;&lt;p&gt;そしてasync、awaitのキーワードにより可読性もすごくよくなり、個人的に並列処理を作成するならtaskを利用して作成することをお勧めします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでtaskクラスとasync、awaitを使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/267.html</guid><pubDate>Fri, 1 Oct 2021 18:59:14 +0900</pubDate></item><item><title>[C#] 40. Linqを利用した並列処理(Parallel)を使い方</title><link>https://www.nowonbun.com/215.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でlinqを利用した並列処理(parallel)を使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿で私がthreadに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/38.html&quot; target=&quot;_blank&quot;&gt;[c#] 37. スレッド(thread)を使い方、thread.sleep関数を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドというのはプログラム内でいろんな処理を同時に処理、つまり、同時に処理してシステムの性能を向上させる機能です。&lt;/p&gt;&lt;p&gt;でも、このスレッドは個数が無限的に増やすこともできないし、どのぐらいにスレッドが多くなると性能低下になるため、個数管理するthreadpoolが存在します。しかし、このthreadpoolはjoin機能が無くて、eventwaithandleクラスで同期化する機能を別に作成しなければならない不便なこともあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;linq式ではこの問題を解決する並列処理を作成できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1859&quot; style=&quot;width: 216px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればnodeクラスのインスタンスをlistに格納して、linq式のasparallel関数を呼び出すことなら並列処理になります。&lt;/p&gt;&lt;p&gt;withdegreeofparallelismの関数を通ってparallelのスレッドの最大個数を設定してforallを通って実行します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;forallはラムダ式で設定してパラメータはlistに設定されたnodeインスタンスを取得して実行します。&lt;/p&gt;&lt;p&gt;ここまで見るとthreadとthreadpoolの欠点がなくなる機能ではないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;parallel機能をlistだけ付けて使うことではなく、staticタイプのクラスで独立的に使うことができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1860&quot; style=&quot;width: 186px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;parallelクラスの並列処理は基本の形はfor関数です。&lt;/p&gt;&lt;p&gt;意味はforの初期式、条件式、増減式をparallelで設定することです。つまり、forを並列に処理することです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1858&quot; data-filename=&quot;003.png&quot; style=&quot;width: 231px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;parallelのforeachはforeach文を並列に処理する関数です。&lt;/p&gt;&lt;p&gt;形式はlistタイプのデータを始めのパラメータに入れて、ラムダ式で各データを取得して並列処理になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1857&quot; style=&quot;width: 212px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のれ例は別に関係ないラムダ式を並列処理にしました。invoke関数のパラメータはparamsの処理なので可変的にラムダ式を入れられます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿を作成しながら思いましたが、linq式のasparallel()の関数は自分もよく使える関数です。parallelクラスは別に使ったらいい利点がなさそうです。&lt;/p&gt;&lt;p&gt;実は私も投稿を書く前には単純にasparallelをstatic関数スタイルで表現する方法だと思ったのに、それではないですね。&lt;/p&gt;&lt;p&gt;性能上の利点もないし、スレッドを管理する関数やプロパティもないし、単純にfor文を並列に処理することですが、これを使うことよりthreadpoolを使う方がもっといいではないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でlinqを利用した並列処理(parallel)を使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/215.html</guid><pubDate>Wed, 29 Sep 2021 19:29:03 +0900</pubDate></item><item><title>[C#] 39. lockキーワードとdeadlock(デッドロック)</title><link>https://www.nowonbun.com/40.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のlockキーワードとdeadlock(デッドロック)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でスレッドに関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/38.html&quot; target=&quot;_blank&quot;&gt;[c#] 37. スレッド(thread)を使い方、thread.sleep関数を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドとはプロセスの中で同時にいろんな処理を実行するための並列処理ということに説明しました。それならこの並列処理を処理する時に、一つのインスタンスや変数に値を処理するとどのようになるかな？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1854&quot; data-filename=&quot;001.png&quot; style=&quot;width: 282px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみると0から10まで足すスレッドを10回に実行しました。&lt;/p&gt;&lt;p&gt;なので、0から10まで足すと55だし、10回に実行したので予想する結果の値は550が出力することが正常です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも結果は550ではなく481ですね。望んだ結果が出ませんでした。&lt;/p&gt;&lt;p&gt;理由はsumに値を足す時、sumの値が0の場合、始めのスレッドで1を足して1になるし、二つ目のスレッドで足す時に、1を足して2がなると予想します。&lt;/p&gt;&lt;p&gt;でも、threadというのは並列処理なので、始めのスレッドで0から1を足す時、二つ目のスレッドで1から2になることが確かではありません。つまり、始めから0から1を足す時、二つ目のスレッドで1を足す時、まだsumの値が始めのスレッドで1になる前なので、sumの値が0の可能性があります。&lt;/p&gt;&lt;p&gt;改めて説明すると、始めスレッド、二つ目のスレッドで0から1を足すことになります。そのように重なる処理が多くなるとsumの値が550まで届かないことになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドは少し早い処理のため、並列処理をしますが、予想する値が出ないなら意味がありません。&lt;/p&gt;&lt;p&gt;しかし、スレッド、このすべての並列処理でsumに足す処理だけスレッドをすべて同期化したらこの問題が解決になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1856&quot; data-filename=&quot;002.png&quot; style=&quot;width: 241px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスインスタンスにlockを掛けたらlock掛けた領域を使ったら他のlockを掛けるところでlockを通過することを待つことになります。&lt;/p&gt;&lt;p&gt;つまり、並列処理の始めのスレッドでlock(node)を通過することになると二つ目のスレッドでの始めのスレッドのlock(node)のスタック領域が終了するまで待機することになります。&lt;/p&gt;&lt;p&gt;そうなら始めのスレッドのlock(node)でスタックが終了になると二つ目のスレッドのlock(node)が通過して三つ目のスレッドのlock(node)が待機することになります。その順番とおりにlock(node)領域を通過することになるので結論は同時に値が足すことは発生しません。&lt;/p&gt;&lt;p&gt;すべてのスレッドでnodeインスタンスに関して同期化になりました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;lockのキーワードは原始データタイプ、つまりint char byteみたいのデータタイプにはできずに無条件にクラスタイプのインスタンスだけにlockを掛けることができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1855&quot; data-filename=&quot;003.png&quot; style=&quot;width: 292px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例の結果をみればスレッドがlockにより止まりました。&lt;/p&gt;&lt;p&gt;ここでlockが重ねていることが問題ではありません。状況によりlockを重ねて実装することができますが、上みたいに実装するとデッドロック(deadlock)になります。&lt;/p&gt;&lt;p&gt;理由はactionの始めの呼び出しのパラメータでnode1とnode2を入れて、二つの目の呼び出しのパラメータでnode2とnode1に順番を変わって入れました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうなるとaction関数の始めのスレッドでnode1インスタンスにlockを掛けて、その同時に二つ目のスレッドでnode2インスタンスにlockを掛けます。&lt;/p&gt;&lt;p&gt;また、始めのスレッドでnode2のlockに入ろうと思えば、二つ目のスレッドでnode2がロックに掛けているのでロックが解けるまで待ちます。&lt;/p&gt;&lt;p&gt;二つ目のスレッドでnode1のlockに入ろうと思えば、始めのスレッドでnode1がロックに掛けている状況でロックが解けるまで待ちます。つまり、両方のlockがお互いのlockが解けるまで待つことのデッドロック(deadlock)になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;デッドロックとはお互いのlockの領域でlockが掛けている状況でお互いのlockが解けるまで永遠に待つことの意味です。デッドロックになると別にエラーが発生することではなく、そのままプログラムが止まる状況ですが、問題はプログラム上でデッドロックになる部分を探すことは簡単ではありません。&lt;/p&gt;&lt;p&gt;それでプログラムを作成する時、デッドロックにならないように設計を気を付けなければならないですが、一番の重要なlockを重ねないように作成することが重要です。&lt;/p&gt;&lt;p&gt;当たり前にデッドロックが発生しやすいように上みたいに作成しません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1853&quot; data-filename=&quot;004.png&quot; style=&quot;width: 194px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;lockが重ねみたいに見えないようにlockを関数に実装しました。でも、結局に処理流れはlockが重ねているのでデッドロック(deadlock)になります。&lt;/p&gt;&lt;p&gt;つまり、実務でもこのみたいに作成してデッドロック(deadlock)になる場合はすごく多いです。関係ない関数で各のインスタンスにlockを掛けますが、デッドロックになる場合です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;デッドロックにならないため、何個かのルールがあります。&lt;/p&gt;&lt;p&gt;まず、lockを掛けるインスタンスはできれば一つに統一にすることが良いです。実は設計上でデータの変換や使うインスタンスにlockを掛けることが良いですが、lock専用のobjectタイプのインスタンスを生成してlockを管理することが良いです。&lt;/p&gt;&lt;p&gt;そしてlockの領域をできれば小さいスタックで作成する方が良いです。lockだけでは性能には影響がありませんが、lockの中で処理が遅くなると他の同期化になるlockでlockが終了するまで待機をすることになるので結論的に性能が遅くなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のlockキーワードとdeadlock(デッドロック)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/40.html</guid><pubDate>Tue, 28 Sep 2021 19:17:28 +0900</pubDate></item><item><title>[C#] 38. ThreadPoolの使い方</title><link>https://www.nowonbun.com/39.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のthreadpoolの使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でthreadに関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/38.html&quot; target=&quot;_blank&quot;&gt;[c#] 37. スレッド(thread)を使い方、thread.sleep関数を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;threadとはプログラム内で並列処理のための機能です。&lt;/p&gt;&lt;p&gt;でも、このthreadは個数を制御することができないと逆にプログラムの性能が落ちるということも説明しました。そのため、thread個数を管理することも作成しなければならないですが、.net frameworkにはこのthreadの個数を管理する機能があり、それがthreadpoolです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1850&quot; data-filename=&quot;001.png&quot; style=&quot;width: 207px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば私がthreadpoolクラスを利用してスレッドを総5個生成します。&lt;/p&gt;&lt;p&gt;でも、threadpoolには同時に実行するスレッド個数は0個から最大に2個まで生成されるように設定しました。つまり、threadを無制限に生成して実行することではなく、pool中で総量を設定してその以上は待機状況に待ちます。&lt;/p&gt;&lt;p&gt;つまり、結果を見ても、aとbは同時に実行されますが、cからはbが終了された状況で実行されることを確認でいます。threadを最大に2個を実行しますが、その以上は実行されない設定でthreadpoolを管理します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;threadpoolにはthreadの生成を管理することになります。&lt;/p&gt;&lt;p&gt;でも、このthreadpoolはjoin関数がないので、threadのすべてが終了する時まで待つ関数がありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1852&quot; data-filename=&quot;002.png&quot; style=&quot;width: 327px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はthreadpooljoinという関数を作成してthreadpoolで使えるスレッド個数を確認してスレッドを使える最大量と同じなら無限ループが終了することでjoin関数を作成しました。&lt;/p&gt;&lt;p&gt;簡単なプログラムなら上みたいにthreadpoolを制御することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;問題は大きいプログラムならthreadpoolクラスの特性がstaticなのでどのところで使っているか確認することが難しいです。&lt;/p&gt;&lt;p&gt;ですから設計しているところでthreadpoolの使いが終了しました。と思っても、ライブラリや他のクラスでthreadpoolを使うと思えば、待機状況の個数でjoinをコントロールすると予想できないバグが発生する可能性があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでtaskで使えるeventwaithandleを利用すれば部分的にthreadpoolを制御することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1851&quot; data-filename=&quot;003.png&quot; style=&quot;width: 232px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;listをローカル変数に設定してwaithandle.waitallから並列に変換すればthreadpoolが終了する時まで制御ができます。&lt;/p&gt;&lt;p&gt;threadpoolが全体に使っているスレッド個数を制御することですごく便利ですが、生成されたスレッドを待つ機能(join)に関してはずいぶん大変ですね。&lt;/p&gt;&lt;p&gt;でも、性能のためにthreadをそのままに使うことよりthreadpoolを利用することがシステム性能のためにもっといい機能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考でsetminthreads関数とsetmaxthreads関数でスレッド個数の制御を設定しても、threadで生成されるスレッドには影響がありません。つまり、poolの設定を2個だけ設定してもthreadインスタンスは10個を設定することが可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のthreadpoolの使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/39.html</guid><pubDate>Mon, 27 Sep 2021 19:33:26 +0900</pubDate></item><item><title>[C#] 37. スレッド(Thread)を使い方、Thread.Sleep関数を使い方</title><link>https://www.nowonbun.com/38.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でスレッド(thread)を使い方、thread.sleep関数を使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がプログラムを作成して実行するとソースの順番とおりに実行されることが基本流れです。&lt;/p&gt;&lt;p&gt;これがプロセスということにします。つまり、プログラムが実行して終了するまでは一つのプロセスが実行することです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1849&quot; data-filename=&quot;001.png&quot; style=&quot;width: 216px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は0から9までの繰り返しを2回実行します。&lt;/p&gt;&lt;p&gt;同然にa =の出力が先に実行して終了すると、b =の出力が次に実行します。これが一つのプロセスです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、仕様によりこの二つのfor文を並列で同時に実行したい時があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1844&quot; data-filename=&quot;002.png&quot; style=&quot;width: 207px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば始めのスレッドと2つ目のスレッドが同時に実行してコンソールに無作為で出力されることを確認できます。&lt;/p&gt;&lt;p&gt;つまり、上の例は一つのプロセスで2つのスレッドが実行したことです。3つの並列処理が実行されることです。&lt;/p&gt;&lt;p&gt;例を見れは&quot;press any key...&quot;が先に出力されることを確認できますが、これはスレッドを実行することに少しディレイが発生したのでプロセス処理が先に出力されてしまうことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドを使う方法はthreadクラスのインスタンスを生成して、コンストラクタのパラメータは返却値とパラメータがないデリゲートで受け取ります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1845&quot; data-filename=&quot;003.png&quot; style=&quot;width: 189px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでこのthread関数には変数を渡せないので、上のラムダ式を使ってクロージャ(closure)機能を利用して変数を渡す方法をよく使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1848&quot; data-filename=&quot;004.png&quot; style=&quot;width: 274px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで、上の例をみればthreadを使ってfor文で値を足したが、結果は0が出力されました。&lt;/p&gt;&lt;p&gt;理由はスレッドが終了する時まで待たなくて、プロセスが先に実行されるからです。つまり、コンソールが出力される時にはsumの変数の値が0からです。並列で実行されるのでコンソールが出力された後でsumの変数が変わりそうですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;並列処理をすれば性能は速くなるけど、プロセスでスレッドの値をしっかり受け取ることができないと意味がありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1846&quot; style=&quot;width: 217px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;thread1変数でjoin関数を使ったらプロセスでスレッドが終了する時まで待ってる役割します。つまり、何個のスレッドを使ったらjoin関数を使ってプロセスと同期化するとプログラムを早く処理することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、仕様によりthreadをわざと処理を遅くなることもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1847&quot; style=&quot;width: 203px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;thread.sleep()関数を利用してスレッドを1秒間に停止します。sleep関数ではミリ秒単位で設定するので1000を入れると1秒になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドはプロセスを並列処理が可能にする機能です。適切に使ったらプログラムの性能を飛躍的に上がることができます。&lt;/p&gt;&lt;p&gt;でも、スレッドというのは一つのリソースなので、限界があります。つまり、スレッドを無限に作成することで無限に早くなることではなく、.net frameworkでスレッドリソースを管理するので、どのほど多くなると逆に遅くなります。&lt;/p&gt;&lt;p&gt;それで簡単な処理する計算式ならスレッドを生成して管理する部分でもっと遅くなるのでスレッドを使わない方が速いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムでリソースを管理(ファイル管理、通信管理など)する処理かユーザのイベントを待つ処理などでスレッドをよく使います。&lt;/p&gt;&lt;p&gt;理由はプロセス速度とリソース間の速度差異があるのでそのギャップを減らすためによく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でスレッド(thread)を使い方、thread.sleep関数を使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/38.html</guid><pubDate>Fri, 24 Sep 2021 20:40:58 +0900</pubDate></item><item><title>[C#] 36. 拡張メソッドを使い方</title><link>https://www.nowonbun.com/37.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#の拡張メソッドを使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でc#のメソッド(関数)を使い方に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/10.html&quot; target=&quot;_blank&quot;&gt;[c#] 9. 関数(method)とオーバーロード、再帰呼び出し&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関数というのはクラス内でデータを変更、処理する機能という文法です。&lt;/p&gt;&lt;p&gt;クラスを作成して関数を作って、クラスの外部から呼び出すことに関してはよく知っています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、我々がプロジェクト内で作成したクラスではなく、.net frameworkで提供するクラスや外部ライブラリから取得するクラスに関して関数を追加したい場合はどうしよう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1841&quot; style=&quot;width: 269px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は基本的に関数生成と使う方法に関することです。&lt;/p&gt;&lt;p&gt;でも、もっとしやすくするためにconverttointfromstring関数がstringクラスの関数みたいに設定したいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1842&quot; style=&quot;width: 260px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;始めの例と差異は拡張関数をstatic classに関数を生成しなければならないです。&lt;/p&gt;&lt;p&gt;staticが付けたらプログラムが起動する時、一括的に読み込みますが、その時に既存のstringクラスに関数を追加する役割をするらしいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;拡張関数はstaticで生成すること、始めのパラメータにthisを付けて該当のクラスの拡張関数になります。&lt;/p&gt;&lt;p&gt;使用方法はstringでの関数みたいに使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1843&quot; data-filename=&quot;002.png&quot; style=&quot;width: 540px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;visual studioのインテリジェンス(自動完成機能)にも関数があるみたいに制御になります。&lt;/p&gt;&lt;p&gt;そして拡張関数で設定しても既存方法みたいに一般関数を呼び出すことにも使うこともできます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一般プロジェクトで処理機能だけある関数の場合、普通はutilやcommon、defineのクラスを作成して管理します。&lt;/p&gt;&lt;p&gt;その方法が悪いことではないですが、このみたいに拡張関数で設定して置いたら可読性やソース整理することにすごく良いと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#の拡張メソッドを使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/37.html</guid><pubDate>Thu, 23 Sep 2021 18:08:59 +0900</pubDate></item><item><title>[C#] 35. 文字列クラス、StringとStringBuilderを使い方</title><link>https://www.nowonbun.com/36.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#で使う文字列クラス、stringとstringbuilderを使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラム上で使う原始データタイプは整数と実数タイプが多いですが、文字列はstringタイプで一つです。&lt;/p&gt;&lt;p&gt;正確にはstringタイプは原始データタイプではなく、charの配列タイプになっているクラスタイプです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、文字はasciiコートになっている整数タイプでそのデータタイプはcharです。&lt;/p&gt;&lt;p&gt;改めて説明するとstringはcharの配列タイプで定義しているし、プログラム内ではstringタイプにデータを格納すると文字列で出力されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1830&quot; data-filename=&quot;001.png&quot; style=&quot;width: 456px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればstringタイプをchar[]配列タイプに変換になり、char[]配列タイプがstringタイプに変換することができることを確認でいます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://ja.wikipedia.org/wiki/ascii&quot; target=&quot;_blank&quot;&gt;アスキーコード&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで整理すると、stringはchar[]の配列タイプになっているし、その整数の値はアスキーコードになっていることに説明しました。&lt;/p&gt;&lt;p&gt;ここで詳しく考えることはcharのデータサイズは1byteで2^8になっているし、その値の範囲は0~255(unsigned char)になっています。つまり、サイズが256ですが、世界のすべての文字を256のサイズで表現できません。&lt;/p&gt;&lt;p&gt;日本語だけ見ても漢字が256個以上にありますが、そのため、文字列エンコードのutf-8があります。&lt;/p&gt;&lt;p&gt;実はこのエンコードタイプに関しても内容が複雑だし、説明する部分が多いですが、今の標準のエンコードタイプはutf-8で統一になっているし、今はほぼエンコードタイプがutf-8だと思えば良いです。&lt;/p&gt;&lt;p&gt;このutf-8のエンコードタイプは可変長さ文字列で最小1byteから4byteまで使って文字列を表現します。つまり、2^32になるので、役42億個の文字を表現できます。&lt;/p&gt;&lt;p&gt;詳細な部分はbyteとエンコード部分で詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、stringの説明に戻って、c#でstringのデータ構成はchar[]配列だし、構造はクラスタイプになっています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1839&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stringクラスには文字列を扱うための関数があります。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;isnullorempty、isnullorwhitespace&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;stringはクラスなので、nullがあります。なのでnullの値は比較演算子で値の可否を確認できますが、nullではない文字列がないstringもあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1836&quot; data-filename=&quot;003.png&quot; style=&quot;width: 200px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;文字列関係の関数の中でよく使うことがisnullorempty、isnullorwhitespace関数です。&lt;/p&gt;&lt;p&gt;isnulloremptyの場合はnullあるいは文字列がない場合はtrueをリターンするし、isnullorwhitespaceの場合は空白だけあればtrueをリターンする文字確認関数です。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;substring、trim、remove、replace、split&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;上の関数は文字列を分離するか取り除く関数です。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1833&quot; data-filename=&quot;004.png&quot; style=&quot;width: 244px;&quot;&gt;&lt;/p&gt;&lt;p&gt;substringは文字列を分離して取得する関数だし、trimは空白を取り除く、removeは文字を取り除く、replaceは文字変換です。&lt;/p&gt;&lt;p&gt;splitは文字列を分ける関数です。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;indexof、lastindexof&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;文字列の位置を取得する関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1840&quot; data-filename=&quot;005.png&quot; style=&quot;width: 231px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;文字列を位置を計算する関数です。もし、文字列で検索しようと文字が無ければ-1をリターンします。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;toupper、tolower&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;toupperとtolowerは英語文字列だけ処理できる関数です。&lt;/p&gt;&lt;p&gt;toupperは文字列のすべて文字を大文字で、tolowerは文字列のすべての文字を小文字に変換する関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1832&quot; data-filename=&quot;006.png&quot; style=&quot;width: 212px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;compare、equals&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;文字列の比較関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1834&quot; data-filename=&quot;007.png&quot; style=&quot;width: 302px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;concat, join&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;文字列を合併する関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1835&quot; data-filename=&quot;008.png&quot; style=&quot;width: 231px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;format&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;string内でフォーマットする機能です。&lt;/p&gt;&lt;p&gt;フォーマットとはintの値をstringに変換する時に、小数点の2桁までの表現などのフォーマットを決定する機能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1838&quot; data-filename=&quot;009.png&quot; style=&quot;width: 240px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;&lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;  &lt;tbody&gt;&lt;tr&gt;    &lt;td colspan=&quot;4&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;数字フォーマット&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;   &lt;th&gt;文字タイプ&lt;/th&gt;   &lt;th&gt;説明&lt;/th&gt;   &lt;th&gt;使い方&lt;/th&gt;   &lt;th&gt;例&lt;/th&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td&gt;c&lt;/td&gt;   &lt;td&gt;お金表示&lt;/td&gt;   &lt;td&gt;{0:c}&lt;/td&gt;   &lt;td&gt;$ 55,674.74&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td&gt;e&lt;/td&gt;   &lt;td&gt;指数表示&lt;/td&gt;   &lt;td&gt;{0:e}&lt;/td&gt;   &lt;td&gt;5.567474e+004&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td&gt;f&lt;/td&gt;   &lt;td&gt;固定小数点&lt;/td&gt;   &lt;td&gt;{0:f}&lt;/td&gt;   &lt;td&gt;55674.74&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td&gt;g&lt;/td&gt;   &lt;td&gt;標準&lt;/td&gt;   &lt;td&gt;{0:g}&lt;/td&gt;   &lt;td&gt;55674.73789621&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td&gt;n&lt;/td&gt;   &lt;td&gt;1000単位でコンマ表示&lt;/td&gt;   &lt;td&gt;{0:n}&lt;/td&gt;   &lt;td&gt;55,674.74&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;    &lt;td colspan=&quot;4&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;フォーマット&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td&gt;0&lt;/td&gt;   &lt;td&gt;0プレースホルダ&lt;/td&gt;   &lt;td&gt;{0:00.00}&lt;/td&gt;   &lt;td&gt;55674.74&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td&gt;#&lt;/td&gt;   &lt;td&gt;数字のプレースホルダ&lt;/td&gt;   &lt;td&gt;{0:(#).##}&lt;/td&gt;   &lt;td&gt;(55674).74&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td&gt;.&lt;/td&gt;   &lt;td&gt;小数点&lt;/td&gt;   &lt;td&gt;{0:0.000}&lt;/td&gt;   &lt;td&gt;55674.738&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td&gt;,&lt;/td&gt;   &lt;td&gt;千単位の区切り記号&lt;/td&gt;   &lt;td&gt;{0:0,0}&lt;/td&gt;   &lt;td&gt;55,675&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td&gt;%&lt;/td&gt;   &lt;td&gt;パーセント&lt;/td&gt;   &lt;td&gt;{0:0%}&lt;/td&gt;   &lt;td&gt;5567474%&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;ここでよく使うstringの関数を整理しました。&lt;/p&gt;&lt;p&gt;string.formatの場合は以前によく使う方法で、最近は補間式(interpolation)で簡単に使います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/208.html&quot; target=&quot;_blank&quot;&gt;[c#] stringの補間式(interpolation)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でも文字列を合併することでconcatを使うという説明しましたが、実は演算記号でも文字列を合併することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1837&quot; style=&quot;width: 193px;&quot; data-filename=&quot;010.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、この方法の文字列の合併はdata1と空白が一つあるstringが合併する時に他のstringインスタンスが生成されます。&lt;/p&gt;&lt;p&gt;また、そのインスタンスでdata2のデータが合併して、他のstringのインスタンスが生成されます。&lt;/p&gt;&lt;p&gt;つまり、concatや演算子を使ってstringの文字列合併は合併するたびに新しいインスタンスを生成することです。&lt;/p&gt;&lt;p&gt;参考でこのインスタンスを生成するリソースはずいぶん遅いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでインスタンスを生成せずに、連続的にメモリに付けたらどうでしょう。インスタンスを生成する時間を節約することができるのでプログラム性能が良くなります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1831&quot; data-filename=&quot;011.png&quot; style=&quot;width: 256px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果を見るとstringbuilderから文字列を合併するのが圧倒的に早いです。&lt;/p&gt;&lt;p&gt;文字列のデータを処理することではstringクラスの関数を利用してstring値を計算するのが速いですが、文字列を合併するか削除、取り除くの時はstringbuilderを使う方が良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#で使う文字列クラス、stringとstringbuilderを使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/36.html</guid><pubDate>Wed, 22 Sep 2021 18:08:53 +0900</pubDate></item><item><title>[C#] 34. 最上位クラス(Object クラス)</title><link>https://www.nowonbun.com/35.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿は最上位クラス(object クラス)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#にはオブジェクトの最小単位がクラスになっています。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/11.html&quot; target=&quot;_blank&quot;&gt;[c#] 10. クラスを作成する方法(コンストラクタ、デストラクタ)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのクラスは基本的にobjectのクラスを継承することになっています。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/14.html&quot; target=&quot;_blank&quot;&gt;[c#] 13. クラスの継承と再定義(override)する方法、overrideとnewの差異&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その意味はクラスの隣に継承する定義をしなくてもobjectクラスを継承します。つまり、c#に存在するすべてのクラスはobjectクラスを継承します。&lt;/p&gt;&lt;p&gt;objectクラスの基本構成は下記通りです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1828&quot; data-filename=&quot;001.png&quot; style=&quot;width: 540px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的にstaticが付けてないequals関数は比較(クラスの中でメンバー変数のデータではなく、インスタンスが同じかを比較)関数、gethashcode関数はポインタアドレスをhashデータで変換した値、gettypeはクラスのデータタイプ、tostringはクラスをstringタイプに表す関数、memberwisecloneの関数はデザインパターンのプロトタイプのクラスインスタンスコピー(ポインタコピーではなく、クラスのデータがすべて複製)があります。&lt;/p&gt;&lt;p&gt;つまり、すべてのクラスは上の関数を基本的に継承して使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1829&quot; data-filename=&quot;002.png&quot; style=&quot;width: 285px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればprogramクラスはobjectクラスを明示的に継承してないです。でも、objectの関数を使えますね。&lt;/p&gt;&lt;p&gt;つまり、明示的に継承することを実装しなくても、クラスは基本的にobjectクラスを継承することを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてequals関数とgethashcode関数、tostring関数はvirtualキーワードが付けているので再定義も可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1826&quot; style=&quot;width: 289px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例ををみればequals関数とgethashcode関数、tostring関数を再定義します。&lt;/p&gt;&lt;p&gt;なのでgethashcodeの関数は常にインスタンスポインタアドレスではない可能性もあります。参考にstringクラスのgethashcodeはポインタアドレスではなく、リテラル値です。&lt;/p&gt;&lt;p&gt;stringに関しては他の投稿で詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;objectのクラスは最上位クラスになるので、変数宣言する時、どのインスタンスでも変数のデータタイプに設定することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1827&quot; data-filename=&quot;004.png&quot; style=&quot;width: 627px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;objectクラスにはprintという関数がないので、エラーが発生します。&lt;/p&gt;&lt;p&gt;dynamicキーワードが基本的にobjectのデータタイプですが、該当なデータタイプに関数や変数が存在しなくてもreflection機能で関数や変数を探すのでエラーが発生しません。&lt;/p&gt;&lt;p&gt;objectデータタイプはデバッグ段階でエラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで最上位クラス(object クラス)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/35.html</guid><pubDate>Tue, 21 Sep 2021 19:47:40 +0900</pubDate></item><item><title>[C#] 33. 匿名形式(Anonymous Types)を使い方</title><link>https://www.nowonbun.com/34.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿は匿名形式(anonymous types)を使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスはc#でプログラムを作成するところで最小単位です。&lt;/p&gt;&lt;p&gt;クラスの基本構造はメンバー変数と関数があり、その以外にプロパティ、デリゲート、イベント、インデクスがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/11.html&quot; target=&quot;_blank&quot;&gt;[c#] 10. クラスを作成する方法(コンストラクタ、デストラクタ)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして我々が作成したクラスをメモリにインスタンス生成するためにnewというキーワードを使って生成することになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1822&quot; data-filename=&quot;001.png&quot; style=&quot;width: 259px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスで一番重要なことはメンバー変数です。&lt;/p&gt;&lt;p&gt;プロパティはメンバー変数に値を格納するための関数だし、デリゲートやイベント、インデクサーなども関数の役割について区分するための関数です。&lt;/p&gt;&lt;p&gt;関数というのはプログラムを実装するための実行処理だけで、クラスのデータを格納するしクラスのサイズを決定するのは結局メンバー変数です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、その使い目的によりクラスをすべて作成することにはソースがすごく複雑になる可能性もあります。&lt;/p&gt;&lt;p&gt;簡単の例として、単一目的によりデータを渡すためのクラスならそれをためクラスを作成することは無駄なこともあります。改めて説明すると、データを関数のパラメータにより渡す時、原始データだけでパラメータを作成するとパラメータが多くなりますが、パラメータのクラスを作成して渡すとソースが簡単になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1823&quot; style=&quot;width: 167px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば、始めの関数の場合はパラメータをただ原始データタイプで受け取ります。簡単な例なのでパラメータが4個ですが、仕様によりこのパラメータが10個、20個になる可能性もあります。&lt;/p&gt;&lt;p&gt;実際にそのように作成するとパラメータが多すぎて可読性が悪くなります。&lt;/p&gt;&lt;p&gt;なので、普通はパラメータのデータのクラスを作成して、クラスからパラメータのデータを受け取りますが、利点はソースが読みやすくなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、この問題は大きいプロジェクトだと思えば各関数のためパラメータのクラスを作成することはソースコードがすごく多くなります。&lt;/p&gt;&lt;p&gt;それでこのように一回性のインスタンスのための匿名形式のクラスがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1825&quot; style=&quot;width: 198px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でprint関数のパラメータによりデータインスタンスを渡すために、newキーワードを使ってインスタンスを生成しましたが、クラス名はありません。&lt;/p&gt;&lt;p&gt;インスタンスの変数タイプはvarタイプで設定して、print関数からはvarタイプの変数名を使えないので、dynamicキーワードでパラメータを受け取りました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前のvarタイプとdynamicタイプに関して説明したことがあるので、参考してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;[c#] 27. varキーワードとdynamicキーワード&quot; target=&quot;_blank&quot;&gt;[c#] 27. varキーワードとdynamicキーワード&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;特にこの匿名形式(anonymous types)のクラスタイプはlinq式でよく使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1824&quot; data-filename=&quot;004.png&quot; style=&quot;width: 201px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで匿名形式(anonymous types)を使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/34.html</guid><pubDate>Mon, 20 Sep 2021 20:38:42 +0900</pubDate></item><item><title>[C#] 32. ジェネリックタイプ(Generic Type)を使い方</title><link>https://www.nowonbun.com/33.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のジェネリックタイプ(generic type)を使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がリスト(list)やディクショナリ(dictionary)を使う時、どのデータタイプをリスト中で使うのかを括弧で設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1819&quot; style=&quot;width: 182px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もし、設定したデータを使わなかったらエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1820&quot; data-filename=&quot;002.png&quot; style=&quot;width: 811px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このようにどのデータタイプを使うのかを設定することがジェネリック(generic)です。&lt;/p&gt;&lt;p&gt;つまり、クラスやメソッド中ではデータタイプを設定せず、インスタンスを生成する位置でデータタイプを設定して使う方法という意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1818&quot; data-filename=&quot;003.png&quot; style=&quot;width: 202px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は簡単な連結リストのアルゴリズムです。&lt;/p&gt;&lt;p&gt;実は連結リストのアルゴリズムは凄く簡単なアルゴリズムですが、foreachでデータを出力するためにインラインクラスのpointerを作りました。その理由で少し複雑になりました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例のlistクラスはintタイプだけ使えます。add関数のパラメータとnodeクラスのdataのタイプをintタイプに設定したのでintだけ使えます。&lt;/p&gt;&lt;p&gt;しかし、状況によりintタイプではなくstringタイプのリストも作りたいです。&lt;/p&gt;&lt;p&gt;現在の状況では上のクラスでadd関数とnodeクラスのデータタイプだけ変更してコピペするべきですね。そしてc#.net frameworkで提供するクラスや原始データではなければ、使いたい時たびに作成しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、我々は実際のリスト(list)クラスを使う時にはそのように使いません。括弧(&amp;lt;&amp;gt;)を使ってデータタイプを設定して使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1816&quot; data-filename=&quot;006.png&quot; style=&quot;width: 176px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ジェネリックはデータタイプが設定されてないのでtという任意の文字で置換します。&lt;/p&gt;&lt;p&gt;つまり、インスタンスを生成する場所でintやstringで設定すればtという文字が全部intやstringタイプで変更すると思えば良いです。&lt;/p&gt;&lt;p&gt;そうことでデータタイプによりリストコードを作成する必要せずに、ジェネリックを使えばどのタイプでも対応ができるという意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ジェネリックは基本的にクラスで宣言する方法があるし、メソッドだけ使う方法もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1817&quot; data-filename=&quot;004.png&quot; style=&quot;width: 171px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メソッドジェネリックは関数名の隣に設定します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例では関数を呼び出す時に括弧(&amp;lt;&amp;gt;)を使いますが、実際にはパラメータにstring値を入れたら自動にジェネリックが設定されます。&lt;/p&gt;&lt;p&gt;なので関数ジェネリックを使う時は呼び出すときにジェネリックを設定しなくてもプログラムでエラーが発生しません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1821&quot; style=&quot;width: 362px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のジェネリックタイプ(generic type)を使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/33.html</guid><pubDate>Mon, 20 Sep 2021 20:11:14 +0900</pubDate></item><item><title>[C#] 31. アトリビュート(Attribute)を使い方</title><link>https://www.nowonbun.com/32.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でアトリビュート(attribute)を使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#でのアトリビュート(attribute)とはクラスやメソッドのメタデータを記録するデータです。&lt;/p&gt;&lt;p&gt;ここでメタデータとは例えば、イメージファイルを考えるとイメージファイルはバイナリデータになっています。もちろん、このバイナリデータのはイメージに関する情報がありますが、ファイル名や拡張名などの関するデータはありません。&lt;/p&gt;&lt;p&gt;つまり、このデータはウィンドウosのファイルに関するメタデータです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;改めて説明すると、クラスやメソッドに関する区分するための表示データだと思えば良いです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1815&quot; data-filename=&quot;001.png&quot; style=&quot;width: 426px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のobsoleteのアトリビュートは関数やクラスをもう使わない時、エラーを発生することです。&lt;/p&gt;&lt;p&gt;始めのパラメータはエラーの時のメッセージです。上の結果のイメージをみればエラーメッセージがnot usedだと表示されます。&lt;/p&gt;&lt;p&gt;その後でtrueを設定すればビルドする時にエラーが発生することだし、falseを設定すれば関数やクラスを使えますが、visual studioからの警告メッセージが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アトリビュートは上の例みたいに実際のプログラム実行では影響になることではなく、プログラムのビルドやデバッグする時のメッセージ、リフレクション(reflection)でクラスやメソッドの一括管理する役で使います。&lt;/p&gt;&lt;p&gt;リフレクション(reflection)でアトリビュートを使う方法はリフレクションを説明する時に詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、c# .netフレームワークで基本的に提供するアトリビュートは下記通りです。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;    &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;        &lt;thead&gt;            &lt;tr&gt;                &lt;th&gt;アトリビュート&lt;/th&gt;                &lt;th&gt;説明&lt;/th&gt;            &lt;/tr&gt;        &lt;/thead&gt;        &lt;tbody&gt;            &lt;tr&gt;                &lt;td&gt;clscompliant&lt;/td&gt;                &lt;td&gt;アセンブリのすべてのタイプをclsに合わせて使う。&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;                &lt;td&gt;obsolete&lt;/td&gt;                &lt;td&gt;使わない要素だと表示する。&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;                &lt;td&gt;conditional&lt;/td&gt;                &lt;td&gt;プリプロセッサ識別子によって実行するかどうかを決定&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;                &lt;td&gt;dllimport&lt;/td&gt;                &lt;td&gt;非管理コードのタイプで実行するメソッドを設定&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;                &lt;td&gt;dispid&lt;/td&gt;                &lt;td&gt;comのdispid id(ディスパッチ識別子)を設定&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;                &lt;td&gt;serializable&lt;/td&gt;                &lt;td&gt;クラスあるいは構造体が直列化する設定&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;                &lt;td&gt;transaction&lt;/td&gt;                &lt;td&gt;トランザクションが使えるかを設定&lt;/td&gt;            &lt;/tr&gt;        &lt;/tbody&gt;    &lt;/table&gt;&lt;/div&gt;&lt;p&gt;私の場合は上のアトリビュートをすべて使ったことはありません。&lt;/p&gt;&lt;p&gt;しかし、一番よく使うアトリビュート中ではserializableアトリビュートで、クラスをバイナリで変換する直列化の時に使えます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/210.html&quot; target=&quot;_blank&quot;&gt;[c#] シリアライズ(serialization)をする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;dllimportの場合は.netで作ったライブラリではなく、c/c++で作られた外部ライブラリをc#で使う時のアトリビュートです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/205.html&quot; target=&quot;_blank&quot;&gt;[c#] ini環境ファイルを使う方法&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1814&quot; style=&quot;width: 155px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;obsoleteの場合もよく使うアトリビュートです。visual studioでクラスと関数の使用警告に関するアトリビュートです。&lt;/p&gt;&lt;p&gt;普通のプログラムの開発よりプログラムのアップグレードや性能向上、メンテナンス(maintenance)する時に使えますが、既存ソースで使わないクラスや関数を削除することよりアトリビュートを作成して使えないようにアトリビュートを使える方法もあります。&lt;/p&gt;&lt;p&gt;これは開発スタイルより使いますが、自分の場合はソースが汚くなることが好きではないのでobsoleteアトリビュートを使うことよりそのまま削除します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;.net frameworkで基本的に提供するアトリビュートもよく使えますが、ほぼ、カスタムアトリビュートを作って使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1813&quot; data-filename=&quot;003.png&quot; style=&quot;width: 342px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例ではexampleattributeのアトリビュートを生成しました。&lt;/p&gt;&lt;p&gt;exampleattributeのアトリビュートでattributeusageのアトリビュートが設定されていますが、この設定をしないと関数やクラス、変数に関係せずにすべてのところで設定することができます。&lt;/p&gt;&lt;p&gt;つまり、attributeusageを設定すれば特定なクラス、関数だけ設定します。上の例は私が関数だけで使えるように設定しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてアトリビュートはattributeのクラスを継承しなければならないです。このことは例外処理のexceptionと似ている構造です。&lt;/p&gt;&lt;p&gt;コンストラクタを作成することでは必須ではありませんが、コンストラクタを作成すると、該当なパラメータが必須になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;programクラスで四つの関数を作成しました。&lt;/p&gt;&lt;p&gt;その中で三つはexampleattributeのアトリビュートを設定してprint4関数は設定しないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;main関数でリフレクションでprogramに関する関数を抽出してアトリビュートのnameがtestで設定した関数を抽出しました。&lt;/p&gt;&lt;p&gt;結果的にprint1関数とprint2関数が実行されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はアトリビュート(attribute)はリフレクション(reflection)機能と凄く密接な関係があります。&lt;/p&gt;&lt;p&gt;詳細な部分はリフレクション(reflection)で説明しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でアトリビュート(attribute)を使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/32.html</guid><pubDate>Fri, 17 Sep 2021 17:18:09 +0900</pubDate></item><item><title>[C#] 30. Linq関数式を使う方法</title><link>https://www.nowonbun.com/31.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のlinq関数式を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でlinq式に関して簡単な説明とlinqクエリ式に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/29.html&quot; target=&quot;_blank&quot;&gt;[c#] 28. リスト(list)とディクショナリ(dictionary)、そしてlinq式を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/30.html&quot; target=&quot;_blank&quot;&gt;[c#] 29. linqクエリ式を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;linq式に関してはプログラム内のオブジェクト(object)を効果的にフィルター、建さんしてデータを分類する文法です。&lt;/p&gt;&lt;p&gt;クエリ式の場合はsqlクエリみたいに作成してデータを分類する方法です。&lt;/p&gt;&lt;p&gt;クエリ式の利点はsqlクエリ式に慣れている方にはこの文法が慣れしやすいですが、少しプログラム文法と違和感があるし、途中でデバッグ状況を確認することが難しいので使うことでお勧めではありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでlinq式にはプログラム関数と同じlinq関数式があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1810&quot; data-filename=&quot;001.png&quot; style=&quot;width: 155px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースではクエリ式のfrom node in list where node.data &amp;gt; 5 select node.data;をlist.where(x =&amp;gt; x.data &amp;gt; 5).select(x =&amp;gt; x.data);で作成しました。&lt;/p&gt;&lt;p&gt;ここでwhere関数とselect関数の中ではラムダ式を使ってフィルターと検索条件を生成しました。&lt;/p&gt;&lt;p&gt;そしてwhere関数の返却値とselect関数の返却値はienumerableタイプなので、関数を連結するみたいにチェインパターンで生成することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、上みたいにチェインパターンではなく、一行目ずつ作成することもできます。(参考、selectの場合はreturn値によりジェネリックタイプが変わるので注意)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的にlinq関数式の場合はwhereとselectをよく使いますが、仕様により、joinと整列、グループ別に分離することもできます。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;first, firstordefault, single, singleordefault, last, lastordefault&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;この関数はリストの結果を一つの結果に受け取る場合に使います。最終の返却値はlistではなく、listのジェネリックタイプにより結果を返却します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1808&quot; data-filename=&quot;002.png&quot; style=&quot;width: 230px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;first、lastの場合はリストから始めの値と最後のの値を返却する関数式です。でもデータがなければexceptionが発生します。&lt;/p&gt;&lt;p&gt;でも、ここでordefaultが付けると、つまり、firstordefault、lastordefaultなら検索されたデータがなければnullをリターンします。エラーが発生しません。&lt;/p&gt;&lt;p&gt;singleの関数はリストの結果が一つの場合、リターンする関数式です。もし、結果値が二つ以上ならエラーを発生します。&lt;/p&gt;&lt;p&gt;singleordefaultの関数も結果がなければnullをリターンします。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;orderby, orderbydescending&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;データを整列する関数です。&lt;/p&gt;&lt;p&gt;orderbyの場合は昇順、orderbydescendingの場合は降順になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1811&quot; data-filename=&quot;003.png&quot; style=&quot;width: 272px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;select, selectmany&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;selectはデータを置換することだし、selectmanyは二つのリストを合併することです。&lt;/p&gt;&lt;p&gt;ここで合併するのはリストのjoinをする意味ではなく、aのリストが二つあり、bのリストが三つがあれば、総6個のリストを作るという意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1809&quot; data-filename=&quot;004.png&quot; style=&quot;width: 216px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;join&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;joinは二つのリストを合併する関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1812&quot; style=&quot;width: 198px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;group&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;リストをgroup別に分ける関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1806&quot; data-filename=&quot;006.png&quot; style=&quot;width: 233px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;sum, average, max, min&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;linq関数式にはクエリ式にはない関数がありますが、それがsum、average、max、minです。sumはリストの結果合、averageは平均、maxは一番大きい値、minは小さい値の結果になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1807&quot; data-filename=&quot;007.png&quot; style=&quot;width: 175px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;linq関数式はクエリ式よりソース読みやすさが良いです。&lt;/p&gt;&lt;p&gt;そしてすべての関数式はienumerableインタフェースでリターンするので、チェインパターン式で一行目で様々な関数を呼び出すことができます。&lt;/p&gt;&lt;p&gt;c#の代表的なormのentityプレームワークもlinqの関数式を継承して使うので様々な仕様でも簡単に使うことができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、linq式とは関数自体のアルゴリズムは凄く効率的ですが、使用方法や仕様により性能を低下する可能性があるので、注意しなければならないです。&lt;/p&gt;&lt;p&gt;例えば、重複フィルターや一つの条件式で処理することをいろんなwhereとselectを分けるのはよくないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のlinq関数式を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/31.html</guid><pubDate>Wed, 15 Sep 2021 19:30:49 +0900</pubDate></item><item><title>[C#] 29. Linqクエリ式を使い方</title><link>https://www.nowonbun.com/30.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のlinqクエリ式を使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でlinq式に関して簡単に説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/29.html&quot; target=&quot;_blank&quot;&gt;[c#] 28. リスト(list)とディクショナリ(dictionary)、そしてlinq式を使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、簡単に説明するとlinqとはプログラム上で設定されたオブジェクトの集合、つまりリスト(list)やディクショナリ(dictionary)で設定されたデータを効果的に分類及び検索するためのc#のプログラム文法です。&lt;/p&gt;&lt;p&gt;linqを作成する方法はクエリ式と関数式がありますが、その中でクエリ式はデータベースで使うsqlクエリ式と似ている方法です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的に使う方法はfrom in where selectです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1802&quot; data-filename=&quot;001.png&quot; style=&quot;width: 213px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、from inに関して説明するとinの後の変数は検索しようと思うリストの変数です。&lt;/p&gt;&lt;p&gt;そしてforeachの繰り返し文みたいに一つのオブジェクトに置換することがfromの後の変数です。&lt;/p&gt;&lt;p&gt;つまり、foreach(node node in list)がfrom node in listと同じ意味になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;whereは繰り返し文の中で条件を作ることでnode.data &amp;gt; 5はif(node.data &amp;gt; 5)と同じ意味です。&lt;/p&gt;&lt;p&gt;selectはreturnされた結果により最終のfilterlistのデータタイプが決められます。select nodeをしたらienumerable&amp;lt;node&amp;gt;のタイプになりますが、上の例ではnode.dataをしたのでienumerable&amp;lt;int&amp;gt;タイプで生成されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで参考にienumerableのインタフェースはlistの親インタフェースです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1805&quot; style=&quot;width: 848px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、listみたいに使えるインタフェースですが、正確にはイテレータパターン(iterator pattern)のインタフェースです。&lt;/p&gt;&lt;p&gt;つまり、listと似てますが、addやremoveみたいにデータを追加、削除をできなく、foreachでデータを取得することしかできないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考でlinqで抽出した結果にデータを追加、削除するためにはtolist()関数でlistタイプにキャストして使ったら良いです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1800&quot; data-filename=&quot;003.png&quot; style=&quot;width: 213px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、クエリ式に戻って、実務プログラムを開発するとfrom where selectが一番よく使います。&lt;/p&gt;&lt;p&gt;その以外にorderbyがあるし、join、letをよく使います。&lt;/p&gt;&lt;p&gt;orderbyはデータの整列する式だし、joinは二つのリストを合併する式です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1804&quot; data-filename=&quot;004.png&quot; style=&quot;width: 318px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;linq式のjoinはデータベースのouter joinと似てます。&lt;/p&gt;&lt;p&gt;つまり、最初のlist1を基準でlist2をjoinして結果をintoのキーワードでnode3に作成します。joinになるデータで値がなければ0個のienumerableデータで、あれば1個のienumerableデータでnode3に置換します。&lt;/p&gt;&lt;p&gt;そして順番をorderbyに通ってlist1基準の降順に再整列します。&lt;/p&gt;&lt;p&gt;その結果をselectで新しいnodeインスタンスで再生成します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンソール結果をみれば降順で出力するし、0から5までのデータはマッピングする値がないので空白stringで出力します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1803&quot; data-filename=&quot;005.png&quot; style=&quot;width: 316px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はリストをグループ化しました。&lt;/p&gt;&lt;p&gt;まず、groupはグループする対象を設定してbyによりキーを設定します。node.key % 2ですべてリストに出られる場合の数は、0と1です。&lt;/p&gt;&lt;p&gt;つまり、0と1のリストを作って0になる値のlistと1になる値のリストを作りました。その結果をgroupというクラスのインスタンスを生成してまた、0と1のienumerableタイプで生成します。&lt;/p&gt;&lt;p&gt;結果をみれば0と1でグループになることを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1801&quot; data-filename=&quot;006.png&quot; style=&quot;width: 271px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のクエリ式ではletを使いました。&lt;/p&gt;&lt;p&gt;letのキーワードはデータを再定義する式です。つまり、from node in listで再定義したnodeのnodeクラスのインスタンスをletによりnode.dataの値に100を掛けてint値で再置換します。&lt;/p&gt;&lt;p&gt;それをまた、selectに通ってnodeクラスのインスタンスを生成してリストで作ります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果はnode.dataが100に掛けて、nodeのインスタンスリストで結果が出ることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;linqのクエリ式はmsの.net framework docで説明しているので、参照したら良いです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/query-keywords&quot; target=&quot;_blank&quot;&gt;https://docs.microsoft.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;linqクエリ式をよく使ったら、プログラムを作成する時、ソースのステップを減らすこともできるし、検証されたクエリ式なのでユーザが作成したアルゴリズムより良い性能で使えます。&lt;/p&gt;&lt;p&gt;もちろん、それがクエリをしっかり使う場合です。不必要なjoinとfrom、letによりデータ合併、置換、そして間違いwhereが逆に性能が悪くなります。&lt;/p&gt;&lt;p&gt;そしてまた、クエリ式は普通のプログラムコード式ではないので、近すぎなら、ソース読みにくい(可読性低下)し、リストのフィルター、join,置換状態のデバッグを確認できないので、開発するところで不便なことが多いです。&lt;/p&gt;&lt;p&gt;そして、逆に実務開発環境ではlinqのクエリ式より関数式をよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のlinqクエリ式を使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/30.html</guid><pubDate>Tue, 14 Sep 2021 20:56:04 +0900</pubDate></item><item><title>[C#] 28. リスト(List)とディクショナリ(Dictionary)、そしてLinq式を使い方</title><link>https://www.nowonbun.com/29.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のリスト(list)とディクショナリ(dictionary)、そしてlinq式を使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿で配列とオブジェクト指向プログラミング(oop)に関して説明したことがあります。에 대해서 설명한 적이 있습니다.&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/9.html&quot; target=&quot;_blank&quot;&gt;[c#] 8. 配列とリスト&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/21.html&quot; target=&quot;_blank&quot;&gt;[c#] 20. オブジェクト指向プログラミング(oop)の4つの原則(カプセル化、抽象化、継承化、多相化(ポリモーフィズム))&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;オブジェクト指向プログラミング(oop)に関して簡単に改めて説明するとプログラムを開発する時、すべてをオブジェクト(object)に考えて開発することという意味です。&lt;/p&gt;&lt;p&gt;つまり、オブジェクトというのはプログラムでクラス(class)の形で管理すること、またはこのオブジェクトを効果的に管理するためにリスト(list)とディクショナリ(dictionary)をよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リストはデータ構造アルゴリズムでは連結リストアルゴリズムだし、ディクショナリ(dictionary)はマップアルゴリズムです。&lt;/p&gt;&lt;p&gt;連結リストのアルゴリズムは始めから最後までのデータをポインタで連結したことだし、ディクショナリはキーと値で連結したデータ構造です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1796&quot; data-filename=&quot;001.png&quot; style=&quot;width: 284px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リストから0の値から9までのdataを持っているnodeインスタンスを順番とおりに格納されています。&lt;/p&gt;&lt;p&gt;リストは確実に順番が決めているし、5番目のnodeインスタンスを取得してリストから取り除きました。&lt;/p&gt;&lt;p&gt;そして、2番目のリストに100のdataを持っているnodeインスタンスを挿入しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これかリストの特性です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ディクショナリ(dictionary)の場合は始めから最後までの順番が決めていることではなく、keyからデータを取得します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1798&quot; data-filename=&quot;002.png&quot; style=&quot;width: 273px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ディクショナリのkeyを通ってデータを入力して取り除く、出力しました。&lt;/p&gt;&lt;p&gt;リストと違うのはデータが順番とおりにあることではなく、keyというデータを通ってデータが管理することを確認できます。&lt;/p&gt;&lt;p&gt;参考でkeyの値はリストの形式で順番とおりに格納されていることではなく、keysでキーのリスト(?)を取得するとリストが順番とおりではないことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#はオブジェクト指向プログラム言語(oop)としてデータを管理するためにリストとディクショナリをたくさん使います。&lt;/p&gt;&lt;p&gt;リストで上の例みたいに入力、出力することができますが、特定データを検索するために我々は繰り返しを使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1797&quot; data-filename=&quot;003.png&quot; style=&quot;width: 190px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;listのデータの値が偶数のデータを検索してevenlistのリストにインスタンスを格納しました。&lt;/p&gt;&lt;p&gt;そしてevenlistを繰り返しで出力すると結果は0が含めている偶数だけ出力することを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は間違いソースではありませんが、c#ではもっと効率的にフィルター、抽出する方法があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1797&quot; data-filename=&quot;003.png&quot; style=&quot;width: 190px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はデータベースのsqlクエリみたいなプログラム式があります。&lt;/p&gt;&lt;p&gt;from node in list는 listの意味は各アイテムの値をnodeに置換して、whereの条件式でnode.dataが偶数でフィルターしてselectで出力して新しいリストを生成しました。&lt;/p&gt;&lt;p&gt;そしてforeachで出力すると結果は上の例と同じ値を出力しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいなプログラム式をc#ではlinqクエリ式だといいます。&lt;/p&gt;&lt;p&gt;リンククエリ式は上みたいにフィルター(where)の役割もありますが、整列と集合の式もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1795&quot; style=&quot;width: 179px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例ではorderbyでリストを降順(descending)で再整列してgroup byで1と0で再整列してselectでディクショナリの形でデータを生成します。&lt;/p&gt;&lt;p&gt;簡単にdictionary&amp;lt;int, list&amp;lt;node&amp;gt;&amp;gt;の形で再構成することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラム設計によりデータベースクエリ式みたいに作られますが、他の方式でプログラム関数式で作成することもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1799&quot; data-filename=&quot;005.png&quot; style=&quot;width: 334px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムの関数みたいにリストのフィルダーを作られます。&lt;/p&gt;&lt;p&gt;結果は上のクエリ式と同じ結果が出力します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#にはオブジェクトをリスト(list)とディクショナリ(dictionary)でオブジェクト(object)を管理してlinqのクエリ式と関数式を通ってデータをフィルター、分類して使います。&lt;/p&gt;&lt;p&gt;linq式には代表的に一番よく使うのはwhereとselectですが、仕様により二つのリストを合体(join)、重複データの取り除く(distinct)、合集合(union)などの機能があります。&lt;/p&gt;&lt;p&gt;少し、もっと詳細のは他の投稿で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のリスト(list)とディクショナリ(dictionary)、そしてlinq式を使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/29.html</guid><pubDate>Mon, 13 Sep 2021 19:14:55 +0900</pubDate></item><item><title>[C#] 27. varキーワードとdynamicキーワード</title><link>https://www.nowonbun.com/28.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はvarキーワードとdynamicキーワードに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でプログラムのstackメモリとheapメモリの関係に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/12.html&quot; target=&quot;_blank&quot;&gt;[c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;変数で宣言されているデータタイプはheapに生成するインスタンスのポインタのアドレスということで説明したことがあります。&lt;/p&gt;&lt;p&gt;このポインタのアドレスというのは大きいデータがあることではなく、普通の整数になっているデータです。それで、一々にクラス名に合わせてソースを作成することは面倒くさいことですね。&lt;/p&gt;&lt;p&gt;それで、この変数のデータタイプを作成しやすいようにするキーワードがありますが、それがvarキーワードです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1794&quot; style=&quot;width: 261px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例の結果をみればnodeの変数とnode1の変数の差異はソース上で作成するところでnodeのクラスタイプからvarタイプに変わったことだけで、プログラム上で実装する処理に関して同じです。&lt;/p&gt;&lt;p&gt;つまり、varキーワードとは変数で宣言を簡単にするためのキーワードだけで、性能と処理に関してはなにも影響はありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでc#のソース規約(コーディングに関する規則)に従うとローカル変数宣言はvarキーワードを使うのをお勧めします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、このvarキーワードには何個か制約条件があります。&lt;/p&gt;&lt;p&gt;最初の宣言する時にnullで設定はできません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1793&quot; style=&quot;width: 493px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして最初の宣言したタイプは途中でタイプ変更はできません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1787&quot; data-filename=&quot;003.png&quot; style=&quot;width: 591px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてvarキーワードは関数のスタック領域だけ、つまりローカルだけ使うことができるしメンバー変数や関数のリターン値、パラメータは使えません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1792&quot; data-filename=&quot;004.png&quot; style=&quot;width: 326px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;改めてまとめると、varキーワードは最初の宣言した原始データあるいはクラスタイプで設定ができるし、次は設定を変わりません。&lt;/p&gt;&lt;p&gt;なので、当然に最初宣言する時にタイプを設定するのでnullは使えないし、メンバー変数とリターンタイプ、パラメータタイプでは設定を区分することができないので使えません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#にはvarキーワードと似ているdynamicキーワードがあります。&lt;/p&gt;&lt;p&gt;dynamicキーワードはvarキーワードと似ていますが、最初に宣言する時にデータタイプが決定することではなく、基本データタイプのobjectで設定があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;objectクラスに関して簡単に説明するとc#ではクラスが最小単位です。&lt;/p&gt;&lt;p&gt;c#ではクラスを宣言する時に別に継承を設定しなくても、基本的にobjectクラスを継承します。つまり、最上位クラスという意味です。&lt;/p&gt;&lt;p&gt;objectに関して少し複雑なので別の投稿で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、dynamicに戻って説明すると、我々がプログラムを作成すればデバッグのエラーによりプログラムを作成できない場合があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1790&quot; data-filename=&quot;005.png&quot; style=&quot;width: 688px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで、dataを参照できないエラーが発生します。&lt;/p&gt;&lt;p&gt;理由はgetnode関数でnodeインスタンスをinodeタイプに変換して返却するし、また、変数タイプもinodeなので、inodeにはdataプロパティがないのでデバッグエラーが発生します。&lt;/p&gt;&lt;p&gt;まぁ。当然なことです。そうならデータタイプをinodeからvarに変わったらdataを使いそうですが、getnode関数でinodeに変換するので、結局同じエラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうなら上みたいなコードはdataを使えないですが、dynamicキーワードを使いなら可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1788&quot; data-filename=&quot;006.png&quot; style=&quot;width: 206px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;dynamicを使うと実行できますね。dynamicキーワードは一応debug環境ではエラーが発生しません。&lt;/p&gt;&lt;p&gt;その後で実行をすると実際のheapメモリにあるインスタンスの関数と変数を探すので実行ができることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このdynamicキーワードが万能みたいですが、実際にはこのdynamicはreflactionの機能と関連があるキーワードなので、普通の変数よりは少し遅くなります。&lt;/p&gt;&lt;p&gt;つまり、dynamicキーワードをたくさん使うと性能が遅くなる可能性があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてエラーをdebug上で発生しないので、プログラム品実と関係があります。&lt;/p&gt;&lt;p&gt;プログラムを作成する時にはエラーを分からないし、実行する途中でエラーが発生することなので、一つ一つに実行とテストで問題があるかエラーが無いかを検証するべきです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1791&quot; style=&quot;width: 521px;&quot; data-filename=&quot;007.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;debugでエラーが発生せず、実行するとエラーが発生することを確認することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;dynamicキーワードはvarキーワードと違い、関数の返却タイプで設定できるし、メンバー変数、パラメータを設定することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1789&quot; data-filename=&quot;008.png&quot; style=&quot;width: 201px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればメンバー変数と関数返却値、パラメータでdynamicで使うことができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでvarキーワードとdynamicキーワードに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/28.html</guid><pubDate>Fri, 10 Sep 2021 21:16:32 +0900</pubDate></item><item><title>[C#] 26. 例外処理(try ~ catch)する方法</title><link>https://www.nowonbun.com/27.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#で例外処理(try ~ catch)する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がプログラムを作成したら予想できないエラーが発生する場合があります。&lt;/p&gt;&lt;p&gt;例えば、プログラムを作成する時に変数の値がない場合(nullエラー)か、正数の値に割り算をする時に整数を0で割る場合かの問題が発生することがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1786&quot; style=&quot;width: 708px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムの実行中でエラーが発生しました。&lt;/p&gt;&lt;p&gt;普通のプログラムの実行中でこんなエラーが発生すれば、エラーが発生した部分を飛び越えてプログラムが進めることではなく、プログラムがそのままに止まることになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もちろん、上の例みたいに宣言された変数の値が間違ったら、変数の値を直したら解決しますが、もし、ユーザが受け取ったデータが間違えたり、データベースの値が予想しない場合にはプログラムを止まることではなく、例外処理をするべきです。&lt;/p&gt;&lt;p&gt;つまり、エラーが発生してもプログラムが止まったり、終了されたらダメです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1782&quot; data-filename=&quot;002.png&quot; style=&quot;width: 367px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみれば割る領域でエラーが発生しますが、エラーメッセージをコンソールに出力して&quot;press any key...&quot;のメッセージまでコンソールに出力されました。&lt;/p&gt;&lt;p&gt;つまり、エラーが発生してもプログラムが止まらなくて最後まで実行されることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;エラー処理というのはエラーの区分によりcatchのスタック領域を分けることができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1783&quot; style=&quot;width: 228px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のtry領域では割り算エラーが発生しましたので、dividebyzeroexceptionのスタック領域に移動します。&lt;/p&gt;&lt;p&gt;もし、try領域でdividebyzeroexceptionではないエラーが発生すれば、すべてのエラーをキャッチするexception領域に移動します。&lt;/p&gt;&lt;p&gt;(ここでエラークラスの種類を分かる方法は始めにexceptionを作ってエラーを発生するとどのエラーが発生するかエラーメッセージで表示されます。始めの例を参考)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通の一般コードならすべてのexceptionで処理しても構いないですが、発生するエラー別で処理することが違いなら上のソースみたいにエラー別で区分する作業が必要です。&lt;/p&gt;&lt;p&gt;つまり、exceptionですべてのエラーをキャッチしても別に性能上で問題ありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうなら我々がクラスを作成する時にクラスの特性上によりわざわざエラーを発生する時があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1785&quot; data-filename=&quot;004.png&quot; style=&quot;width: 422px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例では私がエラークラスを作成しました。このエラークラスは基本的にexceptionクラスを継承しました。継承しなかったらtry ~ catchで使えません。&lt;/p&gt;&lt;p&gt;そしてinputtextクラスのプロパティでthrowを使う時にエラーインスタンスを渡します。参考でthrowキーワードを使ったら強制エラーが発生して実行されているcall stack historyで一番近いtry ~ catchに掛けます。もし、try ~ catchがなければ始めの例みたいにプログラムが止まります。&lt;/p&gt;&lt;p&gt;私は実装とおりmainのtry ~ catchでエラーがキャッチすることになります。&lt;/p&gt;&lt;p&gt;コンソール結果をみればcharactercountoverが発生したことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでよくみれば、エラーは発生しましたが、コンソール出力ok!!は出力がされてないです。その意味はtryの領域ではエラーが発生すればエラーが発生したところでスタックが止まってcatch領域にジャンプしたことみたいに見えます。そのため、コンソールでok!!が出力されないです。&lt;/p&gt;&lt;p&gt;その後のcatch領域からは正常に実行されることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならここで一つの知りたいことができます。プログラムの制御文(if~else)みたいに使ったらプログラムをもっと有用に開発することではないか？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1784&quot; data-filename=&quot;005.png&quot; style=&quot;width: 309px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はtry ~ catchを制御文みたいに使ってコードを作成しました。結果は性能が圧倒的に遅くなります。&lt;/p&gt;&lt;p&gt;つまり、このtry ~ catchはエラーをキャッチする役割しますが、パフォーマンスが凄く悪くなるので、出来れば制御文でエラーを取り除くのが主なポイントです。&lt;/p&gt;&lt;p&gt;参考でtry領域を囲むことだけでは性能には影響なくて、throwが発生してcatchに移動する時、インタラプトが掛けてしまうので遅くなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#で例外処理(try ~ catch)する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/27.html</guid><pubDate>Thu, 9 Sep 2021 19:10:28 +0900</pubDate></item><item><title>[C#] 25. イベント(event)キーワードを使い方</title><link>https://www.nowonbun.com/26.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でのイベント(event)キーワードを使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラム言語ではイベント(event)の意味ではユーザの行動あるいはプログラム的にはアクションが発生する時、実行される関数という意味です。&lt;/p&gt;&lt;p&gt;つまり、ウィンドウフォームでボタンがある場合、ユーザがボタンをクリックすると実行される関数という意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1779&quot; data-filename=&quot;001.png&quot; style=&quot;width: 219px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例では簡単なウィンドウフォームを作成しました。&lt;/p&gt;&lt;p&gt;実行するとボタンがあるウィンドウフォームが生成されますが、ここでボタンをクリックするとbuttton_click関数が呼び出して実行されます。&lt;/p&gt;&lt;p&gt;こんなアクションをイベントと言います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々が以前の投稿で似ている機能に関して、デリゲート(delegate)で説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/24.html&quot; target=&quot;_blank&quot;&gt;[c#] 23. デリゲート(delegate)&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1778&quot; data-filename=&quot;002.png&quot; style=&quot;width: 256px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースはコンソールからユーザで入力イベントを受け取ったらprint_event関数を発生します。&lt;/p&gt;&lt;p&gt;ここまでみるとデリゲートだけでイベント関数を実装しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでだけでもイベント関数を実装することでは問題がありませんが、実はここにはオブジェクト指向プログラミング(oop)のルール違反があります。&lt;/p&gt;&lt;p&gt;それがconsolecmmandのデリゲートリストです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のデリゲートの呼び出しをコンストラクタ中でユーザから入力が発生すると実行する役割です。&lt;/p&gt;&lt;p&gt;でも、このリストがpublicで設定されているので、list(&quot;&quot;)形式でmain関数でも実行できることが欠点があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、外部からはイベント関数を連結することが可能にしますが、実行はできないようにするべきです。&lt;/p&gt;&lt;p&gt;それがeventキーワードです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1777&quot; data-filename=&quot;003.png&quot; style=&quot;width: 195px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればmain関数でデリゲートを実行しました。実はこんなことになるとクラス中で縛っているイベントが外部から強制(?)に実行される問題があります。&lt;/p&gt;&lt;p&gt;それならデリゲートの前でイベント付けたらどのようになるか？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1781&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンパイル段階でエラーが発生しました。&lt;/p&gt;&lt;p&gt;つまり、イベントの関数を外部で付けることは可能ですが、実行はクラス中だけで実行することが可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1780&quot; style=&quot;width: 176px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;要約すればイベント関数は以前のデリゲートから実行を我部で実行できないためのキーワードです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でのイベント(event)キーワードを使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/26.html</guid><pubDate>Wed, 8 Sep 2021 18:18:07 +0900</pubDate></item><item><title>[C#] 24. ラムダ式(匿名関数)とAction、Func関数を使い方、そしてクロージャ(Closure)</title><link>https://www.nowonbun.com/25.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でラムダ式(匿名関数)とaction、func関数を使い方、そしてクロージャ(closure)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でデリゲート(delegate)に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/24.html&quot; target=&quot;_blank&quot;&gt;[c#] 23. デリゲート(delegate)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;デリゲートとは関数ポインタで関数をインスタンスのポインタみたいに管理ができるような機能ということです。つまり、関数をポインタで管理ができればもっと考えると関数の名前が要らずに関数を作成することができます。&lt;/p&gt;&lt;p&gt;ラムダ式とは匿名関数の意味とおりに関数名せずに作成が可能な関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1773&quot; data-filename=&quot;001.png&quot; style=&quot;width: 256px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば返却式はなく、stringのパラメータを受け取るデリゲートを作成しました。そしてmain関数で(val) =&amp;gt; {}の形式のラムダ(匿名関数)を作ってデリゲートリストに追加しました。&lt;/p&gt;&lt;p&gt;ここでvalのデータタイプはデリゲートで宣言したstringのタイプのデータになり、返却タイプはないのでreturnは要りません。&lt;/p&gt;&lt;p&gt;そして中括弧({})のスタック領域で関数が呼び出したら実行するプログラムのコードを実装します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行すればlistのデリゲートを実行して登録されて二つのラムダ式が実行することを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうならこのラムダ式を使うためにはそれを合わせてデリゲートを常に宣言するべきだと思いますが、func関数とaction関数を利用すればデリゲートが要りません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1775&quot; data-filename=&quot;002.png&quot; style=&quot;width: 220px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例では匿名関数を作成しましたが、delegateを宣言せずにfuncとaction関数を使いました。&lt;/p&gt;&lt;p&gt;func関数は返却値がある匿名関数で、action関数は返却値がない匿名関数です。&lt;/p&gt;&lt;p&gt;func関数の最後のパラメータは返却値のデータタイプです。その以外は順番とおりのパラメータのデータタイプです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ラムダ式というのは実は文法規約を破壊する方法です。ラムダ式が使うことも楽だしデリゲート(delegate)やリストとfunc、actionを適当に混ぜて作成するならプログラムを実装する時に凄く楽になります。&lt;/p&gt;&lt;p&gt;問題はラムダ式が多くなるとソースは凄く複雑になるし、可読性が凄く悪くなる欠点があります。そのため、一般関数を使うことができれば関数名を作成してラムダ式を使うことを抑える方が良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうならラムダ式をいつ使うほうが良いか？デザインパターンのオブザーバーパターンを実装する時、つまり、イベントやコールバック関数を実装する時に使う方が良いです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1774&quot; data-filename=&quot;003.png&quot; style=&quot;width: 318px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はデザインのオブザーバーパターンです。javascriptコードでよく見えるコールバック関数です。&lt;/p&gt;&lt;p&gt;オブジェクト指向プログラミング(oop)でデータをオブジェクト(object)化する時、必要なコールバックタイプやイベントタイプ、つまり、特定な関数が呼び出した時に呼び出される形式で作成することの意味です。&lt;/p&gt;&lt;p&gt;イベントはeventキーワードを説明する時に詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的にオブザーバーパターンを設計する時、ラムダ式を使うがその以外はクロージャ(closure)機能を使うために実装します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1772&quot; data-filename=&quot;004.png&quot; style=&quot;width: 224px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はmain関数でaction関数を使って匿名関数を作成しました。でも、この匿名関数はパラメータがありません。&lt;/p&gt;&lt;p&gt;そうなのにmain関数で生成したstring valの値を持ってきて使うことができます。もし、これが匿名関数ではなく、一般関数ならとんでもない実装です。なぜなら、スタック領域が全然違う領域だからです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1776&quot; data-filename=&quot;005.png&quot; style=&quot;width: 537px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、このラムダ式はソース上のすぐ上のスタック領域の値を持ってくることができます。もちろん、持ってきて修正もできます。これがクロージャ(closure)機能です。&lt;/p&gt;&lt;p&gt;こんな機能は以外に関数の複雑度をずいぶん減らすことができます。つまり、パラメータで渡すべきなデータあるいはメンバー変数を使うべきな値をローカル変数でクロージャ(closure)機能で単純なソースコードを作成することができます。&lt;/p&gt;&lt;p&gt;しかし、これが作成しすぎなら可読性が悪くなるので、状況に合わせて、仕様に合わせて作成する方が良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でラムダ式(匿名関数)とaction、func関数を使い方、そしてクロージャ(closure)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/25.html</guid><pubDate>Tue, 7 Sep 2021 20:47:10 +0900</pubDate></item><item><title>[C#] 23. デリゲート(delegate)</title><link>https://www.nowonbun.com/24.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のデリゲート(delegate)を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#のデリゲートは代理子のいう意味でc++の関数ポインタと似ている概念を持っているキーワードです。つまり、関数ポインタとは関数式(function)をインスタンスのポインタみたいに認識して変数に値を格納するかパラメータに渡して実行する代理に実行する役をします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1768&quot; data-filename=&quot;001.png&quot; style=&quot;width: 216px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でprint関数をデリゲートで使ってポインタでインスタンスのポインタを変換してpdの変数をインスタンス値みたいに使えます。&lt;/p&gt;&lt;p&gt;実行はデリゲートの変数でただ関数を呼び出すみたいにパラメータ値を入れれば実行されて、コンソール出力することを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の式はデリゲートを説明するために凄くシンプルに作成したことで実際は変数の値みたいに使ういい点があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1769&quot; data-filename=&quot;002.png&quot; style=&quot;width: 212px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればexample클래스とnode1、node2クラスをinodeインタフェースを継承しました。&lt;/p&gt;&lt;p&gt;上の形式はデザインパターンの中で合成パターンです。exampleクラスにnode1クラスのprint関数とnode2クラスのprint関数を入れてexampleクラスのprint関数を実行すれば同時に実行されるパターンです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は私がlistにデリゲートを格納して関数ポインタを管理するようにしました。&lt;/p&gt;&lt;p&gt;でも、デリゲートは関数を管理するリスト機能もあります。+=と-=の対入演算子を通って追加、削除をできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1770&quot; data-filename=&quot;003.png&quot; style=&quot;width: 249px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例には二つ目のlistクラスの変わりにデリゲートで関数式を追加、削除することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近にはc#コードでラムダ式(lambda)をよく見えますが、このラムダ式がデリゲート基盤で生成して使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1771&quot; style=&quot;width: 199px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ラムダ式は匿名関数の意味で関数で名前がない関数という意味です。このラムダ式は関数名が存在しないので関数ポインタだけ存在します。&lt;/p&gt;&lt;p&gt;つまり、ラムダ式を使うためにはこのデリゲートで関数のポインタを持つべきだと意味です。&lt;/p&gt;&lt;p&gt;ラムダ式はラムダ式を説明する時にもっと詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のデリゲート(delegate)を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/24.html</guid><pubDate>Mon, 6 Sep 2021 18:56:03 +0900</pubDate></item><item><title>[C#] 22. インデクサー(indexer)を使う方法</title><link>https://www.nowonbun.com/23.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のインデクサー(indexer)を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#には他の言語にはない文法が何個かあります。&lt;/p&gt;&lt;p&gt;その中で一つが以前の投稿で説明したプロパティ(property)です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/22.html&quot; target=&quot;_blank&quot;&gt;[c#] 21. c#のプロパティ(property)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;この投稿もc#の特別な文法のインデクサー(indexer)です。&lt;/p&gt;&lt;p&gt;インデクサー(indexer)は簡単に説明すると配列の形で関数を呼び出す機能です。文法の形はプロパティ(property)と似てます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1767&quot; data-filename=&quot;001.png&quot; style=&quot;width: 256px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば私がnodeクラスでインデクサー(indexer)関数を作りました。&lt;/p&gt;&lt;p&gt;インデクサー(indexer)はプロパティの文法みたに配列の値を受け取るデータタイプと入力するデータタイプを設定して関数名にはthisキーワードを使います。&lt;/p&gt;&lt;p&gt;そして配列みたいに使うので、配列のインデクサー役でstring値を格納するし、イコールでデータは返却データタイプで値を格納します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;mainの実行関数でnode[string] = intの形で実装するとset関数が呼び出すし、node[string]の型で実装するとget関数が呼び出します。&lt;/p&gt;&lt;p&gt;文法がプロパティ(property)と似てます。なのでアクセス修飾子を設定する方法も似てますが、基本のアクセス修飾子はgetで設定して、set関数だけ別途にアクセス修飾子を設定することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1766&quot; style=&quot;width: 216px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロパティ(property)とインデクサー(indexer)は他の言語にはない文法です。&lt;/p&gt;&lt;p&gt;この文法があることはオブジェクト指向プログラミング(oop)のカプセル化により、メンバー変数をprivateに設定しますが、ゲッター、セッターを少し効率的に格納、取得するための文法です。&lt;/p&gt;&lt;p&gt;でも、プロパティの場合はよく使いますが、インデクサー(indexer)はよく使いません。なぜかというと配列と似ている形なので、逆に迷う時が発生します。&lt;/p&gt;&lt;p&gt;ソースコードは可読性、つまり、ソースを読みやすく作ることが重要ですが、インデクサー文法が多いソースは逆に迷い込みやすいです。そのことでよく使わないですね。&lt;/p&gt;&lt;p&gt;特にc#だけ開発するデベロッパー(開発者)の方はインデクサー(indexer)が凄く読みやすいっていうかもしれませんが、javaやpythonなどの他の言語がメインのデベロッパー(開発者)の方は難しいというかもしれません。&lt;/p&gt;&lt;p&gt;その理由かな、実務プロジェクトでもよく見えない文法です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のインデクサー(indexer)を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/23.html</guid><pubDate>Fri, 3 Sep 2021 17:21:01 +0900</pubDate></item><item><title>[C#] 21. C#のプロパティ(Property)</title><link>https://www.nowonbun.com/22.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のプロパティ(property)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でオブジェクト指向プログラミング(oop)の４つの原則とアクセス修飾子、カプセル化に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/13.html&quot; target=&quot;_blank&quot;&gt;[c#] 12. staticとアクセス修飾子、そしてカプセル化&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/21.html&quot; target=&quot;_blank&quot;&gt;[c#] 20. オブジェクト指向プログラミング(oop)の4つの原則(カプセル化、抽象化、継承化、多相化(ポリモーフィズム))&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的にオブジェクト指向プログラミングでメンバー変数はprivateに設定してクラスの外部から接続ができないように設定します。そうならクラスのメンバー変数の値はすべてコンストラクタや関数を通ってデータを設定しますが、そのところでデータを格納、取得だけの関数があります。&lt;/p&gt;&lt;p&gt;それをjava言語ではゲッター(getter)、セッター(setter)と言います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1764&quot; style=&quot;width: 198px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;何でこのように実装するかというとメンバー変数はオブジェクト指向プログラミングによりメンバー変数はprivateに設定することが原則です。&lt;/p&gt;&lt;p&gt;上の例は何の制限がなしてゲッター、セッターを設定したからデータ設定、取得することにしますが、ゲッター、セッターで権限により、あるいは設定によりデータのアクセスを制御することが可能です。&lt;/p&gt;&lt;p&gt;例えば、メンバー変数をpublic設定する場合は読み込み専用変数や書き込み専用変数に設定ができないですが、ゲッター(getter)だけ実装すると読み込み専用、セッター(setter)だけすると書き込み専用の変数に設定することができるし、また、ログなどを設定してデバッグする時にcall stackヒストリにより参照追跡も可能です。&lt;/p&gt;&lt;p&gt;なので、オブジェクト指向プログラミング(oop)ではメンバー変数をpublicを設定することではなく、privateに設定してゲッターやセッターにより設定、取得するように実装します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#ではjavaとは違い、ゲッターとセッターを文法的に実装することがありますが、それがプロパティ(property)です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1764&quot; style=&quot;width: 198px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通、メンバー変数はすべて小文字で作成して、プロパティはその変数名から始めの文字だけ大文字に設定します。その後、プロパティのデータタイプによりゲッターのリターンタイプが設定されるし、セッターのパラメータのデータタイプが設定されます。&lt;/p&gt;&lt;p&gt;スタック領域の中で実装するのは、getの場合はgetterと似ているし、setの場合はsetterと似ているように実装します。&lt;/p&gt;&lt;p&gt;ここでも、setキーワード無しでgetだけ実装すると読み込み専用になるし、getキーワード無しでsetだけ実装すると書き込み専用になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1765&quot; data-filename=&quot;002.png&quot; style=&quot;width: 555px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてプロパティのアクセス修飾子は基本的にgetのアクセス修飾子です。つまり、getとsetのアクセス修飾子を別に設定することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1764&quot; style=&quot;width: 198px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースはdataのプロパティでsetだけアクセス修飾子を別に設定しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロパティの役はメンバー変数の制御です。オブジェクト指向プログラミングではメンバー変数がprivateに固定になります。&lt;/p&gt;&lt;p&gt;なので、オブジェクト指向プログラミングではメンバー変数がクラス内部ではアクセスすることができますが、プロパティがあるところでオブジェクトタイプのクラスを実装することではメンバー変数が意味があるでしょう？&lt;/p&gt;&lt;p&gt;なので、c#ではプロパティを設定するとメンバー変数を省略することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1764&quot; style=&quot;width: 198px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースではメンバー変数を省略しました。そしてプロパティの実装する部分みるとスタック領域を省略してget;set;キーワードだけあります。setの場合は別にアクセス修飾子も設定しました。&lt;/p&gt;&lt;p&gt;プロパティだけ使うことでメンバー変数がないことではありません。classのリフレクション(reflection)でクラス内部をみると変数があることを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1763&quot; style=&quot;width: 274px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ソース上でprogramクラスはdataのプロパティだけありますが、リフレクション(reflection)でクラスを確認するとメンバー変数があることで表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のプロパティ(property)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/22.html</guid><pubDate>Thu, 2 Sep 2021 17:36:37 +0900</pubDate></item><item><title>[C#] 20. オブジェクト指向プログラミング(OOP)の4つの原則(カプセル化、抽象化、継承化、多相化(ポリモーフィズム))</title><link>https://www.nowonbun.com/21.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のオブジェクト指向プログラミング(oop)の4つの原則(カプセル化、抽象化、継承化、多相化(ポリモーフィズム))に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;オブジェクト指向プログラミング(object-oriented programming)とはプログラミングの方法の一つです。プログラミングの方法とは、プログラムを開発する時にどの目的の中心に開発しようということの意味です。&lt;/p&gt;&lt;p&gt;その中でオブジェクト指向はオブジェクト(object)を中心にプログラムを設計、開発することの意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例えば、「業務計画書作成 -&amp;gt; 計画実行 -&amp;gt; テスト -&amp;gt; 結果確認 -&amp;gt; 報告書作成 -&amp;gt; 承認」のプロセスの業務があると思いましょう。&lt;/p&gt;&lt;p&gt;ここで、まず全体の業務単位(controller)で構成して計画データ(object)、テストデータ(object)、結果データ(object)、報告書データ(object)、承認データ(object)をプロセスの流れで配置します。&lt;/p&gt;&lt;p&gt;プログラム言語で考えば最小単位のクラスでオブジェクト(object)を作成して管理することがオブジェクト指向プログラミング(object-oriented programming)です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ごのオブジェクト指向プログラミング(object-oriented programming)には4つの原則がありますが、それがカプセル、抽象化、継承、多相化(ポリモーフィズム)です。&lt;/p&gt;&lt;p&gt;その4つの原則に関しては部分的に他の投稿で説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/13.html&quot; target=&quot;_blank&quot;&gt;[c#] 12. staticとアクセス修飾子、そしてカプセル化&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/16.html&quot; target=&quot;_blank&quot;&gt;[c#] 15. インタフェース(interface)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/15.html&quot; target=&quot;_blank&quot;&gt;[c#] 14. 抽象クラス(abstract)と抽象メソッド(abstract)、そして仮想関数(virtual)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/10.html&quot; target=&quot;_blank&quot;&gt;[c#] 9. 関数(method)とオーバーロード、再帰呼び出し&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿ではその特性をもっと詳細に説明します。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;カプセル化&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;カプセル化はクラスのアクセスを制限することです。例えば、クラスのメンバー変数と関数がすべてpublic(すべてアクセス可能)で作成する場合、クラスの固有の特性がなくなります。&lt;/p&gt;&lt;p&gt;なので、クラスの特性を活かせるためにはクラスのデータ格納、取得する関数以外はprivate(内部だけアクセス可能)を設定することが正しいです。&lt;/p&gt;&lt;p&gt;上のソースをみれば学校のクラスを生成して学生クラス、国語、英語、数学の成績のデータを格納しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでカプセルの特性を分かるために、総点と平均のデータを計算する関数を作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1761&quot; style=&quot;width: 345px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればコンストラクタで国語、数学、英語の成績を受け取って総点と平均を計算します。&lt;/p&gt;&lt;p&gt;ここで私が総点と平均のメンバー変数のアクセス修飾子をpublicに設定すればどのようになるでしょう？&lt;/p&gt;&lt;p&gt;schoolclassクラスで学生の成績修正が可能になります。この意味は学生(people)クラスのカプセルができなければ外部で修正が可能になるし、他のクラスでデータを修正することが可能になるとデータの無欠性がなくなります。つまり、データの信頼度が悪くなります。&lt;/p&gt;&lt;p&gt;また、総点と平均のデータを外部で計算することになるとプロジェクトが大きくなる時に学生の総点と平均をどこで計算することになるかを分からなくなります。学生クラスの独立性がなくなることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、カプセル化に関してプログラマー(開発者)達は暗黙的に決めたルールがありますが、メンバー変数は必ずprivate、カプセルで必要な関数はpublic、その以外はprivate、拡張で必要な関数はprotectedに設定することです。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;継承化&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;継承は似ているオブジェクト(object)の縛って親クラス、インタフェースを定義して共通化します。その後、継承してオブジェクト(object)をもっとシンプルに扱うことにします。&lt;/p&gt;&lt;p&gt;上の例をみればソースが少し長く見えます。成績クラスは特性が似ているクラスです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;継承特性でクラスを縛りましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1761&quot; style=&quot;width: 345px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は成績クラスでインタフェース(isubject)を作成して、共通で使う関数(getscore)を抽象クラス(abstractsubject)で実装しました。&lt;/p&gt;&lt;p&gt;学生(people)クラスで各成績をリストで管理します。&lt;/p&gt;&lt;p&gt;もし、成績クラスが追加する時、抽象クラス(abstractsubject)を継承してリストで追加することでオブジェクト(object)を追加することが簡単になりました。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;抽象化&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;抽象化は上の継承と関係があることですが、ここでは再定義(override)に関して説明します。&lt;/p&gt;&lt;p&gt;上の例までは各成績は同じ点数で配点しましたが、仕様が変わって国語は100から120、英語は100から80に変わりました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1762&quot; data-filename=&quot;002.png&quot; style=&quot;width: 342px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;抽象クラスでgetscore関数でvirtualキーワードを付けました。後で、国語、英語で配点を再定義しました。&lt;/p&gt;&lt;p&gt;単純に配点が変わることで総点、平均と成績順位が変わりました。オブジェクト指向プログラミング(oop)で作成するとソースの拡張、修正が簡単になります。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;多相化(ポリモーフィズム)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;多相化(ポリモーフィズム)は同じ名の関数でパラメータの構造が違う関数を作成することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は既存のデータで選択成績を追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1760&quot; data-filename=&quot;003.png&quot; style=&quot;width: 349px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;選択成績のクラスを追加しました。&lt;/p&gt;&lt;p&gt;そのことに対して、学校(schoolclass)クラスのaddpeople関数も追加しました。多相化(ポリモーフィズム)で追加することで既存のソースは影響がないようにしました。&lt;/p&gt;&lt;p&gt;学生クラス(people)も多相化(ポリモーフィズム)でコンストラクタを追加しました。&lt;/p&gt;&lt;p&gt;成績順位は学生別で入力する個数が違うので平均で順位を計算することに修正しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最後に実行関数でkとlの学生を追加しました。&lt;/p&gt;&lt;p&gt;多相化(ポリモーフィズム)は既存のソースに影響がないようにソースを追加することが可能です。また、似ているな処理を同じ関数名で管理することも可能です。&lt;/p&gt;&lt;p&gt;つまり、ソース可読性がよくなるという意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;オブジェクト指向プログラミング(oop)でプログラムを作成するとオブジェクト別でデータを区分するのでソースが読みやすくなります。また、仕様変更や追加があっても既存のソースを修正する範囲が少なくなります。&lt;/p&gt;&lt;p&gt;最近はデータ中心のプログラムが多いしビックデータで動くのでオブジェクト指向プログラミングはかなり重要になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、オブジェクト指向プログラミングも欠点があります。&lt;/p&gt;&lt;p&gt;上の例はすべてデータ重心で説明したので、すごく効率的に見えますが、すべてのプログラムがデータ中心ではありません。&lt;/p&gt;&lt;p&gt;例えば、ロードバランシングや画像チャットなどのデータ中心ではなく、プロセス中心になるプログラムだと逆にオブジェクト指向プログラミングは複雑になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;理解しやい例ではwebサイトを作成する時にmvc(model-view-controller)形式で作成する時があります。&lt;/p&gt;&lt;p&gt;もちろん、データベースからデータを受け取ってクライアント(ブラウザ)にデータを表示することに考えばデータ中心だし、オブジェクト指向プログラミングが良いでしょう。&lt;/p&gt;&lt;p&gt;でも、controllerの立場ならメンバー変数なしでただクライアント(ブラウザ)から要請を受け取って、そのデータによりデータベースからデータからデータを取得します。また、クライアント(ブラウザ)に応答します。&lt;/p&gt;&lt;p&gt;ただ、プロセス処理だけあることなので、要請urlより関数やクラスが増えることがあります。&lt;/p&gt;&lt;p&gt;なので、mvcプロジェクトをする時に、beanデータ(要請データ)やentityデータ(データベースデータ)などはインタフェースから抽象クラス、カプセル化などが良く片付けていますが、controller場合は意味なしでクラスだけたくさんあることをよく見えます。&lt;/p&gt;&lt;p&gt;もちろん、その部分もデベロッパー(開発者)の能力により、どのように設定することで変わると思いますが、様々なプロジェクトを見るとそのようなケースが多いですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のオブジェクト指向プログラミング(oop)の4つの原則(カプセル化、抽象化、継承化、多相化(ポリモーフィズム))に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/21.html</guid><pubDate>Wed, 1 Sep 2021 18:47:47 +0900</pubDate></item><item><title>[C#]  19. 列挙型(enum)を使う方法</title><link>https://www.nowonbun.com/20.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#で列挙型(enum)を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がプログラムを作成する時に、固定値を使う場合があります。その時に変数の定数化(値が変わらない変数)を通って値を定義して使います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/4.html&quot; target=&quot;_blank&quot;&gt;[c#] 3. プログラミングの始めと変数と定数を使う方法&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 181px;&quot; src=&quot;./getattachfile.ajax?idx=1758&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればprintという関数のパラメータのタイプがintタイプなのでただ、1や2を入れても問題なく作動します。&lt;/p&gt;&lt;p&gt;でも、実際のプロジェクトでコーディングする際にコード上でただ1や2で作成すると、次でコードを見る時に何の意味が分からない場合があります。それで意味を分かりやすくするために定数に変換して1や2の意味を分かるように作成します。&lt;/p&gt;&lt;p&gt;上の例では私がtype1とtype2の定数を作成して意味を作ることです。実際にもこのようによく作成しますが、それも可読性の限界があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 182px;&quot; src=&quot;./getattachfile.ajax?idx=1759&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;typeaのパラメータにはatype1とatype2を使ってtypebのパラメータにはbtype1とbtype2を使います。&lt;/p&gt;&lt;p&gt;私がソースを読みやすいためにtypeaのパラメータの定数とtypebのパラメータの定数を区分しておきました。でも、このパラメータのデータタイプはintタイプなので、区分してもtypeaパラメータにもbtype1やbtype2定数を使っても問題ありません。&lt;/p&gt;&lt;p&gt;でも、そのルールを従って作成しないと、後でソースを解析する立場で意味が可笑しくなります。可読性が悪くなることも当たり前です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それを整理することが可能にするものが列挙型(enum)です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 182px;&quot; src=&quot;./getattachfile.ajax?idx=1759&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;定数を列挙型に纏めてtypeaのパラメータにtypebを入れることや数の1を入れて間違いコーディングを作成することができないし、可読性が悪くならないことにして、綺麗なソースコードを作成することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;列挙型は単純な定数の値を処理することではなく、bit flag値を設定して、もっと読みやすいソースコードを作成することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 223px;&quot; src=&quot;./getattachfile.ajax?idx=1757&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はビットのtype1とtype4、type7をor演算処理してパラメータに渡して、and演算処理してデータのflag情報を取得することができます。&lt;/p&gt;&lt;p&gt;つまり、一つの変数でflagの情報を格納、取得ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 176px;&quot; src=&quot;./getattachfile.ajax?idx=1756&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;tostring関数を利用すると列挙型の値ではなく、ソースに作成した列挙型の文字が出力します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私は新入社員の際に先輩からプログラム作成する時に定数、変数の宣言の以外にソースで数字があればハードコーディングだし、設計およびコーディング失敗だと聞きながら学びました。(ハードコーディングというのはソースで数字があることの意味だけではありません。)&lt;/p&gt;&lt;p&gt;そのため、先輩がプログラム作成作業が終わるといつも定数と変数にデータを置換した記憶があります。でも、仕様によりがあるのでソースで数字があることで設計失敗ではありません。少し極端的だったんですね。&lt;/p&gt;&lt;p&gt;つまり、定数に置換することより数字の1のデータがもっと明確な場合もあります。なので仕様によりですね。凄く珍しいですが。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;大きいプロジェクトは一人で作成する場合はありません。大きいプロジェクトじゃなくてもハードコーディングが多くなると作成した時期には分かるかも知らないけど、一か月だけ過ぎても分からなくなります。&lt;/p&gt;&lt;p&gt;そのため、ソース可読性は凄く重要です。可読性のため、コメントがありますが、ソースのすべてのところでコメントを付けることもできないし、コメントが多すぎるなら逆にソースが汚くなり、ソース可読性が悪くなります。&lt;/p&gt;&lt;p&gt;なので、ソース可読性のために列挙型は凄く重要な文法と言います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#で列挙型(enum)を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/20.html</guid><pubDate>Tue, 31 Aug 2021 19:42:39 +0900</pubDate></item><item><title>[C#] 18. 構造体(Struct)、そして値型を参照するタイプ(Reference of value type)と参照型を参照するタイプ(Reference of reference type)</title><link>https://www.nowonbun.com/19.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#で構造体(struct)、そして値型を参照するタイプ(reference of value type)と参照型を参照するタイプ(reference of reference type)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でクラスとインスタンス生成に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/11.html&quot; target=&quot;_blank&quot;&gt;[c#] 10. クラスを作成する方法(コンストラクタ、デストラクタ)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/12.html&quot; target=&quot;_blank&quot;&gt;[c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的にc#で構造体というのはクラスと似ています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 187px;&quot; src=&quot;./getattachfile.ajax?idx=1752&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればクラスを作成することと構造体を作成することは同じですね。&lt;/p&gt;&lt;p&gt;クラスと構造体が何の差異があるかとみれば値型を参照するタイプ(reference of value type)と参照型を参照するタイプ(reference of reference type)があります。&lt;/p&gt;&lt;p&gt;つまり、クラスの場合はheapメモリにクラスのインスタンス生成してstackメモリに変数を設定してインスタンスのポインタを格納します。&lt;/p&gt;&lt;p&gt;そうしたら、他の変数にイコール(=)を使ってポインタ値を格納するかパラメータでポインタを渡した後、インスタンスの値を変更したら、他に連携したインスタンスにも影響になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 200px;&quot; src=&quot;./getattachfile.ajax?idx=1753&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみればexの変数のdataの値が変わっています。&lt;/p&gt;&lt;p&gt;つまり、クラスの参照するタイプ(reference of reference type)は下記とおりに連携しています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=53&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 600px;&quot;&gt;&lt;/p&gt;&lt;p&gt;クラスの連携構造は以前に説明したことがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも構造体がクラスと違いいます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 187px;&quot; src=&quot;./getattachfile.ajax?idx=1752&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースは以前のexampleクラス(class)で構造体(struct)に変更したことしかありません。&lt;/p&gt;&lt;p&gt;でも、結果は違います。&lt;/p&gt;&lt;p&gt;構造体の連携図をみれば下記通りになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 600px;&quot; src=&quot;./getattachfile.ajax?idx=1755&quot; data-filename=&quot;003.jpg&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;構造体はイコール(=)でポインタコピーではなく、インスタンスがコピーされています。&lt;/p&gt;&lt;p&gt;これが値型を参照するタイプ(reference of value type)と言います。&lt;/p&gt;&lt;p&gt;つまり、我々が原始データを扱う時、つまり、int a=1;int b=a;ということに設定する場合、変数のbを設定したら変数のaの値は変わらないです。これが値型を参照するタイプ(reference of value type)です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、この構造体(struct)を関数のパラメータにデータを渡す時、値型を参照するタイプ(reference of value type)ではなく、参照するタイプ(reference of reference type)に渡したい時があります。&lt;/p&gt;&lt;p&gt;その時にrefキーワードを使って参照するタイプ(reference of reference type)に変更ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 200px;&quot; src=&quot;./getattachfile.ajax?idx=1753&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;当たり前の話ですが、refキーワードを使わないと、構造体は値型を参照するタイプでデータ値が移動するので、exの値が変更されていません。&lt;/p&gt;&lt;p&gt;クラスには基本に参照型を参照するタイプなので要りません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;構造体はクラスと違い特性があります。&lt;/p&gt;&lt;p&gt;まず、パラメータがないコンストラクタは作成できません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 482px;&quot; src=&quot;./getattachfile.ajax?idx=1754&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メンバー変数をpublicで外部から参照することに設定すると思えば、newキーワードを使わなくて、インスタンス生成ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 187px;&quot; src=&quot;./getattachfile.ajax?idx=1752&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので、構造体はヌル(null)が存在しません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;構造体は基本構造が値型を参照するタイプなので継承が存在しません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;個人的な考えですが、この構造体は以前のc++言語の跡ではないかと思います。c++には構造体を使ったらバイナリを構造体タイプに読み込むことができます。&lt;/p&gt;&lt;p&gt;でも、その機能がc#ではできません。なので、c#で構造体をあまり使わないですね。&lt;/p&gt;&lt;p&gt;なぜなら、クラスと使う方法も似ているし、カプセルとクラスの値型を参照するタイプ(reference of value type)と参照型を参照するタイプ(reference of reference type)の差異があるので、混乱するし読みやすさ(可読性)が悪くなる欠点があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#で構造体(struct)、そして値型を参照するタイプ(reference of value type)と参照型を参照するタイプ(reference of reference type)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/19.html</guid><pubDate>Tue, 31 Aug 2021 18:20:54 +0900</pubDate></item><item><title>[C#] 17. thisとbaseのキーワード</title><link>https://www.nowonbun.com/18.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のthisとbaseのキーワードに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でクラスのインスタンスを生成する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/12.html&quot; target=&quot;_blank&quot;&gt;[c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスの構成は基本的にメンバー変数と関数があります。c#にはプロパティやデリゲート、イベントなどがありますが、全部関数の変形型なので、関数で思えば良いです。&lt;/p&gt;&lt;p&gt;ここで我々がクラスを継承する時に親クラスのメンバー変数、関数を参照する時もあるし、本クラスを参照する時があります。その時に再定義する場合、関数名が同じなので参照する区分が必要です。&lt;/p&gt;&lt;p&gt;また、関数の中で、メンバー変数名とパラメータ名が同じの場合は？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1747&quot; style=&quot;width: 255px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればexampleクラスのprint関数にはパラメータ名をdataで受け取ってクラスのメンバー変数にはdataの変数名があります。&lt;/p&gt;&lt;p&gt;この場合に関数の中でdata変数を呼ばれると基本的にstack領域の内部のdataを参照します。つまり、パラメータのdataを参照します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうならstackで同じ名の変数名がある場合にメンバー変数のdataを使うことできないかな。&lt;/p&gt;&lt;p&gt;そのため、thisキーワードがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インスタンス中でthisの意味は本クラスのインスタンスを指すことになります。つまり、this.dataということに使うとメンバー変数を指すことになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1748&quot; data-filename=&quot;002.png&quot; style=&quot;width: 296px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば、this.dataはメンバー変数を指しているので、結果が10になることを確認しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;少し正確にインスタンスのポインタアドレスで確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1751&quot; data-filename=&quot;003.png&quot; style=&quot;width: 227px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でex変数名になっているインスタンスでgetinstance関数を呼び出してthisでリターンします。&lt;/p&gt;&lt;p&gt;thisはexのインスタンスを指すことです。リターンを受け取ったex1のhashcodeをみればexと同じインスタンスって確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうならthisは自分のインスタンスを指していますが、継承する場合に親クラスを参照する必要がある時があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1747&quot; style=&quot;width: 255px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;subexampleでgetdata関数を再定義しました。しかし、仕様により親クラスのgetdata関数を参照したい時があります。その場合はthisではなく、baseキーワードで参照することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1748&quot; data-filename=&quot;002.png&quot; style=&quot;width: 296px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の場合はprint関数でbaseキーワードを使っているので親クラスのexampleクラスのgetdata関数が呼び出しました。&lt;/p&gt;&lt;p&gt;exampleクラスのgetdata関数でthisを使っていますが、この場合はsubexampleではなく、exampleクラスのメンバー変数を参照することになります。&lt;/p&gt;&lt;p&gt;(※baseはthisみたいにインスタンス変換ができない。つまり、return baseということはあり得ない。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてbaseは親クラスのコンストラクタ呼び出すこともできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1750&quot; style=&quot;width: 311px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;本クラスのコンストラクタの隣でコロン(:)を入れてbaseを入れて親クラスのコンストラクタを呼び出すことができます。&lt;/p&gt;&lt;p&gt;ここでコンストラクタにパラメータがない場合は省略もできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1749&quot; style=&quot;width: 240px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はbaseを入れなくても親クラスのコンストラクタが呼び出しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のthisとbaseのキーワードに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/18.html</guid><pubDate>Fri, 27 Aug 2021 14:37:25 +0900</pubDate></item><item><title>[C#] 16. 継承禁止のキーワードのsealed</title><link>https://www.nowonbun.com/17.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#の継承禁止のキーワードのsealedに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でクラスを継承する方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/14.html&quot; target=&quot;_blank&quot;&gt;[c#] 13. クラスの継承と再定義(override)する方法、overrideとnewの差異&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスを継承する理由に関して簡単に説明すると同じコードの作成を避けるし再使用率を高めるために使います。しかし継承することで親クラスを直接参照ができることになります。もし、ライブラリを配布する立場ならセキュリティや様々な理由でクラスの継承をできないようにする場合もあります。&lt;/p&gt;&lt;p&gt;例えば、我々がよく使うstringクラスがありますが、このstringクラスは他のクラスと違い、ソース上の文字列なリートンネルを直接に読み込みする機能(string a = &quot;test&quot;; つまり、インスタンス生成なnewキーワードを使わなく、ソース上の直接にstringで割り当て変換)があるため、stringクラスを継承すると様々な部分で効率的にプログラムを再構成することができます。&lt;/p&gt;&lt;p&gt;しかし、よく使えることならそうですが、すべてのプロジェクトが設定と規約通りに作成しないので、プロジェクトを進めるときっと始めの意図より違いに使うことになり、stringのオブジェクトを継承するクラスは実は拡張文字列を作りたかったと思いますが、変なクラスになり、後は凄く複雑なプログラムができる可能性が高いです。(例、c++のoperatorと前処理問い合わせ欠点)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、その問題を発生しないため、継承禁止するキーワードが必要ですが、それがsealedキーワードです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1745&quot; style=&quot;width: 571px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;単純にクラス前にabstractキーワードみたいにsealedキーワードを入れれば継承禁止になります。&lt;/p&gt;&lt;p&gt;visual studioでエラーを発生してコンパイルからできないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラス継承はできますが、関数の再定義をてきないように設定することもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1746&quot; data-filename=&quot;002.png&quot; style=&quot;width: 785px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はexampleクラスをsubexampleクラスが継承して、subexample2クラスがまたsubexampleクラスを継承しました。&lt;/p&gt;&lt;p&gt;ここでprint関数をsubexampleクラスでexampleクラスから再定義して、subexample2クラスでsubexampleクラスから再定義しようと作成しましたが、subexampleクラスからprint関数をsealed設定して再定義をできないようにしましたので、エラーが発生しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで参考にoverrideではなく、newキーワードを使うと再定義ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1744&quot; data-filename=&quot;003.png&quot; style=&quot;width: 216px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はsubexample2クラスからnewキーワードを使って再定義しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はnewを使えば再定義をするように見えますが、実は再定義ではなく、同じ名で関数をまた作成することで指示子により呼ばれる関数が変わります。&lt;/p&gt;&lt;p&gt;そのことに関しては以前の投稿で説明したことがあるので、ご参考してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/14.html&quot; target=&quot;_blank&quot;&gt;[c#] 13. クラスの継承と再定義(override)する方法、overrideとnewの差異&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#の継承禁止のキーワードのsealedに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/17.html</guid><pubDate>Fri, 27 Aug 2021 11:36:05 +0900</pubDate></item><item><title>[C#] 15. インタフェース(interface)</title><link>https://www.nowonbun.com/16.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のインタフェース(interface)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でインスタンスを生成する方法と継承に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/12.html&quot; target=&quot;_blank&quot;&gt;[c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/14.html&quot; target=&quot;_blank&quot;&gt;[c#] 13. クラスの継承と再定義(override)する方法、overrideとnewの差異&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスの共通的な内容を抽象クラスで作成して継承しながらクラスを定義することに関して説明しました。&lt;/p&gt;&lt;p&gt;でも、c#では二つ以上の抽象クラスを継承することができません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1742&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;エラーが発生します。理由としては、複数継承エラーです。&lt;/p&gt;&lt;p&gt;複数の継承でも上みたいに使うと問題がなさそうです。でも、print関数がexampleのクラスではなく、抽象クラスにある関数なら。&lt;/p&gt;&lt;p&gt;継承するクラスではatypeabstractclassのクラスの関数が使うかbtypeabstractclassのクラスの関数が使うかを分からなくなります。&lt;/p&gt;&lt;p&gt;それでc#には複数の継承を禁止させています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の話はheapメモリの中でも話です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならstackメモリに変数を宣言する時にはオブジェクトの特性上のオブジェクト別に片付ける必要がある時があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1741&quot; data-filename=&quot;002.png&quot; style=&quot;width: 341px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;exampleクラスを見ればiatypeinterfaceのインタフェースとibtypeinterfaceのインタフェースを継承しました。&lt;/p&gt;&lt;p&gt;つまり、iatypeinterfaceのインタフェースの関数とibtypeinterfaceのインタフェースの関数を再定義すべきです。&lt;/p&gt;&lt;p&gt;それで二つのインタフェースを継承したexampleクラスは二つのインタフェースの関数を再定義しました。&lt;/p&gt;&lt;p&gt;aexampleクラスの場合はiatypeinterfaceインタフェースを継承したので、iatypeinterfaceインタフェースの関数を再定義しました。&lt;/p&gt;&lt;p&gt;bexampleクラスの場合はibtypeinterfaceインタフェースを継承したので、ibtypeinterfaceインタフェースの関数を再定義しました。&lt;/p&gt;&lt;p&gt;そしてmain関数でインスタンスを生成してprint関数を呼び出ししました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インタフェースは抽象クラスと違うのが中でメンバー変数と一般関数を実装することができません。ただ、定義だけします。そうなので、継承する関数では再定義(override)のキーワードを付けてありません。&lt;/p&gt;&lt;p&gt;こんなことを見れば、内部の動作実装やメモリの割り当てのメンバー変数の実装がなく、ただ定義だけあるのでなぜ必要か分からないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;しかし、stackメモリにインスタンスのポインタ値を入れてheapメモリに割り当てします。つまり、クラスの実体はheapメモリにあり、それを我々はオブジェクト(object)といいます。&lt;/p&gt;&lt;p&gt;簡単なプログラムはこのオブジェクトが何個しかないですが、大きいプログラムはこのオブジェクトがすごく多いです。我々はこのオブジェクトを役割や性質により分類する必要があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1743&quot; data-filename=&quot;003.png&quot; style=&quot;width: 348px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例みたいにインスタンスの三つを割り当てして各インタフェースグループにより分類してprint関数を呼び出して出力しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1740&quot; style=&quot;width: 329px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関数を利用してパラメータによりインスタンスの生成を別にすることができます。&lt;/p&gt;&lt;p&gt;gettypeclass関数によりtrueの場合はaexampleクラスのインスタンスを生成するし、falseの場合はbexampleクラスのインスタンスを生成します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このようにインタフェースは直接にインスタンスを生成することではないですが、生成されたインスタンスをインタフェースにより分類ができます。&lt;/p&gt;&lt;p&gt;そしてインタフェースはoopのデザインパターン(プロジェクト設計)の基礎になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のインタフェース(interface)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/16.html</guid><pubDate>Thu, 26 Aug 2021 17:00:48 +0900</pubDate></item><item><title>[C#] 14. 抽象クラス(abstract)と抽象メソッド(abstract)、そして仮想関数(virtual)</title><link>https://www.nowonbun.com/15.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#で使う抽象クラス(abstract)と抽象メソッド(abstract)、そして仮想関数(virtual)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でクラスの継承、再定義する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/14.html&quot; target=&quot;_blank&quot;&gt;[c#] 13. クラスの継承と再定義(override)する方法、overrideとnewの差異&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスの継承は基本的にクラスの機能をそのままに引き続きに継承して新しくクラスを拡張、修正する概念だと説明しました。そのところで、親クラスは継承する前にもインスタンスを生成して使えますが、今回はクラス自体は使えない不完全なクラスでただ継承して再定義してから使うクラスを紹介します。&lt;/p&gt;&lt;p&gt;つまり、クラス自体をインスタンス生成が不可能で継承して再定義して使えるという意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1737&quot; data-filename=&quot;001.png&quot; style=&quot;width: 312px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればabstractexampleクラスのgetdata関数は宣言だけして内容は実装してないです。&lt;/p&gt;&lt;p&gt;そしてクラスと関数の前にabstractのキーワードを使いました。それならabstractexampleクラスは抽象クラスになり、getdataは抽象メソッドになります。&lt;/p&gt;&lt;p&gt;つまり、抽象クラスは未完成クラスで抽象クラス自体はインスタンス生成ができなくて、必ず継承してから使えます。&lt;/p&gt;&lt;p&gt;また、抽象メソッドは継承するクラスで必ず再定義(override)すべきになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので、exampleクラスで抽象クラスのabstractexampleクラスを継承する時に抽象メソッドを再定義(override)しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この抽象クラスを使う目的は多いクラスの共通部分を一つに取り縛って共通クラスとして実装する時によく使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1739&quot; style=&quot;width: 262px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のmain関数で指示子は抽象クラスでインスタンス生成して割り当てするのは継承したクラスです。&lt;/p&gt;&lt;p&gt;その関係に関しては以前の投稿で説明したことがあるのでご参考してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/12.html&quot; target=&quot;_blank&quot;&gt;[c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;またmain関数をみるとforeachでprint関数を呼び出します。&lt;/p&gt;&lt;p&gt;指示子の抽象クラスには実装はしてないですが、print関数が宣言されています。なので、print関数を呼び出して各インスタンスの関数を呼び出すことができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果はprint関数の文言と各インスタンスで再定義した関数getdataの結果がコンソールに出力されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;abstarctクラスで関数が実装されていますが、virtualキーワードを使って再定義ができるような関数指定も可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1738&quot; style=&quot;width: 318px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はvirtualキーワードを使って実装された関数を再定義できるように設定しました。&lt;/p&gt;&lt;p&gt;example1クラスでは再定義して結果が再定義したgetdata関数の結果が出力されます。&lt;/p&gt;&lt;p&gt;でもexample2クラスの場合は再定義してないですが、そうするとabstractexampleクラスのgetdata関数の結果が出力されますね。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#で使う抽象クラス(abstract)と抽象メソッド(abstract)、そして仮想関数(virtual)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/15.html</guid><pubDate>Fri, 20 Aug 2021 19:17:30 +0900</pubDate></item><item><title>[C#] 13. クラスの継承と再定義(override)する方法、overrideとnewの差異</title><link>https://www.nowonbun.com/14.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でクラスの継承と再定義(override)する方法、overrideとnewの差異に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロジェクトでクラスを作成する時に既存にあるクラスと似てますが、少しずつ違うクラスを作成する場合があります。また、クラスを修正する時に初期開発の場合はただ修正して使いますが、もし運用中なら既存クラスを勝手に修正すると参照するところでエラーが発生する場合があるので、既存のクラスと似てるクラスを新しく作成するしかないです。&lt;/p&gt;&lt;p&gt;その時に一番簡単な方法はただクラスをコピペして作成したら楽です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例として、我々が10個のクラスをコピペしてクラスを作成しました。でも、コピペした元のクラスでエラー(バグ)が発生しました。その場合はコピペしたクラスを修正するために10回に修正するべきになります。&lt;/p&gt;&lt;p&gt;簡単なプログラムならそれでもできる範囲ですが、仕様が大きいプログラムなら10個だけではなく、100個以上になる可能性もあるので、それをすべて修正することは簡単な話ではありません。参考に実務でもこんなに作成したケースが多いですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので、プログラム言語では既存のクラスの機能をそのままに持ってきて拡張、修正する機能がありますが、それを継承といいます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1736&quot; data-filename=&quot;001.png&quot; style=&quot;width: 244px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればcopyexampleというクラスはexampleのクラスから継承しました。クラスの継承はクラスを生成する時に隣でコロン(:)を付けて親クラスを指定するとクラスが継承になります。&lt;/p&gt;&lt;p&gt;実際にmain関数でcopyexampleクラスのインスタンスを生成して関数を呼び出すとexampleの機能をそのままに使えることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスを継承すると親クラスの機能をそのままに持ってきて関数やメンバー変数を新しく追加することができます。しかし、親クラスの関数や変数でそのままに使わなくて再定義する時もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1733&quot; style=&quot;width: 262px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でcopyexampleクラスでnewキーワードを使って関数を再定義しました。&lt;/p&gt;&lt;p&gt;結果は親クラスのprintの値ではなく、再定義した結果がコンソールに表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実は再定義キーワードはoverrideです。このoverrideは親クラスで再定義を許した場合(abstractやvirtual)に使います。しかし上みたいに親クラスの一般関数を再定義する時にはnewキーワードを使ったらよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1735&quot; style=&quot;width: 262px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はexampleクラスでprint関数にvirtualキーワードを入れて再定義ができるように設定しました。&lt;/p&gt;&lt;p&gt;その後、継承したcopyexampleクラスでoverrideを利用してprint関数を再定義しました。参考に親クラスでvirtual設定しなかった関数をoverrideするとエラーが発生します。&lt;/p&gt;&lt;p&gt;結果は再定義した関数の内容がコンソールに出力します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;overrideとnewは同じく再定義していることに見えますが、根本的な差異があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1734&quot; data-filename=&quot;004.png&quot; style=&quot;width: 280px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でexampleを変数タイプに設定してcopyexample1とcopyexample2クラスのインスタンスを生成しました。&lt;/p&gt;&lt;p&gt;ここで再定義をoverrideしたクラスは派生クラスの再定義した関数でコンソールに出力しますが、newで再定義したクラスはexampleクラスの関数が呼び出しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;改めてまとめるとoverrideにした関数は確実に再定義しました。つまり、heapのインスタンスでprint関数が一つにあることを予想できます。&lt;/p&gt;&lt;p&gt;でもnewで再定義したことはインスタンス中でprint関数が二つがあることです。つまり、変数タイプをexampleにするとexampleのprint関数が呼び出すし、copyexample2にするとcopyexample2のprint関数が呼び出します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でクラスの継承と再定義(override)する方法、overrideとnewの差異に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/14.html</guid><pubDate>Wed, 18 Aug 2021 15:17:07 +0900</pubDate></item><item><title>[C#] 12. Staticとアクセス修飾子、そしてカプセル化</title><link>https://www.nowonbun.com/13.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でstaticとアクセス修飾子、そしてカプセル化に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でインスタンス生成とstackメモリとheapメモリに関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/12.html&quot; target=&quot;_blank&quot;&gt;[c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#では基本的にnewのキーワードでクラスのインスタンスを生成してheapメモリにインスタンスを割り当てしてメンバー変数や関数などを呼び出して使えます。このことがc#の最小の実行単位になります。&lt;/p&gt;&lt;p&gt;それならmain関数はどうでしょう。つまり、我々が実行関数と呼ばれるmain関数を呼び出すためにはクラスのインスタンスを何処で生成して割り当てするでしょう。&lt;/p&gt;&lt;p&gt;改めて考えると我々が関数を呼び出すためにはインスタンス生成が必要です。つまり、鶏が先か、卵が先かの話ですね。関数を呼び出すためにはインスタンスが必要、ならインスタンスを何処で生成する？&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それであるキーワードはstaticです。このstaticが付けているクラス、関数、変数はプログラムが開始する時にstackメモリに登録します。&lt;/p&gt;&lt;p&gt;つまり、インスタンスの生成がなくても関数や変数を使えるという意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1729&quot; data-filename=&quot;001.png&quot; style=&quot;width: 258px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればexampleクラスのインスタンスを生成せずに、print関数を呼び出すことができます。&lt;/p&gt;&lt;p&gt;その中でmain関数は少し特別な規約がありますが、staticが付けられたmain関数はプロジェクトの中で必ず一つだけです。プログラム内でmain関数が二つなら開始の実行関数が分からなくなるのでです。&lt;/p&gt;&lt;p&gt;このstaticキーワードは関数だけではなく、変数にも付けることができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1732&quot; data-filename=&quot;002.png&quot; style=&quot;width: 277px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればexampleクラスのインスタンスを二つ生成して各のインスタンスのメンバー変数にデータを格納しました。でも結果はex1とex2のインスタンスのメンバー変数が同じ値が出力されます。つまり、exampleのdataメンバー変数はインスタンスと関係ずにプログラムが実行する時に生成する変数だからです。&lt;/p&gt;&lt;p&gt;それならインスタンスと関係ないのでmain関数から直接にメンバー変数を参照することができると思いますが、実はprivateというアクセス修飾子により参照ができません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アクセス修飾子は実行する位置(ステップ)でクラスや関数、変数を参照する権限(?)と思えば良いです。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;    &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;     &lt;thead&gt;      &lt;tr&gt;       &lt;th&gt;アクセス修飾子&lt;/th&gt;       &lt;th&gt;内部クラス&lt;/th&gt;       &lt;th&gt;外部クラス&lt;/th&gt;       &lt;th&gt;派生クラス&lt;/th&gt;       &lt;th&gt;プロジェクト&lt;/th&gt;      &lt;/tr&gt;     &lt;/thead&gt;     &lt;tbody&gt;      &lt;tr&gt;       &lt;th&gt;public&lt;/th&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;th&gt;private&lt;/th&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;&lt;/td&gt;       &lt;td&gt;&lt;/td&gt;       &lt;td&gt;&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;th&gt;protected&lt;/th&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;th&gt;internal&lt;/th&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;th&gt;protected internal&lt;/th&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;&lt;/td&gt;      &lt;/tr&gt;     &lt;/tbody&gt;    &lt;/table&gt;   &lt;/div&gt;&lt;p&gt;c#には総五つのアクセス修飾子がありますがよく使うアクセス修飾子はpublic、private、protectedです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1731&quot; style=&quot;width: 239px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;main関数ではexampleクラスのインスタンスのexにpublicで設定した関数だけ呼び出されることを確認できます。なぜならmain関数はexのインスタンスの中をみればすべて外部の位置になるからです。&lt;/p&gt;&lt;p&gt;call関数ではexampleクラスの内部で認識するので、すべてのアクセス修飾子でアクセスが可能です。&lt;/p&gt;&lt;p&gt;subexampleクラスのexampleクラスの派生クラスなのでpublic、protectedのアクセス修飾子だけアクセスできます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#になぜこのアクセス制限をするかというとオブジェクト指向プログラミング(oop)の特性のカプセル化のためです。&lt;/p&gt;&lt;p&gt;oopでクラスの意味は一つのオブジェクト(object)ということに認識して設計します。つまり、我々が成績プログラムを作成すると思えば、クラスで人の意味のクラスを作成してその中で成績データを格納することを考えましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1730&quot; style=&quot;width: 305px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればpersonというクラスに国語、数学、英語の成績をコンストラクタを利用してデータを格納します。&lt;/p&gt;&lt;p&gt;そしてコンストラクタの中ではinit関数を呼び出して総点と平均点数を計算します。ここでクラスのメンバー変数はすべてprivateに設定します。&lt;/p&gt;&lt;p&gt;そして出力関数を呼び出してコンソールに成績を出力します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もしかしてメンバー変数がすべてpublicに思えば。。&lt;/p&gt;&lt;p&gt;init関数とprint関数が意味がなくなります。ただ、main関数で変数を値を参照して出力したらいいので。。&lt;/p&gt;&lt;p&gt;改めていえば、クラスの意味がなくなります。ただ、変数を集まった単位だけです。&lt;/p&gt;&lt;p&gt;つまり、クラスの区分をちゃんとせずに、プログラムを開発しないと結果的にソースがめちゃくちゃになる可能性も高いし、ソースの可読性(読みやすさ)が悪くなります。メンバー変数のデータを更新や参照するところが何処かのことを分からなくなります。&lt;/p&gt;&lt;p&gt;もちろん、oopのコード規約を守らなくても開発ができないことではありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;oopの標準にはメンバー変数は必ずprivateに設定、外部で参照する関数はpublicに設定、参照しない関数はprotectedに設定することがルールです。&lt;/p&gt;&lt;p&gt;oopに関してはもっと詳細的に説明が必要なので別途の投稿で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でstaticとアクセス修飾子、そしてカプセル化に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/13.html</guid><pubDate>Wed, 4 Aug 2021 19:29:21 +0900</pubDate></item><item><title>[C#] 11. インスタンスう生成(new)とメモリ割り当て(StackメモリとHeapメモリ)そしてヌル(null)</title><link>https://www.nowonbun.com/12.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はインスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でクラスを作成する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/11.html&quot; target=&quot;_blank&quot;&gt;[c#] 10. クラスを作成する方法(コンストラクタ、デストラクタ)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスを作成してインスタンスを生成する方法でnewというキーワードを使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1725&quot; style=&quot;width: 245px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでexample ex = new example(int)の意味はexampleタイプのex変数にnew exampleのインスタンスを生成してintタイプのパラメータを持つコンストラクタを呼び出すことの意味です。&lt;/p&gt;&lt;p&gt;先に確認しべきなところは変数の宣言です。以前に変数宣言に関して説明したことがありますが、変数宣言にはデータタイプと値が一致しなければならないです。つまり、intタイプに実数タイプを格納するか文字列を格納することができないみたいにexampleタイプには必ずexampleクラスのインスタンスが格納しなければならないです。&lt;/p&gt;&lt;p&gt;このexample exは割り当てメモリアドレスを指していることで一応ポインター変数といいます。つまり、変数に値が格納することではなく、メモリアドレスが格納することです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=53&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 600px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のイメージみたいな構造になります。&lt;/p&gt;&lt;p&gt;ここでstackメモリとheapメモリの構造が表させています。&lt;/p&gt;&lt;p&gt;stackメモリは我々がプログラムで関数を作成する時に実行領域を設定する中括弧({})があります。この中括弧の領域を我々はstack領域といいます。このstack領域で宣言する変数の値はstackメモリに格納することで思えば良いです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1727&quot; data-filename=&quot;002.png&quot; style=&quot;width: 500px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のイメージを見ればmain関数の中で任意な中括弧を使って新しいstack領域を生成しました。その新しいstack領域でintタイプのdata変数を宣言しましたが、領域の外側で使ったら存在しない変数というエラーメッセージが表示されます。&lt;/p&gt;&lt;p&gt;つまり、example exはmain関数のstack領域で宣言した変数という意味になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;new example(10)はheap領域で割り当てしたインスタンスですが、heapはプログラムの領域のメモリ構造です。つまり、プログラムが実行する時にheapメモリの領域が生成してそのメモリの領域を自由にインスタンスを生成したり解除したりすることが可能です。プログラムが終了するとheapメモリは無くなります。&lt;/p&gt;&lt;p&gt;heapメモリにインスタンスの割り当てはnewキーワードを使って生成が可能し、gc(ガベージコレクション)でメモリ解除が行います。stack領域の差異はstackアルゴリズムでそのアドレスの位置を探すことができますが、heapメモリはメモリアドレスを知らないと探すことができません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;改めてまとめるとstackメモリは静的なメモリ領域でデータを探しやすいですが(stackアルゴリズムのpush popでデータを探す)、heapは動的なメモリ領域でnewキーワードでインスタンスを割り当てしたらデータポインタだけでデータを探すことができます。&lt;/p&gt;&lt;p&gt;そしてその二つを連携したことがexample ex = new example(10);の形です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならなぜc#にはこんな複雑にstack=heapの構造でデータを扱うことにするかな?&lt;/p&gt;&lt;p&gt;実のこの概念はc/c++からの概念です。c/c++ではnew(calloc、malloc)を使わなくて、インスタンスをstack領域に割り当てすることができます。原始データタイプ(primitive type)みたいです。&lt;/p&gt;&lt;p&gt;しかし、このstackメモリが大幅にあることではなく、メモリサイズが決まっています。普通はそのサイズが1mb(mega byte)から2mb程です。&lt;/p&gt;&lt;p&gt;ポインタ値のメモリサイズはintタイプで4byteですが、役25万個ごろ宣言することができるサイズです。25万個なら凄く大きいと思いますが、実は多くないです。&lt;/p&gt;&lt;p&gt;そして、stackメモリには変数だけあることではなく、関数の状態(interrupt)などでデータもあります。そうするとstackメモリのサイズが大きいことではありません。最近のプログラムをみれば何gb(giga byte)も簡単に使いますが、それを比べたら1mbは凄く小さいことです。そのいうことでstackメモリをすべて使えばstackoverflowが発生します。&lt;/p&gt;&lt;p&gt;それならこのstackメモリ設定を大きく設定すればよいと思いますが、その通りに大きく設定すればstackoverflowは解決できます。でもstackメモリ構造はstackアルゴリズム構造ですが、pushとpopの形でデータを探すアルゴリズムです。stackアルゴリズムではなく、探索アルゴリズムを持つ構造(データ構造)ならそのサイズが大きくなると遅くなります。&lt;/p&gt;&lt;p&gt;つまり、stackメモリサイズが大きくなるとプログラムは遅くなります。&lt;/p&gt;&lt;p&gt;なので、c\c++みたいにstackメモリにインスタンスを割り当てすることは無理があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;heapメモリはstackメモリみたいに整形化になったデータ構造ではありません。メモリサイズが大きいですが、探索アルゴリズムがないので、データを探すためには必ずメモリ構造が必要です。なのでnew exampleの表現でheapメモリにクラスのインスタンスを割り当てして割り当てしたメモリアドレス(ポインタ)をstackメモリに格納します。&lt;/p&gt;&lt;p&gt;そうすると、stackメモリが1mbで、heapメモリは何gbを使ってもプログラム性能は速くてメモリを大幅で使える構造になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#でそのアドレス値を確認する方法でgethashcode関数を使えば確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1726&quot; data-filename=&quot;003.png&quot; style=&quot;width: 202px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースをみればex1の変数でnewキーワードを使ってインスタンスうを割り当てしました。そしてex2変数にex1変数の値を格納しました。&lt;/p&gt;&lt;p&gt;gethashcodeの関数を使うと値が同じです。つまり、この意味はex1の変数にあるデータとex2の変数にあるデータは同じインスタンスという意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;後でex2の変数にあるインスタンスのメンバー変数のデータを20に変更しました。&lt;/p&gt;&lt;p&gt;結果はex1とex2には同じ結果になりました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=54&quot; data-filename=&quot;004.jpg&quot; style=&quot;width: 600px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上の形で二つの変数に一つのインスタンスを指していることです。つまり、ex1変数とex2変数は同じインスタンスを指しているからex2の変数にあるインスタンスのデータを変更してもex1の変数にあるインスタンスのデータも影響がなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで変数を宣言して、インスタンスを割り当てしてそのポインタを格納することを説明しました。&lt;/p&gt;&lt;p&gt;そうなら変数を宣言する時にインスタンスを割り当てではなく、別にする時にはどうでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その時には変数に「空いている」の表現でヌル(null)ということがあります。つまり、nullの意味はstackメモリには変数を宣言しましたが、heapメモリにはまだインスタンスを割り当てしせずに空いているという意味になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1728&quot; data-filename=&quot;004.png&quot; style=&quot;width: 518px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;変数にnullが設定して関数を呼び出すとインスタンスが宣言されてないですという「null exception」が発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでインスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/12.html</guid><pubDate>Mon, 2 Aug 2021 15:07:51 +0900</pubDate></item><item><title>[C#] 10. クラスを作成する方法(コンストラクタ、デストラクタ)</title><link>https://www.nowonbun.com/11.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でクラスを作成する方法(コンストラクタ、デストラクタ)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#でクラスはプログラムを実行するための最小単位の要素です。つまり、プログラムを実行するために必ず作成しなければならない要素という意味です。&lt;/p&gt;&lt;p&gt;今までの投稿で我々はmain関数の実行関数を作成して実装しました。&lt;/p&gt;&lt;p&gt;しかし、main関数を作成した構造をみるとmain関数を囲まれているprogramのクラスがあるし、クラスを囲まれているexampleのネームスペースがあります。(参考にネームスペース(namespace)は省略してもc#のプログラムを作成することでは問題ありません。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1724&quot; data-filename=&quot;001.png&quot; style=&quot;width: 229px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればnamespaceを除いてprogramクラスだけ生成してその中でmain関数を作成してプログラムを最小単位を設定して実装しました。&lt;/p&gt;&lt;p&gt;エラーがなくてちゃんと実行されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスには作成する構造があります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;    &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;        &lt;thead&gt;            &lt;tr&gt;                &lt;th&gt;クラスの要素&lt;/th&gt;                &lt;th&gt;説明&lt;/th&gt;            &lt;/tr&gt;        &lt;/thead&gt;        &lt;tbody&gt;            &lt;tr&gt;                &lt;td&gt;コンストラクタ&lt;/td&gt;                &lt;td&gt;インスタンスが生成する時(メモリにクラスを割り当て)に呼び出す関数、関数で返却がなしでコンストラクタ名はクラス名と同じです。&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;                &lt;td&gt;デストラクタ&lt;/td&gt;                &lt;td&gt;インスタンスがなくなる時(gcによりメモリ上で解除)に呼び出す関数、クラス名と同じで前に「~」を付けること。&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;                &lt;td&gt;メンバー変数&lt;/td&gt;                &lt;td&gt;フィールドというメンバー変数、クラスないで使う変数&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;                &lt;td&gt;プロパティ&lt;/td&gt;                &lt;td&gt;実行する動作は関数と同じですが、プログラムで使う形式は変数と似ている関数(getter、setter)&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;                &lt;td&gt;インデクサー&lt;/td&gt;                &lt;td&gt;クラスを配列文法を使って使える関数&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;                &lt;td&gt;関数&lt;/td&gt;                &lt;td&gt;クラスの中で実装する処理&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;                &lt;td&gt;イベント&lt;/td&gt;                &lt;td&gt;特定な重ねている実行単位(queue)で呼び出す時に実行する関数&lt;/td&gt;            &lt;/tr&gt;        &lt;/tbody&gt;    &lt;/table&gt;&lt;/div&gt;&lt;p&gt;クラスの基本構想は上の通りです。上の各要素は別の投稿で説明してこの投稿ではクラスを作成してインスタンスを生成(クラスをメモリに割り当て)する方法まで説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムは演算処理はcpuで計算すると思えば、計算した後でデータを格納することはメモリです。&lt;/p&gt;&lt;p&gt;つまり、各intやstringのデータタイプでデータを格納することがメモリに格納することです。クラスの中ではメンバー変数があります。つまり、クラスというのは様々なデータタイプを集まった単位だと思えば良いです。&lt;/p&gt;&lt;p&gt;つまり、クラスの中でintタイプのメンバー変数があると思えば、クラスを使うために集まったデータタイプをメモリに割り当て、つまり、4byteの空間を確保することをインスタンス生成といいます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#ではインスタンス生成するためにnewキーワードを使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1723&quot; data-filename=&quot;002.png&quot; style=&quot;width: 220px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースをみれば、main関数でexamクラスのインスタンスを生成してprint関数を呼び出しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスの構成要素ですべて重要ですが、特にコンストラクタが重要です。&lt;/p&gt;&lt;p&gt;コンストラクタのはインスタンス生成する時に呼び出す関数だと思えば良いです。&lt;/p&gt;&lt;p&gt;コンストラクタも関数の特性なオーバーロード機能多相化(ポリモーフィズム)も使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1722&quot; data-filename=&quot;003.png&quot; style=&quot;width: 313px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インスタンス生成する時(new クラス名())でパラメータにより呼び出すコンストラクタが違います。関数と似てますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、クラスにはデストラクタがあります。デストラクタにはインスタンスがなくなる時に呼び出す関数です。&lt;/p&gt;&lt;p&gt;でも、実際にc#にはこのデストラクタは使うことがありません。&lt;/p&gt;&lt;p&gt;理由はインスタンス解除をプログラム上でできなくて、システム側(framework)のgc(garbage collection)で自動に解除します。なので、いつ呼ばれるかを予測ができません。&lt;/p&gt;&lt;p&gt;c#がc/c++を継承して生成された言語なので、c/c++の残りがありますね。つまり、c/c++の場合はgcがないので、プログラム上でインスタンス解除する時に呼び出して処理する関数ですが、c#ではgcがあるのでいらない要素です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でクラスを作成する方法(コンストラクタ、デストラクタ)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/11.html</guid><pubDate>Fri, 16 Jul 2021 20:45:02 +0900</pubDate></item><item><title>[Javascript ] WebのFull calendar(スケジュールカレンダー)の使い方法</title><link>https://www.nowonbun.com/266.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はwebのfull calendar(スケジュールカレンダー)の使い方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がwebプログラミングを作成したら普通はyahooみたいなポータルサイトより会社や様々なグループなどで使うコミュニティサイトやスケジュール管理サイトを作成することが多いと思います。&lt;/p&gt;&lt;p&gt;そのプロジェクトの中で一番よく使うプレームワークライブラリはwysiwygエディタでウェブ環境でメモ帳みたいに使うエディタ機能だと思います。その以外は多分スケジュール管理するカレンダープレームワークではないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;カレンダープレームワークに関しても様々なプレームワークがありますが、個人的にfull-calendarというライブラリが一番使いやすいではないかと紹介しようと思います。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://fullcalendar.io/&quot; target=&quot;_blank&quot;&gt;https://fullcalendar.io/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1721&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一応fullcalendarを使うために該当なjavascriptとスタイルシート(css)をダウンロードして使ってもよいですが、ウェブ環境の性能のため、cdnリンクを使うほうをお勧めします。&lt;/p&gt;&lt;p&gt;ダウンロードリンク - &lt;a href=&quot;https://fullcalendar.io/docs/initialize-globals&quot; target=&quot;_blank&quot;&gt;https://fullcalendar.io/docs/initialize-globals&lt;/a&gt;&lt;/p&gt;&lt;p&gt;cdnリンク - &lt;a href=&quot;https://www.jsdelivr.com/package/npm/fullcalendar&quot; target=&quot;_blank&quot;&gt;https://www.jsdelivr.com/package/npm/fullcalendar&lt;/a&gt;&lt;/p&gt;&lt;link href=&quot;https://cdn.jsdelivr.net/npm/fullcalendar-scheduler@5.8.0/main.min.css&quot; rel=&quot;stylesheet&quot;&gt;&lt;script src=&quot;https://cdn.jsdelivr.net/npm/fullcalendar-scheduler@5.8.0/main.min.js&quot;&gt;&lt;/script&gt;&lt;script src=&quot;https://cdn.jsdelivr.net/npm/fullcalendar@5.8.0/locales-all.min.js&quot;&gt;&lt;/script&gt;&lt;style&gt;  .fc-header-toolbar {    padding-top: 1em;    padding-left: 1em;    padding-right: 1em;  }  #calendar-container {    border: #000 1px solid;    padding: 10px;    margin: 20px 0px;  }  #calendar a {    color: #000;  }  #calendar1 a {    color: #000;  }  #calendar2 a {    color: #000;  }&lt;/style&gt;&lt;div id=&quot;calendar-container&quot;&gt;   &lt;div id=&quot;calendar&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;script&gt;(function(){$(function(){  var calendarel = $(&apos;#calendar&apos;)[0];  var calendar = new fullcalendar.calendar(calendarel, {    height: &apos;700px&apos;,    expandrows: true,    slotmintime: &apos;08:00&apos;,    slotmaxtime: &apos;20:00&apos;,    headertoolbar: {      left: &apos;prev,next today&apos;,      center: &apos;title&apos;,      right: &apos;daygridmonth,timegridweek,timegridday,listweek&apos;    },    initialview: &apos;daygridmonth&apos;,    initialdate: &apos;2020-09-12&apos;,    navlinks: true,    editable: true,    selectable: true,    nowindicator: true,    daymaxevents: true,    locale: &apos;ja&apos;,    eventadd: function(obj) {      console.log(obj);    },    eventchange: function(obj) {      console.log(obj);    },    eventremove: function(obj){      console.log(obj);    },    select: function(arg) {      var title = prompt(&apos;event title:&apos;);      if (title) {        calendar.addevent({          title: title,          start: arg.start,          end: arg.end,          allday: arg.allday        })      }      calendar.unselect()    },    events: [      {        title: &apos;all day event&apos;,        start: &apos;2020-09-01&apos;,      },      {        title: &apos;long event&apos;,        start: &apos;2020-09-07&apos;,        end: &apos;2020-09-10&apos;      },      {        groupid: 999,        title: &apos;repeating event&apos;,        start: &apos;2020-09-09t16:00:00&apos;      },      {        groupid: 999,        title: &apos;repeating event&apos;,        start: &apos;2020-09-16t16:00:00&apos;      },      {        title: &apos;conference&apos;,        start: &apos;2020-09-11&apos;,        end: &apos;2020-09-13&apos;      },      {        title: &apos;meeting&apos;,        start: &apos;2020-09-12t10:30:00&apos;,        end: &apos;2020-09-12t12:30:00&apos;      },      {        title: &apos;lunch&apos;,        start: &apos;2020-09-12t12:00:00&apos;      },      {        title: &apos;meeting&apos;,        start: &apos;2020-09-12t14:30:00&apos;      },      {        title: &apos;happy hour&apos;,        start: &apos;2020-09-12t17:30:00&apos;      },      {        title: &apos;dinner&apos;,        start: &apos;2020-09-12t20:00:00&apos;      },      {        title: &apos;birthday party&apos;,        start: &apos;2020-09-13t07:00:00&apos;      },      {        title: &apos;click for google&apos;,        url: &apos;http://google.com/&apos;,        start: &apos;2020-09-28&apos;      }    ]  });  calendar.render();});})();&lt;/script&gt;&lt;p&gt;上の例でカレンダーにマウスでドラックしてイベントを追加することができるし、リンクを通ってページ移動、日付をクリックしてカレンダーが移動することなどをテストすることができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私はイベントデータを配列式で設定して固定値になりましたが、ajaxで動的にデータを取得することもできます。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://fullcalendar.io/docs/events-json-feed&quot; target=&quot;_blank&quot;&gt;https://fullcalendar.io/docs/events-json-feed&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その以外にドラック形式のアイテムボックスを生成してイベントをドラックしてカレンダーに設定することが可能なカレンダーも作成することができます。&lt;/p&gt;&lt;style&gt;  #external-events {    float: left;    margin-right: 5px;    width: 115px;    padding: 0 10px;    border: 1px solid #ccc;    background: #eee;    text-align: left;  }  #external-events h4 {    font-size: 11px;    margin-top: 0;    padding-top: 1em;  }  #external-events .fc-event {    margin: 3px 0;    cursor: move;  }  #external-events p {    margin: 1.5em 0;    font-size: 11px;    color: #666;  }  #external-events p input {    margin: 0;    vertical-align: middle;  }  #calendar-wrap {  }  #calendar1 {    max-width: 1100px;    margin: 0 auto;  }&lt;/style&gt;  &lt;div id=&quot;wrap&quot; style=&quot;border: 1px #000 solid; padding:10px; margin: 20px 0px;&quot;&gt;    &lt;div id=&quot;external-events&quot;&gt;      &lt;h4&gt;draggable events&lt;/h4&gt;      &lt;div id=&quot;external-events-list&quot;&gt;&lt;/div&gt;    &lt;/div&gt;    &lt;div id=&quot;calendar-wrap&quot;&gt;      &lt;div id=&quot;calendar1&quot;&gt;&lt;/div&gt;    &lt;/div&gt;  &lt;/div&gt;  &lt;script&gt;  (function(){    $(function(){      var containerel = $(&apos;#external-events-list&apos;)[0];      new fullcalendar.draggable(containerel, {        itemselector: &apos;.fc-event&apos;,        eventdata: function(eventel) {          return {            title: eventel.innertext.trim()          }        }      });      for(var i=1; i&lt;=5;i++) {        var $div = $(&quot;&lt;div class=&apos;fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event&apos;&gt;&lt;/div&gt;&quot;);        $event = $(&quot;&lt;div class=&apos;fc-event-main&apos;&gt;&lt;/div&gt;&quot;).text(&quot;event &quot;+i);        $(&apos;#external-events-list&apos;).append($div.append($event));      }      var calendarel = $(&apos;#calendar1&apos;)[0];      var calendar = new fullcalendar.calendar(calendarel, {        headertoolbar: {          left: &apos;prev,next today&apos;,          center: &apos;title&apos;,          right: &apos;daygridmonth,timegridweek,timegridday,listweek&apos;        },        editable: true,        droppable: true,        locale: &apos;ja&apos;,        height: &apos;700px&apos;,        drop: function(arg) {          arg.draggedel.parentnode.removechild(arg.draggedel);        }      });    calendar.render();    });  })();&lt;/script&gt;&lt;div style=&quot;clear:both;&quot;&gt;&lt;/div&gt;&lt;p&gt;上の例で左にドラックボックスからカレンダーにイベントをドラックアンドドロップが可能です。(モバイルの場合は1秒以上にイベントを押下するとドラックアンドドロップが可能です。)&lt;/p&gt;&lt;p&gt;をドラックアンドドロップは別にajaxで追加するapiがないので、動的に生成するコードを作成しなければならないです。私の場合はfor文で5個生成しました。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://fullcalendar.io/docs/external-dragging&quot; target=&quot;_blank&quot;&gt;https://fullcalendar.io/docs/external-dragging&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてfullcalendarには有料バージョンのtimelineカレンダーもあります。&lt;/p&gt;&lt;style&gt;#calendar2 {  max-width: 1100px;  margin: 40px auto;  padding: 10px;  border: #000 1px solid;  margin: 20px 0px;}&lt;/style&gt;&lt;div id=&quot;calendar2&quot;&gt;&lt;/div&gt;&lt;script&gt;(function(){$(function(){  var calendarel = document.getelementbyid(&apos;calendar2&apos;);  var calendar = new fullcalendar.calendar(calendarel, {    timezone: &apos;utc&apos;,    initialview: &apos;resourcetimelineday&apos;,    aspectratio: 1.5,    headertoolbar: {      left: &apos;prev,next&apos;,      center: &apos;title&apos;,      right: &apos;resourcetimelineday,resourcetimelineweek,resourcetimelinemonth&apos;    },    editable: true,    resourceareaheadercontent: &apos;rooms&apos;,    initialdate: &apos;2021-07-15&apos;,    height: &apos;400px&apos;,    locale: &apos;ja&apos;,    resources: [      {&quot;id&quot;:&quot;a&quot;,&quot;title&quot;:&quot;auditorium a&quot;},      {&quot;id&quot;:&quot;b&quot;,&quot;title&quot;:&quot;auditorium b&quot;,&quot;eventcolor&quot;:&quot;green&quot;},      {&quot;id&quot;:&quot;c&quot;,&quot;title&quot;:&quot;auditorium c&quot;,&quot;eventcolor&quot;:&quot;orange&quot;},      {&quot;id&quot;:&quot;d&quot;,&quot;title&quot;:&quot;auditorium d&quot;,&quot;children&quot;:[       {&quot;id&quot;:&quot;d1&quot;,&quot;title&quot;:&quot;room d1&quot;},       {&quot;id&quot;:&quot;d2&quot;,&quot;title&quot;:&quot;room d2&quot;}]      }    ],    events: [      {&quot;resourceid&quot;:&quot;a&quot;,&quot;title&quot;:&quot;event 1&quot;,&quot;start&quot;:&quot;2021-07-14&quot;,&quot;end&quot;:&quot;2021-07-16&quot;},      {&quot;resourceid&quot;:&quot;b&quot;,&quot;title&quot;:&quot;event 3&quot;,&quot;start&quot;:&quot;2021-07-15t12:00:00+00:00&quot;,&quot;end&quot;:&quot;2021-07-16t06:00:00+00:00&quot;},      {&quot;resourceid&quot;:&quot;d1&quot;,&quot;title&quot;:&quot;event 4&quot;,&quot;start&quot;:&quot;2021-07-15t07:30:00+00:00&quot;,&quot;end&quot;:&quot;2021-07-15t09:30:00+00:00&quot;}    ]  });calendar.render();});})();$(function(){     $(&quot;.fc-license-message a&quot;).attr(&quot;target&quot;, &quot;_blank&quot;);});&lt;/script&gt;&lt;p&gt;上のソースは一般カレンダーではなく、横になっているタイムラインのカレンダーです。&lt;/p&gt;&lt;p&gt;時間関係なスケジューラプログラムを作成する時にいいと思います。&lt;/p&gt;&lt;p&gt;参考に上のソースは有料ライセンスが必要なモジュールです。必要ならfullcalendarでライセンスを購買してから使ったらよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私が良く使うapiは例で説明しましたが、その以外のapiを使いたいならapiドキュメントを確認すればよいと思います。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://fullcalendar.io/docs#toc&quot; target=&quot;_blank&quot;&gt;https://fullcalendar.io/docs#toc&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでwebのfull calendar(スケジュールカレンダー)の使い方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;&lt;style&gt;@media screen and (max-width:768px) {  .fc-button-group button {    padding: 5px!important;    font-size: 10px!important;  }  #external-events {    float: inherit;  }}&lt;/style&gt;</description><category>Open source / Javascript, Jquery, CSS</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/266.html</guid><pubDate>Thu, 15 Jul 2021 21:40:55 +0900</pubDate></item><item><title>[C#] 9. 関数(Method)とオーバーロード、再帰呼び出し</title><link>https://www.nowonbun.com/10.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#の関数(method)とオーバーロード、再帰呼び出しに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿までの例をみればmain関数(実行関数)でソースの上行から下行まで順番に実行されます。この形式で制御文だけでもプログラムを作成することができます。&lt;/p&gt;&lt;p&gt;でも、プログラムが複雑になるし、大きくなるとこの形式だけでは限界があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、その長くなるソースを解決するために、関数(method：メソッド)でソースを分割して作成することができます。&lt;/p&gt;&lt;p&gt;参考にプログラムの関数は数学の関数と同じ意味です。任意の元素(パラメータ)を代入して結果を返却してもらう数学の二項関係式です。&lt;/p&gt;&lt;p&gt;関数のパラメータにデータを入れると関数の中の演算をして返却データタイプにデータに合わせてデータを返却してもらいます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1720&quot; style=&quot;width: 206px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースでexecutemethod1関数とexecutemethod2関数を作成しました。&lt;/p&gt;&lt;p&gt;関数の前にあるキーワードでprivateはアクセス修飾子です。staticは静的タイプに設定するキーワードですが、そのことについては別の投稿で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、データタイプを設定しますが、intの場合は関数から整数のデータタイプの値が返却するという意味です。&lt;/p&gt;&lt;p&gt;なので、関数の中では必ずreturnキーワードを作成しなければならないし、returnデータタイプは必ずintタイプで返却しなければならないです。&lt;/p&gt;&lt;p&gt;voidの場合は返却がないという意味のデータタイプで関数の中でreturnキーワードでデータを返却する必要がないです。(返却データタープがvoidの場合、returnを使うとreturnキーワードがあるところで関数を終了します。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;パラメータはintタイプで受け取ります。パラメータの場合は関数により必須項目ではなく、パラメータが無いことで関数を作成することができます。&lt;/p&gt;&lt;p&gt;main関数(実行関数)でexecutemethod1関数とexecutemethod2関数を呼び出しました。&lt;/p&gt;&lt;p&gt;まず、executemethod1関数からはintタイプのパラメータを要求するので、intタイプの変数のaを渡します。a変数で5の値があるのでexecutemethod1関数を通ると5掛けて10になり、返却データは50になります。&lt;/p&gt;&lt;p&gt;ret変数にはxecutemethod1関数の返却値を格納するので、50のデータがあります。&lt;/p&gt;&lt;p&gt;executemethod2関数にはret変数の値を渡して関数の中でコンソールに出力します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関数をもっと複雑に使いましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1718&quot; data-filename=&quot;002.png&quot; style=&quot;width: 298px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;パラメータでrefとoutというキーワードがあります。refの場合は関数の中で外部の変数を使う意味です。&lt;/p&gt;&lt;p&gt;つまり、関数の中でrefのパラメータのa変数を変更するとmain関数から参照したデータを変更します。その意味では関数の中でパラメータから受け取ったデータ(refが無いパラメータ)は変更しても関数の外部のデータは影響がありません。&lt;/p&gt;&lt;p&gt;結果みるとbのデータを変更してもmain関数のb変数は5です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データ返却が一つではなくて、何個になる時もあります。&lt;/p&gt;&lt;p&gt;つまり、基本返却はreturnを使って返却しますが、パラメータによる返却する方法もあります。&lt;/p&gt;&lt;p&gt;outキーワードは関数の中でデータを関数に外部に返却することです。&lt;/p&gt;&lt;p&gt;executemethod2関数は返却値はvoidデータがパラメータでoutキーワードがあるのでbの変数が123に設定します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はパラメータが一つ、二つに決まっていますが、入力個数が決まってない場合もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1716&quot; data-filename=&quot;003.png&quot; style=&quot;width: 301px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;paramsキーワードはパラメータ個数は可変に設定することができます。可変パラメータとはパラメータ個数が決まってないという意味です。&lt;/p&gt;&lt;p&gt;つまり、executemethod関数のパラメータに3個を入れることも、4個を入れることもできます。&lt;/p&gt;&lt;p&gt;executemethod関数の中では可変パラメータを配列で受け取ります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関数の中で自分自身を呼び出すこともできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1719&quot; style=&quot;width: 174px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はexecutemethod関数でexecutemethod関数を呼び出します。関数で自分自身を呼び出すのを再帰呼び出しといいます。&lt;/p&gt;&lt;p&gt;関数の再帰は数学的の再帰と同じ意味です。つまり、上のコードは数学で「f(x) = x * f(x-1)　※ただし、xは0より大きい」という意味です。&lt;/p&gt;&lt;p&gt;main関数でexecutemethodを呼び出す時に最初に5のデータを入れるので「f(5) = 5 * f(4)」になり、すべての解けると「5 * 4 * 3 * 2 * 1 = 120」になりますね。すなわち、階乗です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#はオブジェクト指向プログラミング(oop)の言語です。このoopはクラスと関係があることですが、クラスの関数を作成する時に多相化(ポリモーフィズム)ということがあります。&lt;/p&gt;&lt;p&gt;多相化(ポリモーフィズム)は同じ返却データタイプと関数名が同じでも、パラメータ個数が違いなら別の関数で認識することです。(もちろん、パラメータ個数とタイプまで同じならエラーに発生します。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1717&quot; data-filename=&quot;005.png&quot; style=&quot;width: 329px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;oopの多相化(ポリモーフィズム)が重要だと言ってもすごく難しい概念ではありません。&lt;/p&gt;&lt;p&gt;上の例をみればexecutemethod関数が二つあります。もちろんデータタイプと同じです。&lt;/p&gt;&lt;p&gt;でも、始めのexecutemethod関数はintタイプを受け取るし二つめはstringタイプを受け取ります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、main関数では入れるデータタイプにより呼び出す関数が違います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#の関数(method)とオーバーロード、再帰呼び出しに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/10.html</guid><pubDate>Wed, 14 Jul 2021 20:20:43 +0900</pubDate></item><item><title>[C#] 8. 配列とリスト</title><link>https://www.nowonbun.com/9.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#の配列とリスト(list)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;配列とは同じデータタイプのデータを連続的に格納するデータタイプです。(参考に連続的に格納することは論理的です。c++と比べてc#はstackメモリ割り当てがないので、物理的には連続ではありません。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1712&quot; data-filename=&quot;001.png&quot; style=&quot;width: 194px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例では配列を10個宣言しました。つまり、intタイプの変数が10個あることです。&lt;/p&gt;&lt;p&gt;配列のインデクスは0から始まります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果は変数名一つで10個のデータが格納しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例みたいな配列を一次配列といいます。つまり、一列にデータがあると想像できますね。&lt;/p&gt;&lt;p&gt;そうなら、多次配列もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1715&quot; data-filename=&quot;002.png&quot; style=&quot;width: 290px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;配列は単純に変数名を一つで何個のデータを格納することの目的ではないです。データが論理的に連続であることを考え、整列などで使うことができます。&lt;/p&gt;&lt;p&gt;整列のは無作為にあるデータを昇順、降順に順番を片付けることです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1713&quot; style=&quot;width: 431px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;初期に配列変数に整列しようと思うデータを格納しました。配列状況を確認するため、無作為なデータを格納しました。&lt;/p&gt;&lt;p&gt;ここで配列0番目と次の位置のデータを比較して大きいデータが高次数に移動するように計算します。0番目の比較が完了すると1番目と次の位置のデータを比較します。&lt;/p&gt;&lt;p&gt;この繰り返しで最高の位置の前のデータまで比較します。(最高の位置のデータは比較する対象がありません。)&lt;/p&gt;&lt;p&gt;この方法で整列することをバブル整列といいます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;次はデバッグ表です。&lt;/p&gt;&lt;div style=&quot;max-width:510px;overflow:auto;border:1px solid #000&quot;&gt;&lt;table style=&quot;width:500px&quot;&gt;	&lt;tbody&gt;		&lt;tr&gt;			&lt;td colspan=&quot;10&quot; style=&quot;text-align:center&quot;&gt;入力値		&lt;/td&gt;&lt;/tr&gt;		&lt;tr&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;512&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;64&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;24&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;7&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;23&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;623&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;1&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;5&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;17&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;10&lt;/td&gt;		&lt;/tr&gt;		&lt;tr&gt;			&lt;td colspan=&quot;10&quot; style=&quot;text-align:center&quot;&gt;1次整列		&lt;/td&gt;&lt;/tr&gt;		&lt;tr&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;64&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;24&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;7&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;23&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;background-color:yellow;&quot;&gt;512&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;1&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;5&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;17&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;10&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;background-color:yellow;&quot;&gt;623&lt;/td&gt;		&lt;/tr&gt;		&lt;tr&gt;			&lt;td colspan=&quot;10&quot; style=&quot;text-align:center&quot;&gt;2次整列		&lt;/td&gt;&lt;/tr&gt;		&lt;tr&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;24&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;7&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;23&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;background-color:yellow;&quot;&gt;64&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;1&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;5&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;17&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;10&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;background-color:yellow;&quot;&gt;512&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;623&lt;/td&gt;		&lt;/tr&gt;		&lt;tr&gt;			&lt;td colspan=&quot;10&quot; style=&quot;text-align:center&quot;&gt;3次整列		&lt;/td&gt;&lt;/tr&gt;		&lt;tr&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;7&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;23&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;background-color:yellow;&quot;&gt;24&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;1&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;5&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;17&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;10&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;background-color:yellow;&quot;&gt;64&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;512&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;623&lt;/td&gt;		&lt;/tr&gt;		&lt;tr&gt;			&lt;td colspan=&quot;10&quot; style=&quot;text-align:center&quot;&gt;4次整列		&lt;/td&gt;&lt;/tr&gt;		&lt;tr&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;7&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;23&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;1&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;5&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;17&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;10&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;background-color:yellow;&quot;&gt;24&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;64&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;512&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;623&lt;/td&gt;		&lt;/tr&gt;		&lt;tr&gt;			&lt;td colspan=&quot;10&quot; style=&quot;text-align:center&quot;&gt;5次整列		&lt;/td&gt;&lt;/tr&gt;		&lt;tr&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;7&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;1&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;5&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;17&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;10&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;background-color:yellow;&quot;&gt;23&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;24&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;64&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;512&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;623&lt;/td&gt;		&lt;/tr&gt;		&lt;tr&gt;			&lt;td colspan=&quot;10&quot; style=&quot;text-align:center&quot;&gt;6次整列		&lt;/td&gt;&lt;/tr&gt;		&lt;tr&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;1&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;5&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;background-color:yellow;&quot;&gt;7&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;10&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;background-color:yellow;&quot;&gt;17&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;23&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;24&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;64&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;512&lt;/td&gt;			&lt;td style=&quot;width:10%;border:1px solid #000;text-align:center;&quot;&gt;623&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;上のデバッグ表で1次整列で512の値がsort[4]まで移動します。なぜなら、sort[5]が623なので、sort[5]より小さいからです。sort[5]は623ですが、623より大きいデータがないので、最後配列に移動します。&lt;/p&gt;&lt;p&gt;2次整列には64がsort[3]まで移動しますね。sort[4]が512からです。sort[4]の場合は623より小さいから最後配列の前に移動します。&lt;/p&gt;&lt;p&gt;この流れで整列が行います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;配列を使う場合には宣言する時に配列の個数を決めて宣言します。&lt;/p&gt;&lt;p&gt;でも、仕様により入力するデータが個数が決めていることではなく、何個を格納するかを最初に知らない場合があります。&lt;/p&gt;&lt;p&gt;その時には個数を決めないリストを使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1714&quot; style=&quot;width: 150px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リストは宣言する時に個数が決まってないです。&lt;/p&gt;&lt;p&gt;つまり、ユーザが入力するほど、続けて入力ができます。配列の場合はインデクスを超えるとエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1711&quot; data-filename=&quot;005.png&quot; style=&quot;width: 473px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これだけ見るとリストがすごく楽ですね。実際も配列よりリストをよく使います。&lt;/p&gt;&lt;p&gt;でも、リストも短所があります。リスト内部にはリスト連結リストアルゴリズムで作成していますが、入力はすごく早いですが、探索が遅いです。&lt;/p&gt;&lt;p&gt;つまり、大量なデータを扱うことになるとリストより配列が探索速度が速いです。でも、これは理論の話で、実際はそれを無視するほどハードウェアの性能が良くなったので普通は9割以上、リストを使います。でも、超大量の状況で探索性能を考えると思えば配列を考えてみる場合もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#の配列とリスト(list)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/9.html</guid><pubDate>Tue, 13 Jul 2021 21:04:45 +0900</pubDate></item><item><title>[C#] 7. 制御文</title><link>https://www.nowonbun.com/8.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#の制御文に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムで制御文というのはプログラムの処理順番を制御するか繰り返して実行することの制御回数を決定することの意味です。&lt;/p&gt;&lt;p&gt;改めて簡単に説明すると、プログラムのコードは基本的にソースの上の行から下の行の向きで処理します。単純に上から下の行に処理の流れの中で繰り返して処理する内容があることもあるし、処理を飛び越える部分、省略しなければならない処理がある可能性があります。&lt;/p&gt;&lt;p&gt;この繰り返し、飛び越える、省略する処理を制御文といいます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;制御文は選択文、繰り返し文、分岐文があります。&lt;/p&gt;&lt;p&gt;選択分は条件により真偽の可否により処理する制御文です。種類はif~else文、switch~case文があります。&lt;/p&gt;&lt;p&gt;繰り返し文は一定な条件が満たす時まで同じ処理を繰り返して処理する制御文です。種類はfor文、while文、do~while文、foreach文があります。&lt;/p&gt;&lt;p&gt;分岐文は流れの処理順番を変わることにする制御文です。break文、continue文です。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;if~else&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;- if~else文は真偽の可否により処理する制御文です&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=28&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 450px;&quot;&gt;&lt;/p&gt;&lt;p&gt;if文の条件が真(true)なら該当なスタックが実行する構造です。最後にelseがあればすべての条件が偽(false)なら実行する流れです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 228px;&quot; src=&quot;./getattachfile.ajax?idx=1706&quot; data-filename=&quot;101.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を説明すれば始めの条件でaの変数の値を確認します。&lt;/p&gt;&lt;p&gt;aのブール値がtrueならif(a)のスタック領域が実行されます。aという変数にtrueの値を格納しましたので、コンソールに「first condition = true」というメッセージが出力しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;二つ目の条件式はif~elseの条件式です。変数aがtrueならif(a)のスタック領域を実行するしfalseならelseのスタック領域を実行します。&lt;/p&gt;&lt;p&gt;二つ目の条件式前に私がaの変数の値をfalseを格納しましたので、コンソールに「second condition = false」というメッセージが出力しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;三つ目の条件式は変数bの値を関係演算子でtrue、falseの値を計算します。&lt;/p&gt;&lt;p&gt;bの値を2で設定しましたので、if(b==2)の条件が真(true)になるので、コンソールに「third condition b = 2」というメッセージが出力しました。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;switch~case&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;- switch~caseは選択文ですが、if~else if~elseと似ている処理をします。&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=27&quot; data-filename=&quot;003.jpg&quot; style=&quot;width: 450px;&quot;&gt;&lt;/p&gt;&lt;p&gt;switch~caseで重要なポイントはbreakです。switchの条件変数に合っている値を探してcaseのスタック領域を実行しますが、breakがキーワードがなければc#ではエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 161px;&quot; src=&quot;./getattachfile.ajax?idx=1703&quot; data-filename=&quot;102.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はdata変数に10の値を格納しました。&lt;/p&gt;&lt;p&gt;なのでswitch~caseでcaseの10の場合の領域を探して実行します。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;for&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;- for文は初期値を設定して終了条件が偽(false)になるまで増加値を変更しながら繰り返してスタック領域を実行する制御文です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=36&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 450px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 201px;&quot; src=&quot;./getattachfile.ajax?idx=1709&quot; data-filename=&quot;103.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はforでiの値を0に設定します。iの値は10より未満なので条件は真(true)になります。&lt;/p&gt;&lt;p&gt;スタック処理領域を実行して増加値でiの値を1を増加します。つまりiの値は1になります。&lt;/p&gt;&lt;p&gt;またiの値が10より未満なので条件は真(true)になります。&lt;/p&gt;&lt;p&gt;また、スタック処理領域を実行します。iが10になるまで繰り返して実行します。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;while&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;- while文はforと同じ繰り返し文ですが、差異は初期化設定と増加値設定がありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=34&quot; data-filename=&quot;003.jpg&quot; style=&quot;width: 450px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 265px;&quot; src=&quot;./getattachfile.ajax?idx=1705&quot; data-filename=&quot;104.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は条件式でiの値を確認することではなく、合算変数が100を超えるまで繰り返します。&lt;/p&gt;&lt;p&gt;つまり、iの値を1から14まで足すと105で100の値を超えるので終了します。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;do~while&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;- do~whileはwhile文と似ていますが、forとwhileの場合はスタック処理を実行する前に条件を確認して実行します。&lt;/p&gt;&lt;p&gt;でも、do~whileはまずスタック処理を実行した後、繰り返すかの可否を確認します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=32&quot; data-filename=&quot;005.jpg&quot; style=&quot;width: 450px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 197px;&quot; src=&quot;./getattachfile.ajax?idx=1707&quot; data-filename=&quot;105.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はiの値が10で設定してdo~whileの条件式で初めから条件が偽(false)です。&lt;/p&gt;&lt;p&gt;でも、条件が合わなくてもdo~whileの処理式を一回実行してコンソールに出力しました。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;- foreachはiteratorパターンと関係がある繰り返し文です。&lt;/p&gt;&lt;p&gt;配列やコレクションのオブジェクト(ノード)を取得して個数程に繰り返し実行する制御です。&lt;/p&gt;&lt;p&gt;※この部分は配列とリストと関係がある部分なので、配列とリストを説明する時に詳しく説明します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 235px;&quot; src=&quot;./getattachfile.ajax?idx=1708&quot; data-filename=&quot;106.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;a変数にintタイプのデータを5個を格納しました。&lt;/p&gt;&lt;p&gt;foreachにより5回に繰り返してデータを出力することを確認できます。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;break&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;- breakは基本的に繰り返し文を抜け出す時に使うキーワードです。switch~case文でも使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 187px;&quot; src=&quot;./getattachfile.ajax?idx=1704&quot; data-filename=&quot;107.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は初期値が0から10になると終了する繰り返し文、for文です。&lt;/p&gt;&lt;p&gt;でも、実行スタック領域で、if条件文があり、iが3の場合にbreakを実行して繰り返し文を抜け出します。&lt;/p&gt;&lt;p&gt;つまり、結果は2まで出力します。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;continue&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;continue文はbreak文と似てます。breakは繰り返し文を抜け出しますが、continueは抜け出すことではなく、実行スタックを止まり、条件式に戻る機能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 228px;&quot; src=&quot;./getattachfile.ajax?idx=1710&quot; data-filename=&quot;108.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば、iの値が偶数の場合はコンソール出力せずに、繰り返しが実行します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#の制御文に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/8.html</guid><pubDate>Mon, 12 Jul 2021 20:12:48 +0900</pubDate></item><item><title>[C#] 6. 演算子</title><link>https://www.nowonbun.com/7.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#の演算子に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がパソコンを使う時にゲームもするし、様々な業務のためにデータを格納するかプログラムを作りますが、実は性能がすごくよい計算機です。&lt;/p&gt;&lt;p&gt;つまり、グラフィックを描画や業務のためのプログラムはすべて計算により出力することです。なので、プログラム中で一番に重量なことは演算です。&lt;/p&gt;&lt;p&gt;演算とは一般数学の足す、引く、掛ける、分ける計算と同じです。　でも、プログラムは単純な数学の計算だけではなく、ビットの計算、論理計算もあります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;	&lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;		&lt;thead&gt;			&lt;tr style=&quot;background-color:#dad7d7&quot;&gt;				&lt;th&gt;演算子&lt;/th&gt;				&lt;th&gt;使用方法&lt;/th&gt;				&lt;th&gt;説明&lt;/th&gt;			&lt;/tr&gt;		&lt;/thead&gt;		&lt;tbody&gt;			&lt;tr&gt;				&lt;td colspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;算術演算子&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;+&lt;/td&gt;				&lt;td&gt;a + b&lt;/td&gt;				&lt;td&gt;足す&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;-&lt;/td&gt;				&lt;td&gt;a - b&lt;/td&gt;				&lt;td&gt;引く&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;*&lt;/td&gt;				&lt;td&gt;a * b&lt;/td&gt;				&lt;td&gt;掛ける&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;/&lt;/td&gt;				&lt;td&gt;a / b&lt;/td&gt;				&lt;td&gt;分ける&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;%&lt;/td&gt;				&lt;td&gt;a % b&lt;/td&gt;				&lt;td&gt;分けるのあまり&lt;/td&gt;			&lt;/tr&gt;            &lt;tr&gt;				&lt;td&gt;++&lt;/td&gt;				&lt;td&gt;++a, a++&lt;/td&gt;				&lt;td&gt;値を1を増加する。(前位、後位演算子)&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;--&lt;/td&gt;				&lt;td&gt;--a, a--&lt;/td&gt;				&lt;td&gt;値を1を減少する。(前位、後位演算子)&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td colspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;関係演算子&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;gt;&lt;/td&gt;				&lt;td&gt;a &amp;gt; b&lt;/td&gt;				&lt;td&gt;aがbより大きいならtrueを返却、小さいや同じならfalseを返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;gt;=&lt;/td&gt;				&lt;td&gt;a &amp;gt;= b&lt;/td&gt;				&lt;td&gt;aがbより大きいか同じならtrueを返却、小さいならfalseを返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;lt;&lt;/td&gt;				&lt;td&gt;a &amp;lt; b&lt;/td&gt;				&lt;td&gt;aがbより小さいならtrueを返却、大きいか同じならfalseを返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;lt;=&lt;/td&gt;				&lt;td&gt;a &amp;lt;= b&lt;/td&gt;				&lt;td&gt;aがbより小さいか同じならtrueを返却、大きいならfalseを返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;==&lt;/td&gt;				&lt;td&gt;a == b&lt;/td&gt;				&lt;td&gt;aとb同じならtrueを返却、違いならfalseを返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;!=&lt;/td&gt;				&lt;td&gt;a != b&lt;/td&gt;				&lt;td&gt;aとbが違いならtrueを返却、同じならtrueを返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td colspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;ビット演算子&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;lt;&amp;lt;&lt;/td&gt;				&lt;td&gt;a &amp;lt;&amp;lt; b&lt;/td&gt;				&lt;td&gt;整数aの2進数値を左にb程移動して余りは0に設定&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;gt;&amp;gt;&lt;/td&gt;				&lt;td&gt;a &amp;gt;&amp;gt; b&lt;/td&gt;				&lt;td&gt;整数aの2進数値を右にb程移動して余りは正数は0に負数は1に設定&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;amp;&lt;/td&gt;				&lt;td&gt;a &amp;amp; b&lt;/td&gt;				&lt;td&gt;aとbをand計算 ex) 4(0100) &amp;amp; 5(0101) = 4(0100)&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;|&lt;/td&gt;				&lt;td&gt;a | b&lt;/td&gt;				&lt;td&gt;aのbをor計算 ex) 4(0100) | 5(0101) = 5(0101)&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;^&lt;/td&gt;				&lt;td&gt;a ^ b&lt;/td&gt;				&lt;td&gt;aとbをxor計算 ex) 4(0100) ^ 5(0101) = 1(0001)&lt;/td&gt;			&lt;/tr&gt;            &lt;tr&gt;				&lt;td colspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;論理演算子&lt;/td&gt;			&lt;/tr&gt;            &lt;tr&gt;				&lt;td&gt;&amp;amp;&amp;amp;&lt;/td&gt;				&lt;td&gt;a &amp;amp;&amp;amp; b&lt;/td&gt;				&lt;td&gt;and演算子、つまりaとbがブール値に定義していてtrue &amp;amp;&amp;amp; trueならtrue、true &amp;amp;&amp;amp; falseならfalseの値を返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;||&lt;/td&gt;				&lt;td&gt;a || b&lt;/td&gt;				&lt;td&gt;or演算子、つまりaとbがブール値に定義していて true || trueならtrue、true || fasleならtrueの値を返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td colspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;代入演算子&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;+=&lt;/td&gt;				&lt;td&gt;a += b&lt;/td&gt;				&lt;td&gt;a = a + b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;-=&lt;/td&gt;				&lt;td&gt;a -= b&lt;/td&gt;				&lt;td&gt;a = a - b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;*=&lt;/td&gt;				&lt;td&gt;a *= b&lt;/td&gt;				&lt;td&gt;a = a * b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;/=&lt;/td&gt;				&lt;td&gt;a /= b&lt;/td&gt;				&lt;td&gt;a = a / b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;%=&lt;/td&gt;				&lt;td&gt;a %= b&lt;/td&gt;				&lt;td&gt;a = a % b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;amp;=&lt;/td&gt;				&lt;td&gt;a &amp;amp;= b&lt;/td&gt;				&lt;td&gt;a = a &amp;amp; b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;|=&lt;/td&gt;				&lt;td&gt;a |= b&lt;/td&gt;				&lt;td&gt;a = a | b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;^=&lt;/td&gt;				&lt;td&gt;a ^= b&lt;/td&gt;				&lt;td&gt;a = a ^ b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;lt;&amp;lt;=&lt;/td&gt;				&lt;td&gt;a &amp;lt;&amp;lt;= b&lt;/td&gt;				&lt;td&gt;a = a &amp;lt;&amp;lt; b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;gt;&amp;gt;=&lt;/td&gt;				&lt;td&gt;a &amp;gt;&amp;gt;= b&lt;/td&gt;				&lt;td&gt;a = a &amp;gt;&amp;gt; b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td colspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;三元演算子&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;?&lt;/td&gt;				&lt;td&gt;a = b == c ? d : e&lt;/td&gt;				&lt;td&gt;bとcが同じならaの変数にdの値を格納、bとcが違いならeの値を格納&lt;/td&gt;			&lt;/tr&gt;		&lt;/tbody&gt;	&lt;/table&gt;&lt;/div&gt;&lt;p&gt;上の算術演算子は一般数学的の演算と同じです。&lt;/p&gt;&lt;p&gt;そして++や--の前位、後位演算子がありますが、その意味は演算が終わって増加するか減少するかの差異です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 168px;&quot; src=&quot;./getattachfile.ajax?idx=1701&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば、bの値には0があります。その意味はaの値は増加する前にaの値がbに格納したのでです。その後でaの値を1に増加しました。&lt;/p&gt;&lt;p&gt;cの値はaの値を増加して格納しました。つまり、aの値が2になってcに格納しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関係演算子と論理演算子の場合は結果がブール値に返却します。&lt;/p&gt;&lt;p&gt;そしてビット演算子の場合は整数タイプだけ使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 228px;&quot; src=&quot;./getattachfile.ajax?idx=1702&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;三元演算子は制御の分岐文と似ている処理になっています。&lt;/p&gt;&lt;p&gt;つまり、「条件式?真のデータ:偽のデータ」の値が返却します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 198px;&quot; src=&quot;./getattachfile.ajax?idx=1700&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#の演算子に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/7.html</guid><pubDate>Mon, 12 Jul 2021 19:56:09 +0900</pubDate></item><item><title>[C#] 5. データタイプ変換(キャスト:Cast)とコメント(Comment)</title><link>https://www.nowonbun.com/6.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデータタイプ変換(キャスト:cast)とコメント(comment)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;データタイプ変換(キャスト:cast)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;以前の投稿でデータタイプに関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/5.html&quot; target=&quot;_blank&quot;&gt;[c#] 04. データタイプとリテラル(literal)、 nullable&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムで我々がすべてのデータタイプを合わせてデータを入力するし、その入力データにより計算することはできません。&lt;/p&gt;&lt;p&gt;例えば、我々はプログラムで実数のデータと整数のデータを受け取りました。&lt;/p&gt;&lt;p&gt;上の例は整数タイプのa変数と実数タイプのb変数の値を足して整数タイプのcの変数に格納したいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1691&quot; style=&quot;width: 824px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;デバッグでデータタイプが違うというエラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすると我々は実数タイプ(float)のデータを整数タイプ(int)に変換しなければならないです。そのことをデータイプ変換、つまりキャスト(cast)と言います。&lt;/p&gt;&lt;p&gt;実数から整数、整数から実数の変換はただ括弧でキャストが可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1692&quot; style=&quot;width: 154px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この括弧でキャストすることは数のデータタイプだけです。つまり、整数タイプから実数タイプ、実数タイプから整数タイプだけです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうなら数タイプではない文字列(string)タイプはどうでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1692&quot; style=&quot;width: 154px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;int32クラスのparse関数を利用すればキャストが可能です。&lt;/p&gt;&lt;p&gt;parse関数はstringタイプだけではなく、実数タイプ(float、double)のキャストも可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;改めてまとめると、キャストする時には数の関係なデータは括弧でキャストが可能ですが、確実にキャストをするためにはint32クラスのparse関数を利用する方が良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、文字列のタイプをキャストする時に文字列に数字だけあることではないです。文字がある可能性もありますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1698&quot; data-filename=&quot;003.png&quot; style=&quot;width: 705px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行中でエラーが発生します。当たり前の話ですが、文字は数字に変換ができないのでエラーが発生しますね。&lt;/p&gt;&lt;p&gt;でも、プログラム中でデータが間違いにある可能性があるので、エラーを発生することよりキャストができないデータならデータデフォルト値(0)に設定する方法があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1693&quot; data-filename=&quot;004.png&quot; style=&quot;width: 153px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は各データタイプのクラスを利用してキャストしました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#にはキャスト専用クラスがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1692&quot; style=&quot;width: 154px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;convertクラスの場合はキャスト専用クラスです。つまり、実数から整数、文字列から整数などをキャストする関数があります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;	&lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;		&lt;thead&gt;			&lt;tr style=&quot;background-color:#dad7d7&quot;&gt;				&lt;th&gt;メソッド&lt;/th&gt;				&lt;th&gt;説明&lt;/th&gt;			&lt;/tr&gt;		&lt;/thead&gt;		&lt;tbody&gt;			&lt;tr&gt;				&lt;td&gt;boolean.parse, boolean.tryparse, convert.toboolean&lt;/td&gt;				&lt;td&gt;ブールタイプにキャスト&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;byte.parse, byte.tryparse, convert.tobyte&lt;/td&gt;				&lt;td&gt;バイナリタイプにキャスト&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;char.parse, char.tryparse, convert.tochar&lt;/td&gt;				&lt;td&gt;ユニーコードタイプにキャスト&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;decimal.parse, decimal.tryparse, convert.todecimal&lt;/td&gt;				&lt;td&gt;実数(decimal)タイプにキャスト&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;double.parse, double.tryparse, convert.todouble&lt;/td&gt;				&lt;td&gt;実数(double)タイプにキャスト&lt;/td&gt;			&lt;/tr&gt;            &lt;tr&gt;				&lt;td&gt;single.parse, single.tryparse, convert.tosingle&lt;/td&gt;				&lt;td&gt;実数(float)タイプにキャスト&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;int16.parse, int16.tryparse, convert.toint16&lt;/td&gt;				&lt;td&gt;符号がある整数(short)タイプにキャスト&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;int32.parse, int32.tryparse, convert.toint32&lt;/td&gt;				&lt;td&gt;符号がある整数(int)タイプにキャスト&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;int64.parse, int64.tryparse, convert.toint64&lt;/td&gt;				&lt;td&gt;符号がある整数(long)タイプにキャスト&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;sbyte.parse, sbyte.tryparse, convert.tosbyte&lt;/td&gt;				&lt;td&gt;符号がある整数(sbyte)タイプにキャスト&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;uint16.parse, uint16.tryparse, convert.touint16&lt;/td&gt;				&lt;td&gt;符号がない整数(ushort)タイプにキャスト&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;uint32.parse, uint32.tryparse, convert.tounit32&lt;/td&gt;				&lt;td&gt;符号がない整数(uint)タイプにキャスト&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;uint64.parse, uint64.tryparse, convert.tounit64&lt;/td&gt;				&lt;td&gt;符号がない整数(ulong)タイプにキャスト&lt;/td&gt;			&lt;/tr&gt;            &lt;tr&gt;				&lt;td&gt;string.parse, string.tryparse, convert.tostring&lt;/td&gt;				&lt;td&gt;文字列にキャスト&lt;/td&gt;			&lt;/tr&gt;		&lt;/tbody&gt;	&lt;/table&gt;&lt;/div&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;コメント(comment)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;プログラムを作成する時(コーディング)にはソース上でメモが必要な時があります。&lt;/p&gt;&lt;p&gt;コメントというのことはソース上でメモや様々な情報を表示するための方法です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#のコメントは三つの種類があります。&lt;/p&gt;&lt;p&gt;一般コメントの一行コメントと多行コメント(複数行コメント)があり、ソース開発が終わった後、ドキュメント(xmldoc)を作成することができるxmlコメントがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1699&quot; style=&quot;width: 476px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コメントを利用してソース上でメモを作成することができます。つまり、コメントの内容はプログラムのビルドやコンパイルする時に全然影響されません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;xmlコメントの場合はプロジェクトが完了した後でドキュメントに出力が可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1696&quot; style=&quot;width: 611px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1697&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のプロジェクトのオプションにチェックするとデバッグ(f5)した後で、xmlファイルが生成されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1694&quot; data-filename=&quot;008.png&quot; style=&quot;width: 474px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1695&quot; data-filename=&quot;009.png&quot; style=&quot;width: 746px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;xmlコメントは標準タグのxmlタイプの形式があります。それを従って作成することができます。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt; &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;  &lt;thead&gt;   &lt;tr&gt;    &lt;th&gt;xmlコメントタグ&lt;/th&gt;    &lt;th&gt;説明&lt;/th&gt;   &lt;/tr&gt;  &lt;/thead&gt;  &lt;tbody&gt;   &lt;tr&gt;    &lt;td&gt;summary&lt;/td&gt;    &lt;td&gt;形式あるいは形式メンバ設定&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;remarks&lt;/td&gt;    &lt;td&gt;詳細な説明&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;para&lt;/td&gt;    &lt;td&gt;remarksの追加説明&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;value&lt;/td&gt;    &lt;td&gt;プロパティの説明&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;example&lt;/td&gt;    &lt;td&gt;使用例&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;list&lt;/td&gt;    &lt;td&gt;リストとテーブル生成&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;code&lt;/td&gt;    &lt;td&gt;何行目のコードで表示する時に使用&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;see&lt;/td&gt;    &lt;td&gt;テキスト内部のリンク指定&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;seealso&lt;/td&gt;    &lt;td&gt;参考部分に表せるテキスト指定&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;exception&lt;/td&gt;    &lt;td&gt;例外説明&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;permision&lt;/td&gt;    &lt;td&gt;接近権限説明&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;param&lt;/td&gt;    &lt;td&gt;メソッドのパラメター説明&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;return&lt;/td&gt;    &lt;td&gt;返却値を説明&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;c&lt;/td&gt;    &lt;td&gt;説明中で含めているコード&lt;/td&gt;   &lt;/tr&gt;  &lt;/tbody&gt; &lt;/table&gt;&lt;/div&gt;&lt;p&gt;プログラミング(ソース作成)はソース整理とドキュメント作成から始まって、ソース整理とドキュメント作成で終わりますという話があります。&lt;/p&gt;&lt;p&gt;一応、ソースを規約やルール、デザインパターンなどを利用して綺麗に作成することも重要ですが、ソース読みやすい方法でコメントをよく作成する方法もあります。特にxmlコメントなどをよく作成して置いたら、プログラム作成終了後でapiドキュメントなどを別途で作成する必要もありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデータタイプ変換(キャスト:cast)とコメント(comment)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/6.html</guid><pubDate>Fri, 9 Jul 2021 19:49:31 +0900</pubDate></item><item><title>[C#] 4. データタイプとリテラル(literal)、 Nullable</title><link>https://www.nowonbun.com/5.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデータタイプとリテラル(literal)、 nullableに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿で変数と定数を使う方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/4.html&quot; target=&quot;_blank&quot;&gt;[c#] 3. プログラミングの始めと変数と定数を使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その投稿で変数を宣言する時にintという整数型のデータタイプを使いました。&lt;/p&gt;&lt;p&gt;データタイプは簡単に説明すると変数を宣言する時にメモリにどのぐらいのサイズほどメモリ空間を確保するかという作業です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;下記の表はメモリ上でデータタイプよりどのぐらいのサイズを割り当ての説明です。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt; &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;  &lt;thead&gt;   &lt;tr&gt;    &lt;th&gt;c#データタイプ&lt;/th&gt;    &lt;th&gt;.netデータタイプ&lt;/th&gt;    &lt;th&gt;説明&lt;/th&gt;    &lt;th&gt;サイズ&lt;/th&gt;   &lt;/tr&gt;  &lt;/thead&gt;  &lt;tbody&gt;   &lt;tr&gt;    &lt;td&gt;bool&lt;/td&gt;    &lt;td&gt;system.boolean&lt;/td&gt;    &lt;td&gt;true or false&lt;/td&gt;    &lt;td&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;byte&lt;/td&gt;    &lt;td&gt;system.byte&lt;/td&gt;    &lt;td&gt;8ビットunsigned integer&lt;/td&gt;    &lt;td&gt;0 ~ 256&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;sbyte&lt;/td&gt;    &lt;td&gt;system.sbyte&lt;/td&gt;    &lt;td&gt;8ビットsigned integer&lt;/td&gt;    &lt;td&gt;-128 ~ 127&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;short&lt;/td&gt;    &lt;td&gt;system.int16&lt;/td&gt;    &lt;td&gt;16ビットsigned integer&lt;/td&gt;    &lt;td&gt;-32,768 ~ 32,767&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;int&lt;/td&gt;    &lt;td&gt;system.int32&lt;/td&gt;    &lt;td&gt;32ビットsigned integer&lt;/td&gt;    &lt;td&gt;-2,147,483,648 ~ 2,147,483,647&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;long&lt;/td&gt;    &lt;td&gt;system.int64&lt;/td&gt;    &lt;td&gt;64ビットsigned integer&lt;/td&gt;    &lt;td&gt;-9,223,372,036,854,755,808 ~ 9,223,372,036,854,755,807&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;ushort&lt;/td&gt;    &lt;td&gt;system.uint16&lt;/td&gt;    &lt;td&gt;16ビットunsigned integer&lt;/td&gt;    &lt;td&gt;0~65,535&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;uint&lt;/td&gt;    &lt;td&gt;system.uint32&lt;/td&gt;    &lt;td&gt;32ビットunsigned integer&lt;/td&gt;    &lt;td&gt;0 ~ 4,294,967,295&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;ulong&lt;/td&gt;    &lt;td&gt;system.uint64&lt;/td&gt;    &lt;td&gt;64ビットunsigned integer&lt;/td&gt;    &lt;td&gt;0 ~ 18,446,744,073,709,551,615&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;float&lt;/td&gt;    &lt;td&gt;system.single&lt;/td&gt;    &lt;td&gt;32ビットsingle precision浮動小数点数&lt;/td&gt;    &lt;td&gt;±1.5*10-45~±3.4*1038&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;double&lt;/td&gt;    &lt;td&gt;system.double&lt;/td&gt;    &lt;td&gt;64ビットdouble precision浮動小数点数&lt;/td&gt;    &lt;td&gt;±5.0*10-324~±1.7*10308&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;decimal&lt;/td&gt;    &lt;td&gt;system.decimal&lt;/td&gt;    &lt;td&gt;128ビットdecimal&lt;/td&gt;    &lt;td&gt;±1.0*10-28~±7.9*1028&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;char&lt;/td&gt;    &lt;td&gt;system.char&lt;/td&gt;    &lt;td&gt;16ビットユニコード文字&lt;/td&gt;    &lt;td&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;string&lt;/td&gt;    &lt;td&gt;system.string&lt;/td&gt;    &lt;td&gt;ユニコード文字列&lt;/td&gt;    &lt;td&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;&lt;/td&gt;    &lt;td&gt;system.datetime&lt;/td&gt;    &lt;td&gt;時間&lt;/td&gt;    &lt;td&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;object&lt;/td&gt;    &lt;td&gt;system.object&lt;/td&gt;    &lt;td&gt;すべての親タイプ&lt;/td&gt;    &lt;td&gt;&lt;/td&gt;   &lt;/tr&gt;  &lt;/tbody&gt; &lt;/table&gt;&lt;/div&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1686&quot; data-filename=&quot;001.png&quot; style=&quot;width: 281px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のデータタイプは変数を宣言する時の前にサイズを合わせて設定することです。&lt;/p&gt;&lt;p&gt;プログラムはデータタイプの種類は大幅で文字、文字列、正数、実数のことに分けています。　なので、正数タイプに文字列や実数データを格納するとエラーやバグが発生します。&lt;/p&gt;&lt;p&gt;上の結果をみればcharが2byteになっていることが見えます。これが他の言語の差異がある部分ですが、c/c++の場合は1 byteの値の-128~127のサイズを持っています。その理由はc/c++の文字は基本asciiコードでc#はユニコードを使うからです。&lt;/p&gt;&lt;p&gt;なので、c/c++でデータバイナリ値を作る時にunsigned charを使いますが、c#にはbyteデータタイプを利用します。この説明は文字列(string)と文字列コードに説明する時に詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データタイプの種類がたくさんありますが、実際に使うのはstring(文字列)、bool(真偽)、int(整数)、float(実数)、double(実数)、byte(バイナリデータ用)だけだと思います。&lt;/p&gt;&lt;p&gt;ここでサイズを計算する時にすべてbyteで計算しています。パソコンは内部で数はすべてbit(ビット)の二進数で計算します。そして1byteは8bitになります。&lt;/p&gt;&lt;p&gt;つまり、byteのデータタイプが1byteのデータを格納するといえば、0~255(0含めて256個)まで表現ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1689&quot; data-filename=&quot;002.png&quot; style=&quot;width: 133px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;intタイプは4byteのデータサイズを使えます。つまり、2^32(8*4)まで表現ができます。そのサイズは4,294,967,296個になれ、正数2,147,483,647と負数-2,147,483,648まで表現が可能です。正数が1が少ない理由は、0が含まれているからです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1687&quot; style=&quot;width: 193px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、intタイプで2,147,483,647を超える値を格納するとエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1688&quot; data-filename=&quot;004.png&quot; style=&quot;width: 714px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その以上のデータ値を使う場合はlongタイプがあります。でも、実際にその以上のデータを使う時にはlongタイプよりdecimalタイプを使います。&lt;/p&gt;&lt;p&gt;実数型は小数点以下を表現する時、floatタイプをよく使います。しかし、プログラムは浮動小数点誤差が発生することになります。なので実務ではdecimalタイプを使うか、小数点以下を整数に変換してから計算して、また実数に変換する方法で計算します。&lt;/p&gt;&lt;p&gt;性能(パフォーマンス)を考えるとdecimalタイプと整数に変換して計算することよりfloatやdoubleで直接に実数計算するほうが早いですが、誤差のリスクがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ソースで数を区分するためのリテラル(literal)があります。floatタイプは数字の後にfをdoubleの場合はdを付けます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1690&quot; data-filename=&quot;005.png&quot; style=&quot;width: 174px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt; &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;  &lt;thead&gt;   &lt;tr&gt;    &lt;th&gt;c#リテラルデータタイプ&lt;/th&gt;    &lt;th&gt;suffix&lt;/th&gt;    &lt;th&gt;例&lt;/th&gt;   &lt;/tr&gt;  &lt;/thead&gt;  &lt;tbody&gt;   &lt;tr&gt;    &lt;td&gt;long&lt;/td&gt;    &lt;td&gt;l&lt;/td&gt;    &lt;td&gt;1024l&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;uint&lt;/td&gt;    &lt;td&gt;u&lt;/td&gt;    &lt;td&gt;1024u&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;ulong&lt;/td&gt;    &lt;td&gt;ul&lt;/td&gt;    &lt;td&gt;1024ul&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;float&lt;/td&gt;    &lt;td&gt;f&lt;/td&gt;    &lt;td&gt;10.24f&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;double&lt;/td&gt;    &lt;td&gt;d&lt;/td&gt;    &lt;td&gt;10.24dまたは10.24&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;decimal&lt;/td&gt;    &lt;td&gt;m&lt;/td&gt;    &lt;td&gt;10.24m&lt;/td&gt;   &lt;/tr&gt;  &lt;/tbody&gt; &lt;/table&gt;&lt;/div&gt;&lt;p&gt;我々がデータタイプと変数を宣言する時に基本的に初期値を格納しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1684&quot; data-filename=&quot;006.png&quot; style=&quot;width: 480px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例ならiの変数にデータを格納しなかったらデバッグ段階でエラーが発生します。&lt;/p&gt;&lt;p&gt;でも、我々は変数を宣言する段階ではデータを入れなくて、計算した後にデータを入れたい時がありますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムでは変数のメモリは割り当てしますが、まだデータがない状況をヌル(null)といいます。&lt;/p&gt;&lt;p&gt;基本的に原始データタイプにはヌル(null)を許せません。原始データタイプにヌル(null)タイプを使いたいないら疑問符(?)を付けてヌルタイプを許すように設定します。(※クラスタイプ以外はすべて原始データタイプに言います。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1685&quot; data-filename=&quot;007.png&quot; style=&quot;width: 152px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果を見ればなにも表示されてないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実は原始データタイプはnullが有ってもなくても仕様によりそんなに差異がありませんが、変数にインスタンスを割り当てる時にはヌル(null)の意味がすごく重要です。&lt;/p&gt;&lt;p&gt;その内容に関してはインスタンス生成を説明する時に詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデータタイプとリテラル(literal)、 nullableに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/5.html</guid><pubDate>Thu, 8 Jul 2021 16:38:02 +0900</pubDate></item><item><title>[C#] 3. プログラミングの始めと変数と定数を使う方法</title><link>https://www.nowonbun.com/4.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はプログラミングの始めと変数と定数を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#で一つのプログラムを作成しようと思えば基本的にクラスと関数、ライブラリを知らなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1682&quot; data-filename=&quot;001.png&quot; style=&quot;width: 421px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースをvisual stuioツールを利用して作成してf5を押下してビルド及び実行すれば下記通りの結果が表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1681&quot; data-filename=&quot;002.png&quot; style=&quot;width: 266px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのことで任意のキーを押下するとプログラムを終了になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例だけ確認しても基本的にnamespaceの中でprogramというクラスがあります。また、クラスの中ではmainという関数があります。main関数にはstring[]タイプになっているパラメータがあるし、staticとvoidのキーワードで関数を定義しています。&lt;/p&gt;&lt;p&gt;namespaceとクラス、関数は中括弧({})でその領域を定義しているし、main関数にはconsoleクラスのwritelineとreadkeyの関数を使っています。&lt;/p&gt;&lt;p&gt;上のプログラムを開始するとコンソールで動きますが、consoleクラスはコンソールウィンドウで作動するライブラリです。つまり、writeline関数はコンソールウィンドウで文字を出力する関数、readkeyはユーザからキーボードデータを入力値を受け取る関数です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の形がc#のプログラム基本形式です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならこれからプログラムを作成しましょう。&lt;/p&gt;&lt;p&gt;我々がプログラムを作成すれば一番扱うキーワードは変数と定数です。&lt;/p&gt;&lt;p&gt;プログラムを簡単に定義すると高性能な計算機です。つまり、1+1や1+2を計算する計算機です。&lt;/p&gt;&lt;p&gt;この計算機は計算した値を何処かで格納することができますが、それが変数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1679&quot; data-filename=&quot;003.png&quot; style=&quot;width: 206px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は1+1の結果値をaという変数に格納しました。aという変数の前にはintというデータタイプキーワードを宣言しました。つまり、変数宣言はデータタープと変数名で宣言することができます。&lt;/p&gt;&lt;p&gt;そしてbという変数には1+2の結果値を格納しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、consoleクラスのwriteline関数を利用してコンソールに出力しました。ここで&quot;&quot;のマークで書いている文字列はそのままにコンソールに出力されます。その後で+aを入れてaの変数に格納された値が出力します。&lt;/p&gt;&lt;p&gt;変数の値は数を計算して格納する機能をありますが、変数と変数の計算して格納することもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1680&quot; data-filename=&quot;004.png&quot; style=&quot;width: 210px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;予想とおりにcの値は5が出力しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;変数は数を計算して値を格納し、その値を修正することもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1678&quot; data-filename=&quot;005.png&quot; style=&quot;width: 203px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例みたいに最初にaの変数に2を格納して2を足して3を掛けるし、また、4を足して2を分けて計算機みたいな計算結果を作ることができます。&lt;/p&gt;&lt;p&gt;変数は上の例みたいにデータを格納、出力、修正することもできます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムでは格納、修正が可能な変数がありますが、最初に格納したらデータが変わらない定数ということもあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1683&quot; data-filename=&quot;006.png&quot; style=&quot;width: 509px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例みたいにデータタイプ名でconstキーワードを入れると変数から定数に宣言することができます。&lt;/p&gt;&lt;p&gt;定数の場合は最初に2の値を格納してまた、2を足すとvisual studio側でデバッグエラーが発生します。つまり、定数の場合は最初に格納したデータを修正しようとすればエラーが発生することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一般的にプログラムでは普通に定数より変数をよく使います。プログラム的に変数を代わりに定数を使うことで性能があがることではありません。ただ、プログラミング的に制約するため、つまり格納したデータをミスで修正することをしないように使う文法です。&lt;/p&gt;&lt;p&gt;なので、一般的に定数より変数で宣言して使います。ただ、データ比較のためにコード読みやすくするように使う場合がありますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでプログラミングの始めと変数と定数を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/4.html</guid><pubDate>Wed, 7 Jul 2021 14:24:45 +0900</pubDate></item><item><title>[C#] 2. Visual Studioをインストールする方法</title><link>https://www.nowonbun.com/3.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はvisual studioをインストールする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#で開発するためには一応、開発ツール(ide)をインストールしなければならないです。c#の開発ツールはjavaみたいに様々があることではなく、visual studioで決まっています。&lt;/p&gt;&lt;p&gt;もちろん、メモ帳で作成してビルドファイルを利用して開発することもできますが、visual studioが値段が高いプログラムでもないし、無料ツールなのでただダウンロードして使ったらよいです。(会社で商業的に開発することはライセンス値段が必要です。)&lt;/p&gt;&lt;p&gt;visual studioはパソコンの高いスペックが必要です。なので、開発準備する前にパソコンのスペックをアップグレードしましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;visual studioをダウンロードしてインストールしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://visualstudio.microsoft.com/ja/vs/&quot; target=&quot;_blank&quot;&gt;https://visualstudio.microsoft.com/ja/vs/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=4&quot; data-filename=&quot;001.png&quot;&gt;&lt;/p&gt;&lt;p&gt;visual studioのバージョンでprofessionalとenterpriseがあります。そのバージョンは無料ではないので、我々はcommunityバージョンを使いましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1677&quot; style=&quot;width: 848px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その後でインストールファイルをクリックして実行すればインストールに必要なファイルを先にインストールするということにメッセージが表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1667&quot; data-filename=&quot;005.png&quot; style=&quot;width: 100px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1668&quot; style=&quot;width: 480px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのままにインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1666&quot; data-filename=&quot;007.png&quot; style=&quot;width: 480px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールが終わったらインストールオプションメニューが表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=3&quot; data-filename=&quot;002.png&quot;&gt;&lt;/p&gt;&lt;p&gt;我々は一応、たくさんの機能が必要ないのでasp.netとpython、.net desktop、c++だけ選択してインストールしましょう。インストールした後には必要なコンポーネントがあれば追加インストールができるので、始めは必ず必要なことだけインストールしましょう。(時間がたくさんかかります。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=2&quot; data-filename=&quot;003.jpg&quot;&gt;&lt;/p&gt;&lt;p&gt;インストールが完了するとログインするメニューが表示されます。microsoftのidを入れてログインすればよいです。(もし、idがなければ会員登録しましょう。登録で別に料金がかかることではありません。ログインしないとcommunityバージョンでも30日しか使えません。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1670&quot; data-filename=&quot;009.png&quot; style=&quot;width: 464px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ログインしたらプロジェクト選択画面が表示されます。一応、しっかりインストールされたかを確認するためにcreate new projectを選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1673&quot; data-filename=&quot;010.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてc#コンソールプロジェクトを選択しましょう。ここでcoreバージョンではなく、.net frameworkを選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1675&quot; data-filename=&quot;011.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてプロジェクト名を入れましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1674&quot; data-filename=&quot;012.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてプログラムが実行されたらメニューでtoolのoptionを選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1672&quot; data-filename=&quot;013.png&quot; style=&quot;width: 428px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてテーマをdarkに選択した方が良いです。lightがよいと思う方はそのままに使ってもよいですが、開発者は一日ずっとpcを見る人なのでできれば目の疲労を少なくするほうが良いです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1676&quot; data-filename=&quot;014.png&quot; style=&quot;width: 744px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてソースウィンドウでテストソースを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1671&quot; data-filename=&quot;015.png&quot; style=&quot;width: 447px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてf5キーを押下してビルドとコンパイルをしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1669&quot; data-filename=&quot;016.png&quot; style=&quot;width: 243px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のコンソールウィンドウが表示されるとc#のための開発する準備は完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでvisual studioをインストールする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/3.html</guid><pubDate>Tue, 6 Jul 2021 20:04:50 +0900</pubDate></item><item><title>[C#]  1. C#とは？</title><link>https://www.nowonbun.com/2.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#とはに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラム言語はc、c++、java、c#など様々な言語があります。&lt;/p&gt;&lt;p&gt;言語の誕生時期はc言語が一番早いし、次はmicrosoftからウィンドウ開発をしやすくするc++（mfc）、プログラムについて少し知ってる方なら一回ごろは聞いたことがある言語のjava、これから説明しようと思うc#の順になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;誕生時期を見るとc#は上の4つの言語の中で最後になりますが、最後に誕生したから一番いい言語だと思いますが、そうではありません。プログラム言語は各特徴があり、開発状況のたびに使う方法が違います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;各言語について簡単に説明するとc言語の場合はハードウェア系とos系(カーネル)、ドライバー系で主に開発するし、c++(mfc)はグラフィック系またはc#で実装が大変な部分、c#よりメモリ管理が厳しい環境で使います。&lt;/p&gt;&lt;p&gt;javaの場合はネットワークのウェブ系、アンドロイドモバイル系で使うし、c#はネットワークサーバクライアントウィンドウ（cs)系でよく使います。機能として使うところはそのとおりですが、プロジェクトの予算、環境などの影響でウィンドウプログラムをjavaで開発するし、c++とc#を混在して使う時もあります。&lt;/p&gt;&lt;p&gt;でもその特徴で必ずjavaはウェブ、c#はウィンドウフォームで開発することではありません。ただ、仕様の状況、環境の設定により影響がたくさんあるので、何がよいか悪いかを決めることではありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#というプログラムは.net frameworkの上で動いています。.netframeworkはウィンドウosしかないのでlinuxやウィンドウ以外の環境では開発ができません。(最近はコアー(core)というlinuxライブラリもありますが、一般的な状況じゃありません。)&lt;/p&gt;&lt;p&gt;フレームワークとはc言語みたいに開発の環境によりすべてを開発することではなく、基本的なライブラリや基盤に関してはフレームワークにすべて開発しているので、c#にはapiとして取得して使う形で開発します。それをclr(common language runtime)といいます。&lt;/p&gt;&lt;p&gt;clr(common language runtime)とは.net系の言語(vb.net、c#.net、c++.netなど)の仮想マシンの構成要素です。&lt;/p&gt;&lt;p&gt;仮想マシンとはプログラムのメモリ管理(インスタンス生成及び解除)するし、様々なコンポーネントを提供して開発をしやすくするフレームワークです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なのでプログラムの開発の勉強をcとc++よりしやすいし、開発生産性を上げる特徴を持っています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;現在(2016年5月).netframeworkのバージョンは4.6まで発表してc#のバージョンは6.0まで発表しています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#のバージョン別で説明すると下記のとおりになります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt; &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;  &lt;thead&gt;   &lt;tr&gt;    &lt;th&gt;c# バージョン&lt;/th&gt;    &lt;th&gt;重要機能&lt;/th&gt;   &lt;/tr&gt;  &lt;/thead&gt;  &lt;tbody&gt;   &lt;tr&gt;    &lt;td&gt;c# 2.0&lt;/td&gt;    &lt;td&gt;     &lt;ul&gt;      &lt;li&gt;c# generics&lt;/li&gt;      &lt;li&gt;anonymous method (匿名メソッド)&lt;/li&gt;      &lt;li&gt;nullable type&lt;/li&gt;      &lt;li&gt;partial type&lt;/li&gt;      &lt;li&gt;c# yieldキーワード&lt;/li&gt;      &lt;li&gt;delegateについてcovariance/contravariance&lt;/li&gt;     &lt;/ul&gt;    &lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;c# 3.0&lt;/td&gt;    &lt;td&gt;     &lt;ul&gt;      &lt;li&gt;lambda expression (ラムダ)&lt;/li&gt;      &lt;li&gt;anonymous type (匿名タイプ)&lt;/li&gt;      &lt;li&gt;extension method (拡張メソッド)&lt;/li&gt;      &lt;li&gt;c# var キーワード (implicit type)&lt;/li&gt;      &lt;li&gt;linq&lt;/li&gt;      &lt;li&gt;expression tree&lt;/li&gt;     &lt;/ul&gt;    &lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;c# 4.0&lt;/td&gt;    &lt;td&gt;     &lt;ul&gt;      &lt;li&gt;c# dynamic (late binding)&lt;/li&gt;      &lt;li&gt;named argument&lt;/li&gt;      &lt;li&gt;optional argument&lt;/li&gt;      &lt;li&gt;indexed property&lt;/li&gt;     &lt;/ul&gt;    &lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;c# 5.0&lt;/td&gt;    &lt;td&gt;     &lt;ul&gt;      &lt;li&gt;c# async / await&lt;/li&gt;      &lt;li&gt;caller information&lt;/li&gt;     &lt;/ul&gt;    &lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;c# 6.0&lt;/td&gt;    &lt;td&gt;     &lt;ul&gt;      &lt;li&gt;null-conditional operator(null条件演算子)&lt;/li&gt;      &lt;li&gt;string interpolation(文字列挿入機能)&lt;/li&gt;      &lt;li&gt;dictionary initializer&lt;/li&gt;      &lt;li&gt;nameof 演算子&lt;/li&gt;      &lt;li&gt;using static 文&lt;/li&gt;      &lt;li&gt;catch/finally のブロックでawait 使用&lt;/li&gt;      &lt;li&gt;exception filter 支援&lt;/li&gt;      &lt;li&gt;auto-property initializer(自動プロパティー初期化)&lt;/li&gt;      &lt;li&gt;getter only(読み専用プロパティ)&lt;/li&gt;      &lt;li&gt;expression-bodied member 使用&lt;/li&gt;      &lt;li&gt;構造体基本コンストラクタ&lt;/li&gt;     &lt;/ul&gt;    &lt;/td&gt;   &lt;/tr&gt;  &lt;/tbody&gt; &lt;/table&gt;&lt;/div&gt;&lt;p&gt;c#バージョン別でできることがあるしできないことがありますが、特にバージョン別に開発することではないなら最新バージョンを使うことが良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからc#の基本文法とライブラリを使う方法、ウィンドウ開発やウェブ環境で開発する方法に関して説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#とはに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/2.html</guid><pubDate>Tue, 6 Jul 2021 19:24:19 +0900</pubDate></item><item><title>[Java] 56. Web serviceのサーブレット(Servlet)で初期化作業(properties設定)</title><link>https://www.nowonbun.com/265.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はweb serviceのサーブレット(servlet)で初期化作業(properties設定)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;web serviceプログラムを作成すると、サーバを起動する時に初期化作業が必要な場合があります。&lt;/p&gt;&lt;p&gt;例えば、先にマスタテーブルのデータをインスタンス生成してメモリに割り当てするか、サーバの実行ディレクトリ設定などがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、先に我々がweb serviceでormをjpaで使う場合、最初にconnection初期化が必要です。&lt;/p&gt;&lt;p&gt;上の例は先にindex.htmlページを要請すればajaxでtest.jsonのデータを取得します。&lt;/p&gt;&lt;p&gt;最初、起動する後でindex.htmlがローディングします。その後でtest.jsonを呼び出す場合に時間がどのぐらいかかるかを確認するプログラムです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1660&quot; data-filename=&quot;001.png&quot; style=&quot;width: 333px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果は約1秒ほどの時間がかかります。時間がかかる理由は最初にconnection初期化するために時間がかかることです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1662&quot; style=&quot;width: 848px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;再起動せずに同じページを再更新(f5 -reload)をすればajaxでデータを取得することが1秒もかからないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1664&quot; style=&quot;width: 314px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この意味はサービスが最初だけ少し(?)遅くなることで初期化する必要がありませんが、それでも少し完璧(?)に設定するためには初期化を別途にするほうが良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;初期化設定はweb.xmlで設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1659&quot; data-filename=&quot;007.png&quot; style=&quot;width: 448px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行順番は初期化するクラスが一つではない場合はload-on-startupを通って順番を設定することができます。&lt;/p&gt;&lt;p&gt;initcontrollerクラスはhttpservletのクラスを継承します。そしてinit関数でormを通ってデータを取得することでorm connectionを生成します。&lt;/p&gt;&lt;p&gt;初期化で取得する関数はマスタテーブルを先にメモリに割り当てしてcontrollerでは再使用することでパフォーマンスを上がります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1665&quot; data-filename=&quot;004.png&quot; style=&quot;width: 294px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最初の起動からデータ取得が速いことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その以外にウェブの環境設定データを設定する場合があります。例えば、ライセンスキーやsmtpのemailパスワードなどがあります。&lt;/p&gt;&lt;p&gt;initcontrollerでpropertyを取得する関数を作成しました。&lt;/p&gt;&lt;p&gt;staticタイプのflyweightパターンで最初にpropertyを読み込んでメモリに割り当てして再使用する方法で作成しました。(property値を修正するとサーバを再起動しなければならないです。)&lt;/p&gt;&lt;p&gt;ここで重要なことはlocalパスです。最初、サーバを起動する時、servletのinit関数で実行パスを取得することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1663&quot; style=&quot;width: 242px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして上のproperty値をcontrollerで使いましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1661&quot; data-filename=&quot;006.png&quot; style=&quot;width: 317px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;property設定値を取得してviewのファイルにマッピングして実行すれば画面に表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで設定完了すればjava spring frameworkのプロジェクトを開始する基本設定は完了します。その以外には仕様によりデザインパターンで抽象クラスやインスタンスを生成して仕様とおりにプログラムを作成すればよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでweb serviceのサーブレット(servlet)で初期化作業(properties設定)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/265.html</guid><pubDate>Fri, 2 Jul 2021 17:10:47 +0900</pubDate></item><item><title>[Java] 55. Spring frameworkに文字化けを解決する方法(Encoding設定)</title><link>https://www.nowonbun.com/264.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はspring frameworkに文字化けを解決する方法(encoding設定)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;eclipseで我々がプログラムを作成する時、基本的にファイルの文字コードを設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1658&quot; data-filename=&quot;001.png&quot; style=&quot;width: 781px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1657&quot; data-filename=&quot;002.png&quot; style=&quot;width: 657px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はjavaファイルとjspファイルに設定した文字コードですが、その以外にxmlファイルやpropertiesファイルにも我々は基本的にutf-8を設定します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このことはファイルに関する文字コードなのでサーバとクライアント間の通信の文字コードではありません。つまり、ブラウザから要請する時、その中では要請ヘッダー値があるし、このヘッダーの文字コードを指定しなければならないです。&lt;/p&gt;&lt;p&gt;また、ブラウザから要請したことをまた、controllerの値とviewのデータをパーシングして返却するけど、ここにも文字コードの設定が必要です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1651&quot; data-filename=&quot;003.png&quot; style=&quot;width: 320px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースを作成して起動すればindex関数が呼び出してindex.jspファイルがパーシングになってテキストボックスとsubmitボタンがある画面が表示されます。&lt;/p&gt;&lt;p&gt;そしてtextboxで&apos;こんにちは&apos;というデータを入れてsubmitボタンを押下するとtextboxのデータがname名でparamdataの変数名に設定してformデータでpost関数が呼び出します。そしてパラメータparamdataでデータを受け取ってmodelmapのdataが設定された後、index.jspファイルがパーシングしてブラウザで応答します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1652&quot; data-filename=&quot;005.png&quot; style=&quot;width: 329px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1655&quot; data-filename=&quot;004.png&quot; style=&quot;width: 318px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;予想する結果はsubmitボタンの下に&apos;こんにちは&apos;というデータが表示することを予想しますが、文字化けになってどの文字か分からない文字になりました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで我々はブラウザで要請するデータを文字コードを変換しなければならないです。&lt;/p&gt;&lt;p&gt;まず、web.xmlのfilter設定でspringframeworkの文字コードを設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1656&quot; style=&quot;width: 727px;&quot; data-filename=&quot;008.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.spring.io/spring-framework/docs/4.2.2.release_to_4.2.3.release/spring%20framework%204.2.3.release/org/springframework/web/filter/characterencodingfilter.html&quot; target=&quot;_blank&quot;&gt;characterencodingfilter.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;filterに関するには以前の投稿で説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/263.html&quot; target=&quot;_blank&quot;&gt;[java] 54. spring frameworkでweb filterを使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;文字変換クラスをフィルターに反映するとブラウザのすべての要請はcharacterencodingfilterクラスを通ることになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1653&quot; data-filename=&quot;006.png&quot; style=&quot;width: 659px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そこですべての要請の文字コートは自動に設定され、controllerを呼び出します。その後は文字コードが設定された後なので文字化けがなくなります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1654&quot; style=&quot;width: 298px;&quot; data-filename=&quot;007.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここには文字化けを解決する方法に関して説明しましたが、実はfilterをセッション確認に使うログイン認証確認の以外に使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;様々なfilterをどの方法で使えるかを考えて見ましたが、よく使う文字化けの解決する方法のことを例にして説明しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでspring frameworkに文字化けを解決する方法(encoding設定)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/264.html</guid><pubDate>Wed, 30 Jun 2021 16:37:16 +0900</pubDate></item><item><title>[Java] 54. Spring frameworkでWeb filterを使う方法</title><link>https://www.nowonbun.com/263.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はspring frameworkでweb filterを使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がウェブサービスを構築する時にセッション管理やメモリ管理などのブラウザ要請に関する全体的に管理および設定が必要なことがあります。&lt;/p&gt;&lt;p&gt;例えば、ログインした後でサーバ側ではユーザのセッションがあるかどうかの確認する場合があります。ユーザのセッションがある場合はユーザがログインしている状況になります。&lt;/p&gt;&lt;p&gt;同然ですが、ユーザのセッションが格納されてない場合は当該なページからログインページに遷移やログイン要求をしなければならないです。&lt;/p&gt;&lt;p&gt;※　参考にセッション値とはサーバ側から管理するデータです。そのデータはブラウザのクッキー値にセッションキーをいれ、ブラウザのクッキー値が初期化及び満了にならないならサーバ側でキーとして格納されているデータを取得することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;方法としてはcontrollerで関数を呼び出すところの開始するところにセッションチェックする部分を実装して解決しても構いないです。&lt;/p&gt;&lt;p&gt;でも、もっと簡単な方法としてはブラウザから呼び出しする時、常に呼び出す関数filterクラスを利用してセッション可否を確認する方法もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;フィルダーはまず、web.xmlでどのurlパターンでどのクラスを呼び出すかを設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1647&quot; data-filename=&quot;001.png&quot; style=&quot;width: 487px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;フィルダーマッピング(filter-mapping)タグにはブラウザから要請するマッピングパターンを設定します。私の場合はspring frameworkで基本的に*.htmlで呼び出すパターンをfilterを通るように作成しました。&lt;/p&gt;&lt;p&gt;もし、すべてのページを設定しようと思えばアスタリスク(*)で設定すればよいです。でも、ウェブサービスに要請するリソースがウェブページだけあることではなく、imageやcssファイル(スタイルシートファイル), jsファイル(javascriptファイル)などもあるので、正確に設定する方が良いです。&lt;/p&gt;&lt;p&gt;フィルダータグにはフィルダーマッピング(filter-mapping)で設定したページがcontrollerの呼び出す関数の前に呼び出すクラスを設定することです。&lt;/p&gt;&lt;p&gt;私はcontroller.filterのパッケージのwebfilterクラスを呼び出します。&lt;/p&gt;&lt;p&gt;init-paramはfilterクラスで使える変数値で、私はfilterチェックをしないようなページ、つまり、userログインセッションが必要ないページを設定しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからwebfilterクラスを作成しましょう。&lt;/p&gt;&lt;p&gt;filterを設定します。init関数にはプロジェクトが始まる時、呼び出す関数で基本的にセッションチェックをしないページを設定します。&lt;/p&gt;&lt;p&gt;dofilter関数はブラウザから要請があるたびに呼び出す関数です。要請のurlを分析してスキップ(skip)するページかどうかを確認してスキップ(skip)するページではなければセッションチェックをしてセッションがなければエラーを発生します。&lt;/p&gt;&lt;p&gt;上のcontrollerは三つの要請に関して対応します。&lt;/p&gt;&lt;p&gt;index.htmlはweb.xmlに設定されたスキップ(skip)ページでセッションがなくてもページが表示されます。そしてindex関数をみればセッションを設定します。&lt;/p&gt;&lt;p&gt;test.htmlはweb.xmlに設定されてないため、dofilterでセッションチェックをします。test関数にはセッションを削除するロジックが含めています。&lt;/p&gt;&lt;p&gt;errorは以前の投稿で説明したerrorページです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/262.html&quot; target=&quot;_blank&quot;&gt;[java] 53. ウェブサービス(web service)でエラーページを処理する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでウェブサービスを起動して表示するページはindex.htmlです。しかしindex関数でセッションを設定したらtest.htmlを要請してもfilterでセッション認証が確認するのでエラーなしで表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1648&quot; data-filename=&quot;002.png&quot; style=&quot;width: 402px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1650&quot; data-filename=&quot;003.png&quot; style=&quot;width: 428px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、ここでtest.htmlにマッピングされているtest関数にはセッションを削除するロジックがあります。&lt;/p&gt;&lt;p&gt;つまり、test.htmlを再更新(f5)をすればエラーページが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1649&quot; data-filename=&quot;004.png&quot; style=&quot;width: 394px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実際にはログインページでuserの情報をセッションに格納して他のページにはfilterでページセッション確認することでページのログイン可否を確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;filter機能の重要な目的はセッションなどを通ってログイン確認をしてサーバの応答を制御することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;しかし、ここで追加的にブラウザのすべての要請はfilterを通るということを利用してページ要請間の部分を共通環境設定などができます。&lt;/p&gt;&lt;p&gt;例えば、最近使った接続ブラウザのログ記録やクッキー情報取集、ユーザの行動の追跡などで使えます。&lt;/p&gt;&lt;p&gt;しかし、filterに多い処理とロジックが含めたらシステムが遅くなる不作用もあるので仕様に合わせて作成すればよいと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでspring frameworkでweb filterを使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/263.html</guid><pubDate>Tue, 29 Jun 2021 18:25:12 +0900</pubDate></item><item><title>[Java] 53. ウェブサービス(Web service)でエラーページを処理する方法</title><link>https://www.nowonbun.com/262.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はウェブサービス(web service)でエラーページを処理する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的なウェブプロジェクトを設定することは以前の投稿まで説明することで終わりました。&lt;/p&gt;&lt;p&gt;ウェブサービスのフレームワークのspring framworkを設定することからデータベースのorm(object reference mapping)のjpa設定間です。つまり、実際にクライアント(ブラウザ)がサーバに接続して当該なデータをデータベースから取得してクライアント(ブラウザ)に表示するhtmlをパーシングする作業までです。&lt;/p&gt;&lt;p&gt;ここまで設定してプロジェクトを作成してウェブプログラムを運用することで問題はありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;しかし少しディテールな作業があります。例えば、エラーが発生した時、エラーページを表示する作業やログイン管理のため、セッション作業などのプログラムの完成度を上げるような作業です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的にトムキャットサービスでエラーが発生すると下記とおりのページが表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1639&quot; data-filename=&quot;001.png&quot; style=&quot;width: 727px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実際に運用するウェブサービスで上みたいなページが表示されるとダメです。何かが完成されてないみたいな画面です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでエラーが発生した時、我々が指定したページを表示するような方法があります。&lt;/p&gt;&lt;p&gt;ウェブ設定(web.xml)でエラーフォーワードを設定することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1640&quot; data-filename=&quot;002.png&quot; style=&quot;width: 651px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の設定はerrorが発生した場合にerror.htmlに遷移することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私は拡張子が.htmlの場合、spring frameworkのcontrollerをとおりようにしましたのでcontrollerクラスにerror.htmlを設定します。&lt;/p&gt;&lt;p&gt;error.htmlに要請するパターンを設定してerror.jspとパーシングしてブラウザに応答します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1642&quot; style=&quot;width: 848px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;確実にerror.htmlが要請されエラーコードが404(ページ無し)が表示されます。&lt;/p&gt;&lt;p&gt;ブラウザデバッグモードでnetworkタブの要請応答の状況を確認すればerror要請すれば404エラーが発生しますが、redirectで発生したこと(再送信)ではなく、errorページに関数エラーページが発生しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実際のサービスでエラーが発生するか間違いアドレスに接続すると、基本トムキャットページではなく、エラーページが表示することを見たことがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1646&quot; data-filename=&quot;004.png&quot; style=&quot;width: 778px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のイメージはグーグルで間違いアドレスに接続した場合に表示される画面です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブのエラーコード別に各別のページを設定することもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1645&quot; data-filename=&quot;006.png&quot; style=&quot;width: 600px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1641&quot; data-filename=&quot;005.png&quot; style=&quot;width: 432px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はindex.htmlページを要請したらexceptionが発生して500エラーコードが発生します。&lt;/p&gt;&lt;p&gt;そうならerror500関数を呼び出してerror.jspページの&quot;this is 500 error&quot;の値を表示します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;エラーコードではなく、もっと細かくexceptionの種類の別で処理ページを分けることができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1643&quot; data-filename=&quot;007.png&quot; style=&quot;width: 616px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はindex.htmlでnullpointerexceptionエラーを発生しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1644&quot; data-filename=&quot;008.png&quot; style=&quot;width: 484px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近の小さいサイトをみればエラー処理を設定しなくて、ウェブサーバ(was)で設定されている基本エラーページが見える場合があります。&lt;/p&gt;&lt;p&gt;単純なエラーページなら別に問題ないですが、どのケースにはソース内部のデバッグやcall stack情報がみえる時もあります。ソース内部の情報が見えたらセキュリティ(security)としてすごく悪いので、このエラー処理はする方が良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでウェブサービス(web service)でエラーページを処理する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/262.html</guid><pubDate>Fri, 25 Jun 2021 13:35:54 +0900</pubDate></item><item><title>[Java] 52. SpringフレームワークでDAOをFactory method Patternを利用して依存性注入する方法</title><link>https://www.nowonbun.com/92.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はspringフレームワークでdaoをfactory method patternを利用して依存性注入する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でspringフレームワークでjpa ormのdaoを@autowiredのアトリビュートを使って依存性注入する方法に関する説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/91.html&quot; target=&quot;_blank&quot;&gt;[java] 51. springフレームワークでjpaを使い方(依存性注入@autowired)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;spring controllerにはdaoを取得してjpa ormを利用してデータを取得する部分に関しては問題ありません。&lt;/p&gt;&lt;p&gt;でも、問題はspring controllerではないクラスでdaoを取得する方法が問題です。もちろん、一般クラスでただdaoクラスのインスタンスを生成(new)して使っても問題ありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;しかし、springで依存性注入でsingleton形式で使うのに、他の一般クラスで一般インスタンス生成してデータベースに接続してデータを取得することではなく、同じsingletonパターンで取得して使いたいです。&lt;/p&gt;&lt;p&gt;そのため、daoクラスを制御するfactory method patternを先に作成することが必要です。&lt;/p&gt;&lt;p&gt;上のソースはfactorydaoクラスをsingletonパターンタイプで作成しました。つまり、プログラムが開始してfactorydaoのインスタンスはただ一つだけ生成されます。&lt;/p&gt;&lt;p&gt;そしてgetdaoはfactory method patternです。つまり、パラメータのクラスタイプによりインスタンスを取得します。&lt;/p&gt;&lt;p&gt;しかし我々がdaoのインスタンスを生成するたびにfactorydaoでifやswitchの分岐文を作成することが大変なので、パラメータのクラスタイプでreflectionを利用してインスタンスを生成するflyweight patternを適用しました。&lt;/p&gt;&lt;p&gt;つまり、改めてまとめたらsingleton + factory method + flyweightパターンの結果です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;じゃ、springのcontroller部分ではなく、一般クラスの関数部分でdaoを取得して使いましょう。&lt;/p&gt;&lt;p&gt;じゃ、controllerでcommonクラスのgetusernamebyid関数を利用しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1636&quot; data-filename=&quot;001.png&quot; style=&quot;width: 340px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1635&quot; style=&quot;width: 308px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみればcommonクラス中でuserdaoを利用してデータベースに接続してデータを取得して画面に表示することが確認できます。&lt;/p&gt;&lt;p&gt;ここまでspringフレームワークの一般クラスでdaoインスタンスをfactory patternを利用して取得することが確認できました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからfactorydaoにあるdaoインスタンスを@autowiredを通ってcontrollerで依存性注入してインスタンスを取得しなければならないです。&lt;/p&gt;&lt;p&gt;以前には我々がbeanをmvc-config.xmlで登録しましたが、ここにはxmlで登録することではなく、クラスで設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1638&quot; data-filename=&quot;003.png&quot; style=&quot;width: 552px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のapplicationconfigクラスはxmlで設定されたcontrollerパッケージに作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1637&quot; data-filename=&quot;004.png&quot; style=&quot;width: 254px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして@configurationアトリビュートを設定してxmlで使ったbean-idをbeanアトリビュートで設定しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;じゃ、またcontrollerで依存性注入でdaoを取得しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1636&quot; data-filename=&quot;001.png&quot; style=&quot;width: 340px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;依存性注入でもuserdaoを利用してもデータベースの値を正しく取得します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1634&quot; style=&quot;width: 270px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンソール出力でfactorydaoから取得したuserdaoインスタンスと依存性注入から取得したuserdaoインスタンスのメモリアドレスが同じです。&lt;/p&gt;&lt;p&gt;つまり、同じインスタンスだという意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このように作成すればfactorydaoを通ってspringの依存性注入したdaoと一般クラスで使ったdaoは一つで統一が可能です。&lt;/p&gt;&lt;p&gt;そして、実はここで一つの作業をもっと進めなければならないです。それはdaoのコンストラクタのアクセス修飾子のタイプをすべてprivateに修正しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;factorydaoクラスをみればアクセス修飾子と関係せずにインスタンスを生成するライン(constructor.setaccessible(true))があります。&lt;/p&gt;&lt;p&gt;つまり、daoクラスのコンストラクタをprivateに設定してもfactorydaoには問題なく、インスタンス生成が可能という意味です。&lt;/p&gt;&lt;p&gt;そしてdaoのコンストラクタのアクセス修飾子をprivateに設定すれば他のクラスでdaoのインスタンスを生成(new)することができなくなります。&lt;/p&gt;&lt;p&gt;ここまでするとプロジェクト開始準備が完了します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでspringフレームワークでdaoをfactory method patternを利用して依存性注入する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/92.html</guid><pubDate>Thu, 24 Jun 2021 17:32:00 +0900</pubDate></item><item><title>[Design pattern] 1-3. ファクトリーメソッドパターン(Factory method pattern)</title><link>https://www.nowonbun.com/261.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのファクトリーメソッドパターン(factory method pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でビルダーパターンに関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/258.html&quot; target=&quot;_blank&quot;&gt;[design pattern] 1-2. ビルダーパターン(builder pattern)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ビルダーパターンは簡単に説明するとbuilderクラスとdirectorクラスの組み合いで一つのインスタンスを生成する生成パターンです。このファクトリーメソッドパターンもビルダーパターンと同じ生成パターンの一つで、インスタンスを生成するパターンです。&lt;/p&gt;&lt;p&gt;このファクトリーメソッドパターンはメソッドのパラメータにより生成されるインスタンスを変わる形のパターンです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1633&quot; style=&quot;width: 500px;&quot; data-filename=&quot;001.jpg&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://en.wikipedia.org/wiki/factory_method_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/factory_method_pattern&lt;/a&gt;&lt;/span&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1631&quot; data-filename=&quot;002.png&quot; style=&quot;width: 236px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればfactory関数のパラメータの値によりnode1クラスのインスタンスを生成するかnode2クラスのインスタンスを生成することが決めます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ビルダーパターンと比べたらすごく簡単な構造です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1630&quot; data-filename=&quot;003.png&quot; style=&quot;width: 200px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaの例ではパラメータの値をstringで受けます。つまり、stringデータによりインスタンスを生成することができます。&lt;/p&gt;&lt;p&gt;こんなことになると実際のプロジェクトにはデータベースやユーザから受ける値により生成するインスタンスを変わって実行するロジックを選択することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてファクトリーメソッドにはリターンするタイプを一つ種類のタイプに統一しなければならないのでinterfaceを使いました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1632&quot; data-filename=&quot;004.png&quot; style=&quot;width: 181px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はstringタイプではなく、列挙型の値によりインスタンスを生成しました。&lt;/p&gt;&lt;p&gt;stringタイプを使うことはもし、string値にタイプミスがある場合、デバッグ段階でエラーをチェックしないので、バグが発生する可能性があります。でも、列挙型でパラメータを設定すればバグが発生する可能性は少しなくすことができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファクトリーメソッドパターンは普通はシングルトンパターンと組み合いしてよく使います。なので、entityタイプのデータクラスよりcontrollerみたいに処理クラスによく使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1632&quot; data-filename=&quot;004.png&quot; style=&quot;width: 181px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はnode1クラスとnode2クラスにあるコンストラクタをprivateに設定してgetinstance関数でインスタンスを取得する形のシングルトンパターンを作成しました。&lt;/p&gt;&lt;p&gt;ファクトリーメソッドにはパラメータにより各クラスのgetinstance関数を呼び出し、インスタンスをリターンします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この構造を何処でよく見えるかと思えばウェブのmvcの形のcontrollerクラスでウェブのurl要請により呼び出すクラスインスタンスが変わることと同じ構造だと思います。(routeクラス)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのファクトリーメソッドパターン(factory method pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/261.html</guid><pubDate>Wed, 23 Jun 2021 19:46:01 +0900</pubDate></item><item><title>[Java] 51. SpringフレームワークでJPAを使い方(依存性注入@Autowired)</title><link>https://www.nowonbun.com/91.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はspringフレームワークでjpaを使い方(依存性注入@autowired)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でjpa ormフレームワークを通ってデータベースからデータを取得するしそれをdaoクラスを作成して使う方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/90.html&quot; target=&quot;_blank&quot;&gt;[java] 50. jpaプロジェクトでdaoクラスを作成する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのjpa ormをspringフレームワークで使いたいですが、そのままにdaoクラスのインスタンスを生成して使うことも問題ありません。&lt;/p&gt;&lt;p&gt;でも、daoクラスというのは様々なインスタンスを生成して使うことより、singletonパターンの形式で一回にインスタンスを生成して再使用するのがプログラム性能が良いです。&lt;/p&gt;&lt;p&gt;なぜなら、インスタンスを生成(new)するのは考えより時間がかかります。(何秒単位でかかることではありません。)そしてマスタテーブルのdaoクラスなら一回のデータ取得で何回に再使用する方が良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのためにdaoをsingletonパターンで作成して、それを取得するためにfactoryパターンを作成したらよいですが、springフレームワークはそれを支援する依存性注入(dependency injection)という概念があります。&lt;/p&gt;&lt;p&gt;依存性注入とはsingletonパターンとfactoryパターンを併せたパターンだと思えばよいです。(実はsingletonパターンとfactoryパターンを併せた概念とは差異がありますが、ほぼ似てます。依存性注入パターンはデザインパターンのカテゴリで説明します。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;依存性注入パターンを使うためには@autowiredアノテーションを知らなければならないです。&lt;/p&gt;&lt;p&gt;@autowiredアノテーションはspring設定のxml(mvc-config.xml)で設定したbeanオブジェクトを取得して使うアノテーションです。最初に呼び出すときにインスタンスが生成され、次から呼び出すときには生成されたインスタンスを再使用する方法です。(singletonパターン)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、以前の投稿で作成したentityクラスとdaoクラスをspringプロジェクトにコピーしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/79.html&quot; target=&quot;_blank&quot;&gt;[java] 39. spring web frameworkを利用してウェブサービスプロジェクトを作成する方法&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1629&quot; data-filename=&quot;001.png&quot; style=&quot;width: 239px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、mvc-config.xmlを設定しましょう。&lt;/p&gt;&lt;p&gt;mvc-config.xml設定のbeansタグの中のbeanタグを入れてどのクラスを依存性注入して使うかを作成します。&lt;/p&gt;&lt;p&gt;上のクラスは以前の投稿で作成したuserdaoクラスです。&lt;/p&gt;&lt;p&gt;controllerソースにでメンバー変数に@autowiredを設定して依存性注入した変数だということを定義して、@qualifierの設定でmvc-configのbeanをマッピングしてインスタンスを生成します。&lt;/p&gt;&lt;p&gt;index関数でuserdaoのselectbyid関数を利用してデータベースからデータを取得します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データを取得してmodelmap変数を通ってviewにデータを表示します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1628&quot; data-filename=&quot;002.png&quot; style=&quot;width: 301px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1627&quot; data-filename=&quot;003.png&quot; style=&quot;width: 308px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;springで依存性注入する方法は基本的に上の形になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;@autowiredの使い方に関してはメンバー変数だけ使うことではありません。関数やコンストラクタにも使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1628&quot; data-filename=&quot;002.png&quot; style=&quot;width: 301px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のindex関数にuserdaoパラメータを入れて、前に@autowired @qualifier(&quot;userdao&quot;)を入れて使うことができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンストラクタにも関数みたいにパラメータを入れて依存性注入を使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1628&quot; data-filename=&quot;002.png&quot; style=&quot;width: 301px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関数の変数で依存性注入してインスタンスを貰うかコンストラクタで依存性注入してメンバー変数を設定するか結果は同じです。依存性注入して変数にもシングルトンパターンなのでインスタンスはすべて同じです。&lt;/p&gt;&lt;p&gt;個人的にコンストラクタや関数パラメータでインスタンスを受けると可読性が悪くなるのでメンバー変数で設定する方が良いです。(仕様によりですが。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして@autowiredのオプションの中でrequiredということがあります。このオプションをfalseに設定すればmvc-configにbeanを設定しなくてむエラーが発生せず、nullの値が入力されます。&lt;/p&gt;&lt;p&gt;基本値はtrueで設定しなかったらエラーが発生します。&lt;/p&gt;&lt;p&gt;でも、falseにしてエラーを飛び越えることよりエラーを発生してバグを発生しないようにする方が良いと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでspringフレームワークでjpaを使い方(依存性注入@autowired)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/91.html</guid><pubDate>Wed, 23 Jun 2021 17:26:57 +0900</pubDate></item><item><title>[Java] 50. JPAプロジェクトでDAOクラスを作成する方法</title><link>https://www.nowonbun.com/90.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjpaプロジェクトでdaoクラスを作成する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿までjpaフレームワークを使い方に関して説明しました。今回はjpaを実務のプロジェクトにどのように使うかに関する内容です。&lt;/p&gt;&lt;p&gt;jpaフレームワークにtransaction共通関数を作成してそのままにウェブプロジェクト(servletやspringフレームワーク)のcontrollerに使っても問題はありません。&lt;/p&gt;&lt;p&gt;例えば、controllerの要請がある時、当該なデータをデータベースから取得してそのデータをentityクラスに格納してクライアント(ブラウザ)に応答しても構いないと意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、実務のウェブプロジェクトを作成する時に少しルールがあります。&lt;/p&gt;&lt;p&gt;まず、ウェブ要請がある時に当該な要請で使うデータベースのデータは一括で取得します。その後、セッションに格納するデータや取得するデータを取得して最大に簡潔なロジックを実装して応答します。&lt;/p&gt;&lt;p&gt;なぜ、こんなルールがあるかというとウェブというのはcontrollerで処理が多くなれば応答速度が遅くなります。使用者の特性上、ページを要請したのに1秒以上がかかっても何か問題があるではないかと認知するので処理速度が遅くなるとダメです。&lt;/p&gt;&lt;p&gt;その理由で一番時間がかかる処理(database connection)を一番先に配置して、その後で処理ロジックを実装することです。そうすると後にデバッグやプロファイリングする時の性能チェックが簡単になります。&lt;/p&gt;&lt;p&gt;そのことでデータベースからデータを取得してcontrollerから使うデータに変換する作業がdao(database access object)クラスを作成することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブからは二つのデータ変換オブジェクトがあります。それがdtoとdaoです。dtoはクライアント(ブラウザ)から要請するデータ値をクラスインスタンスタイプに変換することで、この部分はspringで自動に処理します。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/80.html&quot; target=&quot;_blank&quot;&gt;[java] 40. web spring frameworkでcontrollerを扱う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;daoはデータベースのデータをクラスインスタンス値に変換する作業です。それも一部jpaフレームワーク側で処理します。でも、データを様々にjoinするか複雑に取得する場合があるため、daoクラスを作成します。&lt;/p&gt;&lt;p&gt;まず、daoクラスを作成するために共通的に使っている抽象クラスを作成しました。&lt;/p&gt;&lt;p&gt;この抽象クラスにはdaoでデータベースからデータを取得するためによく使うtransactionの共通関数を作成しました。このtransactionの共通関数に関しては以前の投稿で説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/89.html&quot; target=&quot;_blank&quot;&gt;[java] 49. jpaでトランザクション(transaction)を扱う方法と共通関数作成する方法(observerパターン)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてcontrollerなどでよく使っているデータ挿入(create)、修正(update)、削除(delete)関数を共通で作成しました。&lt;/p&gt;&lt;p&gt;コンストラクタはprotectedで設定して継承するクラスで再定義するように作成して、クラスにジェネリックタイプを入れて関数のリターン値とパラメータのデータタイプを一致しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;userdaoクラスとinfodaoクラス、info2daoクラス、permissiondaoクラスを作りましょう。&lt;/p&gt;&lt;p&gt;上の例はuserdaoクラスです。つまり、データベースからuserデータを取得してuserクラスに変換する形のクラスです。&lt;/p&gt;&lt;p&gt;まず、extendsでabstractdaoを継承する時、ジェネリックタイプをuserクラスに設定します。そのことでcreate関数とupdate関数、delete関数のパラメータとリターンタイプがuserクラスに一致されます。&lt;/p&gt;&lt;p&gt;コンストラクタは抽象クラスがprotectedタイプなのでpublicに変更して抽象クラスのコンストラクタを呼び出します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1624&quot; data-filename=&quot;001.png&quot; style=&quot;width: 252px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それなら上のデザインみたいな構造に実装されます。&lt;/p&gt;&lt;p&gt;main関数で使いましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1625&quot; data-filename=&quot;002.png&quot; style=&quot;width: 186px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行関数でuserdaoクラスのインスタンスを生成してまずデータベースにデータを追加するuserインスタンスを生成しました。&lt;/p&gt;&lt;p&gt;そしてデータをinsertしてselecteで取得しました。最後に削除するところまで問題がありません。 &lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のdaoはtransactionテーブルを処理するの形です。transactionテーブルとはtransactionの処理を頻繁にするテーブルという意味です。つまり、データの追加、修正、削除が良く発生するテーブルです。&lt;/p&gt;&lt;p&gt;masterテーブルのdao構造は少し違います。masterテーブルは普通sa(system admin)が直接にデータベースに追加、修正、削除をするのでその頻度が少ないです。&lt;/p&gt;&lt;p&gt;masterデータはデータ変更がすくないので使うたびにconnectionでデータを取得することより上みたいに始めに一回だけ取得してメモリに割り当てして使う方法が性能上で利点があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1626&quot; data-filename=&quot;003.png&quot; style=&quot;width: 258px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいにpermissiondao.basicpermission()を通って簡単にpermissionインスタンスを取得して使えます。&lt;/p&gt;&lt;p&gt;もし、saによりデータの変更がある場合、daoのreflesh関数を呼び出したらプログラム上でmasterテーブルデータが再設定します。&lt;/p&gt;&lt;p&gt;でも、実はmasterテーブルデータが変更するならプログラムの内容も修正する可能性が高いので普通は再起動するじゃないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjpaプロジェクトでdaoクラスを作成する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/90.html</guid><pubDate>Tue, 22 Jun 2021 12:32:50 +0900</pubDate></item><item><title>[Java] 49. JPAでトランザクション(transaction)を扱う方法と共通関数作成する方法(Observerパターン)</title><link>https://www.nowonbun.com/89.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjpaでトランザクション(transaction)を扱う方法と共通関数作成する方法(observerパターン)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;トランザクション(transaction)とはデータベースで論理的な状態の変化、つまりinsert、update、deleteでデータベースのデータの更新があることをトランザクション(transaction)という意味です。その意味でデータの更新が多いことをトランザクション(transaction)テーブル、そうではないことをマスタ(master)テーブルといいます。&lt;/p&gt;&lt;p&gt;このトランザクション(transaction)は範囲を設定することができますが、範囲設定を通ってアトミック（atomicity）、一貫性（consistency）、独立性（isolation）、耐久性（durability）を守れられます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もっと理解しやくのため、ウェブを通って会員登録設定を作ると思いましょう。&lt;/p&gt;&lt;p&gt;会員登録を通って基本的なidと様々なテーブルにデータを同時にinsertをすると思いましょう。でも、最初idがある基本情報テーブルにinsertを完了して様々なテーブルにinsertする途中でエラーが発生しました。&lt;/p&gt;&lt;p&gt;つまり、テーブル一つの単位でトランザクション(transaction)をかけ、基本情報のデータをinsertしましたが、エラーが発生して他のテーブルにinsertをできませんでした。そうならデータの無結成を守られません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それですべてのデータがしっかりinsertにした後、commitを通って一括で同時にデータが格納され、もし、エラーが発生すればcommitかわりにrollbackを通って途中でinsertしたデータをトランザクションが始まる前の状況に戻らなければなりません。&lt;/p&gt;&lt;p&gt;それをトランザクション(transaction)範囲設定です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1623&quot; style=&quot;width: 342px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースは私が途中でpersist関数を使ってデータを格納する関数を呼び出しましたが、途中にruntimeexceptionで強制にエラーを発生しました。そして上のトランザクション(transaction)範囲でcommitを実行しなずにrollbackを実行することにしてpersist関数やmerge関数、remove関数で呼び出したデータがデータベースのデータが更新しなずにそのままにトランザクション(transaction)範囲を設定する以前状態に戻ります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1621&quot; style=&quot;width: 291px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はjpaはこのtransaction範囲を設定しなければデータが入力されません。&lt;/p&gt;&lt;p&gt;つまり、transaction設定はjpaでは必須ということです。&lt;/p&gt;&lt;p&gt;なので、このtransacion部分を共通関数に設定して、共通関数を呼び出してトランザクション(transacion)を設定して完了すればcommitを実行するし、エラーが発生すれば自動にrollbackが発生する共通関数を作成する必要があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でも私が簡単に共通関数を作成して簡単にトランザクションを設定して使いましたが、今回は実際のプロジェクトで使える共通関数を作成しましょう。&lt;/p&gt;&lt;p&gt;私はjpatransactionのクラス名でトランザクションクラスを作成しました。&lt;/p&gt;&lt;p&gt;基本的に使う関数はtransactionで総4パターンのオーバーロード(overloading)しました。&lt;/p&gt;&lt;p&gt;大きい概念でtransacionからリターン値がないタイプ(void)と結果があるobjectタイプの形です。ここでobjectはラムダ式でジェネリックタイプでリターンタイプを設定します。&lt;/p&gt;&lt;p&gt;そしてその小さい概念でboolean readonlyを設定して、もしパラメータのbooleanタイプがなければ基本falseになる総4パターンです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでtransacionのリターンタイプがvoidはinsert、 update、 deleteを実行する時に使うtransacionだし、ジェネリックタイプでリターンタイプを設定する場合はselectを使う時に使うtransactionです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1622&quot; data-filename=&quot;003.png&quot; style=&quot;width: 341px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jpatransactionクラスはcloseableインタフェースを継承しているのでtry()キーワードを利用して自動にclose関数を呼び出すように作成します。&lt;/p&gt;&lt;p&gt;そしてtransactionの関数を二回に呼び出しましたが、始めはリターン値がないtransacion関数でbooleanパラメータもないのでreadonlyはfalseに設定され呼び出します。&lt;/p&gt;&lt;p&gt;そうことで始めのtransacionラムダ式を終了すればデータがinsertされ、次のtransactionはデータを更新することではなく、単純にentitymanagerのインスタンスを取得してselectしてデータを取得する流れです。&lt;/p&gt;&lt;p&gt;ジェネリックは別に設定しなくても、ラムダ式のジェネリックタイプはリターンタイプで自動に設定するので、returnタイプがuserタイプなので変数はuserタイプで取得しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実際にデータをコンソールに出力するなら始めのトランザクションで入力したデータが出力しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jpaの基本関数で上みたにトランザクション共通関数があればよいのに別にそんな関数はありません。プロジェクトを作成するたびに作成しなければならないです。でも、一回に作成すると再使用で簡単に使えるので、上のタイプに作成したらよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjpaでトランザクション(transaction)を扱う方法と共通関数作成する方法(observerパターン)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/89.html</guid><pubDate>Mon, 21 Jun 2021 18:51:00 +0900</pubDate></item><item><title>[Java] 48. JPAでQueryを使う方法(JPQLクエリを作成する方法)</title><link>https://www.nowonbun.com/88.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjpaでqueryを使う方法(jpqlクエリを作成する方法)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jpaで基本的にデータを取得する方法はentityで宣言されているnamequeryを通ってデータを取得します。そしてリファレンスのjoinになったデータを取得するために取得するデータでlistの関数get、size関数を通ってデータを取得します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1620&quot; style=&quot;width: 467px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1614&quot; data-filename=&quot;002.png&quot; style=&quot;width: 326px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、上の方法の問題はデータをすべて取得してコード上のfilterや分岐でデータを取得します。&lt;/p&gt;&lt;p&gt;つまり、データが多いとシステムが遅くなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうならクエリでデータベースからデータを取得する段階でデータを分類して取得した後、処理する方が良いです。&lt;/p&gt;&lt;p&gt;jpaはクエリでデータを取得する方法が二つがあります。一つはjpaで使うjpqlクエリで取得する方法とデータベースで使うsqlクエリで取得する方法です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、データベースで使うsqlクエリを利用する例です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1615&quot; data-filename=&quot;003.png&quot; style=&quot;width: 244px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;managerクラスのcreatenativequery関数を利用してデータベースのsqlクエリでデータを取得することができます。&lt;/p&gt;&lt;p&gt;問題はjpaで生成したentityクラスのマッピングでできないことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jpaを利用して取得したデータはデータを修正すると、その値をデータベースにupdateするし、削除するし、様々な作業ができます。でも、クラスのマッピングができなければjpaを使う理由がないです。&lt;/p&gt;&lt;p&gt;そのため、jpqlクエリでデータを取得したデータではなければjpa機能を完全に使えないです。実はjpqlクエリでもsqlと全然違う種類のクエリではありません。ほぼ90%は似てます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1615&quot; data-filename=&quot;003.png&quot; style=&quot;width: 244px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;sqlクエリと違う点はテーブル名です。sqlにはテーブル名を大小文字区分なしで取得ができますが、jpqlはテーブル名ではなくクラス名です。&lt;/p&gt;&lt;p&gt;つまり、クラス名は大小文字を区分するので、userではなく、正確にuserということに作成しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてアスタリスクマーク(*)ですべてのデータを取得することもありません。&lt;/p&gt;&lt;p&gt;リターンするクラスを使います。我々はuserクラスでリターンするためにuserクラスの置換名(aliases)というuを使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてwhere節にある検索のフィールド名はsqlのカラム名ではなく、クラスの変数名です。&lt;/p&gt;&lt;p&gt;現在の例は変数名とsqlカラム名が同じなので同じくみえます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうなら変数名を変更してテストしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1616&quot; data-filename=&quot;004.png&quot; style=&quot;width: 447px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;idに@columnアトリビュートを使ってsqlのカラム名をマッピングして変数名はtestに変更しましょう。&lt;/p&gt;&lt;p&gt;그럼 jpql에서는 id가 아닌 test를 사용해야 합니다.&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1615&quot; data-filename=&quot;003.png&quot; style=&quot;width: 244px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のクエリではidではなく、testの変数名を使いました。もちろん、変数名なので大小文字区分は重要です。&lt;/p&gt;&lt;p&gt;そしたら結果はobject配列タイプではなく、userタイプでリターンしてuserデータを使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jqplのクエリはfetchのキーワードでリファレンスデータの結果も制御できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1617&quot; style=&quot;width: 236px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例みたいにinfoテーブルにageが21のデータを大量インサートしました。&lt;/p&gt;&lt;p&gt;でも、私は20のデータだけinfoリストに検索したいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1613&quot; data-filename=&quot;006.png&quot; style=&quot;width: 250px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;join fetchの構文をいれてinfosをiに置換してi.ageを20だけ検索するように設定しました。&lt;/p&gt;&lt;p&gt;結果はgetinfosのデータの個数は一つだし、そのデータのageは20だけあることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jpqlもstringタイプで作成するクエリなのでソースのあっちこっちに作成すると管理が難しいですね。&lt;/p&gt;&lt;p&gt;それで普通はentityにクエリを作成して実際のロジックソースにはクエリを読み込んで使うタイプで作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1618&quot; data-filename=&quot;007.png&quot; style=&quot;width: 844px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;entityクラスの上に@namedqueriesアトリビュートを利用してクエリを片付けます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考に私はideをeclipseツールを使います。entityの上にクエリを作成するとstringデータでもquery検査をします。でも、これがバグがあります。fetch join置換値を認識できません。&lt;/p&gt;&lt;p&gt;もちろん、無視してデバッグ実行しても問題ないですが、ツールでエラー表示が出ると見づらいです。&lt;/p&gt;&lt;p&gt;プロジェクトのpreferencesに入ってjpa -&amp;gt; query部分のエラー表示を変更しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1619&quot; data-filename=&quot;008.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;reference - &lt;a href=&quot;https://www.eclipse.org/forums/index.php/t/369011/&quot; target=&quot;_blank&quot;&gt;https://www.eclipse.org/forums/index.php/t/369011/&lt;/a&gt;&lt;/span&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1613&quot; data-filename=&quot;006.png&quot; style=&quot;width: 250px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてcreatenamedqueryを通ってentityクラスからクエリを読み込んでデータを取得しても結果は同じです。&lt;/p&gt;&lt;p&gt;こんなにするとすべてのクエリを一括で管理ができますね。データベースのテーブル変更が発生する時にそのことに関するアップデータ管理も楽になりますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjpaでqueryを使う方法(jpqlクエリを作成する方法)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/88.html</guid><pubDate>Thu, 17 Jun 2021 16:20:51 +0900</pubDate></item><item><title>[Java] 47. JPAのEntityクラスのリファレンス設定(cascade, fetch)</title><link>https://www.nowonbun.com/87.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjpaのentityクラスのリファレンス設定(cascade, fetch)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でideツール(eclipse)でjpaのentityを自動生成して基本的に設定しなければならない方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://nowonbun.tistory.com/546&quot; target=&quot;_blank&quot;&gt;[java] 46. jpaのentityクラスの基本設定(@generatedvalue、 @manytomany)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的な設定でプロジェクトを運用及び作成することは問題ないですが、パフォーマンスのためにもっと修正しなければならないことがあります。&lt;/p&gt;&lt;p&gt;例えば、以前投稿で使ったデータベースでuserテーブルを検索してinfoテーブルのデータを読み込むことで基本的な設定ではuserのリファレンステーブルのinfoデータがありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1601&quot; data-filename=&quot;001.png&quot; style=&quot;width: 327px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればuserクラスでgetinfos()を呼び出してstream式でデータを出力すればデータがないことで出力します。&lt;/p&gt;&lt;p&gt;でも、get(0)やforeachを使ったら関数の呼び出す共にリファレンスデータをデータベースから取得します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、始めのuserクラスにはデータが無いですが、getとiteratorを呼び出したらその時にデータをデータベースから取得します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1607&quot; data-filename=&quot;002.png&quot; style=&quot;width: 641px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;仕様によりstream式を使わなかったら構いないですが、最近のプログラムコードはstream式を使わなかったらすごく複雑になるので、今は必須になっています。&lt;/p&gt;&lt;p&gt;これを解決する方法にはfetch設定です。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;fetchは当該なクラスをデータベースから検索して取得する時、同時にリファレンスデータを取得するかgetの関数を使う時に取得するかのオプションです。&lt;/p&gt;&lt;p&gt;オプションの終了はeagerとlazyがあります。eagerのオプションは当該なクラスの取得する時にjoinして取得するし、lazyのオプションは関数の呼び出しがある時に取得します。&lt;/p&gt;&lt;p&gt;つまり、上の例みたいにgetの関数の呼び出しがある時に取得することはlazyのオプションです。別に設定しなくても構いないのデフォルト設定です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1604&quot; data-filename=&quot;003.png&quot; style=&quot;width: 614px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;当該な変数にfetch = fetchtype.eagerを設定しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1610&quot; style=&quot;width: 261px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;始めの例を、また実行したら今回にはコンソール出力にemptyではなく、データが表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1605&quot; data-filename=&quot;005.png&quot; style=&quot;width: 619px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;デバッグでポインタを掛けてuserを取得する段階で確認すればもうデータがあることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これをなぜオプションで選択することになったかと思えばデータ戦略により設定が変わります。&lt;/p&gt;&lt;p&gt;もしかして、我々がmasterテーブルから連結されているreferenceデータが一万件、十万件ならそのデータを取得する時、joinデータを取得することだけで時間がすごくかかります。&lt;/p&gt;&lt;p&gt;newでクラスを生成することは考えより時間がすごくかかります。その時にはlazy設定でデータを取得することがシステムに負担がありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、transactionテーブルのreferenceデータがmasterの場合、システムの仕様によりデータチェックと分岐処理をする時によく使います。その時にデータベースに接続してデータを取得するコネクションが多くなると逆にシステムが遅くなります。&lt;/p&gt;&lt;p&gt;コネクションは結局socketのリソースを使うことですが、ioと同じく使うシステムリソースなのですごく遅いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラム設計もこれをすごく注意しながらstream式よりはforeachとforを利用して検索することに設計するほうが良いです。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;cascade&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;cascadeとはデータベースから永続性遷移ということのデータの一貫性を設定するオプションです。&lt;/p&gt;&lt;p&gt;例えば、databaseでuserのデータを削除するためには連結したinfoデータを削除しなければならないし、infoデータを削除するためには連結したinfo2データを削除しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もちろん、これがプログラムで順番でinfo2を削除してinfoを削除してuserを削除すればよいです。&lt;/p&gt;&lt;p&gt;この場合は二つの問題があります。一つはソースがすごく複雑になるし、関連データベースが変更するたびにソースをすべて修正しなければならない問題があります。こんなことになると我々がjpaを使う必要がありません。&lt;/p&gt;&lt;p&gt;もう一つ、問題がある部分がもしinfo2テーブルのデータを削除してinfoテーブルのデータを削除する動作でエラーが発生します。その場合はinfo2が削除されたので完全にrollbackができません。でも、これはtransactionの問題ですが、永続性遷移と関係があります。&lt;/p&gt;&lt;p&gt;つまり、一括で削除されなければならないです。&lt;/p&gt;&lt;p&gt;cascadeオプションで設定することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1608&quot; data-filename=&quot;006.png&quot; style=&quot;width: 457px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1606&quot; data-filename=&quot;007.png&quot; style=&quot;width: 450px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1603&quot; data-filename=&quot;008.png&quot; style=&quot;width: 256px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はuserテーブルでnowonbunを検索して削除するコードです。別にinfoテーブルのデータとinfo2テーブルのデータは検索もしてなかったし、削除する時にエラーが発生しませんでした。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1602&quot; style=&quot;width: 319px;&quot; data-filename=&quot;009.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1612&quot; data-filename=&quot;010.png&quot; style=&quot;width: 278px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1609&quot; data-filename=&quot;011.png&quot; style=&quot;width: 300px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;当該なデータベースを確認しても綺麗に削除されていました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、cascade設定もかってに設定するとダメです。&lt;/p&gt;&lt;p&gt;もしtransactionテーブルを削除する時にmasterテーブルのデータが削除されるか、間違いロジックコードで重要なデータが続けて削除されたらngです。&lt;/p&gt;&lt;p&gt;もちろん、削除だけではなく、修正、追加もルールによって動作しなければならないです。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th&gt;タイプ&lt;/th&gt;        &lt;th&gt;&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;cascadetype.persist&lt;/td&gt;        &lt;td&gt;entityが追加される時、関連なentityも追加する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;cascadetype.merge&lt;/td&gt;        &lt;td&gt;entityが修正される時、関連なentityも修正する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;cascadetype.refresh&lt;/td&gt;        &lt;td&gt;entityが更新される時、関連なentityも更新する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;cascadetype.remove&lt;/td&gt;        &lt;td&gt;entityが削除される時、関連なentityも削除する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;cascadetype.detach&lt;/td&gt;        &lt;td&gt;親のentityがdetach()を実行されると、関連なentityもdetach()状況になり変更事項が反映されない。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;cascadetype.all&lt;/td&gt;        &lt;td&gt;全てのcascadeが反映&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;ここのcascadeオプションはentitymanagerのクラスの関数と関係があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1611&quot; data-filename=&quot;012.png&quot; style=&quot;width: 488px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、各entityクラスのインスタンスをどの関数で使って追加、削除、修正する時にリファレンスクラスに影響になることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;fetchオプションとcascadeオプションは状況により設定しなくてもormを運用することで問題がありません。しかし、パフォーマンスには差異がなりますね。&lt;/p&gt;&lt;p&gt;そしてコードを作成して後にテーブルが変更があればメンテナンスする時も差異があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjpaのentityクラスのリファレンス設定(cascade, fetch)に関する説明でした&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/87.html</guid><pubDate>Wed, 16 Jun 2021 19:30:14 +0900</pubDate></item><item><title>[Java] WebSocketでチャット履歴をローディングする方法</title><link>https://www.nowonbun.com/260.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのwebsocketでチャット履歴をローディングする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私のメールでチャットプログラムを実装する時に、以前にチャットした内容をロードする方法に関して質問があって作成しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/259.html&quot; target=&quot;_blank&quot;&gt;[java] websocketを利用してユーザ(サイト運用者)が他のユーザとチャットする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がよく使うスマホでlineなどのチャットアプリの内容はどのぐらいはサーバに格納しますが、基本的にローカル(スマホ内部)に格納することになります。&lt;/p&gt;&lt;p&gt;もちろん、pcや他のスマホにも同期化するためにもサーバにも格納するかも知りません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、ウェブは基本的にブラウザ政策でローカルファイルを操作(格納及び読み込み、書き込み)が制限されています。もし、ブラウザでローカルファイルが操作できればウェブサイトで接続することだけで内部システムを操作することができると意味なのでセキュリティ脆弱性の問題になります。&lt;/p&gt;&lt;p&gt;そうすれば、ブラウザからチャット内容をサーバに格納しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;チャット内容を格納する方法は様々がありますが、個人的にはデータベースにチャット内容をすべて格納することよりファイルで格納する方がよいと思います。&lt;/p&gt;&lt;p&gt;でも、仕様によりdbに格納する場合もあるので、ファイルに格納することや読み込みするところをdbにinsert、updateで格納するし、selectで読み込みすることで修正するとよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、サーバとクライアント(ブラウザ)と複雑なデータを送受信するためにjsonタイプのデータを扱うほうが良いです。&lt;/p&gt;&lt;p&gt;そのため、pom.xmlにjavaで使うjsonパーシングライブラリを使いましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/182.html&quot; target=&quot;_blank&quot;&gt;[java] jsonタイプのデータを使う方法(gsonライブラリ)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;そしてブラウザから使うhtmlとjavascriptソースです。参考にjavascriptのライブラリはjqueryを使いました。&lt;/p&gt;&lt;p&gt;デバッグして実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1595&quot; data-filename=&quot;001.png&quot; style=&quot;width: 425px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;loginテキストボックスとボタンが活性化になっているし、messageボックスとsendボタンが非活性化になっています。&lt;/p&gt;&lt;p&gt;testをいれてログインしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1598&quot; style=&quot;width: 403px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてaaaaaというメッセージを入れたらチャットでaaaaaというメッセージが表示されます。&lt;/p&gt;&lt;p&gt;他のブラウザでまた当該なurlを接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1595&quot; data-filename=&quot;001.png&quot; style=&quot;width: 425px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はtest1をidとして入れてログインしましょう。&lt;/p&gt;&lt;p&gt;そうしたらtestで作成した内容が表示されます。&lt;/p&gt;&lt;p&gt;bbbbbというメッセージを入れて送信します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1600&quot; data-filename=&quot;003.png&quot; style=&quot;width: 395px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はまたtestがあるブラウザを確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1596&quot; data-filename=&quot;004.png&quot; style=&quot;width: 409px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ブラウザ間にチャットは問題ないことを確認しました。&lt;/p&gt;&lt;p&gt;今回はchatファイルのデータがちゃんと作成されるかを確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1597&quot; style=&quot;width: 262px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1599&quot; data-filename=&quot;006.png&quot; style=&quot;width: 254px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一応、最初の仕様とおりに実行されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;質問は以前にチャット履歴を表示しようという仕様でしたが、チャットルームの概念を入れると少し内容が変わる可能性があります。&lt;/p&gt;&lt;p&gt;チャットルームを作成すればチャットルームのキーを作成して、そのキーでファイルを読み込んだ後、チャットルーム別に履歴を別にします。入場する前の内容は表示しないという仕様を追加すれば各メッセージでもキーを作成して表示しなければならないです。もちろん、入場する時のキーをユーザが持ってなければならないし、様々な仕様を追加すると複雑になりますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのwebsocketでチャット履歴をローディングする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/260.html</guid><pubDate>Tue, 15 Jun 2021 18:35:12 +0900</pubDate></item><item><title>[Java] WebSocketを利用してユーザ(サイト運用者)が他のユーザとチャットする方法</title><link>https://www.nowonbun.com/259.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はwebsocketを利用してユーザ(サイト運用者)が他のユーザとチャットする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私のメールでサイト運用者とユーザ間にwebsocketを利用して1:1チャットする方法に関して質問があって実装してみました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;web上でリアルでチャットするためにはwebsocket機能に関して知るべきです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/168.html&quot; target=&quot;_blank&quot;&gt;[java] websocket (ウェブソケット)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;websocketの構造は一般socketと差異がありますが、仕様に関しては似ているのでsocket仕様だけ分かれば簡単に実装することができます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/67.html&quot; target=&quot;_blank&quot;&gt;[java] 27. ネットワーク通信(socket)をする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、仕様の条件は運用者が他のユーザとwebsocketでチャットすることです。&lt;/p&gt;&lt;p&gt;サーバの基準をみれば運用者とユーザはソケットクライアントです。つまり、server側ではclientが運用者ユーザと一般ユーザかの区分する必要があります。&lt;/p&gt;&lt;p&gt;webの環境は接続ページによる接続者の区分ができるので、接続urlによるclientを区分しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;始めの仕様は一般ユーザはindex.jspに接続するし、運用者はadmin.jspを接続しましょう。&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一般ユーザは運用者と1:1チャットですが、運用者はユーザとn:1チャットになります。&lt;/p&gt;&lt;p&gt;サーバとクライアントは一つのソケットに連結されているので、keyを通って区分します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;二つ目の仕様は一般ユーザが接続すればuniqueキーを与えて、運用者はユーザの区分のためこのuniqueキーを通ってデータを送受信しましょう。&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一般ユーザとサーバ間の通信です。&lt;/p&gt;&lt;p&gt;ここまではindex.jspと/broadsocketのwebsocket通信部分です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからは運用者とサーバ間の通信です。&lt;/p&gt;&lt;p&gt;ソース作成は完了しました。デバッグして実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1591&quot; data-filename=&quot;001.png&quot; style=&quot;width: 407px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;他のブラウザで運用者ユーザを接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1590&quot; style=&quot;width: 825px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;接続すると運用者ブラウザで三つのチャットが開いていることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一般ユーザチャットで各違うメッセージを送信しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1593&quot; data-filename=&quot;003.png&quot; style=&quot;width: 829px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;運用者ユーザの各チャットで各メッセージが送受信したことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は運用者ユーザが送信しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1594&quot; data-filename=&quot;004.png&quot; style=&quot;width: 818px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;各ユーザのブラウザにメッセージを受信したことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はユーザ2の閉じます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1592&quot; style=&quot;width: 840px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;運用者のブラウザでユーザのチャットが消えました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;仕様が大体に合います。デザインとスクリプトは理解しやすいためにjqueryとバニラのバージョンを混雑に使いました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでwebsocketを利用してユーザ(サイト運用者)が他のユーザとチャットする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/259.html</guid><pubDate>Tue, 15 Jun 2021 17:20:08 +0900</pubDate></item><item><title>[Java] 46. JPAのEntityクラスの基本設定(@GeneratedValue、 @ManyToMany)</title><link>https://www.nowonbun.com/86.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjpaのentityクラスの基本設定(@generatedvalue、 @manytomany)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でjpaを基本的に設定する方法と使う方に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/85.html&quot; target=&quot;_blank&quot;&gt;[java] 45. jpaを設定する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jpa ormの構成は一応データベースにテーブルを生成してide(eclipse)を通ってテーブルの構造を読み込んで自動にentityクラスを生成します。でも、これがeclipseのバグかjpa仕様かは知りませんが、生成する時に基本的な設定だけして具体的な設定はユーザが設定しなければならない部分があります。&lt;/p&gt;&lt;p&gt;例えば、基本キーを設定してauto_increment値に関しても別に設定しなければならないし、各referenceに関してもどのタイプに設定するかも設定しなければならないです。&lt;/p&gt;&lt;p&gt;そしてデータタイプでもbitやdatetimeを設定すればclassにはどのデータタイプかを正確に設定しなければならないです。&lt;/p&gt;&lt;p&gt;この部分が少し不便ですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、我々がクエリを作成してclassを設定する方法に関して説明します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1572&quot; data-filename=&quot;001.png&quot; style=&quot;width: 461px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;userテーブルのキーはidカラムです。そしてinfoテーブルはuserテーブルのidでreferenceを連結して、info2テーブルはinfoテーブルのkey(idx)でreferenceを連結しました。&lt;/p&gt;&lt;p&gt;そしてpermissionテーブルはuserテーブルとm:n関係ですが、データベースはm:nの関係を表現できないので、permission_mapテーブルを置いてm:n関係を作りました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のテーブルをjpaでクラスを生成(generate)しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1573&quot; data-filename=&quot;002.png&quot; style=&quot;width: 703px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1580&quot; style=&quot;width: 551px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1578&quot; data-filename=&quot;004.png&quot; style=&quot;width: 473px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;テーブルは5個ですが、クラスは4個が生成されました。なぜならデータベースにはm:n関係を表現できないですが、プログラムクラスはm:n関係を表現できるので、permission_mapのテーブルの対するクラスは生成されませんでした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならプログラムでデータを追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1569&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;userテーブルにisdeletedのカラムでデータタイプが合わないというエラーが発生します。&lt;/p&gt;&lt;p&gt;クエリをみれば、bitタイプで設定しましたが、eneityクラスファイルはobjectタイプで設定されています。&lt;/p&gt;&lt;p&gt;bitタイプは物理的には0と1、論理的にはtrueとfalseのデータを使います。&lt;/p&gt;&lt;p&gt;なので、プログラムにはbooleanタイプで設定しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1568&quot; data-filename=&quot;006.png&quot; style=&quot;width: 445px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとobjectタイプをbooleanに修正してgetter、setterデータタイプも修正しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1576&quot; data-filename=&quot;007.png&quot; style=&quot;width: 496px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;booleanに設定したらまた、デバッグして実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1579&quot; style=&quot;width: 848px;&quot; data-filename=&quot;008.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はcascade persistエラーが発生しました。&lt;/p&gt;&lt;p&gt;cascade persistエラーはuserテーブルにデータを追加してinfoテーブルとinfo2テーブルに同時にデータを追加できないという意味です。&lt;/p&gt;&lt;p&gt;この制約がなぜあるかというと我々がデータベース設計する時、masterテーブルとtransactionテーブルを区分して設定をします。&lt;/p&gt;&lt;p&gt;transactionテーブルとはユーザの操作でデータが追加したり削除したり修正したりするテーブルだし、masterテーブルとはプログラム上で使うデータでユーザが追加、削除、修正ができたらダメなデータです。&lt;/p&gt;&lt;p&gt;つまり、我々がentity設定する時、cascade persist設定でデータを追加する時にreferenceに連結されたデータが修正が可能するかどうかの設定が必要なことです。&lt;/p&gt;&lt;p&gt;cascadeに関しては別の投稿で詳しく説明します。一応、userクラスとinfoクラスにcascade設定を追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1577&quot; data-filename=&quot;009.png&quot; style=&quot;width: 469px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1575&quot; data-filename=&quot;010.png&quot; style=&quot;width: 458px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;userテーブルにデータが追加する時、infoテーブルにも修正ができるという意味だし、infoテーブルにデータが追加する時、info2テーブルにも修正ができるという意味です。&lt;/p&gt;&lt;p&gt;cascade設定をしたらまたデバッグして実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1570&quot; data-filename=&quot;011.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;infoテーブルとinfo2テーブルでidx値を自動に増加しなければならないですが、設定されてないのでエラーが発生しました。&lt;/p&gt;&lt;p&gt;つまり、infoクラスとinfo2クラスにidentity設定をしなければならないという意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1588&quot; data-filename=&quot;012.png&quot; style=&quot;width: 473px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1585&quot; data-filename=&quot;013.png&quot; style=&quot;width: 524px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;自動増加設定をしなければならない変数に@generatedvalue(strategy = generationtype.identity)を設定すればよいです。&lt;/p&gt;&lt;p&gt;実はこの部分はjpaのclassを生成する時にウィザードで設定できる部分ですが、テーブルが多い時には設定が複雑になる可能性があるので基本生成でアトリビュートを追加して設定する方が楽です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;設定したらまたデバッグして実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1574&quot; style=&quot;width: 563px;&quot; data-filename=&quot;014.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はエラーが発生しませんでした。&lt;/p&gt;&lt;p&gt;データベースの結果をみればデータがちゃんとinsertなったことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1571&quot; data-filename=&quot;015.png&quot; style=&quot;width: 764px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はデータを検索して読み込んでpermissionテーブルと連結します。&lt;/p&gt;&lt;p&gt;まず、permissionテーブルは構造が自動増減式のキーではなく、特定なchar値をキーで使うことのmasterテーブルです。&lt;/p&gt;&lt;p&gt;つまり、masterテーブルはプログラム上で扱うデータではなく、プログラム管理者(sa)が管理するデータです。&lt;/p&gt;&lt;p&gt;permission_mapテーブルにnowonbunのidのuserにbascの権限を与えあげたいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1582&quot; data-filename=&quot;016.png&quot; style=&quot;width: 536px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;エラーが発生せずに実行されました。でも、データベースを確認すればデータがありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1587&quot; style=&quot;width: 282px;&quot; data-filename=&quot;017.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この状態はpermision_mapのデータ追加する部分がpermissionクラスに設定されています。&lt;/p&gt;&lt;p&gt;permissionクラスはmasterテーブルなので我々はuserテーブルにpermission_mapをinsertする設定をしなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1583&quot; data-filename=&quot;018.png&quot; style=&quot;width: 384px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1581&quot; data-filename=&quot;019.png&quot; style=&quot;width: 467px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;@manytomany設定がされている両クラスをお互いに変わります。&lt;/p&gt;&lt;p&gt;つまり、userクラスにjointableを作成してuserからpermision_mapをinsertするように設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1589&quot; style=&quot;width: 487px;&quot; data-filename=&quot;020.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1586&quot; data-filename=&quot;021.png&quot; style=&quot;width: 541px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、main関数をデバッグして実行します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1584&quot; data-filename=&quot;022.png&quot; style=&quot;width: 244px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データベースにデータが追加したことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jpaが個人的な考えではパフォーマンスが悪くないですが、こんな設定が自動にできなく、自動増加設定とcascade設定、@manytomanyは手動に設定しなければならないことは不便です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjpaのentityクラスの基本設定(@generatedvalue、 @manytomany)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/86.html</guid><pubDate>Mon, 14 Jun 2021 20:46:10 +0900</pubDate></item><item><title>[Design pattern] 1-2. ビルダーパターン(Builder pattern)</title><link>https://www.nowonbun.com/258.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのビルダーパターン(builder pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ビルダーパターンとは我々が普通にクラスのインスタンスを生成する時にnewキーワードを使った生成しますが、その方法ではなく、他のクラスを利用してインスタンスを生成するパターンだといいます。&lt;/p&gt;&lt;p&gt;そしてインスタンス中でデータを入力するし、そのついて処理関数などを呼び出してクラスのデータを処理する方法です。仕様によって違いますが、クラスの目的があり、初期値及びデータはどのぐらい決まっているし特定なパターンによりクラスのデータを入力する方法で使います。&lt;/p&gt;&lt;p&gt;実行関数及びロジック関数でクラスの初期値を入力する方もありますが、その方法は不便なこともあるし、ソース読みにくいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1564&quot; data-filename=&quot;001.png&quot; style=&quot;width: 301px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースが間違っているかエラーが発生するか、パフォーマンスが悪いソースではありません。でも、nodeクラスのインスタンスを生成してメンバー変数にデータを格納する形が少しコードが汚いらしいです。&lt;/p&gt;&lt;p&gt;もし、nodeクラスで使う変数が多い状況や、クラスのインスタンスを生成するために処理が多い場合(パラメータデータを作成するための処理)にはそのほどソースの可読性が悪くなります。&lt;/p&gt;&lt;p&gt;そうなら、コンストラクタでnodeクラスに必要なパラメータデータを渡したらいいではないかと思いますが、インスタンスを生成して変数値を格納する構造と別に変数を生成して入力してコンストラクタパラメータで渡す構造と結局同じ構造になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうならすこしソースを減らすような方法でnode1とnode2の共通インターフェースを作って関数などを通ってインスタンスを生成して受け取ったらソースステップを減らすこともできるし可読性を高められます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1564&quot; data-filename=&quot;001.png&quot; style=&quot;width: 301px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースはbuild関数を使ってクラスインスタンスを生成しました。そして始めのパラメータを通ってクラスを区分してインスタンスを生成しました。&lt;/p&gt;&lt;p&gt;ロジック流れだけみれば上の例もビルダーパターン(builder pattern)です。でも、build関数をみれば変数設定のために強制キャストしてデータを入力しました。結局、初めの例と差異がありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;正確にビルダーパターン(builder pattern)を実装するためにはパラメータ役のbuilderクラスとbuildを実行するdirectorクラスを通ってデータを設定して最終結果のnodeクラスを受け取ることがビルダーパターン(builder pattern)です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1567&quot; data-filename=&quot;003.jpg&quot; style=&quot;width: 700px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;span style=&quot;font-size:0.7em&quot;&gt;출처 - &lt;a href=&quot;https://en.wikipedia.org/wiki/builder_pattern&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/builder_pattern&lt;/a&gt;&lt;/span&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1563&quot; data-filename=&quot;002.png&quot; style=&quot;width: 275px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;簡単に作ろうと思いましたが、ずいぶん複雑になりましたね。&lt;/p&gt;&lt;p&gt;上の設定はbuilderインスタンスでデータを設定します。directorのクルスにtypeデータを入力してnode1かnode2のインスタンスを生成します。&lt;/p&gt;&lt;p&gt;そしてdirectorにbuilderインスタンスを入れてデータを組み立てます。もちろん、組み立てしたデータを使ってもいいし、execute関数を実行して生成されたインスタンスを実行することもできます。&lt;/p&gt;&lt;p&gt;上の例はnode1とnode2クラスがdirectorクラス中で宣言されています。&lt;/p&gt;&lt;p&gt;これは選択事項ですが、普通はソースの管理のため、つまり、このクラスを使うユーザ(開発者)がnode1とnode2クラスのインスタンスをビルダーパターン(builder pattern)を利用して作るという制約です。つまり、仕様によってインラインクラスではなく、一般publicクラスで作成しても構いません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上にあるクラスダイアグラムとソースの内容は少し差異があります。私は一つのbuilderと一つのdirectorを通ってnodeのインスタンスの種類別で返却します。このパターンもビルダーパターン(builder pattern)です。&lt;/p&gt;&lt;p&gt;でも、他のケーズもあります。つまり、様々なbuilderと一つのdirectorを通って一つのnodeインスタンスが生成する方法と一つのbuilderと様々なdirectorがあるし、あるいは様々なbuilderとdirector、nodeインスタンスで生成する場合もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回には様々なbuilderと一つのdirector、一つのnodeを返却するjava例です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1562&quot; data-filename=&quot;004.png&quot; style=&quot;width: 204px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaの例はbuilderを二つ作成しました。nodeクラスとdirectorクラスは一つです。&lt;/p&gt;&lt;p&gt;つまり、builderクラス種類別でnodeクラスのデータが変わる流れです。nodeクラスはインラインクラスなのでbuilderパターンを通らないとインスタンス生成ができません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#は様々なdirectorクラスと一つのbuilderクラス、一つのnodeクラスの例です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1566&quot; style=&quot;width: 247px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ビルダーパターン(builder pattern)は例をみればすごく複雑だし、なぜこのパターンを使うかと思います。私の場合はすごく簡単な例で説明するからすごく複雑に見えますが、逆にすごく複雑な仕様では可読性を改善して思いよりすごく有用なパターンです。&lt;/p&gt;&lt;p&gt;事実は我々が作成したソースをみると知らずに適応したことも多いパターンです。すごくよく使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1565&quot; data-filename=&quot;006.png&quot; style=&quot;width: 205px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は実際のプロジェクト使える例です。コネクションを生成する関数は簡単に作成しましたが、db種類(mysqlやoracle)でビルダーパターン(builder pattern)を作られるパターンです。&lt;/p&gt;&lt;p&gt;実際にconnectionライブラリはシングルトンパターン(singleton pattern)とビルダーパターン(builder pattern)などを使って作成されています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのビルダーパターン(builder pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/258.html</guid><pubDate>Fri, 11 Jun 2021 19:07:16 +0900</pubDate></item><item><title>[Java] 45. JPAを設定する方法</title><link>https://www.nowonbun.com/85.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjpaを設定する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaプログラムでデータベースのコネクション管理するフレームワークがあります。そのフレームワークを我々はorm(object-relational-mapping)といいます。&lt;/p&gt;&lt;p&gt;以前、ormフレームワークを使わなかった時、または使用頻度が少なかった時にはプログラムでsql connectionを組み立てソースに直接にsqlクエリを作成してデータベースからデータを取得しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その方法はプログラム管理する時に様々な問題があります。&lt;/p&gt;&lt;p&gt;例えば、データベースのテーブルを修正した場合、sqlクエリをstringタイプで作成したのでプログラムのコンパイルエラーやデバッグエラーが発生しません。そのため、大きいプロジェクトだっと思えば各sqlクエリを修正することがずいぶん大変だったんです。&lt;/p&gt;&lt;p&gt;また、stringで作成したことなので、もしかして修正漏れがある場合、デバッグエラーで取れないので、実行中でエラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;他の問題はreference管理です。sqlクエリ上でテーブル間にjoinして結果に合わせてentityクラスを作成します。でも、joinの状況によりクラスがたくさん生成される結果になります。そうすればクラスが多くなって管理が大変になるし、テーブル修正がある場合に作業が多いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;個人的にこの２つの問題を解決するしデータベースのツリー構造のデータをプログラムのクラスタイプの連結リストタイプの構造に変換するフレームワークをormフレームワークといいます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaののormフレームワークは種類が多いです。hibernateということもあるし、domaのseasorということもあります。私の場合は昔ibatisというフレームワークも使ったことがあります。&lt;/p&gt;&lt;p&gt;いつからかは知りませんが、java側ではjpa(java persistence api)というフレームワークがjavaの標準ormに指定されました。最近はjava ideツールのeclipseでjpaフレームワークを扱いやすく支援しています。&lt;/p&gt;&lt;p&gt;なので最近の雰囲気はjpaをormに選択して使うことが標準になっています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jpaを使うためにはmavenでライブラリを連結しなければならないです。&lt;/p&gt;&lt;p&gt;「pom.xml」で２つのライブラリを連結しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=383&quot; data-filename=&quot;001.png&quot; style=&quot;width: 828px;&quot;&gt;&lt;/p&gt;&lt;p&gt;一番目のdependencyはjpaライブラリです。二番目のdependencyはmysql-connectorです。&lt;/p&gt;&lt;p&gt;私の場合はmariadb(mysql)を使いつもりでmysql-connectorを連結しましたが、他のデータベースを使うならこのconnectorライブラリを当該なデータベースのライブラリに変わったらよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;projectでjpa projectで変換しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=394&quot; data-filename=&quot;002.png&quot; style=&quot;width: 679px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=395&quot; data-filename=&quot;003.png&quot; style=&quot;width: 785px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=393&quot; data-filename=&quot;004.png&quot; style=&quot;width: 785px;&quot;&gt;&lt;/p&gt;&lt;p&gt;platfromとconnectionを設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=391&quot; data-filename=&quot;005.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=389&quot; data-filename=&quot;006.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてadd connectionリンクを押下してeclipseのデータベースのコネクションを設定しなければならないです。以前に「eclipse」で「mariadb(mysql)」を接続したことがなければ設定しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=392&quot; data-filename=&quot;007.png&quot; style=&quot;width: 586px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=385&quot; data-filename=&quot;008.png&quot; style=&quot;width: 380px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=388&quot; data-filename=&quot;009.png&quot; style=&quot;width: 586px;&quot;&gt;&lt;/p&gt;&lt;p&gt;connectorの場合はmavenでupdateをしてライブラリをダウンロードしたことがあればmaven repositoryディレクトリにjarファイルがあります。&lt;/p&gt;&lt;p&gt;別にmaven設定をしなかったら、c:\(ウィンドウユーザパス)\.m2\repository\mysql\mysql-connector-java\5.1.41にあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=390&quot; data-filename=&quot;010.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;/p&gt;&lt;p&gt;コネクション連結が終わったらplatformをeclipse 2.5.xに設定してtypeをdisable library configurationを設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=398&quot; data-filename=&quot;011.png&quot; style=&quot;width: 785px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして連結確認をした後にfinishボタンを押下するとsrc\meta-inf\persistence.xmlが生成されています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaプロジェクトでデータベースを連結して使うためにデータベースに優先テーブルを作成して連結しましょう。&lt;/p&gt;&lt;p&gt;次は「persistence.xml」で戻ってコネクション情報を入力します。&lt;/p&gt;&lt;p&gt;persistence.xml設定を終わったらentityクラスを作りましょう。&lt;/p&gt;&lt;p&gt;entityクラスとはテーブルのデータを格納するためのデータクラスです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=397&quot; data-filename=&quot;012.png&quot; style=&quot;width: 723px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=396&quot; data-filename=&quot;013.png&quot; style=&quot;width: 551px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=386&quot; data-filename=&quot;014.png&quot; style=&quot;width: 482px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データベースのテーブルがclassで作成されました。これから実際データベースからデータを取得しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1561&quot; data-filename=&quot;101.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで基本「jpa」設定が完了しました。データベースからデータを取得してコンソールに出力することまで確認しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで基本jpa設定は完了しましたが、実際のプロジェクトに使うようには様々な設定が必要です。具体的な設定する方法は次の投稿で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjpaを設定する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/85.html</guid><pubDate>Fri, 11 Jun 2021 10:14:12 +0900</pubDate></item><item><title>[Java] 44. Web Spring frameworkのviewで使うプログラム言語(JSTL) - XML</title><link>https://www.nowonbun.com/84.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はweb spring frameworkのviewで使うプログラム言語(jstl) - xmlに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でjstl言語のコアー、フォーマット、関数、データベースに関して説明しました。&lt;/p&gt;&lt;p&gt;xml処理はhtmlファイルから別のxmlファイルのデータを抽出して使うライブラリです。&lt;/p&gt;&lt;p&gt;最近はajaxでjsonタイプのデータを通信する方法をよく使うし、そのことに関してライブラリも多いし、使い方も使いやすいのでこのxmlライブラリをよく使いません。&lt;/p&gt;&lt;p&gt;しかし地域化(localization)やメッセージのデータを取得するために使うこともあるので知ってる方がよいです。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;xmlライブラリ&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;まず、xmlライブラリを使うためにはpom.xmlにライブラリを追加しなければならないです。&lt;/p&gt;&lt;p&gt;まず、xmlファイルの一つを生成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 564px;&quot; src=&quot;./getattachfile.ajax?idx=1558&quot; data-filename=&quot;101.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでこのxmlファイルのパスはウェブブラウザ状態のパスではなく、サーバ側のディレクトリパスです。&lt;/p&gt;&lt;p&gt;なぜならviewのファイルはサーバ側でcontrollerのデータとviewのjstl言語のファイルのデータを結合して最終のhtmlをブラウザに応答することです。なのでjstlはブラウザ側のパスではなく、サーバ側のパスを考えて作成しなければならないです。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;xmlパーシングと出力 &amp;lt;x:parse /&amp;gt;, &amp;lt;x:out /&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=379&quot; data-filename=&quot;001.png&quot; style=&quot;width: 445px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;xmlデータの繰り返し &amp;lt;x:foreach /&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=380&quot; data-filename=&quot;002.png&quot; style=&quot;width: 479px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;xmlデータを変数に置換 &amp;lt;x:set /&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=379&quot; data-filename=&quot;001.png&quot; style=&quot;width: 445px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;xmlデータの分岐文 &amp;lt;x:if /&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 385px;&quot; src=&quot;./getattachfile.ajax?idx=1559&quot; data-filename=&quot;102.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;xmlデータの分岐文 &amp;lt;x:choise /&amp;gt;, &amp;lt;x:when /&amp;gt;, &amp;lt;x:otherwise /&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 385px;&quot; src=&quot;./getattachfile.ajax?idx=1559&quot; data-filename=&quot;102.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;xslファイルと結合 &amp;lt;x:transform /&amp;gt;, &amp;lt;x:param /&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;xslファイルとはxmlスタイルシートファイルだと思えばよいです。(extensible stylesheet language)&lt;/p&gt;&lt;p&gt;つまり、xml構造とxslファイルを結合して一つのhtmlファイルを作ることです。&lt;/p&gt;&lt;p&gt;cssを使ったらxml構造とxslファイルを結合するとスタイルシートを作る必要がなくみえます。&lt;/p&gt;&lt;p&gt;しかしcssは構造的な定義までは定義することが大変です。同じ構造的なスタイルでデータ別にページを繰り返して作る形なら良いと思います。例えばブログみたいにデータだけ異なって同じ形式のページを大量に生産する時に良いです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img style=&quot;width: 848px;&quot; src=&quot;./getattachfile.ajax?idx=1560&quot; data-filename=&quot;103.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;普通の管理用のウェブサービスにはxmlをパーシングして使う場合はないと思います。&lt;/p&gt;&lt;p&gt;でも、ブログや不特定な多数に掲示するウェブプログラムなら固定になった構造によりデータだけ変わって掲示することになります。&lt;/p&gt;&lt;p&gt;そしてjavascriptの非同期処理でデータを取得、設定することになるとグーグルボットには認識されてないので、googleなどで検索エンジンには内容を認識しなく、検索結果には出ない可能性もあります。&lt;/p&gt;&lt;p&gt;その時にはこのxmlパーシング形式で作成するほうが良いと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでweb spring frameworkのviewで使うプログラム言語(jstl) - xmlに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/84.html</guid><pubDate>Thu, 10 Jun 2021 15:12:52 +0900</pubDate></item><item><title>[Design pattern] 1-1. シングルトンパターン(Singleton pattern)</title><link>https://www.nowonbun.com/257.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンのシングルトンパターン(singleton pattern)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;シングルトンパターンはデザインパターンの中で一番有名なパターンです。デザインパターンを聞いたことがなくてもシングルトンパターン(singleton pattern)を聞いたことがあるほど有名なパターンです。&lt;/p&gt;&lt;p&gt;シングルトンパターンはクラスのインスタンスをプログラム実行中で一回だけ生成して続けて再使用するパターンです。利点ではクラスのデータを変わらずにずっと使うかすべてのオブジェクトからデータを共有しなければならない状況で使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c/c++例から確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1555&quot; data-filename=&quot;001.png&quot; style=&quot;width: 215px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;シングルトンの特性はコンストラクタをprivateに設定することが重要です。コンストラクタをprivateに設定するとクラス外部からインスタンス生成をできません。&lt;/p&gt;&lt;p&gt;そしてクラスのインスタンスはプログラムが終了する時まで保持しなければならないので、staticで宣言してクラス内部で管理します。&lt;/p&gt;&lt;p&gt;また、static関数(getinstance())でクラスのインスタンスを生成してsingleton変数に管理すればインスタンスを一回生成して再使用するシングルトンが作られます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみればnode1とnode2のメモリアドレスが同じです。&lt;/p&gt;&lt;p&gt;つまり、node::getinstance()でインスタンスを取得すれば同じクラスが返却します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1554&quot; data-filename=&quot;002.png&quot; style=&quot;width: 184px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaのシングルトンパターンもコンストラクタをprivateに設定してクラスインスタンスをもっている変数をprivate staticで宣言します。&lt;/p&gt;&lt;p&gt;つまり、プログラムが終了する時まで変数のインスタンスが保持されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaのhashcodeを出力値をみれば同じ値が出力することを確認できます。&lt;/p&gt;&lt;p&gt;つまり、同じクラスという意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1557&quot; data-filename=&quot;003.png&quot; style=&quot;width: 207px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#にもコンストラクタをprivateに設定してgetinstance()関数を利用してインスタンスを取得します。&lt;/p&gt;&lt;p&gt;結果も同じhashcodeが出力することで同じクラスインスタンスということを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;シングルトンパターンは普通リソースを扱うクラスでよく使います。&lt;/p&gt;&lt;p&gt;例えば、file ioや通信socketクラスと共に使います。&lt;/p&gt;&lt;p&gt;なぜなら一つのfileを読み込んで書き込むクラスを様々なインスタンスで生成して接続すればconnection errorが発生します。&lt;/p&gt;&lt;p&gt;ログシステムがその例です。ログクラスを様々なインスタンス生成してファイル書き込むすればエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1556&quot; style=&quot;width: 848px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一つのクラスですが、各のインスタンスを生成するとioexceptionが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ソケットも一つのインスタンスでportを開いて待機中ですが、別のインスタンスで接続すればport使用中というエラーが発生します。&lt;/p&gt;&lt;p&gt;その状況を解けるために一つのインスタンスを保持しなければならないですが、その時にシングルトンパターンを使うと良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンのシングルトンパターン(singleton pattern)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/257.html</guid><pubDate>Wed, 9 Jun 2021 19:41:09 +0900</pubDate></item><item><title>[Java] 43. Web Spring frameworkのviewで使うプログラム言語(JSTL) - 関数、データベース</title><link>https://www.nowonbun.com/83.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はweb spring frameworkのviewで使うプログラム言語(jstl) - 関数、データベースに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でjstl言語のコア―とフォーマットライブラリに関して説明しました。&lt;/p&gt;&lt;p&gt;コア―はjstlの言語でよく使うライブラリだし、フォーマットも最近momentのjavascriptライブラリがあって前よりよく使わないですが、よく使うライブラリの一つです。&lt;/p&gt;&lt;p&gt;ここで使う関数ライブラリは文字の関するライブラリですが、普通は文字処理に関してはjspファイルで処理することよりサーバ側、controller側に処理した後、結果だけ出力することが普通です。&lt;/p&gt;&lt;p&gt;もちろん、データベースライブラリもjspファイルで処理することよりcontroller側で処理することが普通です。&lt;/p&gt;&lt;p&gt;つまり、最近はよく使うライブラリではないですが、以前にはよく使うライブラリだったし、仕様によって使われる可能性があるので簡単に説明します。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;関数ライブラリ&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;コア―とフォーマットライブラリはjstlをタグタイプに使いました。でも、関数ライブラリは値を表す方式がドルマークと中括弧(${データ})形式に使います。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;文字含め可否 fn:contains(string, sbustring)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=362&quot; data-filename=&quot;001.png&quot; style=&quot;width: 428px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;文字含め可否(大小文字無視) fn:containsignorecase(string, sbustring)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=362&quot; data-filename=&quot;001.png&quot; style=&quot;width: 428px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;文字列がprefixで始まる可否 fn:startswith(string, prefix)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=362&quot; data-filename=&quot;001.png&quot; style=&quot;width: 428px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;文字列がsuffixで終わる可否 fn:endswith(string, suffix)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=362&quot; data-filename=&quot;001.png&quot; style=&quot;width: 428px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;特殊文字(&amp;lt;, &amp;gt;, &amp;amp;, &apos;, &quot;)をxmlエンティティコード(&amp;amp;lt;, &amp;amp;gt;, &amp;amp;, &amp;amp;#039, &amp;amp;#034)に変換 fn:escapexml(string)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1553&quot; data-filename=&quot;101.png&quot; style=&quot;width: 327px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1552&quot; data-filename=&quot;102.png&quot; style=&quot;width: 401px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;一致する文字列のインデックス fn:indexof(string, sbustring)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=372&quot; data-filename=&quot;004.png&quot; style=&quot;width: 387px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;文字列をseparatorの文字によって配列に分離 fn:split(string, separator)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=377&quot; data-filename=&quot;005.png&quot; style=&quot;width: 418px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;配列をseparatorの文字で結合 fn:join(array, separator)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=378&quot; data-filename=&quot;006.png&quot; style=&quot;width: 408px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;文字列の長さを返却 fn:length(string)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=368&quot; data-filename=&quot;007.png&quot; style=&quot;width: 454px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;string文字列内でbefore文字列をafter文字列に変換 fn:replace(string, before, after)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=367&quot; data-filename=&quot;008.png&quot; style=&quot;width: 426px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;string文字列をbeforeからafterまで切り fn:substring(string, before, after)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=373&quot; data-filename=&quot;009.png&quot; style=&quot;width: 381px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;string文字列のsbustring以降の文字を返却 fn:substringafter(string, sbustring)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=365&quot; data-filename=&quot;010.png&quot; style=&quot;width: 432px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;string文字列のsbustring以前の文字を返却 fn:substringbefore(string, sbustring)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=364&quot; data-filename=&quot;011.png&quot; style=&quot;width: 376px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;文字列を小文字に変換 fn:tolowercase(string)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=374&quot; data-filename=&quot;012.png&quot; style=&quot;width: 402px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;文字列を大文字に変換 fn:touppercase(string)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=369&quot; data-filename=&quot;013.png&quot; style=&quot;width: 464px;&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;文字列の前後の空白を取り除く fn:trim(string)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=376&quot; data-filename=&quot;014.png&quot; style=&quot;width: 423px;&quot;&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;データベースライブラリ&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;普通、データベースの接続はjspファイルですることではなく、controllerのjavaのクラスファイルで接続してデータを処理します。そしてviewで出力する形が基本です。つまり、このデータベースライブラリは実はほぼ使わないライブラリです。&lt;/p&gt;&lt;p&gt;でも、地域化(localization)やメッセージデータを取得するためにたまに処理する場合もあるので分かった方がよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jstlでデータベースを使うために一応db connectorが必要です。&lt;/p&gt;&lt;p&gt;私はmysqlで例を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=371&quot; data-filename=&quot;016.png&quot; style=&quot;width: 240px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=375&quot; data-filename=&quot;017.png&quot; style=&quot;width: 501px;&quot;&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;次の投稿ではjstlのxmlライブラリを整理します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでweb spring frameworkのviewで使うプログラム言語(jstl) - 関数、データベースに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/83.html</guid><pubDate>Wed, 9 Jun 2021 16:38:02 +0900</pubDate></item><item><title>[Design Pattern] デザインパターンの紹介</title><link>https://www.nowonbun.com/256.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;この投稿はデザインパターンの紹介に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;デザインパターンとは英語でdesignですが、我々が考える画面デザインという意味ではなく、設計の意味です。つまり、設計パターンということです。&lt;/p&gt;&lt;p&gt;始めにこのデザインパターンを提案する人はgofと呼ばれる四人のパソコン科学者です。私のけ願書で勉強したことではなく、翻訳書や解説書で勉強したのでgofに関して詳しく説明ができません。&lt;/p&gt;&lt;p&gt;とにかく、その四人がプログラムコードを作成する方法でどうすれば効率的なコードパターンを設計できるか、実際の業務からプログラムに作成する時に綺麗に解析できるパターンを纏めておいたことです。&lt;/p&gt;&lt;p&gt;でも、今はこのデザインパターンは効率的な設計パターンとしても重要ですが、開発者(デベロッパー)の間の暗黙的なコードルールもあります。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;例として私の経験を話します。&lt;/p&gt;&lt;p&gt;私が大学校を通う時、つまり役10年前にはデザインパターンを軽く勉強したことがあります。&lt;/p&gt;&lt;p&gt;その時にはオブジェクト指向プログラミング(oop)を完全に理解できない状況で勉強しようと思ったので理解もよくできませんでした。また、先輩からもデザインパターンはプログラムを勉強することで邪魔だと聞いたことがあるので重要だと思っていませんでした。&lt;/p&gt;&lt;p&gt;その状況で卒業して実務経験で3~4年の時に実力が停滞期が来ました。その時に設計実力も伸びないし勉強しても、毎回の基礎研究に大変でした。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;それで始まったことはopen source projectに参加することでした。オープンソースプロジェクトに参加してショックをたくさん貰いました。その時にプログラム開発に関して自身もあったし勉強も十分だと思いましたが、オープンソースが全然理解できませんでした。&lt;/p&gt;&lt;p&gt;同然、理解ができないから参加も上手くできないし、時々に理解できる部分があって修正して要請(request)してもいつも断り(decline)でした。個人的にすごくスランプが来た時でした。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;その状況でいつも断り(decline)だけ貰って、勇気を出してなぜ断り(decline)ですかと聞きました。返事はコーディング規約も合わないし、パターン式で解決しなければならないので、単純コーディングアルゴリズムで解決しようとするから他のバグが発生する可能があると答えを貰いました。&lt;/p&gt;&lt;p&gt;今、考えてもすごくショックですが、その後からプログラムプロジェクト工程や設計テクニック、標準規約などがなぜ重要かを分かることになりました。考えたら私にはもう一つの跳躍をすることができる機会になったような気もします。(今はプロジェクトでコーディング実力は10%で工程と設計がすごく重要だと思います。)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;その後に様々なデザインパターンや規約に関して勉強するし工程に関しても考えたことになりました。いつからかプロジェクトでコーディングより設計テクニックがどのほど重要か分かることになりました。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;デザインパターンに話したら様々な解析本では設計的な問題を解決する方法だと説明します。もちろん、間違い話ではありません。同然、当たり前の話です。でも、私の考えは様々なソースの解析をしやすくする(可読性)ための設計的な約束(規約)だと思います。&lt;/p&gt;&lt;p&gt;設計的な問題はデザインパターンによらなくても解決する方法は多いです。でも、自分だけの方法や設計で修正するとその設計の意味や理由に関して自分以外は分からなくなります。つまり、そのソースを他人がみると一日にデバッグしなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;最近はプロジェクトを設計する時に様々なオープンソースを使うし、オープンソースも仕様によって修正する時もあります。&lt;/p&gt;&lt;p&gt;オープンソースはデザインパターンに合わせて設計されているので、デザインパターンをよく知っているならデバッグなしでソースだけでプログラムを解析することができます。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;以前、どの本で読んだかは忘れましたが、よく設計するし作ったプログラムはコメントやドキュメントが要りません。コード自体が仕様書ので、ドキュメントですが、またコメントを付ける理由があるかという文言を読みました。&lt;/p&gt;&lt;p&gt;私がプロジェクトをする時にいつも考えている文言です。よく作ったプログラムはコメントやドキュメントがいらないという意味はデザインパターンや規約とおりに作成したという意味です。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;デザインパターンを理解することになるとオープンソースを読めることになります。いつか私がデザインパターンを少し理解した時にjavaのspringフレームワークのソースを見たことがあります。その時にソースだけでプログラム仕様が読めました。&lt;/p&gt;&lt;p&gt;つまり、デバッグをしなくてもフレームワークがどのように動くかどのように使ったらよいかを分かることになったことです。なので、オープンソースフレームワーク本を見る必要がありませんでした。例えば、spring framework本です。&lt;/p&gt;&lt;p&gt;でも、spring frameworkはすごく大きいなのでよく整理しておいたドキュメントなしですべて解析することは大変ですね。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;デザインパターンにはどのぐらいメソッド命名やクラス命名方法も決めています。例えば、getinstance()ならsingletonパターン、factorybuilder()ならbuilderパターンとfactoryパターンということです。つまり、その関数やクラス名ならソース内部を見なくてもどのロジックかを推測ができます。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;デザインパターンを勉強する時、関連な本をみるとクラスダイアグラムや複雑なソースなどで説明していることが多いですね。例えば、oracleデータベースを使いましたが、mysqlに変更したい。その時にはどのパターンを利用すると効率です。。という説明がある本です。&lt;/p&gt;&lt;p&gt;でも、デザインパターンははっきり決めていることではなく、解析によって、仕様によって、状況によって、プログラム言語やアルゴリズムによっても変わることがあります。&lt;/p&gt;&lt;p&gt;なので、始めに勉強する時には難しかったんでした。その本が悪いということではなく、正しいですが、状況によりパターンが変わるので難しく感じますね。&lt;/p&gt;&lt;p&gt;デザインパターンを正確に理解するためにはオブジェクト指向プログラミングの基礎知識やアルゴリズムを理解しておかなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;私はできれば理解しやすいように説明してみます。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;デザインパターン目次&lt;/p&gt;&lt;p&gt;1. 生成パターン&lt;/p&gt;&lt;p&gt;- インスタンスを生成する（new）の定義です。クラスのインスタンスを生成を制限したり、あるいは簡単に宣言するためのパターンです。実際のプログラムのパフォーマンスに影響を与えるパターンです。&lt;/p&gt;&lt;p&gt;1-1. singletonパターン -&lt;/p&gt;&lt;p&gt;1-2. builderパターン -&lt;/p&gt;&lt;p&gt;1-3. プロトタイプパターン -&lt;/p&gt;&lt;p&gt;1-4. factory methodパターン -&lt;/p&gt;&lt;p&gt;1-5. abstract factoryパターン -&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2.構造パターン&lt;/p&gt;&lt;p&gt;- プログラムのコーディングをする時、どのような形式で作成して読みやすく、あるいはパフォーマンスを上がるような構造のパターンです。&lt;/p&gt;&lt;p&gt;2-1. アダプタパターン -&lt;/p&gt;&lt;p&gt;2-2. 合成パターン -&lt;/p&gt;&lt;p&gt;2-3. ブリッジパターン -&lt;/p&gt;&lt;p&gt;2-4. decoratorパターン -&lt;/p&gt;&lt;p&gt;2-5. ファサードパターン -&lt;/p&gt;&lt;p&gt;2-6. flyweightパターン -&lt;/p&gt;&lt;p&gt;2-7. プロキシパターン -&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3.行為パターン&lt;/p&gt;&lt;p&gt;- プログラム全体のクラス間の形状、設計的なパターン、そしてインスタンスをどのようにが効率的に設計するかのパターンです。&lt;/p&gt;&lt;p&gt;3-1. 責任チェーンパターン -&lt;/p&gt;&lt;p&gt;3-2. コマンドパターン -&lt;/p&gt;&lt;p&gt;3-3. インタプリタパターン -&lt;/p&gt;&lt;p&gt;3-4. 反復子のパターン -&lt;/p&gt;&lt;p&gt;3-5. 調停のパターン -&lt;/p&gt;&lt;p&gt;3-6. メメントパターン -&lt;/p&gt;&lt;p&gt;3-7. observerパターン -&lt;/p&gt;&lt;p&gt;3-8. 状態パターン -&lt;/p&gt;&lt;p&gt;3-9. 戦略パターン -&lt;/p&gt;&lt;p&gt;3-10. テンプレートメソッドパターン -&lt;/p&gt;&lt;p&gt;3-11. 訪問者のパターン -&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ここまでデザインパターンの紹介に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/256.html</guid><pubDate>Tue, 8 Jun 2021 20:42:36 +0900</pubDate></item><item><title>[Java] 42. Web Spring frameworkのviewで使うプログラム言語(JSTL) - コア―、フォーマット</title><link>https://www.nowonbun.com/82.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はweb spring frameworkのviewで使うプログラム言語(jstl) - コア―、フォーマットに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jstlとはjsp standard tag libraryの略語です。jspのウェブページで使うタグタイプのプログラム言語です。この言語はspringフレームワークだけではなく、servlet、struts(ストラッツ)プレームワークでも使えます。&lt;/p&gt;&lt;p&gt;以前、開発者(デベロッパー)とウェブデザイナーの業務が分けて開発する時代にウェブデザイナーさんがプログラム言語に慣れてないし使いにくい時、デザイナー専用言語という話(?)がある時がありました。この話が本当かは知りませんが、確実にjavaプログラム言語より簡単だし使いやすいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてプロジェクト中で作成したプログラム言語と別の概念なのでcontrollerとview、つまりfront-endとback-endが区分されて開発することができます。&lt;/p&gt;&lt;p&gt;この話はプロジェクト工程の話ですが、back-endはデータベースやサーバ環境設定、構成する開発を担当するし、front-endはcssやjavascript言語を使ってプログラムすることの意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、私の場合はそんなに区分して開発したことがありませんね。&lt;/p&gt;&lt;p&gt;開発経歴は少ない時にはウェブデザイナーからウェブデザインのイメージなどを渡って受けたら仕様によりcssに変換、javascriptを作成するし、以降にはajax概念ができて、データ値はjavascriptで処理することにしました。&lt;/p&gt;&lt;p&gt;その後、bootstrapなどで開発者に合わせる画面開発方法や工程概念ができて画面から納品まで開発者(デベロッパー)がすべて担当して作業しました。いつかウェブデザイナーという方がプロジェクトから見たことがないですね。単純な私の経験なので一般的にはありません。&lt;/p&gt;&lt;p&gt;なので最近はプロジェクトを立ち上がって完成するには勉強しなければならないことが多いですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jstlの話に戻ってまず、jstlを使うためにはpom.xmlにライブラリを追加しなければならないです。&lt;/p&gt;&lt;p&gt;そしてjstlライブラリを使うためにはjspファイルの上に宣言して使ったらよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1545&quot; data-filename=&quot;001.png&quot; style=&quot;width: 413px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jstlを使う方法にはライブラリより接頭辞の使い方が違います。&lt;/p&gt;&lt;p&gt;まず、ライブラリの週類は五つあります。一般プログラム言語を処理する変数宣言、出力、簡単な条件文、繰り返しを実行するコア―があり、数字や日付、時間などをフォーマットがあります。&lt;/p&gt;&lt;p&gt;文字列を扱う関数、データベースとxmlを扱うライブラリがあります。&lt;/p&gt;&lt;p&gt;この五つのライブラリは使う接頭辞が違います。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;width:130px;&quot;&gt;ライブラリ&lt;/th&gt;        &lt;th&gt;機能&lt;/th&gt;        &lt;th style=&quot;width:240px;&quot;&gt;uri識別子&lt;/th&gt;        &lt;th style=&quot;width:70px;&quot;&gt;接頭辞&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;コアー&lt;/td&gt;        &lt;td&gt;一般プログラムで提供する制御処理を行うライブラリ&lt;/td&gt;        &lt;td&gt;http://java.sun.com/jsp/jstl/core&lt;/td&gt;        &lt;td&gt;c&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;フォーマッティング&lt;/td&gt;        &lt;td&gt;数字、日付、時間をフォーマティングする機能と国際化、多国語処理するライブラリ&lt;/td&gt;        &lt;td&gt;http://java.sun.com/jsp/jstl/fmt&lt;/td&gt;        &lt;td&gt;fmt&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;関数&lt;/td&gt;        &lt;td&gt;文字列を処理するライブラリ&lt;/td&gt;        &lt;td&gt;http://java.sun.com/jsp/jstl/functions&lt;/td&gt;        &lt;td&gt;fn&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;データベース&lt;/td&gt;        &lt;td&gt;データベースと関連機能を処理するライブラリ&lt;/td&gt;        &lt;td&gt;http://java.sun.com/jsp/jstl/sql&lt;/td&gt;        &lt;td&gt;sql&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;xml処理&lt;/td&gt;        &lt;td&gt;xmlと関連&lt;/td&gt;        &lt;td&gt;http://java.sun.com/jsp/jstl/xml&lt;/td&gt;        &lt;td&gt;x&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;コア―ライブラリ&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;変数宣言と変数削除 &amp;lt;c:set/&amp;gt;, &amp;lt;c:remove/&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;基本的にviewで使う変数はcontrollerの領域で宣言して受け取る構造になりますが、仕様によってjspファイル(view)で変数を宣言して、または変数の再宣言、削除する必要があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1547&quot; style=&quot;width: 339px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;scopeの属性は変数のライフサイクルです。&lt;/p&gt;&lt;p&gt;pageは基本的なライフサイクルでブラウザに要請して応答するまで使う領域です。requestはpageより少し長いライフサイクルで要請、応答してまた要請する時まで保持するサイクル(サーバに受け取るのが可能)です。つまり、次の応答ページには変数の値がなくなります。&lt;/p&gt;&lt;p&gt;sessionの場合はサーバからsession満了するとなくなります。applicationの場合はユーザに関係ず、サーバプログラムが終了する時まで保持します。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;変数出力 &amp;lt;c:out/&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;jstlには変数出力することはドールマークと中括弧を使って出力します。(${変数名})&lt;/p&gt;&lt;p&gt;でも、この変数の値にエスケープ文字が含めているとタグに認識されエラーになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1548&quot; style=&quot;width: 623px;&quot; data-filename=&quot;012.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば&amp;lt;&amp;gt;変換されなくてそのままにタグとして認識されます。&lt;/p&gt;&lt;p&gt;でも、普通はエスケープ変換して出力しなければならないです。または値がnullの場合は基本値を処理する場合もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1546&quot; data-filename=&quot;004.png&quot; style=&quot;width: 341px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;escapexmlの属性にtrueにするとエスケープを変換してブラウザに表示されるようにします。設定しなければfalseになり、エスケープを変換をしません。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;分岐文タグ &amp;lt;c:if/&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;jstlは基本的にプログラム言語なので分岐文と繰り返し文があります。&lt;/p&gt;&lt;p&gt;c:ifは分岐文で当該な条件式に真(true)の場合に、タグの中のタグが表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1542&quot; data-filename=&quot;005.png&quot; style=&quot;width: 391px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでscope属性は&amp;lt;c:set/&amp;gt;で使った属性と同じ意味です。&lt;/p&gt;&lt;p&gt;そしてtest属性で使ったeq比較表現式でempty、eq、neがあります。&lt;/p&gt;&lt;p&gt;emptyは変数が空いているかどうかを確認するし、eq(==)は同じ値なら真、ne(!=)は違う値なら真になります。&lt;/p&gt;&lt;p&gt;そして文字演算子だけではなく、比較演算子(&amp;lt;,&amp;gt;)と論理演算子(||,&amp;amp;&amp;amp;,!)なども使えます。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;分岐文タグ &amp;lt;c:choose/&amp;gt;、&amp;lt;c:when/&amp;gt;、&amp;lt;c:otherwise/&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;javaの分岐文の種類はifとif~elseがあります。jstlはif分岐タグはありますが、if~else分岐タグはありません。&lt;/p&gt;&lt;p&gt;代わりにswitchは似ている&amp;lt;c:choose/&amp;gt;、&amp;lt;c:when/&amp;gt;、&amp;lt;c:otherwise/&amp;gt;分岐があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1543&quot; data-filename=&quot;006.png&quot; style=&quot;width: 357px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでc:chooseタグはjavaのswitchと同じなり、whenはjavaのcase、otherwiseはjavaのdefaultと同じ意味です。&lt;/p&gt;&lt;p&gt;結果は0なのでzeroのタグが画面に表示されました。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;繰り返し文&amp;lt;c:foreach/&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;分岐文があれば繰り返し文があります。繰り返し文は必須属性があります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th&gt;属性メソッド&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;current&lt;/td&gt;        &lt;td&gt;現在値&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;index&lt;/td&gt;        &lt;td&gt;ゼロ基盤(zero-based)インデックス値&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;count&lt;/td&gt;        &lt;td&gt;1基盤(one-based)インデックス値&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;first&lt;/td&gt;        &lt;td&gt;最初値可否&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;last&lt;/td&gt;        &lt;td&gt;最後値可否&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;begin&lt;/td&gt;        &lt;td&gt;開始値&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;end&lt;/td&gt;        &lt;td&gt;終了値&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;step&lt;/td&gt;        &lt;td&gt;増加値&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1541&quot; data-filename=&quot;007.png&quot; style=&quot;width: 389px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;繰り返しタグ &amp;lt;c:fortokens/&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;繰り返し文タグ&amp;lt;c:foreach/&amp;gt;と似ている属性種類を使いますが、itemsに条件データを置いてdelimsで区分(split)をしてiteraterパターン形式で繰り返します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1544&quot; data-filename=&quot;008.png&quot; style=&quot;width: 580px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;フォーマットライブラリ&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;フォーマットは整数や実数の桁数を含め文字に変換、あるいは文字を整数や実数に表現すること、そして日付と時間を文字に表現するタグです。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;&amp;lt;fmt:formatnumber&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;数字を文字に変換するフォーマットタグです。&lt;/p&gt;&lt;p&gt;typeの属性でnumberは文字を数字を表現、currencyはお金形式に表現、percentはパーセント形式に表現します。patternはその以外のパータンを設定することだし、varは変数設定です。&lt;/p&gt;&lt;p&gt;scope属性は&amp;lt;c:set/&amp;gt;で使った属性と同じ意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1549&quot; style=&quot;width: 349px;&quot; data-filename=&quot;009.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;値はタグの中で値を設定することもできるし、valueの属性を利用することもできます。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;&amp;lt;fmt:parsenumber/&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;文字を数字に表現するタグです。&lt;/p&gt;&lt;p&gt;タグ属性は&amp;lt;fmt:formatnumber&amp;gt;と同じです。integeronly属性がtrueの場合、値が実数の時に小数点を切り、整数だけ表現します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1550&quot; data-filename=&quot;010.png&quot; style=&quot;width: 400px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;&amp;lt;fmt:formatdate/&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;変数にjavaのdateクラスの値が設定されている場合、フォーマットによって画面に表示することができます。&lt;/p&gt;&lt;p&gt;datestyleとtimestyleはフォーマットスタイルの中さを設定してパターンはyyyy/mm/ddみたいにユーザがパータンを設定することができます。&lt;/p&gt;&lt;p&gt;timezoneは接続地域を設定することができます。varは変数の設定でscope属性は&amp;lt;c:set/&amp;gt;で使った属性と同じ意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1551&quot; style=&quot;width: 436px;&quot; data-filename=&quot;014.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;次の投稿でjstlの関数ライブラリとデータベースライブラリを整理します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでweb spring frameworkのviewで使うプログラム言語(jstl) - コア―、フォーマットに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/82.html</guid><pubDate>Mon, 7 Jun 2021 18:44:10 +0900</pubDate></item><item><title>[Java] 41. Web Spring webframeworkのControllerからajaxの要請する時、jsonタイプのデータを返却する方法</title><link>https://www.nowonbun.com/81.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はweb spring webframeworkのcontrollerからajaxの要請する時、jsonタイプのデータを返却する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でweb spring frameworkのcontrollerを扱う方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/80.html&quot; target=&quot;_blank&quot;&gt;[java] 40. web spring frameworkでcontrollerを扱う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;controllerとはウェブブラウザから要請すると実行する関数を探して実行します。その後、ウェブブラウザに応答する役割までします。&lt;/p&gt;&lt;p&gt;しかし、ここでcontrollerメソッドは基本的にstring値をリターンすることになっています。このstringタイプはviewファイル名を探すために作成することになっています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、我々がajaxでウェブページのhtmlのデータを受け取る場合もありますが、普通はjsonタイプでデータを受け取る方法が普通ですね。&lt;/p&gt;&lt;p&gt;そうしたら、viewのhtmlファイルをマッピングすればだめですね。逆にリターン値でデータ値を格納して受け取る必要があります。サーブレットみたいですね。&lt;/p&gt;&lt;p&gt;リターン値をnullや文字がないstringタイプでリターンしてパラメータのhttpservletresponseのgetwriterの関数は使うことはどうでしょう。可能です。&lt;/p&gt;&lt;p&gt;でも、そうことにしたらspring frameworkでサーブレット文法を使う気がしますね。&lt;/p&gt;&lt;p&gt;それならもっとspringらしいな作成する方法に関して説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前私がspring環境を設定する時、mvc-config.xmlで設定していることに説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/79.html&quot; target=&quot;_blank&quot;&gt;[java] 39. spring web frameworkを利用してウェブサービスプロジェクトを作成する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでajaxのための設定を追加しましょう。&lt;/p&gt;&lt;p&gt;先にmvc-ajax-config.xmlを追加します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=347&quot; data-filename=&quot;001.png&quot; style=&quot;width: 484px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のxml設定ファイルをweb.xmlに設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=351&quot; data-filename=&quot;003.png&quot; style=&quot;width: 825px;&quot;&gt;&lt;/p&gt;&lt;p&gt;以前のコントローラーパッケージはcontrollerだったですが、ajaxコントローラーパッケージはcontroller.ajaxです。&lt;/p&gt;&lt;p&gt;contoller.ajaxパッケージ中でクラスを生成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=353&quot; data-filename=&quot;004.png&quot; style=&quot;width: 480px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ここのポイントは@responsebodyのアトリビュートです。@responsebodyを設定するとviewを探索しなく、返却値を応答します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前のindex.jspを少し修正して確認しましょう。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1540&quot; data-filename=&quot;011.png&quot; style=&quot;width: 636px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみればtest.jsonで要請して、jsonデータを受信してブラウザに処理した結果を表示します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々が非同期ajaxで必ずjsonタイプを受け取ることではありません。xmlタイプで受け取ることもあるし、byteデータやbase64タイプで受け取る時もあります。&lt;/p&gt;&lt;p&gt;しかし、上の設定のmvc-ajax-config.xmlでcontext-typeをapplication/jsonに設定してしまいました。&lt;/p&gt;&lt;p&gt;そうするとxmlで設定したので他のタイプは別の設定をして設定することしかないかと思いますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的に我々は呼び出す関数の返却タイプはstringタイプに設定しました。&lt;/p&gt;&lt;p&gt;それをみると我々はstringタイプではなく、byte[]タイプに返却する時もあるし、context-typeによってjsonタイプではなく、octet-streamタイプやxmlタイプにも返却することもあります。&lt;/p&gt;&lt;p&gt;こんな設定をresponseentityクラスを利用して返却タイプを設定することができます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1539&quot; data-filename=&quot;012.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果はtest.jsonを二回に要請しました。&lt;/p&gt;&lt;p&gt;その中で一つはapplication/xmlタイプに要請して、応答もapplication/xmlタイプで受け取りました。当然、結果もxmlタイプに受け取りましたのでdataの結果が画面に表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでweb spring webframeworkのcontrollerからajaxの要請する時、jsonタイプのデータを返却する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/81.html</guid><pubDate>Fri, 4 Jun 2021 17:41:15 +0900</pubDate></item><item><title>[Java] 40. Web Spring frameworkでControllerを扱う方法</title><link>https://www.nowonbun.com/80.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はweb spring frameworkでcontrollerを扱う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でウェブサービスをspring frameworkを利用して構築する方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/79.html&quot; target=&quot;_blank&quot;&gt;[java] 39. spring web frameworkを利用してウェブサービスプロジェクトを作成する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;controllerとはクライアント(browser)から要請があればホストを取り除いたアドレス値をパーシングして当該なメソッドを呼び出す機能です。&lt;/p&gt;&lt;p&gt;このアドレス値でパーシングしてメソッドを呼び出す時に一番やりやすい方法は各のページで呼び出す方法をあり、よく使いますが、その以外には複数ページや正規表現の方法で呼び出す方法もあります。または呼び出すヘッダーの情報やパラメータの値によって呼び出す方法もあります。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;@requestmapping&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;@requestmappingとはウェブから要請されたらアドレス値によって探索が可能にするアトリビュートです。このアトリビュートはクラスとメソッドに使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1534&quot; data-filename=&quot;001.png&quot; style=&quot;width: 421px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば「/home/index.html」を呼び出したらindex関数が実行されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;requestmappingは一つのページをマッピングすることではなく、複数のアドレスを一つの関数に呼び出すことができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1532&quot; data-filename=&quot;002.png&quot; style=&quot;width: 457px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;単純にアドレスを指定することより正規表現式によりマッピングすることも可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1536&quot; data-filename=&quot;003.png&quot; style=&quot;width: 416px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;呼び出すメソッドタイプによりマッピングすることもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1536&quot; data-filename=&quot;003.png&quot; style=&quot;width: 416px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その以外にもパラメータ、ヘッダーの値により関数探索が可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1538&quot; data-filename=&quot;004.png&quot; style=&quot;width: 636px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;仕様により区分して細かく使うことができますが、普通はそんなに細かく分けて設定しないです。細かく使くなったら逆に可読性が悪くなるし、プログラムだけ複雑になります。&lt;/p&gt;&lt;p&gt;私もvalueとmethodの以外は使ったことがありません。&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;modelmap&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;springでマッピング関数を作成する時にパラメータがなくても構いません。マッピングは@requestmappingで区分されるからです。&lt;/p&gt;&lt;p&gt;でも、ブラウザにパラメータ値を受け取る時や様々なセッション情報、要請値(request)、応答値(response)を使う時があります。&lt;/p&gt;&lt;p&gt;そのため、基本的にmodelmap modelmap, httpsession session, httpservletrequest req, httpservletresponse resを使います。&lt;/p&gt;&lt;p&gt;httpsessionはセッション情報、httpservletrequestは要請値、httpservletresponseは応答値があります。この部分はservletと同じです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでmodelmapの場合はviewにデータを渡す時に使います。リターンのstringタイプのデータはviewのファイル名をマッピングするしreqやresの値では値を渡すことができないからです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1534&quot; data-filename=&quot;001.png&quot; style=&quot;width: 421px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はindex関数でリターンの値をindexに設定したのでview/index.jspをマッピングします。&lt;/p&gt;&lt;p&gt;index.jspファイルの中でjstl言語にdata値を表示することになっています。index関数の中でmodelmapを利用してdata値を設定します。&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;@requestparam&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;我々がクライアント(browser)からデータを受け取る時があります。&lt;/p&gt;&lt;p&gt;get方式ならurlアドレスから?マークに区分して設定するquerystring値により伝えるし、post方式はform値をsubmitしてプロトコールヘッダーに値を渡す方法があります。&lt;/p&gt;&lt;p&gt;springでデータを受け取る方法ではパラメータに@requestparamを利用してパラメータを取得することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1537&quot; data-filename=&quot;005.png&quot; style=&quot;width: 555px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、私はこの方法をお勧めしていません。なぜならdataの値がnullになるとエラーになるからです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1535&quot; data-filename=&quot;006.png&quot; style=&quot;width: 527px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;servletに使うhttpservletrequest変数を通ってgetparameter関数を利用したらパラメータがnullでも関数が呼び出せます。その後で別に関数の中でnull処理したら良いです。&lt;/p&gt;&lt;p&gt;でも、クライアント(browser)から渡すデータ値が多い場合、getparameter関数ですべて処理することはソースのステップが多くなると思います。&lt;/p&gt;&lt;p&gt;それで私の場合はmodelattributeのアトリビュートを利用してクラスタイプでデータを受け取ります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1533&quot; data-filename=&quot;007.png&quot; style=&quot;width: 479px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の処理はdataのパラメータの場合はデータ値があるのでそのまま表示されましたが、data1のパラメータの場合は設定してないのでnullが表示されますね。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;ここまでクライアント(browser)から呼び出したらcontrollerから処理してviewをパーシングして最終結果を応答します。&lt;/p&gt;&lt;p&gt;でも、ウェブサービスの中でウェブページを要請すると当然ページをリターンするが、ajaxの場合はどのように処理するでしょう？&lt;/p&gt;&lt;p&gt;ajaxはウェブページが必要なことではなく、controllerで処理した値をjsonやデータ構造に変換しなければならないです。&lt;/p&gt;&lt;p&gt;次の投稿ではspring frameworkでajaxを処理する方法に関して説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでweb spring frameworkでcontrollerを扱う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/80.html</guid><pubDate>Thu, 3 Jun 2021 17:09:28 +0900</pubDate></item><item><title>[Java] 39. Spring Web Frameworkを利用してウェブサービスプロジェクトを作成する方法</title><link>https://www.nowonbun.com/79.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はspring web frameworkを利用してウェブサービスプロジェクトを作成する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でjavaのservletを利用してウェブサービスを構築する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/78.html&quot; target=&quot;_blank&quot;&gt;[java] 38. javaでウェブサービスプロジェクト(jsp servlet)を作成する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jsp servletというのはjavaの言語でウェブサービスを構築するようにするフラットフォームだと思います。&lt;/p&gt;&lt;p&gt;つまり、サーバとクライアント(browser)の間のhttpプロトコールを利用してソケット通信するウェブサービスを別途で構築する必要がなしでservletを利用して簡単に通信環境を作られるようなフラットフォームです。&lt;/p&gt;&lt;p&gt;ライブラリとフラットフォームの差異はライブラリはさまざまな規約とapiを使うためにクラスや関数を作成しておいたものだし、フラットフォームはどの環境を使うために先に構築しておいた環境です。そのため、servletはフラットフォームという意味にもっと近いと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このservletはウェブサービスを使うための先に構築された環境だと思います。しかし、そのservletは使うためにはとても不親切です。&lt;/p&gt;&lt;p&gt;例えば、ブラウザから要請を受け取ってservletでリターンするとhtmlデータをすべてstringタイプに変換しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1529&quot; style=&quot;width: 437px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1531&quot; style=&quot;width: 848px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば、doget関数のreponse値にhtmlタグをstringタイプに格納します。簡単なhtml値でもステップ数が結構ありますね。&lt;/p&gt;&lt;p&gt;それならもっと複雑なページを作ると思ったら一つのページでもすごく複雑になると思います。&lt;/p&gt;&lt;p&gt;そうならhtmlファイルに作ってfilestreamで読み込んでstringで変換するなら？&lt;/p&gt;&lt;p&gt;可能です。でも例みたいにパラメータの値やpostデータ値を格納する時はreplace関数で置換しなければならないです。また、データをstringタイプで扱うことなのでcelipseではdebugエラーをチェックしてくれないです。&lt;/p&gt;&lt;p&gt;そのため、servletをそのままに使うことはすごく不便です。また、これを解決するため、毎度frameworkを開発することは開発工数がすごくかかると思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaにはこのことを解決するためのopen frameworkがたくさんありますが、その中でここで紹介することはspring frameworkです。&lt;/p&gt;&lt;p&gt;個人的の考えはたくさんあるframeworkの中でこのspring frameworkがバグも少ないし軽くて使いやすいです。個人的な考えなので人別の差異があると思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;springを使うためにはさまざまなライブラリが必要なので先にmavenを連結したほうが良いです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/73.html&quot; target=&quot;_blank&quot;&gt;[java] 33. オープンライブラリを参照する方法(eclipseからmavenを連結)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先にspring frameworkを使うためにservlet環境から構築しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=327&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 462px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてmaven環境も使いしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=331&quot; data-filename=&quot;002.png&quot; style=&quot;width: 818px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=333&quot; data-filename=&quot;003.jpg&quot; style=&quot;width: 607px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてpom.xmlでspring frameworkと関係があるライブラリを連結しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=337&quot; data-filename=&quot;004.jpg&quot; style=&quot;width: 565px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ライブラリをダウンロードしてアップデートしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=338&quot; data-filename=&quot;005.png&quot; style=&quot;width: 817px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ウェブ環境を設定するファイルはweb.xmlですが、springフレームワークを設定するファイルはmvc-config.xmlです。&lt;/p&gt;&lt;p&gt;webcontent -&amp;gt; web-infフィルダー中でmvc-config.xmlを生成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1530&quot; data-filename=&quot;003.png&quot; style=&quot;width: 485px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=335&quot; data-filename=&quot;006.jpg&quot; style=&quot;width: 780px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてウェブ環境のweb.xmlファイルでmvc-config.xmlを連結しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=336&quot; data-filename=&quot;007.jpg&quot; style=&quot;width: 739px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ここまでspring framework環境の設定でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからブラウザからウェブサーバに要請するとhtmlにパーシングするクラスを設定しましょう。&lt;/p&gt;&lt;p&gt;mvc-config.xmlでパーシングクラスパッケージを「controller」に設定しましたので、パッケージがcontrollerのクラスを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=330&quot; data-filename=&quot;008.jpg&quot; style=&quot;width: 275px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=332&quot; data-filename=&quot;009.jpg&quot; style=&quot;width: 770px;&quot;&gt;&lt;/p&gt;&lt;p&gt;controllerクラスで重要なことは@controllerを入れることです。そうするとspring frameworkでパーシングクラスに認識します。&lt;/p&gt;&lt;p&gt;そしてブラウザから要請すると呼び出す関数を作成して@requestmappingアトリビュートで要請ページを設定します。&lt;/p&gt;&lt;p&gt;上のソースの場合は/index.htmlで要請するとindex関数が呼び出せます。参考にルートの場合はindex.htmlファイルが要請することに設定しましたので、ルートパスがindex関数を呼び出します。&lt;/p&gt;&lt;p&gt;modelmapにキーでデータを格納するとviewで使えます。&lt;/p&gt;&lt;p&gt;returnの値はstringですが、viewファイル名を指定します。私はindexで設定しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=334&quot; data-filename=&quot;010.jpg&quot; style=&quot;width: 277px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=329&quot; data-filename=&quot;011.jpg&quot; style=&quot;width: 591px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ここまで起動するための作成が完了しました。私の予想は昨日すればブラウザでhello worldが見えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=328&quot; data-filename=&quot;012.jpg&quot; style=&quot;width: 619px;&quot;&gt;&lt;/p&gt;&lt;p&gt;hello worldがブラウザに表示することを確認しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;spring frameworkの処理順番を要約すると下記通りになります。&lt;/p&gt;&lt;p&gt;1. ブラウザからurlを要請します。&lt;/p&gt;&lt;p&gt;2. ホスト名を除いたアドレスをパーシングします。上の例は/index.htmlを探します。&lt;/p&gt;&lt;p&gt;3. index.htmlは拡張子がhtmlなのでweb.xml設定によってmvc-config.xml処理に渡します。&lt;/p&gt;&lt;p&gt;4. spring frameworkと関係ある要請なのでcontrollerで/index.htmlにマッピングされた関数を探します。&lt;/p&gt;&lt;p&gt;5. 関数を処理してreturn値でviewファイルを探します。上の例はindexをリターンします。&lt;/p&gt;&lt;p&gt;6. また、mvc-config.xmlの設定によってviewファイルは/web-inf/view/のディレクトリでindex.jspファイルを探します。&lt;/p&gt;&lt;p&gt;7. index.jspファイルを呼び出してhtmlデータをパーシングします。&lt;/p&gt;&lt;p&gt;8.　ブラウザに返却します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果ブラウザには最終パーシングした結果を受け取って画面に表示します。&lt;/p&gt;&lt;p&gt;springに関しては他の投稿でもっと詳しく説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでspring web frameworkを利用してウェブサービスプロジェクトを作成する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/79.html</guid><pubDate>Wed, 2 Jun 2021 15:50:35 +0900</pubDate></item><item><title>[Java] 38. Javaでウェブサービスプロジェクト(JSP Servlet)を作成する方法</title><link>https://www.nowonbun.com/78.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでウェブサービスプロジェクト(jsp servlet)を作成する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブというプログラムはserver(web server)とclient(browser)の間に決めっている標準規約でソケット通信することということです。&lt;/p&gt;&lt;p&gt;簡単に説明すると、client(browser)でurlアドレス含めているパスとparam string(ホストアドレスの?の後で設定されている値)と基本的なhttpヘッダー情報を作成してserverに要請すれば当該な値を計算して規約とおりに返事して接続を切る規約をウェブサービスといいます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで我々はウェブサービスサーバを構築するためにはブラウザから要請される値を解析してその値に合わせて返事ヘッダーとデータ値を作成しなければならないです。&lt;/p&gt;&lt;p&gt;それをコンソール環境で作成することでは大変難しいことになります。&lt;/p&gt;&lt;p&gt;javaには特定な要請を自動にパーシングして我々が簡単に宣言されている変数などを通ってデータを簡単に取得するし、応答ヘッダーやデータ値を作成する時にも簡単なルールを通りにリターンすることで簡単にウェブサービスを作成することができます。&lt;/p&gt;&lt;p&gt;それをjava server page(jsp)といいます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考に、我々がウェブサービスを作成する時にストラッツやスプリングなどの話をよく聞きます。ストラッツやスプリングなどはウェブプログラミングのフレームワークのライブラリです。それがウェブプラットフォームではありません。&lt;/p&gt;&lt;p&gt;フレームワークというのは我々がプログラムを作成する時によく使う関数やライブラリ、そして複雑なアルゴリズムを簡単に作成するように手伝ってくれる集約されたライブラリということに思えばよいです。つまり、基本的にjspプロジェクト上でこのjspをもっとしやすく扱うためのライブラリです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで始めにjavaでウェブサービスを作成することならフレームワークを習う前にjava servletに関して理解する必要があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://ja.wikipedia.org/wiki/java_servlet&quot; target=&quot;_blank&quot;&gt;https://ja.wikipedia.org/wiki/java_servlet&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先にサーブレットプロジェクトを作成する前にはideツールにトムキャットを設定する必要があります。以前の投稿でトムキャットを設定する方法に関して作成したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/77.html&quot; target=&quot;_blank&quot;&gt;[java] 37.イクリプス(eclipse)でトムキャット(tomcat)を設定する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;トムキャット(web application server)を設定したらウェブサービスプロジェクトを作成しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ideツール(イクリプス:eclipse)のnew project -&amp;gt; otherを選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=310&quot; data-filename=&quot;001.png&quot; style=&quot;width: 614px;&quot;&gt;&lt;/p&gt;&lt;p&gt;その中でweb -&amp;gt; dynamic web projectを選択してnextボタンを押下しましょう。&lt;/p&gt;&lt;p&gt;参考にstatic web projectとdynamic web projectの差異はstaticの場合はサーブレット環境ではなく、ただサーバにウェブページを要請するとディレクトリにあるウェブページ(html)を転送するサーバです。つまり、要請によってhtmlを修正したり値を入れて応答するプロジェクトではありません。&lt;/p&gt;&lt;p&gt;つまり、要請によってhtmlページのデータを変換するためにはdynamic web projectを作成しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=314&quot; data-filename=&quot;002.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてプロジェクト名とトムキャット設定とmodule versionが合っているかを確認してfinishボタンを押下しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=317&quot; data-filename=&quot;003.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;/p&gt;&lt;p&gt;※参考にイクリプス(eclipse)のプラグインをエンタプライズバージョンでインストールしないとウェブサーブレットを作成することで問題ありません。基本イクリプスは上のイメージみたいに作動しません。&lt;/p&gt;&lt;p&gt;つまり、web servletプラグインを別途にインストールしなければならないです。面倒なのでエンタプライズバージョンでインストールしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/41.html&quot; target=&quot;_blank&quot;&gt;[java] 1. javaとは？、javaインストール、eclipseインストール&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=312&quot; data-filename=&quot;004.png&quot; style=&quot;width: 267px;&quot;&gt;&lt;/p&gt;&lt;p&gt;プロジェクトを生成したらまずweb.xmlをを確認しましょう。web.xmlとはサーブレットで使う環境変数ファイルみたいことです。各web serverの環境と構築仕様が違うので別途の設定が必要です。&lt;/p&gt;&lt;p&gt;web.xmlがプロジェクトで見えない場合は下記通りの方法で生成すればよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=322&quot; data-filename=&quot;005.png&quot; style=&quot;width: 709px;&quot;&gt;&lt;/p&gt;&lt;p&gt;なぜかいつからこのweb.xmlが自動に生成しません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=320&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;web.xmlが生成されたら基本的な内容を確認しましょう。&lt;/p&gt;&lt;p&gt;welcome-file-listタグがあります。このタグはウェブサービスがrootを呼び出す時に、つまりhttp://ホストアドレス/の場合にindex.jspファイルを読み込むことだと設定することです。&lt;/p&gt;&lt;p&gt;私の場合はindex.jspを設定しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうしたらindex.jspファイルを作成してウェブブラウザにhello worldを表示しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=318&quot; data-filename=&quot;007.png&quot; style=&quot;width: 614px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=315&quot; data-filename=&quot;008.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;/p&gt;&lt;p&gt;その後にサーバを起動しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=319&quot; data-filename=&quot;009.png&quot; style=&quot;width: 693px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=316&quot; data-filename=&quot;010.png&quot; style=&quot;width: 543px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=311&quot; data-filename=&quot;011.png&quot; style=&quot;width: 737px;&quot;&gt;&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;※window -&amp;gt; browser設定&lt;/p&gt;&lt;p&gt;イクリプス(eclipse)には基本ブラウザにも確認できますが、基本ブラウザなら少しおかしく見えるため、よく使うchromeブラウザを利用して結果を確認するほうが良いです。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1523&quot; data-filename=&quot;013.png&quot; style=&quot;width: 475px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;一応、ウェブサービスは起動しました。でも、我々が作成したいことはstaticプロジェクトみたいにただウェブページを応答することではなく、サーブレットページです。&lt;/p&gt;&lt;p&gt;つまり、ブラウザが要請する値によりプログラム処理をして結果をリターンすることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、起動したウェブサーバを落ちます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=313&quot; data-filename=&quot;012.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてプロジェクトからサーブレットを追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=321&quot; data-filename=&quot;013.png&quot; style=&quot;width: 732px;&quot;&gt;&lt;/p&gt;&lt;p&gt;私はtestというサーブレットを作りました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=323&quot; data-filename=&quot;014.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そうすると下記通りのイメージみたいにサーブレットが生成されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=324&quot; data-filename=&quot;015.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;作成したらまたサーバを起動しましょう。&lt;/p&gt;&lt;p&gt;私はホストを/testに指定した場合、servletを要請することに作成したのでウェブブラウザパスにtestを入力して接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=325&quot; data-filename=&quot;016.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;結果をみれば改行タグがそのままに表示されました。ソースビューで確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=326&quot; data-filename=&quot;017.png&quot; style=&quot;width: 492px;&quot;&gt;&lt;/p&gt;&lt;p&gt;改行がそのままに表示されたことは正常なhtmlタグではないからです。&lt;/p&gt;&lt;p&gt;つまり、htmlドキュメントではなくtextドキュメントでブラウザが認識しました。&lt;/p&gt;&lt;p&gt;正常なhtmlタグはdocumentタグが必要だしhtmlタグから始まってbodyタグなかでデータを入れなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでウェブサービスプロジェクト(jsp servlet)を作成する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/78.html</guid><pubDate>Mon, 31 May 2021 17:34:57 +0900</pubDate></item><item><title>[Java] 37.イクリプス(eclipse)でトムキャット(tomcat)を設定する方法</title><link>https://www.nowonbun.com/77.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はイクリプス(eclipse)でトムキャット(tomcat)を設定する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブサービスを開発するためにはwas(ウェブアプリケーションサーバ)のトムキャットを先にインストールしなければならないです。その後に開発ツール(ide-eclipse)にトムキャットを設定して開発環境を構成しなければならないです。&lt;/p&gt;&lt;p&gt;まず、トムキャットをインストールするためにホームページに接続してトムキャットをダウンロードしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://tomcat.apache.org/download-80.cgi&quot; target=&quot;_blank&quot;&gt;https://tomcat.apache.org/download-80.cgi&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=304&quot; data-filename=&quot;001.png&quot; style=&quot;width: 751px;&quot;&gt;&lt;/p&gt;&lt;p&gt;トムキャットをインストールするためにはzipファイルをダウンロードして圧縮を解凍する方法があるし、window installerを利用してインストールする方法があります。&lt;/p&gt;&lt;p&gt;window installerを利用してインストールする場合はインストーラでサービスを登録させてくれるしウィンドウが起動する時に自動にサーバ起動をする設定までやってくれます。しかしこの方法は開発が終わった後にwebアプリケーション(web application)を登録する時にはよいですが、我々は開発環境を構築することなのでインストーラより圧縮ファイルをダウンロードして開発環境(eclipse)に設定しましょう。&lt;/p&gt;&lt;p&gt;それならzipファイルをダウンロードしましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;圧縮ファイルをダウンロードしたら適当なところに解凍してもよいですが、プログラム管理の便利性のため、eclipseの下のフォルダやプロジェクトフォルダに解凍しましょう。&lt;/p&gt;&lt;p&gt;私の場合はeclipseがインストールしたところに解凍しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=303&quot; data-filename=&quot;002.png&quot; style=&quot;width: 289px;&quot;&gt;&lt;/p&gt;&lt;p&gt;トムキャットをインストールはこれだけでよいです。&lt;/p&gt;&lt;p&gt;そうすると開発のために開発ツール(eclipse)にトムキャットを登録しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、イクリプス(eclipse)を実行して新しいプロジェクトを生成しましょう。&lt;/p&gt;&lt;p&gt;eclipseのプロジェクトウィザードでserverを選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=308&quot; data-filename=&quot;003.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ダウンロードしたトムキャットバージョンを合わせてサーバタイプを設定しましょう。&lt;/p&gt;&lt;p&gt;私の場合は8.5.xバージョンをダウンロードしたのでtomcat v8.5 serverを選択しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=307&quot; data-filename=&quot;004.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;/p&gt;&lt;p&gt;次はトムキャットがインストールパス(解凍されたフォルダパス)を選択して設定しなければならないです。&lt;/p&gt;&lt;p&gt;私の場合はeclipseの下のフォルダに解凍したのでそのパスを選択しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=306&quot; data-filename=&quot;005.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;/p&gt;&lt;p&gt;設定が終わるとプロジェクトエクスプローラーにサーバのトムキャットの設定ファイルが表示されると完了です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=305&quot; data-filename=&quot;006.png&quot; style=&quot;width: 484px;&quot;&gt;&lt;/p&gt;&lt;p&gt;トムキャット設定をするためにeclipseの下のserverタブを選択して当該なサーバを選択します。&lt;/p&gt;&lt;p&gt;それなら概要(overview)が出ますが、私の場合はports設定とタイムアウト設定だけ設定しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=309&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;タイムアウト設定はコンパイルした後で起動する時にサーバが止まっている時間設定ですが、それがタイムオバーになるとサーバが落ちます。&lt;/p&gt;&lt;p&gt;pcの性能が悪いならタイムアウト設定をしなければならないです。しなかったら起動する時に45秒以上になるとトムキャットサーバが落ちます。&lt;/p&gt;&lt;p&gt;ポートの場合はpcに他のサーバのポートを重ねている場合に起動エラーに発生します。イクリプス(eclipse)のないで使うトムキャットは他のサーバと重ねないために設定するほうがよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それなら簡単にウェブプロジェクトを生成しましょう。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1526&quot; data-filename=&quot;008.png&quot; style=&quot;width: 529px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;webのdynamic web projectを選択しましょう。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1524&quot; data-filename=&quot;009.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてプロジェクト名を設定しましょう。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1527&quot; data-filename=&quot;010.png&quot; style=&quot;width: 511px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;トムキャットとモジュールバージョンがしっかり設定されているかを確認してfinishボタンを押下しましょう。&lt;/p&gt;&lt;p&gt;それならプロジェクトが生成されます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1522&quot; data-filename=&quot;011.png&quot; style=&quot;width: 378px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;webcontentフォルダでindex.jspファイルを生成しましょう。&lt;/p&gt;&lt;p&gt;その後、eclipseで実行ブラウザを設定しましょう。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1523&quot; data-filename=&quot;013.png&quot; style=&quot;width: 475px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はchrome browserを選択しました。&lt;/p&gt;&lt;p&gt;そしてプロジェクトに右クリックすればcontext menuが表示されます。そしてdebug asのdebug on serverを選択します。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1528&quot; data-filename=&quot;014.png&quot; style=&quot;width: 721px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして設定したトムキャットを選択してfinishを押下しましょう。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1525&quot; data-filename=&quot;015.png&quot; style=&quot;width: 543px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすると始めはコンソールタブにログが出力することを確認できますが、数秒後でchromeブラウザにサーバが起動されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1521&quot; style=&quot;width: 415px;&quot; data-filename=&quot;016.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;index.jspファイルが表示されることを確認できました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでイクリプス(eclipse)でトムキャット(tomcat)を設定する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/77.html</guid><pubDate>Mon, 31 May 2021 11:28:58 +0900</pubDate></item><item><title>[Java] 36.コーディングする時、よく使うコーディングパターンとステップ数を減らす方法</title><link>https://www.nowonbun.com/76.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでコーディングする時、よく使うコーディングパターンとステップ数を減らす方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でjavaのコーディング規約に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/75.html&quot; target=&quot;_blank&quot;&gt;[java] 35. コーディング規約設定(google standard coding style)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムのプロジェクトを設計する時にコーディング規約を守ることも重要ですが、どのプログラムを設計するか、どのデザインパターンを反映するか、ステップを減らすためのどのアルゴリズムを使うかを考えることになります。&lt;/p&gt;&lt;p&gt;デザインパターンやアルゴリズムに関しては別の投稿で説明します。ここの投稿ではデザインパターンよりは簡単なパターンやアルゴリズムの作成方法に関して説明しようと思います。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;クラスを作成する時にインタフェース、抽象クラスを活用しよう。&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;javaには一般インタフェースと違い、特殊な文法を使えるようなインタフェースがあります。&lt;/p&gt;&lt;p&gt;例えば、runnableとcallableのインタフェースはラムダ式を使えるし、clonableインタフェースはクラスのメモリコピーができます。closeableのインタフェースはtry~catchで自動close関数を呼ばれる式を作れます。&lt;/p&gt;&lt;p&gt;throwableの場合は例外処理クラスを生成するし、serializableの場合は直列化(シリアライズ)ができるインタフェースです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1520&quot; style=&quot;width: 223px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はdataタイプの抽象クラスとprocessタイプの抽象クラスを作りました。&lt;/p&gt;&lt;p&gt;dataタイプの抽象クラスはデータベースや色々のデータがあるentityタイプのクラスだし、processタイプの抽象クラスをそのデータを処理するcontrollerタイプのクラスです。&lt;/p&gt;&lt;p&gt;それでdataタイプのクラスはクラスのメモリコピーが可能なcloneableインタフェースと直列化(シリアライズ)ができるserializableインタフェースを継承します。&lt;/p&gt;&lt;p&gt;processタイプのクラスはスレッドで使えるrunnableインタフェースとclose関数が使えるcloseableインタフェースを継承します。&lt;/p&gt;&lt;p&gt;もちろん、クラスで直接にインタフェースを継承して作成することができますが、インタフェースとクラス間に抽象クラスを置いて、クラス側で共通部分と派生部分を分けて開発することができます。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;分岐文はif~elseよりbreakとcontinueを使えましょう。&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;プログラムを作成する時に繰り返し文(for)で分岐(if~else)を置いてよく使えます。&lt;/p&gt;&lt;p&gt;if~else文が悪いことではなく、if~elseが多くなるとスタック深さ(depth)が多くなります。スタック深さ(depth)が多くなると可読性が悪くなるし、プログラム開発する時に迷い込む時があります。&lt;/p&gt;&lt;p&gt;できれば繰り返し文(for)にはif~breakやcontinueを使うことがスタック深さ(depth)を節約する方法になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1519&quot; data-filename=&quot;002.png&quot; style=&quot;width: 197px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は上の場合はfor~if~for~ifまで4depthまで行きます。&lt;/p&gt;&lt;p&gt;でも下の場合はfor~forで2depthで処理します。つまり深さ(depth)が少なくなるので可読性がよくなります。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;繰り返しは関数で置換&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;一つの関数で様々な処理を全部に作成することよりできれば細かく分けて作成する方が可読性やソース管理が良いです。&lt;/p&gt;&lt;p&gt;特に繰り返し文が重なっている場合は分ける方が良いです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1518&quot; style=&quot;width: 261px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は繰り返し部分だけ関数で分けました。&lt;/p&gt;&lt;p&gt;プログラムの性能改善には影響なしでただ可読性をよいことにします。この部分は人により差異があるので、自分の基準がある方が良いです。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;メンバー変数はクラスの特性なので、メイン処理関数だけで使うし計算用のメソッドはパラメータでデータ値を受け取りましょう。&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;メンバー変数の場合はクラス内でどの関数でも参照ができます。でも、変数と関数が多くなるし複雑な処理するクラスの場合、あっちこっちでメンバー変数を参照して使うと後でデータ管理が難しくなります。なのでメイン関数(public)ではメンバー変数を使うし計算用関数(private)はパラメータでデータを扱うことです。&lt;/p&gt;&lt;p&gt;関数でパラメータが多くなるとインラインクラスを利用して使うこともできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1518&quot; style=&quot;width: 261px;&quot; data-filename=&quot;003.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;一つのラインで二つの処理以上は禁止&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;私の場合は三項演算子をよく使います。三項演算子が何かというとif~elseのことを「条件式?true式:false式」で作成できる文法です。&lt;/p&gt;&lt;p&gt;三項演算子は悪くないですが、重ねって作成すると可読性が悪くなります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1516&quot; data-filename=&quot;004.png&quot; style=&quot;width: 215px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の式でadd1(add2(add3(0)))に作成するとどの関数から始まることかも迷い込みますね。一番の奥のadd3関数から始まります。&lt;/p&gt;&lt;p&gt;ステップが増えることでパフォーマンスが悪くなることではないので、出来れば分けて作成する方が良いです。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;参照リターンはパラメータに、データ変換は関数のリターン値に処理しよう。&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;参照ができるクラスタイプ(pass by reference)はパラメータに渡してデータをリターンを受け取ると迷い込む時があります。別にこんなに処理しても問題はないですが、たまに変数名が変わると迷い込みますね。&lt;/p&gt;&lt;p&gt;可読性のためにもクラスはパラメータで受け取る方が良いです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1517&quot; data-filename=&quot;005.png&quot; style=&quot;width: 153px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラム開発経歴が多い方は自分のスタイルのデザインパターンとコーディング技法があります。上で紹介したことはどこの規約や技法ではなく、私が今まで開発しながらこんなにすると設計が綺麗だし、バグが少なかったということを纏めてみました。&lt;/p&gt;&lt;p&gt;参照したらよいと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでコーディングする時、よく使うコーディングパターンとステップ数を減らす方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/76.html</guid><pubDate>Fri, 28 May 2021 17:33:23 +0900</pubDate></item><item><title>[Java] 35. コーディング規約設定(Google Standard coding style)</title><link>https://www.nowonbun.com/75.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのコーディング規約設定(google standard coding style)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムプロジェクトを作成する時に様々なルールと規約を設定しなければならない時があります。プロジェクトを一人で作成して運用すれば別に関係ないと思いますが、普通は一人ではなく、多人数で作成するので人の間のコーディングルールと規約を決めて無駄な工数を減らすことが重要だと思います。&lt;/p&gt;&lt;p&gt;例えば、変数名を「abcde」ということに設定して作成したら作成した本人は変数の意味を分かるかも知らないですが、他人の場合はデバックするまでは何の変数かを分かりません。でも変数名は「avg」ということに設定すれば大体に平均値ではないかと予想することができます。&lt;/p&gt;&lt;p&gt;つまり、コーディング規約はプログラム性能やパフォーマンス改善とはそんなに関係あることではなく、コードの可読性を改善することで、変数名や関数名だけでも何の機能するかを分かるように作成するし、クラス名だけでもデザインパターンを理解するし何の構造になっているかを他人がみても分かりやすく作成することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaのコーディング規約は様々なスタイルがありますが、最近はgoogleのコーディング規約をよく使います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://google.github.io/styleguide/javaguide.html&quot; target=&quot;_blank&quot;&gt;google java style&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;1. ソースファイル基本事項&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;1.1 ソースファイル名が含めているクラス名は大文字、小文字区分で単語を区分して命名を決めます。拡張名は.javaになります。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;例) examplesource.java (o) examplesource.java(x)&lt;/p&gt;&lt;p&gt;1.2 ファイルのエンコードはutf-8にします。&lt;/p&gt;&lt;p&gt;1.3 スペース(空白文字)はソースファイルで唯一に勝手に使える文字です。&lt;/p&gt;&lt;p&gt;1.4 すべての特殊文字を使う時はエスケープシーケンス(\b,\t,\n,\f,\r,\&quot;,\&apos;,\\)を使います。でもその文字の進数(\012)、ユニーコード(\u000a)は使いません。&lt;/p&gt;&lt;p&gt;1.5 コード可読性に影響がなければascii(\u221e)文字は使ってもよいです。&lt;/p&gt;&lt;p&gt;※上の例は変数を作成して初期値を格納する時の例です。一番よいのはコメントなく、分かりやすい変数名を決めてデータを格納することですが、エンコード上でそれが不可能ならユニーコードを使ってコメントで説明することも悪くないです。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;2.ソースファイル構造&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;ソースファイルの構造は下記の順番通りです。&lt;/p&gt;&lt;p&gt;2.1 ライセンスや著作権情報、ファイル作成者、ファイル修正履歴などのコメントを作成。&lt;/p&gt;&lt;p&gt;2.2 パッケージ文(package)&lt;/p&gt;&lt;p&gt;2.3 参照分(import)&lt;/p&gt;&lt;p&gt;2.4 ファイル名と同じになっているクラス&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;3.書式&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;3.1 中括弧(スタック領域)&lt;/p&gt;&lt;p&gt; - 開く中括弧の前は改行がありません。&lt;/p&gt;&lt;p&gt; - 開く中括弧の後は改行します。&lt;/p&gt;&lt;p&gt; - 閉じる中括弧の前は改行します。&lt;/p&gt;&lt;p&gt; - ソースステップに閉じる中括弧だけある場合はメソッド、コンストラクタ、クラスのスタック領域の終わりです。&lt;/p&gt;&lt;p&gt; - 空ブロック: 中括弧間に文字がなければすぐ閉じることが可能です。({})&lt;/p&gt;&lt;p&gt;3.2 ブロックインデント: +2空間&lt;/p&gt;&lt;p&gt;新しいブロックと同じ構造は二つの空白でインデントを追加します。文が終了したら以前のインデントのレベルに戻ります。&lt;/p&gt;&lt;p&gt;※google標準規約は+2インデントですが、c++やc#(ms規約)、他の言語の標準は+4インデントなので+4のインデントでも構いません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;3.3 ライン文字数: 80&lt;/p&gt;&lt;p&gt;プロジェクトの文字数は80や100文字に制限します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;3.4 line-wrapping&lt;/p&gt;&lt;p&gt;規約は無いですが、一般的にライン文字数制限のために使います。&lt;/p&gt;&lt;p&gt; 3.4.1 改行ポイント&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- 一般演算子の前に改行します。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- 代入演算子の場合は記号後に改行します。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- メソッド、コンストラクタを呼び出す時には括弧「(」を付けます。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- コンマはトークンの連結状況を守ります。&lt;/p&gt;&lt;p&gt; 3.4.2 インデントは+4&lt;/p&gt;&lt;p&gt;3.5 空白(スペース)&lt;/p&gt;&lt;p&gt; 3.5.1 ライン空白&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- フィールド、コンストラクタ、クラスの間&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- 2行以上のライン空白は禁止ではないですが、お勧めはしない。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt; 3.5.2 一般空白&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- if、for、catchと括弧「()」の間に空白文字&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- else、catchと括弧「{}」の間に空白文字&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- 「,」、「:」、「;」とタイプキャストと括弧「()」の間に空白文字&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- 演算子の前後に空白文字&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- 演算子と似ている記号には前後に空白文字&lt;/p&gt;&lt;p&gt;3.6 グループ化&lt;/p&gt;&lt;p&gt;ソースの間にグループを入れて可読性を改善できます。&lt;/p&gt;&lt;p&gt;3.7 特定構造&lt;/p&gt;&lt;p&gt; 3.7.1 列挙型、配列の宣言&lt;/p&gt;&lt;p&gt; 列挙型と配列の値を設定する時は改行は自由です。&lt;/p&gt;&lt;p&gt; 3.7.2 変数宣言&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- すべての変数宣言(メンバー変数、ローカル変数)は一つのラインで宣言しません。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- メンバー変数はクラスの上端に宣言します。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- ロカール変数は宣言する時に初期化データを格納します。&lt;/p&gt;&lt;p&gt; 3.7.3 cスタイル配列宣言&lt;/p&gt;&lt;p&gt; string[] argsで宣言します。(cスタイルのstring args[]がありません。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt; 3.7.4 switch&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;3.7.4.1 インデント&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- スウィッチ文の中括弧「{」後は改行します。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- 改行した後には+2インデントを追加します。中括弧が終了したら以前のインデントのレベルに戻ります。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- case、default後は改行します。改行したら+2インデントを追加します。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- case、defaultが終了したら以前にインデントレベルに戻ります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;3.7.4.2 コメント&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- switch ~ caseは基本的に break、return、throwでswitchの領域を区分します。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- caseでbreakで終わらなく、続けて実行する場合は/*続ける*/というコメントを作成します。&lt;/p&gt;&lt;p&gt; 3.7.5 アノテーション&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- 一つのラインに一つのアノテーションを作成します。インデントを追加しません。&lt;/p&gt;&lt;p&gt; 3.7.6 コメント&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- コメントは周りのコードと同じレベルで使う。&lt;/p&gt;&lt;p&gt; 3.7.7 数値リテラル&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;- longタイプのリテラルは大文字に使います。(数字との混乱しないため)&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;4. ネーミング&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;4.1 パッケージ名&lt;/p&gt;&lt;p&gt; - パッケージ名は単純に連結している単語、すべて小文字になっています。com.example.deepspace&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;4.2 クラス名&lt;/p&gt;&lt;p&gt; - クラス名は名詞や名詞句です。インタフェース名は名詞や名詞句、形容詞句です。(形容詞 + 名詞)&lt;/p&gt;&lt;p&gt; - クラス名の単語区分は大文字を使います。&lt;/p&gt;&lt;p&gt; - unitテストクラスはtestで始まります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;4.3 メソッド名&lt;/p&gt;&lt;p&gt; - メソッド名は動詞と動詞句です。(動詞 + 名詞)&lt;/p&gt;&lt;p&gt; - メソッド名の単語区分は大文字を使います。&lt;/p&gt;&lt;p&gt; - unitテストメソッドはtestで始まります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;4.4 変数名&lt;/p&gt;&lt;p&gt; - 変数名は名詞と名詞句です。&lt;/p&gt;&lt;p&gt; - 変数名単語区分は大文字を使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;4.5 定数名&lt;/p&gt;&lt;p&gt; - 定数の名はすべて大文字でアンダーバーで区分します。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;5. その以外&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;5.1 @override&lt;/p&gt;&lt;p&gt; - インタフェースから継承する時、再定義するメソッドは必ず@overrideを使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;5.2 例外を取り除く文は作成しない。&lt;/p&gt;&lt;p&gt; - try ~ catchでcatchに何の処理がないステップを使わない。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;5.3 静的を参照&lt;/p&gt;&lt;p&gt; - 直接に参照します。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;6. javadoc&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;6.1 書式&lt;/p&gt;&lt;p&gt; 6.1.1 一般的な書式&lt;/p&gt;&lt;p&gt; 6.1.2 段落&lt;/p&gt;&lt;p&gt; - 空白ラインです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt; 6.1.3 節&lt;/p&gt;&lt;p&gt; - @param、@return、@throws、@deprecatedのパラメータは必ず説明が必要です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt; 6.1.4 内容&lt;/p&gt;&lt;p&gt; - 必ず一つの文章で作成します。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;eclipseにコードスタイル適用&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;eclipseを使うユーザならideツールにコードスタイルを設定して規約によってソースを作成することができます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://github.com/google/styleguide/blob/gh-pages/eclipse-java-google-style.xml&quot; target=&quot;_blank&quot;&gt;https://github.com/google/styleguide/blob/gh-pages/eclipse-java-google-style.xml&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リンクのコードスタイルをeclipseに反映します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1511&quot; style=&quot;width: 247px;&quot; data-filename=&quot;001.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1515&quot; data-filename=&quot;002.png&quot; style=&quot;width: 684px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1512&quot; data-filename=&quot;003.png&quot; style=&quot;width: 112px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1514&quot; data-filename=&quot;004.png&quot; style=&quot;width: 684px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コードスタイルをeclipseに反映しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaコードを作成してフォーマットを選択するとスタイルによりコードが変更されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1510&quot; style=&quot;width: 372px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1513&quot; data-filename=&quot;006.png&quot; style=&quot;width: 293px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのコーディング規約設定(google standard coding style)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/75.html</guid><pubDate>Thu, 27 May 2021 17:32:53 +0900</pubDate></item><item><title>[Java] 34. WindowでMariaDBをインストールする方法</title><link>https://www.nowonbun.com/74.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はwindowでmariadbをインストールする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がプロジェクトを設計してプログラムを作成することで一番よく使うプログラムはデータベースです。&lt;/p&gt;&lt;p&gt;データベースの種類はすごく多いですが、その中で無料でパフォーマンスがいいし、rdbms系のデータベースのmariadbがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;mariadbの特徴に関して説明するとoracleとmssｑｌ(sql-server)と同じタイプのrdbms系だし、ライセンスが無料になります。&lt;/p&gt;&lt;p&gt;なのでsqlクエリでテーブルやデータを入力、検索が可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならmariadbをインストールしましょう。&lt;/p&gt;&lt;p&gt;以前にlinux(centos,ubuntu)でmariadbをインストールしたことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/109.html&quot; target=&quot;_blank&quot;&gt;[ubuntu] mariadb(mysql)をインストールする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/106.html&quot; target=&quot;_blank&quot;&gt;[centos] mariadb(mysql)をインストール&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;window環境でmariadbをインストールすることはlinuxみたいに複雑ではありません。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://go.mariadb.com/download-mariadb-server-community.html&quot; target=&quot;_blank&quot;&gt;https://go.mariadb.com/download-mariadb-server-community.html&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1509&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のアドレスリンクで接続すればnameや様々な情報を入力してっていいますが、簡単に入力してdownloadを押下してダウンロードしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1494&quot; style=&quot;width: 238px;&quot; data-filename=&quot;002.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならosのversionを選択してっていいますが、window環境でインストールするからwindow64を選択してダウンロードします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1492&quot; data-filename=&quot;003.png&quot; style=&quot;width: 723px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1491&quot; style=&quot;width: 126px;&quot; data-filename=&quot;004.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールファイルをダブルクリックしてインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1500&quot; style=&quot;width: 495px;&quot; data-filename=&quot;005.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ライセンスの同意しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1502&quot; data-filename=&quot;006.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールするドライブを選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1496&quot; data-filename=&quot;007.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;次は初期rootのidのパスワードを設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1497&quot; data-filename=&quot;008.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてservices.mscに表示するラベル名とポート設定ですが、特異事項がなければdefaultでnextボタンを押下しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1493&quot; data-filename=&quot;009.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;使用中でフィードバックを可否ですが、チェック解除してnextボタンを押下しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1498&quot; data-filename=&quot;010.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからinstallが始まります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1505&quot; data-filename=&quot;011.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールが完了すればスタートメニューでmariadbフォルダが生成されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1508&quot; style=&quot;width: 313px;&quot; data-filename=&quot;012.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この中でmysql clientをクリックして接続します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1503&quot; data-filename=&quot;013.png&quot; style=&quot;width: 262px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてmysqlデータベースで接続してuser情報を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1499&quot; data-filename=&quot;014.png&quot; style=&quot;width: 637px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてユーザを一つ生成して権限を与えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1504&quot; data-filename=&quot;015.png&quot; style=&quot;width: 606px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これでsql queryブラウザを利用して接続しましょう。&lt;/p&gt;&lt;p&gt;私の場合はdbeaverというブラウザを使います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/255.html&quot; target=&quot;_blank&quot;&gt;[tools] dbeaver(無料sql queryブラウザツール)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムで新しい接続コネクションを生成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1495&quot; data-filename=&quot;016.png&quot; style=&quot;width: 201px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1507&quot; data-filename=&quot;017.png&quot; style=&quot;width: 602px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;接続するデータベースを選択して接続情報を入力しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1506&quot; data-filename=&quot;018.png&quot; style=&quot;width: 599px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;test connectionで接続できることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;簡単な例でqueryを作成してしっかり作動するかを確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1501&quot; data-filename=&quot;019.png&quot; style=&quot;width: 263px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;検索までできることを確認しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでwindowでmariadbをインストールする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/74.html</guid><pubDate>Wed, 28 Apr 2021 19:12:44 +0900</pubDate></item><item><title>[Tools] Dbeaver(無料Sql queryブラウザツール)</title><link>https://www.nowonbun.com/255.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はdbeaver(無料sql queryブラウザツール)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私が今までsql　queryブラウザで「これが良い！」と思うブラウザがありません。&lt;/p&gt;&lt;p&gt;mssql(sql-server)はsql managementというブラウザがあり、様々な機能がありますが、mssql(sql-server)専用です。mariadbやoracleにも使えません。&lt;/p&gt;&lt;p&gt;oracleの場合はsql developerがありますが、使いにくいです。&lt;/p&gt;&lt;p&gt;その以外にa5m2というブラウザもがありますが、自分が使う時に様々のバグがあり、信用性が低かったんです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1484&quot; data-filename=&quot;001.png&quot; style=&quot;width: 472px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1487&quot; data-filename=&quot;002.png&quot; style=&quot;width: 494px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1486&quot; style=&quot;width: 800px;&quot; data-filename=&quot;003.jpg&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1489&quot; data-filename=&quot;004.jpg&quot; style=&quot;width: 280px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;他のことではwindowだけではなく、ubuntuやlinuxosで使うユーザもいますが、上のツールは使えません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の問題をすべて解決しているツールがdbeaverというツールがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1485&quot; data-filename=&quot;005.png&quot; style=&quot;width: 315px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ホームページ - &lt;a href=&quot;https://dbeaver.io/&quot; target=&quot;_blank&quot;&gt;https://dbeaver.io/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ツールの開発した言語はjavaみたいでツールの雰囲気はeclipseと似てます。そしてcommunityバージョンとenterpriseバージョンがありますが、enterpriseバージョンは有料です。&lt;/p&gt;&lt;p&gt;communityバージョンが無料ですが、私の基準ではcommunityバージョンだけでも使うことで不便がありませんでした。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1490&quot; style=&quot;width: 848px;&quot; data-filename=&quot;006.png&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;dbeaverで接続できるデータベースは上のイメージみたいです。私も世界にあるデータベースがそんなに多いか知らなかったです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1488&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;dbeaverツールでは様々な機能もありますが、erd機能もありますね。&lt;/p&gt;&lt;p&gt;erd機能とはデータベースを関係図を人が見やすく表すための機能です。その以外にパフォーマンステストやチューニングする機能もあります。&lt;/p&gt;&lt;p&gt;私もまだすべての機能は分かりませんが、os関係ずにwindowやlinux、macで使えることが良いじゃはないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので特定なsqlだけ使うことではなく、汎用性が良いし、パフォーマンスや信用性が優秀なプログラムでdbeaverというブラウザがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでdbeaver(無料sql queryブラウザツール)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Open source / Tools</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/255.html</guid><pubDate>Wed, 28 Apr 2021 18:26:49 +0900</pubDate></item><item><title>[Java] 33. オープンライブラリを参照する方法(eclipseからmavenを連結)</title><link>https://www.nowonbun.com/73.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのオープンライブラリを参照する方法(eclipseからmavenを連結)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がプロジェクトを構成してプログラムを作成する時、すべてのアルゴリズムと構造体、parsingして変換する関数などのすべてのプログラムソースを作成しながらプログラムを作成することはできません。なぜならそうなら検証する領域も増えるし、作業ステップが多くなるからです。&lt;/p&gt;&lt;p&gt;それじゃなくてもネットから検証してないソースを使うこともリスクがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例えば、プロジェクト内部でjsonタイプの構造体を使います。&lt;/p&gt;&lt;p&gt;stringタイプになっているjsonデータをクラスに変換することやクラスタイプにあるデータをstringタイプのjsonデータに変換しようと思えばjava標準ライブラリでは変換クラスや関数がないので変換関数を作成しなければならないです。&lt;/p&gt;&lt;p&gt;作ったと思っても様々なケースを予想してテストや検証をしなければならないです。つまり、我々がやろうと思ったプロジェクトがあるのにその付属関数を作ることで時間がたくさんかかることになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでapacheではよく使うソースなどをライブラリを公開しますが、それをオープンライブラリだといいます。&lt;/p&gt;&lt;p&gt;このオープンライブラリはmavenというプログラムとmaven repositoryを通ってオープンライブラリを簡単に検索してプロジェクトに自動に依存性チェックまでして連結することができます。&lt;/p&gt;&lt;p&gt;(依存性チェックとはaライブラリを参照します。でもaライブラリを使うためにはbとcのライブラリが必要です。それならmavenではaというプロジェクトだけ連結すれば自動にbとcライブラリまでダウンロードして連結する機能ということです。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私もmavenの詳細な仕様はわからないですが、簡単にオープンライブラリを連結して使えるプログラムだということまで知っています。&lt;/p&gt;&lt;p&gt;他の言語ではc#のnugetがあるしphpはcomposer、pythonにはpipがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならmavenをインストールしてeclipseに連結して使いましょう。(私はjavaを使う時によく使うツールはeclipseです。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://maven.apache.org&quot; target=&quot;_blank&quot;&gt;https://maven.apache.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サイトでzipファイルをダウンロードしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=296&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして適当なところで圧縮を解凍します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=288&quot; data-filename=&quot;002.png&quot; style=&quot;width: 670px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「cmd」で当該なフォルダに行って「bin」フォルダで「mvc -version」を確認します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=287&quot; data-filename=&quot;003.png&quot; style=&quot;width: 811px;&quot;&gt;&lt;/p&gt;&lt;p&gt;その後で環境変数の設定をしましょう。window key + pause breakを押下するかドライブの属性を選択します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=301&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=297&quot; data-filename=&quot;005.png&quot; style=&quot;width: 618px;&quot;&gt;&lt;/p&gt;&lt;p&gt;環境設定を設定した後、「cmd」に行ってもう一回に確認します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=290&quot; data-filename=&quot;006.png&quot; style=&quot;width: 824px;&quot;&gt;&lt;/p&gt;&lt;p&gt;maven設定は完了しました。&lt;/p&gt;&lt;p&gt;mavenを「eclipse」に設定します。「eclipse」の「preferences」タブに移動します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=289&quot; data-filename=&quot;007.png&quot; style=&quot;width: 280px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「maven」をインストールしたフォルダを設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=294&quot; data-filename=&quot;008.png&quot; style=&quot;width: 623px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=295&quot; data-filename=&quot;009.png&quot; style=&quot;width: 623px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=293&quot; data-filename=&quot;010.png&quot; style=&quot;width: 623px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これから「eclipse」で「maven」プロジェクトを生成します。&lt;/p&gt;&lt;p&gt;先は一般プロジェクトで生成しますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=292&quot; data-filename=&quot;011.png&quot; style=&quot;width: 491px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「maven」プロジェクトに変換します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=299&quot; data-filename=&quot;012.png&quot; style=&quot;width: 686px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そうしたら「pom.xml」が生成されます。「maven」のテストのため、「gson」を追加します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=298&quot; data-filename=&quot;013.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=300&quot; data-filename=&quot;014.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;pom.xmlを作成してライブラリをアップデータします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=302&quot; data-filename=&quot;015.png&quot; style=&quot;width: 745px;&quot;&gt;&lt;/p&gt;&lt;p&gt;テストのため、ソースを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=291&quot; data-filename=&quot;016.png&quot; style=&quot;width: 557px;&quot;&gt;&lt;/p&gt;&lt;p&gt;結果は「json」タイプで「string」を「node」クラスで変換をしました。その意味は「gson」ライブラリがちゃんと動いてる状況ですね。「eclipse」から「maven」を通ってライブラリをちゃんとアップデータしてソース上で使えることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのオープンライブラリを参照する方法(eclipseからmavenを連結)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/73.html</guid><pubDate>Fri, 23 Apr 2021 15:58:07 +0900</pubDate></item><item><title>[Java] 32. Reflection機能を使う方法(Annotation編)</title><link>https://www.nowonbun.com/72.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのreflection機能を使う方法(annotation編)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でjavaのreflection機能をclassとmethod、variableを分けて説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/69.html&quot; target=&quot;_blank&quot;&gt;[java] 29. reflection機能を使う方法(class編)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/70.html&quot; target=&quot;_blank&quot;&gt;[java] 30. reflection機能を使う方法(method編)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/71.html&quot; target=&quot;_blank&quot;&gt;[java] 31. reflection機能を使う方法(variable編)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今まではreflectionがクラスを割り当てするか内部関数、変数の値を取得することで使いました。&lt;/p&gt;&lt;p&gt;javaではannotationは機能が何もないです。annotationはjavaでメタデータの役だけです。つまり、javaのコードの解析記述や説明に関数データです。&lt;/p&gt;&lt;p&gt;でも、annotationはjavaのreflectionと一緒で使えば単純なメタデータの機能だけではないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1481&quot; data-filename=&quot;001.png&quot; style=&quot;width: 315px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば、exampleでアノテーションの値を取得して設定されているvalueの値をコンソール出力に出力しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでみればアノテーションのreflectionは別に活用度がなさそうです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1483&quot; data-filename=&quot;002.png&quot; style=&quot;width: 170px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースをみればexampleクラスでメンバー変数を二つを宣言します。そして親抽象クラスのコンストラクタからdependancyinjectionのアノテーションを持っている変数に変数に関してインスタンス生成します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果でprint関数を呼び出すとnode1はnullではなく、print関数が呼び出せることを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1482&quot; data-filename=&quot;003.png&quot; style=&quot;width: 194px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の関数はコンストラクタからautoexecuteアノテーションを持っている関数を探して実行する関数です。&lt;/p&gt;&lt;p&gt;print関数とrun、testはアノテーションが設定されているので実行されることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;元にアノテーションはメタデータの機能だけありますが、reflectionと一緒に使えば依存性注入や実行パターンを設定する(戦略パターン、facadeパターン)などの様々なパターンを設定することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのreflection機能を使う方法(annotation編)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/72.html</guid><pubDate>Thu, 22 Apr 2021 13:49:39 +0900</pubDate></item><item><title>[Java] 31. Reflection機能を使う方法(Variable編)</title><link>https://www.nowonbun.com/71.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのreflection機能を使う方法(variable編)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でjavaのreflection機能をclassとmethodを分けて説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/69.html&quot; target=&quot;_blank&quot;&gt;[java] 29. reflection機能を使う方法(class編)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/70.html&quot; target=&quot;_blank&quot;&gt;[java] 30. reflection機能を使う方法(method編)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;classとmethodにはstringでクラスやメソッドを探して割り当てすることや呼び出すことが重要なreflection機能でした。&lt;/p&gt;&lt;p&gt;このvariableでも別に違う機能があることではありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メンバー変数はoopの特性でprivateのアクセス修飾子によりカプセル化します。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/54.html&quot; target=&quot;_blank&quot;&gt;[java] 14. オブジェクト指向プログラミング(oop)の4つ特性(カプセル化、抽象化、継承、多相化)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通はクラス内部でreflectionを利用して変数の値を取得することではないです。なので別に必要性がありません。&lt;/p&gt;&lt;p&gt;でも、クラスの外部でクラスの変数値を取得したい場合は？privateになっているから取得できないです。それがoopの特性なので。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1479&quot; data-filename=&quot;001.png&quot; style=&quot;width: 453px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればnodeインスタンスを生成してgetdeclaredfield関数でデータ値を取得します。&lt;/p&gt;&lt;p&gt;setaccessibleの関数はprivateの時にアクセスが可能にする関数です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はmainではnodeインスタンスのメンバー変数はprivateなのでアクセスができないです。&lt;/p&gt;&lt;p&gt;でも、上の例ではprivateになっているメンバー変数のデータを取得しました。そしてデータを格納することまでしました。&lt;/p&gt;&lt;p&gt;つまり、reflectionを利用すればunitテストのプログラムを作成する時、関数の結果だけではなく、途中のクラスのデバッグ値やメンバー変数の値を確認することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1480&quot; data-filename=&quot;002.png&quot; style=&quot;width: 769px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionのメソッドでもありますが、変数にもクラスの変数リストを取得する関数があります。&lt;/p&gt;&lt;p&gt;methodではgetdeclaredmethods関数が呼ばされたクラスだけ、 getmethods関数は親クラスまでの関数がリストに出力されます。&lt;/p&gt;&lt;p&gt;変数は少し違いです。getdeclaredfieldsとgetfieldsの差異はgetdeclaredfieldsはprivateの含め変数、getfieldsはpublicだけの変数です。&lt;/p&gt;&lt;p&gt;普通のクラスはカプセル化になっているので、getfields関数は使うことではないですね。&lt;/p&gt;&lt;p&gt;リストだけではなく、変数名で取得する関数ても同じです。つまり、privateの変数をgetfieldに取得するとnullになります。こちらも変数がprivateタイプになっているのでgetdeclaredfieldだけ使うことになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのreflection機能を使う方法(variable編)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/71.html</guid><pubDate>Thu, 22 Apr 2021 10:48:03 +0900</pubDate></item><item><title>[Java] 30. Reflection機能を使う方法(Method編)</title><link>https://www.nowonbun.com/70.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのreflection機能を使う方法(method編)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でreflection機能のクラスを説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/69.html&quot; target=&quot;_blank&quot;&gt;[java] 29. reflection機能を使う方法(class編)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionの機能はクラスの構造を分析してメソッドや変数を使える機能だと説明しました。&lt;/p&gt;&lt;p&gt;そうするとreflectionの動的の割り当てでクラスをobjectに格納するとobjectクラスの関数だけではなくreflection機能を通ってクラス構造を分析してメソッドを探索して使えます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1473&quot; data-filename=&quot;001.png&quot; style=&quot;width: 247px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でnodeクラスを取得してインスタンスを生成しました。そしてnodeクラスでprintメソッドを探してメソッドにインスタンスを入れて実行(invoke)します。&lt;/p&gt;&lt;p&gt;main関数でソース上ではnodeキーワードを使えなかったので、nodeクラスを動的に分離することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaにはメソッドのタイプが関数の種類が2つです。コンストラクタと一般関数に分けます。&lt;/p&gt;&lt;p&gt;コンストラクタの場合は返却タイプがない形です。javaのreflectionではgetconstructor()関数を使って取得できます。&lt;/p&gt;&lt;p&gt;一般関数の場合は返却タイプがある形です。javaのreflectionではgetmethod()関数を使って取得できます。&lt;/p&gt;&lt;p&gt;関数を探索する時に関数の名前も重要ですが、javaにはオバーロード機能があるので、パラメータの個数とタイプも重要です。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1474&quot; data-filename=&quot;002.png&quot; style=&quot;width: 269px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいに同じ関数名でもパラメータ設定より呼び出しを別々にすることができます。getconstructor関数も同じ方法でコンストラクタを探索してインスタンスを生成することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;class編でクラスをstringタイプで探索してインスタンスを生成することができました。メソッドも同じ方法でstringタイプで探索をして実行することができます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1477&quot; data-filename=&quot;003.png&quot; style=&quot;width: 309px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいにstringタイプに関数を探索して実行することも可能です。&lt;/p&gt;&lt;p&gt;この意味はプログラムの実行順番をプログラムの中で実装することではなく、テキストや環境変数によりプログラム実行順番を実装こともできます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1476&quot; data-filename=&quot;004.png&quot; style=&quot;width: 300px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は簡単に実行関数名をパラメータから受け取って実行することにしましたが、テキストで実行する関数名を順番とおりに作成してioで読み取って実行することもできます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionでは単純にgetmethod関数を利用して探すことだけではなく、getmethodsを通ってクラスにあるメソッドをすべて取得することもできます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1475&quot; data-filename=&quot;005.png&quot; style=&quot;width: 277px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;getmethods関数の場合は、当該なクラスの関数だけではなく、上位クラスからすべての関数、つまりobjectクラスからnodeクラスまでのすべての関数を出力します。&lt;/p&gt;&lt;p&gt;getdeclaredmethodsはnodeクラスにある関数を出力します。&lt;/p&gt;&lt;p&gt;仕様によって使ったらよいと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionには面白い機能があります。privateやprotectedみたいにアクセスが制限している関数も実行することができます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1478&quot; data-filename=&quot;006.png&quot; style=&quot;width: 210px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいにnodeクラスで関数がprivateになっていてもアクセスができます。&lt;/p&gt;&lt;p&gt;普通に上の方法はunittestで関数の値を確認する時に使う方法で、プロジェクトのプログラムを実装する時にはoopのカプセル化が無力化になるのでお勧めではありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのreflection機能を使う方法(method編)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/70.html</guid><pubDate>Fri, 12 Mar 2021 13:04:09 +0900</pubDate></item><item><title>[Java] 29. Reflection機能を使う方法(Class編)</title><link>https://www.nowonbun.com/69.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのreflection機能を使う方法(class編)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionとはクラスの構造を分析して動的ローディングが可能にする機能です。ということに説明されていますが、この意味では何の意味が分からないですね。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.oracle.com/technical-resources/articles/java/javareflection.html&quot; target=&quot;_blank&quot;&gt;https://www.oracle.com/technical-resources/articles/java/javareflection.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;今までjavaでインスタンスを生成することはnewキーワードを使って生成します。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/47.html&quot; target=&quot;_blank&quot;&gt;[java] 7. クラスを作成する方法(コンストラクタを作成方法)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、newキーワードを使わなくてインスタンスを生成する方法があります。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1466&quot; data-filename=&quot;001.png&quot; style=&quot;width: 574px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみればnodeクラスのprintを呼び出してコンソールでhello worldの結果が出力しました。&lt;/p&gt;&lt;p&gt;上の例では何処でもnew nodeという実装はありません。reflectionの機能を通ってnodeのインスタンスを生成したことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうならnew nodeを使ったら、もっと少ないステップでインスタンスを生成することができますが、なぜreflectionを使うことでしょうか？&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1466&quot; data-filename=&quot;001.png&quot; style=&quot;width: 574px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればstringタイプでクラスを探索してインスタンス生成することができます。&lt;/p&gt;&lt;p&gt;その機能で二つ方法を実装することができます。&lt;/p&gt;&lt;p&gt;一つ目はstringの値はコンパイル段階でチェックしないです。上の例でtostringを再定義することでキャストなしでtostringでコンソール出力しました。&lt;/p&gt;&lt;p&gt;つまり、exampleクラス内部ではnodeクラスを使ってないので、コンパイルする段階でnodeクラスがなくてもコンパイルできます。つまり、動的バインディングが可能するという意味です。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1469&quot; data-filename=&quot;002.png&quot; style=&quot;width: 828px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はexampleクラスだけ実装してnodeクラスは実装しませんでした。コンパイル段階は問題ないです。&lt;/p&gt;&lt;p&gt;でも、実行するとnodeクラスがないというエラーが発生しますね。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1467&quot; data-filename=&quot;003.png&quot; style=&quot;width: 294px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;nodeクラスを作ってコンパイルして同じフォルダに置きます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1468&quot; data-filename=&quot;004.png&quot; style=&quot;width: 687px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はバインディングにして実行することを確認できます。この意味は起動中のプログラムの再実行なしてソース交換ができるという意味です。理論はそうです。&lt;/p&gt;&lt;p&gt;しかし、実際のサービスでは予想できないエラーが発生する可能性があるのでしない方がよいです。&lt;/p&gt;&lt;p&gt;例えば、nodeインスタンスを生成してメモリに登録されました。でもソースが切り替えました。それだけみてもエラーが発生する可能性もあると思われますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;二つ目はインスタンス生成を外部で可能です。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1470&quot; data-filename=&quot;005.png&quot; style=&quot;width: 137px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースをみればgetclass関数のパラメータにnode1の値を入れてnode1のインスタンスを受け取ります。実際によく実装する方法です。&lt;/p&gt;&lt;p&gt;でも、クラスの種類が多くなるとgetclass関数のif文は増えます。例えば100個になるとif elseだけ100個実装します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この時にreflectionを利用すればソースが簡単になります。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1470&quot; data-filename=&quot;005.png&quot; style=&quot;width: 137px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースはclassが100個に増えてもgetclassの修正はないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、reflectionは万能ではありません。問題は性能ですね。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1471&quot; data-filename=&quot;006.png&quot; style=&quot;width: 178px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例で変数が一つあるクラスを100万個のインスタンスに生成しました。性能の差異が5倍になります。多分、変数が増えて生成するインスタンスが増えたらもっと遅くなると思います。&lt;/p&gt;&lt;p&gt;ここで差異が発生する理由はclass.fornameとgetconstructorの呼び出しせいです。クラスを探索する時間が係るからです。&lt;/p&gt;&lt;p&gt;そうならその探索の一回に設定して実装しましょう。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1472&quot; data-filename=&quot;007.png&quot; style=&quot;width: 154px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでもreflectionの方が遅いですね。でも上の差異なら少し遅くても便利性がよいからいいと思います。でもclass&amp;lt;?&amp;gt; clzとconstructor&amp;lt;?&amp;gt;　constructorのデータを何処かの変数に格納しなければならないです。&lt;/p&gt;&lt;p&gt;reflectionの便利性はよいですが、結局にreflectionのクラスタイプやコンストラクタを管理するソースを実装することで簡単ではありません。&lt;/p&gt;&lt;p&gt;どっちがよいかいうと仕様によって選択することですね。&lt;/p&gt;&lt;p&gt;reflectionはコンパイルエラーで取れないです。つまり、プログラムを実行しなければ、エラーを確認することができないです。reflection機能が多くなるとテストが大変になるし、結局品実に問題がなる可能性があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflection機能は普通unitテスト環境とframeworkを構築する時、di(依存性の注入)の時によく使う機能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのreflection機能を使う方法(class編)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/69.html</guid><pubDate>Thu, 11 Mar 2021 18:20:43 +0900</pubDate></item><item><title>[Java] 28. 文字タイプ(CharacterSet)とエンディアン(endian)で変換する方法</title><link>https://www.nowonbun.com/68.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaで使う文字タイプ(characterset)とエンディアン(endian)で変換する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でioとsocketに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/66.html&quot; target=&quot;_blank&quot;&gt;[java] 26. ファイル(io)を扱う方法(ファイル作成、ファイル修正、アクセス日付変更とioをclose(リソース返却)する理由、closableインタフェース)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/67.html&quot; target=&quot;_blank&quot;&gt;[java] 27. ネットワーク通信(socket)をする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaにはioとsocketでinputstreamとoutputstreamを利用してファイルを読み取りか書き込みをするし、通信はメッセージを送信、受信します。&lt;/p&gt;&lt;p&gt;このinputstreamとoutputstreamで扱うデータタイプはbyte配列(byte[])タイプです。このbyteは何かというとデータのバイナリというする8bitのデータの2進データです。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1456&quot; data-filename=&quot;001.png&quot; style=&quot;width: 331px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々が普通にファイルのサイズを話す時に上のイメージみたいに何バイトという言います。つまり、上のファイルはbyte配列でbyte[524556]になっているデータということにします。&lt;/p&gt;&lt;p&gt;そうすると我々がファイル伝送プログラムを作成すると思えばどうでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ioからファイルを読み取ってbyte[]タイプに変換します。それをsocketを通って伝送します。受信側はsocketを通ってbyte[]タイプでデータを受け取ってそのままにioを利用してファイルを書き込んだらそれがファイル送受信プログラムになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;byte[](stream)のタイプは分かりました。そうするとプログラムの中で使う各種のデータタイプはどのようにbyte[]に変換するでしょう。&lt;/p&gt;&lt;p&gt;例えば、stringタイプで文字列のデータを入れてbyte[]に変換して格納すればそれがtextドキュメントになります。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1459&quot; data-filename=&quot;002.png&quot; style=&quot;width: 335px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;文字列はbyte[]に変換する時に扱うデータ値は決まっています。それがasciiコードということです。&lt;/p&gt;&lt;p&gt;過去、javaがある前のc言語時代にはpcが日本語はできなく、英語だけ使える時がありました。　その時には英語の大文字、小文字の52語、特殊文字まですべて128個の文字だけ使いました。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1465&quot; data-filename=&quot;003.png&quot; style=&quot;width: 502px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;asciiコードはすべて128個でcharタイプ(範囲: -128~127)の整数(0~127)部分で入れる文字です。それで文字列を扱う時にはcharタイプを使いました。&lt;/p&gt;&lt;p&gt;でも現在は英語だけではなく、日本語など様々な言語があります。&lt;/p&gt;&lt;p&gt;様々な言語をデータタイプをcharタイプで使おうと思えば足りないです。ひらがな、かたかなだけならできると思いますが、漢字まではbyte(unsigned char - つまり、符号がないchar範囲:0 ~ 255(2^8))では足りないです。&lt;/p&gt;&lt;p&gt;その為、各の国はbyteを組み合いにして言語コードを作りました。でも、これも世界標準を合わせなかったので、問題が発生します。&lt;/p&gt;&lt;p&gt;例えば、日本の製品に韓国のデータを入れると文字化けや読み込みができない時があります。(私の経験では昔のカーナビに韓国や中国のmp3(音楽ファイル)を入れるとファイル名が文字化けになる。)&lt;/p&gt;&lt;p&gt;なので、何処でも日本語で書いているドキュメントは日本語で表示するために文字コード標準化をしました。その標準化した文字コードはunicodeです。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1460&quot; data-filename=&quot;004.png&quot; style=&quot;width: 321px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このunicodeは2~4byteを使います。4byteなら2の32乗なので総4,294,967,296文字を扱うことができます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1464&quot; data-filename=&quot;005.png&quot; style=&quot;width: 322px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は6文字でunicode区分データ(2byte)と含めて18byteになります。日(2byte)本(2byte)語(3byte)で(2byte)す(2byte)。(3byte)&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1463&quot; data-filename=&quot;006.png&quot; style=&quot;width: 416px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;unicodeには基本2byteから表現するので、英語だけ作成しても既存asciiコードからサイズが2倍になります。つまり、既存asciiコートからunicodeに変換することでプログラム容量が2倍になったことです。&lt;/p&gt;&lt;p&gt;現在はハードディスクや容量が安くなったので、asciiコードをunicodeに使うことで発生するパフォーマンス差異は少ないですが、10年前だと急にデータサイズが2倍になるとコストが2倍以上に増加することなので、unicodeを必要性は知っていますが、使うのが簡単ではなかったです。製品の値段と関係があることですから。&lt;/p&gt;&lt;p&gt;そのため、また発表した文字コードがutf-8です。&lt;/p&gt;&lt;p&gt;utf-8の場合は1byteから6byteの可変データです。utf-8は既存asciiコードは1byteに表現します。&lt;/p&gt;&lt;p&gt;なので、既存の英語で作成した製品のパフォーマンスも維持して文字コードの標準化になった文字列コードです。なので、最近のすべての文字列コードは基本utf-8を使うことになりました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaでこのutf-8を扱う方法は簡単です。&lt;/p&gt;&lt;p&gt;stringにbyteを変換する時にパラメータにutf-8のstringデータを入れればutf-8形式のbyte[]タイプが生成します。&lt;/p&gt;&lt;p&gt;byteからstringタイプに変換する時にはbyteの形式がutf-8ならパラメータにutf-8を入れれば変換します。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1462&quot; data-filename=&quot;007.png&quot; style=&quot;width: 194px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;utf-8タイプをasciiタイプに変換すれば文字化けが発生します。当たり前ですが。。プログラムの中で文字化けが発生するのは100%に文字タイプ(characterset)が合わないからです。&lt;/p&gt;&lt;p&gt;文字列はbyte[]に変換することは了解します。&lt;/p&gt;&lt;p&gt;数字のデータはbyte[]タイプにどのように変換するでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムでよく使う数字のタイプはintタイプです。intタイプは基本に4byteのデータタイプです。&lt;/p&gt;&lt;p&gt;つまり、intタイプをbyte[]タイプに変換するとbyte[4]の配列になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このintタイプをbyteに変換するクラスはbytebufferがあります。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1458&quot; data-filename=&quot;008.png&quot; style=&quot;width: 248px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;byte[4]にintタイプのデータがあります。参考にintタイプをioによってファイルを作成すると10という値が表示することではありません。ioで10ということに作成するためにはstringタイプで10のデータを格納してbyte[]に変換することです。つまり、asciiコードなら49,48というデータです。&lt;/p&gt;&lt;p&gt;そうするとioではstringタイプだけ使うし、socketのデータもstringタイプでデータを扱えば別に他のタイプのデータはbyte[]に変換する必要がないと思います。&lt;/p&gt;&lt;p&gt;でも、ファイル伝送プログラムを作成する時、ファイルのサイズは受信側に教えてバッファーサイズを作成して待機することにします。でもstringタイプでサイズを教えば文字列(数字)の長さが違います。500なら3文字、5000なら4文字です。&lt;/p&gt;&lt;p&gt;でも、4byteに決めてintタイプで伝送すれば、受信側にも4byteで待機してファイル長さを受信できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、intタイプをbyte[4]に変換する時にも規約があります。それがエンディアンといいますが、byte配列の後ろからデータを満たすのはビックエンディアン(big endian)といいます。参考にc#の場合はbyte配列の前からデータを満たすのはリトルエンディアン(little endian)といいます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1461&quot; data-filename=&quot;009.png&quot; style=&quot;width: 231px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のリトルエンディアンはbyte[0]からデータを満たします。&lt;/p&gt;&lt;p&gt;エンディアンはintタイプだけではないです。stringタイプ以外の原始データはすべて変換できます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1457&quot; data-filename=&quot;010.png&quot; style=&quot;width: 472px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaで使う文字タイプ(characterset)とエンディアン(endian)で変換する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/68.html</guid><pubDate>Wed, 10 Mar 2021 15:37:24 +0900</pubDate></item><item><title>[Java] 27. ネットワーク通信(Socket)をする方法</title><link>https://www.nowonbun.com/67.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでネットワーク通信(socket)をする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムでソケットと言えばプログラムとプログラムまたはpcとpc間に通信をするという意味です。&lt;/p&gt;&lt;p&gt;簡単に思えば通信する時に伝送するパケット(データ)がパソコンのlanカードによってランケーブルに伝送します。ランケーブルに伝送したデータはdnsとルータなどを通って到達しようとpcのlanカードによって最終に目標したプログラムでパケット(データ)を読み込みます。端末と端末の間にデータを通信します。&lt;/p&gt;&lt;p&gt;この時、我々は各端末間にデータ変換や装置間のプロトコール、規約などに関して実装してないです。この通信規約に関してはすべてos側で設定して(osi7階層)、我々はその上で差し込んで使うという意味でsocket通信という言います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://ja.wikipedia.org/wiki/osi%e5%8f%82%e7%85%a7%e3%83%a2%e3%83%87%e3%83%ab&quot; target=&quot;_blank&quot;&gt;osi参照モデル&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;socket通信規約は処理プロシージャが決まっています。&lt;/p&gt;&lt;p&gt;先に、通信接続を待つ側をサーバという言います。サーバはportを開いてクライアントの接続を待ちます。そして接続する側をクライアントという言います。クライアントがサーバのipとportに接続したら通信が開始します。&lt;/p&gt;&lt;p&gt;サーバとクライアント間の通信はsend、receiveの形式でデータを送信、受信します。そして通信が終わればcloseで接続を切ります。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1449&quot; data-filename=&quot;001.gif&quot; style=&quot;width: 280px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのsocketの概念でjavaでソケット(socket)通信を作成みましょう。&lt;/p&gt;&lt;p&gt;先にはサーバを作成してwindowのtelentプログラムを利用して接続を確認します。確認できたらその仕様に合わせてclientを作成しましょう。&lt;/p&gt;&lt;p&gt;上のacceptはwhile(true)の無限ループに入れてクライアントを待機します。&lt;/p&gt;&lt;p&gt;クライアント接続すればスレッドプールにsocketを渡してクライアントからメッセージを待機します。&lt;/p&gt;&lt;p&gt;ここからsocketのstreamを受け取ってwrite、readを使うことになりますが、ioと同じロジックです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/66.html&quot; target=&quot;_blank&quot;&gt;[java] 26. ファイル(io)を扱う方法(ファイル作成、ファイル修正、アクセス日付変更とioをclose(リソース返却)する理由、closableインタフェース)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;起動すればコンソールにinitialize completeメッセージがコンソールに出力してlistenの状態になります。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1453&quot; data-filename=&quot;002.png&quot; style=&quot;width: 250px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;windowコンソールからtelnetに接続してメッセージを送信しましょう。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1450&quot; data-filename=&quot;003.png&quot; style=&quot;width: 269px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;telnetで127.0.0.1 9999に接続してhello worldを打ったらechoメッセージが受信することを確認できます。また、exitを打ったら接続が終了します。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1452&quot; data-filename=&quot;004.png&quot; style=&quot;width: 383px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サーバを確認すればクライアントが接続してメッセージを受け取って終了することまで確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サーバは完了しました。このサーバの仕様でクライアントを作成しましょう。&lt;/p&gt;&lt;p&gt;eclipseからは同時に二つのmainを実行することができないので、サーバはjarファイルでexportしてコンソールから実行します。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1451&quot; data-filename=&quot;005.png&quot; style=&quot;width: 399px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからeclipseからクライアントを実行して接続しましょう。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1454&quot; data-filename=&quot;006.png&quot; style=&quot;width: 580px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;接続が正常になりました。&lt;/p&gt;&lt;p&gt;メッセージを送ったらechoメッセージも正常に受信します。exitをすればサーバと接続が切れました。その後に正常に終了します。エラーexceptionが発生しましたが、正常終了で発生したものです。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1455&quot; data-filename=&quot;007.png&quot; style=&quot;width: 481px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サーバからも正常接続、メッセージ、終了まで確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サーバとクライアントソースをみれば差異が多くないです。サーバはserversocketインスタンスを生成して接続すればsocketインスタンスを受け取ります。&lt;/p&gt;&lt;p&gt;クライアントからsocketインスタンスを生成して接続します。つまり、socketから送信、受信はsocketクラスから行います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでネットワーク通信(socket)をする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/67.html</guid><pubDate>Tue, 9 Mar 2021 19:09:21 +0900</pubDate></item><item><title>[Java] 26. ファイル(IO)を扱う方法(ファイル作成、ファイル修正、アクセス日付変更とIOをclose(リソース返却)する理由、Closableインタフェース)</title><link>https://www.nowonbun.com/66.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでファイル(io)を扱う方法(ファイル作成、ファイル修正、アクセス日付変更とioをclose(リソース返却)する理由、closableインタフェース)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;itでi/oという意味はinput/outputということで入力装置、出力装置という意味です。入力装置とはマウス、キーボードなどのパソコンにデータを入力する装置という意味だし、出力装置とはモニター、プリンターなどの出力する装置という意味です。&lt;/p&gt;&lt;p&gt;でも、プログラムでi/oという意味はファイルを作成、読み込みなどのファイル扱うことという意味です。少し違いますね。&lt;/p&gt;&lt;p&gt;プログラムで一番よく使うリソースはソケット(通信)とファイル(i/o)でファイルを作成、読み込みは重要な領域です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、データを処理する装置ということはcpuがあるし、一時的にデータを格納するメモリがあります。&lt;/p&gt;&lt;p&gt;cpuはデータを計算する機能しかないし、メモリはデータを格納する機能だけありますが、プログラムが終了するとデータは自動に削除されるので、プログラムでデータを記録する装置が必要です。プログラム終了と関係ない装置がハードディスクということがあります。&lt;/p&gt;&lt;p&gt;ファイルをハードディスクに格納するためにはメモリ構造のstackとheap構造からbinaryタイプに変換しなければならないです。またはcpuとメモリの速度は速いですが、ハードディスクを遅いので、その速度の差を合わせるリソース管理(コネクション)が必要です。その機能があるリソースライブラリをioということになります。&lt;/p&gt;&lt;p&gt;ioで使うデータタイプはbyte(unsigned char)です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、stringになっているデータをファイルに格納しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1445&quot; data-filename=&quot;001.png&quot; style=&quot;width: 335px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を確認すればdドライブのworkディレクトリのtest.txtファイルにhello worldというstringタイプのデータを作成しました。&lt;/p&gt;&lt;p&gt;ここでfileクラスとoutputstreamインタフェースを継承したfileoutputstreamを使いました。&lt;/p&gt;&lt;p&gt;fileクラスはファイルのメーター情報があるクラスです。ファイルの内容よりファイルが作成した時間、ファイルのサイズなどの情報があります。javaのbyteの配列でデータを作成しましたが、そのデータはメモリのheapにあるので、一列になっているかを分からないです。つまり、論理的にプログラム上では配列ですが、メモリ上では分からないという意味です。&lt;/p&gt;&lt;p&gt;なので、データを一列に並べる概念が必要ですが、それがstreamということです。&lt;/p&gt;&lt;p&gt;改めてまとめるとbyte[]のデータをメモリ上にbyte[0]から順番並びでデータを作成することです。&lt;/p&gt;&lt;p&gt;ioはメモリと性能差異が存在するので、それを合わせる機能が必要ですが、それがコネクションです。つまり、ファイル作成が終わったらリソースを返却してプログラムのパフォーマンスを戻せなければならないです。&lt;/p&gt;&lt;p&gt;この内容に関しては後で詳しく説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイルを作成したので、今回はファイルを呼び込んでコンソール出力しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1441&quot; data-filename=&quot;002.png&quot; style=&quot;width: 285px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はinputstreamを利用してファイルからデータを読み込んでコンソールに出力しました。&lt;/p&gt;&lt;p&gt;または、fileクラスを利用してファイルの情報も変更しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1446&quot; data-filename=&quot;003.png&quot; style=&quot;width: 359px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;作成日付、更新日付、最後にアクセスした日付がすべて2000年度に変更されました。&lt;/p&gt;&lt;p&gt;fileクラスを利用すれば更新日付は修正可能ですが、作成日付と最後にアクセスした日付はfilesのクラスを利用してsetattribute関数で変更しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイルioはプログラムでcpuとメモリリソースではなく、ハードディスクのリソースを利用することです。&lt;/p&gt;&lt;p&gt;ハードディスクのリソースは一つのプログラムが独占して使うことではなく、様々なプログラムが同時に使うリソースです。また、このリソースの速度はメモリとハードディスク間に差異があります。&lt;/p&gt;&lt;p&gt;その差異をなくして、書き込む時に一時的にファイルをロックを掛けるためにコネクションの概念があります。つまり、ファイルをコネクションする間には速度が遅いハードディスクに合わせるし、他のプログラムからアクセスできないような概念です。&lt;/p&gt;&lt;p&gt;なので、ファイルの使いが終われば、コネクションリソースを返却してロックなどを戻さなければならないです。&lt;/p&gt;&lt;p&gt;上のソースを実行すればoutputstreamでファイルのコネクション(connection)を繋ぎままにシステムを止まりました。&lt;/p&gt;&lt;p&gt;つまり、io connectionが繋いでいる状況でプログラムを終了しないし、リソース返却もしない状況です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この状況でメモ帳から当該なファイルを開いて修正しようと思えばエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1443&quot; data-filename=&quot;004.png&quot; style=&quot;width: 519px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、connectionが繋いでいる状況ならほかのプログラムでアクセスができないことという意味です。&lt;/p&gt;&lt;p&gt;上の例は簡単なプログラムなのでcloseの呼び出しを忘れてもプログラムが終了すれば自動にすべてのリソースが返却します。でも、プログラムが終了しないサーバの場合はcloseの呼び出しを忘れたらどのようになるでしょう？&lt;/p&gt;&lt;p&gt;最悪ならサーバが終了する前まで他のプロセスからアクセスができないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このコネクション(connection)みたいにcloseが必要なクラスはclosableインタフェースを継承して必ずclose関数を呼び出します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1444&quot; data-filename=&quot;005.png&quot; style=&quot;width: 621px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1447&quot; data-filename=&quot;006.png&quot; style=&quot;width: 560px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;closableインタフェースを継承したクラスは自動にclose関数を呼び出せる方法があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1442&quot; data-filename=&quot;007.png&quot; style=&quot;width: 335px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースみたいにtryのifの条件文にclosableインタフェースを継承したクラスタイプのインスタンスを入れればスタック領域が自動にclose関数を呼び出します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1448&quot; data-filename=&quot;008.png&quot; style=&quot;width: 335px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでファイル(io)を扱う方法(ファイル作成、ファイル修正、アクセス日付変更とioをclose(リソース返却)する理由、closableインタフェース)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/66.html</guid><pubDate>Thu, 4 Mar 2021 19:27:19 +0900</pubDate></item><item><title>[Java] 25. Objectクラス(notify、waitの使い方)</title><link>https://www.nowonbun.com/65.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのobjectクラス(notify、waitの使い方)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿で再定義(override)に関して説明した時に、hashcodeとequals、tostringに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/51.html&quot; target=&quot;_blank&quot;&gt;[java] 11. stringのhashcodeとequals、そしてtostringの再定義(override)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaの最小の単位がクラスになっています。つまり、実行関数のmain関数だけを作ろうと思ってもクラスを作ってその中でstatic void mainで実行関数を作成します。&lt;/p&gt;&lt;p&gt;その最小単位のクラスが基本的にobjectクラスを継承しています。つまり、extentsで継承をしてなくても基本的にobjectを継承していると思えばよいです。&lt;/p&gt;&lt;p&gt;そうなら、javaは複数の継承ができないですが、その他のクラスを継承したら複数継承になるかと思いますが、すべてのクラスがobjectクラスを継承しているので複数継承ではなく、継承の継承になったことです。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1439&quot; data-filename=&quot;001.png&quot; style=&quot;width: 106px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうならすべてのクラスがobejctクラスを継承しているのでobjectクラスに関して整理する必要があります。&lt;/p&gt;&lt;p&gt;objectクラスは総11個の関数で構成しています。内部のメンバー変数はありません。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;関数&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;public final native class&amp;lt;?&amp;gt; getclass()&lt;/td&gt;        &lt;td&gt;オブジェクトのクラスタイプをリターンする。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;public native int hashcode();&lt;/td&gt;        &lt;td&gt;オブジェクトのアドレスの値をハッシュ値でリターンする。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;public boolean equals(object obj)&lt;/td&gt;        &lt;td&gt;オブジェクトのアドレス値を比較して同じならtrue、違いならfalseをリターン&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;protected native object clone()&lt;/td&gt;        &lt;td&gt;オブジェクトをコピーする。単純なアドレス値のコピーではなくクラスのインスタンスをコピーすること。&lt;br&gt;クラスコピーのためにインタフェースcloneableを継承しなければならない。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;public string tostring()&lt;/td&gt;        &lt;td&gt;現在のオブジェクトのstringをリターンする。&lt;br&gt;基本の値はgetclass().getname() + &quot;@&quot; + integer.tohexstring(hashcode())です。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;public final native void notify()&lt;/td&gt;        &lt;td&gt;waitになったスレッドを再開する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;public final native void notifyall()&lt;/td&gt;        &lt;td&gt;waitなったすべてのスレッドを再開する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;public final void wait()&lt;/td&gt;        &lt;td&gt;スレッドを停止する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;public final native void wait(long timeoutmillis)&lt;/td&gt;        &lt;td&gt;設定した時間ほどスレッドを停止する。値が0の場合、notifyが呼び出すまで停止する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;public final void wait(long timeoutmillis, int nanos)&lt;/td&gt;        &lt;td&gt;設定した時間ほどスレッドを停止する。値が0の場合、notifyが呼び出すまで停止する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;protected void finalize()&lt;/td&gt;        &lt;td&gt;gc(garbage collection)でオブジェクトを削除すると呼び出す。java 9以上にはもう使わない。(deprecated)&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;まず、getclassとhashcode、equals、clone、tostringに関して説明します。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1437&quot; data-filename=&quot;002.png&quot; style=&quot;width: 256px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで注意することはequalsと演算子==はhashcodeの値を確認します。つまり、クラスの中のデータがデータが同じでも、生成したインスタンスが違いならfalseをリターンします。&lt;/p&gt;&lt;p&gt;参考にstringの場合はhashcodeが再定義しているのでhashcode関数は必ずメモリアドレス値ではありません。つまり、hashcode関数を再定義すると別の値をリターンする関数になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;次はnotifyとwaitの機能です。&lt;/p&gt;&lt;p&gt;以前スレッドに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/62.html&quot; target=&quot;_blank&quot;&gt;[java] 22.スレッド(thread)を使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/64.html&quot; target=&quot;_blank&quot;&gt;[java] 24. javaの同期化(synchronized)とデッドロック(deadlock)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;個のスレッド環境で値を同期化する時にsynchronizedを使います。でもこの同期化する時にもっと細かく運用する時があります。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1440&quot; data-filename=&quot;003.png&quot; style=&quot;width: 341px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば二つのスレッドが順番に呼び出すことを確認できます。&lt;/p&gt;&lt;p&gt;先にthread1から先にnotifyしてprint関数を呼び出してコンソール出力します。そしてsynchronizedスタック領域の中でwaitを呼び出します。参考にnotifyとwaitはsynchronizedのスタック領域の中で使う関数です。&lt;/p&gt;&lt;p&gt;その間に、thread2はforのsynchronized(this)が待機していますが、thread1でwait関数を呼び出したらthread2のロックが解けます。&lt;/p&gt;&lt;p&gt;thread2がsynchronized(this)に進入するとnotifyを呼び出します。&lt;/p&gt;&lt;p&gt;thread1のwait関数は解けてsynchronizedのロックによって待機状況になります。また、thread2がwait関数によってスレッドが止まったらthread1は動きます。&lt;/p&gt;&lt;p&gt;notifyとnotifyallの差異はnotifyはqueueの順番で先にwaitになったスレッド一つが解けることですが、notifyallはwaitになったすべてのスレッドが解けます。&lt;/p&gt;&lt;p&gt;waitで時間を設定してnotifyの呼び出しがなくても時間で解けることができます。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1438&quot; data-filename=&quot;004.png&quot; style=&quot;width: 309px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;thread.sleepと似てますが、wait関数は他の同期化に影響になる関数なので差異があります。&lt;/p&gt;&lt;p&gt;参考 - &lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/lang/object.html&quot; target=&quot;_blank&quot;&gt;https://docs.oracle.com/javase/7/docs/api/java/lang/object.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのobjectクラス(notify、waitの使い方)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/65.html</guid><pubDate>Wed, 3 Mar 2021 18:00:38 +0900</pubDate></item><item><title>[Java] 24. Javaの同期化(Synchronized)とデッドロック(Deadlock)</title><link>https://www.nowonbun.com/64.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaの同期化(synchronized)とデッドロック(deadlock)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にスレッドに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/62.html&quot; target=&quot;_blank&quot;&gt;[java] 22.スレッド(thread)を使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/63.html&quot; target=&quot;_blank&quot;&gt;[java] 23. スレッドプール(threadpool)を使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドというのは簡単に説明するとメインプロセスから独立な処理領域を生成して並列処理することという意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1434&quot; data-filename=&quot;001.png&quot; style=&quot;width: 394px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はスレッドの各領域から0から9までのコンソール出力の例です。別に問題があることではありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1432&quot; data-filename=&quot;002.png&quot; style=&quot;width: 272px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで0から９まで足すと45の値になります。それをスレッドで2回に実行したから予想値は90になると思いますが、69という値が出力しました。理由は並列処理せいで発生して上の現象みたいになります。&lt;/p&gt;&lt;p&gt;つまり、nodeインスタンスからgetdataでデータを取得してiの値を足します。始めのスレッドでgetdataで取得してデータが0でiの値が1といえばsetdataする時にnodeのデータは1になります。&lt;/p&gt;&lt;p&gt;でも二つ目のスレッドには始めのスレッドのgetdataしてsetdataするまで待てないです。同時にgetdataして各スレッドでsetdataで1を格納すれば1足す計算は2回しましたが、結果は1になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドの中でコンソール出力して確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1435&quot; data-filename=&quot;003.png&quot; style=&quot;width: 411px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;iが1の時に始めのスレッドのgetdataから1の値を取得して二つ目のスレッドのgetdataからは2の値を取得します。でもiが2の時には始めと二つ目のスレッドのgetdataからは4のデータを取得します。&lt;/p&gt;&lt;p&gt;つまり、二つのスレッドで同期化になってないのでこの問題が発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;同期化すれば問題がなくなります。nodeインスタンスに関してlockを設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1436&quot; data-filename=&quot;004.png&quot; style=&quot;width: 384px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;runnableのラムダー式の中でsynchronizedのキーワードを使いました。&lt;/p&gt;&lt;p&gt;synchronizedは並列処理するスレッドで特定なobjectに関して同期化するキーワードです。つまり、nodeインスタンスで設定したsynchronizedスタック領域に進入すると他のnodeインスタンスで設定したsynchronizedにはsynchronizedが終わるまで待って進入したsynchronized領域処理が終われば進入します。&lt;/p&gt;&lt;p&gt;つまり、synchronizedの領域の中のgetdataとsetdata、コンソール出力まではスレッド同期化になって直列処理になります。&lt;/p&gt;&lt;p&gt;なので上みたいに90の値を取得します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この同期化(synchronized)はマルチスレッド環境で値を同期してデータを一貫的にできますが、プログラム設計が間違ってすればロックによってお互いにリソースを待機する状況のデッドロックになる可能性があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1433&quot; data-filename=&quot;005.png&quot; style=&quot;width: 257px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はiが3の時にデッドロックに掛けて処理が止まりました。&lt;/p&gt;&lt;p&gt;始めのスレッドはsum関数でnode1とnode2を入れました。二つ目のスレッドにはnode2とnode1を入れました。&lt;/p&gt;&lt;p&gt;そうすると始まのスレッドにはsynchronized(node1)にロックを掛けて同時に二つ目のスレッドではsynchronized(node2)にロックを掛けます。&lt;/p&gt;&lt;p&gt;次に始めのスレッドでsynchronized(node2)に進入しようと思えば二つ目のスレッドのロックを待つことにするし、二つ目のスレッドにはsynchronized(node1)に進入しようと思えば始めのスレッドを待つ状況になります。&lt;/p&gt;&lt;p&gt;つまり、二つのスレッドでお互いに待つ状況になってデッドロック(deadlock)になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このデッドロックにならないためにはルールがありますが、同期化(synchronized)の中で同期化(synchronized)に作成しなければ可能です。&lt;/p&gt;&lt;p&gt;でも、この状況が簡単にできることではないです。上の例は私が理解しやすくために簡単に作成しましたが、関数の関数で作成すれば同期化(synchronized)の中で同期化(synchronized)になったかを確認しにくいです。&lt;/p&gt;&lt;p&gt;上の例はsum関数の中でadd関数を分離しました。そうすると同期化(synchronized)の中で同期化(synchronized)がよく見えないです。&lt;/p&gt;&lt;p&gt;どうでも同期化(synchronized)の中で同期化(synchronized)で作成することになったら同期化(synchronized)のインスタンスを一つで統一する方法もあります。&lt;/p&gt;&lt;p&gt;つまり、static変数を一つ宣言してlock用なインスタンスで使う方法もあります。この方法はパフォーマンスが悪くなる可能性がありますが、デッドロックを確実に避けることができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;同期化(synchronized)のスタック領域を広く設定することでパフォーマンスが遅くなることではありませんが、同期化(synchronized)の中の処理が遅いなら全般的にパフォーマンスが遅くなります。&lt;/p&gt;&lt;p&gt;なので、確実に同期化が必要な領域だけ同期化(synchronized)のスタック領域設定すればデッドロックを確実に避ける方法です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1436&quot; data-filename=&quot;004.png&quot; style=&quot;width: 384px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;add関数に同期化(synchronized)を宣言してnode1とnode2を同期化しました。注意点は関数の中で他の同期化(synchronized)がないようにすることです。&lt;/p&gt;&lt;p&gt;そうするとデッドロックを避けることができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaの同期化(synchronized)とデッドロック(deadlock)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/64.html</guid><pubDate>Tue, 2 Mar 2021 20:21:28 +0900</pubDate></item><item><title>[Java] 23. スレッドプール(Threadpool)を使う方法</title><link>https://www.nowonbun.com/63.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでスレッドプール(threadpool)を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でjavaでスレッドを使う方法に関する説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/62.html&quot; target=&quot;_blank&quot;&gt;[java] 22.スレッド(thread)を使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドは別に制限がなく、生成するたびに生成されます。例えばfor文で1から100まで繰り返しを作ってスレッドを生成すればスレッドは100個まで生成されます。&lt;/p&gt;&lt;p&gt;適切なスレッド個数で並列処理するとかなり早い演算処理をしますが、我々のハードウェアは物理的な容量の限界があるので、無限にスレッドを生成することでプログラムのパフォーマンスが速くなることではないです。つまり容量の限界が届くとスレッドの管理するリソースのせいでメモリやシステムリソースがいっぱいになってシングルスレッド(main threadだけ）より遅くなる結果になります。&lt;/p&gt;&lt;p&gt;javaではプログラムではなく、システムによってスレッド個数を管理して運用するライブラリがあり、それがスレッドプール(threadpool)ということです。&lt;/p&gt;&lt;p&gt;スレッドプール(threadpool)とはプール(pool)の中でスレッドを生成してそのプールのなかでスレッドの個数やリソース、運用メモリなどを管理することです。&lt;/p&gt;&lt;p&gt;または、スレッド個数を管理することもありますが、スレッド再使用率を管理して全般的なパフォーマンスも管理します。プログラム中でスレッドを生成、消滅することでかなり時間がかかります。実はスレッドだけではなく、リソース系オブジェクトは生成や消滅が時間がかかりますね。&lt;/p&gt;&lt;p&gt;でも、スレッドプールではスレッドを先に生成してスレッドを呼ばれたら生成されたオブジェクトに載せて使うことでスレッド生成、消滅時間が守ります。つまり、ただのスレッドを使うことよりスレッドプールを利用してスレッド再使用率は上げることで全般的にシステムパフォーマンスが改善することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1430&quot; data-filename=&quot;001.png&quot; style=&quot;width: 442px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上はスレッドプールの中で一つのスレッドだけあるスレッドプールです。結果をみればスレッドを何回に呼ばれても順番でスレッドが実行されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1428&quot; data-filename=&quot;002.png&quot; style=&quot;width: 591px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のスレッドはスレッド個数の制限がないスレッドプールです。スレッド個数の制限がないので、別にプールを使わなく、ただのnew threadでインスタンス生成して使うことと同じ感じなスレッドプールです。ただ、スレッドプールの中でスレッドを実行するので、リソース管理ができることだけかな。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1427&quot; data-filename=&quot;003.png&quot; style=&quot;width: 642px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッド二つだけに使うスレッドプールを生成したので、結果をみれば始めにスレッドを2つを使います。後、スレッドの処理が終われば続けてスレッドが実行されることを確認できます。&lt;/p&gt;&lt;p&gt;その以外にnewscheduledthreadpool、newworkstealingpoolがありますが、よく使わないし、私も使ったことがないので他のプールと差異はよく分かりませんね。&lt;/p&gt;&lt;p&gt;上の例のthreadproolではexecute関数を使います。execute関数にはパラメータがインタフェースrunnableを使うのでラムダ式で作成することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でもスレッドプールの中では様々なスレッドが並列で実行されているので、スレッドのすべての結果を得るためにはスレッド同期化が必要です。javaではsumbit関数を使ってリターンの値を得られます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1431&quot; data-filename=&quot;004.png&quot; style=&quot;width: 701px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;callableインタフェースはジェネリックタイプでリターンタイプを決め、リターン値を計算できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1429&quot; data-filename=&quot;005.png&quot; style=&quot;width: 570px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はexecuteやsubmitのどっちを使っても構いません。executeの関数で変数をクロージャ機能を利用して値を共有してもいいです。でもクロージャ機能がソースの中で多いなら可読性が落ちるので使い方法に合わせて使ったほうがよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;改めてまとめます。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th&gt;スレッド種類&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;	  &lt;tr&gt;        &lt;td&gt;newsinglethreadexecutor&lt;/td&gt;	    &lt;td&gt;一つのスレッドを使うスレッドプール&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;newcachedthreadpool&lt;/td&gt;	    &lt;td&gt;個数の制限がないスレッドプール&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;newfixedthreadpool&lt;/td&gt;	    &lt;td&gt;個数を指定して使うスレッドプール&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;newscheduledthreadpool&lt;/td&gt;	    &lt;td&gt;特定時間を決めて使えるスレッドプール&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;newworkstealingpool&lt;/td&gt;	    &lt;td&gt;1.8から使えるスレッドプールですが、完全なparallel形(並列処理)で使えるスレッドプールです。&lt;/td&gt;	  &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;そしてスレッドプールでスレッドを呼び出せる関数が二つがあります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;width:150px&quot;&gt;関数名&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;execute&lt;/td&gt;		&lt;td&gt;パラメータはrunnableインタフェースタイプでリターン値は無し。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;submit&lt;/td&gt;		&lt;td&gt;パラメータはrunnableインタフェースタイプとcallableインタフェースタイプがオーバーロードされているので、リターンタイプがvoidやジェネリックタイプによるオブジェクトタイプやどっちでも可能。&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;スレッドプール終了するために関数は三つがあります。&lt;/p&gt;&lt;p&gt;一般的にはshutdown関数でスレッドプール中でスレッドが終了するとスレッドプールを終了する関数です。&lt;/p&gt;&lt;p&gt;shutdownnowの場合はスレッドプールのスレッドの状況は関係しずに、スレッドプールを終了することです。awaitterminationは時間の間に終了しなければ強制終了する関数です。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th&gt;関数名&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;shutdown&lt;/td&gt;		&lt;td&gt;スレッドプール中でスレッドが終了するとスレッドプールを終了&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;&lt;p&gt;shutdownnow&lt;/p&gt;&lt;/td&gt;		&lt;td&gt;スレッドプールのスレッドの状況は関係しずに、スレッドプールを終了&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;awaittermination&lt;/td&gt;		&lt;td&gt;時間の間に終了しなければ強制終了する関数&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;ここまでjavaでスレッドプール(threadpool)を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/63.html</guid><pubDate>Tue, 16 Feb 2021 18:45:06 +0900</pubDate></item><item><title>[Java] 22.スレッド(Thread)を使う方法</title><link>https://www.nowonbun.com/62.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのスレッド(thread)を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッド(thread)とはプロセスの中で動いている最小の実行単位ということに定義させています。&lt;/p&gt;&lt;p&gt;プロセスとは我々がプログラムを実行して終了する時まで一連の処理ロジックという意味です。&lt;/p&gt;&lt;p&gt;改めてまとめるとプロセスの中では様々でスレッドを持つことができます。つまり、プロセスの中では並列に様々な実行単位を実行することができます。&lt;/p&gt;&lt;p&gt;説明が難しいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、簡単な繰り返しのロジックで1から10までコンソールに出力するプログラムを作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1421&quot; data-filename=&quot;001.png&quot; style=&quot;width: 313px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の実行関数ではfor文を実行してコンソールに出力してまたfor文で1から10まで値をコンソールに出力します。&lt;/p&gt;&lt;p&gt;全然問題がないソースです。&lt;/p&gt;&lt;p&gt;でも私は上の二つのfor文を順番ではなく、同時に処理したいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1425&quot; data-filename=&quot;002.png&quot; style=&quot;width: 303px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみればコンソール結果が順番とおりに出ることではなく、threadのrun関数とfor文の繰り返しが同時に実行されることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドを使えば様々の処理を同時に処理できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1422&quot; data-filename=&quot;003.png&quot; style=&quot;width: 302px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は2から9までの倍数の合算を出力する例です。こんな簡単な処理式はthreadを使ってなくても早くできますが、threadを使ったら同時に処理するのでもっと早くできます。(参考にthreadのインスタンスの生成時間があるので、必ずthreadや並列処理が速いことではありません。)&lt;/p&gt;&lt;p&gt;つまり、データベースの多いデータを処理する時にスレッドを使ったらもっと早く処理することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッド(thread)とはメインプロセスから独立でスレッドを作って実行される並列処理だと説明しました。でも、仕様によってメインプロセスからスレッドの計算を待てなければならないことがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1424&quot; data-filename=&quot;004.png&quot; style=&quot;width: 266px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースはthread中で0から99まで足す関数を呼び出しますが、メインプロセスで結果を見ると0です。&lt;/p&gt;&lt;p&gt;理由は並列処理なのでコンソール出力する時にスレッドのforの繰り返し文がまだ実行されてないからです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならスレッドが終わらなければならないですが、その時に使う関数がjoinです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1423&quot; data-filename=&quot;005.png&quot; style=&quot;width: 273px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;join関数はスレッドを呼び出したところから呼び出すことができる関数です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドをただ並列の処理だけではなく、どの時間間にスレッドを止まることもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1426&quot; data-filename=&quot;006.png&quot; style=&quot;width: 348px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;thread.sleepはスレッド内部でスレッドを止まる関数です。パラメータはミリ秒基準で1000が1秒になります。&lt;/p&gt;&lt;p&gt;上のソースは現在の時間をコンソールに出力しましたが、1秒単位でスレッドを止まることにするから1秒たびにコンソールに現在時間が出力する結果になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドはプロセスを並列処理が可能にするリソースです。並列処理はプログラムのパフォーマンス改善に効果がありませうが、いつもそんなことではありません。&lt;/p&gt;&lt;p&gt;一応、スレッドを生成することが速くありません。つまり、処理するデータ量が少ないか簡単な数式計算ならスレッドを生成しなくてプロセス側で処理することがもっと早くなります。&lt;/p&gt;&lt;p&gt;スレッドはプログラムで管理するリソース種類です。つまり、スレッドを生成や解除を管理しなければならないものです。スレッドが多くなると管理が難しくなるし、可読性にもよくないです。&lt;/p&gt;&lt;p&gt;そのことまでを考えて使えなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのスレッド(thread)を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/62.html</guid><pubDate>Wed, 10 Feb 2021 17:45:24 +0900</pubDate></item><item><title>[Java] 21. アノテーション(Annotation)を使う方法</title><link>https://www.nowonbun.com/61.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのアノテーション(annotation)を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaのアノテーション(annotation)とはクラスやメソッド、変数なのでメタデータ、データの定義を設定するデータという意味です。&lt;/p&gt;&lt;p&gt;つまり、アノテーションのデータはプログラム実装では影響がなくて、クラスやメソッド、変数を区分するためのデータだと言えます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アノテーションはアットマーク(@)を利用して設定することができます。&lt;/p&gt;&lt;p&gt;javaでよく使うアノテーションはoverride、deprecatedがあります。&lt;/p&gt;&lt;p&gt;overrideはクラスを継承して再定義する時に設定するアノテーションです。deprecatedはメソッドを削除すると既存に継承したクラスでエラーが発生するため、メソッドを削除もできなくて、ただ使用をお勧めしないのことをお知らせする時に使うアノテーションです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1418&quot; data-filename=&quot;001.png&quot; style=&quot;width: 401px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;@functionalinterfaceのアノテーションを使ったインタフェースは関数を二つに作成するとエラーが発生することを確認できます。&lt;/p&gt;&lt;p&gt;printの関数は取り消し線があります。@deprecatedのアノテーションの影響で関数を呼び出すことをすればwarningメッセージが表示します。　testの関数はint aaa=0;がありますが、@suppresswarningsが無ければ、unusedのwarningメッセージが出ます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のことはjavaで提供するアノテーションです。アノテーションは開発者が作成することもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1419&quot; data-filename=&quot;002.png&quot; style=&quot;width: 161px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アノテーションはプログラム実行することでは影響がありません。ただ、メタデータとして様々なクラスと関数、変数を区分するための情報として使うことができます。&lt;/p&gt;&lt;p&gt;アノテーションを生成する時に、@targetアノテーションは使う区分を設定、@retentionは設定するポジションを設定することができます。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;タイプ&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td colspan=&quot;2&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;@target&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;type&lt;/td&gt;        &lt;td&gt;クラス、インタフェース、enumなどに設定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;field&lt;/td&gt;        &lt;td&gt;メンバー変数に設定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;method &lt;/td&gt;        &lt;td&gt;メソッドに設定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;parameter&lt;/td&gt;        &lt;td&gt;関数のパラメータに設定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;constructor&lt;/td&gt;        &lt;td&gt;コンストラクタに設定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;local_variable&lt;/td&gt;        &lt;td&gt;ロカール変数に設定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;annotation_type&lt;/td&gt;        &lt;td&gt;アノテーションに設定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;package&lt;/td&gt;        &lt;td&gt;パッケージに設定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;type_parameter&lt;/td&gt;        &lt;td&gt;ジェネリックタイプに設定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;package &lt;/td&gt;        &lt;td&gt;すべてのところで設定可能&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td colspan=&quot;2&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;@retention&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;source&lt;/td&gt;        &lt;td&gt;ソース上だけ使うメタデータ情報。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;class&lt;/td&gt;        &lt;td&gt;.classファイルにはあるが、runtime(実行中)には見えない。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;runtime&lt;/td&gt;        &lt;td&gt;runtime(実行中)にも参照可能。 reflectionを通ってクラスやメソッド区分ができます。&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;その以外に@inheritedの設定はクラスを継承する時にアノテーションメタデータ情報も継承するという意味です。@documentedはjava docを生成する時にメタデータ情報を含めるというアノテーション情報です。&lt;/p&gt;&lt;p&gt;私の個人の考えはreflection機能ではなければ別にアノテーションを使うことがないと思います。reflectionでアノテーションをよってクラスを探索やメソッドを探索することが必要なので、それのためには必要です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1420&quot; data-filename=&quot;003.png&quot; style=&quot;width: 182px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればreflectionでアノテーションが設定している関数だけ呼び出すことができます。&lt;/p&gt;&lt;p&gt;つまり、アノテーションでstrategyパターン(戦略パターン)、facade patternパターンを実装することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その以外にeclipseみたいにideツールやjankinsのciツールなどで使うためのアノテーションです。&lt;/p&gt;&lt;p&gt;ただ、コメントとしてアノテーションを作成するのは逆にソースの可読性を悪くなることがあるので、コメントと区分して使えばよいと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのアノテーション(annotation)を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/61.html</guid><pubDate>Wed, 27 Jan 2021 14:19:59 +0900</pubDate></item><item><title>[Java] 20. iterator(for-each)とStream APIを使う方法</title><link>https://www.nowonbun.com/60.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでiterator(for-each)とstream apiを使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;オブジェクト指向(oop)でデータをオブジェクト化すると、よく使うアルゴリズムはlistとmapだと思います。&lt;/p&gt;&lt;p&gt;listとmapをよく使う理由はデータの探索がしやすいし整列、データ分類などがしやすいからだと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;listを探索する時にfor文などを使ってi=0からsizeまで比較する方法でよく使うと思います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1417&quot; data-filename=&quot;001.png&quot; style=&quot;width: 248px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リストにデータを格納して奇数のデータはfor文とif文を組み合わせて抽出しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このリスト形式のデータはデザインパターンによるiteratorパターンになってnextとhasの関数を利用してデータを取得することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1417&quot; data-filename=&quot;001.png&quot; style=&quot;width: 248px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;for文ではなく、while文を使って繰り返しの形が変わりましたが、ステップが減らしたことではないです。逆にlist.iterator()の処理項目が増えてもっと難しいプログラムみたいに見えます。&lt;/p&gt;&lt;p&gt;でも、for(for-each)文を使って簡単に作成することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1417&quot; data-filename=&quot;001.png&quot; style=&quot;width: 248px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リストをfor文で探索すると初期値や増加値がいらないです。つまり、もっと簡単に作成することができるという意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stream apiに関して説明します。&lt;/p&gt;&lt;p&gt;streamという意味はプログラムでは連続的な値の配列の意味です。&lt;/p&gt;&lt;p&gt;例えば、一つの動画のファイルを見るときに一つのbyteの値を見れば全然意味がないですね。でもそのbyteのデータが集まって一つの意味があるファイルになって動画がプレイーすることができます。&lt;/p&gt;&lt;p&gt;javaにはこの連続なデータつまり、配列やlist、mapをもっとしやすく使えるapi(application provider interface)がありますが、それがstream　apiです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でlistからdataが奇数値だけ分類する時にfor-each文を使ってifで比較して格納しました。&lt;/p&gt;&lt;p&gt;これをstreamのfilterを使えば簡単になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1417&quot; data-filename=&quot;001.png&quot; style=&quot;width: 248px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ソースのステップが最初より確実に減らしました。可読性もよくなりました。返却値も新しいリストでリターンするので、元のデータにも影響がありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1414&quot; data-filename=&quot;002.png&quot; style=&quot;width: 340px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stream式はチェインメソッドパターン式でstream式を再使用することが可能し、filter関数を何回も付けることができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1415&quot; data-filename=&quot;003.png&quot; style=&quot;width: 383px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;並列処理はスレッドと関係がある部分です。&lt;/p&gt;&lt;p&gt;簡単に説明するとfor文でリストを処理する時に順番とおりにget(0)からget(list.size()-1)まで取得することができます。&lt;/p&gt;&lt;p&gt;でも、仕様によって順番通りに処理する必要がなくて、並列に処理してパフォーマンス改善する時があります。streamのパラレルスレッドはpcの性能によって自動に生成します。でも、順番通りに処理することではなく、同時に処理することなので、順番が必要な処理では問題がなる可能性があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stream式はsort関数もあります。ただ、二つの値をcompare関数を利用して昇順、降順で並べることもできます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/175.html&quot; target=&quot;_blank&quot;&gt;[java] compare関数を使う方法&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1416&quot; data-filename=&quot;004.png&quot; style=&quot;width: 243px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;listに値があるかどうかも確認できます。元々、listのクラスにはcontains関数があります。&lt;/p&gt;&lt;p&gt;contains関数にはただイコール(=)のデータだけ検索するので、原始データタイプはできるかもしれませんが、クラスタイプは比較ができないです。なのでstream apiのanymatchを利用すれば簡単にできます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stream apiの関数はすごく多いです。&lt;/p&gt;&lt;p&gt;それを全部ここで説明しようと思えば無理です。なので実務でよく使うもの(filter、sorted、findfirst、anymatch)を説明しました。&lt;/p&gt;&lt;p&gt;もしかして、その以上の関数の使い方を知りたいなら下記のjavadocを確認してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/util/stream/stream.html&quot; target=&quot;_blank&quot;&gt;https://docs.oracle.com/javase/8/docs/api/java/util/stream/stream.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでiterator(for-each)とstream apiを使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/60.html</guid><pubDate>Tue, 26 Jan 2021 21:01:27 +0900</pubDate></item><item><title>[Java] 19. ラムダ(Lambda)を使う方法</title><link>https://www.nowonbun.com/59.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaにはラムダ(lambda)を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaには基本的にオブジェクト指向プログラミング(oop)を中心でクラス単位で構成しています。つまり、関数だけ必要なプログラムを作ると思ってもjavaにはクラスを作成して関数を作成しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1409&quot; data-filename=&quot;001.png&quot; style=&quot;width: 208px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この部分は以前に匿名クラスを説明した時に説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/58.html&quot; target=&quot;_blank&quot;&gt;[java] 18. 匿名クラス(anonymous class)とクロージャ(closure)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;上の例をみればrun関数でtestableを経書したクラスのインスタンスを生成しました。javaの場合、特にアンドロイド開発する時にイベントを登録してcallback関数を作る時に上のパターンで作成されます。&lt;/p&gt;&lt;p&gt;test関数で実行フローを作成して最終にtestクラスのrun関数を呼び出す形です。&lt;/p&gt;&lt;p&gt;でも、再使用性が多くなるクラスではなく、一回性クラスなら上のパターンで作成することは悪いです。そのことに関して匿名クラスを作成する時に説明しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで、匿名クラスよりもっと簡単に作成する方法がラムダ関数式です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1409&quot; data-filename=&quot;001.png&quot; style=&quot;width: 208px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;匿名クラスをラムダ関数式で変換する条件はインターフェースに抽象関数が必ず一つだけに作成しなければならないです。&lt;/p&gt;&lt;p&gt;インターフェースが二つ以上になるとラムダ式でどの関数を呼び出すのが分からなくなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaにはラムダ式でよく使うインターフェースが二つあります。runnableインターフェースとcallableインターフェースです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1410&quot; data-filename=&quot;002.png&quot; style=&quot;width: 592px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1413&quot; data-filename=&quot;003.png&quot; style=&quot;width: 546px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のイメージをみればrunnableインターフェースとcallableインターフェースは抽象関数が一つだけあります。&lt;/p&gt;&lt;p&gt;runnableインターフェースとcallableインターフェースの差異はリターン値が、voidかジェネリックタイプでobjectタイプかです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1408&quot; data-filename=&quot;004.png&quot; style=&quot;width: 363px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ラムダ式は匿名クラスでできたクロージャ機能がラムダ式でも使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1411&quot; data-filename=&quot;005.png&quot; style=&quot;width: 275px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ラムダ式でパラメータも使えます。インタフェースで関数のとおりにパラメータが設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1412&quot; data-filename=&quot;006.png&quot; style=&quot;width: 212px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;p1とp2は10と20の値をintタイプのパラメータで受け取ります。そしてその値をtest1関数によって足して結果を変数retに30の値で格納します。最後に変数ret値をコンソールに出力すれば30の結果が表示されます。&lt;/p&gt;&lt;p&gt;このラムダ式はc/c++で関数ポインタ、関数系プログラムのcallback関数と似ているな形でプログラムが実行されます。&lt;/p&gt;&lt;p&gt;特にアンドロイドや様々ライブラリでイベントやリスナーみたいな形の設定でよく使えます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaにはラムダ(lambda)を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/59.html</guid><pubDate>Mon, 25 Jan 2021 16:21:55 +0900</pubDate></item><item><title>[Java] 18. 匿名クラス(Anonymous class)とクロージャ(closure)</title><link>https://www.nowonbun.com/58.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaの匿名クラス(anonymous class)とクロージャ(closure)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にクラスとインタフェースに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/47.html&quot; target=&quot;_blank&quot;&gt;[java] 7. クラスを作成する方法(コンストラクタを作成方法)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/52.html&quot; target=&quot;_blank&quot;&gt;[java] 12. インタフェース(interface)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;改めてまとめるとjavaで最小の動作単位はクラスだし、つまりオブジェクト生成(インスタンスを生成)する単位です。そしてそのクラスを抽象化することがインタフェースです。&lt;/p&gt;&lt;p&gt;インタフェースを作成する時には関数を作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1406&quot; data-filename=&quot;001.png&quot; style=&quot;width: 315px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は私がtestableのインターフェースを作成してtest1のクラスに継承してインスタンスを生成してtest関数を利用してtablableインターフェースを継承したクラスのrun関数とexecute関数を実行するプログラムです。&lt;/p&gt;&lt;p&gt;ここまで問題がないです。私は上の例を一つのファイルに作成しましたが、実のjavaの標準ならファイル一つで一つのクラスが原則なので、testable.java、test1.java、example.javaの三つのファイルを作成しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで我々はtest関数を中心で確認しましょう。test関数のパラメータはtestableインターフェースのタイプで受け取ります。つまり、testableインターフェースを継承したクラスなら良いです。&lt;/p&gt;&lt;p&gt;我々がtest1のクラスを作成してインスタンスを生成してtest関数に渡って実行しました。つまり、run関数とexecute関数を呼び出しました。&lt;/p&gt;&lt;p&gt;また、他のtestableのケースを作成する時にはクラスをまた生成しなければならないです。test2クラスを作成してtestableを継承してインスタンス生成してtest関数に渡します。&lt;/p&gt;&lt;p&gt;また、他のtestableのケースを作成する時には繰り返します。つまり、クラスが増えるし、クラスファイル(.java)が増えるという意味です。各testケースを作成するたびにクラスを生成することは非効率です。&lt;/p&gt;&lt;p&gt;もしかして,100個のケースがある場合、100個のクラスを生成するという意味になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして我々はクラスを作成しなくてインターフェースだけでインスタンスを生成して使う方法があります。それを匿名クラス(anonymous class)ということです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1407&quot; data-filename=&quot;002.png&quot; style=&quot;width: 235px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればインターフェースをnewでインタフェースを生成しました。別にクラスを作成しずに、インタフェース生成ができます。そうするとtestableケースがたくさん多くてもクラスを増やさなくても作成する方法があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、匿名クラスがただクラスやコードステップを減らす機能だけあれば、使いをお勧めしないです。&lt;/p&gt;&lt;p&gt;なぜなら、javaの規約でクラス単位で作るのはプロジェクトを管理しやすいことと、可読性のため、決まっている規則ですが、匿名クラスをたくさん使うことにするとコード可読性に悪くなるためです。&lt;/p&gt;&lt;p&gt;でも、匿名クラスを単純にインタフェースをしやすくインスタンスを作成するための機能ではなくクロージャ機能のために使うことです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1405&quot; data-filename=&quot;003.png&quot; style=&quot;width: 305px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でrun関数とexecute関数に使うindexの値はtestableのインスタンスの中ではなく、main関数のfor文の値で定数化(fianl)になった整数です。&lt;/p&gt;&lt;p&gt;つまり、匿名クラスの内部で宣言した値ではなく、上のスタックで宣言したデータを飛び渡して使うことができます。&lt;/p&gt;&lt;p&gt;これがjavaのクロージャ機能(closure)ということです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もし、匿名クラスとクロージャ機能がないと思ってクラスで実装すると思えば、コンストラクタや受け取る関数が必要になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1405&quot; data-filename=&quot;003.png&quot; style=&quot;width: 305px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もし、渡すデータが多くなるとコンストラクタや関数などが多くなります。つまり、この場合は匿名クラスを使うほうがもっと綺麗に作成ができます。&lt;/p&gt;&lt;p&gt;上の例は単純に原始データタイプ(primitive type)を使って定数化すると変更ができないですが、クラスを使うと変数は定数化になりますが、heapのメモリのデータ(インスタンスデータ)は変更ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1405&quot; data-filename=&quot;003.png&quot; style=&quot;width: 305px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果でnodeクラスはnode変数で定数化になりましたが、nodeインスタンスの中のcount値はcounting関数が呼び出すたびに変更することを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaの匿名クラス(anonymous class)とクロージャ(closure)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/58.html</guid><pubDate>Fri, 22 Jan 2021 14:47:14 +0900</pubDate></item><item><title>[Java] 17. ジェネリックタイプ(Generic type)を使う方法</title><link>https://www.nowonbun.com/57.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのジェネリックタイプ(generic type)を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスの内部メンバー変数を設定する時に、データタイプと変数名を作成します。&lt;/p&gt;&lt;p&gt;しかし、メンバー変数のデータタイプをクラス内部で設定することではなく、クラスをインスタンス生成(割り当て)する時に決めたい時があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1403&quot; data-filename=&quot;001.png&quot; style=&quot;width: 238px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を単純なリンクスタックアルゴリズムです。リンクスタックアルゴリズムはリストやマップみたいにデータを挿入して取り出して出力します。&lt;/p&gt;&lt;p&gt;リストと差異があればaddで格納したら逆順でpop関数でデータを取り出すことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はint型のデータタイプしか使えません。でも、仕様によってstringタイプも使いたいです。その場合は内部クラスのnodeのメンバー変数のデータタイプとadd関数のパラメータ、pop関数のリターンタイプを変更してソースをコピペするしかないです。&lt;/p&gt;&lt;p&gt;あるいはデータタイプをobjectタイプにしてもよいです。でもobjectタイプに使うとデータタイプの整合性の確認ができなくなります。継承する方法もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、簡単に考えるとそのデータタイプをインスタンスを生成する時に決めることにできれば簡単に解決します。その機能がジェネリックタイプです。&lt;/p&gt;&lt;p&gt;ジェネリックは薬のジェネリックと同じ意味で枠だけ作っておいて内部のタイプは外部から設定するという意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1401&quot; data-filename=&quot;002.png&quot; style=&quot;width: 212px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のジェネリックタイプをみれば以前のlistやmapでもよく見たことです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/45.html&quot; target=&quot;_blank&quot;&gt;[java] 5. 配列とリスト(list)、マップ(map)の使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ジェネリックはクラスだけではなく、インタフェースや関数などでも使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1404&quot; data-filename=&quot;003.png&quot; style=&quot;width: 211px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インタフェースにジェネリックを宣言して継承したtestクラスでジェネリックタイプをstringに設定しました。そして関数にはインタフェースのジェネリックタイプでリターン値が設定されます。&lt;/p&gt;&lt;p&gt;なので、test関数を使う時には別にジェネリックタイプを設定しなくてよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ジェネリックは基本的にobjectタイプですべてのクラスを設定することができますが、その設定する範囲も設定することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1402&quot; data-filename=&quot;004.png&quot; style=&quot;width: 148px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はデザインパターンのbuildパターンを参考しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ジェネリックを知らなかったらプログラムを作成できないことではありません。ジェネリック代わりにobjectタイプに設定すればプログラム作成することはできます。&lt;/p&gt;&lt;p&gt;でもジェネリックを利用すればコンパイル段階で整合性チェックするので別にデータタイプのキャスターエラーや変なデータになる可能性が低くなります。つまり、プログラムの品質を改善することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのジェネリックタイプ(generic type)を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/57.html</guid><pubDate>Thu, 21 Jan 2021 11:15:49 +0900</pubDate></item><item><title>[Java] 16. 例外処理(try~catch~finally, throw)を使う方法</title><link>https://www.nowonbun.com/56.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaの例外処理(try~catch~finally, throw)を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを作成しながら、予想できなかった例外が発生する時があります。この例外がプログラムを間違って実装して発生するバグもありますが、プログラムを使っているユーザからも間違ってデータを入力や既存のデータがnullの場合も発生する時があります。&lt;/p&gt;&lt;p&gt;特にプログラムの運用でよく発生する例外はnull exceptionです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1389&quot; data-filename=&quot;001.png&quot; style=&quot;width: 499px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればex変数はインスタンスを生成しない、つまり割り当てしなかったので、ex.run()を呼び出すとheapメモリに生成されてないクラスから関数を探すのでエラーが発生します。&lt;/p&gt;&lt;p&gt;ここでエラーが発生するとエラーを無視して次のステップに実行することではなく、プログラムがそのまま終了になります。上の例をみればex.runでエラーが発生してhello worldというメッセージはコンソールに表示されてないです。&lt;/p&gt;&lt;p&gt;そのため例外処理をすることです。使用方法には何処にエラーが発生する可能性がある部分でtryキーワードと中括弧でstack領域を設定して例外が発生すればcatchに移動することに設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1388&quot; data-filename=&quot;002.png&quot; style=&quot;width: 321px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を見ればex.run関数でエラーが発生したので、catchのエラー内容がコンソールに出力しました。次のhello worldがコンソール出力しました。not errorというメッセージは同じtryスタック領域にあるのでエラーが発生することで飛ばしました。&lt;/p&gt;&lt;p&gt;ここで私がcatchの中でthrowableというインタフェースを使いました。catchには条件式にエラークラスやインタフェースが必要ですが、throwableインタフェースはすべてのエラークラスの最上位のインタフェースです。&lt;/p&gt;&lt;p&gt;この最上位インタフェースを設定すればすべてのエラーがcatch(throwable)に移動します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;次の例で説明します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1392&quot; data-filename=&quot;003.png&quot; style=&quot;width: 261px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はcatchが二つがあります。ex.run()にはnullpointerexceptionが発生(参考-最初の例をみれば結果にnullpointerexceptionが発生しましたと赤い文字で表示しました。)したのでcatch(nullpointerexception)の領域に移動しました。&lt;/p&gt;&lt;p&gt;もしかして、nullpointerexceptionではない場合はcatch (throwable)に移動することです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1390&quot; data-filename=&quot;004.png&quot; style=&quot;width: 343px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば10を0で割ればarithmeticexceptionエラーが発生してcatch(throwable)の領域に移動しました。&lt;/p&gt;&lt;p&gt;このcatch機能によって分けている理由は仕様によってエラー別で処理を別に処理することができるのでです。ここで注意事項はcatchの順番です。&lt;/p&gt;&lt;p&gt;もしかして、nullpointerexceptionとthrowableの順番を変わるとコンパイルエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1395&quot; data-filename=&quot;005.png&quot; style=&quot;width: 705px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は関数の中で例外処理をしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1396&quot; data-filename=&quot;006.png&quot; style=&quot;width: 121px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はcalc関数でメンバー変数dataが0になるとarithmeticexceptionエラーが発生して結果を0をリターンする。&lt;/p&gt;&lt;p&gt;でも、私はtry~catchに関係ずにtry領域が終わったら必ず実行したいステップがある可能性があります。例えば,メンバー変数dataを1に設定することかです。&lt;/p&gt;&lt;p&gt;それならreturnする前にメンバー変数dataを1に更新すればよいですが、もっとプログラム品格でfinallyを使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1400&quot; data-filename=&quot;007.png&quot; style=&quot;width: 258px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;finally領域は関数でもうreturnを実行しても関数が終わる前にfinally領域を実行します。&lt;/p&gt;&lt;p&gt;特にfinallyはioやソケットなどの外部リソースを使う時にリソースリターン式でよく使います。finallyはcatchがなくても使えます。つまり、try~finally文法もできるという意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1391&quot; data-filename=&quot;008.png&quot; style=&quot;width: 348px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;エラークラス(exception)は基本的にjavaでたくさんあります。それでも、私がエラークラス(exception)を作りたいです。エラークラス(exception)を作ることは他のオブジェクトを参照する時にエラーを発生してクラスを信頼性を上がることです。&lt;/p&gt;&lt;p&gt;それならこのexceptionクラスを作ることはthrowableインタフェースを継承すればいいと思いますが、javaではthrowableインタフェースを継承ができなくて、exceptionとruntimeexceptionを継承しなければならないです。&lt;/p&gt;&lt;p&gt;もちろん、その二つを継承したクラスを継承することもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1393&quot; data-filename=&quot;009.png&quot; style=&quot;width: 364px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;test関数を呼び出すと中でthrowのキーワードによってエラーが発生しますが、コンソールを見ればステップ追跡も表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでthrowのキーワードを使う時に明示的エラー処理と暗黙的のエラー処理があります。&lt;/p&gt;&lt;p&gt;明示的エラー処理はコンパイル段階でエラーが発生する可能性がありますような表示することです。関数のパラメータの右でthrowsのキーワードを使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1399&quot; data-filename=&quot;010.png&quot; style=&quot;width: 429px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればthrow new exceptionを使いましたが、eclipseからエラーを制御してないというエラーが発生しました。つまり、コンパイルからエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1394&quot; data-filename=&quot;011.png&quot; style=&quot;width: 471px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、test関数を呼び出す時に別にexception例外処理をしてないならエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1397&quot; data-filename=&quot;012.png&quot; style=&quot;width: 402px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は実行できます。&lt;/p&gt;&lt;p&gt;暗黙的のエラー処理はthrowsを使わないことですが、runtimeexceptionを継承します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1398&quot; data-filename=&quot;013.png&quot; style=&quot;width: 408px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;暗黙的のエラー処理だってtry~catchに取れないことではありません。throwableでcatchを作ればすべてのエラーが取れます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでexceptionクラスとruntimeexceptionクラスの差異はexceptionを継承してエラークラスを作ればすべて明示的にエラー処理になるし、runtimeexceptionを継すれば暗黙的のエラー処理になります。&lt;/p&gt;&lt;p&gt;参考にエラークラスの階層はthrowable - exception - runtimeexceptionです。すなわち、try~catchでexceptionをruntimeexceptionより上の階層なので、exception領域でもすべてのエラーを取れます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaの例外処理(try~catch~finally, throw)を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/56.html</guid><pubDate>Wed, 20 Jan 2021 15:05:32 +0900</pubDate></item><item><title>[Java] 15. 列挙型(バイナリデータビット演算子の使用例)</title><link>https://www.nowonbun.com/55.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaの列挙型(バイナリデータビット演算子の使用例)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データを格納する時には値を格納し、修正ができる一般変数とfianlキーワードを使って値を変更できない定数型で使うことができます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/42.html&quot; target=&quot;_blank&quot;&gt;[java] 2. 変数と定数の宣言方法、そして原始データタイプとクラスデータタイプの差異&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;定数型で使う場合はプログラム上で基準になるキー値で使うか比較をしなければならない値でよく使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1387&quot; data-filename=&quot;001.png&quot; style=&quot;width: 217px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースはpeopleというクラスを人に設定してどの行動をしたかを追加するソースです。&lt;/p&gt;&lt;p&gt;ここで行動の基準を作るためにintタイプの定数を四つを作成しました。そしてaddstate関数で行動を追加してpeopleクラス中でバイナリビット演算子を利用して行動を追加することになりました。そしてprint関数で内訳を出力します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;こんなに作成しても何も問題ありません。オブジェクト指向の特性をため、行動をclassで分類して抽象化、継承しなければならないですが、簡単にこんなに作成しても構いません。&lt;/p&gt;&lt;p&gt;実際に実務でこんなに作成する場合も多いです。ルールに従ってプログラムを作成することも重要ですが、そのルールがあることが可読性や管理しやすくためなので、簡単に作成する方法と見やすい方法があればその方が良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の比較データによって定数を使いました。プロジェクトサイズが大きくなって、行動データが増える場合、定数が増えることになります。&lt;/p&gt;&lt;p&gt;定数のデータもデータタイプがintタイプなので、state変数だけみれば何のデータがあるかを確認することが大変です。上のソースは変数名も理解しやすいし、コメントもちゃんとあるので別に問題なさそうですが、データが多く、変数名も迷いやすいことで決めると後でプログラム管理が簡単ではないと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それを解決するためには列挙型があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1387&quot; data-filename=&quot;001.png&quot; style=&quot;width: 217px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果は同じです。でも列挙型ではパラメータを渡すから誰が見てもaddstateにどの値が格納するかを見やすいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;始めのソース例はintタイプでバイナリデータ比較をしました。普通はバイナリデータではなく、stringなどを使って定数を宣言する時が多いです。&lt;/p&gt;&lt;p&gt;でもバイナリデータ比較はプラグが多いときにずいぶん早いパフォーマンスで処理することができます。実際の業務でもそんなバイナリデータコードが多いです。&lt;/p&gt;&lt;p&gt;列挙型を使うことでもパフォーマンスが遅くなることではないけど、listを使って比較処理があればビッド演算子処理ではなくequals関数を使う場合が多いのでバイナリデータをビット演算子を使うことよりはパフォーマンスが落ちるではないかと思います。&lt;/p&gt;&lt;p&gt;なので、パフォーマンスよって使えばよいと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaの列挙型(バイナリデータビット演算子の使用例)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/55.html</guid><pubDate>Fri, 15 Jan 2021 09:40:43 +0900</pubDate></item><item><title>[Java] 14. オブジェクト指向プログラミング(OOP)の4つ特性(カプセル化、抽象化、継承、多相化)</title><link>https://www.nowonbun.com/54.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのオブジェクト指向プログラミング(oop)の4つ特性(カプセル化、抽象化、継承、多相化)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;オブジェクト指向(object-oriented programming)ということはプログラミングの開発方法の中で一つです。ここでプログラミングの開発方法とは、プログラムを開発する時にどの目的に関して開発することかについての方法です。&lt;/p&gt;&lt;p&gt;その中でオブジェクト指向(oop)はオブジェクト(object)の中心でプログラムを設計、開発するという意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例えば、「業務計画書作成 -&amp;gt; 計画実行 -&amp;gt; テスト -&amp;gt; 結果確認 -&amp;gt; 報告書作成 -&amp;gt; 決済 -&amp;gt; 承認」ということの一つの業務プロセスを考えましょう。&lt;/p&gt;&lt;p&gt;ここでまず全体の業務単位(controller)で構成して計画書データ、テストデータ、結果データ、報告書データ、決済データのオブジェクトのプロセスに配置します。&lt;/p&gt;&lt;p&gt;プログラム言語として考えると最小なオブジェクトの単位のクラスにして上の業務オブジェクトをクラスに特性を与えて管理することがオブジェクト指向プロジェクトになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このオブジェクト指向(oop)には4つ原則がありますが、それがカプセル化、抽象化、継承、多相化ということです。&lt;/p&gt;&lt;p&gt;この原則に関しては部分的に説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/49.html&quot; target=&quot;_blank&quot;&gt;[java] 9. アクセス修飾子とstatic&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/52.html&quot; target=&quot;_blank&quot;&gt;[java] 12. インタフェース(interface)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/48.html&quot; target=&quot;_blank&quot;&gt;[java] 8. クラスの継承とthis、superキーワードの使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/46.html&quot; target=&quot;_blank&quot;&gt;[java] 6. 関数の使い方(関数のオーバーロードと再帰的な方法について)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;この投稿ではその特性に関して詳細にまとめて説明します。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;カプセル化&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;カプセル化とは言語的に表現は何かを包むという意味です。つまり、アクセス修飾子でクラスのデータと関数を秘匿化するという意味ですが、私の考えはクラスの特性を正確に区分する方法ではないかと思います。&lt;/p&gt;&lt;p&gt;例えば、一つクラス(組)で10人がいます。そして国語、英語、数学の成績のオブジェクトを作成しましょう。&lt;/p&gt;&lt;p&gt;最小単位で学生のオブジェクトが作り、各の国語、英語、数学のオブジェクトを作りました。そして学生は国語、英語、数学のオブジェクトを持っていて、組クラスは学生のリストを持っています。&lt;/p&gt;&lt;p&gt;私が考えでオブジェクト指向タイプでプログラムを作りました。オブジェクト指向タイプでプログラムを作らないと別にクラスの存在が必要かなと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ただ、リストでプログラムを作りましょう。&lt;/p&gt;&lt;p&gt;上のことはオブジェクト指向プログラミングではないです。でも結果は同じく出ると思います。そうすると人によってコーディングスタイルがあるので結果だけ出ることになれば別に大変に作成する必要があるかと思う人もいると思います。&lt;/p&gt;&lt;p&gt;それなら上のプログラムから機能を拡張しましょう。総点を計算して平均点数、席次について計算する機能を追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1383&quot; data-filename=&quot;001.png&quot; style=&quot;width: 303px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;総点、平均点数、席次だけ計算してもプログラムがすぐ複雑になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;オブジェクト指向(oop)タイプで作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1383&quot; data-filename=&quot;001.png&quot; style=&quot;width: 303px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;オブジェクト指向ならクラスが多いからソースステップは長くなりますが、各オブジェクトから総点を計算して平均点数を計算することでソースを見やすくなります。&lt;/p&gt;&lt;p&gt;まだ、そんなにオブジェクト指向が何がいいかを感じられないです。続けて機能を追加しましょう。&lt;/p&gt;&lt;p&gt;今回は上位30%の成績と下位30%の成績の人を計算しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;オブジェクト指向ではないプログラムです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1384&quot; data-filename=&quot;002.png&quot; style=&quot;width: 309px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ソースが少しずつ暗号化になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;オブジェクト指向タイプに作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1384&quot; data-filename=&quot;002.png&quot; style=&quot;width: 309px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;オブジェクト指向の関数の場合がソースの可読がしやすいです。&lt;/p&gt;&lt;p&gt;ここでオブジェクト指向はただソートアルゴリズムで作成したので、簡単になります。オブジェクト指向ではない場合も、ソートを使うことにできますが、ソート値を格納する変数が成績別、名前別など4つ以上が必要です。&lt;/p&gt;&lt;p&gt;そしてsumとavg関数はメンバー変数に関する値なので、上位30%と下位30%のためのsumとavg関数が必要です。つまり、仕様が追加するために修正する範囲も増えるし複雑になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースを見れはメンバー変数はすべてprivateでアクセスを制限しました。実はオブジェクト指向ではメンバー変数は必ずprivateに設定しましょうというのは暗黙的なルールです。&lt;/p&gt;&lt;p&gt;なぜなら、クラスを最小のオブジェクト単位ですが、その中のデータをクラス外部で勝手に修正するのは、オブジェクト指向らしくないでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は席次を計算することでデータ量が多すぎて、席次データを返却するたびに計算することではなく、初期化機能を入れて一回でデータを格納しましょう。&lt;/p&gt;&lt;p&gt;返却するたびに計算することは10人ごろは問題なく計算できますが、学生が1満人だと思えば、簡単ではないデータでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1386&quot; data-filename=&quot;003.png&quot; style=&quot;width: 309px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;init関数とinitrank関数を追加しました。このデータは各学生を入力して一括で計算することです。それなら席次のデータは返却するたびに計算することではなく、データだけ取得すればよいです。&lt;/p&gt;&lt;p&gt;でも、ここでその変数をクラス内部ではなく、クラス外部で修正することができれば？席次のデータ整合性が可笑しくなります。&lt;/p&gt;&lt;p&gt;それなら修正しても問題ない変数はpublicして整合性が必要な変数だけprivateすればどうでしょう。開発はルールがあります。メンバー変数はprivateで宣言しましょう。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;継承&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;継承は似ているクラス別に親クラスとインタフェースを定義して共通化します。その後で親クラスを継承することです。その利点はソースの可読をしやくしするし管理的にはよいことにすることです。&lt;/p&gt;&lt;p&gt;上の例だけみてもオブジェクト指向で作成しようと思ってもソースステップが多くなります。成績オブジェクトを共通化しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1383&quot; data-filename=&quot;001.png&quot; style=&quot;width: 303px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上で共通になる科目に関して国語、英語、数学クラスはインタフェースを宣言して抽象クラスで共通化しました。始めから科目クラスのサイズが小さかったのでソースがそんなに減ったと思われます。でも実務ではクラスを共通化するとソースがずいぶん減ることを見えます。&lt;/p&gt;&lt;p&gt;また、仕様変更でソース修正があるときにコピペだとクラスのすべてを修正しなければならないですが、共通化すると一つのところを修正することで解決ができます。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;抽象化&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;上の継承を説明する時に抽象化に関しても含めていますが、ここではメソッド抽象化と再定義(override)に関する説明を続けていきます。&lt;/p&gt;&lt;p&gt;ここで我々は国語、英語、数学が100点基準で計算しましたが、仕様変更で国語は100点から120点、英語は100点から80点、数学は100点から100点の点数配点を修正しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1383&quot; data-filename=&quot;001.png&quot; style=&quot;width: 303px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;抽象クラスに抽象メソッドのgetrate関数を追加して継承されたクラスからその配列を強制に再定義して値を受け取ることにしますた。&lt;/p&gt;&lt;p&gt;この利点は今回は逆に修正部分が増えることになりましたが、abstractを使うことでデバッガーから修正部分を発見することができます。なので、ミスに修正する確率が低いです。&lt;/p&gt;&lt;p&gt;オブジェクト指向で作成すればどの仕様変更でも修正がしやすくなります。もし、オブジェクト指向ではない場合に、上みたいに仕様変更があれば、どのぐらいに修正するか思われないですね。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;多相化&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;多相化は同じメソッド名でパラメータが違う構造で作る関数です。&lt;/p&gt;&lt;p&gt;今回は選択科目を追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1385&quot; data-filename=&quot;005.png&quot; style=&quot;width: 343px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;多相化は既存のクラスの関数名の修正がなしで同じ関数名を追加したのでクラスの目的のままで表現ができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;オブジェクト指向プログラミングはオブジェクト別でデータを区分するのでプログラムの可読性がよいです。そしてメンテナンスをするところでも仕様変更や追加する領域が少ないのでコーディングミスでバグが発生する確率も少ないです。&lt;/p&gt;&lt;p&gt;でも、このオブジェクト指向でも短所があります。上の例はすべてデータタイプで説明したので、ずいぶん効率的に見えますが、すべてもプログラムがデータタイプで作ることではないです。&lt;/p&gt;&lt;p&gt;例えばロードバランシングやビデオチャットツールを開発すると思えば、これはデータ中心ではなくプロセス、つまり行動中心の流れなので、逆にオブジェクト指向タイプで開発すると複雑になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例でspringというwebプロジェクトフレームワークあります。web siteを開発すると思えばデータベースからデータを受け取ってクライアント(ブラウザ)にデータを送信することは確かにデータ中心で動きます。&lt;/p&gt;&lt;p&gt;でも、url別でページ移動する時にcontrollerというクラスが呼び出しますが、データではなく行動中心なので、逆にクラスがすごく増える短所があります。&lt;/p&gt;&lt;p&gt;そのため、springプロジェクトをすれば、データベースのmodelクラスやフォームデータのbeanクラスの場合は整理がよくできますが、controllerの場合は各ページによってクラスやメソッドが生成することで意味なしでクラスだけが増えます。&lt;/p&gt;&lt;p&gt;それでspringプロジェクトをみれば、controllerクラスだけすごく見えることになります。それもデベロッパーの能力によってrouteからどのようにbindingすることでその形も変わりますが。。。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;こんな簡単なソースでもこの差異が見えますが、実務ではどうでしょう。オブジェクト指向で作成してないプログラムはほぼ理解できない可笑しいプロジェクトになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのオブジェクト指向プログラミング(oop)の4つ特性(カプセル化、抽象化、継承、多相化)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/54.html</guid><pubDate>Thu, 14 Jan 2021 16:14:12 +0900</pubDate></item><item><title>[Java] 13. 抽象クラス(abstract)と継承禁止(final)</title><link>https://www.nowonbun.com/53.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaで抽象クラス(abstract)と継承禁止(final)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私が以前にクラス継承とインタフェース(interface)に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/48.html&quot; target=&quot;_blank&quot;&gt;[java] 8. クラスの継承とthis、superキーワードの使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/52.html&quot; target=&quot;_blank&quot;&gt;[java] 12. インタフェース(interface)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この抽象クラスはインタフェース(interface)と一般クラスの機能を混ぜていると思えばよいと思います。&lt;/p&gt;&lt;p&gt;インタフェースはクラスの割り当て(new)することはできません。理由は複数継承のため、メモリ構成するメンバー変数がないし、それを処理する関数の処理が実装されてないからです。&lt;/p&gt;&lt;p&gt;クラスはメンバー変数や関数の実行するところまで実装されています。なのでクラスはメモリに割り当てができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;抽象クラスは基本的に構造は一般クラスと同じです。でも、クラスを生成する時に、直接にインスタンスを生成することではなく、継承する部分まで考えてクラスを作る場合があります。つまり、インタフェースみたいに実行領域は継承されるクラスに任せて定義だけ実装して作成することができます。実行領域がない関数があるので抽象クラスはクラス割り当て、つまりインスタンス生成はできません。または抽象クラスは実行領域があるので複数継承ができません。&lt;/p&gt;&lt;p&gt;抽象クラスの継承はextendsキーワードを使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1380&quot; data-filename=&quot;001.png&quot; style=&quot;width: 287px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースを見ればabstractclassにprintという関数名だけ定義して実行領域は実装してないです。&lt;/p&gt;&lt;p&gt;abstractclassを継承したaclassやbclassからprint関数を再定義されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースを見てもクラスの属性を持っているしインタフェースの属性も持っていることに見えます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それなら抽象クラスは複数継承もできないし、一つの完全体のクラスにもありません。そうなれば、抽象クラスを作る意味があるかと疑問があります。&lt;/p&gt;&lt;p&gt;変数タイプで使うみたいにlistジェネリックタイプでabstractclassを使ってaclassとbclassのインスタンスを集まって扱いました。でも、この機能はインタフェースだけでも十分にできる機能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、実務に行くと抽象クラスはすごくよく使います。インタフェースよりも使います。理由はoopの特性のカプセル化のせいです。&lt;/p&gt;&lt;p&gt;上の例を見てもmain関数ではaclassのprint関数を直接に呼び出せないです。アクセス修飾子によってアクセスができないです。protectedタイプなので。&lt;/p&gt;&lt;p&gt;abstractclassのrun関数をよってprint関数が呼び出せるです。クラスを生成する時、カプセル機能で関数を隠せなければならないけど、インタフェースは基本的にpublicなのでできないです。そのため、抽象クラスがよく使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1381&quot; data-filename=&quot;002.png&quot; style=&quot;width: 267px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を見ればabstractclassはカプセル化でrun関数だけ外部で呼び出すことができます。メンバー変数はprivateタイプだし、処理関数はすべてprotectedタイプです。&lt;/p&gt;&lt;p&gt;abstractclassを継承するクラスによって結果を変わることができます。　上の例見たいに共通クラスを生成して継承したクラスから業務のプログラムを作成することにすると基本構造は似てますが、クラスによってデータをすべて別に出ると思います。&lt;/p&gt;&lt;p&gt;実務の例を考えばdatabase関連クラスを作ることができます。&lt;/p&gt;&lt;p&gt;database関連クラスはデータベースを接続してデータを検索するかデータを格納するプロシージャ(実行手順)がありますが、初期のデータベース情報がなければ実行ができません。なので抽象クラスを利用してデータベースは後継承したクラスで設定して優先的に実装することを作業することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;抽象クラスは使うことではクラスの前にabstractキーワードが必要です。内部関数ではabstract関数を作成します。abstract関数がなくてもクラス自体がエラーになることではないですが、抽象クラス宣言したことに意味がないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今までクラスからクラスを継承することで確認します。でも、クラスをもう継承できないようなキーワードもあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1382&quot; data-filename=&quot;003.png&quot; style=&quot;width: 536px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;bclassはaclassを継承しようと思いましたが、クラスの前にfinalキーワードがあるので継承できませんというコンパイルエラーに表示します。&lt;/p&gt;&lt;p&gt;このfinalキーワードは継承禁止だけではなく、変数を定数に宣言する時も使います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/42.html&quot; target=&quot;_blank&quot;&gt;[java] 2. 変数と定数の宣言方法、そして原始データタイプとクラスデータタイプの差異&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaで抽象クラス(abstract)と継承禁止(final)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/53.html</guid><pubDate>Wed, 13 Jan 2021 18:11:27 +0900</pubDate></item><item><title>[Java]  12. インタフェース(interface)</title><link>https://www.nowonbun.com/52.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのインタフェース(interface)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でクラスとクラスの継承に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/48.html&quot; target=&quot;_blank&quot;&gt;[java] 8. クラスの継承とthis、superキーワードの使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一応、継承の概念はクラスのすべての機能を続いてもらってクラスの機能を拡張することです。でもjavaでは複数継承、つまり、連関性がない二つのクラスを継承することができません。&lt;/p&gt;&lt;p&gt;多分、関数のあいまい点せいでできないと思います。 c/c++言語でよく発生した問題でしたが、javaでは複数継承をできないようにして関数のあいまい点を初めからなくしたと思います。&lt;/p&gt;&lt;p&gt;上の例通りにeclipseに作成すればコンパイルエラーが発生します。&lt;/p&gt;&lt;p&gt;exampleクラスを見ればaclassとbclassを継承してfunc関数を再定義(override)しました。再定義までよいですが、func関数の中で親クラスのfunc関数を呼び出しますね。この時に親クラスの何処のfunc関数かというあいまい点があります。&lt;/p&gt;&lt;p&gt;c/c++では最後にローディングされた関数を呼び出します。でも、プログラム上でどっちが遅くローディングされるかを分からない問題があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この問題を解決するために、javaからは複数継承をできないようにしたらしいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;しかし、オブジェクト指向プログラミング(oop)にきてオブジェクトの一番いい点がデータをクラス化して分類しながらリスト化にできることです。&lt;/p&gt;&lt;p&gt;つまり、aclassから継承したクラスははaclassグループ分類、bclassから継承したクラスははbclassグループに管理することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1378&quot; data-filename=&quot;001.png&quot; style=&quot;width: 380px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、理解することはaclassとcclass間の関係です。cclassはaclassを継承しました。以前、stackとheapの関係に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/50.html&quot; target=&quot;_blank&quot;&gt;[java] 10. メモリの割り当て(stackメモリとheapメモリ、そしてnew)とcall by reference(ポインタによる参照)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;クラスのインスタンスを生成する時に変数タイプとインスタンスタイプは同じことにして実装します。&lt;/p&gt;&lt;p&gt;aclass a = new aclass();&lt;/p&gt;&lt;p&gt;aclass aはstackメモリに格納するし、new aclassはheapメモリに割り当てします。&lt;/p&gt;&lt;p&gt;実は変数のデータタイプを宣言する時に合わせる条件があります。&lt;/p&gt;&lt;p&gt;1.インスタンスと同じデータタイプならok&lt;/p&gt;&lt;p&gt;2.クラスより親クラスやインターフェースならok&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、cclassの場合はaclass c = new cclass();が可能だということです。理由はcclassはaclassの継承したので、aclassの機能とメモリ構造があります。&lt;/p&gt;&lt;p&gt;そのため、aclassで宣言して関数を呼び出しても問題ないです。(参考で、javaのクラスは原始データタイプ以外はすべてobjectクラスを継承されたので、すべてのデータはobjectタイプで宣言できます。)&lt;/p&gt;&lt;p&gt;なので上の例通りにaclassとbclassをリストで区分することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、aclassとdclassは関数構造は同じですが、aclass a = new dclass();はできません。&lt;/p&gt;&lt;p&gt;理由は構造が人が見て同じことで、実はaclassとdclassは連関性が全然ありません。もちろん、aclassとdclassはobjectから継承したので、objectでは分類することができます。&lt;/p&gt;&lt;p&gt;でも、objectタイプはfunc関数がないので、object変数タイプではfunc関数を呼び出すことができません。&lt;/p&gt;&lt;p&gt;しかし、aclassとbclassは差異を置いてaclassとdclassを一つで分類したと思えばインターフェースを使えばできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1379&quot; data-filename=&quot;002.png&quot; style=&quot;width: 224px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればdclassはaclassとiclassを継承しました。aclassはiclassを継承しました。&lt;/p&gt;&lt;p&gt;つまり、dclassとaclassはiclassを継承してiclassはfunc関数が定義されているので、リストからiclass定義してクラスを分類してインスタンスを格納することができます。&lt;/p&gt;&lt;p&gt;コンソール結果はaclassとbclass、cclass順番で表示します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでインタフェースの特徴はnewでクラスを割り当て(インスタンス生成)をできないです。ただ、stack領域の変数タイプとしてだけ使えます。&lt;/p&gt;&lt;p&gt;インタフェースはメンバー変数も設定することができないし、関数の場合も関数名まで定義することができます。heap領域、つまり実行コードを実装しません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行コードが実行されてないので、インタフェースは複数継承しても問題ないです。関数名だけで定義されているので何を実行するかをextendsで継承した親クラスか割り当ているクラスが実行されます。&lt;/p&gt;&lt;p&gt;インタフェースを継承したときにはimplementsキーワードを使います。一般的にクラス継承はextendsを使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、ここでもう一つ知るものがあります。listとarraylistクラスとlinkedlistの関係です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/45.html&quot; target=&quot;_blank&quot;&gt;[java] 5. 配列とリスト(list)、マップ(map)の使い方&lt;/a&gt;&lt;/p&gt;&lt;p&gt;listタイプはインスタンスです。arraylistとlinkedlistはクラスです。つまり、listインタフェースで変数タイプを設定してarraylistのインスタンスを生成しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのインタフェース(interface)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/52.html</guid><pubDate>Tue, 12 Jan 2021 18:13:52 +0900</pubDate></item><item><title>[Java] 11. StringのhashCodeとequals、そしてtoStringの再定義(override)</title><link>https://www.nowonbun.com/51.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのstringのhashcodeとequals、そしてtostringの再定義(override)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前に私がメモリ割り当てに関して説明する時にメモリアドレスに関してhashcodeに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/50.html&quot; target=&quot;_blank&quot;&gt;[java] 10. メモリの割り当て(stackメモリとheapメモリ、そしてnew)とcall by reference(ポインタによる参照)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このhashcodeはメモリのアドレス値をハッシュしたことで割り当てたメモリたびに別に表示されます。(ハッシュアルゴリズムの限界で他のメモリに割り当てても同じハッシュ値が出る可能性がある。)ということに説明しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1376&quot; data-filename=&quot;001.png&quot; style=&quot;width: 301px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならstringタイプの変数のhashcodeを確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1372&quot; data-filename=&quot;002.png&quot; style=&quot;width: 342px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;同じ値をstringタイプの変数に格納しましたが、hashcodeの値が同じです。aとbは同じ二重引用符で格納したものは同じ値だと思ってもnewで格納したstringもhashcodeが同じです。&lt;/p&gt;&lt;p&gt;この関して私も知りたいから様々なところを調べてみましたが、ちょうどこれが正解だと思うほどの説明はないです。でも自分の経験だと次みたいになるではないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、stringのhashcodeソースを見ればobjectクラスからstringのhashcode関数は再定義しています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1377&quot; data-filename=&quot;003.png&quot; style=&quot;width: 707px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stringの文字列はjavaでbyte(unsigned char)の配列のタイプです。&lt;/p&gt;&lt;p&gt;つまり、string aの値はa[0] = &apos;h&apos;、a[1] = &apos;e&apos;、a[2] = &apos;l&apos;、a[3] = &apos;l&apos;、a[4] = &apos;o&apos;になっています。でも、このhはアスキーコードの定数値の104でeは101の値です。&lt;/p&gt;&lt;p&gt;この文字は一つずつ定義されているし、変わらない値です。これはhashで並べると&quot;s[0]*31^(n-1)+s[1]*31^(n-2)+...+s[n-1]&quot;の形で計算され、hashcodeになります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.tutorialspoint.com/java/java_string_hashcode.htm&quot; target=&quot;_blank&quot;&gt;https://www.tutorialspoint.com/java/java_string_hashcode.htm&lt;/a&gt;&lt;/p&gt;&lt;p&gt;これをプログラムで実装すると下記通りになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1374&quot; data-filename=&quot;004.png&quot; style=&quot;width: 249px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これがstringのhashcode関数から同じ値がリターンする理由です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、実は私がこの理由で長い時間でjavaを理解できなかったことがあります。それがhashcodeはメモリアドレスか、違うかということです。&lt;/p&gt;&lt;p&gt;hashcodeはメモリアドレス値のstringの値はリテラル値なのでいつも同じ値をリターンしますと思いました。そう思えば矛盾になることが同じstring値を宣言することは同じだと思っても、concatで文字列を併せる時やプログラムを実行するたびに値が同じだということが説明ができません。&lt;/p&gt;&lt;p&gt;それならjavaのhashcodeはメモリアドレス値ではないかと言えば実はメモリのアドレス値だといったことはjavaのドキュメントでは何処でも説明したことはありませんが、クラスたびに固有な値を持っていますということは合ってます。(objectから再定義してない場合。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで私がhashcodeの関数に関してこれが何かと思いました。これか重要だと思わない可能性がありますが、hashcodeは記号計算イコール(=)と関係あるので上のa == &quot;hello&quot;がtrueになるかfalseになるかの関係があることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;改めて確認すればstringクラスはhashcode関数を再定義しました。hashcode関数を再定義。。。。なのでstringではメモリアドレス値ではないです。&lt;/p&gt;&lt;p&gt;そのため、stringのhashcodeはメモリアドレス値ではないです。ただ、文字列に関するハッシュ値です。&lt;/p&gt;&lt;p&gt;このstringのhashcode関数のせいでhashcodeはメモリアドレス値だ、違うんだということが多いですが、私の考えは正確にメモリアドレス値ではないですが、クラスの固有値では合ってると思います。&lt;/p&gt;&lt;p&gt;再.定.義.を.し.て.な.い.ならです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;次のequalsはクラスを比較関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1373&quot; data-filename=&quot;005.png&quot; style=&quot;width: 300px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を見れば関係演算子==とequalsが別の結果を出力します。exampleクラスでequals関数を再定義しました。&lt;/p&gt;&lt;p&gt;なのでequalsを使えば同じexampleクラスだし、値が同じならtrueをリターンします。つまり、同じインスタンス(メモリアドレス値が同じ)かを確認することではなく、メンバー変数dataが同じならtrueになることにします。&lt;/p&gt;&lt;p&gt;でも、記号(==)を使う時には同じインスタンスを確認します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、stringのことで戻りましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1371&quot; data-filename=&quot;006.png&quot; style=&quot;width: 227px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみればaとbは関係演算子で比較しましたが、falseになります。上の論理ならクラスが別に宣言しましたので別のことだと思います。なのでstringを比較する時には必ずequals関数を使わなければならないです。&lt;/p&gt;&lt;p&gt;ここで人を迷うことにすることがb==cみたいなことです。別に宣言しておりますが、b==cがの結果がtrueになります。それで我々は文字列で比較することができる時もあるしできない時もあるんだと思います。&lt;/p&gt;&lt;p&gt;私の考えはリテラルの差異見たいです。つまり、c/c++でchar[]とconst char*の差異かな。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;改めてまとめるとstringを比較する時には必ずequals関数を使わなければならないです。&lt;/p&gt;&lt;p&gt;ここまでがhashcodeとequals関数に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaでは原始データタイプではなければすべてのクラスはobjectクラスを継承します。&lt;/p&gt;&lt;p&gt;親クラスから関数を再定義する時にはアトリビュート@overrideを使えば再定義になります。ここで再定義というのは親クラスから宣言した関数を継承する時に再定義することです。&lt;/p&gt;&lt;p&gt;つまり、該当なクラスを割り当てして使えば再宣言した関数が呼び出されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1375&quot; data-filename=&quot;007.png&quot; style=&quot;width: 281px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのstringのhashcodeとequals、そしてtostringの再定義(override)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/51.html</guid><pubDate>Mon, 11 Jan 2021 17:51:53 +0900</pubDate></item><item><title>[Java] 10. メモリの割り当て(stackメモリとheapメモリ、そしてnew)とCall by reference(ポインタによる参照)</title><link>https://www.nowonbun.com/50.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はメモリの割り当て(stackメモリとheapメモリ、そしてnew)とcall by reference(ポインタによる参照)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でクラスについて説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/47.html&quot; target=&quot;_blank&quot;&gt;[java] 7. クラスを作成する方法(コンストラクタを作成方法)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaで変数を使う時、原始データタイプ(primitive type)ではなければすべてのタイプはnewで割り当てします。&lt;/p&gt;&lt;p&gt;例えば、文字列タイプのstringを使う時に、我々はstring a = &quot;hello world&quot;と使いますが、内部的には string a = new string(&quot;hello world&quot;);と同じく処理が行います。&lt;/p&gt;&lt;p&gt;つまり、javaでは原始データタイプ(primitive type)以外はすべてがクラスタイプになっております。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスを使う時にはnewというキーワードを使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1362&quot; data-filename=&quot;001.png&quot; style=&quot;width: 233px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は当たり前ですが、我々が確認しなければならない部分はexample ex = new example(10);の部分です。&lt;/p&gt;&lt;p&gt;イコールの前のexample exの部分は変数宣言です。ここで私がexample ex = 10;に作成すればエラーが発生します。なぜなら、example exにはintタイプではなくexampleタイプのインスタンスだけ格納するのでです。&lt;/p&gt;&lt;p&gt;つまり、javaの内部ではexample ex = new example(10);に作成すると下記のイメージみたいにメモリ構造が生成されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1364&quot; data-filename=&quot;002.png&quot; style=&quot;width: 245px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでstackメモリとheapメモリにの構造について説明が必要です。&lt;/p&gt;&lt;p&gt;stackメモリは我々がプログラムを作成する時に、実行する領域を中括弧({})で作成します。この中括弧を我々はstack領域といいます。つまり、stack領域で宣言した変数はstackメモリに格納されるんだと思えば良いです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1363&quot; data-filename=&quot;003.png&quot; style=&quot;width: 478px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のイメージを見るとmain関数の中で任意の中括弧を作成して新しいstack領域を作りました。その新しい領域で宣言したdataはstack領域を外れて使えません。&lt;/p&gt;&lt;p&gt;また、元に戻ってexample exはstack領域で宣言した変数です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;new example(10)の場合はheap領域で割り当てしたことです。heap領域というのはプログラムのメモリ領域ですが、プログラムが実行すればheapメモリが生成してその中でいくらでもクラスを割り当てするし解除することができます。&lt;/p&gt;&lt;p&gt;でも、このheap領域というのはstack領域みたいに宣言する時に何処で割り当てたかは分からないです。そのため、heapで宣言したnew exampleのアドレス値をstackメモリのexample exに格納することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;改めてまとめるとstackとは静的メモリ領域としてデータを探しやすい(stackアルゴリズムでpush popでデータを探す)ですが、heapは動的メモリ領域でnewキーワードでクラス割り当て(インスタンス生成)する時のアドレス値だけで探すことができます。&lt;/p&gt;&lt;p&gt;そしてその構造を連結したことがexample ex = new example(10);の形です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なぜjavaではこんな複雑なstack=heapの構造でデータを扱うことか？&lt;/p&gt;&lt;p&gt;実はこの概念はc/c++から来た概念です。c/c++ではnewを使わなく、クラスをstack領域で割り当てることができます。原始データタイプ(primitive type)みたいにです。&lt;/p&gt;&lt;p&gt;でも、このstackメモリが無限にあることではなく、プログラムによって決めています。普通は1mbや2mbほどです。&lt;/p&gt;&lt;p&gt;このメモリのサイズはintタイプが4byteですが、約25万個ほど宣言ができるサイズです。25万個だと言えば大きいと思いますが、実はすぐ使える数値です。&lt;/p&gt;&lt;p&gt;また、stackメモリでは変数宣言だけあることではなく、関数状況(interrupt)などプログラ上で色々ことに使うことが多いです。それを考えばstackメモリの量は多いって思わないです。&lt;/p&gt;&lt;p&gt;最近のプログラムを実行すると基本何gbも簡単に超えることを見えますが、1mbはすごく少ないことです。stackに割り当てているメモリをすべて使うとstackoverflowが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとstackメモリ設定を大きくすればいいじゃないかと思えます。その通りにstackメモリサイズを大きくすればstackoverflowは解決できます。でも、stackメモリは構造がstackアルゴリズムでpushとpopでデータを探します。&lt;/p&gt;&lt;p&gt;その意味はメモリが大きくなるほどアルゴリズム効率は落ちるので遅くなります。stack構造ではなくても探索アルゴリズムになっているデータ構造(data structure)は大きくなると遅くなります。&lt;/p&gt;&lt;p&gt;すなわち、stackメモリを大きく設定するとプログラムを遅くなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;heapはstackみたいに整形化になっているデータ構造ではないのでサイズが大きくなってもプログラムが遅くなることではありません。でもheapにあるデータを参照するまてには必ずメモリアドレス値を知るべきですが、そのデータをstack領域で格納することです。&lt;/p&gt;&lt;p&gt;javaではそのアドレス値を確認するデータがhashcodeです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaではすべてのクラスがobjectクラスを継承しています。&lt;/p&gt;&lt;p&gt;このobjectクラスは基本的に９個の関数がありますが、その意味はjavaで使う原始データタイプ(primitive type)以外のすべてのクラスはすべて下記の９個の関数を持っていることの意味です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/lang/object.html&quot; target=&quot;_blank&quot;&gt;https://docs.oracle.com/javase/7/docs/api/java/lang/object.html&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;関数&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;protected object clone()&lt;/td&gt;        &lt;td&gt;オブジェクトを複製する。(別のインスタンスになる。単純にポインタコピーではない。)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;boolean equals(object obj)&lt;/td&gt;        &lt;td&gt;該当なオブジェクトと比較して同じならtrue、違うならfalseをリターン&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;protected void finalize()&lt;/td&gt;        &lt;td&gt;デストラクタと似ている関数でガベージコレクション(gc)でポインタがないことを確認する時に呼び出す。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;int hashcode()&lt;/td&gt;        &lt;td&gt;オブジェクトのハッシュコードをリターン&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;string tostring()&lt;/td&gt;        &lt;td&gt;オブジェクトの文字列をリターン&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;class getclass()&lt;/td&gt;        &lt;td&gt;オブジェクトのクラスタイプをリターン&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;void notify()&lt;/td&gt;        &lt;td&gt;モニターで待機中の一つのスレッドを再開する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;void notifyall()&lt;/td&gt;        &lt;td&gt;モニターで待機中のすべてのスレッドを再開する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;void wait()&lt;/td&gt;        &lt;td&gt;notifyとnotifyallが呼び出せる時までスレッド待機&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;void wait(long timeout)&lt;/td&gt;        &lt;td&gt;notifyとnotifyallが呼び出せる時か指定している時間までスレッド待機&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;void wait(long timeout, int nanos) &lt;/td&gt;        &lt;td&gt;notifyとnotifyallが呼び出せる時か他のスレッドが割り込み、指定している時間までスレッド待機&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;notifyとwaitの場合はスレッドを説明する時に確認しましょう。getclassとcloneはクラスのreflectionまたはデザインパターンを説明する時に確認しましょう。&lt;/p&gt;&lt;p&gt;また、hashcode、tostring、equalsに関しても説明が多いので別の投稿で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一応、オブジェクトを区分するためにhashcodeの関数を確認しましょう。&lt;/p&gt;&lt;p&gt;このハッシュコードはクラスのアドレス値をハッシュアルゴリズムで格納したことです。ハッシュアルゴリズムはデータを区分するためにデータを圧縮してバイナリに格納したことだと思えば良いです。(この投稿は何か説明しようと思えばアルゴリズムの話が多いですね。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、上のexampleインスタンスを生成して他の変数にコピーします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1370&quot; data-filename=&quot;005.png&quot; style=&quot;width: 211px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースを見ればex1にはnewキーワードでインスタンスを生成しました。そしてex2の変数にex1を格納しました。&lt;/p&gt;&lt;p&gt;hashcodeでアドレス値を確認すれば同じ値が出力します。つまり同じクラスということです。&lt;/p&gt;&lt;p&gt;そしてex2のdataを修正します。&lt;/p&gt;&lt;p&gt;結果はex1とex2は同じデータが出力します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1365&quot; data-filename=&quot;006.png&quot; style=&quot;width: 242px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、上のイメージみたいにstack変数とheapのインスタンスの構造が設定されています。ex1変数とex2変数はheap領域で同じインスタンスを指しているので、ex2の値を修正してもex1が指しているクラスには影響があることです。&lt;/p&gt;&lt;p&gt;stackとheapの構造はこれだけです。これをしっかり理解すれば基本メモリ構造理解は問題ないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;次は初心者が現場でよくするミスです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1367&quot; data-filename=&quot;007.png&quot; style=&quot;width: 259px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースを見ればexample ex1クラスをinitclass関数に渡して値を0に設定してex2の変数に格納しました。&lt;/p&gt;&lt;p&gt;ここでex1とex2は別の関数かと見れば、hashcodeが同じなので同じクラスです。つまり、ex1のdata値も0に初期化になります。&lt;/p&gt;&lt;p&gt;初心者がクラスをパラメータに渡ると別のクラスになると勘違いしますが、newを使うことではないので同じクラスです。&lt;/p&gt;&lt;p&gt;その後にそのパラメータの値をそのままにリターンしたので同じクラスになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1366&quot; data-filename=&quot;008.png&quot; style=&quot;width: 218px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;main関数だけみればex1のdataのデータ修正がありません。initclass関数のなかでsetdataをします。&lt;/p&gt;&lt;p&gt;つまり、リターンを使わなくてもクラスの中のデータを変更することができます。&lt;/p&gt;&lt;p&gt;初心者がよくミスするところですが、同じstack領域でデータ修正がなくてもデータが変更ができます。(たまに、後輩から質問がデバッグ中で特定関数を呼び出すでクラス値が変更されます。javaのバグではないでしょうか？と聞けば怒ります。)&lt;/p&gt;&lt;p&gt;これがjavaのcall by reference(ポインタによる参照)です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、クラスなのでcall by referenceの例外があります。&lt;/p&gt;&lt;p&gt;原始データタイプとそのクラスデータ、stringはcall by value(値による参照)になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1368&quot; data-filename=&quot;009.png&quot; style=&quot;width: 190px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stringデータをinitstring関数に渡ってもデータが変わらないです。実はinitstringでイコール(=)で再割当したことだからmainのex変数とinitstringのex変数は別のポインタデータになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでjavaのcall by referenceをしっかり理解すればchainメソッドパターンを作成することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1369&quot; data-filename=&quot;010.png&quot; style=&quot;width: 189px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近のプログラムトレンドが前のオブジェクト指向(oop)から関数指向のスタイルで変わりました。この時にcallback関数やchainメソッドパターン形の実装スタイルがあります。それを理解して様々なところで応用すればよいと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでメモリの割り当て(stackメモリとheapメモリ、そしてnew)とcall by reference(ポインタによる参照)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/50.html</guid><pubDate>Fri, 8 Jan 2021 17:55:28 +0900</pubDate></item><item><title>[Java] 9. アクセス修飾子とstatic</title><link>https://www.nowonbun.com/49.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はアクセス修飾子とstaticに関する説明ですこの投稿はアクセス修飾子とstaticに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でクラスに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot; https://www.nowonbun.com/47.html&quot; target=&quot;_blank&quot;&gt;[java] 7. クラスを作成する方法(コンストラクタを作成方法)&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;アクセス修飾子&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;クラスは変数と関数、コンストラクタを持っているし、その属性にアクセスするためにはアクセス修飾子が必要だと説明したことがあります。&lt;/p&gt;&lt;p&gt;アクセス修飾子はプログラミングのオブジェクト指向(oop)の４つ特徴の中でカプセル化と関係があるキーワードです。&lt;/p&gt;&lt;p&gt;カプセル化とはクラスをオブジェクトに考えて一つの目的と役割を設定してデータと機能を一つのオブジェクトに結ぶという意味になります。少し難しい概念ですね。オブジェクト指向(oop)の４つ特徴に関しては別の投稿で詳細に説明します。&lt;/p&gt;&lt;p&gt;その意味でアクセス修飾子は関数や変数、クラスのアクセスの方法に関して設定することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaで扱うアクセス修飾子は下記通りになります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;    &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;     &lt;thead&gt;      &lt;tr&gt;       &lt;td colspan=&quot;2&quot; style=&quot;background-color:#c5fdfd;&quot;&gt;アクセス修飾子&lt;/td&gt;      &lt;/tr&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;       &lt;th&gt;アクセス修飾子&lt;/th&gt;       &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;     &lt;/thead&gt;     &lt;tbody&gt;      &lt;tr&gt;       &lt;td&gt;public&lt;/td&gt;       &lt;td&gt;すべてクラスからアクセスが可能です。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;private&lt;/td&gt;       &lt;td&gt;クラス内部だけにアクセスが可能です。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;protected&lt;/td&gt;       &lt;td&gt;同じパッケージに属するクラスかつ継承されたクラスだけにアクセスが可能です。(クラス内部もアクセス可能)&lt;/td&gt;      &lt;/tr&gt;     &lt;/tbody&gt;    &lt;/table&gt;   &lt;/div&gt;&lt;p&gt;アクセス修飾子のアクセス権限は下記通りになります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;    &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;     &lt;thead&gt;      &lt;tr&gt;       &lt;td colspan=&quot;5&quot; style=&quot;background-color:#c5fdfd;&quot;&gt;アクセス権限&lt;/td&gt;      &lt;/tr&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;       &lt;th&gt;アクセス修飾子&lt;/th&gt;       &lt;th&gt;クラス&lt;/th&gt;       &lt;th&gt;継承されたクラス&lt;/th&gt;       &lt;th&gt;同じパッケージ&lt;/th&gt;       &lt;th&gt;すべてクラス&lt;/th&gt;      &lt;/tr&gt;     &lt;/thead&gt;     &lt;tbody&gt;      &lt;tr&gt;       &lt;td&gt;private&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;☓&lt;/td&gt;       &lt;td&gt;☓&lt;/td&gt;       &lt;td&gt;☓&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;(default)&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;☓&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;☓&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;protected&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;☓&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;public&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;       &lt;td&gt;○&lt;/td&gt;      &lt;/tr&gt;     &lt;/tbody&gt;    &lt;/table&gt;   &lt;/div&gt;&lt;p&gt;まず、上の表をみてまとめるとpublicとprivate、protectedの差異はクラスの外部からアクセスが可能かどうかの差異だけです。&lt;/p&gt;&lt;p&gt;publicの場合はクラスの内部、外部の関係しずにアクセスができるし、privateの場合はクラス内部、つまりインスタンス内だけアクセスができます。&lt;/p&gt;&lt;p&gt;protectedの場合は基本インスタンス外部ではアクセスができないことはprivateと同じですが、でも継承したクラスが親クラスにアクセスする時には許すということです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1358&quot; data-filename=&quot;001.png&quot; style=&quot;width: 257px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;main関数はprogramのクラス内部だけとstaticが付けているので一応、外部だと考えましょう。(staticでもクラス内部にあることに判断しますが、これについては下記のところでもっと詳細に説明します。)&lt;/p&gt;&lt;p&gt;main関数でprogramクラスをnewで割りあってインスタンスを生成しました。後にpの変数にインスタンスを格納しました。&lt;/p&gt;&lt;p&gt;ここでpの変数を通ってprint関数を呼び出しました。ここでインスタンスを生成して呼び出すことをクラス立場ではクラスの外部に判断します。&lt;/p&gt;&lt;p&gt;つまり、変数pにはfunc関数を呼び出すことができなく、print関数だけ呼び出すことができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、print関数の中をみればfunc関数を呼び出しました。特にthisキーワードを付けて呼び出しましたね。&lt;/p&gt;&lt;p&gt;つまり、そこの領域はクラス内部で内部の関数を呼び出すと判断することです。つまり、privateでもアクセスができることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;改めてまとめるとpublicはクラス外部だけ呼び出すことができる、privateとprotectedはクラス内部だけ呼び出すことができると意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、privateとprotectedの差異を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1359&quot; data-filename=&quot;002.png&quot; style=&quot;width: 289px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;privateとprotecetdは継承したクラスから親クラスにアクセスの可否を設定するアクセス修飾子です。&lt;/p&gt;&lt;p&gt;つまり、superprogramクラスのprint関数がprotectedではなく、privateだと考えば継承したprogramクラスからはsuper.print関数を呼び出すことができないという意味になります。protedtedはmain関数でprogramインスタンスのp変数からはprivateと同じ権限みたいにアクセスができません。&lt;/p&gt;&lt;p&gt;すなわち、外部ではprivateとprotectedは同じみたいですが、継承したクラスからは差異があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のアクセス修飾子のアクセス権限表からは(default)があります。(default)の場合はアクセス修飾子のキーワードがあるところで何も設定しないと意味です。基本的にprivateは同じ権限ですが、同じパッケージならpublicになる設定です。&lt;/p&gt;&lt;p&gt;でも、javaコート規約にはアクセス修飾子を省略することをお勧めしてないので、できれば明確に設定する方がよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;static&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;基本的にクラスはnewというキーワードを利用してメモリに割り当てして(インスタンス生成)使うことが基本的な流れです。&lt;/p&gt;&lt;p&gt;そのことでこのクラスの概念はただメモリにプログラムのコードを入れることではなくメンバー変数を利用してメモリ割り当てることです。関数は変数を使用することに補助的な機能だと思えばされます。&lt;/p&gt;&lt;p&gt;つまり、クラスにintタイプのメンバーが二つがあると思えば、intタイプは4byteのデータタイプなので8byteのクラスになり、インスタンス生成するとメモリに8byte空間が確保することです。関数かいくらにあってもメモリに割り当てるサイズはメンバー変数のサイズです。&lt;/p&gt;&lt;p&gt;でも、関数はこのインスタンスが生成しなければ使うことができません。なぜなら関数の中でインスタンスのメンバー変数を使うロジックがあるはずですが、インスタンスがない場合に参照することができないからです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのことならプログラムの関数はすべてクラスの中でインスタンスが生成されてないと使わないことかといえば必ずそうではないですね。必ず、変数の値を扱うことではなく、ただ計算することだけの関数もありそうです。&lt;/p&gt;&lt;p&gt;なので、staticを使うことでインスタンス生成とは関係ない関数を作ることにします。&lt;/p&gt;&lt;p&gt;上のmain関数の場合はprogramクラスの中にありますが、programのインスタンスとは関係ないという意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;staticキーワードは関数だけ使えるかといえば違います。変数にも使えます。&lt;/p&gt;&lt;p&gt;変数にはデータタイプが設定してメモリに割り当てることが必要ですが、それをどの段階で設定することになるか？&lt;/p&gt;&lt;p&gt;プログラムが開始する時に一番先に作業がプログラムの中でstaticの変数と関数を探すことです。static変数の場合はnewがある場合に割り当てするしmain関数を探して実行することです。&lt;/p&gt;&lt;p&gt;staticの場合はクラスにも付けることができますが、内部クラス、つまりクラス内部にいあるクラス、インラインクラスにつけることができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1361&quot; data-filename=&quot;003.png&quot; style=&quot;width: 352px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみればpのtest変数の値は20に変更されています。つまり、programのtest変数はインスタンスとは関係がないので、pで設定することとp1で設定することと同じ変数をみることになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、改めて上で説明したprivateキーワードに関して説明修正が必要です。&lt;/p&gt;&lt;p&gt;上でprivateは外部でアクセスが不可能なのでmain関数からアクセスができないといいました。でも、上のソースをみればtest変数にstaticを設定したので、インスタンスと関係ない変数になりました。つまりインスタンスの外部のオブジェクトです。&lt;/p&gt;&lt;p&gt;でもアクセスが可能です。つまり、public、privateの差異はメモリ構造の差異で外部、内部を分けることではなく、単純に括弧({})の区分で外部、内部を区分することを思えます。&lt;/p&gt;&lt;p&gt;つまり、main関数もprogramのクラスの内部であるので、pの変数でアクセスしても内部で判断するのでアクセスが可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとstatic関数からインスタンス変数をアクセスできるか？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1360&quot; data-filename=&quot;004.png&quot; style=&quot;width: 565px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;static関数からインスタンス変数にアクセスすることでは可笑しいですね。staticはプログラムの中でただ一つのデータですが、インスタンスデータは何個かに生成することができるからです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでアクセス修飾子とstaticに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/49.html</guid><pubDate>Thu, 24 Dec 2020 14:06:41 +0900</pubDate></item><item><title>[Java] 8. クラスの継承とthis、superキーワードの使い方</title><link>https://www.nowonbun.com/48.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はクラスの継承とthis、superキーワードの使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にクラスを作成する方法に関して投稿しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/47.html&quot; target=&quot;_blank&quot;&gt;[java] 7. クラスを作成する方法(コンストラクタを作成方法)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスは一つの目的をおいて構成すると説明しました。でも仕様によって様々なクラスをオブジェクトを作れば似ているクラスを多数に作ることを見れることがあります。&lt;/p&gt;&lt;p&gt;以前の投稿で説明した家計計算クラスで例を説明したことがありますが、それを参照して説明します。&lt;/p&gt;&lt;p&gt;privatefinanceのクラスは入金、出金に関数クラスです。基本的に入金、出金を貰って最終にcalculator関数を通って値段を計算することです。&lt;/p&gt;&lt;p&gt;でも、ここで仕様によって通帳の内訳の機能があるクラスを追加したいです。つまり、クラスの内容は基本的に入金、出金は同じですが、入金、出金の順番と内容がある内訳が必要です。&lt;/p&gt;&lt;p&gt;ここで条件は上のクラスはもうサービスで運用しているし、もう検証が終わったクラスなので、できれば修正したくないです。なぜなら、修正があるとまた検証のためにテストが必要からです。上のクラスはすごく簡単のクラスだから少し修正しても問題ないですが、もっと複雑な仕様だと思えば理解すると思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その条件にするとすごく簡単にする方法は上のクラスをコピペしてクラス名を変更して作成すればよいです。また、他の仕様が追加すれば、そのことに続けてクラスをコピペで追加すればよいです。&lt;/p&gt;&lt;p&gt;でも、javaの仕様によってlistクラスは使用禁止になりました。その可能性はほぼ0パーセントになりますが、例えばのとして考えます。&lt;/p&gt;&lt;p&gt;それば問題がすべてのクラスのメンバー変数のinputとoutputのデータタイプを変更しなければならないです。そのクラスが20個~30個にするとすべて修正してすべてテスト及び検証しなければならないです。&lt;/p&gt;&lt;p&gt;実際のプロジェクトで本当にその作業することが多いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、上の問題はjavaの継承の機能を利用すればすごく簡単に解決します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1357&quot; data-filename=&quot;001.png&quot; style=&quot;width: 397px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のaccountクラスはprivatefinanceのクラスを継承しました。&lt;/p&gt;&lt;p&gt;クラスを継承する時にはextendsのキーワードを使います。javaの継承ルールは二つ以上のクラスの複数継承は禁止されています。つまり、一つだけのクラスを継承することができます。&lt;/p&gt;&lt;p&gt;継承の意味はaccountクラスでprivatefinanceのクラスのすべての機能を使えることができるという意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれはmain関数でaccountクラスにはcalculator関数がないので呼び出すことができます。でも親クラスのprivatefinanceのクラスでそのクラスがあるから使えることです。&lt;/p&gt;&lt;p&gt;accountクラスでinput関数を作成しました。privatefinanceのクラスにもあるクラスですが、input関数を再作成しました。でもaccountクラスのinput関数とprivatefinanceクラスのinput関数はパラメータタイプが違うので同じ関数ではないです。&lt;/p&gt;&lt;p&gt;でも同じパラメータなら作成することができないかというとjavaには再定義(override）という機能がありまして、可能です。再定義(override)のことは説明が長いので別途の投稿で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;後、accountクラスのinput関数をみれば中でsuper.input(money)を作成したことを確認できます。&lt;/p&gt;&lt;p&gt;ここでthisとsuperの差異を分かりますが、thisは現在のクラス(accountクラス)の領域を参照すること、superは親クラス(privatefinanceクラス)の領域を話すことです。&lt;/p&gt;&lt;p&gt;つまり、super.inputはprivatefinanceクラスのinput関数を呼び出すことです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1356&quot; data-filename=&quot;002.png&quot; style=&quot;width: 289px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればprogramクラスのrun関数を呼び出したらthisとsuperの差異が明確に見えます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それなら継承の長所はなにか？&lt;/p&gt;&lt;p&gt;ソースの可読性がよくなります。ソースの可読性はどの程にソースが簡単に読めるかということですが、ソースのステップが少なるから可読性がよくなることです。&lt;/p&gt;&lt;p&gt;管理の容易性もよいです。もし、コピペでクラスを作成したと思えば最初のクラスでバグがある場合にコピペしたすべてのクラスを修正しなければならないです。そうなら作業の漏れが発生する可能性もあるし、そのことで管理性が大変になることです。&lt;/p&gt;&lt;p&gt;でも、継承機能を利用すれば？そうです。最初の親クラスだけ修正すればすべてか反映されます。&lt;/p&gt;&lt;p&gt;そして最初にクラスの継承はoop特性の一つなので、そのことによって設計パターンと開発方法が多いし、javaというプログラム言語をすごく効率的に利用することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでクラスの継承とthis、superキーワードの使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/48.html</guid><pubDate>Wed, 23 Dec 2020 18:49:43 +0900</pubDate></item><item><title>[Java] 7. クラスを作成する方法(コンストラクタを作成方法)</title><link>https://www.nowonbun.com/47.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はクラスを作成する方法(コンストラクタを作成方法)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaではクラスとは実行するための最小単位の動作する形です。我々がmain関数を利用してプログラムを実行しましたが、構造で確認すればすべてclassのキーワードでスタックを囲まれました。&lt;/p&gt;&lt;p&gt;上の例はprogramのクラスでmain関数を作成して実行する例のソースです。 プログラムでmain関数を実行することでは別にクラスが必要なことではないですが、基本構造としてクラスをなしで関数を作成することがjavaでは不可能です。&lt;/p&gt;&lt;p&gt;改めてまとめると、javaはクラスがなしでプログラムを作成することができません。&lt;/p&gt;&lt;p&gt;クラス内部では作成するのはコンストラクタ、関数を作成することができます。そしてクラスのサイズを決定するメンバー変数を設定することができます。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;    &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;     &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;       &lt;th&gt;クラス要素&lt;/th&gt;       &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;     &lt;/thead&gt;     &lt;tbody&gt;      &lt;tr&gt;       &lt;td&gt;コンストラクタ&lt;/td&gt;       &lt;td&gt;クラスの初期処理及び関連機能処理&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;メンバー変数&lt;/td&gt;       &lt;td&gt;フィールドという呼ばれるグローバル変数&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;関数&lt;/td&gt;       &lt;td&gt;メソッド&lt;/td&gt;      &lt;/tr&gt;     &lt;/tbody&gt;    &lt;/table&gt;   &lt;/div&gt;&lt;p&gt;クラスで上の属性を使うためには必ずアクセス修飾子が必要です。アクセス修飾子は別途の投稿で説明します。&lt;/p&gt;&lt;p&gt;一応、変数はprivate、関数はpublicで設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1354&quot; data-filename=&quot;001.png&quot; style=&quot;width: 295px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを実行するとデバッガーは始めにstatic main関数を探します。関数でstaticキーワードが付けると内部関数ではないと思えばよいです。詳細に関しては別の投稿で説明します。&lt;/p&gt;&lt;p&gt;つまり、main関数は外部関数なのでprogramインスタンスが生成することは関係なく、呼び出すことができます。&lt;/p&gt;&lt;p&gt;programのクラスをインスタンスを生成します。それはnewキーワードを利用します。newキーワードはメモリ割り当てと関係がある内容なのでこれも別途の投稿で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インスタンスが生成する時にはクラスのコンストラクタが呼び出します。&lt;/p&gt;&lt;p&gt;コンストラクタはリターンタイプが決めてないし、クラス名と同じ名の関数名に作成します。なのでnewでインスタンスを生成する時にパラメータを個数とタイプを合せなければならないです。&lt;/p&gt;&lt;p&gt;上の例だと、コンストラクタでthis.aをしてメンバー変数のaにパラメータ値を格納しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてまたmain関数に戻りましょう。インスタンス生成は変数pに割り当てます。&lt;/p&gt;&lt;p&gt;pという変数にアクセス可能なことはpublicのアクセス制限が設定されているものです。つまりprivateの変数はmain関数では操作ができません。&lt;/p&gt;&lt;p&gt;なので、main関数で呼び出せることはfunc関数とprint関数だけです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;func関数ではthis.aを利用してクラス内部のメンバー変数aの値をリターンします。&lt;/p&gt;&lt;p&gt;main関数でfunc関数から受け取ったデータをコンソールに出力するとコンストラクタで設定した10の値が表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;main関数で最後ステップでprint関数を呼び出します。&lt;/p&gt;&lt;p&gt;print内部ではコンソール出力ステップしかないので、コンソールにprint!ということが表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;programクラスでnewキーワードを利用して割り当てしてないもの、つまりインスタンス生成してないものではfunc関数やprint関数を使えません。インスタンス生成なしで使える関数はstaticが付けている関数だけです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスを作成する時にはクラス名とファイル名が一致しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1355&quot; data-filename=&quot;002.png&quot; style=&quot;width: 765px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスは生成する単位はクラスを目的が詳細にあるオブジェクトとして作成しなければならないです。(oopの四つの特徴)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例として家計の目的を持っているクラスを生成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1353&quot; data-filename=&quot;003.png&quot; style=&quot;width: 295px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のクラスは家計簿の目的を持っているクラスです。機能としては入金、出金して残額を計算する機能しかないです。&lt;/p&gt;&lt;p&gt;でも、内訳リストの作ることもできるし、利子計算も入れる機能もいれて、クラス一つのことでお金を管理できる家計簿オブジェクトを作ることができます。&lt;/p&gt;&lt;p&gt;しかし、急にここで家計ではなく、料理レシピの関係なデータを入れることにするとクラスの目的性が可笑しくなります。作ることにすればできないことではありませんが、oopの特徴や目的性などにはよくない開発方法です。&lt;/p&gt;&lt;p&gt;そのことに関しては別途の投稿で詳細に確認しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでクラスを作成する方法(コンストラクタを作成方法)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/47.html</guid><pubDate>Tue, 22 Dec 2020 17:16:09 +0900</pubDate></item><item><title>[Java] 6. 関数の使い方(関数のオーバーロードと再帰的な方法について)</title><link>https://www.nowonbun.com/46.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿は関数の使い方(関数のオーバーロードと再帰的な方法について)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;すべてのプログラムの言語で関数の使い方は文法的な差異がありますが、概念についてはc言語からすべて似ているです。&lt;/p&gt;&lt;p&gt;プログラムの言語で関数は二つの概念があります。&lt;/p&gt;&lt;p&gt;一つは関数は変数と違い、メモリ割り当てがなしで単純な処理概念だけあるので、main関数から始ますプログラム設計をもっと見やすく分ける役割をします。&lt;/p&gt;&lt;p&gt;二つは数学的な関数と同じ概念で「f(x)=x+1」みたいに関数の目的をはっきりして「f(1)=2、f(2)=3」みたいに関数とパラメータの組み合てで一つ以上の二項関係を生成してプログラムの正義を単純にします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaで関数の使い方は下記通りになります。&lt;/p&gt;&lt;p&gt;アクセス修飾子は関数のアクセス設定ですが、これは関数の機能によりクラスのカプセルと関係があるので別の投稿で説明します。&lt;/p&gt;&lt;p&gt;関数を定義するのはメソッド名が一番重要ですが、javaはオーバーロード機能があり、メソッドの名+パラメータの組み合てで結んで関数を定義します。&lt;/p&gt;&lt;p&gt;オーバーロードは投稿の下の部分の詳しく説明します。まず、関数のリターンタイプ(データタイプ)、メソッドの名、パラメータの構造で作成されます。リターンタイプが無い場合じゃなければ、すべて関数でreturnを生成してタイプを一致しなければならないように作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1349&quot; data-filename=&quot;001.png&quot; style=&quot;width: 335px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もし、上の処理式みたいに関数を使わなくてもmain関数で計算してプログラムを実装することができます。　でも関数を使うことで同じ処理を一つにまとめることができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1350&quot; data-filename=&quot;002.png&quot; style=&quot;width: 239px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいに少し複雑な計算を関数式に変換するとコードの可読性もよくなるし、関数再使用がよくなるのでソース管理のこともよくなります。calcという関数は可変のパラメータから値段を受け取って税金の10パーセントの計算まで処理してリターンする関数です。&lt;/p&gt;&lt;p&gt;もし、この関数の内容もmainに計算式を入れてプログラムを作成することも可能です。でも同じ計算式がmain関数に作成しソースのステップがすごく大きくなります。これは数学の因数分解、置換性と関係があることですね。&lt;/p&gt;&lt;p&gt;つまり、main関数でa、b、c、dの変数宣言した後にa、c、dの総額合算+税金計算+コンソール出力、a、cの総額合算+税金計算+コンソール出力、b、c、dの総額合算+税金計算+コンソール出力の処理になることで総額合算+税金計算を関数に生成したことです。&lt;/p&gt;&lt;p&gt;これがもっと複雑なプログラムになると思えば関数の再使用性、可読性がもっと重要に見えることになります。&lt;/p&gt;&lt;p&gt;改めてまとめると、計算式をmain関数で作成することができますが、それを機能別及び処理別に分けて関数式に表現することになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関数のオーバーロードは関数を生成する時に関数名とパラメータで区分するといいました。&lt;/p&gt;&lt;p&gt;それで関数名はすべて同じですが、パラメータタイプの別ので別の関数を作ることができます。これがjavaのoop特性中でポリモーフィズムということです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1352&quot; data-filename=&quot;003.png&quot; style=&quot;width: 347px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;確実にfuncの名の関数が三つあります。でも、パラメータ個数やタイプがすべて別です。なので、main関数で呼び方によって呼び出せる関数は違うことが確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関数の中で自分の関数を呼び出すこともできます。それを関数の再帰的な方法といいます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1351&quot; data-filename=&quot;004.png&quot; style=&quot;width: 344px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;階乗式は「10! = 9! + 10」、「9! = 8! + 9」という数学的な関数式があります。&lt;/p&gt;&lt;p&gt;つまり、f(x) = f(x-1) + xの関数式を考えられますが、それをそのままプログラムに反映することができます。ここで関数の中で自分の関数を呼び出すことに再帰的な関数呼出式ということにします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムで再帰呼び出しはパフォーマンスに悪影響にしますが、stack overflowが発生する可能性があります。&lt;/p&gt;&lt;p&gt;つまり、探索や数学的な繰り返し計算する時には再帰みたいにしやすく作れることはありませんが、パフォーマンスには悪いのでできればforを通って関数を作成する方がよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1351&quot; data-filename=&quot;004.png&quot; style=&quot;width: 344px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも仕様によって探索アルゴリズムでは再帰関数がもっと早いケースもあるので、仕様によってどんな形で作成するかを決めなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで関数の使い方(関数のオーバーロードと再帰的な方法について)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/46.html</guid><pubDate>Mon, 21 Dec 2020 17:14:04 +0900</pubDate></item><item><title>[Java] 5. 配列とリスト(List)、マップ(Map)の使い方</title><link>https://www.nowonbun.com/45.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿は配列とリスト(list)、マップ(map)の使い方に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;配列は以前c/c++でデータをデータタイプのサイズによって順番的に並べることが配列だといいます。javaはランタイムメモリ構造なのでデータがメモリに順番的に並べることについては意味がありません。すべてデータをポインターで連結するからです。&lt;/p&gt;&lt;p&gt;それでも使うことは同じデータタイプのデータを一つの変数名に格納することが可能し、不要なステップを減ることができるし、連結リスト構造みたいにポインター検索ではないので検索する時にパフォーマンスがよくなるからです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;配列を宣言することは変数の大括弧で宣言することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1347&quot; data-filename=&quot;001.png&quot; style=&quot;width: 196px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の大括弧を一つ使ったことを一次元配列だといいます。そうすれば、配列の中で配列を使えるか？&lt;/p&gt;&lt;p&gt;それを多次元配列といいます。大括弧は開き、閉めの個数ほと次元が増えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1348&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;配列の短所は宣言する時に配列の個数を宣言してその以上のデータを格納するとエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1346&quot; data-filename=&quot;003.png&quot; style=&quot;width: 743px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;配列で宣言することを静的宣言といいまうが、我々が複数のデータを扱う時に先にデータ個数を何個使うかを知る時がありますが、入力個数が仕様によって何個使うかを知らない場合もあります。&lt;/p&gt;&lt;p&gt;それを動的宣言といいますが、それは配列ではなくlistクラスで扱うことができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaはリスト(list)のオブジェクトがインタフェースに構成させ、実装されているクラスはarraylistとlinkedlistがあります。&lt;/p&gt;&lt;p&gt;arraylistは内部的に配列形式になって、linkedlistは連携リストの構造になっています。(データ構造とアルゴリズムは別途の投稿で説明します。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1344&quot; data-filename=&quot;004.png&quot; style=&quot;width: 316px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;配列の場合は複数個数を宣言すると特定な位置のデータを取り除くのができません。でもリスト(list)の場合は入力する個数を決めることもないし、どの位置でも挿入、取り除きができます。&lt;/p&gt;&lt;p&gt;linkedlistとarraylistは基本的にlistインタフェースを継承しましたので、使い方は同じです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リスト(list)は配列に比べて随分に動的だしデータ入れ除くが楽です。データ探索することでも配列とリストは似てます。&lt;/p&gt;&lt;p&gt;上の例では一つ、二つのデータを例をしましたが、データが何万個になると探索も随分重要になります。 データを探すたびにfor文を利用して0から何万まで繰り返すと思えばパフォーマンスに影響があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでリスト(list)構造でキーを登録できる構造がマップ(map)ということがあります。&lt;/p&gt;&lt;p&gt;マップ(map)のオブジェクトもインタフェースになっているし、実装されているクラスはハッシュマップ(hashmap)とトリーマップ(treemap)があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1345&quot; data-filename=&quot;005.png&quot; style=&quot;width: 264px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リスト(list)とマップ(map)の使用比率を考えばマップ(map)のほうがよく使います。普通データベースからデータを取得すると仕様によってリスト(list)を使う時もありますが、キーのよってデータ探索がしやすいマップ(map)が楽でしょう。&lt;/p&gt;&lt;p&gt;リスト(list)とマップ(map)は後、ストリーム式(stream　expression)に使いことになってソートや分類のプログラミングになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで配列とリスト(list)、マップ(map)の使い方に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/45.html</guid><pubDate>Fri, 18 Dec 2020 14:36:13 +0900</pubDate></item><item><title>[Java] 4. 制御文</title><link>https://www.nowonbun.com/44.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿は制御文に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;制御文とはプログラムの流れを制御するか繰り返しを決定するキーワードという意味です。&lt;/p&gt;&lt;p&gt;例えば、関係演算子か論理演算子を通って二つの変数でブール(boolean)の値によってtrueの時には処理や、falseの時に処理を制御すること、またその処理は繰り返して何回に処理することを制御するという意味です。&lt;/p&gt;&lt;p&gt;この制御文は始めc言語から派生した文法でjavaやc#などのほぼすべてのプログラム言語が表現することは文法として差異があるかもしれませんが、処理方法は同じです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;制御文は処理する方法に関して条件文、選択文、繰り返し文、分岐文ということに区分になります。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;if ~ else if ~ else&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;if ~ else if ~ elseはブール(boolean)の値によって処理する条件文です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1339&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 450px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;要約してif文の条件が真(true)なら当該なスタックを実行する構造です。最後にelseがある場合、ifやelse ifがすべて偽ならelseのスタックを実行されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1338&quot; data-filename=&quot;002.png&quot; style=&quot;width: 346px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を説明すると始めの条件でaの変数の条件を確認します。&lt;/p&gt;&lt;p&gt;aのブール値がtrueなのでif(a)のスタックが実行されます。なのでコンソールには「first condition = true」のメッセージがコンソールに表示されます。&lt;/p&gt;&lt;p&gt;次の条件式でif~elseですが、変数aがtrueならif(a)のスタックが実行されるし、falseならelseのスタックが実行されます。aの値をfalseに設定したので、「second condition = false」のメッセージがコンソールに表示されます。&lt;/p&gt;&lt;p&gt;最後は変数の関係演算子でtrue、falseの値を計算してスタックが実行されるように設定しました。&lt;/p&gt;&lt;p&gt;bの値は2なのでelse if(b==2)のスタックが実行されます。なので「third condition b = 2」がコンソールに表示されます。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;switch ~ case&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;switch ~ caseの選択文でif ~ else if ~ elseと似ている処理に行います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1340&quot; data-filename=&quot;003.jpg&quot; style=&quot;width: 450px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;switch ~ caseで重要なキーワードはbreakです。switchの条件数式と合う値を探してスタックが実行されますが、breakがなければ当該caseスタックだけではなく、当該なcaseの以下のスタックもすべて実行してしまうことになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1336&quot; data-filename=&quot;004.png&quot; style=&quot;width: 191px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を見ると始めのswitch ~ caseはdataの値によってコンソールにメッセージが表示されることを確認できます。&lt;/p&gt;&lt;p&gt;しかし、二つ目のswitch ~ caseはcaseスタックにbreakがないのでcase 10からcase 1までのすべてのスタックが実行されます。なのでsumの変数のデータは10から1まで足した値になります。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;for&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;for文はプログラム制御文法でifと一緒に一番よく使う制御文ではないかと思います。&lt;/p&gt;&lt;p&gt;for文の条件式はセミコロン(;)を区分で初期値、条件式、増減式の値を設定します。&lt;/p&gt;&lt;p&gt;初期値には条件式で使う変数を設定するし、その初期値の変化を増減式に設定、条件式で格好にあるスタックを実行するかを判断する構成になります。&lt;/p&gt;&lt;p&gt;条件式の判断はif条件式みたいにブール(boolean)の値で判断することになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1341&quot; data-filename=&quot;005.png&quot; style=&quot;width: 243px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もし条件式でfalseの値が出る条件を構成できなければ、無限ループ、つまりforの繰り返しが終わらない状況になります。&lt;/p&gt;&lt;p&gt;javaのfor文の場合はデザインパターンのiteratorパターンを実装することが可能です。配列、リスト、ストリーム(stream)の場合、配列の一つのデータを受け取って(.next()関数)、nullを確認して(.has()関数)、nullではない場合、スタック領域が実行するパターンを実装することができます。&lt;/p&gt;&lt;p&gt;詳細なことは後配列やlistを説明する時に説明します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1342&quot; data-filename=&quot;006.png&quot; style=&quot;width: 276px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;while&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;while文はfor文で初期式と増減式を取り除いて、条件式だけある繰り返し文です。&lt;/p&gt;&lt;p&gt;whileの場合は初期式と増減式がないので無限ループになることを常に気を付けなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1333&quot; data-filename=&quot;007.png&quot; style=&quot;width: 165px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;do ~ while&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;do ~ whileはwhileと似てますがスタック領域と条件式が裏返しています。&lt;/p&gt;&lt;p&gt;つまり、whileは条件式を確認(true、false)してスタック領域を実行しましたが、do ~ whileは先にスタック領域を実行して条件式で繰り返すか判断する文法です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1334&quot; data-filename=&quot;008.png&quot; style=&quot;width: 218px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;break&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;breakはswitch ~ caseで少し説明した分岐文です。breakは実はforやwhile、do~whileともっと近い分岐文です。&lt;/p&gt;&lt;p&gt;繰り返し文は条件式によって繰り返す回数が決めていますが、条件式ではなく特定条件式によって繰り返すことを抜け出す時に使う制御文です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1335&quot; data-filename=&quot;009.png&quot; style=&quot;width: 219px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;二重三重の繰り返しの場合、繰り返し文にラベルを指定してbreakを通って特定繰り返しを抜け出すことができます。&lt;/p&gt;&lt;p&gt;ラベルが指定されてない場合は違い繰り返しを抜け出します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1343&quot; data-filename=&quot;010.png&quot; style=&quot;width: 337px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ラベルを指定してbreakを設定することは可読性によくないのでお勧めではありません。関数を利用して分岐別に分けることが文法としてよいです。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;continue&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;continueの文法はbreakと似てます。差異点はbreakは繰り返しを抜け出すことならcontinueの場合は実行しているスタックだけ飛ばすことです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1337&quot; data-filename=&quot;011.png&quot; style=&quot;width: 113px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はfor文で0から9まで繰り返します。continue文でスタック実行が飛ばすので、i%2の場合、つまり偶数の場合はコンソール出力をしてないので、奇数だけコンソール出力します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで制御文に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/44.html</guid><pubDate>Thu, 17 Dec 2020 18:11:28 +0900</pubDate></item><item><title>[Java] 3. 演算子</title><link>https://www.nowonbun.com/43.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿は演算子に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;演算子という意味は数式を計算する記号です。プログラムで使っている数学的な記号は我々が数学時間で勉強した数学記号とほぼ同じ意味です。&lt;/p&gt;&lt;p&gt;それでプログラムで演算記号で勘違いことが少ないです。しかしプログラムではただ数学が表現だけではなくビット演算、論理演算記号があるので区分しておくほうが良いです。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;	&lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;		&lt;thead&gt;			&lt;tr style=&quot;background-color:#dad7d7&quot;&gt;				&lt;th&gt;演算子&lt;/th&gt;				&lt;th&gt;使用方法&lt;/th&gt;				&lt;th&gt;説明&lt;/th&gt;			&lt;/tr&gt;		&lt;/thead&gt;		&lt;tbody&gt;			&lt;tr&gt;				&lt;td colspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;算術演算子&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;++&lt;/td&gt;				&lt;td&gt;++a, a++&lt;/td&gt;				&lt;td&gt;値を1を増加する。(前位,後位演算子)&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;--&lt;/td&gt;				&lt;td&gt;--a, a--&lt;/td&gt;				&lt;td&gt;値を1を加減する。(前位,後位演算子)값을 하나 감소시킵니다.(전위, 후위 연산자)&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;+&lt;/td&gt;				&lt;td&gt;a + b&lt;/td&gt;				&lt;td&gt;足す算&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;-&lt;/td&gt;				&lt;td&gt;a - b&lt;/td&gt;				&lt;td&gt;引く算&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;*&lt;/td&gt;				&lt;td&gt;a * b&lt;/td&gt;				&lt;td&gt;掛ける算&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;/&lt;/td&gt;				&lt;td&gt;a / b&lt;/td&gt;				&lt;td&gt;割る算&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;%&lt;/td&gt;				&lt;td&gt;a % b&lt;/td&gt;				&lt;td&gt;割れ残り&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td colspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;関係演算子&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;gt;&lt;/td&gt;				&lt;td&gt;a &amp;gt; b&lt;/td&gt;				&lt;td&gt;aがbより大きならtrueを返却、少ないか同じならfalseを返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;gt;=&lt;/td&gt;				&lt;td&gt;a &amp;gt;= b&lt;/td&gt;				&lt;td&gt;aがbより大きいか同じならtrueを返却、少ないならfalseを返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;lt;&lt;/td&gt;				&lt;td&gt;a &amp;lt; b&lt;/td&gt;				&lt;td&gt;aがbより少ないならtrueを返却、大きいか同じならfalseを返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;lt;=&lt;/td&gt;				&lt;td&gt;a &amp;lt;= b&lt;/td&gt;				&lt;td&gt;aがbより少ないか同じならtrueを返却、大きいならfalseを返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;==&lt;/td&gt;				&lt;td&gt;a == b&lt;/td&gt;				&lt;td&gt;aとb同じならtrueを返却、違いならfalseを返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;!=&lt;/td&gt;				&lt;td&gt;a != b&lt;/td&gt;				&lt;td&gt;aとbが違いならtrueを返却、同じならtrueを返却&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td colspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;ビット演算子&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;lt;&amp;lt;&lt;/td&gt;				&lt;td&gt;a &amp;lt;&amp;lt; b&lt;/td&gt;				&lt;td&gt;整数aの2進数値を左にbほど移動させ、残りは0にする。例) 0001(1) &amp;lt;&amp;lt; 2 = 0100(4)&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;gt;&amp;gt;&lt;/td&gt;				&lt;td&gt;a &amp;gt;&amp;gt; b&lt;/td&gt;				&lt;td&gt;整数aの2進数の値を左にbほど移動させ、残りは正数の場合0に負数は1にする。例) 0100(4) &amp;gt;&amp;gt; 2 = 0001(1)&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;amp;&lt;/td&gt;				&lt;td&gt;a &amp;amp; b&lt;/td&gt;				&lt;td&gt;aとbのand計算 계산 ex) 4(0100) &amp;amp; 5(0101) = 4(0100)&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;|&lt;/td&gt;				&lt;td&gt;a | b&lt;/td&gt;				&lt;td&gt;aとbのor計算 ex) 4(0100) | 5(0101) = 5(0101)&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;^&lt;/td&gt;				&lt;td&gt;a ^ b&lt;/td&gt;				&lt;td&gt;aとbのxor計算 ex) 4(0100) ^ 5(0101) = 1(0001)&lt;/td&gt;			&lt;/tr&gt;            &lt;tr&gt;				&lt;td colspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;論理演算子&lt;/td&gt;			&lt;/tr&gt;            &lt;tr&gt;				&lt;td&gt;&amp;amp;&amp;amp;&lt;/td&gt;				&lt;td&gt;a &amp;amp;&amp;amp; b&lt;/td&gt;				&lt;td&gt;and演算子、つまりaとbがブール値の設定で true &amp;amp;&amp;amp; true なら true、 true &amp;amp;&amp;amp; false なら false の結果&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;||&lt;/td&gt;				&lt;td&gt;a || b&lt;/td&gt;				&lt;td&gt;or演算子、つまりaとbがブール値の設定で true || true なら true、 true || fasle なら true の結果&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td colspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;대입 연산자&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;+=&lt;/td&gt;				&lt;td&gt;a += b&lt;/td&gt;				&lt;td&gt;a = a + b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;-=&lt;/td&gt;				&lt;td&gt;a -= b&lt;/td&gt;				&lt;td&gt;a = a - b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;*=&lt;/td&gt;				&lt;td&gt;a *= b&lt;/td&gt;				&lt;td&gt;a = a * b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;/=&lt;/td&gt;				&lt;td&gt;a /= b&lt;/td&gt;				&lt;td&gt;a = a / b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;%=&lt;/td&gt;				&lt;td&gt;a %= b&lt;/td&gt;				&lt;td&gt;a = a % b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;amp;=&lt;/td&gt;				&lt;td&gt;a &amp;amp;= b&lt;/td&gt;				&lt;td&gt;a = a &amp;amp; b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;|=&lt;/td&gt;				&lt;td&gt;a |= b&lt;/td&gt;				&lt;td&gt;a = a | b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;^=&lt;/td&gt;				&lt;td&gt;a ^= b&lt;/td&gt;				&lt;td&gt;a = a ^ b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;lt;&amp;lt;=&lt;/td&gt;				&lt;td&gt;a &amp;lt;&amp;lt;= b&lt;/td&gt;				&lt;td&gt;a = a &amp;lt;&amp;lt; b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;&amp;gt;&amp;gt;=&lt;/td&gt;				&lt;td&gt;a &amp;gt;&amp;gt;= b&lt;/td&gt;				&lt;td&gt;a = a &amp;gt;&amp;gt; b;と同じ意味&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td colspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;三項演算子&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;?&lt;/td&gt;				&lt;td&gt;a = b == c ? d : e&lt;/td&gt;				&lt;td&gt;bとcが同じならaにdの値を格納、bとcが違いないらeの値を格納&lt;/td&gt;			&lt;/tr&gt;		&lt;/tbody&gt;	&lt;/table&gt;&lt;/div&gt;&lt;p&gt;算術演算子で前位、後位演算子の差異の説明です。&lt;/p&gt;&lt;p&gt;ただ、プログラムでa++と++aだけ実装すると別に差異がありません。でも他の演算記号があれば意味が全然違います。&lt;/p&gt;&lt;p&gt;つまり、c=b+a++とc=b+ ++aは違い意味になるということです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1328&quot; data-filename=&quot;001.png&quot; style=&quot;width: 257px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前位、後位は足す算、引く算だけあります。掛ける算と割る算は代入演算子を利用して使います。(例: a*=2;)&lt;/p&gt;&lt;p&gt;プログラムとしてはその機能がありますが、実際には後位演算式しか使わないです。なぜなら、前位、後位が混雑になると計算式の可読性が悪くなるし勘違いする可能性が高いのでお勧めではありません。&lt;/p&gt;&lt;p&gt;プログラムを暗号化することではなく、チームの皆が共有しながら作業するプロジェクトなので便利性より可読性がもっと重要に考えなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1331&quot; data-filename=&quot;002.png&quot; style=&quot;width: 211px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ビット演算子は2進数の概念なので少し数学的な計算です。&lt;/p&gt;&lt;p&gt;でも、実際にプログラムを作成する時にはほぼflag形式に使うか16進数か8進数のデータを使う時にはよく使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1332&quot; data-filename=&quot;003.png&quot; style=&quot;width: 223px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1330&quot; data-filename=&quot;004.png&quot; style=&quot;width: 242px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のビッド演算だけみると10進数より見にくいのでよく使わないらしいですが、flag設定でよく使います。&lt;/p&gt;&lt;p&gt;知っておくとすごく便利な機能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1329&quot; data-filename=&quot;005.png&quot; style=&quot;width: 220px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースみたいに変数をする必要がなしで一つの変数で四つの情報を入れることができます。洗濯したか掃除したかの情報です。&lt;/p&gt;&lt;p&gt;ビット値は上みたいによく使うので参考してください。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで演算子に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/43.html</guid><pubDate>Wed, 16 Dec 2020 17:14:43 +0900</pubDate></item><item><title>[Java] 2. 変数と定数の宣言方法、そして原始データタイプとクラスデータタイプの差異</title><link>https://www.nowonbun.com/42.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿は変数と定数の宣言方法、そして原始データタイプとクラスデータタイプの差異に関する説明です。&lt;/p&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;プログラムを始めに習う時に一番初めに説明することはこの変数と定数を宣言することではないかと思います。&lt;/p&gt;&lt;p&gt;変数と定数というのはプログラム中で宣言する方法、使い方法だけの差異があることで実際にシステムの中では同じ意味のキーワードです。それで一応、説明をしやすくするためにすべて変数ということで説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;パソコンは大きく見ればcpuとメモリ、ハードディスクに構成しているし、一般的なio(input、output)装置でモニター、キーボード、マウスがあります。&lt;/p&gt;&lt;p&gt;cpuとは演算する装置だし、メモリとハードディスクはデータを格納する装置です。メモリとハードディスクはパソコンやプログラムが終了してもデータが保存されるか消滅するかの差異があります。&lt;/p&gt;&lt;p&gt;ここで我々がプログラムを作成する時、メモリにデータを一時的に保存する必要があります。それがプログラム言語で変数の役割です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;変数のタイプは(primitive type基準)大きく見れば整数型、実数型、文字型、ブール型に分けます。&lt;/p&gt;&lt;p&gt;整数型ではint、byte、short、longタイプがあり、実数型はfloat、doubleタイプがあります。文字型はcharタイプがります。ブール型の場合は真偽の区分でbooleanタイプがあります。&lt;/p&gt;&lt;p&gt;ここで私の経験上でよく使うデータタイプはint、byte、booleanがあり、たまにcharタイプを使うことがあります。小数点以下のデータを表現するためにはfloatとdoubleを使いますが、最近は「浮動小数点誤差」というバグではないバグがありますが、それのせいで計算上にエラーが発生する時があるのでbigdecimalを使います。(bigdecimalはprimitive typeではなくクラスタイプです。)&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;	&lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;		&lt;thead&gt;			&lt;tr style=&quot;background-color:#dad7d7&quot;&gt;				&lt;th&gt;データタイプ&lt;/th&gt;				&lt;th&gt;説明&lt;/th&gt;			&lt;/tr&gt;		&lt;/thead&gt;		&lt;tbody&gt;			&lt;tr&gt;				&lt;td colspan=&quot;2&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;文字型データタイプ&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;char&lt;/td&gt;				&lt;td&gt;16ビッドユニーコード文字(アスキーコード参考)&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;string&lt;/td&gt;				&lt;td&gt;byte(unsigned char)タイプになっているユニーコード文字列タイプクラス&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td colspan=&quot;2&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;ブール型データタイプ&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;boolean&lt;/td&gt;				&lt;td&gt;真(true)、 偽(false)タイプの論理データタイプ&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td colspan=&quot;2&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;整数型データタイプ&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;byte&lt;/td&gt;				&lt;td&gt;数の範囲が-128~127になっているデータタイプ&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;short&lt;/td&gt;				&lt;td&gt;数の範囲が-32,768~32,767になっているデータタイプ&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;int&lt;/td&gt;				&lt;td&gt;数の範囲が-2,147,483,648~2,147,483,647になっているデータタイプ&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;long&lt;/td&gt;				&lt;td&gt;数の範囲が-9,223,372,036,854,755,808~9,223,372,036,854,755,807になっているデータタイプ&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td colspan=&quot;2&quot; style=&quot;background-color:#c5fdfd;text-align:center&quot;&gt;実数型データタイプ&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;float&lt;/td&gt;				&lt;td&gt;数の範囲が±1.5*10&lt;sup&gt;-45&lt;/sup&gt;~±3.4*10&lt;sup&gt;38&lt;/sup&gt;になっているデータタイプ&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;double&lt;/td&gt;				&lt;td&gt;数の範囲が±5.0*10&lt;sup&gt;-324&lt;/sup&gt;~±1.7*10&lt;sup&gt;308&lt;/sup&gt;になっているデータタイプ&lt;/td&gt;			&lt;/tr&gt;			&lt;tr&gt;				&lt;td&gt;decimal&lt;/td&gt;				&lt;td&gt;数の範囲が±1.0*10&lt;sup&gt;-28&lt;/sup&gt;~±7.9*10&lt;sup&gt;28&lt;/sup&gt;になっているデータタイプ&lt;/td&gt;			&lt;/tr&gt;		&lt;/tbody&gt;	&lt;/table&gt;&lt;/div&gt;&lt;p&gt;javaは原始データタイプ(primitive type)とクラスデータタイプを区分しております。これはintタイプとintegerタイプは別のタイプでintタイプはnullを許せないですが、integerはnullを許す整数型タイプです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;変数の宣言は変数タイプを前に置いて変数名を作成することで宣言します。変数の値を入れる時にはイコール(equal, =)の記号を使ってデータを入れます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1319&quot; data-filename=&quot;001.png&quot; style=&quot;width: 292px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラス型タイプはユーザが作成することができる部分なので、原始データタイプと比較しながら説明します。&lt;/p&gt;&lt;p&gt;整数型ではinteger、byte、short、longがあります。実数型はfloat、doubleがあり、文字型はcharacterがあります。ブールはbooleanがあります。&lt;/p&gt;&lt;p&gt;追加事項で文字列はstringがありbigdecimalの文字実数型があります。原始データと差異といえば原始データは小文字で始まりますが、クラスタイプは大文字にキーワードが始まります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1320&quot; data-filename=&quot;002.png&quot; style=&quot;width: 352px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;変数は単純に値を入れることではなく、読み取って計算することもできるし再代入することはできます。文字列は文字列を合わせることもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1321&quot; data-filename=&quot;003.png&quot; style=&quot;width: 309px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これから変数と定数の差異に関して説明します。&lt;/p&gt;&lt;p&gt;上の例を見れば変数にデータを格納、計算して再代入ができます。定数の場合は最初にデータ格納ができますが、その後に再代入ができません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1322&quot; data-filename=&quot;004.png&quot; style=&quot;width: 710px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンパイルする段階でエラーが発生します。&lt;/p&gt;&lt;p&gt;プログラムの制約なのでメモリ上でデータが固定にすることではありません。なので実は変数と定数を区分してデータ宣言することは別にパフォーマンスとして別に意味がありません。実プログラムのプロジェクトでもクラスのキャプセル化を利用する変数アクセス制限、修正制限するですが、finalキーワードで設定する場合は多くないです。&lt;/p&gt;&lt;p&gt;c++時代の前処理の利便性で残っている感じです。なので定数の使用方法を知らなくてもプログラムを作成することでは問題ありません。あ！lambda文法でクロージャ機能のためには使いますね。&lt;/p&gt;&lt;p&gt;変数を宣言する方法と原始データ、クラスタイプデータの差異は確かに知らなければならないです。クラスに関しては次のクラスを説明する時に詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで変数と定数の宣言方法、そして原始データタイプとクラスデータタイプの差異に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/42.html</guid><pubDate>Tue, 15 Dec 2020 16:14:47 +0900</pubDate></item><item><title>[Java] 1. Javaとは？、Javaインストール、Eclipseインストール</title><link>https://www.nowonbun.com/41.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaとは？、javaインストール、eclipseインストールに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿からjavaに関して説明しようと思います。私の注力の言語はc#です。javaとc#の差異といえばほぼ同じです。オープンソースの種類の差異がありますが、似ているので、c#の言語が主に使ってもjavaを使うことで違和感がありませんでした。&lt;/p&gt;&lt;p&gt;逆にオープンソースの量だけ考えるとc#より多いことがあるので使うことではもっと楽なこともありました。でも、ライセンスや整合性保証に関して疑問があるので、使うことではよく考えて使わなければなりませんでした。&lt;/p&gt;&lt;p&gt;でも、日本の仕事現場に関してc#よりjavaのことが多いです。仕事のスタイルによって違いますが、一応、私が考えるのはそうです。&lt;/p&gt;&lt;p&gt;それならこれからjavaに関して調べてみましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;javaについて&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;「java」は1991年代にジェームズ・ゴスリンとその人のチームによって開発されて1995年に発表しました。初めは家電製品等のため開発されましたが、現在はウェブアプリケーションで一番人気があるプログラム言語になりました。&lt;/p&gt;&lt;p&gt;現在、「java」はサン・マイクロシステムズによって無料で提供しているし、「java」のバージョンは12.0まで発表しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「java」の場合は「c#」と比べて値段が安いですが、安いって言うのは「c#」言語ライセンスがお金をがかかることではなく、javaの環境を作るように立ち上がるシステムが無料オープンソースが多いです。&lt;/p&gt;&lt;p&gt;例えば、サーバの場合はcentosがあるし、ideツールでも「eclipse」、「netbeans」があるます。そしてウェブサーバ、アプリサーバの「apache」、「tomcat」、「glassfish」、「jboss」がすべて無料なので、システムを立ち上げる時、比較的に安く構築ができます。&lt;/p&gt;&lt;p&gt;そうすればjavaを開発するためにjavaのインストールとeclipseをインストールしましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近のwindows環境だと基本的にjavaがインストールされていますが、バージョンが古いことがあるので最新バージョンをダウンロードしましょう。&lt;/p&gt;&lt;p&gt;(参考：javaのバージョンはoracleバージョンとopenjavaバージョンがありますが、oracleの場合は最近著作権の問題で一応無料ですが、念のためopenjavaでインストールしましょう。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;javaインストール&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://jdk.java.net/12/&quot;&gt;https://jdk.java.net/12/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=172&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のリンクを接続してopenjdk12をダウンロードしましょう。ホームページ見れば、もう32ビットのjavaは存在もしないです。32ビットを利用したいなら、仕方がなくoracle jskを使うしかないです。&lt;/p&gt;&lt;p&gt;ダウンロードが完了すれば適当なところで圧縮を解凍しましょう。私の場合はd:\javaに解凍しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaをインストールしましたら、これからはpathを設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=164&quot; data-filename=&quot;002.png&quot; style=&quot;width: 332px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=163&quot; data-filename=&quot;003.png&quot; style=&quot;width: 232px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=167&quot; data-filename=&quot;004.png&quot; style=&quot;width: 479px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてシステム環境設定の「java_home」をd:\javaに設定します。もし、java_homeの変数がなければ生成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=170&quot; data-filename=&quot;005.png&quot; style=&quot;width: 663px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=177&quot; data-filename=&quot;006.png&quot; style=&quot;width: 625px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これから「windowキー」 +「r」を打って「cmd」のコマンドを入力して実行しましょう。そうしたらコマンドのウィンドウを開きます。そしてコマンドで「java -version」を入力してバージョンが確認しましょう。javaが正しくインストールされたかを確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=165&quot; data-filename=&quot;008.png&quot; style=&quot;width: 634px;&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;eclipseインストール&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;これからjavaの開発ツール(ied)のeclipseをインストールしましょう。開発ツール関してはeclipseだけじゃなく、様々なものがあります。でも私の場合はeclipseしか使ったことがないし、他のツール、例えばnetbeansはすごく不便でした。多分、私の使い方法を知らないからそうかもしれませんが、個人的な感じはeclipseが一番によさそうではないかと思います。&lt;/p&gt;&lt;p&gt;リンク - &lt;a href=&quot;https://www.eclipse.org/downloads/packages/&quot; target=&quot;_blank&quot;&gt;https://www.eclipse.org/downloads/packages/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;グーグルで検索してダウンロードしても構いないですが、ただstandardバージョンを使ったら各種パッケージを別にインストールしなければならないです。例えば、ウェブサービスを開発する時にウェブ関係なパッケージをインストールして設定しなければならないですが、それがすごく面倒になります。なので、基本的なパッケージがインストールされているenterprise versionをインストールする方が楽です。ただ、enterprise versionは少し重い感じがあるのでパソコンのスペックが必要かもしれません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=174&quot; data-filename=&quot;009.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=178&quot; data-filename=&quot;010.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ダウンロードが終われば、適当なところで圧縮を解凍します。私の場合はd:\eclipseに圧縮を解凍しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてeclipseを実行すればソースを格納するディレクトリを選択するポップアップが出ます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=166&quot; data-filename=&quot;011.png&quot; style=&quot;width: 615px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これも適当なところで指定するとよいです。私の場合はd:\workspaceに作成しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;すべてのインストールを完了しました。これからプロジェクトを生成してhello worldを出力しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=173&quot; data-filename=&quot;012.png&quot; style=&quot;width: 635px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=171&quot; data-filename=&quot;013.png&quot; style=&quot;width: 736px;&quot;&gt;&lt;/p&gt;&lt;p&gt;プロジェクトを生成しました。これからクラスを生成してmain関数を生成しまましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=179&quot; data-filename=&quot;014.png&quot; style=&quot;width: 723px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=175&quot; data-filename=&quot;015.png&quot; style=&quot;width: 528px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ソースを作成しました。これからデバックをしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=168&quot; data-filename=&quot;016.png&quot; style=&quot;width: 453px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=176&quot; data-filename=&quot;017.png&quot; style=&quot;width: 844px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=169&quot; data-filename=&quot;018.png&quot; style=&quot;width: 569px;&quot;&gt;&lt;/p&gt;&lt;p&gt;hello worldの結果が出ました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaとは？、javaインストール、eclipseインストールに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/41.html</guid><pubDate>Tue, 15 Dec 2020 12:20:07 +0900</pubDate></item><item><title>[Bootstrap] HTMLデザインのフレームワークのBootstrap紹介</title><link>https://www.nowonbun.com/254.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はbootstrapライブラリに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;10年前か15年前だけでもwebサービスのプロジェクトをする時にチーム構成はpm(プロジェクトマネージャー)、デザイナー、開発者で作業しました。&lt;/p&gt;&lt;p&gt;開発者がhtmlの基本標準オブジェクトでプログラムデザインをできないことではないですが、基本オブジェクトで作成すればプログラムが何か足りない感じがたくさんあります。その時にはhtml 5の標準を発表する前なのでcssデザインすることも限界がありました。なのでウェブデザイナーがphotoshopツールでデザイン作業後のイメージを割ってウェブデザインしたと覚えがあります。&lt;/p&gt;&lt;p&gt;今の状況で考えたら、そのイメージファイルのトラフィックをどのように処理したか疑問です。とにかくその時の後にhtml 5が発表してcss 3.0が出現しました。イメージを割ってwebページ作ることがだんだんなくなって、cssでデザイン作業することになりました。その時もcssの作業はほぼデザイナーが任せて作業しました。&lt;/p&gt;&lt;p&gt;人によって違うと思いますが私の場合はたくさん努力してもデザイナーみたいに作ることができないです。多分、デザイン感覚がないと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、大きいプログラムプロジェクトを運用する時にデザインと開発者の役割が出来るし、開発者は工程の概念を知りますが、デザイナーは工程の概念を知らない方も結構います。なのでプロジェクトスケジュール調整が簡単にできない時が結構あります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例えば、ある会社のホームページのメインページを修正する時、デザインポートフォリオが作成して、デザインの承認を受けて、部分修正やイメージを割る作業してcss作成するし...私の経験には、設計が終わって、デザイン作業が終わるまでずっと待ってた時もあります。デザインは開発と領域が違うので早めに焦ることもできないし、様々で大変だった時があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;多分、自分の考えはこの部分の差異があるので、mvc工程のモデルが出来たと思います。時間は決めてるが、デザインの領域を抜いてcontrollerやdbを先に作業すること？&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の経験で10年前までの状況がそうでした。そうするうちにbootstrapライブラリを認知して初めに使ったことが約2013年ぐらいです。始めは驚きました。&lt;/p&gt;&lt;p&gt;デザイナーがいなくてもhtmlオブジェクトのclass設定だけで綺麗なデザインを作成することが可能し、モバイルやモニターのサイズによる反応型デザインも作成することもできます。また、テーマによってデザインスタイルも変わることもできます。&lt;/p&gt;&lt;p&gt;また、綺麗なデザインテンプレートを安く購入が可能し、無料のデザインテンプレートもすごく多いです。そのため、現在はデザイナーが別にいなくても開発者だけでプログラムを作成することが可能になったし、それで以前よりプログラムスケジュールを合わせることが以前よりしやすくなったし生産性も結構上がったと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;現在はbootstrapみたいなデザインライブラリがたくさんできたと思いますが、私はbootstrapが慣れているしコミュニティが大きいので今までずっと使っています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1318&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならbootstrapを紹介します。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://getbootstrap.com/docs/3.4/&quot; target=&quot;_blank&quot;&gt;bootstrap 3.x バージョン https://getbootstrap.com/docs/3.4/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://getbootstrap.com/&quot; target=&quot;_blank&quot;&gt;bootstrap 4.x バージョン https://getbootstrap.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;bootstrapは、2020/07/30に基づいて二つのバージョンが存在します。3.xバージョンと4.xバージョンです。&lt;/p&gt;&lt;p&gt;最新バージョンは4.xなので、新しいプロジェクトなら4.0バージョンで作成するほうがよいです。3.xバージョンがある理由は、3.xから4.xにバージョンアップした時に、ieのサポートする可否、3.xからdeprecatedされた関数(使用禁止)が多いため、3.xから4.xに修正するとエラー発生することが多いです。&lt;/p&gt;&lt;p&gt;もし、プロジェクトでie8とios6の支援が必要なら3.xを使うほうが良いです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1317&quot; data-filename=&quot;002.png&quot; style=&quot;width: 782px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースは簡単にライブラリをリンク(cdn設定)して接続したものだけです。出力は単純にhello worldを描画したのでこれがbootstrapを適用したかは分からないです。&lt;/p&gt;&lt;p&gt;ここがbootstrapの紹介と基本設定なので次の投稿からbootstrapに関して詳しく説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでbootstrapライブラリに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Open source / Bootstrap</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/254.html</guid><pubDate>Thu, 30 Jul 2020 19:06:36 +0900</pubDate></item><item><title>[Python] メール(smtplib)を送信する方法</title><link>https://www.nowonbun.com/253.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでメール(smtplib)を送信する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムのプロジェクト中でメール発送することに関するプログラム作成がすごくあると思います。例えば、ウェブサービスで会員加入認証やパスワード再設定、様々なアラムオプション、お知らせなどがあると思います。&lt;/p&gt;&lt;p&gt;ウェブサービスではなくてもローカルでは大量広告メール(spam)もあるし、スケジュールアラムもあります。&lt;/p&gt;&lt;p&gt;そのため、どんなプログラムでもメールに関するモジュールは大事だと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonでメールライブラリを使うためにはメールプロトコールに関しても少し知らなければならないです。&lt;/p&gt;&lt;p&gt;メールプロトコールはsmtp(simple mail transfer protocol)を使いますが、これがテルネット方式になっているしhelo、mail、rcpt、dataのコマンドで通信します。&lt;/p&gt;&lt;p&gt;私の説明よりウィキによく説明されているのでご参考をお願いします。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://ja.wikipedia.org/wiki/simple_mail_transfer_protocol&quot; target=&quot;_blank&quot;&gt;https://ja.wikipedia.org/wiki/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonでメールを発送する前にメールサーバー設定が必要です。&lt;/p&gt;&lt;p&gt;google mail - &lt;a href=&quot;https://support.google.com/a/answer/176600?hl=ja&quot; target=&quot;_blank&quot;&gt;https://support.google.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;私の場合はgoogleのメールをよく使います。&lt;/p&gt;&lt;p&gt;先にクロムに接続して右上のアカウントの管理に行きます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1311&quot; data-filename=&quot;001.png&quot; style=&quot;width: 346px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アカウント管理に移動して安全性の低いアプリのアクセスのタブに移動します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1312&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;安全性の低いアプリの許可を有効にします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このチェックをしないと外部からグーグルメールを使用できないようにすることです。なので、idやpwの漏れがなければそんなに問題はありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1313&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonでソースを作成してメールを発送しましょう。&lt;/p&gt;&lt;p&gt;作成が終わったら実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1315&quot; data-filename=&quot;004.png&quot; style=&quot;width: 634px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1314&quot; data-filename=&quot;005.png&quot; style=&quot;width: 648px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行すれば上みたいにバウンダリーが作成されたことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1316&quot; data-filename=&quot;006-1.png&quot; style=&quot;width: 830px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メールがよく発送されたことを確認できます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.python.org/3/library/smtplib.html&quot; target=&quot;_blank&quot;&gt;https://docs.python.org/3/library/smtplib.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.python.org/3.4/library/email-examples.html target=&quot; _blank&quot;=&quot;&quot;&gt;https://docs.python.org/3.4/library/email-examples.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://stackoverflow.com/questions/17759860/&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/17759860/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでメール(smtplib)を送信する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/253.html</guid><pubDate>Mon, 27 Jul 2020 18:38:43 +0900</pubDate></item><item><title>[Python] HttpConnection(requestsモジュール)でウェブサーバーで接続する方法</title><link>https://www.nowonbun.com/252.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでhttpconnection(requestsモジュール)でウェブサーバーで接続する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブサーバーとブラウザの通信は要請、応答構造でなっています。要請はホストアドレスを含めてページを要請することだし、応答は要請に対して応答メッセージ(ヘッダー)とhtmlをブラウザに送信することです。&lt;/p&gt;&lt;p&gt;ウェブページはブラウザでjavascriptが実行してcss styleに合わせて画面に見えることですが、ブラウザのレンダリングの役割です。&lt;/p&gt;&lt;p&gt;サーバーとブラウザの間の通信はstring(byte[])タイプで送受信することだけです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1310&quot; data-filename=&quot;001.png&quot; style=&quot;width: 634px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ローカルにphpで簡単な例のソースを作成し、pythonでrequest要請して、応答を受けましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1309&quot; data-filename=&quot;002.png&quot; style=&quot;width: 660px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonでウェブサーバーを接続することを簡単です。requestのモジュールからセッションを受け取ります。後、そのセッションでlocalhostを要請して応答する結果を受け取ります。&lt;/p&gt;&lt;p&gt;応答結果はheadersとtext、contentが一番重要なデータです。&lt;/p&gt;&lt;p&gt;textの結果をみれば、paramのキーでquery string testを送ったので、上のphpソースの結果通りget - query string testの結果が出ました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はpostタイプでsession値を入れてgetタイプで値を取得する方法を説明します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1308&quot; data-filename=&quot;003.png&quot; style=&quot;width: 656px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonではrequestsモジュールを使う時、sessionだけちゃんと管理すれば別にクッキー設定がなくてもセッションの保持が可能です。(c#とjavaと同じ機能があるかどうかしらべなければならないな。)&lt;/p&gt;&lt;p&gt;そうすれば応用でウェブサーバからもloginしてデータを取得することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;requestの関数はpost, getのメソッドがるクラスタイプです。&lt;/p&gt;&lt;p&gt;responseは仕様によって様々の関数と変数を使います。下記の表で纏めました。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;関数及びプロパティ&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;apparent_encoding&lt;/td&gt;        &lt;td&gt;エンコード値に変換&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;content&lt;/td&gt;        &lt;td&gt;応答内容をバイト単位で変換&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;cookies&lt;/td&gt;        &lt;td&gt;サーバーから送ったクッキーをcookiejarオブジェクトに変換&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;elapsed&lt;/td&gt;        &lt;td&gt;要請を送信して応答した時間までの時間、timedeltaオブジェクトを返却&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;encoding&lt;/td&gt;        &lt;td&gt;r.textを快特するエンコードコード&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;headers&lt;/td&gt;        &lt;td&gt;応答ヘッダーのデータをディクショナリタイプで返却&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;history&lt;/td&gt;        &lt;td&gt;要請ヒストリ(url)を応答オブジェクトリストを返却&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;is_permanent_redirect&lt;/td&gt;        &lt;td&gt;応答が永久的にリダイレクトされたurlならtrue、そうではなければfalseを返却&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;is_redirect&lt;/td&gt;        &lt;td&gt;応答がリダイレクトされた場合、true、、そうではなければfalseを返却&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;links&lt;/td&gt;        &lt;td&gt;ヘッダーリンクを返却&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;next&lt;/td&gt;        &lt;td&gt;リダイレクトで次の要請に関するpreparedrequestオブジェクトを返却&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;ok&lt;/td&gt;        &lt;td&gt;status_codeが200より少なければtrue、そうではなければfalseを返却&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;reason&lt;/td&gt;        &lt;td&gt;状態コードに関するテキストを返却&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;request&lt;/td&gt;        &lt;td&gt;応答を要請したオブジェクトを返却&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;status_code&lt;/td&gt;        &lt;td&gt;状態のコードを返却(200はok、404はnot found)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;text&lt;/td&gt;        &lt;td&gt;応答内容をユニーコードで返却&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;url&lt;/td&gt;        &lt;td&gt;応答のurlを返却&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;close()&lt;/td&gt;        &lt;td&gt;サーバーと連結を閉める。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;iter_content()&lt;/td&gt;        &lt;td&gt;応答を繰り返す。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;iter_lines()&lt;/td&gt;        &lt;td&gt;応答ラインを繰り返す。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;json()&lt;/td&gt;        &lt;td&gt;結果のjsonオブジェクトを返却(結果がエラーが発生してない場合、jsonタイプで作成されたデータ)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;raise_for_status()&lt;/td&gt;        &lt;td&gt;エラーが発生すればこのメソッドはhttperrorオブジェクトを返却&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;ウェブサーバーを接続するhttpconnectionオブジェクトはjavaとc#、phpもあります。筆者のほぼすべての言語で似ているなライブラリが存在します。&lt;/p&gt;&lt;p&gt;個人的にpythonのrequestsモジュールがセッションを保持する方法か、json()関数みたいに自動にjsonタイプを返却する関数や様々な関数やライブラリがもっと楽に構成されています。ローカルスクリプトをよく使う言語でrequestsで情報を自動的に収集するスクレイピングボットやクロリングなどを作成すればいろいろなことで使えるではないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://requests.readthedocs.io/en/master/api/&quot; target=&quot;_blank&quot;&gt;https://requests.readthedocs.io/en/master/api/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.w3schools.com/python/ref_requests_response.asp&quot; target=&quot;_blank&quot;&gt;https://www.w3schools.com/python/ref_requests_response.asp&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://stackoverflow.com/questions/40430799/&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/40430799/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでhttpconnection(requestsモジュール)でウェブサーバーで接続する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/252.html</guid><pubDate>Mon, 20 Jul 2020 14:41:51 +0900</pubDate></item><item><title>[Python] Excel(openpyxl)を扱う方法</title><link>https://www.nowonbun.com/251.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでexcel(openpyxl)を扱う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;会社で仕事する方なら必須的に知るべきなプログラムはエクセルだと思います。そのためかエクセルライブラリはどのプログラム言語でも存在します。&lt;/p&gt;&lt;p&gt;javaとc#ではapache財団で提供するpoiライブラリがありますが、pyhonは独自のライブラリがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://openpyxl.readthedocs.io/en/stable/usage.html&quot; target=&quot;_blank&quot;&gt;https://openpyxl.readthedocs.io/en/stable/usage.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;excelファイルを生成する方法に関して説明します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1303&quot; data-filename=&quot;001.png&quot; style=&quot;width: 262px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果はソース上でprint関数を使って結果を出力しました。&lt;/p&gt;&lt;p&gt;始めはエクセルを生成してシートの状況を確認する時にリストタイプでsheetがあることを確認できます。workbookを生成すればsheetというシートが自動に生成されます。&lt;/p&gt;&lt;p&gt;次はsheetの名を「test1」に変更し、「test2」というシートを使いしました。また、検索すればシートが「test1」、「test2」があることを確認できます。&lt;/p&gt;&lt;p&gt;その後、セルに文字タイプのデータを入れました。タイプがgeneralということで出ました。次のセルに日付を格納して&apos;yyyy-mm-dd&apos;のタイプにデータを設定しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1304&quot; data-filename=&quot;002.png&quot; style=&quot;width: 275px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;main.pyファイルがあるところでexample1.xlsxファイルが生成されたことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1302&quot; data-filename=&quot;003.png&quot; style=&quot;width: 406px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;test1のシートにはhello worldと日付がフォーマットに合わせて入力されたことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1305&quot; data-filename=&quot;004.png&quot; style=&quot;width: 382px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;test2のシートにはa1の値とa2の値があってsum関数が実行されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はexcelファイルを生成することではなくファイルを読み込んでスタイルまで変更します。&lt;/p&gt;&lt;p&gt;(参考にpythonのopenpyxlはxlsタイプのエクセルは参照ができません。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1307&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c1からd13までデータを入れればグラフが自動に変更されるエクセルシートを作成しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1306&quot; data-filename=&quot;006.png&quot; style=&quot;width: 832px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はtestexcel.xlsxファイルを読み込んでsheetの値を変更する例です。&lt;/p&gt;&lt;p&gt;c列とd列はrandom関数で-20から20までの数を格納します。結果はランダムなので可笑しい気温グラフになります。&lt;/p&gt;&lt;p&gt;そしてc列にはfont設定とバックグラウンド色設定、枠設定をしました。枠のside関数の値はcolorの場合、hexデータを入れるし、styleの場合、格のスタイル種類で選択ができます。&lt;/p&gt;&lt;p&gt;d列の場合は整列と属性を選択しました。&lt;/p&gt;&lt;p&gt;結果を見ればc列には枠が見えるし(バックグラウンド色は白なので差異がなさそうです。)、d列は整列に下向けになることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;詳しい属性を参考することは下記のリンクを確認してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://openpyxl.readthedocs.io/en/stable/styles.html&quot; target=&quot;_blank&quot;&gt;https://openpyxl.readthedocs.io/en/stable/styles.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.geeksforgeeks.org/python-adjusting-rows-and-columns-of-an-excel-file-using-openpyxl-module/&quot; target=&quot;_blank&quot;&gt;https://www.geeksforgeeks.org/python-adjusting-rows-and-columns-of-an-excel-file-using-openpyxl-module/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでexcel(openpyxl)を扱う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/251.html</guid><pubDate>Thu, 16 Jul 2020 16:40:31 +0900</pubDate></item><item><title>[Python] ファイル圧縮、解凍(zipfile)する方法</title><link>https://www.nowonbun.com/250.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでファイル圧縮、解凍(zipfile)する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムのプロジェクトを開発する時に圧縮ファイルをよく使います。圧縮ファイルの長所はファイルサイズを減らすこともあるし、複数のファイルを一つのファイルで管理するために使う時もあります。&lt;/p&gt;&lt;p&gt;そのため、pythonに圧縮ファイル(zip)を扱うライブラリがありますが、それがzipfileモジュールです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.python.org/3/library/zipfile.html&quot; target=&quot;_blank&quot;&gt;https://docs.python.org/3/library/zipfile.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;まず、zip圧縮ファイルを作成する例です。zipfileでオプションがあります。&lt;/p&gt;&lt;p&gt;ioと似ているな概念ですが&apos;r&apos;,&apos;w&apos;,&apos;a&apos;,&apos;x&apos;があります。&lt;/p&gt;&lt;p&gt;wとxはファイルを作成するためのオプションですが、wはファイルが存在する場合に削除した後に新しく作成します。xはファイルが存在する場合にfileexistserrorエラーを発生します。&lt;/p&gt;&lt;p&gt;aの場合は、存在するファイルに追加のファイルを挿入するか、変更するときに使用されます。&lt;/p&gt;&lt;p&gt;rの場合は、zipファイルを読んでオプションです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1300&quot; data-filename=&quot;001.png&quot; style=&quot;width: 243px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果を見れば、apacheのソースを圧縮しましたが、text.txtファイルとtext1.txtを追加されました。&lt;/p&gt;&lt;p&gt;上の例は圧縮ファイルを解凍するソースです。まず、zipで必ず解凍しなくてもopenとreadで読み込んでファイルを書き出しができます。&lt;/p&gt;&lt;p&gt;参考で上の例ではzipfile.zipfileの関数に圧縮ファイルを入れてstreamタイプのデータを読み込んて処理ができます。socket通信間に圧縮送受信する時、ローカルのディスクに圧縮を解凍しなくても圧縮ファイルのデータを読み込まれます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1301&quot; data-filename=&quot;002.png&quot; style=&quot;width: 233px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果は上のtext.txtファイルとtext1.txtファイルだけ読み込んでコンソール出力しました。結果は「hello world!!」と「hello world string!!」の結果が出ました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonではzipfileモジュールでzipファイル内でファイルを別に削除する機能がないです。解凍して、ファイルを除いて再圧縮することですることしかないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでファイル圧縮、解凍(zipfile)する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/250.html</guid><pubDate>Tue, 14 Jul 2020 19:14:22 +0900</pubDate></item><item><title>[Python] Apache cgiでPythonを使う方法</title><link>https://www.nowonbun.com/249.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はapache cgiでpythonを使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前に私がpythonを利用してウェブサーバー(http.server)を構築する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/248.html&quot; target=&quot;_blank&quot;&gt;[python] web serverを起動する方法(http.server)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、私も実際にhttp.serverを利用してウェブサーバーを構築したことはありません。実はhttp.serverでサービスを構築すると思えばちゃんと運用するかの疑問もあるし、良いapiやオープンソースも多いのでpython(http.server)で構築する必要性を感じられません。&lt;/p&gt;&lt;p&gt;ウェブapiプラットフォームをphpに決め、構築する場合にapacheで構築します。　php言語も個人的に素晴らしいウェブスクリプト言語だし、よく使うプログラム言語です。&lt;/p&gt;&lt;p&gt;でも、ウェブの流れは様々のユーザが接続するマルチスレッド環境ですが、スクリプト言語のphp言語だけでコントロールが限界があるし様々なcのdllを参照して使うことはオブジェクトポイントやリソースを扱うことも簡単ではありません。&lt;/p&gt;&lt;p&gt;その限界はapacheのcgiでpythonを運用してある程度に補完がされます。私の場合、特にpythonは統計やグラフなどのライブラリがすごく多いのでよく使います。なので、phpの言語の限界を超えてプログラミングを実装する場合はありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;apacheにphpを設定する方法は以前に説明したことがあるのでご参考をお願します。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/137.html&quot; target=&quot;_blank&quot;&gt;[php] php 開発環境設定とeclipse(ide)の設定&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;apacheのcgiではperlとpythonを使うことがあります。perlも良いプログラム言語ですが、少し古い言語だし、コミュニティも以前より小さくなったので、最近はよく使わないかと思いもあります。(perl開発者にはすみません。)&lt;/p&gt;&lt;p&gt;そうならapacheのhttpd.confでcgiを設定しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1296&quot; data-filename=&quot;001.png&quot; style=&quot;width: 520px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;apacheは基本的にcgiがperlで設定されているのでpythonを追加します。&lt;/p&gt;&lt;p&gt;(参考にapacheが実行するpcにはpythonがインストールしなければならないです。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてapacheフォルダに行ったらcgi-binフォルダにあるのでそこにindex.pyを作成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1297&quot; data-filename=&quot;002.png&quot; style=&quot;width: 275px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1298&quot; data-filename=&quot;003.png&quot; style=&quot;width: 473px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば私がパラメータでdataとtestの値を出力することにしました。はじめはget方式で接続すればtestはnoneで出力しますが、テキストボックスにデータを入れてsubmitボタンを押下すると表示されます。&lt;/p&gt;&lt;p&gt;参考 - &lt;a href=&quot;https://www.tutorialspoint.com/python/python_cgi_programming.htm&quot; target=&quot;_blank&quot;&gt;https://www.tutorialspoint.com/python/python_cgi_programming.htm&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;os.environを通ってヘッダーの情報を得られます。その中でヘッダー情報によってクッキーを取得できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1299&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サーバ情報や要請ヘッダー情報が表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでapache cgiでpythonを使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/249.html</guid><pubDate>Thu, 9 Jul 2020 19:58:19 +0900</pubDate></item><item><title>[Python] Web serverを起動する方法(http.server)</title><link>https://www.nowonbun.com/248.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでweb serverを起動する方法(http.server)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はpythonをローカルスクリプトによく使うので、pythonでウェブサーバーを構築する場合はほぼないです。また、pythonではdjangoというウェブフレームワークがあるのでpythonで直接にウェブサーバーを構築する方はいないと思います。&lt;/p&gt;&lt;p&gt;個人的の考えですが、普通のデベロッパーならpythonだけ扱う人はいないと思います。メインはjavaあるいはc#、phpを扱うことで足りない部分(?)や開発の便利性のためpythonを使う人がほとんどなのでウェブサーバを作ることはもっとないと思います。&lt;/p&gt;&lt;p&gt;javaやc#の場合にpythonとともに使ってcomplex言語タイプで使うこともできますが、そんなことまで実装する方はいないと思います。&lt;/p&gt;&lt;p&gt;phpの場合はスクリプトのウェブ言語なので言語の限界があるのでpythonと一緒に使うことがあると思います。&lt;/p&gt;&lt;p&gt;でも、そのケースもpythonで独立的にhttp.serverでサーバーを構築することよりapacheのcgiを利用することがsessionやcookie管理的にも楽なのでhttp.serverは使いません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、よく使わないライブラリをなぜ紹介することではそれでも全然使うことではなく、すごく簡単に構築できるので簡単なことを構築することでよいからです。&lt;/p&gt;&lt;p&gt;私の場合はこのhttp.serverを使う時、業務する時に様々なスクリプトを管理する場合があります。例えば、logファイル整理からデータベースバックアップ、マイグレーション、jenkinsなどで様々なスクリプトがあります。&lt;/p&gt;&lt;p&gt;スクリプトだけではなく、パラメータによって実行する対象も設定する時もあります。&lt;/p&gt;&lt;p&gt;それをただコンソールやスクリプトで管理することよりはウェブブラウザを利用する画面で管理することがよいと思って使います。(ロカールスクリプト管理ツールでjavaやphp、iisなどで管理することは大変です。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならすごく簡単にウェブサーバーを構築します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1294&quot; data-filename=&quot;001.png&quot; style=&quot;width: 280px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1290&quot; data-filename=&quot;002.png&quot; style=&quot;width: 517px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1291&quot; data-filename=&quot;003.png&quot; style=&quot;width: 299px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ただ、静的なウェブサーバでwebsocketを設定して運用してもよいです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/247.html&quot; target=&quot;_blank&quot;&gt;[python] websocketを使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、ここでは静的なサーバーを構築してjavascriptのwebsocketを使うための説明ではありません。&lt;/p&gt;&lt;p&gt;動的なサーバーを構築しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1293&quot; data-filename=&quot;004.png&quot; style=&quot;width: 430px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1292&quot; data-filename=&quot;005.png&quot; style=&quot;width: 375px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1295&quot; data-filename=&quot;006.png&quot; style=&quot;width: 662px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;get方式のテストはurlでdataパラメータにhello worldの値を入れてサーバーに接続します。そうするとinputテキストにデータを入力されることは確認できます。&lt;/p&gt;&lt;p&gt;コンソール画面にはgetで呼び出せることが確認できます。&lt;/p&gt;&lt;p&gt;また、その状況でsubmitボタンを押下するとpost要請になって画面に文言だけ表示されることが確認できます。&lt;/p&gt;&lt;p&gt;私の場合はすごく簡単にを作成しましたが、web上でのpythonをコントロールするためdo_get関数やdo_post関数にコード実装すると想定したプログラムが作成できます。&lt;/p&gt;&lt;p&gt;例えばinput textの代わりにselectを入れてそのパラメータの値に応じて他のpythonのスクリプトを実行させるか、ローカルロジックを運用されるように作成すればローカルでのpythonを操作することができるウェブプログラムを作成することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.python.org/3.3/library/http.server.html&quot; target=&quot;_blank&quot;&gt;https://docs.python.org/3.3/library/http.server.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.python.org/3/library/http.server.html&quot; target=&quot;_blank&quot;&gt;https://docs.python.org/3/library/http.server.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.python.org/3/library/io.html#io.bufferediobase&quot; target=&quot;_blank&quot;&gt;https://docs.python.org/3/library/io.html#io.bufferediobase&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://wiki.python.org/moin/basehttpserver&quot; target=&quot;_blank&quot;&gt;https://wiki.python.org/moin/basehttpserver&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://gist.github.com/pavgup/11220737&quot; target=&quot;_blank&quot;&gt;https://gist.github.com/pavgup/11220737&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでweb serverを起動する方法(http.server)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/248.html</guid><pubDate>Thu, 9 Jul 2020 00:13:13 +0900</pubDate></item><item><title>[Python] WebSocketを使う方法</title><link>https://www.nowonbun.com/247.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでwebsocketを使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;websocketはウェブブラウザからjavascriptでtcp同期通信するためのプロトコルです。以前、javaでwebsocketを実装したことがあるので、ご参考すれば理解しやすいと思います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/168.html&quot; target=&quot;_blank&quot;&gt;[java] websocket (ウェブソケット)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;websocketの場合は普通はweb環境で実装します。でもphpの場合はwebsocketを実装することができません。現在はそうです。後はどうか知りません。&lt;/p&gt;&lt;p&gt;でも、phpの場合は言語特性のせいにthreadを直接に管理することが難しいので将来でもできないじゃないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なのでその対策でnode.jsのsocket.ioとpythonのwebsocketがあります。&lt;/p&gt;&lt;p&gt;グーグルで検索するとphpのwebsocketの対策でsocket.ioの説明が多いです。いつか機会があればnode.jsも説明したいですが、個人的にnode.jsを好きではありません。&lt;/p&gt;&lt;p&gt;node.jsの言語的に限界があることよりpythonの良いローカルスクリプトがあるのに、あえてなぜ？と認識があるのでです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてsocket.ioは正確にwebsocket技術ではありません。ajax long polling技術ということでhttpプロトコルでrequest＆response後に接続をすぐに切ることではなく、少しギャップをあげることです。&lt;/p&gt;&lt;p&gt;なので、データが変わる時にブラウザにとって再要求をするようにすることです。ユーザが感じるには、httpのプーリングで、まるで接続が接続を維持するような効果を出す方法です。&lt;/p&gt;&lt;p&gt;しかし、tcpで同期的に連結していることではないので、いろいろなバグが発生します。代表的なのが反応が遅い点がありますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので私の場合はpythonのwebsocketの実装がいいではないかと思います。&lt;/p&gt;&lt;p&gt;pythonでwebsocketを使うためにライブラリをダウンロードしなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1286&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールが完了すればwebsocketスクリプトを作成しましょう。&lt;/p&gt;&lt;p&gt;そしてクライアントはローカルの適当な場所にhtmlファイルで作成します。（pythonでwebサーバーを実装していないため、webブラウザを実行すべきhtmlファイルが必要です。）&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1285&quot; data-filename=&quot;002.png&quot; style=&quot;width: 334px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1288&quot; data-filename=&quot;003.png&quot; style=&quot;width: 400px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブブラウザでの上に作成したhtmlを実行すると、javascriptでpython websocketサーバに接続します。そしてhelloとtestのメッセージを送信すればserver側はhelloとtestのメッセージを受信してコンソールに出力します。後、echo：が付けてブラウザに送信します。ブラウザ側はecho:が付けているメッセージが表示されます。&lt;/p&gt;&lt;p&gt;ここまではpythonでのwebソケットを使用する際に問題ありません。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;pythonでwebsocketのサーバーだけでなく、clientの立場でも、サーバー側のメッセージを送ることができます。&lt;/p&gt;&lt;p&gt;つまり、javaでwebsocketサーバを実装するとpythonでテストアプリを実装することもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1289&quot; data-filename=&quot;004.png&quot; style=&quot;width: 462px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1287&quot; data-filename=&quot;005.png&quot; style=&quot;width: 310px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クライアント(python)からweb socket server(java)に接続すればよくできます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでwebsocketを使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/247.html</guid><pubDate>Tue, 7 Jul 2020 17:29:18 +0900</pubDate></item><item><title>[Python] PythonとJavaのソケット通信する方法</title><link>https://www.nowonbun.com/246.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonとjavaのソケット通信する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にpythonとc#のソケット通信に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/245.html&quot; target=&quot;_blank&quot;&gt;[python] pythonとc#のソケット通信&lt;/a&gt;&lt;/p&gt;&lt;p&gt;それでpythonとjavaのソケット通信に関しても説明した方がよいではないかと思って作成します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はjavaで開発すると思えば9割がトムキャットを利用するウェブプロジェクトになります。トムキャットを利用するのでウェブプロジェクトになりますが、内部でthreadを一つ作ってソケットサーバを待機してモバイルクライアントや各種アプリケーションが接続するサーバーを開発する時もあります。&lt;/p&gt;&lt;p&gt;つまり、内部重要なプログラムの流れはソケットサーバですが、ソケットサーバをコントロールプログラムはウェブプロジェクトで開発することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、javaでソケット通信する時が全然ないことではないので、そのようなc#みたいに模擬サーバやクライアントが必要です。&lt;/p&gt;&lt;p&gt;pythonのサーバソケットを作成しましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/237.html&quot; target=&quot;_blank&quot;&gt;[python] 18. ネットワーク(socket)通信する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;データサイズの転送バイトはlittleエンディアンを使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;次はクライアントをjavaで作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1281&quot; data-filename=&quot;001.png&quot; style=&quot;width: 484px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1284&quot; data-filename=&quot;002.png&quot; style=&quot;width: 292px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればclient(java)で10回のメッセージを送る時、メッセージにindex番号を付けて送信しました。順番通りに受信することを確認できます。サーバにはメッセージを受け取ってコンソールに出力して「echo:」メッセージを付けってclientに再送信したことも確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はjavaのサーバを作成してpythonのクライアントで接続します。&lt;/p&gt;&lt;p&gt;上のjavaでsocketserverクラスを利用してソケット通信サーバを作成しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はpythonでクライアントを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1282&quot; data-filename=&quot;003.png&quot; style=&quot;width: 392px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1283&quot; data-filename=&quot;004.png&quot; style=&quot;width: 355px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;clientでメッセージを作って10回のループでサーバにメッセージを送信します。その後、サーバにはメッセージのメッセージにechoの文字列を付けてclientでメッセージを送信します。&lt;/p&gt;&lt;p&gt;java server - python clientも問題なしでよくできます。&lt;/p&gt;&lt;p&gt;javaサーバでエラーメッセージが表示される理由はclientで強制終了すればexceptionに発生します。javaの60番目exceptionでエラーメッセージが表示され、コンソールにエラーメッセージが表示されることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonとjavaのソケット通信する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/246.html</guid><pubDate>Fri, 3 Jul 2020 18:35:50 +0900</pubDate></item><item><title>[Python] PythonとC#のソケット通信</title><link>https://www.nowonbun.com/245.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonとc#のソケット通信に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;開発の目的によってプログラムを使う方法の差がありますが、私の場合はメイン言語はjavaとc#でその以外に開発補助言語でpythonを使っています。&lt;/p&gt;&lt;p&gt;その意味は例えばc#のプロジェクトでcs(client server)プログラムを開発する時、普通はチームでclientかserverのことを担当して開発することになります。(プロジェクトのサイズによって両方を一緒で開発する時もあります。)&lt;/p&gt;&lt;p&gt;もし、私がclientを開発すると思えば、serverとclientの通信のプロトコルを開発する部分があります。その部分はhttpconnectionを利用することもあるし、soap通信することもあるし、一般ソケット通信することもあります。&lt;/p&gt;&lt;p&gt;その時、serverとclientの通信部分を一緒で開発する方がよいですが、お互いにスケジュールの差異がある場合、clientでserverのスケジュールを合わせて待つことしかできないです。&lt;/p&gt;&lt;p&gt;私の場合はスクリプト(pythonやnode.js)で模擬サーバを作って開発します。(逆にserver側で模擬クライアントを作ります。)&lt;/p&gt;&lt;p&gt;個人的にjavascript(node.js)の言語もいいと思いますが、ローカルスクリプト言語としてnode.jsよりpythonがライブラリも多いし、早めに作成することができるのでよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その目的ではなくても、スクリプトで他の言語間に通信することもできます。&lt;/p&gt;&lt;p&gt;それならpythonサーバとc#のクライアント通信を説明します。&lt;/p&gt;&lt;p&gt;上のソースは以前作成したpythonサーバーとそんなに差異がありません。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/237.html&quot; target=&quot;_blank&quot;&gt;[python] 18. ネットワーク(socket)通信する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;差異はlittleエンディアンを使うことではなく、bigエンディアンを使います。でも、to_bytesでbyteorderをbigに設定してもlittleエンディアンで転送します。&lt;/p&gt;&lt;p&gt;from_bytesの場合はbigに設定するとbigエンディアンになりますが。。&lt;/p&gt;&lt;p&gt;サーバを起動してクライアントを起動します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1278&quot; data-filename=&quot;001.png&quot; style=&quot;width: 582px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1277&quot; data-filename=&quot;002.png&quot; style=&quot;width: 405px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればclient(c#)で「this message is sent from c# client.」というメッセージを送信するとserverではコンソールで出力して「echo :」を付けてclientに転送しました。&lt;/p&gt;&lt;p&gt;clientで「echo :」がつけたメッセージをpythonコンソールに出力されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は逆にc#がサーバでpythonがクライアントで接続することを作成します。&lt;/p&gt;&lt;p&gt;上のソースはpython serverと同じ機能です。下記はc#で作成したソースコードです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1279&quot; data-filename=&quot;003.png&quot; style=&quot;width: 392px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1280&quot; data-filename=&quot;004.png&quot; style=&quot;width: 355px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;clientでhelloというメッセージを10回に転送するループを作りました。serverで10回のメッセージを受信して10回のechoメッセージをclientに送信しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonとc#のソケット通信に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/245.html</guid><pubDate>Wed, 1 Jul 2020 19:28:22 +0900</pubDate></item><item><title>[Python] INI(環境設定ファイル)を扱う方法</title><link>https://www.nowonbun.com/244.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでini(環境設定ファイル)を扱う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前、c言語やc++言語プログラムで環境ファイル設定タイプでinitialization設定ファイルということです。&lt;/p&gt;&lt;p&gt;iniファイルの拡張子は普通はiniでなっていますが、confやcfgに使う時もあります。&lt;/p&gt;&lt;p&gt;iniの設定構造はセッションとキーになっています。コメントはセミコロン(;)を使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;apacheなどini設定ファイルで環境ファイルがまだあります。&lt;/p&gt;&lt;p&gt;なのでciツール(jenkins)でビルドする時、pythonで自動環境ファイル設定スクリプトを作ることでよく使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1271&quot; data-filename=&quot;001.png&quot; style=&quot;width: 340px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;configをリストのキーでセッション名を設定します。&lt;/p&gt;&lt;p&gt;そのリストでディクショナリを設定すればディクショナリのキー、値によって環境ファイルを設定します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はiniファイルを読み込んでpythonで使いましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1270&quot; data-filename=&quot;002.png&quot; style=&quot;width: 251px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;iniを読み込んでsectionsの関数を通ってセッションキーを取得します。そしてkeysの関数で環境ファイルのキーを取得することができるし、そのキーを通って値を出力することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpをインストールするとphp.iniファイルがあります。&lt;/p&gt;&lt;p&gt;pythonを利用してphp.iniファイルを扱いましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1273&quot; data-filename=&quot;003.png&quot; style=&quot;width: 772px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のイメージはphp.iniをメモ帳で読み込むことです。親切にコメントがあります。でも、コメントが多すぎです。なので逆に値を探すのが大変です。&lt;/p&gt;&lt;p&gt;私もたまにコメントが多すぎてコメントをすべて消したい時があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1272&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいにiniファイルを読み込んで再作成するとコメントがすべてなくなって綺麗なiniファイルができると思いました。でも、エラーが発生しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;調べるとiniファイルでセッションとキー単位で同じキーがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1274&quot; data-filename=&quot;005.png&quot; style=&quot;width: 541px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実際iniでセッションかつキーはユニックなのでデータが複数にあることは存在しません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、php.iniでは使います。&lt;/p&gt;&lt;p&gt;インタネットを調べると私と同じ問題で解決したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://stackoverflow.com/questions/15848674&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/15848674&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1276&quot; data-filename=&quot;006.png&quot; style=&quot;width: 528px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果はコメントが削除されてiniが新しく作成されました。でも重複されたextensionのキーでは可笑しく入力されています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1275&quot; data-filename=&quot;007.png&quot; style=&quot;width: 468px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コメントが除いたiniファイルが生成されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでini(環境設定ファイル)を扱う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/244.html</guid><pubDate>Tue, 30 Jun 2020 18:26:01 +0900</pubDate></item><item><title>[Python] Jsonを扱う方法</title><link>https://www.nowonbun.com/243.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでjsonを扱う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にcsvとxmlを扱う方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/241.html&quot; target=&quot;_blank&quot;&gt;[python] ioを利用してcsvファイルを扱う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/242.html&quot; target=&quot;_blank&quot;&gt;[python] xmlファイルを扱う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムで人間が認識するデータ構造で様々がありますが、最近はjsonタイプをよく使います。jsonとはjavascript object notationの略語でjavascriptのデータ表記法です。&lt;/p&gt;&lt;p&gt;つまり、javascriptの文法構造がjsonタイプです。javascriptがpythonと同じスクリプトだから表記法も似てます。&lt;/p&gt;&lt;p&gt;例えば、中括弧{キー：値}のタイプはpythonのディクショナリです。[データ、データ]のタイプはリストタイプです。&lt;/p&gt;&lt;p&gt;また、jsonのxmlの階層的表現も可能するので様々な活用度もたくさん高いタイプです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならjsonデータを出力しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1268&quot; data-filename=&quot;001.png&quot; style=&quot;width: 304px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ディクショナリタイプがjsonタイプなのでpythonのデータがそのままメモ帳に出力されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はjsonタイプでデータを読み込んでpythonのディクショナリタイプに変換しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1269&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみればファイルのstrデータを確実に読み込みました。&lt;/p&gt;&lt;p&gt;jsonタイプはphpのcomposerかnode.jsなどでよく使うデータタイプです。pythonを利用すれば環境ファイル設定が可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでjsonを扱う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/243.html</guid><pubDate>Mon, 29 Jun 2020 19:18:15 +0900</pubDate></item><item><title>[Python] XMLファイルを扱う方法</title><link>https://www.nowonbun.com/242.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでxmlファイルを扱う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近はxmlファイルは以前よりよく使わないですけど、10年前でもプログラムの環境設定や標準データ構造でxmlをよく使いました。最近はjsonタイプがたくさん使います。&lt;/p&gt;&lt;p&gt;xmlが構造がタグを開き、閉めの構造だし、各タグにアトリビュートを入れられる構造なのでデータを表現することではすごくいい構造です。&lt;/p&gt;&lt;p&gt;例えば、コンパイル言語でクラスをデータとして作ると思えば、最初のタグをクラス名に作成し、派生タグに変数の値を格納できます。派生タグのアトリビュートを利用して変数のデータタイプなどを指定してクラスすることでドキュメントに作成することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;xmlがこんなにいいことだけあることではなく、短所もあります。タグが開き、閉めることがあるのでファイルのサイズが大きくなるし、アトリビュートやデータが多くなれば可読性が落ちることがあります。&lt;/p&gt;&lt;p&gt;特にデータサイズが大きくなることはパフォーマンスなどに関係があるものなので特に致命的な短所です。その為、最近はxmlと似ているjsonタイプをよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、xmlタイプを全然使わないことではなく、パフォーマンスを関係ず、データの詳細に表現する必要がある時に使えます。&lt;/p&gt;&lt;p&gt;特に、環境設定などでよく使いますが、代表的にc#のapp.configとtomcatのserver.xml、javaのpom設定などでよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで環境ファイルをプログラム的に管理することや整合性チェックなどでpythonソースを作成して管理します。例えば、jenkinsみたいにciでデプロイする時、jenkinsのshell commandを作成することでpythonコードを使えば環境設定管理をしやすくできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1267&quot; data-filename=&quot;001.png&quot; style=&quot;width: 459px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみればxmlがよく作られたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;element.elementを使ってappendすることはsubelementを使うことと同じ結果になります。ソースステップのため、subelementを使うほうが良いと思います。&lt;/p&gt;&lt;p&gt;そしてアトリビュートの場合、set関数を使って格納できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はxmlファイルを読み込んでディクショナリタイプに生成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1266&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ルートによってリストではなくディクショナリタイプに生成されました。なので、ルートの中で出力すれば最初のリストのディクショナリタイプに生成されることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでxmlファイルを扱う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/242.html</guid><pubDate>Fri, 26 Jun 2020 19:18:14 +0900</pubDate></item><item><title>[Python] IOを利用してCSVファイルを扱う方法</title><link>https://www.nowonbun.com/241.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでioを利用してcsvファイルを扱う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonはローカルでよく使うスクリプト言語ですから様々なファイルを扱うライブラリがよく整理しているらしいです。&lt;/p&gt;&lt;p&gt;他のプログラム言語だってできないことではありませんが、個人的にpythonが環境ファイルらしいなデータを作ることでは便利ではないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;csvファイルはデータベースや様々テーブル形式のデータでよく使う形式です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1263&quot; data-filename=&quot;001.png&quot; style=&quot;width: 368px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;csvファイルがカンマ(,)と改行の区分で作られました。&lt;/p&gt;&lt;p&gt;今回はcsvファイルを読み込んで使いましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1262&quot; data-filename=&quot;002.png&quot; style=&quot;width: 388px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイルのコンマ(,)と改行区分でデータを読み込んでコンソールに出力しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;csvファイルにヘッダーが必要な場合があります。&lt;/p&gt;&lt;p&gt;ディクショナリタイプを利用すればcsvファイルの一行目はデータのヘッダーで使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1265&quot; data-filename=&quot;003.png&quot; style=&quot;width: 417px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ディクショナリタイプになっているリストでcsvファイルを作成しました。そして一行目はheaderとしてタイトルを入れました。&lt;/p&gt;&lt;p&gt;今回はまたcsvファイルをディレクトリタイプで読み込みます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1264&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果はorderdictタイプで出力されます。一般ディクショナリタイプではないですが、ディクショナリの種類なのでディクショナリタイプでcsvファイルを読み込みました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでioを利用してcsvファイルを扱う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/241.html</guid><pubDate>Thu, 25 Jun 2020 18:20:30 +0900</pubDate></item><item><title>[Python] 21. データベース(mariaDB)を連結する方法</title><link>https://www.nowonbun.com/240.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでデータベース(mariadb)を連結する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はpythonをローカルスクリプト言語でよく使います。ローカルスクリプト言語で使うというのはプログラムを開発することや運用する時に一回性で使うプログラムスクリプトということです。&lt;/p&gt;&lt;p&gt;ただ、一回性だけではなく、スケジュールで使う時もあるし、batchをかけて問題がある時やトリガーにかけるかアップデータで使えます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンパイル言語でもローカルスクリプト言語で使えますが、ソース修正がスクリプトより大変です。(buildが必要から)&lt;/p&gt;&lt;p&gt;その以外にインストールも多いし、ライブラリも多いのでpythonをよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのためプログラムを開発すればデータベースに接続する場合が多いですが、簡単な検索などはsql browserなどで処理ができますが、データ検証や様々なsql scriptを管理する時にはローカルスクリプトを利用するばよいです。&lt;/p&gt;&lt;p&gt;データベースの種類はoracleやsql server(ms-sql)、postgreなど多いですが、私の場合はmariadbをよく使います。&lt;/p&gt;&lt;p&gt;それでここにはmariadbの対して例を作成しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先にpythonでmysqlを使うためにはpipモジュールをインストールしなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1261&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;モジュールインストールが完了したらpythonでmaraidbを接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1260&quot; data-filename=&quot;002.png&quot; style=&quot;width: 288px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でテーブル追加からデータ入力、修正、削除そしてテーブル削除まで処理するスクリプトを一列で作成しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先、dbconnというmysqlコネクションを生成して受け取ります。pythonはスクリプトなのでプログラム実行が終わると自動にリソースを閉めますが、明確にするためソースの最後にclose関数でリソースを閉めて返却する処理式を作成します。&lt;/p&gt;&lt;p&gt;そしてexecuteを実行するとforの繰り返しでデータセットを受け取ります。execute関数でクエリを実行することもできるし二つのパラメータでクエリバインディングもできます。&lt;/p&gt;&lt;p&gt;executemany関数の場合は大量処理も可能です。fetchall関数を使えば一つのfetchデータではなくすべてのデータを受け取ることもできます。コンプリヘンションでデータソートが可能です。&lt;/p&gt;&lt;p&gt;でも、すべてのデータがメモリにあることなので、パフォーマンスが遅くなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://dev.mysql.com/doc/connector-python/en/connector-python-tutorial-cursorbuffered.html&quot; target=&quot;_blank&quot;&gt;https://dev.mysql.com/doc/connector-python/en/connector-python-tutorial-cursorbuffered.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorbuffered.html&quot; target=&quot;_blank&quot;&gt;https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorbuffered.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでデータベース(mariadb)を連結する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/240.html</guid><pubDate>Wed, 24 Jun 2020 18:51:50 +0900</pubDate></item><item><title>[Python] 20. stringフォマード(Formatting)と補間法(interpolation)</title><link>https://www.nowonbun.com/239.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでstringフォーマッティング(formatting)と補間法(interpolation)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stringフォーマッティングは定数タイプなどを文字列タイプに変換することやstringのデータタイプにstringの値を入れるような方法です。&lt;/p&gt;&lt;p&gt;フォーマッティングはパーセント(%)を利用します。パーセント(%)の前はformat文字列、後は置換する値を設定します。&lt;/p&gt;&lt;p&gt;最終結果はイコールで左の変数に格納されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1255&quot; data-filename=&quot;001.png&quot; style=&quot;width: 236px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;フォーマッティングの文字列で置換領域もパーセント(%)で区分します。そしてパーセント(%)の後は置換値のタイプによるコードを入力します。&lt;/p&gt;&lt;p&gt;置換値は複数(2個以上)ならタプルで入力します。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;コード&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;%s&lt;/td&gt;        &lt;td&gt;文字列(string)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;%c&lt;/td&gt;        &lt;td&gt;文字一つ(character)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;%d&lt;/td&gt;        &lt;td&gt;定数(integer)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;%f&lt;/td&gt;        &lt;td&gt;浮動小数点(floating-point)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;%o&lt;/td&gt;        &lt;td&gt;8進数&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;%x&lt;/td&gt;        &lt;td&gt;16進数&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1258&quot; data-filename=&quot;002.png&quot; style=&quot;width: 301px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stringタイプでフォーマッティングではなく本当にパーセント(%)を使いたい時があります。その時にはパーセント(%)を二つ入れることで入力します。&lt;/p&gt;&lt;p&gt;pythonはフォーマッティングで文字列整列も可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1257&quot; data-filename=&quot;003.png&quot; style=&quot;width: 268px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;補間法とはフォーマッティングする文法でもっと見やすくするための文法です。&lt;/p&gt;&lt;p&gt;例えば置換するデータが多い時に置換場所を迷う時があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1256&quot; data-filename=&quot;004.png&quot; style=&quot;width: 442px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;補間法は文字列の表現するダブルクォートやクォートの前でfを付けます。そうすると領域中では中括弧で直接にフォーマッティングを作成することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1259&quot; data-filename=&quot;005.png&quot; style=&quot;width: 309px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stringフォマード(formattingと補間法(interpolation)に関して各長所、短所がありますが、私の場合は補間法(interpolation)のほうが見やすいのでよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでstringフォマード(formatting)と補間法(interpolation)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/239.html</guid><pubDate>Tue, 23 Jun 2020 19:03:21 +0900</pubDate></item><item><title>[Python] 19. 非同期IOのasync/await(asyncio)を使う方法</title><link>https://www.nowonbun.com/238.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonで非同期ioのasync/await(asyncio)を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;threadで関数を実行する時にその結果を受け取ることが難しいです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/236.html&quot; target=&quot;_blank&quot;&gt;[python] 17. スレッド(thread)とロック(lock)、そしてデッドロック(deadlock)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;つまり様々な制御文を並列で処理して結果をすべて待たなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1254&quot; data-filename=&quot;001.png&quot; style=&quot;width: 249px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいにfor文を二つのスレッドに実行して計算することができます。でも、何かソースが複雑みたいです。&lt;/p&gt;&lt;p&gt;グローバル変数でretを生成して各スレッドでデータを入力、修正します。もし各スレッドでパラメータによってデータを変わることにしようと思うとすごく複雑になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも非同期処理(async/await(asyncio))を使うと簡単に処理することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1254&quot; data-filename=&quot;001.png&quot; style=&quot;width: 249px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;asyncとawaitを使えばthreadingを使う時よりソースを綺麗に作成することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、asyncとは関数の前に使うキーワードです。外部では非同期を実行するためのキーワードだし、内部的にはawaitを使えるような予約語です。&lt;/p&gt;&lt;p&gt;main関数でt1とt2を待つawaitを使いましたが、もしmainがasyncではないしグローバル領域でawaitキーワードを使うとエラーが発生することになります。&lt;/p&gt;&lt;p&gt;awaitキーワードは非同期で待機する意味で、await asyncio.sleep(i)の場合はiを秒単位です待機する意味です。つまりtime.sleepと同じ意味です。&lt;/p&gt;&lt;p&gt;create_task担っているtaskオブジェクトからawaitを使えばスレッドが終了する時まで待機するthread.joinと同じ意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最後にasyncio.runはasyncをcreate_taskみたいに非同期ではなく同期(プロセスの順番とおりに処理)で処理する呼び出しです。&lt;/p&gt;&lt;p&gt;asyncio.runを使ってもよいです。でも最近はrun_until_completeを使うことをお勧めしています。&lt;/p&gt;&lt;p&gt;またcreate_taskで非同期に分けましたが、asyncio.gatherも非同期処理が可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1254&quot; data-filename=&quot;001.png&quot; style=&quot;width: 249px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.python.org/3/library/asyncio-task.html&quot; target=&quot;_blank&quot;&gt;https://docs.python.org/3/library/asyncio-task.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.python.org/3/library/asyncio-eventloop.html&quot; target=&quot;_blank&quot;&gt;https://docs.python.org/3/library/asyncio-eventloop.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://stackoverflow.com/questions/55590343/asyncio-run-or-run-until-complete&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/55590343/asyncio-run-or-run-until-complete&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonで非同期ioのasync/await(asyncio)を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/238.html</guid><pubDate>Mon, 22 Jun 2020 18:10:12 +0900</pubDate></item><item><title>[Python] 18. ネットワーク(Socket)通信する方法</title><link>https://www.nowonbun.com/237.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでネットワーク(socket)通信する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムでネットワーク通信することはソケット通信といいます。ネットワーク通信はプログラムとプログラム間に通信することやpcとpc間に通信するという意味です。&lt;/p&gt;&lt;p&gt;ソケットはpythonだけではなく、他のプログラム言語でも同じ通信標準です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的にソケット通信流れは下記とおりになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1251&quot; data-filename=&quot;001.gif&quot; style=&quot;width: 280px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ソケット通信はサーバーとクライアントがあります。サーバーはソケット接続を待っているもの(listen)です。クライアントは接続を待っているサーバーに接続するものです。&lt;/p&gt;&lt;p&gt;つまり、サーバーがlisten状況になっているとクライアントがサーバーにconnectionします。そうするとサーバー側はacceptが発生してサーバーとクライアントがsendとreceiveでデータを送受信します。&lt;/p&gt;&lt;p&gt;データを送受信するデータタイプはバイナリ(byte)タイプになります。&lt;/p&gt;&lt;p&gt;上の例をソケットサーバーソースです。&lt;/p&gt;&lt;p&gt;基本的にbindしてlistenでクライアントを待機します。その後、acceptが発生すればスレッドでクライアントソケットを渡してメッセージ受信を待機します。&lt;/p&gt;&lt;p&gt;binder関数では受信するデータサイズ、データ受信、echoを付けたデータのサイズを送信、echoデータ送信順の流れで繰り返しています。&lt;/p&gt;&lt;p&gt;thread環境で作ったので接続が切れなくても別のスレッドでクライアントを待つことができます。&lt;/p&gt;&lt;p&gt;上の例をソケットクライアントソースです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、サーバーを起動してクライアントを接続します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1252&quot; data-filename=&quot;001.png&quot; style=&quot;width: 372px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1253&quot; data-filename=&quot;002.png&quot; style=&quot;width: 320px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クライアントからサーバーに接続してhelloというメッセージを10回にループで転送しました。サーバーには10回のhelloというメッセージを受信してecho :という文字を付けてecho : helloというメッセージをクライアントに転送しました。&lt;/p&gt;&lt;p&gt;その結果クライアントにはecho: helloが10回にコンソールに出力されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ソケットインスタンスを生成する時socket.af_inetとsocket.sock_streamを使いましたが、socket.af_inetはip4インターネットを使うという意味だし、socket.sock_streamはデータをバイナリ(byte stream)タイプに使うという意味です。&lt;/p&gt;&lt;p&gt;af_inet以外にaf_inet6、af_unix、af_can、af_packet、af_rdsのオプションがありますが、私も使ったことがないので具体的に知りません。af_inet6だけはip6インターネットだと思います。&lt;/p&gt;&lt;p&gt;インターネットアドレスタイプオプションみたいですが、一般的なプログラムならsocket.af_inetだけで十分だと思います。&lt;/p&gt;&lt;p&gt;socket.sock_streamは連結指向性(tcp)という意味で、似ているなオプションではsocket.sock_dgram、socket.sock_raw、socket.sock_rdm、socket.sock_seqpacketがあります。&lt;/p&gt;&lt;p&gt;sock_dgramは非連結指向性(udp)だし、sock_rawはソケットヘッダ情報まで取得する時に使うオプションです。&lt;/p&gt;&lt;p&gt;ソケットラベルにはsol_socket、ipproto_tcp、ipproto_udpを使えます。&lt;/p&gt;&lt;p&gt;特にsol_socketの場合、ヘッダーレベルオプションをプロトコル側で設定するオプションです。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;オプション値&lt;/th&gt;        &lt;th&gt;データタイプ&lt;/th&gt;		&lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;so_broadcast&lt;/td&gt;		&lt;td&gt;bool&lt;/td&gt;		&lt;td&gt;broadcastメッセージを送信可能にします。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;so_debug&lt;/td&gt;		&lt;td&gt;bool&lt;/td&gt;		&lt;td&gt;デバッグ情報をレコードします。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;so_dontlinger&lt;/td&gt;		&lt;td&gt;bool&lt;/td&gt;		&lt;td&gt;ソケットを閉める時メッセージ送受信が終わるまでブロックされないようにします。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;so_dontroute&lt;/td&gt;		&lt;td&gt;bool&lt;/td&gt;		&lt;td&gt;ルーティングせずに、直接にインターフェースを送信します。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;so_oobinline&lt;/td&gt;		&lt;td&gt;bool&lt;/td&gt;		&lt;td&gt;oobデータを転送設定する時、一般入力キューからデータを読み取ることができるようにします。このフラグを付けるとrecv(:12)やsend(:12)でmsg_oobフラグを使う必要なく、oobデータを読み取られます。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;so_group_priority&lt;/td&gt;		&lt;td&gt;int&lt;/td&gt;		&lt;td&gt;使わないフラグです。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;so_keepalive&lt;/td&gt;		&lt;td&gt;bool&lt;/td&gt;		&lt;td&gt;keepalivesを転送します。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;so_linger&lt;/td&gt;		&lt;td&gt;struct linger&lt;/td&gt;		&lt;td&gt;ソケットを閉める時、転送データがある場合、データ処理ルール&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;so_rcvbuf&lt;/td&gt;		&lt;td&gt;int&lt;/td&gt;		&lt;td&gt;データを受信するため、バッファ設定を明示&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;so_reuseaddr&lt;/td&gt;		&lt;td&gt;bool&lt;/td&gt;		&lt;td&gt;もう使ったアドレスを再使用(bind)するようにする。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;so_sndbuf&lt;/td&gt;		&lt;td&gt;int&lt;/td&gt;		&lt;td&gt;データ送信するため、バッファ設定を明示/td&amp;gt;      &lt;/td&gt;&lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;私の場合は特別なことがなければsocket.af_inetとsocket.sock_streamの設定でsol_socket + so_reuseaddr, ipproto_tcp + tcp_nodelayの形でソケット通信をします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでネットワーク(socket)通信する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/237.html</guid><pubDate>Thu, 18 Jun 2020 19:53:56 +0900</pubDate></item><item><title>[Python] 17. スレッド(Thread)とロック(lock)、そしてデッドロック(deadlock)</title><link>https://www.nowonbun.com/236.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでスレッド(thread)とロック(lock)、そしてデッドロック(deadlock)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スレッドとはプロセスの中で動いている最小の実行単位をスレッドといいます。ただ、このように説明すると何の意味がよく理解できません。&lt;/p&gt;&lt;p&gt;まず、プロセスというのはメモリに割り当てている一つのプログラムということです。プログラムは一つ以上のプロセスを運用することができず、プログラムとは一つのプロセスという意味と同じです。&lt;/p&gt;&lt;p&gt;一つのプロセスは二つ以上のスレッドを運用することができます。簡単に説明するとプロセスで二つ以上のスレッドを同時に実行できる並列処理方法だと思えば良いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;簡単な例として説明しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1249&quot; data-filename=&quot;001.png&quot; style=&quot;width: 347px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を見ればexample関数を二回に呼び出しました。example関数で1から9まで繰り返してコンソールに出力します。&lt;/p&gt;&lt;p&gt;当然に始めのexample関数の呼び出しが終わったら次のexample関数の呼び出しに実行することで順番に実行することを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、私はこの関数を順番ではなく、同時に実行したいです。&lt;/p&gt;&lt;p&gt;つまり始めのexample関数の呼び出しの終了を関係ずに次のexample関数の呼び出ししたいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1246&quot; data-filename=&quot;002.png&quot; style=&quot;width: 307px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみれば6から7間に1と2が出力されました。7は2の次にあります。つまりexample関数を二回に呼び出しましたが始めのexample関数が終わる前に二つ目のexample関数が呼び出されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このように使ったらthreadの特徴を確認するのが大変です。&lt;/p&gt;&lt;p&gt;今回はqueueを使って様々の作業を同時に処理する例を作って説明します。&lt;/p&gt;&lt;p&gt;上の例をみればキューのtask_doneとjoin関数を使いました。簡単に説明するとキューからget関数でデータを出せば別にカウンターが更新しないです。キューのデータ数を更新する関数がtask_done関数です。&lt;/p&gt;&lt;p&gt;queueの詳細な説明は次のリンクから確認できます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.python.org/ja/3/library/asyncio-queue.html&quot; target=&quot;_blank&quot;&gt;https://docs.python.org/ja/3/library/asyncio-queue.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;joinはキューが空けるまでプロセスを止まる関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1247&quot; data-filename=&quot;003.png&quot; style=&quot;width: 307px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一つのリストに複数のスレッドで無差別にデータを入れると、データが失われる場合があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1250&quot; data-filename=&quot;004.png&quot; style=&quot;width: 271px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;確かにgenerator関数を二回に呼び出しします。generator関数は1から9まで繰り返すのでコンソール結果は18を予想できます。でも、結果は9というデータが出ました。&lt;/p&gt;&lt;p&gt;理由は私がわざとエラーを発生するように作りましたが、始めのスレッドでbuf変数にデータを入れて、同時に二つのスレッドでもbuf変数にデータを入れます。&lt;/p&gt;&lt;p&gt;その後、dataにはbufの1を増加するのでこの状況になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;並列ですが、二つのスレッドを同期したいです。&lt;/p&gt;&lt;p&gt;pythonでは同期するためにはlockを使うべきです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1248&quot; data-filename=&quot;005.png&quot; style=&quot;width: 300px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;予想した結果が出力されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;lockはスレッド間の並列処理を同期化する機能がありますが、lockを使う時にはいつもデッドロックを気を付けなければならないです。&lt;/p&gt;&lt;p&gt;デッドロックはlockがお互いにロックかけていることです。&lt;/p&gt;&lt;p&gt;上の例はデッドロックの状況です。スレッドでgenerator1関数とgenerator2関数にはお互いにロックが掛けている状況です。&lt;/p&gt;&lt;p&gt;つまりgenerator1でlock1とlock2を掛けていきます。 generator2でlock2とlock1を掛けていきます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;generator1でlock1にロックを掛けてlock2を掛けてステップを過ぎていこうとすればすでにgenerator2でlock2が掛けている状態です。&lt;/p&gt;&lt;p&gt;generator2でlock2にロックを掛けてlock1を掛けてステップを過ぎていこうとすればすでにgenerator1でlock1が掛けている状態です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、generator1関数ではgenerator2のlock2が解除することを待つ状況だし、generator2関数ではgenerator1のlock1が解除することを待つ状況です。&lt;/p&gt;&lt;p&gt;これがデッドロックです。上の例は、私がわざとデッドロックに掛けるために作ったソースです。実際のプロジェクトでも関数の中に関数の中でlockをかけ、他のところでlockが掛かってデッドロック状態になるケースが多いです。&lt;/p&gt;&lt;p&gt;解決方法はは出来ればlock変数を一つに統一してlockが重ならないようにする方法しかないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでスレッド(thread)とロック(lock)、そしてデッドロック(deadlock)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/236.html</guid><pubDate>Thu, 18 Jun 2020 00:19:45 +0900</pubDate></item><item><title>[Python] 16. IO(ファイル読み取り、書き込み)を扱う方法</title><link>https://www.nowonbun.com/235.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでio(ファイル読み取り、書き込み)を扱う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラム言語で重要なリソースならio(ファイルを扱う)とソケット通信ではないかと思います。&lt;/p&gt;&lt;p&gt;特にプログラムを作成する時に主に使う言語はjavaやc#ですが、そのプログラムで使うテストデータを作ることや仮想マシンを作る時にスクリプト言語としてpythonをよく使う方です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スクリプト言語はパフォーマンスやメモリ管理の側ではコンパイル言語より疑問点があります。でも、テストデータ(jsonやxmlデータ)を作ることやサーバを管理するshellスクリプト管理、sqlスクリプト管理、ミドルウェアやサーバプログラムの環境設定ファイル管理などでは簡単にプログラムを実装ができる言語でpythonがいいではないかと思います。&lt;/p&gt;&lt;p&gt;そのため、ioがpythonの言語で一番重要ではないと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイルは入出力(input/output)が基本の流れです。入力はファイルからデータを読み取ることだし、出力はデータをファイルに書き込むことです。&lt;/p&gt;&lt;p&gt;上でopen関数を利用してファイルリソースを取得します。open関数のパラメータは使うファイル名とファイルオプションです。&lt;/p&gt;&lt;p&gt;ファイルオプションタイプは下記通りになります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;タイプ&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&gt;r&lt;/td&gt;        &lt;td&gt;ファイル読み取り&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot; white-space:=&quot;&quot; nowrap;=&quot;&quot;&gt;w&lt;/td&gt;        &lt;td&gt;ファイル書き込み(ファイルがなければ生成するし、存在すれば既存ファイルを削除して新しく生成する。)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&gt;x&lt;/td&gt;        &lt;td&gt;ファイル書き込み(ファイルが存在すればエラーを発生するし、なければ生成する。)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot; white-space:=&quot;&quot; nowrap;=&quot;&quot;&gt;a&lt;/td&gt;        &lt;td&gt;ファイル書き込み(ファイルがなければ生成するし、存在すれば既存内容からデータを追加する。)&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;モード&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;t&lt;/td&gt;        &lt;td&gt;一般テキストタイプ(省略可能)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot; white-space:=&quot; &quot;=&quot;&quot; nowrap;=&quot;&quot;&gt;b&lt;/td&gt;        &lt;td&gt;バイナリタイプ(テキスト文字以外のデータを作る時に使う。)&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;上の例でタイプとモードはwで、ファイルの書き込みを設定しました。実際にはwtで設定して、テキストを作成するという設定をすべきですが、tは省略が可能なのでwだけで設定が可能です。&lt;/p&gt;&lt;p&gt;ファイル名の場合はすべてのパスを使用する場合は、絶対パスでファイルを作成することができます。（d：\python\blog\text.txt）または、相対パスで生成することもできます。（./text.txtあるいはtext.txt）&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1239&quot; data-filename=&quot;001.png&quot; style=&quot;width: 296px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;作成することができました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はファイルを読み取りしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1241&quot; data-filename=&quot;002.png&quot; style=&quot;width: 317px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイルからテキストデータを読み取って画面に出力しました。&lt;/p&gt;&lt;p&gt;基本的にpythonでファイルを入出力は上の通りに動きます。&lt;/p&gt;&lt;p&gt;ioコネクションで重要なことはリソースをopenすると必ず閉めなければならないことです。 pythonではその機能をしやすくする機能があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1240&quot; data-filename=&quot;003.png&quot; style=&quot;width: 226px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイル接続をopen、closeで制御することもいいですが、途中でエラーが発生する時にcloseを呼び出さない時があります。try〜finallyを使用して接続を制御することができますが、それよりwith asを使えばしやすく接続を管理することができます。&lt;/p&gt;&lt;p&gt;print関数を使用してファイルに書き込みができます。「handle.write（msg + &quot;\n&quot;）」の形をprintで使うことです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1243&quot; data-filename=&quot;004.png&quot; style=&quot;width: 288px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果を見れば二行目ずつ改行されたことを確認できます。理由は、ファイルでもう改行があるのに、print関数でまた改行するので二行目ずつ改行されました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1242&quot; data-filename=&quot;005.png&quot; style=&quot;width: 515px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はテキストファイルではなくイメージを使いましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1245&quot; data-filename=&quot;006.png&quot; style=&quot;width: 839px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;バイナリデータを出力しました。バイナリデータは人が理解することはできません。（マトリックスのネオなら可能かも。。。）&lt;/p&gt;&lt;p&gt;画像ファイルの場合はデータが大きい場合が多いのでread関数に読み取るサイズを設定しました。この方法はテキストの場合も可能です。&lt;/p&gt;&lt;p&gt;読み取るサイズを設定する理由は不要なメモリの無駄に使うことをなくすためです。最近はパソコンのメモリが8gbほど余裕があるため、画像ファイルの一つぐらいは。。。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は読み込んだデータをファイルに出力しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1244&quot; data-filename=&quot;007.png&quot; style=&quot;width: 460px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;イメージファイルがファイル名_copyファイルにコピーされたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでio(ファイル読み取り、書き込み)を扱う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/235.html</guid><pubDate>Tue, 16 Jun 2020 18:37:00 +0900</pubDate></item><item><title>[Python] 15. クラスを継承する方法</title><link>https://www.nowonbun.com/234.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでクラスを継承する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でpythonでクラスを生成して使う方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/231.html&quot; target=&quot;_blank&quot;&gt;[python] 12. クラス(class)を使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonでクラスを生成する時、既存にあるクラスでもっと機能を拡張して使いたい時があります。でも、ただクラスを修正すると既存に参照した領域で影響されるので修正することはできないなのでコピペする時があります。&lt;/p&gt;&lt;p&gt;ただ、コピペすると元のクラスがバグがある時にコピペしたクラスをすべて修正しなければならないです。そのことより、ディベロッパーらしくないコーディングスタイルです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その時にただコピペでクラスを生成することではなく、継承することで再定義することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1238&quot; data-filename=&quot;001.png&quot; style=&quot;width: 243px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればmain2クラスは確かにexec_functionがありません。でもmainクラスを継承しましたので、mainのクラスの機能を使えます。&lt;/p&gt;&lt;p&gt;アンダーバー(_)を一つ使いましたが、protectedという意味で外部では参照できないですが、継承したクラスと内部では参照できるようなアクセス修飾子です。&lt;/p&gt;&lt;p&gt;まとめるとアンダーバーがない場合はpublicですべて参照が可能、アンダーバー(_)が一つで変数名が始まる場合はprotecetdで継承したクラスと内部、アンダーバー(_)が二つで変数名が始まる場合はprivateで内部だけ参照できるような設定です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;つまり、_dataの場合はアンダーバーが一つで変数名が始まるのでmainクラスを継承したmain2で参照ができます。なのでexec_function関数を呼び出すとmainは「main class」がmain2は「main2 class」が出力されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1234&quot; data-filename=&quot;002.png&quot; style=&quot;width: 243px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例ではmainクラスで_get_data関数を生成しましたが、main2クラスで継承する時に再定義する構造です。結果はexec_function関数を呼び出すと再定義した_get_data関数を呼び出します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、再定義したが親のクラスを使いたい時があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1233&quot; data-filename=&quot;003.png&quot; style=&quot;width: 254px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はmain2クラスで_get_dataを再定義しました。でもexec_function関数でmain2の_get_dataではなく、親クラス(super())の_get_data関数を呼び出しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今まで、使うクラスを継承して機能をそのままで使うクラスを生成しました。&lt;/p&gt;&lt;p&gt;抽象クラスという定義だけして、機能はないクラスを作ることができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1235&quot; data-filename=&quot;004.png&quot; style=&quot;width: 669px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;main2クラスは一般クラスなので正常にインスタンスを生成して使うことができます。&lt;/p&gt;&lt;p&gt;mainクラスは抽象クラスなのでインスタンスを生成ができないです。main2クラスで継承する時にも抽象メソッドは必ず再定義しなければならないです。それで完全体クラスになることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonでは継承は一つだけではなく、複数の継承ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1236&quot; data-filename=&quot;005.png&quot; style=&quot;width: 266px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;複数の継承する場合は親のクラスで関数名が重複なる可能性があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1237&quot; data-filename=&quot;006.png&quot; style=&quot;width: 233px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;main3クラスを生成する時にmain1、main2で継承する順番があります。一番左のクラスが優先で上の状況はmain１とmain2で両方に_get_data関数がある状況ならmain1の_get_dataを呼び出す。&lt;/p&gt;&lt;p&gt;複数継承は様々なクラスを特性を持ってきてよいと思いますが、実際は可読性で悪いので進めるプログラム文法ではないです。&lt;/p&gt;&lt;p&gt;クラスを複数で継承して同じ関数が多いだと思うと呼び出す時にスタック追跡することが大変になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでクラスを継承する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/234.html</guid><pubDate>Mon, 15 Jun 2020 18:20:07 +0900</pubDate></item><item><title>[Python] 14. クラスプロパティ(Property)</title><link>https://www.nowonbun.com/233.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonのクラスプロパティ(property)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、クラスのプロパティはクラス内部変数を参照するような関数の意味です。 普通はゲッター(getter)、セッター(setter)という時もあります。&lt;/p&gt;&lt;p&gt;クラスを生成する時に内部メンバー変数をpublicタイプで生成することはできますが、oopのカプセルの特性でクラスの内部メンバー変数を直接に参照することはよくないです。(pythonは別にoopプログラム言語ではないですが。。。)&lt;/p&gt;&lt;p&gt;なぜなら、クラスを生成する理由はオブジェクトの意味を合わせて作った変数がクラスですが、直接に変数を参照することになるとクラスの意味がなくなることです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1229&quot; data-filename=&quot;001.png&quot; style=&quot;width: 235px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればpeopleクラスに国語、数学、英語をいれてcalc関数で総点と平均点数を計算します。&lt;/p&gt;&lt;p&gt;でもpublicになるとa.avgで平均点数値を修正ができます。上みたいにクラスを設計すればクラスの意味がなくなります。なので変数のアクセスを制御する必要がありますが、それがクラスプロパティです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1231&quot; data-filename=&quot;002.png&quot; style=&quot;width: 474px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、クラスのメンバー変数を参照しなければならない時があります。その時にはpublicにすることではなく、ゲッター、セッターのプロパティを設定して参照します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1232&quot; data-filename=&quot;003.png&quot; style=&quot;width: 243px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実は上みたいにゲッター、セッター関数で変数を参照してもpythonの標準コーディングに間違いことではないです。javaの場合はプロパティを上みたいにゲッター、セッター関数で参照します。&lt;/p&gt;&lt;p&gt;c#の場合はプロパティ文法が別にあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonもデコレートを使ってプロパティを設定することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1228&quot; data-filename=&quot;004.png&quot; style=&quot;width: 245px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonのクラスプロパティはセッターだけを生成ができません。@ゲッター名.setterなのでゲッターが無ければセッター設定ができないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1230&quot; data-filename=&quot;005.png&quot; style=&quot;width: 336px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、ゲッターだけには設定ができます。ゲッターだけあれば読み取り専用変数になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1227&quot; data-filename=&quot;006.png&quot; style=&quot;width: 325px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;セッターを設定してないので産所するとエラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonのクラスプロパティ(property)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/233.html</guid><pubDate>Fri, 12 Jun 2020 17:45:13 +0900</pubDate></item><item><title>[Python] 13. クラス関数(class method)とダック・タイピング、そして特殊メソッド</title><link>https://www.nowonbun.com/232.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでクラス関数(class method)とダック・タイピング、そして特殊メソッドに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;クラス関数(class method)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;以前の投稿でpythonクラスと関数に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/231.html&quot; target=&quot;_blank&quot;&gt;[python] 12. クラス(class)を使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/225.html&quot; target=&quot;_blank&quot;&gt;[python] 06. 関数(function) - インライン関数、callbak、ラムダ(lambda)そしてクロージャ&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスで関数を使う方法は一番のパラメータでselfを入れるとクラスをインスタンス生成した後関数を呼び出せます。&lt;/p&gt; &lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1225&quot; data-filename=&quot;001.png&quot; style=&quot;width: 223px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonではクラス関数という関数があります。他のプログラム言語ならstatic関数ということです。&lt;/p&gt;&lt;p&gt;static関数はインスタンスを生成がしなくて呼び出せるものです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1223&quot; data-filename=&quot;002.png&quot; style=&quot;width: 227px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;ダック・タイピング&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;ダック・タイピングはc＃のdynamic変数と似ているし、javascriptのコールバック関数と似ています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1224&quot; data-filename=&quot;003.png&quot; style=&quot;width: 236px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonではインターフェイスが存在しないからダック・タイピングで多態性を実現したようです。でも、インタフェースがない環境でダック・タイピングを作成すると逆にバグの発生や可読性が悪くなると思います。&lt;/p&gt;&lt;p&gt;個人的な考えですが上のソースみたいに作成して、後にtestclass3クラスのcall_functionを変更したり削除したらエラーが発生する可能性があります。個人的な考えです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;特殊メソッド&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;特別なメソッドは、javaやc＃なら最上位クラスobjectで宣言された基本関数の意味です。つまり、tostring（）と同様のことでしょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.python.org/3/reference/datamodel.html#special-method-names&quot; target=&quot;_blank&quot;&gt;https://docs.python.org/3/reference/datamodel.html#special-method-names&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;特殊メソッドは種類がすごく多いですが、よく使う__eq__と__ne__、__str__、__repr__、__len__を説明します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1226&quot; data-filename=&quot;004.png&quot; style=&quot;width: 271px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;特殊メソッドは演算子を再定義する機能があります。よく使うとソースステップをたくさん減らせると思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでクラス関数(class method)とダック・タイピング、そして特殊メソッドに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/232.html</guid><pubDate>Thu, 11 Jun 2020 19:42:29 +0900</pubDate></item><item><title>[Python] 12. クラス(Class)を使う方法</title><link>https://www.nowonbun.com/231.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでクラス(class)を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスの概念は他のコンパイル言語を扱った方なら別に説明がなくても十分に知っていると思います。&lt;/p&gt;&lt;p&gt;pythonの場合はスクリプト言語なのでクラス概念を知らなくてもソース実装することや設計を作成することができます。&lt;/p&gt;&lt;p&gt;でも、管理が必要なデータや一つの概念でデータを結ばなければならないデータならクラスの概念で作ったほうが設計や実装することが理解しやすいしソースステップを減らすことができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;下記の例を通ってクラスがあることとないことの差異を確認しましょう。&lt;/p&gt;&lt;p&gt;例は国語、数学、英語の成績を持っている学生の平均値とクラスの平均値を計算しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1220&quot; data-filename=&quot;001.png&quot; style=&quot;width: 270px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば各人、国語、数学、英語成績のリスト宣言して人を追加する時に各成績リストも同じく追加します。つまり、4個のリストのデータ個数はいつも同じくなります。もし同じではない場合、整合性の問題になります。&lt;/p&gt;&lt;p&gt;つまり、personリストは4個なのに、mathリストは2個ならデータが可笑しいでしょう。&lt;/p&gt;&lt;p&gt;また、リストだけ確認すると誰のデータかは知りません。例えばmathの3番目のデータはpersionの3番目のデータを確認しないと知らないという意味です。&lt;/p&gt;&lt;p&gt;上の例は簡単なソースなので難しくないですが、ロジックが複雑だし、データが多いならデータ管理は簡単ではないでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1220&quot; data-filename=&quot;001.png&quot; style=&quot;width: 270px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ソースステップだけ見てもクラスを扱うことと使わないこととソースステップも差異が大きいです。&lt;/p&gt;&lt;p&gt;また、各人の点数を各リストに格納したことよりクラス内部のメンバー変数で管理するので整合性も問題ないです。つまり、リストから取り除くと成績も一緒に削除されるので可笑しいデータが入ることがありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonでクラスを使う方法は関数のdef代わりにclassキーワードを使えば生成します。小括弧はクラス継承のためにあることですが、他の投稿で詳しく説明します。&lt;/p&gt;&lt;p&gt;クラスはメソッドだけ構成されています。他の言語みたいに変数を宣言することができません。各関数の最初のパラメータはselfで固定になっています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;__init__の関数は初期化関数で他の言語ならコンストラクタということです。コンストラクタは無くてもクラスを扱うのは問題はないけど、可読性のためにコンストラクタを生成するほうがいいです。&lt;/p&gt;&lt;p&gt;特にメンバー変数はどの関数で宣言しても問題ないですが、コンストラクタで初期値を設定することがいいでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;各関数のselfは自分自身のクラスを指すことです。　グローバル変数を使う方法は、self.変数名でアクセスができます。&lt;/p&gt;&lt;p&gt;変数名を宣言するときは、変数名の前にアンダーバー（_）を二つ付けなければならないです。そうでなければ、外部からのアクセスが可能なpublicの形で変数が指定されるため、必ずアンダーバー（_）の2つを付けてprivateとして宣言する必要があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1221&quot; data-filename=&quot;002.png&quot; style=&quot;width: 589px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これはoopのカプセル化と関係がある構造です。クラスの変数が外部から直接参照がされてしまうとクラスの意味がなくなります。&lt;/p&gt;&lt;p&gt;メンバー変数はクラスの内部で様々な計算した結果、関数を利用して格納したデータですが、外部からのアクセスになって修正されてしまうとクラスの関数などの意味がなくなります。&lt;/p&gt;&lt;p&gt;クラスを生成（インスタンス）する方法は変数=クラス名（）;の呼び出します。他の言語で使うnewキーワードは必要ありません。&lt;/p&gt;&lt;p&gt;括弧の意味は__init__でselfパラメータを以降のパラメータでインスタンスを生成する時でデータを持ち込みます。&lt;/p&gt;&lt;p&gt;関数の呼び出し方法は、生成された変数で関数を呼び出します。またはクラス名.関数名（インスタンス）の形式でも宣言が可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1222&quot; data-filename=&quot;003.png&quot; style=&quot;width: 215px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでクラス(class)を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/231.html</guid><pubDate>Wed, 10 Jun 2020 19:33:33 +0900</pubDate></item><item><title>[Python] 11. デコレーター（Decorator）を使う方法</title><link>https://www.nowonbun.com/230.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonのデコレーター（decorator）を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;デコレーターは関数の再使用と関係があることですが、ただ再使用だけではなく機能を追加する機能だと思えばいいです。関数系の継承だと考えばいいです。&lt;/p&gt;&lt;p&gt;例えば、二つのパラメータを受け取って総合計を計算する関数があります。ここで我々は平均まで計算したいなら関数を修正しなければならないですが、修正しなくても機能を追加することで関数を続けて使用するような方法です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1218&quot; data-filename=&quot;001.png&quot; style=&quot;width: 224px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実務では上みたいにデコレーターを使うことはありません。ただ、デコレーターを理解しやすく説明するために作成しました。&lt;/p&gt;&lt;p&gt;普通はデコレーターはcallback関数やcount関数、ログを作成するために使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1219&quot; data-filename=&quot;002.png&quot; style=&quot;width: 264px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例みたいに使えばadd関数に呼び出すたびにログを残せます。デコレーター側にはパラメータ個数とは関係ないので、他の関数でも使うことができます。&lt;/p&gt;&lt;p&gt;callback関数ではラムダだけではなく、一般関数を入れることができます。&lt;/p&gt;&lt;p&gt;なので複雑なロジックでも設定ができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonのデコレーター（decorator）を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/230.html</guid><pubDate>Tue, 9 Jun 2020 17:27:18 +0900</pubDate></item><item><title>[Python] 10. モジュールとパッケージ(import)</title><link>https://www.nowonbun.com/229.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonのモジュールとパッケージ(import)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonでモジュールの意味は拡張子がpyになっているpythonコードのファイルということです。その意味は私がmain.pyを生成してその中でpythonコードを作成すればそれがmainモジュールということです。&lt;/p&gt;&lt;p&gt;他のプログラム言語はファイルの意味はクラス名と一致する以外は特に意味がないし、大体にnamespaceやpackage単位とクラス中心で動きます。私の考えはコンパイル言語はコンパイルすれば一つのファイルにアウトプットになるので別に意味がないじゃないかと思います。&lt;/p&gt;&lt;p&gt;逆にpythonはスクリプト言語なのでファイルの意味があることではないかと思います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1210&quot; data-filename=&quot;001.png&quot; style=&quot;width: 270px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースをみればimportキーワードでexample.pyを登録します。ここの重要なポイントは拡張子が必ず.pyになるべきです。&lt;/p&gt;&lt;p&gt;そしてexample.print_function()でexample.pyの中にあるprint_function関数を呼び出します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;こんなモジュールをディレクトリ別で管理することもできます。 このモジュールがあるディレクトリをpythonではパッケージといいます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1207&quot; data-filename=&quot;002.png&quot; style=&quot;width: 275px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1209&quot; data-filename=&quot;003.png&quot; style=&quot;width: 233px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考にディレクトリをパッケージ化するためには__init__.pyが必要です。__init__.pyがなければパッケージでインポートができません。(python3.3からは省略ができます。)&lt;/p&gt;&lt;p&gt;参考 - &lt;a href=&quot;https://dojang.io/mod/page/view.php?id=2449&quot; target=&quot;_blank&quot;&gt;https://dojang.io/mod/page/view.php?id=2449&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それなら私がexampleフォルダでtestディレクトリを生成して同じくexample1.pyファイルとexample2.pyを生成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1208&quot; data-filename=&quot;004.png&quot; style=&quot;width: 268px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1212&quot; data-filename=&quot;005.png&quot; style=&quot;width: 228px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;エラーは発生しないですが、import順番でexampleパッケージのexample1.print_functionを使うことができなくなりました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この時はパッケージ再命名方法で解決できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1211&quot; data-filename=&quot;006.png&quot; style=&quot;width: 240px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これみたいにモジュール名が同じだても再命名方法で使うことができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonはユーザー、つまりプログラマーのためよく使うモジュールやパッケージを作成しておりましたが、これをpythonでは標準ライブラリだといいます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.python.org/ja/3/library/index.html&quot; target=&quot;_blank&quot;&gt;標準ライブラリ&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例でosモジュール使ってみましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1214&quot; data-filename=&quot;007.png&quot; style=&quot;width: 746px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1217&quot; data-filename=&quot;008.png&quot; style=&quot;width: 535px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1216&quot; data-filename=&quot;009.png&quot; style=&quot;width: 827px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1213&quot; data-filename=&quot;010.png&quot; style=&quot;width: 230px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私はwindowで実行しましたので、ntという結果が出力されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;別途でpythonファイルでimport thisということを入力して実行すればpython十戒が出力されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1215&quot; data-filename=&quot;011.png&quot; style=&quot;width: 588px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;the zen of python, by tim peters python十戒 by tim peters&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;beautiful is better than ugly. 醜いより美しいほうがいい。&lt;/p&gt;&lt;p&gt;explicit is better than implicit. 暗示するより明示するほうがいい。&lt;/p&gt;&lt;p&gt;simple is better than complex. 複雑であるよりは平易であるほうがいい。&lt;/p&gt;&lt;p&gt;complex is better than complicated. 込み入っているよりは複雑であるほうがいい。&lt;/p&gt;&lt;p&gt;flat is better than nested. 単調なことがネストされた(重なる)ものより良い。　&lt;/p&gt;&lt;p&gt;sparse is better than dense. 密集しているよりは隙間があるほうがいい。&lt;/p&gt;&lt;p&gt;readability counts. 読みやすいことは重要。&lt;/p&gt;&lt;p&gt;special cases aren&apos;t special enough to break the rules. 特殊であることはルールを破る理由にならない。&lt;/p&gt;&lt;p&gt;although practicality beats purity. しかし、実用性を求めると純粋さが失われることがある。&lt;/p&gt;&lt;p&gt;errors should never pass silently. エラーは隠すな、無視するな。&lt;/p&gt;&lt;p&gt;unless explicitly silenced. ただし、わざと隠されているのなら見逃せ。&lt;/p&gt;&lt;p&gt;in the face of ambiguity, refuse the temptation to guess. 曖昧なものに出逢ったら、その意味を適当に推測してはいけない。&lt;/p&gt;&lt;p&gt;there should be one-- and preferably only one --obvious way to do it. 何かいいやり方があるはずだ。誰が見ても明らかな、たったひとつのやり方が。&lt;/p&gt;&lt;p&gt;although that way may not be obvious at first unless you&apos;re dutch. そのやり方は一目見ただけではわかりにくいかもしれない。オランダ人にだけわかりやすいなんてこともあるかもしれない。&lt;/p&gt;&lt;p&gt;now is better than never. ずっとやらないでいるよりは、今やれ。&lt;/p&gt;&lt;p&gt;although never is often better than *right* now. でも、今&quot;すぐ&quot;にやるよりはやらないほうがマシなことが多い。&lt;/p&gt;&lt;p&gt;if the implementation is hard to explain, it&apos;s a bad idea. コードの内容を説明するのが難しいのなら、それは悪い実装である。&lt;/p&gt;&lt;p&gt;if the implementation is easy to explain, it may be a good idea. コードの内容を容易に説明できるのなら、おそらくそれはよい実装である。&lt;/p&gt;&lt;p&gt;namespaces are one honking great idea -- let&apos;s do more of those! 名前空間は優れたアイデアであるため、積極的に利用すべきである。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;python十戒はpythonだけではなく、すべてもプログラミングする時にいつも考えなければならない言葉です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonのモジュールとパッケージ(import)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/229.html</guid><pubDate>Mon, 8 Jun 2020 19:07:50 +0900</pubDate></item><item><title>[Python] 09. 例外処理する方法</title><link>https://www.nowonbun.com/228.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonで例外処理する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを作成すると様々なエラーが発生することがあります。例えば、stringタイプにintタイプの数字を加算するとか、文字タイプを定数タイプにキャストするとかがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1204&quot; data-filename=&quot;001.png&quot; style=&quot;width: 479px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば4行目でエラーが発生したと表示されます。その後にpythonコードは中断されました。下のprint関数が実行されませんでした。&lt;/p&gt;&lt;p&gt;様々な変数を間違ってエラーが発生することは悪くないです。ただ、エラーをどのように処理することが重要です。&lt;/p&gt;&lt;p&gt;エラー処理を上手くできなければ上みたいにプログラム実行が止まります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;エラーが発生する時にはエラー処理をしてエラー部分のステップを超えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1199&quot; data-filename=&quot;002.png&quot; style=&quot;width: 276px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でエラーが発生する部分をtry ~ exceptで囲んでました。c = a + bのステップでエラーが発生してexceptのところに移動しました。&lt;/p&gt;&lt;p&gt;print(c)でコンソール出力が行わないです。&lt;/p&gt;&lt;p&gt;後、exceptであるコンソール出力してprint(a)が実行されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;区間内でエラーの種類は一つではなく様々なエラーが発生する可能性があります。そのエラーの種類によってエラー処理を別々にすることができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1203&quot; data-filename=&quot;003.png&quot; style=&quot;width: 432px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみればdivision_functionを三回に呼び出しますが、上の二回はエラーが発生します。&lt;/p&gt;&lt;p&gt;でも上のエラー種類が違うので別のprint関数を呼び出します。&lt;/p&gt;&lt;p&gt;参考に上の「エラータイプ as e」構造ならe変数にエラー内容が格納されます。&lt;/p&gt;&lt;p&gt;ここで例外の最上位エラータイプはexceptionです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1200&quot; data-filename=&quot;004.png&quot; style=&quot;width: 249px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいに作成すればtypeerrorとzerodivisionerrorが発生してもすべてexceptionに行ってしまいます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1206&quot; data-filename=&quot;005.png&quot; style=&quot;width: 248px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果はtypeerrorとzerodivisionerrorのところに移動しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;エラーが発生してエラーか、エラーではないかの関係しず、ステップ処理するキーワードはfinallyです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1201&quot; data-filename=&quot;006.png&quot; style=&quot;width: 253px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一般ソースステップではfinallyキーワードを使わなくてもexceptが呼び出したら次のステップに実行するのでfinallyの必要性を感じられません。&lt;/p&gt;&lt;p&gt;でも関数の中でreturnキーワードと一緒に使えばtryの中でreturnしても最後にfinallyの部分が実行されます。特にリソース管理する部分で使えばいい文法です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでエラーが発生すればどのように処理することを説明しました。今回は我々がエラーを発生して処理する方法に関して説明します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1205&quot; data-filename=&quot;007.png&quot; style=&quot;width: 390px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;raiseキーワードでexceptionクラスを呼び出すとエラーが発生します。&lt;/p&gt;&lt;p&gt;様々な関数を作成する時、データ検証で悪いデータが入力するかデータ計算結果が予想より使う場合にわざとエラー発生する必要があります。その時に使うことです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1202&quot; data-filename=&quot;008.png&quot; style=&quot;width: 241px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;call_function関数を呼び出すとエラーが発生しますが、例外処理をしました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonで例外処理する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/228.html</guid><pubDate>Fri, 5 Jun 2020 17:11:47 +0900</pubDate></item><item><title>[Python] 08. ジェネレータ(Generator)</title><link>https://www.nowonbun.com/227.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonのジェネレータ(generator)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ジェネレータ(generator)という辞典的な意味は生成するという意味です。pythonでもジェネレータ(generator)は生成する意味ではないことではないですが、繰り返し(ループ)文法でイテレータ(iterator)パターンを実装するような機能です。&lt;/p&gt;&lt;p&gt;少し説明が難しくなりますが、関数を呼び出すたびに結果が違うような機能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1196&quot; data-filename=&quot;001.png&quot; style=&quot;width: 424px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はジェネレータでrange関数と同じ結果が出るように実装しました。range関数も１から9まで出力して1ずつ増加します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ジェネレータは上の例みたいに関数で使えますが、実はコンプリヘンションでよく使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1197&quot; data-filename=&quot;002.png&quot; style=&quot;width: 277px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考 - &lt;a href=&quot;https://www.nowonbun.com/224.html&quot; target=&quot;_blank&quot;&gt;[python] 05. コンプリヘンション(comprehension)を使用する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば同じ結果になります。コンプリヘンションを利用してリストを作ることとジェネレータを作ることは差がないです。&lt;/p&gt;&lt;p&gt;そうすればジェネレータは別に意味がなさそうです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、パフォーマンスに大幅差があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1194&quot; data-filename=&quot;003.png&quot; style=&quot;width: 235px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メモリをみればリストは43,000バイトを使うしジェネレータは120バイトです。&lt;/p&gt;&lt;p&gt;なんでこの差が出るでしょう。&lt;/p&gt;&lt;p&gt;リストの場合はコンプリヘンションで計算した結果をすべて持っていることです。でも、ジェネレータの場合はデータをメモリに持っていることではなく、構造的なオブジェクトでデータを呼び出す時だけ返却するのでこの結果になりました。(構造的なオブジェクトとは値を持っていることではなく、関数のスタックを持っていることです。)&lt;/p&gt;&lt;p&gt;なので、一回性のデータならリストにデータを格納することではなく、ジェネレータを使うほうがパフォーマンスを上げることができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ジェネレータはリストによる短所もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1195&quot; data-filename=&quot;004.png&quot; style=&quot;width: 233px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;再使用ができないことです。なので結果は一回だけ出力されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ジェネレータはループだけ使うことではありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1198&quot; data-filename=&quot;005.png&quot; style=&quot;width: 460px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;next関数で2,4,6,8のデータを一つずつ出力しました。8の以降はデータがないので、エラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonのジェネレータ(generator)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/227.html</guid><pubDate>Thu, 4 Jun 2020 18:46:08 +0900</pubDate></item><item><title>[Python] 07. globalとnonlocal</title><link>https://www.nowonbun.com/226.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでglobalとnonlocalに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でクロージャ(closure)に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/225.html&quot; target=&quot;_blank&quot;&gt;[python] 06. 関数(function) - インライン関数、callbak、ラムダ(lambda)そしてクロージャ&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クロージャとはインライン関数で関数の外部から宣言したデータを持ち込むということです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1188&quot; data-filename=&quot;001.png&quot; style=&quot;width: 253px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも外部から宣言したデータを関数の内部で修正することはどうでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1187&quot; data-filename=&quot;002.png&quot; style=&quot;width: 241px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;example_function関数の内部でdataの値をhelloに変更しましたが、外部でコンソール出力するとデータが変更されないでした。&lt;/p&gt;&lt;p&gt;理由はexample_functionの中でdata=&quot;hello&quot;したことは内部変数に認識して新しい変数を宣言したからです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすると、仕様によってグローバル変数を関数の内部で変更する時もありますが、その時にはどうでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1190&quot; data-filename=&quot;003.png&quot; style=&quot;width: 241px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はdataの変数の値がちゃんと変更されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はインライン関数関数で使いましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1191&quot; data-filename=&quot;004.png&quot; style=&quot;width: 253px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のグローバル変数でdata変数があり、example_functionの関数の中でもdata変数があります。&lt;/p&gt;&lt;p&gt;その状況でinline_function関数でdata変数を参照すれば、inline_function関数の一番近いステップの変数を参照します。&lt;/p&gt;&lt;p&gt;グローバル変数よりexample_functionの変数がもっと近いステップということです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、使用によってグローバル変数を使いたいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1192&quot; data-filename=&quot;005.png&quot; style=&quot;width: 226px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすればinline_function中でもglobal関数を修正ができます。global dataをしてdata =&quot;値&quot;をいれば修正できます。&lt;/p&gt;&lt;p&gt;それなら、inline_function中でexample_functionのデータはどのように修正するでしょう?&lt;/p&gt;&lt;p&gt;単純にdata=&quot;値&quot;を入れれば初めの例みたいにinline_function関数のデータに宣言されてしまいます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1193&quot; data-filename=&quot;006.png&quot; style=&quot;width: 241px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;globalはグローバル変数をnonlocalは一番近いステップの変数を参照することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすればインライン関数の中でインライン関数でグローバル変数ではないけど、一番トップにある変数を修正したいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1189&quot; data-filename=&quot;007.png&quot; style=&quot;width: 253px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そこまでは参照ができないです。(何処まで参照したいのか？)&lt;/p&gt;&lt;p&gt;実は上みたいにソースを作成するとプログラム設計を考えなければならないです。可読性がすごく悪いですから。。。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでglobalとnonlocalに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/226.html</guid><pubDate>Wed, 3 Jun 2020 20:34:49 +0900</pubDate></item><item><title>[Python] 06. 関数(function) - インライン関数、callbak、ラムダ(lambda)そしてクロージャ</title><link>https://www.nowonbun.com/225.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonで関数(function) - インライン関数、callbak、ラムダ(lambda)そしてクロージャに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムで変数と制御文を学ぶと次に学ぶのはこの関数ではないかと思います。&lt;/p&gt;&lt;p&gt;関数はpythonで一番小さい単位のコードだしコードを再使用ができる文法です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関数の基本構造は下記通りになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1184&quot; data-filename=&quot;001.png&quot; style=&quot;width: 241px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関数はdefで定義して最後にはコロン（:)を付けます。関数領域のはじめはインデントで区分します。インデントが終わるところが関数の末です。&lt;/p&gt;&lt;p&gt;パラメータは小括弧の中で定義します。関数を呼び出すところで値を受け取るところです。&lt;/p&gt;&lt;p&gt;pythonで関数名を作成する方法は決めてないですが、コード標準では動詞+名詞の形式で作成するようにお勧めしています。他のプログラム言語と似ていますが、動詞、名詞の区分を大文字ではなくアンダーバーで区分します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonではパラメータを使う方法が二つあります。一つはパラメータ位置で値を渡す方法(一般的な方法)があり、キーワードでパラメータを渡す方法があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1181&quot; data-filename=&quot;002.png&quot; style=&quot;width: 277px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてパラメータの個数を決めなく、可変的に設定することもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1183&quot; data-filename=&quot;003.png&quot; style=&quot;width: 245px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみれば可変パラメータはタプルタイプになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;パラメータをディクショナリタイプで渡すこともできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1182&quot; data-filename=&quot;004.png&quot; style=&quot;width: 238px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonはjavascriptと似ている文法が多いです。&lt;/p&gt;&lt;p&gt;インライン関数で関数の中の関数を設定することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1177&quot; data-filename=&quot;005.png&quot; style=&quot;width: 251px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関数をオブジェクトタイプで設定することもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1185&quot; data-filename=&quot;006.png&quot; style=&quot;width: 254px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;get_functionの中で関数をリターンしました。javascriptの経験がある方ならどの意味か分かると思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;callbackはデザインパターンでvisitパターンで関数をパラメータで渡す意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1186&quot; data-filename=&quot;007.png&quot; style=&quot;width: 263px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javascriptみたいにcallback関数が作成されました。やはり、スクリプト言語なので似ている文法が多いです。&lt;/p&gt;&lt;p&gt;参考にnoneのキーワードは他のプログラム言語だとnullと同じ意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この頃になるとjavascriptみたいにクロージャやラムダ(lambda)があるか知りたくなります。pythonもクロージャがあるしラムダ(lambda)があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クロージャ機能は関数の中で宣言したデータではなく、外部で宣言したデータを持ち込んで使う方法ということです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1178&quot; data-filename=&quot;008.png&quot; style=&quot;width: 255px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならラムダ(lambda)式はどのように実装できましょうか？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1179&quot; data-filename=&quot;009.png&quot; style=&quot;width: 246px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;lambdaの作成方法はコンプリヘンションと似ています。if elseを作成する時にはifは前、elseは後の式が実行されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1180&quot; data-filename=&quot;010.png&quot; style=&quot;width: 277px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonで関数(function) - インライン関数、callbak、ラムダ(lambda)そしてクロージャに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/225.html</guid><pubDate>Tue, 2 Jun 2020 20:51:22 +0900</pubDate></item><item><title>[Python] 05. コンプリヘンション(Comprehension)を使用する方法</title><link>https://www.nowonbun.com/224.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonのコンプリヘンション(comprehension)を使用する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonのデータタイプでリスト、ディクショナリ、タプルなどを説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/222.html&quot; target=&quot;_blank&quot;&gt;[python] 03. pythonでリスト(list)とタプル(tuple)、そしてディクショナリ(dictionary)、セット(set)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンプリヘンション(comprehension)とはリスト、ディクショナリ、タプルの資料構造をよりしやすく検索、抽出するpythonの文法です。&lt;/p&gt;&lt;p&gt;個人的にc#のlinqやjavaのstream apiと似てる文法だと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例のため、リストを作りましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1176&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみれば以前にforの繰り返し式でifの条件で偶数でフィルターして実数タイプに変換しました。&lt;/p&gt;&lt;p&gt;forとifをよく知っているとそのように実装します。&lt;/p&gt;&lt;p&gt;でもコードステップが少なくても5行目ですね。でもコンプリヘンションを使うと1行目で抽出ができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンプリヘンションでを使う方法ではリストなので大括弧([])で始めは出力タイプ、forでlist1から抽出する。&lt;/p&gt;&lt;p&gt;条件はif x%2 == 0の意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リストコンプリヘンションがあればディクショナリコンプリヘンションもあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1175&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リストとディクショナリが可能ならセットも作られます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1174&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのほコンプリヘンションはifを重ねることもできるし、if〜else構造にすることもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1172&quot; data-filename=&quot;004.png&quot; style=&quot;width: 356px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでリスト（list）、ディクショナリ（dictionary）、セット（set）のコンプリヘンションを説明しました。&lt;/p&gt;&lt;p&gt;上記の形態を見れば、リストは大括弧（[]）、ディクショナリとセットは中括弧を（{}）を使用してヒコンプリヘンションを生成します。それを従って括弧でコンプリヘンションができると思い、タプルも小括弧(())でコンプリヘンションができると思われます。&lt;/p&gt;&lt;p&gt;でもタプルはコンプリヘンションは存在しません。タプルは修正できないリストだからです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、小括弧(())でコンプリヘンションの文法を作成すれば、コンプリヘンションではなく、ジェネレータになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1173&quot; data-filename=&quot;005.png&quot; style=&quot;width: 446px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ジェネレータは、データ構造ではなく、関数の構造であるため、他の投稿で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonのコンプリヘンション(comprehension)を使用する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/224.html</guid><pubDate>Mon, 1 Jun 2020 19:38:58 +0900</pubDate></item><item><title>[Python] 04. 制御文(if, while, for, break, continue)とインデント</title><link>https://www.nowonbun.com/223.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿は pythonで使う制御文(if, while, for, break, continue)とインデントに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;制御文という文字とおりにプログラムを制御するキーワードです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例えば、aという変数にユーザー任意の数1をユーザーから受け取る時、偶数の時は「even number」を出力して、奇数の時は「odd number」を出力したいです。その時にaの変数が偶数、奇数かを判断することを制御文といいます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1171&quot; data-filename=&quot;001.png&quot; style=&quot;width: 330px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;if ~ elif ~ else&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;分岐文と呼ばれるifです。上の例ですこし確認しましたが、その条件式にtrueの条件になると実行する制御文です。&lt;/p&gt;&lt;p&gt;if文は、単独で「if」のみを使うことができます。「if〜else」、「if〜elif」として使うこともできます。&lt;/p&gt;&lt;p&gt;でも、「elif〜else」や「elif単独」、「else単独」では使えません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;注意点は、条件式が終わると、必ずコロン（:)を付けなければならないです。&lt;/p&gt;&lt;p&gt;そして、条件式の中の実行区分は、他の言語の場合は、「{}」の中括弧で実行領域を設定するが、pythonの場合はインデントを決定します。&lt;/p&gt;&lt;p&gt;インデントは投稿の最後に詳しく説明します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1166&quot; data-filename=&quot;002.png&quot; style=&quot;width: 276px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1170&quot; data-filename=&quot;003.png&quot; style=&quot;width: 254px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;while&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;whileはループです。ループは、条件がfalseになるまで繰り返し実行する制御文です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1162&quot; data-filename=&quot;004.png&quot; style=&quot;width: 295px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;for&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;他のプログラム言語のjavaやc＃は、for文は、for初期式、条件式、増減式からなるループです。&lt;/p&gt;&lt;p&gt;でも、pythonの場合は、初期式、条件式、増減式ではなく、リストやタプル、ディクショナリ、セットのデータ値をシーケンスどおり取得ループです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1168&quot; data-filename=&quot;005.png&quot; style=&quot;width: 311px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;break&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;上びwhileとforのループで条件式がありますが、条件によってループ（繰り返し）を強制的に終了するキーワードです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1165&quot; data-filename=&quot;006.png&quot; style=&quot;width: 255px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考にrangeタイプは（初期値、終了値、増加値）からなるデータを作成する関数です。&lt;/p&gt;&lt;p&gt;ここで1から10まで1ずつ増加するrange値を順に1,2,3...と出力して、9まで出力すると正常ですが、ループの中にif文があり、iの値が3を超えるとループが止まります。つまり、4になるとbreakで繰り返しをロープが終了することです。&lt;/p&gt;&lt;p&gt;それで1から4まで出力することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでbreakを使用すれば、forやwhileにelseを付けることができます。このelse文はループの中でbreakを会わなければ実行される構文です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1163&quot; data-filename=&quot;007.png&quot; style=&quot;width: 315px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;continue&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;continueはbreakと似ている概念です。ループ（繰り返し）を実行する時、特定の値はジャンプする時があります。ジャンプという表現が少しあいまいですが、breakみたいにループを終了することではなく、continueをあえばループが開始ところに戻るという意味します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1164&quot; data-filename=&quot;008.png&quot; style=&quot;width: 311px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;奇数の場合はジャンプしましたので、printが実行できなかったんです。なので、出力が偶数だけです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;インデント&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;少し説明の順序が合わないですが、pythonでこのインデントは非常に重要です。&lt;/p&gt;&lt;p&gt;他のプログラミング言語の場合は、制御文や関数、クラスなどのコードの範囲を示す「{}」の中括弧がありますが、pythonのはそういうことはありません。&lt;/p&gt;&lt;p&gt;ただインデントで表現します。例えばif文の領域を示したいならインデントを合わせて使用します。&lt;/p&gt;&lt;p&gt;上をみれば、二つのprint関数があります。上のprintはifの領域になってインデントがあります。下のprintはインデントがないのでifの領域ではありません。&lt;/p&gt;&lt;p&gt;つまり最初のprint関数の前にインデントがありなしで領域区分をします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インデントは、最も一般的なのが、スペース4欄、またはスペース2欄、タブキがあります。&lt;/p&gt;&lt;p&gt;このインデントは、互いに混在して使用することができません。最初のインデントをタブキーとして使用したが、次はスペース4カーンを使用すると、エラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1169&quot; data-filename=&quot;009.png&quot; style=&quot;width: 318px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のメモ帳にはタブキーとスペース4欄が似てます。&lt;/p&gt;&lt;p&gt;でも実行するとエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1167&quot; data-filename=&quot;010.png&quot; style=&quot;width: 590px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonの標準コードはpep8を従ってスペース-4を推奨しています。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.python.org/dev/peps/pep-0008/&quot; target=&quot;_blank&quot;&gt;https://www.python.org/dev/peps/pep-0008/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonで使う制御文(if, while, for, break, continue)とインデントに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/223.html</guid><pubDate>Fri, 29 May 2020 21:09:08 +0900</pubDate></item><item><title>[Python] 03. Pythonでリスト(list)とタプル(tuple)、そしてディクショナリ(dictionary)、セット(set)</title><link>https://www.nowonbun.com/222.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでリスト(list)とタプル(tuple)、そしてディクショナリ(dictionary)、セット(set)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一般のプログラム言語の流れだと変数宣言とデータタイプを確認すると次は制御文を確認します。&lt;/p&gt;&lt;p&gt;でも、pythonの場合はリスト系のデータ集合から確認します。&lt;/p&gt;&lt;p&gt;リストとタプルはデータが集まっている配列タイプでリストは追加、削除が可能、タプルは不可能なタイプです。その中でディクショナリはリストでキーがあるデータセットです。&lt;/p&gt;&lt;p&gt;セットはリストと似ていますが、数学の集合計算の和集合、積集合を計算するようなデータタイプです。&lt;/p&gt;&lt;p&gt;pythonには同じリストタイプでも種類がもっと精密に分けています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;リスト(list)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;リストは他のプログラム言語と同じく、push(append)とputが存在するリスト構造のアルゴリズムです。リストはpythonで大括弧([])で宣言します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1156&quot; data-filename=&quot;001.png&quot; style=&quot;width: 269px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リストには格納、挿入、削除機能もありますが、ソート、コピー機能もあるのでデータ集合管理がしやすいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;タプル(tuple)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;タプルは上のリスト機能で宣言だけできるし、挿入、格納、削除ができないし、ソート、コピーもできないです。&lt;/p&gt;&lt;p&gt;タプルはpythonで小括弧(())で宣言します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1157&quot; data-filename=&quot;002.png&quot; style=&quot;width: 504px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;タプルの0番のデータを修正しようとすればエラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;タプルは関数の結果、キーなどで使うタイプです。&lt;/p&gt;&lt;p&gt;なのでタプルになっているデータを一つの変数に変換ができますが、それをpythonではタプルアンパッキングといいます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1158&quot; data-filename=&quot;003.png&quot; style=&quot;width: 244px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;タプルアンパッキングはコンマ(,)の区切りでやりますが、タプルの個数は一致しないとエラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;ディクショナリ(dictionary)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;pythonのディクショナリはjavascriptのjsonの構造と同じです。ディクショナリはpythonで中括弧({})で宣言します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1159&quot; data-filename=&quot;004.png&quot; style=&quot;width: 351px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;セット(set)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;setは集合計算専用のデータタイプです。つまり、数学の特性をもっているデータタイプです。セットはpythonで中括弧({})で宣言します。&lt;/p&gt;&lt;p&gt;ここで区分することはディクショナリも中括弧({})で宣言します。差異はディクショナリはキーがあるしセットはキーがないことです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1161&quot; data-filename=&quot;005.png&quot; style=&quot;width: 240px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;セットとリストの差はリストはユーザーが格納順番でデータがありますが、セットは順番がありません。格納したことが初めにある可能性もあるし、最後にある可能ですもあります。&lt;/p&gt;&lt;p&gt;集合のために特化になったからだと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;リスト系のデータタイプの共通関数&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;リストとディクショナリ、タプル、セットが共通で使える関数があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1160&quot; data-filename=&quot;006.png&quot; style=&quot;width: 318px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでリスト(list)とタプル(tuple)、そしてディクショナリ(dictionary)、セット(set)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/222.html</guid><pubDate>Wed, 27 May 2020 18:49:08 +0900</pubDate></item><item><title>[Python] 02. データタイプ、変数宣言そしてコメントする方法</title><link>https://www.nowonbun.com/221.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpythonでデータタイプ、変数宣言そしてコメントする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;どのプログラムでも最初はデータタイプから確認します。&lt;/p&gt;&lt;p&gt;pythonでデータタイプを説明する前に、簡単に変数宣言する方法に説明します。&lt;/p&gt;&lt;p&gt;pythonの場合はc++やjavaなどのコンパイル言語と違って別に指示タイプが無いです。javascriptみたいにvarやletを使う必要もありません。&lt;/p&gt;&lt;p&gt;ただ、使いたい変数名を宣言して値を格納すればpython内部で自動に変数タイプを指定して値を格納します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1154&quot; data-filename=&quot;001.png&quot; style=&quot;width: 290px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみればaの変数に1を格納したらintタイプになることを確認できます。後で、&quot;hello world&quot;のデータを格納したら自動にstringタイプに変換されます。&lt;/p&gt;&lt;p&gt;pythonではこんなに自動にデータタイプを設定してデータを変数に格納します。&lt;/p&gt;&lt;p&gt;※これかスクリプト言語のいい点ですが、個人的にプログラムが複雑になるとこのデータタイプが固定にならないので、データが変換されると何処で変換されたか把握が大変になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonにはどのデータタイプがあるかを確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1155&quot; data-filename=&quot;002.png&quot; style=&quot;width: 466px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データタイプが一般プログラム言語より多いです。基本的に文字列、定数、実数、ブールは別に他のプログラム言語でもよくあるタイプです。面白いことは複素数タイプがあることです。&lt;/p&gt;&lt;p&gt;複素数タイプは実数と虚数を計算するためのタイプです。数学的な計算や数値計算を行う時に必要なデータタイプだと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてリストとタプル、dictionaryタイプがあります。リストは文字通り、リストとしてデータを挿入、削除が可能なデータタイプです。リストは挿入、削除が簡単にできるタイプならタプルは配列みたいに一回に挿入すると削除ができないタイプです。&lt;/p&gt;&lt;p&gt;つまり、タプルが宣言されたら、挿入、削除、修正ができません。 dictionaryはマップタイプみたいにキーを設定してデータを挿入するタイプです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;集合タイプはsetとfrozensetのタイプがあります。 集合タイプはと数学の集合と関係があるタイプです。、和集合、積集合などを計算のためのタイプです。&lt;/p&gt;&lt;p&gt;setはデータの変更が可能、frozensetは変更が不可能な集合タイプです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;byteとbyte配列とbyteのメモリタイプはバイナリと関係があるデータタイプです。つまり、特定のファイルをバイナリで読み込む時にbyteに変換することです。&lt;/p&gt;&lt;p&gt;バイナリタイプに変換されたbyteタイプはデータ修正が不可能です。&lt;/p&gt;&lt;p&gt;でも、仕様によってバイナリデータを直接に修正する時もあります。その時にbyteタイプからbyte配列タイプに変換して修正が可能です。&lt;/p&gt;&lt;p&gt;memoryviewタイプはバイナリデータとしてではなく、データとしてメモリに格納することです。つまり、イメージならイメージバイナリを持つことではなく、イメージままを持つことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonで扱うデータタイプで集合タイプ、複素数タイプがあることが面白いです。このデータタイプがあるからpythonの統計プログラムや集合、数値的な計算で強力しますといいますが、私はまだそのレベルではないのでよく知りません。&lt;/p&gt;&lt;p&gt;特に私が複素数タイプまで扱うことができるかをしれません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonののコメントは、コメントの開始に＃に設定します。&lt;/p&gt;&lt;p&gt;領域コメントはシングルクォートやダブルクォートを連続に三つをつけばコメント領域になります。&lt;/p&gt;&lt;p&gt;上の最後の行で#で区間コメントをやろうと思いますが、#がある地点で後はすべてコメント領域になるのでa=1はコメント処理になります。&lt;/p&gt;&lt;p&gt;上の形式は正しいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpythonでデータタイプ、変数宣言そしてコメントする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/221.html</guid><pubDate>Tue, 26 May 2020 18:16:52 +0900</pubDate></item><item><title>[Python] 01. Python3をインストールする方法(Anacondaインストール)</title><link>https://www.nowonbun.com/220.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はpython3をインストールする方法(anacondaインストール)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ユーザーがプログラムでpcを扱う方法に関して三つがあります。&lt;/p&gt;&lt;p&gt;一つはシェルコマンドで操作する方法、二つはプログラム(コンパイルになったプログラム)を実装して実行する方法、最後にスクリプトを作成して実行する方法があります。&lt;/p&gt;&lt;p&gt;スクリプトとは一応プログラム言語ですが、c++やjavaみたいにコンパイル(作成したソースを機械語で変換する作業)でバイナリコードに変換することではないですが、シェルみたいに会話式で一つのコマンドで実行することではなくプロシージャ(作業順番)を配置して実行することです。&lt;/p&gt;&lt;p&gt;簡単にコンパイルプログラムとシェルコマンドと半分ずつ混ぜているプログラム言語だと思えばよいでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;スクリプト言語では代表的な言語はpython、javascript,phpがあります。&lt;/p&gt;&lt;p&gt;phpとはスクリプト言語ですがウェブサーバーサイドで使う言語だし、javascriptはウェブクライアント側でよく使うプログラム言語です。javascriptの場合はnode.jsを利用してローカルでも使えますが、個人的にnode.jsとpythonの選択肢があればpythonがもっといいではないかと思います。&lt;/p&gt;&lt;p&gt;なぜならpythonの場合はnode.jsよりコミュニティサイズやライブラリの量を考えてもnode.jsより何倍に大きいしプログラム開発もjavascriptよりもっと簡単だし、理解しやすいのでpythonを選択して運用するほうがいいではないかと個人的な考えです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからpythonをインストールしましょう。&lt;/p&gt;&lt;p&gt;pythonを直接にホームページに接続してダウンロードしてインストールすることができます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.python.org/&quot; target=&quot;_blank&quot;&gt;https://www.python.org/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1152&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonホームページで直接にダウンロードしてインストールすれば、後に必要なライブラリがあるとき別々にすべてインストールしなければならないです。でもよく使うライブラリパッケージを含めているpythonバージョンがあります。それがanacondaです。&lt;/p&gt;&lt;p&gt;anacondaをインストールするほうが様々ことに楽でしょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.anaconda.com/distribution/&quot; target=&quot;_blank&quot;&gt;https://www.anaconda.com/distribution/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1153&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;バージョンは3.xバージョンと2.xバージョンがあります。参考に2.xと3.xは全然違うpythonです。&lt;/p&gt;&lt;p&gt;3.xが2.xより最新バージョンなことはあってますが、32bit環境から64bitに環境バージョンアップすることでデータタイプや様々なタイプ変更になって互換性でバージョンを分離したではないかと思います。&lt;/p&gt;&lt;p&gt;pythonの創始者グイド・ヴァンロッサムはpython2はバグアップデータはしますが、もうバージョンアップやライブラリ支援もないし、すべてはpython3に続けますと言いました。&lt;/p&gt;&lt;p&gt;始めに使うユーザーならpython3を利用しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならダウンロードしてインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1147&quot; data-filename=&quot;003.png&quot; style=&quot;width: 499px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1143&quot; data-filename=&quot;004.png&quot; style=&quot;width: 499px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonの場合はpcにあれば様々ところで使えるのでall usersでインストールしてもよいです。&lt;/p&gt;&lt;p&gt;私の場合は一応just meでインストールします。(パソコンセキュリティの問題があるため)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1144&quot; data-filename=&quot;005.png&quot; style=&quot;width: 499px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本ディレクトリもよいですが、cmdコマンドwindowで作業する時もありので、できればアクセスがしやすいディレクトリに設定するほうがよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1145&quot; data-filename=&quot;006.png&quot; style=&quot;width: 499px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1146&quot; data-filename=&quot;007.png&quot; style=&quot;width: 499px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールが完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからcmdコンソールを開いてバージョン確認とhello worldをコンソール出力します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1142&quot; data-filename=&quot;008.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;pythonのideツールはjupyterといういいツールがあります。anacondaでインストールしたらjupyterが基本的にインストールされます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;startボタンを押下して次のiconを探しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1150&quot; data-filename=&quot;009.png&quot; style=&quot;width: 323px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行すれば下記のコンソールwindowが出ます。&lt;/p&gt;&lt;p&gt;jupyterは自動にブラウザで開けますが、もし開かない場合はlocalhost:8888?token=xxxをコピーしてブラウザのurlアドレスに貼り付けましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1151&quot; data-filename=&quot;010.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとjupyterが実行される画面が出ます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1148&quot; data-filename=&quot;011.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;右上のnewボタンを押下しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1149&quot; data-filename=&quot;012.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のイメージみたいにprint(&quot;hello world&quot;)を入力してrunボタンを押下すると結果を確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;notepad++やサクラエディタ、vidual studio codeで作成してもよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでpython3をインストールする方法(anacondaインストール)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/220.html</guid><pubDate>Mon, 25 May 2020 19:02:44 +0900</pubDate></item><item><title>[Java] HttpConnectionを利用してウェブページを取得する方法</title><link>https://www.nowonbun.com/219.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでhttpconnectionを利用してウェブページを取得する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がウェブサービングをするとたまにウェブのデータをダウンロードしてデータ用で使いたい時があります。特にウェブページではなくてもrssやウェブのデータなどを扱いたい時があります。&lt;/p&gt;&lt;p&gt;その時にソケット通信でデータを受け取ることが可能です。なぜならウェブサーバーもソケットサーバーなので、一般通信ソケットで通信が出来ます。でも、ただソケット通信でデータを取得するためには通信プロトコルを合わせてヘッダー要請を送らなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、ソケット通信でもヘッダーは自動設定してブラウザみたいにurlだけでデータを取得するクラスがありますが、それがhttpurlconnectionといいます。&lt;/p&gt;&lt;p&gt;httpconnectionの場合はウェブレンダリングはしないので、javascriptのajaxの動的なデータや計算値などはなくて、純粋なウェブサーバーから受け取ったデータだけ取得できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1140&quot; data-filename=&quot;001.png&quot; style=&quot;width: 810px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一番上の結果200はウェブサーバーから正常にデータを受け取ったの正常コードです。次は接続アドレスにパラメータが付けることをちゃんと確認できます。&lt;/p&gt;&lt;p&gt;次は私のブログの最初の投稿のデータを出力した結果です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1141&quot; data-filename=&quot;002.png&quot; style=&quot;width: 804px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;view-sourceで確認すると同じデータだと判断できます。&lt;/p&gt;&lt;p&gt;今回はpost方式をテストするサイトが特にありませんが、パラメータをヘッダーに入れることだけの差なので特に問題がありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前、jsoupでhtmlを探索する方法に関して投稿したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/218.html&quot; target=&quot;_blank&quot;&gt;[java] jsoupを利用してxmlファイル(html)を扱う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その二つの機能をちゃんと混ぜって作成するとhtmlの望むデータを取得できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでhttpconnectionを利用してウェブページを取得する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/219.html</guid><pubDate>Wed, 20 May 2020 23:53:24 +0900</pubDate></item><item><title>[Java] Jsoupを利用してXMLファイル(HTML)を扱う方法</title><link>https://www.nowonbun.com/218.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでjsoupを利用してxmlファイル(html)を扱う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロジェクトを作成するとxmlファイルをよく使います。特にウェブの場合は画面デザインはhtml形式で作成します。&lt;/p&gt;&lt;p&gt;xmlの形式はタグが開く、閉めるの構造でアトリビュートやデータになっています。xmlを探索する方法は様々の方法がありますが、最近はjqueryのsizzleエンジンでcssselectorでタグを探索してデータを取得する方法をよく使っています。&lt;/p&gt;&lt;p&gt;でもjqueryはjavaのライブラリではなく、javascriptのライブラリです。&lt;/p&gt;&lt;p&gt;javaにはjsoupというライブラリがあります。 jqueryのcssselectorと同じ方法で探索が可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jsoupを使うためにはmavenを利用してライブラリをダウンロードしなければならないです。&lt;/p&gt;&lt;p&gt;repository - &lt;a href=&quot;https://mvnrepository.com/artifact/org.jsoup/jsoup/1.12.1&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/org.jsoup/jsoup/1.12.1&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1138&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;xmlを探索テストをするためにこのブログのrssファイルを利用しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1139&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/rss&quot; target=&quot;_blank&quot;&gt;https://www.nowonbun.com/rss&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でchannel-&amp;gt;item-&amp;gt;title-&amp;gt;をコンソールに出力しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1136&quot; data-filename=&quot;003.png&quot; style=&quot;width: 660px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はhttpurlconnectionを利用してデータを取得しました。自分のブログは普通のウェブホスティングではないので、ヘッダーが正常に表示されません。そのため、jsoup.connectを使うとエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1135&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stringデータをdocumentタイプに生成します。 select関数を使って探索を開始します。&lt;/p&gt;&lt;p&gt;結果はitemのtitleは各投稿のタイトルなのでコンソールに出力します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はxmlを利用しましたが、htmlファイルも探索ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1137&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ブログの名を取得しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1134&quot; data-filename=&quot;006.png&quot; style=&quot;width: 259px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;htmlファイルも取得してタグのclassで探索します。&lt;/p&gt;&lt;p&gt;結果はブログの名がよく出力されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでjsoupを利用してxmlファイル(html)を扱う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/218.html</guid><pubDate>Tue, 19 May 2020 19:32:21 +0900</pubDate></item><item><title>[C#] 非同期ソケット通信(IOCP)-APMパターン</title><link>https://www.nowonbun.com/217.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#の非同期ソケット通信(iocp)-apmパターンに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前、非同期ソケット通信(iocp)に関して説明してその中でeap(event-based asynchronous pattern)に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/216.html&quot; target=&quot;_blank&quot;&gt;[c#] 非同期ソケット通信(iocp)-eapパターン&lt;/a&gt;&lt;/p&gt;&lt;p&gt;apmパターンも同じ非同期ソケット通信(iocp)ですが、パターンが少し違うことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;eapの場合はイベントタイプでsocketasynceventargsクラスのcompletedイベントを利用してacceptasyncとsendasync、receiveasyncのクライアント待機、送信、受信をしました。&lt;/p&gt;&lt;p&gt;このeapの短所はすべて同じイベントで実行するので可読性がよくない問題があります。&lt;/p&gt;&lt;p&gt;それで.net framework 4.0からはasynccallbackのデリゲートを利用してbeginacceptやbeginsend、beginreceiveの関数で待機、送信、受信をします。&lt;/p&gt;&lt;p&gt;私の考えでは4.0からはc#がlambda式にも対応することができるのでイベント方式からデリゲート方式に実装が可能になったと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;個人的にみるとパフォーマンスや概念は別に変わったことは無く、ソースステップがもっとシンプルになったと思います。&lt;/p&gt;&lt;p&gt;windowのtelnetのプログラムを利用してデータを受け取るサーバーを作成しましょう。&lt;/p&gt;&lt;p&gt;作成が終わったらサーバーを起動してtelnetプログラムで接続します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1132&quot; data-filename=&quot;001.png&quot; style=&quot;width: 338px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ipはローカル(127.0.0.1)に設定してポートは10000です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1133&quot; data-filename=&quot;002.png&quot; style=&quot;width: 600px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;telnetからメッセージを送信したらサーバー側でメッセージをちゃんと受け取ってコンソールに表示します。&lt;/p&gt;&lt;p&gt;telnet側にはechoメッセージがちゃんと表示します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1131&quot; data-filename=&quot;003.png&quot; style=&quot;width: 641px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;終了まで綺麗に送受信ができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サーバーは作成できましたからこれからクライアントを作成します。&lt;/p&gt;&lt;p&gt;クライアントプログラムでもlisten、acceptとconnectの差だけです。&lt;/p&gt;&lt;p&gt;サーバーを起動してクライアントで接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1130&quot; data-filename=&quot;004.png&quot; style=&quot;width: 760px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のtelnetで接続したことと同じ結果になりました。&lt;/p&gt;&lt;p&gt;参照 - &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/&quot; target=&quot;_blank&quot;&gt;https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#の非同期ソケット通信(iocp)-apmパターンに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/217.html</guid><pubDate>Mon, 18 May 2020 18:45:37 +0900</pubDate></item><item><title>[C#] 非同期ソケット通信(IOCP)-EAPパターン</title><link>https://www.nowonbun.com/216.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#の非同期ソケット通信(iocp)-eapパターンに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前、同期ソケット通信に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/215.html&quot; target=&quot;_blank&quot;&gt;[c#] ソケット(socket)通信をする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通の同期、非同期の意味はクライアントとサーバーの連結状態が続いていれば同期だし、非同期は連結を続けていることではなくデータを送受信すれば連結を切断することです。&lt;/p&gt;&lt;p&gt;でも、ここで説明する同期と非同期は意味が少し違います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;システム内部でスレッドリソースでソケット通信を保持するかどうかの差です。&lt;/p&gt;&lt;p&gt;つまり、同期ソケット通信ならsocketクラスをサーバーにlistenしてclientが接続するたびにスレッドを生成してオブジェクトを保持することです。スレッドのリストはvectorやlistで管理して切断する時、オブジェクトを解除することです。&lt;/p&gt;&lt;p&gt;でもこの同期ソケット通信はプログラム実装が簡単ですが、リソース問題があります。システムリソースは限定的なので、スレッドとsocketオブジェクトを無限に生成することができません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ゲームサーバーだと考えても同時接続200clientから300clientだけでもスレッドが200個から300個が生成されることです。最近は、ハードウェアが以前より非常に向上になりましたが、c#の長所であり短所であるgc(ガベージコレクション)があるのでリソース管理がしやすくないでしょう。&lt;/p&gt;&lt;p&gt;c#というのはインスタンスを生成することは可能ですが、メモリ解除はできません。gcが自動に解除してくれますが、リソースをたくさん使っている状況でサーバーがフリージング状態になっても可笑しくないでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その問題を解決することが非同期ソケットです。非同期ソケットはclientが接続すると接続する時の処理をためのイベントを発生して連結リソースをキュー構造のiocpに格納します。&lt;/p&gt;&lt;p&gt;その後からclientからメッセージが発生するとiocpから連結リソースを持ち込んでソケット通信を続けることです。そのことでサーバはthreadを生成する必要がないので、リソースをたくさん節約することができます。&lt;/p&gt;&lt;p&gt;非同期ソケットサーバーはスレッドを管理するスレッドプールを生成する必要がないし、スレッドを管理する必要がないので、その部分はソースが簡単になります。&lt;/p&gt;&lt;p&gt;これが同期ソケット通信と非同期ソケット通信の差です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;非同期ソケットはメモリ効率もいいし、ソースも簡単に作成することができるので、同期ソケット通信パターンはいらないと思いますが、必ずそうではありません。&lt;/p&gt;&lt;p&gt;非同期ソケットサーバーも確かに短所があります。&lt;/p&gt;&lt;p&gt;clientのアクションでサーバが返事する形、webserverみたいに接続してすぐ切断する仕様は非同期ソケットがよいです。&lt;/p&gt;&lt;p&gt;でもclientからリクエストがなくてもデータをサーバーからクライアントにリアルタイムでデータを送信しなければならない時には同期ソケット通信がよいです。&lt;/p&gt;&lt;p&gt;例えば、ワンフレーム端末タイプか株価チャートみたいに推移プログラムのデータを継続的に受けなければならない形です。&lt;/p&gt;&lt;p&gt;この時にはクライアントのリストから早めにクライアントを取得してデータを送信しなければならないことなので、リストに連結リソースを管理して送信すれば簡単に作成することが可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c＃では、この非同期ソケット通信でtap(task-based asynchronous pattern）、eap（event-based asynchronous pattern）、apm（asynchronous programming model）があります。&lt;/p&gt;&lt;p&gt;その中でここにはeapパターンを説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;windowのtelnetのプログラムを利用してデータを受け取るサーバーを作成しましょう。&lt;/p&gt;&lt;p&gt;作成が終わったらサーバーを起動してtelnetプログラムで接続します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1126&quot; data-filename=&quot;001.png&quot; style=&quot;width: 338px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ipはローカル(127.0.0.1)に設定してポートは10000です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1129&quot; data-filename=&quot;002.png&quot; style=&quot;width: 663px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;telnetからメッセージを送信したらサーバー側でメッセージをちゃんと受け取ってコンソールに表示します。&lt;/p&gt;&lt;p&gt;telnet側にはechoメッセージがちゃんと表示します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1127&quot; data-filename=&quot;003.png&quot; style=&quot;width: 665px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;終了まで綺麗に送受信ができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サーバーは作成できましたからこれからクライアントを作成します。&lt;/p&gt;&lt;p&gt;クライアントプログラムでもlisten、acceptとconnectの差だけです。&lt;/p&gt;&lt;p&gt;サーバーを起動してクライアントで接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1128&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のtelnetで接続したことと同じ結果になりました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#の非同期ソケット通信(iocp)-eapパターンに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/216.html</guid><pubDate>Fri, 15 May 2020 19:31:02 +0900</pubDate></item><item><title>[C#] NPOIを利用してExcelを読み込んで出力する方法</title><link>https://www.nowonbun.com/214.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のnpoiを利用してexcelを読み込んで出力する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でc#でエクセルファイルを生成する方法でnpoiのライブラリを説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/213.html&quot; target=&quot;_blank&quot;&gt;[c#] npoiライブラリを利用してエクセルファイルを生成する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はnpoiを利用してエクセルを生成することではなく、エクセルのテンプレートを読み込んでエクセルを出力する方法に関して説明します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1114&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例のデータは始めの列は月、二つ目は温度平均、三つ目は午前の温度、四つ目は午後の温度です。&lt;/p&gt;&lt;p&gt;右下のグラフは基本の表の数値の基盤で表れた一年間の気温平均です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでやろうと思うことはエクセルで温度平均は関数でカラムを関数で計算するし、グラフもb列のデータで表示するので、エクセルを読み込んでc列のデータとd列のデータを修正すればb列のデータが更新されグラフが変わるかを確認しましょう。&lt;/p&gt;&lt;p&gt;npoiを利用するためにnugetからライブラリをダウンロード及び連携しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1113&quot; data-filename=&quot;002.png&quot; style=&quot;width: 363px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1116&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1115&quot; data-filename=&quot;005.png&quot; style=&quot;width: 213px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからエクセル生成したディレクトリに移動してファイルを開きましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1117&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみれば既存b列のデータをc列のデータが変更されました。そのあとb列の関数データが更新され、グラフの結果まで更新されました。&lt;/p&gt;&lt;p&gt;作業しながらなぜかc列とd列のデータを変更することだけでb列のデータが自動に更新されませんでした。トリガーみたいな呼び出しが必要らしいです。&lt;/p&gt;&lt;p&gt;私の場合はsetcellformula関数を利用してエクセル関数を再設定しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;グラフの場合はb列のデータが変わることですぐデータが反映されます。&lt;/p&gt;&lt;p&gt;私の例の場合は簡単なデータを扱うので別の最初からエクセルを作成することと読み込んで後修正することとの差異がありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、実務ではかなり複雑なデータを扱う可能性が高いです。&lt;/p&gt;&lt;p&gt;その時、最初からエクセルをc#で作成することはすごく大変だと思います。デザインまで必要な部分ならスタイル設定はフォント設定まで必要です。エクセルをもっと知る方ならvba領域も考えなければならないです。&lt;/p&gt;&lt;p&gt;それをすべてc#で作成することになると複雑です。なのでプログラムのパフォーマンス部分もすごく遅くなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので実際はある程度にエクセルを作成してc#で読み込んで後データ値だけ更新することでエクセル出力する仕様が多いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のnpoiを利用してexcelを読み込んで出力する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/214.html</guid><pubDate>Fri, 8 May 2020 10:44:48 +0900</pubDate></item><item><title>[C#] NPOIライブラリを利用してエクセルファイルを生成する方法</title><link>https://www.nowonbun.com/213.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でnpoiライブラリを利用してエクセルファイルを生成する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;npoiライブラリはapache財団で提供するエクセル、パワーポイント、ワードファイルフォーマットを運用するためのライブラリです。元はjavaのpoiライブラリから始まりましたが、c#でも使うためにnpoiの名でライブラリを提供していることです。&lt;/p&gt;&lt;p&gt;それならこれからnpoiを使ってエクセルを作成しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;npoiを使うためにnugetを利用してライブラリをダウンロードと連携します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1109&quot; data-filename=&quot;001.png&quot; style=&quot;width: 363px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1111&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1110&quot; data-filename=&quot;003.png&quot; style=&quot;width: 213px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからエクセル生成したディレクトリに移動してファイルを開きましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1112&quot; data-filename=&quot;004.png&quot; style=&quot;width: 831px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;xlsバージョンとxlsxバージョンはnamespaceが違うし扱うクラスも違います。でも、クラスは違いますが、インタフェースは iworkbook과 isheetで作業するのでクラスを割り当てする時だけ分けて、次からはインタフェースで運用するとバージョン関係せずにエクセルを扱うことができます。&lt;/p&gt;&lt;p&gt;上の例では基本的にnpoiでよく使うデータ格納、関数式、色の設定、セルのスタイル設定まで実装しておきました。npoiのapiはすごく多いので、下記のurlのドキュメントを参考してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://poi.apache.org/apidocs/&quot; target=&quot;_blank&quot;&gt;https://poi.apache.org/apidocs/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;(javaのドキュメントですが、使用方法はc#と同じです。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、実際の業務ではexcelを始めから生成して出力することは少ないです。普通はexcelのテンプレートを作成して、そのテンプレートを参照して出力する方法で使います。&lt;/p&gt;&lt;p&gt;その方法に関しては別の投稿で紹介します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でnpoiライブラリを利用してエクセルファイルを生成する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/213.html</guid><pubDate>Thu, 7 May 2020 01:49:01 +0900</pubDate></item><item><title>[C#] Geckoライブラリを利用してウェブスクレイピングする方法</title><link>https://www.nowonbun.com/212.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でgeckoライブラリを利用してウェブスクレイピングする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;htmlのレイアウトエンジンとはhtmlドキュメントとcss style、javascriptを画面に描画するレンダリングするエンジンです。&lt;/p&gt;&lt;p&gt;レンダリングエンジンの種類は代表的にmsのieとmozilla財団のgeckoがあります。ieレンダリングのmshtmlがありますが、ie 8.0バージョンまではc#で参照して使えます。ieの8.0バージョンはもう10年前のレンダリングエンジンだし、今のスタイルなら様々でエラーが発生するかもしれません。&lt;/p&gt;&lt;p&gt;geckoレンダリングは60バージョンです。ieより最新バージョンです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;geckoレイアウトのライブラリはc#のnugetでダウンロード及び連携が可能です。&lt;/p&gt;&lt;p&gt;ブラウザライブラリは一応、windowのprocメッセージのキューが必要なのでwindow forms appでプロジェクトを生成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1096&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてnugetを通ってgeckoライブラリを連携します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1095&quot; data-filename=&quot;002.png&quot; style=&quot;width: 375px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1104&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のイメージをみれば以前45バージョンもあります。45バージョンで作成するなら60バージョンと同じです。ここでは60で作成します。&lt;/p&gt;&lt;p&gt;一応、私のosは64ビットなので64ビットで作成します。 32ビットも作成方法も同じです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;windowデザインフォームの隣のtoolbarをみればgecko-browserコントロールができたことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1097&quot; data-filename=&quot;004.png&quot; style=&quot;width: 566px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このwindowsフォームにdrap＆dropした後でプロパティのdockをfillに合わせています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1107&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからfirefox.dllファイルを注入する必要があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;右program.csファイルを開いて,下記のソースを追加します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1106&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして右のform1.csファイルを右クリックしをして、ソースビューでソースを開きます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1099&quot; data-filename=&quot;007.png&quot; style=&quot;width: 370px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上みたいにスクレイピングソースを作成しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1105&quot; data-filename=&quot;008.png&quot; style=&quot;width: 802px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果みたいにスクレイピングになったことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;--　もしエラーが発生する場合 -- &lt;/p&gt;&lt;p&gt;1. 64ビットに設定しても64ビットでできない場合があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1101&quot; data-filename=&quot;009.png&quot; style=&quot;width: 839px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;デバッグ設定をx64に変更すれば解決できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;デバッグのpropertyメニューを開きます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1098&quot; data-filename=&quot;010.png&quot; style=&quot;width: 380px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メニューのbuildタブでプラットフォームをx64に変更すると解決できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1102&quot; data-filename=&quot;011.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;2. dllファイルを読み込めませんというエラーメッセージが発生する可能性があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1100&quot; data-filename=&quot;012.png&quot; style=&quot;width: 814px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この場合はdebugフォルダーが間違って設定されている場合に発生します。&lt;/p&gt;&lt;p&gt;デフォルトならdebugフォルダーのfirefox64のサブフォルダにモジュールがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1103&quot; data-filename=&quot;013.png&quot; style=&quot;width: 403px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;binのdebugフォルダーに移動すればfirefox64フォルダがあることが確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1108&quot; data-filename=&quot;014.png&quot; style=&quot;width: 599px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここのフォルダとfirefox64のフォルダ名を一致すると問題なく実行されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;個人的に最近afxwebbrowserとwebbrowserよりgeckobrowserオブジェクトが安定的に使えます。c#の基本webbrowserオブジェクトはmsieの8バージョンなので最近のウェブページではscriptエラーが発生する可能性が高いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;--参考--&lt;/p&gt;&lt;p&gt;ウェブスクレイピング開発のトレンドはgeckobrowserとhttpwebrequestを混ぜって使います。&lt;/p&gt;&lt;p&gt;でもgeckobrowserとhttpwebrequestは別のクラスでセッションやクッキー情報の同期化が必要です。&lt;/p&gt;&lt;p&gt;テストするサイトがないから参考事項で作成しておきました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でgeckoライブラリを利用してウェブスクレイピングする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/212.html</guid><pubDate>Tue, 5 May 2020 00:55:27 +0900</pubDate></item><item><title>[C#] PDFを作成する方法(iTextSharp)</title><link>https://www.nowonbun.com/211.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はcでpdfを作成する方法(itextsharp)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを運用すれば結果レポートや帳票などを出力する場合が多いです。その時にcsvファイルやexcelファイル、xmlファイルタイプで出力する場合があります。&lt;/p&gt;&lt;p&gt;その中で契約書やデータ形式ではなくドキュメント形式、でも編集ができないタイプで出力したい場合はpdfを利用します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#でpdfを出力するために提供するオープンライブラリはitextsharpがあります。itextsharpを使うためにnugetを利用してダウンロードして連携します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1091&quot; data-filename=&quot;001.png&quot; style=&quot;width: 478px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1094&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1093&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;itextsharpライブラリを連携したらソースを作成してpdfを出力しましょう。&lt;/p&gt;&lt;p&gt;上のhtmlからファイルを生成することまで下記の流れになります。&lt;/p&gt;&lt;p&gt;「filestream -&amp;gt; pdfwriter取得　-&amp;gt; pdfwriterpipeline生成 -&amp;gt; htmlpipeline生成 -&amp;gt; cssresolverpipeline生成 -&amp;gt; xmlworker生成 -&amp;gt; xmlparser生成 -&amp;gt; xmlparserによってhtmlをpdfに変換する。」ということになります。&lt;/p&gt;&lt;p&gt;上のcssファイルを実行するデバッグフォルダに置きます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1092&quot; data-filename=&quot;004.png&quot; style=&quot;width: 274px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行すると「simple.pdf」というpdfファイルが生成されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1090&quot; data-filename=&quot;005.png&quot; style=&quot;width: 839px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果は上のとおりに出ました。&lt;/p&gt;&lt;p&gt;私は簡単にソースを作成しましたが、少しhtml作成する部分とcssを紐づく部分を整理すると一般プロジェクトにも十分に使えると思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでcでpdfを作成する方法(itextsharp)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/211.html</guid><pubDate>Sun, 3 May 2020 10:22:40 +0900</pubDate></item><item><title>[C#] シリアライズ(Serialization)をする方法</title><link>https://www.nowonbun.com/210.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でシリアライズ(serialization)をする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;シリアライズとはメモリに割り当てしているクラスのデータをバイナリ化することです。つまり、クラス内部で変数のデータをすべてbyteタイプに変換することだと思えば良いです。&lt;/p&gt;&lt;p&gt;シリアライズは昔にたくさん使った記憶がありますが、最近はシリアライズよりjsonタイプに変換してデータ化することがトレンドなので、最近はよく使わないみたいです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/207.html&quot; target=&quot;_blank&quot;&gt;[c#] newtonsoft.jsonライブラリを利用してjsonデータ構造を扱う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、newtonsoft.jsonを利用してデータをjsonタイプに変換することはクラスのpublicタイプだけ変換するし、データをすべてstringタイプに変換するので、限界があります。&lt;/p&gt;&lt;p&gt;シリアライズはpublicデータだけではなく、privateも構造化するし、クラス自体をすべてbyteタイプに変換することなので、クラス自体を格納することではよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、シリアライズも短所があります。バイナリ化するので、当該なデータを人が読みにくいです。なのでメモ帳でデータ変更ができないです。&lt;/p&gt;&lt;p&gt;また、クラス自体を変換しましたから、クラスが変更がある場合に復元ができない可能性もあります。&lt;/p&gt;&lt;p&gt;jsonも場合はプログラム言語に関係しずに、読み込む移植性がよいですが、シリアライズはc#で作成したらc#しか読み込まれないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;正確にはクラス変更や他のプレートフォームでも読み込まられないことではないですが、データ漏れが発生したり、データが可笑しくなる可能性があります。&lt;/p&gt;&lt;p&gt;つまり、バグ発生する可能性があることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;仕様によってシリアライズがよいかjsonを使うかを正しく選択して使う方がよいです。&lt;/p&gt;&lt;p&gt;nodeというクラスをシリアライズしてbyte[]タイプに変換しました。変換してファイルに格納します。&lt;/p&gt;&lt;p&gt;また、格納したファイルを読み込んでデシリアライズでbyte[]データをクラスタイプに変換します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1088&quot; data-filename=&quot;001.png&quot; style=&quot;width: 300px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイルをメモ帳で開きました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1089&quot; data-filename=&quot;002.png&quot; style=&quot;width: 493px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;人が解析することでは無理があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でシリアライズ(serialization)をする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/210.html</guid><pubDate>Thu, 30 Apr 2020 19:32:04 +0900</pubDate></item><item><title>[C#] dynamicタイプの動的パラメータ-DynamicObject(WinFormでASP.MVCのViewBagオブジェクトを使用する方法)</title><link>https://www.nowonbun.com/209.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でdynamicタイプの動的パラメータ-dynamicobject(winformでasp.mvcのviewbagオブジェクトを使用する方法)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;asp.mvcのcontrollerでview(.cshtml)にデータを渡す時、viewbagというオブジェクトを使う場合があります。&lt;/p&gt;&lt;p&gt;viewbagというオブジェクトはすごく便利です。可読性やパフォーマンスはよくないですが、クラスを一々宣言する必要なしでそのままに動的なプロパティを生成してデータを格納、取得するの可能です。&lt;/p&gt;&lt;p&gt;でも、viewbagとはasp.mvcだけで使うものなので、それを同じ仕様で実装してc#のwindowフォーム開発する時にも使ってみましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1084&quot; data-filename=&quot;001.png&quot; style=&quot;width: 601px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コントロールでviewbagオブジェクトに任意のプロパティにデータを格納しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1083&quot; data-filename=&quot;002.png&quot; style=&quot;width: 614px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;viewファイルはviewbagの任意のプロパティからデータを取得しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1087&quot; data-filename=&quot;003.png&quot; style=&quot;width: 521px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - 参照リンクを作成中&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンソールのプロジェクトを生成してviewbagを使ってみましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1086&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;viewbagオブジェクトがありませんというメッセージが表示されいます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1085&quot; data-filename=&quot;005.png&quot; style=&quot;width: 634px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私がc#でwindowを作成する時、値を渡すために一つ一つエンティティクラスを生成して開発したことがあります。&lt;/p&gt;&lt;p&gt;そのため、一回性の値のクラスがだんだん多くなったし、プロジェクトがすごく大きくなったし、その結果、プロジェクトの管理性、可読性、パフォーマンスなどがすべて悪くなった経験があります。&lt;/p&gt;&lt;p&gt;それで、window form開発する時にもasp.mvcのviewbagを使ったらすごく便利かと思いました。探してみたらありました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework-4.8&quot; target=&quot;_blank&quot;&gt;https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework-4.8&lt;/a&gt;&lt;/p&gt;&lt;p&gt;前からこのことを知ってたらよかったのにという物足りなさがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でdynamicタイプの動的パラメータ-dynamicobject(winformでasp.mvcのviewbagオブジェクトを使用する方法)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/209.html</guid><pubDate>Wed, 29 Apr 2020 22:41:32 +0900</pubDate></item><item><title>[C#] Stringの補間式(interpolation)</title><link>https://www.nowonbun.com/208.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でstringの補間式(interpolation)に関する説明です。&lt;/p&gt;&lt;p&gt;最近、c#のコード標準でstringの補間式に関して説明がありました。&lt;/p&gt;&lt;p&gt;既存、c#でstringのフォーマットを使うとstring.format関数を利用しましたが、それが数字で「{0},{1}」で表現するので、可読性が悪いです。&lt;/p&gt;&lt;p&gt;なので、もっと可読性を上がるため、に補間式(interpolation)があり、もっとフォーマットをしやすく表現できます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated&quot; target=&quot;_blank&quot;&gt;https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stringでstringの補間式を使うために、ダブルクォートの前に「$」を付けて設定することで使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1079&quot; data-filename=&quot;001.png&quot; style=&quot;width: 492px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;stringのの補間式(interpolation)は下記とおりになります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th&gt;要素&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;interpolationexpression&lt;/td&gt;		&lt;td&gt;形式化する結果を生成する表現式です。nullの結果のライン表現はstring.emptyです。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;alignment&lt;/td&gt;		&lt;td&gt;補間表現式の結果の文字列で最小文字数を定義する定数式です。正の場合は、文字列表現が右揃えされます。負の場合は左揃えです。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;formatstring&lt;/td&gt;		&lt;td&gt;式の結果タイプによってサポートされる形式の文字列です。&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1082&quot; data-filename=&quot;002.png&quot; style=&quot;width: 286px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;補間表現式は三項演算子でも計算可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1081&quot; data-filename=&quot;003.png&quot; style=&quot;width: 201px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;中括弧の表現は中括弧を重ねることで表現できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1080&quot; data-filename=&quot;004.png&quot; style=&quot;width: 244px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でstringの補間式(interpolation)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/208.html</guid><pubDate>Mon, 27 Apr 2020 20:39:57 +0900</pubDate></item><item><title>[C#] Newtonsoft.JSONライブラリを利用してJsonデータ構造を扱う方法</title><link>https://www.nowonbun.com/207.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でnewtonsoft.jsonライブラリを利用してjsonデータ構造を扱う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、jsonに関して説明しますとjsonとは(キー,値)構造で人が認識できる開放型標準データフォーマットです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私が10年前に開発する時にはxmlの構造でデータを扱うことが多くありましたが、最近はほとんどjsonタイプのデータを扱うプログラムが多いです。&lt;/p&gt;&lt;p&gt;でもxmlを使わないことではないけれども、xmlより直観的な構造だし、データ修正がxmlよりしやすいからだと思います。(xmlはタグの開き、閉めが間違っても全体エラーが発生します。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、プログラムライブラリでjsonを読み取るか書き込むのライブラリが多いですが、newtonsoft.jsonがたくさん使うし、一番機能が多いので紹介します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、nugetでnewtonsoft.jsonライブラリを連携しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1074&quot; data-filename=&quot;001.png&quot; style=&quot;width: 437px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1077&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1075&quot; data-filename=&quot;003.png&quot; style=&quot;width: 383px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみれば、stringタイプのjsonデータがクラスに変換されたし、クラスのデータがstringタイプのjsonデータに変換することを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;注意点はjsonタイプでシングルクォートはstringでないことは定数に表記されます。&lt;/p&gt;&lt;p&gt;なのでjsonとクラスのデータタイプが合わない場合にはエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1078&quot; data-filename=&quot;004.png&quot; style=&quot;width: 760px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;後、上のことはプロパティ名とjsonのキーを一致しましたが、仕様によって一致できない場合もあります。&lt;/p&gt;&lt;p&gt;その場合はjsonpropertyアトリビュートを利用して設定が可能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1076&quot; data-filename=&quot;005.png&quot; style=&quot;width: 308px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;newtonsoft.jsonのライブラリは様々な機能がありますが、私の基準では上の以外には使わないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でnewtonsoft.jsonライブラリを利用してjsonデータ構造を扱う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/207.html</guid><pubDate>Thu, 23 Apr 2020 20:19:53 +0900</pubDate></item><item><title>[C#] EMailを送信する方法(System.Net.Mail)</title><link>https://www.nowonbun.com/206.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でemailを送信する方法(system.net.mail)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロジェクトでよく使う機能と思えばemailを送ることではないかと思います。例えば、ウェブページでユーザ登録からパスワード初期化、お知らせのメールなど様々で使います。&lt;/p&gt;&lt;p&gt;c#ではメールを送信する方法がいろいろありますが、その中で.net frameworkのsystem.net.mailを使う方法があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;system.net.mailの場合は.net frameworkの基本の機能なので別にnugetを利用してライブラリを連携する必要がないです。&lt;/p&gt;&lt;p&gt;ソースは作成しました。&lt;/p&gt;&lt;p&gt;その後、smtpサーバーを設定しましょう。私の場合はgoogleメールを利用します。&lt;/p&gt;&lt;p&gt;google mail - &lt;a href=&quot;https://support.google.com/a/answer/176600?hl=ja&quot; target=&quot;_blank&quot;&gt;https://support.google.com/a/answer/176600?hl=ja&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先にクロームに接続して右上のアカウント管理に行きましょう。(ログインができなかった状況なら先にログインしてから。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1069&quot; data-filename=&quot;001.png&quot; style=&quot;width: 346px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アカウント管理に移動して安全性の低いアプリのアクセスのタブに移動します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1071&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;安全性の低いアプリの許可を有効にします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このチェックをしないと外部からグーグルメールを使用できないようにすることです。なので、idやpwの漏れがなければそんなに問題はありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1073&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のソースを実行してメールを送信しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1070&quot; data-filename=&quot;004.png&quot; style=&quot;width: 317px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムが正常に実行されました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1072&quot; data-filename=&quot;005.png&quot; style=&quot;width: 540px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;gmailのメールの受信トレイを見れば、メールが届いたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でemailを送信する方法(system.net.mail)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/206.html</guid><pubDate>Wed, 22 Apr 2020 19:00:42 +0900</pubDate></item><item><title>[C#] ini環境ファイルを使う方法</title><link>https://www.nowonbun.com/205.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でini環境ファイルを使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#で一般的な環境ファイルはapp.configファイルのxmlファイルです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/204.html&quot; target=&quot;_blank&quot;&gt;[c#] 環境設定ファイルを扱う方法(system.configuration)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;iniファイルはc++でよく使う環境ファイルの構造です。&lt;/p&gt;&lt;p&gt;セッションがあり、キーでデータを取得する構造です。でもc#もc++ライブラリを使うことができるのでiniファイルを読み取りや書き込みができます。&lt;/p&gt;&lt;p&gt;writeprivateprofilestringとgetprivateprofilestringはc#のライブラリではなく、c++のライブラリの「kernel32」の関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1066&quot; data-filename=&quot;001.png&quot; style=&quot;width: 280px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行関数でiniファイルを書き込んで読み取るので同然「日本語」という結果が出ます。&lt;/p&gt;&lt;p&gt;config.iniファイルを確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1067&quot; data-filename=&quot;002.png&quot; style=&quot;width: 229px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1068&quot; data-filename=&quot;003.png&quot; style=&quot;width: 196px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;config.iniファイル中で[sectiontest]のdataのキーで「日本語」という値があります。&lt;/p&gt;&lt;p&gt;iniファイルはプログラムだけで操作することではなく、直接にセッションやキー、値を設定すると上のgetprivateprofilestringの関数で読み込むのが可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でini環境ファイルを使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/205.html</guid><pubDate>Wed, 22 Apr 2020 00:09:39 +0900</pubDate></item><item><title>[C#] 環境設定ファイルを扱う方法(System.Configuration)</title><link>https://www.nowonbun.com/204.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#で環境設定ファイルを扱う方法(system.configuration)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを作成する時にプログラムによって環境ファイルを設定する場合があります。例えば、ログファイルの格納パスやサーバによって設定するデータなどです。&lt;/p&gt;&lt;p&gt;以前、c++ファイルの場合はiniファイルを設定ファイルによく使いました。もちろん、c#でiniファイルを使えないことではないですが、基本xmlファイルで環境設定を行います。&lt;/p&gt;&lt;p&gt;javaの場合「.property」ファイルが環境ファイルでよく使います。(xml形式も多いです。)&lt;/p&gt;&lt;p&gt;c#ではxmlになっているapp.configファイルを環境ファイルでよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロジェクトを生成すればc#は基本的にapp.configファイルが生成されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1060&quot; data-filename=&quot;001.png&quot; style=&quot;width: 385px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その後、app.configファイルにデータを設定してプログラム上で読み込みます。&lt;/p&gt;&lt;p&gt;appsettingsのタグの中でaddタグを追加します。ここでkeyというアトリビュートはプログラムで読み込むキーでvalueは値です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;configファイルを読み込むためにライブラリを追加しなければならないです。&lt;/p&gt;&lt;p&gt;(app.configは基本的に生成されるのにライブラリは追加することで。。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1061&quot; data-filename=&quot;002.png&quot; style=&quot;width: 343px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1063&quot; data-filename=&quot;003.png&quot; style=&quot;width: 789px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;configurationmanager.appsettingsクラスにindexer形式でキーの値を入れればapp.configに設定した値を取得できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムをリリースしたらapp.configファイル名は「プロジェクト名.exe.config」で変更されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1065&quot; data-filename=&quot;004.png&quot; style=&quot;width: 268px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1062&quot; data-filename=&quot;005.png&quot; style=&quot;width: 581px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1064&quot; data-filename=&quot;006.png&quot; style=&quot;width: 268px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#で環境設定ファイルを扱う方法(system.configuration)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/204.html</guid><pubDate>Mon, 20 Apr 2020 19:37:57 +0900</pubDate></item><item><title>[C#] Reflectionを利用してクラス複製する方法</title><link>https://www.nowonbun.com/203.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でreflectionを利用してクラス複製する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;oopでクラス複製することはプロトタイプパターン(デザインパターン)によってクラスを複製する方法があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1056&quot; data-filename=&quot;001.png&quot; style=&quot;width: 300px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみればnodeとnode1は同じクラスです。その意味はnodeでdataの値を修正したらnode1にも影響があると意味です。&lt;/p&gt;&lt;p&gt;でもnode2の場合は複製になったのでnodeと違うクラスです。その意味はnodeのdataの値が修正してもnode2は影響がないと意味です。&lt;/p&gt;&lt;p&gt;上の結果見ればnode.dataが2になっていることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラス複製をするようにはmemberwiseclone関数を利用すべきですが、memberwiseclone関数はobjectクラスのprotectedタイプです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1058&quot; data-filename=&quot;002.png&quot; style=&quot;width: 688px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その意味は私が作成するクラスつまり、memberwiseclone関数を使うことができる状況なら複製ができますが、ライブラリのクラスや修正ができないクラスの場合はクラス複製ができないと意味になります。&lt;/p&gt;&lt;p&gt;その場合は新しくnewキーワードを使ってメモリ割り当てして変数の値を一々にコピーことしかないです。&lt;/p&gt;&lt;p&gt;でもこれも問題があるのはpublicの値は出来ますが、privateやprotectedはコピーが不可能なので、クラス複製ができないと意味になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1057&quot; data-filename=&quot;003.png&quot; style=&quot;width: 327px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の状況ならdata2を設定する方法がないです。完全にコピーができないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それをreflectionを利用して解決ができます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/34.html&quot; target=&quot;_blank&quot;&gt;https://www.nowonbun.com/34.html&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1059&quot; data-filename=&quot;004.png&quot; style=&quot;width: 336px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラスでmemberwisecloneを利用しなくてクラス複製になりました。&lt;/p&gt;&lt;p&gt;nodeクラスの修正がなしで外部でクラスコピーができるといみです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でreflectionを利用してクラス複製する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/203.html</guid><pubDate>Fri, 17 Apr 2020 00:34:33 +0900</pubDate></item><item><title>[C#] XMLをXPathを利用してデータを取得する方法</title><link>https://www.nowonbun.com/202.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でxmlをxpathを利用してデータを取得する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前、xmlをcssselectorエンジン(sizzle)みたいに要素を検索してデータを取得する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/201.html&quot; target=&quot;_blank&quot;&gt;[c#] nsoupライブラリを利用してxmlとhtmlをパーシングする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近はxpathを利用して検索することよりnsoupのライブラリを利用してデータを取得することが一般的なことになりました。でも、sizzleエンジンの要素を検索する方法の以前はxpathで検索することが一般的だったんです。&lt;/p&gt;&lt;p&gt;でも、xpathの方法が悪いことではなく、css selectorで検索するキーが単純だし、理解しやすいのでよく使うことです。でも以前の方法がもっとよい時があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例えば、xmlから一つのデータとノードを検索することではnsoupのほうがいいです。でも、xmlの全体を構造化するしクラスを変換することではreaderを利用するかもっと明確なルールを決めて検索することならxpathがよいです。&lt;/p&gt;&lt;p&gt;stringで正規表現でreplaceするか、ただ特定文字でreplaceするかの差と似てます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はxpathを使うためにはxpathを詳しく知らなければならないですが、いつかxpathは別途で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;xpathを使うために以前で使った私のブログの検索エンジンに登録するようなrssファイルを使いましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1052&quot; data-filename=&quot;001.png&quot; style=&quot;width: 477px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/rss&quot; target=&quot;_blank&quot;&gt;https://www.nowonbun.com/rss&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;xpathを利用するクラスのnsoupみたいにオープンソースではなく、system.xmlの.net frameworkを使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1054&quot; data-filename=&quot;002.png&quot; style=&quot;width: 559px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンソールの結果をみればrssのtitleのタグの内容だけ出力したことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;後、descriptionのタグのテキストデータを変更して、ファイルに格納しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1055&quot; data-filename=&quot;003.png&quot; style=&quot;width: 593px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果を確認すればdescriptionタグの内容が変更されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;nsoupとsystem.xmlの差はnsoupの場合はhtmlまで検索ができます。でも、system.xmlの場合はhtmlファイルが検索ができません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1053&quot; data-filename=&quot;004.png&quot; style=&quot;width: 785px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;htmlを読み込めば許せないアトリビュートや開き閉めタグタイプではないこと(inputタグ)などでエラーが発生します。&lt;/p&gt;&lt;p&gt;個人的にはほぼnsoupを使いますが、逆に環境ファイルのxmlの場合は厳しい構造を要求するので逆にsystem.xmlをよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でxmlをxpathを利用してデータを取得する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/202.html</guid><pubDate>Thu, 16 Apr 2020 00:47:17 +0900</pubDate></item><item><title>[C#] NSoupライブラリを利用してXMLとHTMLをパーシングする方法</title><link>https://www.nowonbun.com/201.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でnsoupライブラリを利用してxmlとhtmlをパーシングする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近、プログラムを作成する時に環境設定ファイルとしてxmlを利用することがあります。以前はxpathを利用してxmlを探索して値を取得しましたが、jqueryのライブラリが登場してcssselectorエンジン(sizzle)の概念が生じ、classやidなどのアトリビュートで検索する方法ができました。&lt;/p&gt;&lt;p&gt;nsoupライブラリはxmlやhtml形式にあるファイルやデータをcssselectorで探索するライブラリです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;個人的にxpathはxmlを探索する時にもっと明確に検索ができますが、javascriptや様々でcssselectorをよく使う今はcssselectorタイプで探索するほうがもっとしやすくなったと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;visual studioでnsoupライブラリを使うためにnugetを利用してライブラリをダウンロード及び連結しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1047&quot; data-filename=&quot;001.png&quot; style=&quot;width: 452px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1048&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私のブログで検索エンジンに登録するようなrssファイルがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1050&quot; data-filename=&quot;003.png&quot; style=&quot;width: 477px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それをnsoupライブラリを利用してタイトルだけ取得します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1051&quot; data-filename=&quot;004.png&quot; style=&quot;width: 502px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のxmlファイルを取得してitemのtitleタグのデータをコンソールに出力しました。　jquryでelement探索することと同じ方法で探索が可能です。&lt;/p&gt;&lt;p&gt;nsoupの場合は探索だけではなく、書き直し機能もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のdescriptionのテキストを「hello world」に書き直しました。そのあと、コンソールにxmlを出力しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1049&quot; data-filename=&quot;005.png&quot; style=&quot;width: 449px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;descriptionの部分が「hello world」になっています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でnsoupライブラリを利用してxmlとhtmlをパーシングする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/201.html</guid><pubDate>Tue, 14 Apr 2020 19:34:15 +0900</pubDate></item><item><title>[C#] 日付フォーマット</title><link>https://www.nowonbun.com/200.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#で日付フォーマットに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前、数字フォーマットに関して、桁数とお金表示などを説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/196.html&quot; target=&quot;_blank&quot;&gt;[c#] 数字フォーマット(お金表示及び小数点以下表示)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;日付フォーマットはdatetimeのデータタイプをでtostringやstring.formatを利用して変換ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1046&quot; data-filename=&quot;001.png&quot; style=&quot;width: 321px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;日付フォーマットは置換文字が多いです。基本的に「yyyy」は年度、「mm」は月、「dd」は日、「hh」は時間、「mm」は分です。&lt;/p&gt;&lt;p&gt;ここで「mm」は「mm」は小文字、大文字で月、分の区分にします。気を付けなければならないです。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space:nowrap;&quot;&gt;フォーマット指定子&lt;/th&gt;        &lt;th style=&quot;white-space:nowrap;&quot;&gt;説明&lt;/th&gt;        &lt;th style=&quot;white-space:nowrap;&quot;&gt;例&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;d&lt;/td&gt;		&lt;td&gt;日: 1日から31日まで&lt;/td&gt;		&lt;td&gt;2009-06-01t13:45:30 -&amp;gt; 1&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;dd&lt;/td&gt;		&lt;td&gt;日: 01日から31日まで(10日の未満は十桁に「0」をつける)&lt;/td&gt;		&lt;td&gt;2009-06-01t13:45:30 -&amp;gt; 01&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;ddd&lt;/td&gt;		&lt;td&gt;曜日(略称)&lt;/td&gt;		&lt;td&gt;月、火、水。。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;dddd&lt;/td&gt;		&lt;td&gt;曜日(プル名)&lt;/td&gt;		&lt;td&gt;月曜日、火曜日、水曜日。。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;f&lt;/td&gt;		&lt;td&gt;ミリセカンド1桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.1 -&amp;gt; 1&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;ff&lt;/td&gt;		&lt;td&gt;ミリセカンド2桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.12 -&amp;gt; 12&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;fff&lt;/td&gt;		&lt;td&gt;ミリセカンド3桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.123 -&amp;gt; 123&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;ffff&lt;/td&gt;		&lt;td&gt;ミリセカンド4桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.1234 -&amp;gt; 1234&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;fffff&lt;/td&gt;		&lt;td&gt;ミリセカンド5桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.12345 -&amp;gt; 12345&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;ffffff&lt;/td&gt;		&lt;td&gt;ミリセカンド6桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.123456 -&amp;gt; 123456&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;fffffff&lt;/td&gt;		&lt;td&gt;ミリセカンド7桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.1 -&amp;gt; 10000000&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;f&lt;/td&gt;		&lt;td&gt;ミリセカンド1桁(なければ空白)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.1 -&amp;gt; 1&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;ff&lt;/td&gt;		&lt;td&gt;ミリセカンド2桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.12 -&amp;gt; 12&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;fff&lt;/td&gt;		&lt;td&gt;ミリセカンド3桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.123 -&amp;gt; 123&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;ffff&lt;/td&gt;		&lt;td&gt;ミリセカンド4桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.1234 -&amp;gt; 1234&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;fffff&lt;/td&gt;		&lt;td&gt;ミリセカンド5桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.12345 -&amp;gt; 12345&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;ffffff&lt;/td&gt;		&lt;td&gt;ミリセカンド6桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.123456 -&amp;gt; 123456&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;fffffff&lt;/td&gt;		&lt;td&gt;ミリセカンド7桁(なければ0に満たす。)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.1 -&amp;gt; 1&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;g gg&lt;/td&gt;		&lt;td&gt;西暦 前、後&lt;/td&gt;		&lt;td&gt;西暦&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;h&lt;/td&gt;		&lt;td&gt;時間:1時から12時まで(12時制)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.1 -&amp;gt; 12&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;hh&lt;/td&gt;		&lt;td&gt;時間:01時から12時まで(12時制)(10時の未満は十桁に「0」をつける)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.1 -&amp;gt; 12&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;h&lt;/td&gt;		&lt;td&gt;時間:01時から24時まで(24時制)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.1 -&amp;gt; 12&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;hh&lt;/td&gt;		&lt;td&gt;時間:01時から24時まで(24時制)(10時の未満は十桁に「0」をつける)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:00:00.1 -&amp;gt; 12&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;k&lt;/td&gt;		&lt;td&gt;utc(協定時の基準)&lt;/td&gt;		&lt;td&gt;+09:00(서울)&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;m&lt;/td&gt;		&lt;td&gt;分:0分から59分まで&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 34&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;mm&lt;/td&gt;		&lt;td&gt;分:0分から59分まで(10分の未満は十桁に「0」をつける)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 34&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;m&lt;/td&gt;		&lt;td&gt;月:1月から12月まで&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 8&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;mm&lt;/td&gt;		&lt;td&gt;月:1月から12月まで(10分の未満は十桁に「0」をつける)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 08&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;mmm&lt;/td&gt;		&lt;td&gt;月(略称):1月から12月まで(英語だけ当該)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 8&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;mmmm&lt;/td&gt;		&lt;td&gt;月(プル名):1月から12月まで(英語だけ当該)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 8月&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;s&lt;/td&gt;		&lt;td&gt;秒:0秒から59秒まで&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 56&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;ss&lt;/td&gt;		&lt;td&gt;秒:0秒から59秒まで(10秒の未満は十桁に「0」をつける)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 56&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;t&lt;/td&gt;		&lt;td&gt;am / pm&lt;/td&gt;		&lt;td&gt;午前 / 午後&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;tt&lt;/td&gt;		&lt;td&gt;am / pm&lt;/td&gt;		&lt;td&gt;午前 / 午後&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;y&lt;/td&gt;		&lt;td&gt;年度1桁表示(意味なし)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 2019&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;yy&lt;/td&gt;		&lt;td&gt;年度2桁表示(意味なし)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 2019&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;yyy&lt;/td&gt;		&lt;td&gt;年度3桁表示(意味なし)&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 2019&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;yyyy&lt;/td&gt;		&lt;td&gt;年度4桁表示&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 2019&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;yyyyy&lt;/td&gt;		&lt;td&gt;年度5桁表示&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; 02019&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;z&lt;/td&gt;		&lt;td&gt;utc基準時&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; -9&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;zz&lt;/td&gt;		&lt;td&gt;utc基準時&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; -09&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;zzz&lt;/td&gt;		&lt;td&gt;utc基準時&lt;/td&gt;		&lt;td&gt;2019-08-05 12:34:56.1 -&amp;gt; -9:00&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;:&lt;/td&gt;		&lt;td&gt;フォーマットで許している文字&lt;/td&gt;		&lt;td&gt;&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;/&lt;/td&gt;		&lt;td&gt;フォーマットで許している文字&lt;/td&gt;		&lt;td&gt;&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;-&lt;/td&gt;		&lt;td&gt;フォーマットで許している文字&lt;/td&gt;		&lt;td&gt;&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;&quot;string&quot;&lt;/td&gt;		&lt;td&gt;&apos;stirng&apos;文字列を入力する。&lt;/td&gt;		&lt;td&gt;&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings&quot; target=&quot;_blank&quot;&gt;https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1045&quot; data-filename=&quot;002.png&quot; style=&quot;width: 378px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#で日付フォーマットに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/200.html</guid><pubDate>Thu, 9 Apr 2020 20:53:20 +0900</pubDate></item><item><title>[C#] ログライブラリ(log4net)を設定する方法</title><link>https://www.nowonbun.com/199.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のログライブラリ(log4net)を設定する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを開発する時にvisual studioなどのideツールでデバッグ機能を通ってプログラムの流れを把握することができます。それで開発中でエラーが発生するか間違う結果が出る時にはデバッグ値を追跡してソースコードを修正することができます。&lt;/p&gt;&lt;p&gt;でも、開発が終わって本番(production)にビルドしたものをサーバにデプロイして運用する時にもバグが発生する可能性があります。その時には別にエラーログを作成する機能がなければエラー原因と問題を把握することが大変になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、出来る方法でログを残して(テキストファイルやデータベースにエラー内容を格納すること)プログラムの流れを記録します。問題が発生する時に、ログ内容を追跡してエラーを予測するか見つけることができます。&lt;/p&gt;&lt;p&gt;その以外にログを通ってユーザの行動パターンの分析、追跡、学習などの統計資料も必要です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;c#ではログを作成するライブラリは代表的に二つがあります。elmahとlog4netがあります。elmahも随分多いプロジェクトで使っていると思いますが、個人的にlog4netをお勧めです。&lt;/p&gt;&lt;p&gt;理由はlog4net、log4j、log4phpなどで他のプログラム言語でも使っているライブラリなので、互換性がよいし、ライブラリのコミュニティも大きいので様々な情報や派生ライブラリを得やすいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならlog4netを使うためにはnugetを利用してlog4netを連結します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1040&quot; data-filename=&quot;001.png&quot; style=&quot;width: 356px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1043&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1039&quot; data-filename=&quot;003.png&quot; style=&quot;width: 575px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1042&quot; data-filename=&quot;004.png&quot; style=&quot;width: 609px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;パターンレイアウトと領域を確認するとパターン式があることを確認できます。 パターンレイアウトに関しては詳しく説明したいですが、別に大事部分ではないし、パターンレイアウトの内容が多いので、log4netのapiで直接に確認するほうがよいです。&lt;/p&gt;&lt;p&gt;参照 - &lt;a href=&quot;https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/patternlayout.html&quot; target=&quot;_blank&quot;&gt;https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/patternlayout.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;別にレイアウトに関して問題なければ、「%d [%t] %-5p %c - %m%n」の式はよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで設定すればログを使うことができます。&lt;/p&gt;&lt;p&gt;でも、実際に本番(production)に使うと思えばログ設定がソースの中にあるので、設定ができないです。パラメータで設定ができますが、それはそれで設定が複雑になります。&lt;/p&gt;&lt;p&gt;上の例を見ればログ設定をxmlファイルで作成して読み込んでxmlconfigurator.configureに設定すれば使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1041&quot; data-filename=&quot;005.png&quot; style=&quot;width: 333px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;設定は上のソース同じ設定にしましたので、同じ結果が出ます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はconsoleappenderとrollingfileappenderだけ使いました。でもlog4netで提供するappenderはすごく多いです。(もし、他のappenderの説明が必要ならコメントを残してください。)&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://logging.apache.org/log4net/release/manual/introduction.html&quot; target=&quot;_blank&quot;&gt;https://logging.apache.org/log4net/release/manual/introduction.html&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1044&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のリストを確認すれば、データベースappender、メールappender(エラーが発生するとメール送信)、メモリappender、socketappenderなどが多いです。必要なものがあればソースまたはxmlに追加して使ったらよいです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://logging.apache.org/log4net/release/manual/configuration.html&quot; target=&quot;_blank&quot;&gt;https://logging.apache.org/log4net/release/manual/configuration.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のログライブラリ(log4net)を設定する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/199.html</guid><pubDate>Wed, 8 Apr 2020 13:04:22 +0900</pubDate></item><item><title>[C#] Zipの圧縮ファイルを解凍するコードを作成する方法</title><link>https://www.nowonbun.com/198.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でzipの圧縮ファイルを解凍するコードを作成する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前、c#でファイルをzipアルゴリズムで圧縮するソースコードに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/197.html&quot; target=&quot;_blank&quot;&gt;[c#] zip圧縮コードを作成する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その投稿にも説明しましたが、zipアルゴリズムは様々なところでよく使うアルゴリズムです。ionicライブラリと.net frameworkを利用して圧縮する方法に関して説明しましたが、解凍も同じで作成しましょう。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;ionicライブラリ&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;ionicライブラリは外部ライブラリなのでnugetを通ってionicライブラリをダウンロードと連結をしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1021&quot; data-filename=&quot;001.png&quot; style=&quot;width: 355px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1031&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1024&quot; data-filename=&quot;003.png&quot; style=&quot;width: 404px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;zipファイルの状況は下記のイメージになっています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1035&quot; data-filename=&quot;004.png&quot; style=&quot;width: 241px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;解凍しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1037&quot; data-filename=&quot;005.png&quot; style=&quot;width: 287px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1036&quot; data-filename=&quot;006.png&quot; style=&quot;width: 269px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;解凍されました。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;.net framework内部を利用する方法&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;先に「system.io.commpress」と「system.io.comppression.filesystem」を追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1032&quot; data-filename=&quot;010.png&quot; style=&quot;width: 545px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1033&quot; data-filename=&quot;011.png&quot; style=&quot;width: 788px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;zipファイルの状況は下記のイメージになっています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1035&quot; data-filename=&quot;004.png&quot; style=&quot;width: 241px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;解凍しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1037&quot; data-filename=&quot;005.png&quot; style=&quot;width: 287px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1038&quot; data-filename=&quot;007.png&quot; style=&quot;width: 270px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ionicと.net frameworkにあるライブラリで圧縮することと違ってソースの差異があります。ionicの場合は圧縮のファイルを読み込んで解凍することではなく、extractallの関数を呼び出しで一括で解凍されます。&lt;/p&gt;&lt;p&gt;標準ライブラリの場合は一つ一つの圧縮ファイルを読み込んでioで作成することです。&lt;/p&gt;&lt;p&gt;個人的に解凍の場合は標準ライブラリがよいと思います。一つ一つのエラー確認やソース応用が可能することを比べてionicの場合は解凍ソースはすごく簡単だけど、一つのコントロールが難しいなので様々ところで使いにくいと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でzipの圧縮ファイルを解凍するコードを作成する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/198.html</guid><pubDate>Tue, 7 Apr 2020 11:22:01 +0900</pubDate></item><item><title>[C#] Zip圧縮コードを作成する方法</title><link>https://www.nowonbun.com/197.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でzip圧縮コードを作成する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;zip圧縮アルゴリズムは私の考えて世界の中で一番よく使う圧縮アルゴリズムではないかと思います。アルゴリズムの優秀性もいいけれども、zip圧縮アルゴリズムに関して多いライブラリがあり、接近性と便利性がよいからよく使うと思います。&lt;/p&gt;&lt;p&gt;c#の.net framework内部でもzipアルゴリズムがあります。&lt;/p&gt;&lt;p&gt;そのため、.net frameworkのソースをを利用して圧縮する方法と、ionicライブラリを利用して圧縮する方法があります。&lt;/p&gt;&lt;p&gt;二つのライブラリでパフォーマンスの差がありません。ソースのステップの差もないので、ユーザが気になるもので使えばよいです。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;ionicライブラリ&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;ionicライブラリは外部ライブラリなのでnugetを通ってionicライブラリをダウンロードと連結をしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1021&quot; data-filename=&quot;001.png&quot; style=&quot;width: 355px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1031&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1024&quot; data-filename=&quot;003.png&quot; style=&quot;width: 404px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1023&quot; data-filename=&quot;004.png&quot; style=&quot;width: 272px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1026&quot; data-filename=&quot;005.png&quot; style=&quot;width: 274px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;d:\work\compresstestのディレクトリを圧縮しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1022&quot; data-filename=&quot;006.png&quot; style=&quot;width: 342px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1029&quot; data-filename=&quot;007.png&quot; style=&quot;width: 279px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;圧縮ファイルが作成されたことを確認できます。&lt;/p&gt;&lt;p&gt;圧縮ファイル内を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1025&quot; data-filename=&quot;008.png&quot; style=&quot;width: 251px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1028&quot; data-filename=&quot;009.png&quot; style=&quot;width: 240px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;圧縮が正常にできました。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;.net framework内部を利用する方法&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;先に「system.io.commpress」と「system.io.comppression.filesystem」を追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1032&quot; data-filename=&quot;010.png&quot; style=&quot;width: 545px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1033&quot; data-filename=&quot;011.png&quot; style=&quot;width: 788px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1023&quot; data-filename=&quot;004.png&quot; style=&quot;width: 272px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1026&quot; data-filename=&quot;005.png&quot; style=&quot;width: 274px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;d:\work\compresstestのディレクトリを圧縮しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1022&quot; data-filename=&quot;006.png&quot; style=&quot;width: 342px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1030&quot; data-filename=&quot;012.png&quot; style=&quot;width: 274px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;圧縮ファイルが作成されたことを確認できます。&lt;/p&gt;&lt;p&gt;圧縮ファイル内を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1027&quot; data-filename=&quot;013.png&quot; style=&quot;width: 242px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1034&quot; data-filename=&quot;014.png&quot; style=&quot;width: 242px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ionicライブラリと標準ライブラリを利用するソーススタイルが似てます。圧縮解凍は少し差がありますが、圧縮することは同じです。&lt;/p&gt;&lt;p&gt;そうすると標準ライブラリを使うほうがオープンライブラリを利用することより良いと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でzip圧縮コードを作成する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/197.html</guid><pubDate>Mon, 6 Apr 2020 14:57:21 +0900</pubDate></item><item><title>[C#] 数字フォーマット(お金表示及び小数点以下表示)</title><link>https://www.nowonbun.com/196.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#で数字フォーマット(お金表示及び小数点以下表示)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がプログラム上で数を扱えばintやdouble、decimalのデータタイプで数を使います。その中で計算はおそらくお金と関係があることが多くないかと思います。&lt;/p&gt;&lt;p&gt;でも、お金を計算した結果を出力する時に単純に数だけ表現すると見づらいことになります。特に億や兆単位までなれば行くと間違って読んで間違って判断する可能性もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;数を間違って読むことはお金の単位は100万円ですが、コンマなしで1000000円のことに出力されたら一目で100万円に認識するのが難しいことです。つまり1000万円のことで誤解することがあります。&lt;/p&gt;&lt;p&gt;１億の場合は100000000 です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、我々は誤解しないようにコンマを表示して数の単位を区分します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1017&quot; data-filename=&quot;001.png&quot; style=&quot;width: 444px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば変数に1億を格納して「#,##0」のフォーマットで出力フォーマット(tostring関数)を設定してお金形式で表示しました。&lt;/p&gt;&lt;p&gt;エクセルを使ったことがある方なら数字フォーマット形式を知るかもしりません。数字を表現することで「0」と「#」があります。&lt;/p&gt;&lt;p&gt;この差は「0」の場合は数字データが当該な桁数でデータがなくても「0」を表示することだし、「#」の場合は表示しないことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;すなわち、フォーマットを「0,000」に設定して「1」のデータを出力すると下記の結果が出力します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1020&quot; data-filename=&quot;002.png&quot; style=&quot;width: 451px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;数字は基本「0」と「#」で表現しますが、その以外の表現を説明します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1018&quot; data-filename=&quot;003.png&quot; style=&quot;width: 472px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;数字フォーマッティングは「tostring」がよく使いますが、状況によってstring.formatを利用する時もあります。&lt;/p&gt;&lt;p&gt;cultureinfoクラスを利用してお金を表示する方法もあります。cultureinfoはシステムによって地域別お金を表示する方法です。つまり日本なら日本の形式でアメリカならアメリカタイプに表示する機能です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1019&quot; data-filename=&quot;004.png&quot; style=&quot;width: 383px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.microsoft.com/ja-jp/dotnet/api/system.globalization.cultureinfo?redirectedfrom=msdn&amp;amp;view=netframework-4.8&quot; target=&quot;_blank&quot;&gt;https://docs.microsoft.com/ja-jp/dotnet/api/system.globalization.cultureinfo?redirectedfrom=msdn&amp;amp;view=netframework-4.8&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#で数字フォーマット(お金表示及び小数点以下表示)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/196.html</guid><pubDate>Fri, 3 Apr 2020 00:46:31 +0900</pubDate></item><item><title>[C#] コマンド(cmd)を実行する方法(Processクラス)</title><link>https://www.nowonbun.com/195.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でコマンド(cmd)を実行する方法(processクラス)に関する説明です。&lt;/p&gt;&lt;p&gt;c#を利用してプログラミングすることは普通はwindow環境で構築します。coreでlinux環境やiot環境でcoreを使いますが、まだ多くあることではありません。&lt;/p&gt;&lt;p&gt;そのため、processクラスを利用すればwindow commandを操作できるようなプログラムを開発できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1016&quot; data-filename=&quot;001.png&quot; style=&quot;width: 601px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみれば始めdドライブでコンソールが始まります。まるでcmdコマンドらしくカーソルがc:&amp;gt;の次にフォーカスになっています。そしてディレクトリ変更する時にドライブc:\ディレクトリ&amp;gt;で表示されます。最終、dirコマンドを実行してファイルリストを取得します。最後にexitのコマンドでprocessプログラムを終了します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考に上の結果はcmd.exeプログラムではなく、cmd.exeと最大に似ているuiで作りました。ほぼそっくりです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でコマンド(cmd)を実行する方法(processクラス)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/195.html</guid><pubDate>Tue, 31 Mar 2020 07:16:19 +0900</pubDate></item><item><title>[C#] FTPに接続してファイルダウンロード、アップロードする方法</title><link>https://www.nowonbun.com/194.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でftpに接続してファイルダウンロード、アップロードする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラム通信上でよく使うプロトコールはhttp、mail(メール)があるし、ftpがあります。&lt;/p&gt;&lt;p&gt;sambaもネットワーク通信ですが、プロトコールではなく、ユーティリティ名だし、プログラム内で通信設定が必要なことではなく、os側でネットワークドライブを割り当てして使うかlinux環境ならmountして内部ディスクみたいに使うので、プログラム内で別途で開発が必要なことではないです。&lt;/p&gt;&lt;p&gt;率直に全然要らないことではないですが、しやすい方法を置いて大変に開発する必要はありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近はcloudやwebサーバのrest apiを利用するか、またはhttpヘッダを利用してcontext-typeをapplication/octet-streamに指定して直接にウェブサーバにアップロード、ダウンロードする方法でファイルを管理するので、以前みたいにftpをよく使いません。&lt;/p&gt;&lt;p&gt;また、ファイルストレージではなく、アプリサーバ(ゲームサーバなど)でも以前みたいに直接にサーバを開発することより、webサーバにつけて使う方法になったので、データ格納サーバ(ftpサーバ)を別途で構築せずに開発するのが最近のトレンドです。(必ずwebサーバではなく仕様によって違います。)&lt;/p&gt;&lt;p&gt;でも、逆にftpプロトコールはhttpプロトコールと似ていることが多し、以前より良いライブラリも多いので、よく使うことになると様々なサービスのパフォーマンス改善によくなると思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にftpサーバを構築する方法に関して説明したことがあるから参考してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/187.html&quot; target=&quot;_blank&quot;&gt;[window] windowでftpサーバを構築する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/105.html&quot; target=&quot;_blank&quot;&gt;[centos] ftpインストールする方法(vsftpd)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;上のソースをみればftpからリストを取得する時にディレクトリやファイルの区分がありません。もちろん、検索メソッドをlistdirectoryではなく、listdirectorydetailでするとファイルとディレクトリの区分ができますが、結果パーシングしなければならないし、様々なことに大変になるのでtry~catchを利用してファイルとディレクトリを区分する方が簡単です。&lt;/p&gt;&lt;p&gt;実はtry~catchで分岐することはパフォーマンスで致命的に悪いのでできればif~elseで作成することができればよいです。&lt;/p&gt;&lt;p&gt;私の場合はソースコードを減らすようにtry~catchを利用しましたが、仕様に合わせて作成してください。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はftpサーバを「d:\ftptest\ftp」に設定してアップロードファイルを「d:\ftptest\upload」フォルダからアップロードテストをします。そして、ダウンロードフォルダは「d:\ftptest\download」に設定してダウンロードテストをします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1009&quot; data-filename=&quot;001.png&quot; style=&quot;width: 274px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;こんなにあるファイルは「d:\ftptest\ftp」フォルダにアップロードします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1010&quot; data-filename=&quot;002.png&quot; style=&quot;width: 279px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてそれをまたダウンロードして「d:\ftptest\download」にダウンロードします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1011&quot; data-filename=&quot;003.png&quot; style=&quot;width: 273px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これから実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1012&quot; data-filename=&quot;004.png&quot; style=&quot;width: 209px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;別にコンソール出力を残さなかったので何も出力されないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1013&quot; data-filename=&quot;005.png&quot; style=&quot;width: 263px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ftpサーバにはよくアップロードがされました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1014&quot; data-filename=&quot;006.png&quot; style=&quot;width: 271px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、ftpからダウンロードすることもよくできました。&lt;/p&gt;&lt;p&gt;私の場合は特別に例を作成することがないので、ファイルを読み込んでftpにアップロードしました。それをまたダウンロードしてファイルに作成しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、通信でストリームを利用してバイナリを扱うことなので必ずファイルダウンロードやアップロードだけ使うことではありません。&lt;/p&gt;&lt;p&gt;もちろん、データベースほど頻繁に接続して検索するし格納すればftpの効率性はすごく落ちますが、dbに格納しようと思うデータに考えたらデータサイズは大きいし、でも頻繁に参照しますが、修正はよくないデータならftpがちょうどいいではないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここからrequest.methodに関して説明します。&lt;/p&gt;&lt;p&gt;request.methodはstringタイプに設定しますが、ftpプロトコールが合わせてメソッドを設定しなければならないです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://ja.wikipedia.org/wiki/ftp%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%ae%e4%b8%80%e8%a6%a7&quot; target=&quot;_blank&quot;&gt;https://ja.wikipedia.org/wiki/ftpコマンドの一覧&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例で使ったコマンドはnlstでリストを取得してstorでアップロードしました。そしてmkdでftpにディレクトリを作成しました。後、retrでファイルをダウンロードしました。&lt;/p&gt;&lt;p&gt;それをc#ではよく使うコマンド別でstring変数にあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1015&quot; data-filename=&quot;007.png&quot; style=&quot;width: 596px;&quot;&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/framework/network-programming/how-to-upload-files-with-ftp&quot; target=&quot;_blank&quot;&gt;https://docs.microsoft.com/en-us/dotnet/framework/network-programming/how-to-upload-files-with-ftp&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://stackoverflow.com/questions/2781654/ftpwebrequest-download-file&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/2781654/ftpwebrequest-download-file&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でftpに接続してファイルダウンロード、アップロードする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/194.html</guid><pubDate>Fri, 27 Mar 2020 19:21:49 +0900</pubDate></item><item><title>[C#] HttpWebRequestを利用してウェブページを読み込みする方法</title><link>https://www.nowonbun.com/193.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#のhttpwebrequestを利用してウェブページを読み込みする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がプログラミングをする時にウェブのオブジェクトを読み込みが必要な時があります。例えば、ブログのrssあるいはsitemapのxmlを読み込みするかまたはウェブページの情報を取得する必要な時です。&lt;/p&gt;&lt;p&gt;でもhttpwebrequestはウェブページだけ読み込むことでスクレイピングとは意味が違います。スクレイピングはウェブのレンダリング、つまり、javascriptの動的に処理されたデータを読み込むデータを取得することです。&lt;/p&gt;&lt;p&gt;httpwebrequestはウェブレンダリングがされてない純粋なページの要素データを読み込むことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;httpプロトコールは単純なソケット方法で要請(request)と応答(response)が終わればソケット接続を終わらせる流れです。&lt;/p&gt;&lt;p&gt;プロトコールの中でヘッダを定義して要請すればそのヘッダ値に合わせて応答することがhttpプロトコールです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;httpプロトコールはソケットでたくさん使うオブジェクトです。それでc#にはhttpwebrequestのクラスがあってそれを簡単に接続してデータを取得できるようになっています。&lt;/p&gt;&lt;p&gt;上のソースをテストするようにphpファイルを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1008&quot; data-filename=&quot;001.png&quot; style=&quot;width: 372px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「200」は応答コードでgetrequest関数の中でresponse.statuscodeをコンソール出力したことです。「200」は正常です。&lt;/p&gt;&lt;p&gt;私がgetrequest関数を二回に呼び出したので、二つの結果を受け取りました。&lt;/p&gt;&lt;p&gt;始めはgetタイプで接続したので、getの変数に「test」というデータがあります。&lt;/p&gt;&lt;p&gt;二つ目はpostタイプで接続したので、postの変数に「test」というデータがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#のhttpwebrequestを利用してウェブページを読み込みする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/193.html</guid><pubDate>Fri, 27 Mar 2020 00:23:19 +0900</pubDate></item><item><title>[Java] Base64をエンコード、デコードする方法</title><link>https://www.nowonbun.com/181.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでbase64をエンコード、デコードする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;base64とは実は様々な複雑な説明がありますが、私が簡単に説明するとbyteタイプになっているbinaryデータをプログラム間にデータ交換をため、ascii文字に変換しているコードをbase64といいます。&lt;/p&gt;&lt;p&gt;つまり「byteデータやstreamデータをstringのタイプに変換すること、stringの値はcharのデータ範囲を超えない(データ値が127)ものになっている」ということです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先に簡単なファイルをioで読み込んでbase64に変換します。&lt;/p&gt;&lt;p&gt;pcに「hello world」という値がある「test.txt」を準備しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=940&quot; data-filename=&quot;001.png&quot; style=&quot;width: 273px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてそれを読み込んだらbyteタイプのbinaryになります。そのbinaryをbase64に変換します。&lt;/p&gt;&lt;p&gt;実行結果は下記とおりになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=942&quot; data-filename=&quot;002.png&quot; style=&quot;width: 652px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それが「hello world」のbase64コードです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;またbase64コードになっているデータを元のbinary(byte[])データに変換しましょう。&lt;/p&gt;&lt;p&gt;実行結果は下記とおりになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=941&quot; data-filename=&quot;003.png&quot; style=&quot;width: 636px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;base64タイプをbyteタイプに変換しました。byteデータをstringタイプに変換して出力すると「hello world」が出ます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はプログラム間に通信する時にbase64にエンコードやデコードにするとデータ長さが増えるので非効率です。&lt;/p&gt;&lt;p&gt;でも、base64を使うところはbinaryをstringに表現するところはイメージデータをstringデータで格納する時や、暗号化されたファイルをstringデータとしてデータをデータ通信する時にはよく使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでbase64をエンコード、デコードする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/181.html</guid><pubDate>Thu, 26 Mar 2020 02:21:30 +0900</pubDate></item><item><title>[C#] Base64のエンコード、デコードする方法</title><link>https://www.nowonbun.com/192.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はc#でbase64のエンコード、デコードする方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;base64とはbyteタイプになっているバイナリデータをプログラムの間にもっと扱いやすくするため、asciiコードに変換したデータをbase64といいます。&lt;/p&gt;&lt;p&gt;簡単に説明すると「byteデータやstreamデータをstringタイプに変換したことです。そのstringタイプになっているデータもエンコードタイプに関係ないasciiコードになっている」ということで理解するとよいです。&lt;/p&gt;&lt;p&gt;簡単なファイルを読み込んでbase64タイプに変換しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「hello world」というテキストを作成したファイルを準備しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1006&quot; data-filename=&quot;001.png&quot; style=&quot;width: 306px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてそれをbyteタイプに読み込んでbase64に変換しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1005&quot; data-filename=&quot;002.png&quot; style=&quot;width: 534px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみればhello worldのバイナリが暗号コードみたいに変換されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、bsse64になったコードをstringタイプに変換して出力しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1007&quot; data-filename=&quot;003.png&quot; style=&quot;width: 444px;&quot;&gt;&lt;/p&gt;&lt;p&gt;コンソールで「hello world」という結果が表示されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラム間に通信する時にbase64コードでエンコード、デコードすれば逆にデータが大きくなるので、非効率的です。ただ、byteタイプに送信すればよいからです。&lt;/p&gt;&lt;p&gt;でも、このbase64が必要な時があります。例えば、バイナリタイプをstringタイプに変換する時です。&lt;/p&gt;&lt;p&gt;暗号化する時にも必要な時があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでc#でbase64のエンコード、デコードする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/192.html</guid><pubDate>Thu, 26 Mar 2020 02:20:59 +0900</pubDate></item><item><title>[Java] 日付フォーマット(SimpleDateFormat)を使う方法</title><link>https://www.nowonbun.com/191.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaで日付フォーマットを使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前、javaで数字フォーマットに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/174.html&quot; target=&quot;_blank&quot;&gt;[java] 数字フォーマット(お金表示及び小数点以下表示)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;その時には数字フォーマットのdecimalformatを使いましたが、データフォーマットはdateformatを使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1004&quot; data-filename=&quot;001.png&quot; style=&quot;width: 295px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;date形式からstringに変換、またはstringからdate形式に変換することはsimpledateformatクラスです。&lt;/p&gt;&lt;p&gt;simpledateformatのフォーマットパターンは下記とおりになります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/text/simpledateformat.html&quot; target=&quot;_blank&quot;&gt;https://docs.oracle.com/javase/8/docs/api/java/text/simpledateformat.html&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th&gt;文字&lt;/th&gt;        &lt;th&gt;日付及び時間コンポーネント&lt;/th&gt;		&lt;th&gt;表示&lt;/th&gt;		&lt;th&gt;例&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;g&lt;/td&gt;		&lt;td&gt;era designator&lt;/td&gt;		&lt;td&gt;text&lt;/td&gt;		&lt;td&gt;ad&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;y&lt;/td&gt;		&lt;td&gt;year&lt;/td&gt;		&lt;td&gt;year&lt;/td&gt;		&lt;td&gt;1996; 96&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;y&lt;/td&gt;		&lt;td&gt;week year&lt;/td&gt;		&lt;td&gt;year&lt;/td&gt;		&lt;td&gt;2009; 09&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;m&lt;/td&gt;		&lt;td&gt;month in year (context sensitive)&lt;/td&gt;		&lt;td&gt;month&lt;/td&gt;		&lt;td&gt;july; jul; 07&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;l&lt;/td&gt;		&lt;td&gt;month in year (standalone form)&lt;/td&gt;		&lt;td&gt;month&lt;/td&gt;		&lt;td&gt;july; jul; 07&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;w&lt;/td&gt;		&lt;td&gt;week in year&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;27&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;w&lt;/td&gt;		&lt;td&gt;week in month&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;2&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;d&lt;/td&gt;		&lt;td&gt;day in year&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;189&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;d&lt;/td&gt;		&lt;td&gt;day in month&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;10&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;f&lt;/td&gt;		&lt;td&gt;day of week in month&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;2&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;e&lt;/td&gt;		&lt;td&gt;day name in week&lt;/td&gt;		&lt;td&gt;text&lt;/td&gt;		&lt;td&gt;tuesday; tue&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;u&lt;/td&gt;		&lt;td&gt;day number of week (1 = monday, ..., 7 = sunday)&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;1&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;a&lt;/td&gt;		&lt;td&gt;am/pm marker&lt;/td&gt;		&lt;td&gt;text&lt;/td&gt;		&lt;td&gt;pm&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;h&lt;/td&gt;		&lt;td&gt;hour in day (0-23)&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;0&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;k&lt;/td&gt;		&lt;td&gt;hour in day (1-24)&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;24&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;k&lt;/td&gt;		&lt;td&gt;hour in am/pm (0-11)&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;0&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;h&lt;/td&gt;		&lt;td&gt;hour in am/pm (1-12)&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;12&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;m&lt;/td&gt;		&lt;td&gt;minute in hour&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;30&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;s&lt;/td&gt;		&lt;td&gt;second in minute&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;55&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;s&lt;/td&gt;		&lt;td&gt;millisecond&lt;/td&gt;		&lt;td&gt;number&lt;/td&gt;		&lt;td&gt;978&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;z&lt;/td&gt;		&lt;td&gt;time zone&lt;/td&gt;		&lt;td&gt;general time zone&lt;/td&gt;		&lt;td&gt;pacific standard time; pst; gmt-08:00&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;z&lt;/td&gt;		&lt;td&gt;time zone&lt;/td&gt;		&lt;td&gt;rfc 822 time zone&lt;/td&gt;		&lt;td&gt;-0800&lt;/td&gt;	  &lt;/tr&gt;	  &lt;tr&gt;		&lt;td&gt;x&lt;/td&gt;		&lt;td&gt;time zone&lt;/td&gt;		&lt;td&gt;iso 8601 time zone&lt;/td&gt;		&lt;td&gt;-08; -0800; -08:00&lt;/td&gt;	  &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;上のフォーマットパターンの例です。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th&gt;日付及び時間パターン&lt;/th&gt;        &lt;th&gt;結果&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;&quot;yyyy.mm.dd g &apos;at&apos; hh:mm:ss z&quot;&lt;/td&gt;		&lt;td&gt;2001.07.04 ad at 12:08:56 pdt&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;&quot;eee, mmm d, &apos;&apos;yy&quot;&lt;/td&gt;		&lt;td&gt;wed, jul 4, &apos;01&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;&quot;h:mm a&quot;&lt;/td&gt;		&lt;td&gt;12:08 pm&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;&quot;hh &apos;o&apos;&apos;clock&apos; a, zzzz&quot;&lt;/td&gt;		&lt;td&gt;12 o&apos;clock pm, pacific daylight time&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;&quot;k:mm a, z&quot;&lt;/td&gt;		&lt;td&gt;0:08 pm, pdt&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;&quot;yyyyy.mmmmm.dd ggg hh:mm aaa&quot;&lt;/td&gt;		&lt;td&gt;02001.july.04 ad 12:08 pm&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;&quot;eee, d mmm yyyy hh:mm:ss z&quot;&lt;/td&gt;		&lt;td&gt;wed, 4 jul 2001 12:08:56 -0700&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;&quot;yymmddhhmmssz&quot;&lt;/td&gt;		&lt;td&gt;010704120856-0700&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;&quot;yyyy-mm-dd&apos;t&apos;hh:mm:ss.sssz&quot;&lt;/td&gt;		&lt;td&gt;2001-07-04t12:08:56.235-0700&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;&quot;yyyy-mm-dd&apos;t&apos;hh:mm:ss.sssxxx&quot;&lt;/td&gt;		&lt;td&gt;2001-07-04t12:08:56.235-07:00&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td&gt;&quot;yyyy-&apos;w&apos;ww-u&quot;&lt;/td&gt;		&lt;td&gt;2001-w27-3&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;javaでdateクラスを取得する方法は二つがあります。&lt;/p&gt;&lt;p&gt;「calendar.getinstance().gettime()」と「new date」です。&lt;/p&gt;&lt;p&gt;一応、お勧めの方法はcalendarクラスを通ってgettime関数で取得することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なぜなら、時間というオブジェクトはインスタンスを生成することを考えば合ってる話しになるし、間違っている話もなります。systemで流れる時間はローカルシステムから取得するデータです。&lt;/p&gt;&lt;p&gt;そのデータをnewで割り当てして取得することは間違ってる概念だと思われます。でも、流れる時間で特定時間をオブジェクト化して取得することだと思えば、間違っていない概念です。&lt;/p&gt;&lt;p&gt;なのでjavaではdateクラスを「new」で生成することは無駄なメモリリソースだし、バグ発生の可能性が高いと判断するでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;簡単に説明すると「new date」の場合は特定な日付を生成することには使うし、現在の時間を取得する時にはcalendarを通って取得して使うという意味です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://stackoverflow.com/questions/368094/system-currenttimemillis-vs-new-date-vs-calendar-getinstance-gettime&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/368094/system-currenttimemillis-vs-new-date-vs-calendar-getinstance-gettime&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://stackoverflow.com/questions/20693131/difference-between-new-date-and-calendar-date/20693309&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/20693131/difference-between-new-date-and-calendar-date/20693309&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私も率直に言って詳しい差異まで知りません。ただjavaapiから現在日付はcalendarから取得することをお勧めだというのでユーザの場合はapi通りに設計することがバグ発生可能性を低くすることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaで日付フォーマットを使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/191.html</guid><pubDate>Wed, 25 Mar 2020 00:36:53 +0900</pubDate></item><item><title>[Java] サーブレット(Servlet)の環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法</title><link>https://www.nowonbun.com/190.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのサーブレット(servlet)の環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前、springプレームワーク環境でアップロードする方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/189.html&quot; target=&quot;_blank&quot;&gt;[java] spring環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jspの領域の部分はサーブレットと同じだと思いますが、サーバーサイドの実装が違うので説明します。&lt;/p&gt;&lt;p&gt;サーブレットのプログラムを構築する方法に関しては以前に説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/74.html&quot; target=&quot;_blank&quot;&gt;[java] web serviceプログラムのservletを作成方法(eclipse)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先にサーブレットのウェブサービスを構築してindex.jspファイルを作成しましょう。&lt;/p&gt;&lt;p&gt;上のソースはspringプレームワーク側で作成したjspファイルと同じです。&lt;/p&gt;&lt;p&gt;「localhost/upload」のパスでファイルをアップロードするでしょう。&lt;/p&gt;&lt;p&gt;アップロードするためにweb.xmlを設定する必要があります。&lt;/p&gt;&lt;p&gt;これからプログラムを起動しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=999&quot; data-filename=&quot;001.png&quot; style=&quot;width: 679px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アップロードする前のindex.jspの状況です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1000&quot; data-filename=&quot;002.png&quot; style=&quot;width: 343px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アップロードしようと思うファイルは150mbのサイズのバイナリデータです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アップロードしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1001&quot; data-filename=&quot;003.png&quot; style=&quot;width: 678px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログレスバーが動くことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1003&quot; data-filename=&quot;004.png&quot; style=&quot;width: 677px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アップロードが完了しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=1002&quot; data-filename=&quot;005.png&quot; style=&quot;width: 396px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;指定された「d:\work」フォルダにファイルが格納されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのサーブレット(servlet)の環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。 &lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/190.html</guid><pubDate>Tue, 24 Mar 2020 00:48:57 +0900</pubDate></item><item><title>[Java] Spring環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法</title><link>https://www.nowonbun.com/189.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのspring環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブサービスでアップロードすることだと思えばformの要素でenctypeをmultipart/form-dataに設定してヘッダーにバウンダリーを設定し、アップロードすることをサーバ側でバウンダリーデータを受け取ったらアップロードが完了します。&lt;/p&gt;&lt;p&gt;ウェブサービスのアップロードの仕様です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でもspringフレームワークはこの単純なアップロードロジックが少し複雑になっています。そのため、よく要約をしていないとアップロードを実装するたびに、忘れるか迷う時があります。&lt;/p&gt;&lt;p&gt;以前、spring環境を構築する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/75.html&quot; target=&quot;_blank&quot;&gt;[java] eclipseでspring web frameworkを利用してウェブサービスプロジェクトを立ち上がる方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先にファイルアップロードを実装するためにはmavenレポジトリから二つのライブラリをダウンロードして連携しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=992&quot; data-filename=&quot;001.png&quot; style=&quot;width: 507px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてmvc-config.xmlでアップロードする時ファイルサイズのリミット設定をしなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=993&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのあと、ファイルアップロードするウェブページ(jsp)を生成しましょう。&lt;/p&gt;&lt;p&gt;そのあと、サーバ側のcontollerを作成しましょう。&lt;/p&gt;&lt;p&gt;ここまで作成したらuploadする準備は完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすれば起動しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=995&quot; data-filename=&quot;003.png&quot; style=&quot;width: 677px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アップロードする前のindex.htmlの状況です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=994&quot; data-filename=&quot;004.png&quot; style=&quot;width: 343px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アップロードしようと思うファイルは150mbのサイズのバイナリデータです。&lt;/p&gt;&lt;p&gt;アップロードしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=996&quot; data-filename=&quot;005.png&quot; style=&quot;width: 678px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログレスバーが動くことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=998&quot; data-filename=&quot;006.png&quot; style=&quot;width: 677px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アップロードが完了しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=997&quot; data-filename=&quot;007.png&quot; style=&quot;width: 396px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;指定された「d:\work」フォルダにファイルが格納されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのspring環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/189.html</guid><pubDate>Sun, 22 Mar 2020 23:15:12 +0900</pubDate></item><item><title>[Java] FTPに接続してファイルをダウンロード、アップロードする方法(FTPClient)</title><link>https://www.nowonbun.com/188.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでftpに接続してファイルをダウンロード、アップロードする方法(ftpclient)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前に私がwindow環境でftp serverを構築する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/105.html&quot; target=&quot;_blank&quot;&gt;[centos] ftpインストールする方法(vsftpd)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/187.html&quot; target=&quot;_blank&quot;&gt;[window] windowでftpサーバを構築する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ftpclientプロトコールは以前ほどではないけれども、様々でファイル転送プロトコールとして使うところがあるので紹介します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先、java環境でftpを使うようにはライブラリをダウンロードおよび参照しなければならないです。&lt;/p&gt;&lt;p&gt;repository - &lt;a href=&quot;https://mvnrepository.com/artifact/commons-net/commons-net/3.6&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/commons-net/commons-net/3.6&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=985&quot; data-filename=&quot;001.png&quot; style=&quot;width: 648px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ftp client環境を必ずウェブサービスで使うことだけではないのでconsoleで作成しましょう。&lt;/p&gt;&lt;p&gt;上のソースはprogramのmain関数でftp環境のファイルとディレクトリをすべて削除して「ftptest/upload」のディレクトリのファイルと派生ディレクトリ、ファイルをすべてアップロードして、「ftptest/download」にすべてダウンロードすることです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=986&quot; data-filename=&quot;002.png&quot; style=&quot;width: 274px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のファイルを「ftp://localhost(ftptest/ftp)」にアップロードするでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=989&quot; data-filename=&quot;003.png&quot; style=&quot;width: 279px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてまた上のファイルを(ftptest/download)にダウンロードするでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=988&quot; data-filename=&quot;004.png&quot; style=&quot;width: 273px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすればプログラムを実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=987&quot; data-filename=&quot;005.png&quot; style=&quot;width: 561px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「ftp://localhost(ftptest/ftp)」にアップロードされたか確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=991&quot; data-filename=&quot;006.png&quot; style=&quot;width: 263px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ftpサーバにちゃんとアップロードされました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=990&quot; data-filename=&quot;007.png&quot; style=&quot;width: 271px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ちゃんとダウンロードもされました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;簡単なソースなので一つのファイルですべての例を作成しました。&lt;/p&gt;&lt;p&gt;よく使うapiはlistfilesの関数のftpファイルリスト取得することとchangeworkingdirectory関数のディレクトリカーソル移動です。&lt;/p&gt;&lt;p&gt;カーソル移動に関して現在のカーソル位置に関して教える関数は無いです。ftpclientではなく変数を利用してカーソル移動を管理しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上でアップロードする時、storefileを使いましたが、既存のftpに同じ名のファイルが存在すれば上書きします。でもftpには既存ファイルでバイナリ追加するappendfile関数もあります。&lt;/p&gt;&lt;p&gt;appendfileの場合は同じ名のファイルが無ければファイルを追加します。同じ名のファイルがあれば、バイナリを追加して作成します。テキストなら問題ないけど、その以外はファイルが可笑しくなるでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/ftpclient.html&quot; target=&quot;_blank&quot;&gt;https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/ftpclient.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでftpに接続してファイルをダウンロード、アップロードする方法(ftpclient)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/188.html</guid><pubDate>Fri, 20 Mar 2020 02:44:36 +0900</pubDate></item><item><title>[Window] WindowでFTPサーバを構築する方法</title><link>https://www.nowonbun.com/187.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はwindowでftpサーバを構築する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近、cloud driveというクラウドストレージがあり、どんなパソコンでも簡単にファイルを共有、バックアップなどをできますが、わずか10年前には大勢の人がメールやusbなどでファイルを共有やバックアップをたくさんしました。&lt;/p&gt;&lt;p&gt;メールの短所はインタネットができるところならファイルを共有できますが、ファイルバージョン管理が難しいし、データサイズのリミットがあります。usbの場合は常に所持しなければならならない不便があるし、データサイズのリミットもあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでサーバを扱うデベロッパーやseなら家やデータセンターにnasサーバを構築してftpでファイルを共有しました。&lt;/p&gt;&lt;p&gt;でも、先に説明した通りにcloud driveがあるので最近はftpを使用する頻度がたくさん低くなったし、社内ではftpよりサンバーサーバ(samba)というネットワークドライブが楽なので最近はよく使いません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;しかし、個人的にプログラム開発上ではcloud drive apiを使うことでは少し負担があるし、社内ではサンバーサーバ(smb)よりもっとセキュリティ的だし簡単に開発できるプロトコールなのでftpが良いではないかと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;window環境ではftpサーバを構築するために別にプログラムをインストールする必要がないし、windowの基本パッケージであるのでインストールだけでよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=965&quot; data-filename=&quot;001.png&quot; style=&quot;width: 399px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コントロールで「プログラムと機能」を開きます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=966&quot; data-filename=&quot;002.png&quot; style=&quot;width: 484px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして「windowsの機能の有効化または無効化」を選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=967&quot; data-filename=&quot;003.png&quot; style=&quot;width: 281px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてftpサーバーとiis管理コンソールなどを選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=970&quot; data-filename=&quot;004.png&quot; style=&quot;width: 415px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;確認ボタンを押下すればインストールが開始します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=968&quot; data-filename=&quot;005.png&quot; style=&quot;width: 658px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして数分をお待ちしたらインストールが完了します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=981&quot; data-filename=&quot;006.png&quot; style=&quot;width: 458px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてプログラム検索に「iis」というコマンドを打ったらインタネットインフォメーションサービス(iis)マネージャーのプログラムが検索されますが、それをクリックして実行します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=975&quot; data-filename=&quot;007.png&quot; style=&quot;width: 291px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてサイト項目でマウス右をクリックすればftpサイトの追加項目があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=979&quot; data-filename=&quot;008.png&quot; style=&quot;width: 673px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サイトの名前を入力してftpサーバーでファイルアップロード及びダウンロードするパスを設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=982&quot; data-filename=&quot;009.png&quot; style=&quot;width: 673px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;もしかして別にホスト設定があればip設定でホストドメインを入力します。でも別に制限がなければ指定しなくてもよいです。&lt;/p&gt;&lt;p&gt;また、ssl設定が必要なら証明書を入れるしなければ無しで設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=974&quot; data-filename=&quot;010.png&quot; style=&quot;width: 673px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして最後に認証は匿名ユーザが接続できるようにしようと思えば匿名を選択しますが、普通はセキュリティのため設定しません。&lt;/p&gt;&lt;p&gt;基本はチェックします。承認はまだユーザを作成してないので「未選択」を設定します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからユーザを追加します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=980&quot; data-filename=&quot;011.png&quot; style=&quot;width: 317px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;windowメニューでマウス右クリックしてコンピューターの管理を開きます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=983&quot; data-filename=&quot;012.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてローカルユーザでユーザを選択して「新しいユーザー」を追加します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=971&quot; data-filename=&quot;013.png&quot; style=&quot;width: 443px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてユーザー名(id)を入力してパスワードを入力しましょう。&lt;/p&gt;&lt;p&gt;「次回ログオン時にパスワードを変更が必要」というチェックボックスはチェック解除して「パスワード変更できない」と「無期限できない」というチェックボックスをチェックします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=973&quot; data-filename=&quot;014.png&quot; style=&quot;width: 528px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;管理windowでユーザーが追加されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;またiis(インタネットインフォメーションサービスマネージャー)に戻ります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=984&quot; data-filename=&quot;015.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ftpを選択して「ftpの承認規則」を選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=976&quot; data-filename=&quot;016.png&quot; style=&quot;width: 359px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてマウス右クリックして「許可規則の追加」を選択します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=972&quot; data-filename=&quot;017.png&quot; style=&quot;width: 469px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ユーザー管理で生成したユーザー名(id)を入力して読み取り、書き込み権限を選択します。&lt;/p&gt;&lt;p&gt;ここまでftp設定が完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここからファイルエクスプローラー(explorer)で「ftp://localhost」を接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=969&quot; data-filename=&quot;018.png&quot; style=&quot;width: 348px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうしたら「id」、「pw」を入力する画面が表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=978&quot; data-filename=&quot;019.png&quot; style=&quot;width: 562px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;生成したユーザー名とパスワードを入力してログオンしましょう。&lt;/p&gt;&lt;p&gt;そうしたら接続できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例えでファイルをドラッグしてftpにコピーしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=977&quot; data-filename=&quot;020.png&quot; style=&quot;width: 384px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ftp設定したアップロード及びダウンロードパスを確認すれば、ファイルがコピーされたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでwindowでftpサーバを構築する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Window</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/187.html</guid><pubDate>Thu, 19 Mar 2020 03:27:22 +0900</pubDate></item><item><title>[Java] JSPのSpring環境でschedulerのcronを使う方法</title><link>https://www.nowonbun.com/186.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjspのspring環境でschedulerのcronを使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前に私がjsp環境でspring web frameworkを利用してウェブ環境を構築する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/75.html&quot; target=&quot;_blank&quot;&gt;[java] eclipseでspring web frameworkを利用してウェブサービスプロジェクトを立ち上がる方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cronとは簡単に考えるとスケジューラだと思えば良いです。以前、unix時代に使ったschedulerのユーティリティの名前ですが、これがlinuxにてcronスケジューラになってjava系のスケジューラの名前もcronになったらしいです。&lt;/p&gt;&lt;p&gt;スケジューラはプログラムサービスで運用することよりosで運用することがサーバ管理側でもいろいろことが楽ですが、スケジューラ特性によってウェブサービスの中で運用する時も必要なのでspringウェブサービスでも使えます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブサービスで使えるスケジューラだと思えば、基本的にサービス内で生成する必要がないlogデータ削除、掲示板サービスの投稿予約システム、仕様によってデータベース整理など様々作業を予想できます。&lt;/p&gt;&lt;p&gt;でも、os環境で使えるスケジューラとウェブサービス内で使えるスケジューラを明確に区切りする必要があります。例えば、ロードバランシング(分散システム)で分けている2台以上のウェブサービスの場合、各ウェブサービスでcronジョブスケジューラが各実行中なので重複処理が発生可能性もあります。&lt;/p&gt;&lt;p&gt;この時にはウェブサービスではなく別途のスケジューラサービスを構築するかosスケジューラ、dbスケジューラを利用してスケジューラを実行することが正しいです。(以外でこんなミスが多いです。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブサービス内で使えるスケジューラはロードバランシングがない単一システムでキャッシュリロード、セッション、tempファイル、ログファイルなどを管理します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;さて、spring環境でcronを設定する方法に関して説明します。&lt;/p&gt;&lt;p&gt;pom.xmlで二つのライブラリを登録しましょう。&lt;/p&gt;&lt;p&gt;repository - &lt;a href=&quot;https://mvnrepository.com/artifact/org.quartz-scheduler/quartz&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/org.quartz-scheduler/quartz&lt;/a&gt;&lt;/p&gt;&lt;p&gt;repository - &lt;a href=&quot;https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=961&quot; data-filename=&quot;001.png&quot; style=&quot;width: 747px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてspring mvc configファイルを修正しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;taskスキーマを追加してdrivenを使い設定すればよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=964&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はcontroller.cronパッケージで設定しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=962&quot; data-filename=&quot;003.png&quot; style=&quot;width: 471px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;controller.cronパッケージでschedulerクラスを追加しました。&lt;/p&gt;&lt;p&gt;上のcronスケジューラは毎秒実行する形式のスケジューラです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=963&quot; data-filename=&quot;004.png&quot; style=&quot;width: 554px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブサービスを実行すればcronスケジューラが実行されて、run関数が毎秒に呼び出されることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のscheduledアノテーションでcronサイクルを設定した文法に関する説明です。&lt;/p&gt;&lt;p&gt;私の場合はアスタリスクマーク(*)6個をスペース区切りで使いましたが、実は基本7個アスタリスクマーク(*)でスペース区切りで使います。&lt;/p&gt;&lt;p&gt;cronは上の7桁の表現式でサイクルを設定します。&lt;/p&gt;&lt;p&gt;アスタリスクマーク(*)はallの意味で毎秒、毎分、毎時、毎日、毎月、毎曜日、毎年の意味です。&lt;/p&gt;&lt;p&gt;日、曜日の場合はアスタリスクマーク(*)を代わりにクエスチョンマーク(?)を使えます。(意味は違いますが、結果は同じです。) &lt;/p&gt;&lt;p&gt;そしてその以外に指定する時は数字で表示します。参考に曜日の場合は1から7まで数を使います。(1:日 2:月 3:火 4:水 5:木 6:金 7:土)&lt;/p&gt;&lt;p&gt;例えば、「0 0 10 1 1 1 」という表現式なら毎年(省略)1月1日10時00分00秒の月曜日も場合(火曜日の場合は実行しません。)実行しましょうという文法になります。&lt;/p&gt;&lt;p&gt;指定する日付を二つ以上ならコンマで区切りします。&lt;/p&gt;&lt;p&gt;例えば、「0,10 0 10 * * *」といえば毎年(省略)毎月毎日10時00分00秒、10秒に実行しましょうと意味になります。&lt;/p&gt;&lt;p&gt;秒の設定で「0,10,20,30,40,50」といえば0秒、10秒、20秒、30秒、40秒、50秒に実行しましょうという意味ですが、楽に「0/10」で表現できます。「0/10」は10秒たびに実行する意味です。&lt;/p&gt;&lt;p&gt;ハイフンで範囲を設定することができますが、「1-10」だと「1日から10日まで」という意味になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;特殊表現式で「l,w,#」がありますが、「l」は最後の日の意味を持っています。日と曜日だけで使えます。日で「l」を使うと月の最後の日、曜日の場合は土曜日になります。&lt;/p&gt;&lt;p&gt;wは日だけで使えますが、近い平日という意味です。10wの場合は10日が土曜日なら9日、日曜日なら11日に実行する表現式です。&lt;/p&gt;&lt;p&gt;#は曜日に使える表現式です。2#2なら二つ目の週の月曜日に実行する意味です。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;表現式&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;*&lt;/td&gt;        &lt;td&gt;allの意味で毎秒、毎分、毎時、毎日、毎月、毎年&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;?&lt;/td&gt;        &lt;td&gt;日、曜日だけで使えることで条件なしという意味&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;/&lt;/td&gt;        &lt;td&gt;サイクルの繰り返しの意味&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;-&lt;/td&gt;        &lt;td&gt;範囲の意味&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;l&lt;/td&gt;        &lt;td&gt;日、曜日だけで使えることで最後の日の意味&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;w&lt;/td&gt;        &lt;td&gt;日だけで使えることで指定された近い平日&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;#&lt;/td&gt;        &lt;td&gt;曜日だけで使えることで週#曜日という意味&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;ここまでjspのspring環境でschedulerのcronを使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/186.html</guid><pubDate>Wed, 18 Mar 2020 00:24:32 +0900</pubDate></item><item><title>[Java] POIを利用してExcelを扱う方法</title><link>https://www.nowonbun.com/185.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでpoiを利用してexcelを扱う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;様々業務でexcelというプログラムはたくさん使います。どのぐらいかといえばexcelがなければ世界の電算システムは動かないほどです。それで様々ポータルシステムでexcelデータをダウンロードする機能は必須であります。&lt;/p&gt;&lt;p&gt;java環境でexcelを使うライブラリはpoiライブラリだといいます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;poiライブラリを使うためにはmavenのrepositoryでダウンロードして後、連携して使います。&lt;/p&gt;&lt;p&gt;repository - &lt;a href=&quot;https://mvnrepository.com/artifact/org.apache.poi/poi&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/org.apache.poi/poi&lt;/a&gt;&lt;/p&gt;&lt;p&gt;repository - &lt;a href=&quot;https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml/&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=956&quot; data-filename=&quot;001.png&quot; style=&quot;width: 765px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=957&quot; data-filename=&quot;002.png&quot; style=&quot;width: 534px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はexcelを読み込んで修正します。&lt;/p&gt;&lt;p&gt;修正した内容をファイルに格納しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=958&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;添付ファイル - &lt;a class=&quot;attachfile&quot; href=&quot;./getattachfile.ajax?idx=960&quot; data-filename=&quot;test.xls&quot;&gt;&lt;img src=&quot;./img/zip.gif&quot;&gt; test.xls&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=959&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;npoiみたいにエクセルファイルを読み込んでまた値を再設定することでグラフも自動に変わることを確認することができます。実際に業務でエクセルを一から作ることよりドキュメントテンプレートを作って値を再設定して木偶セルデータの数値などを変わる方法でよく使います。&lt;/p&gt;&lt;p&gt;そのほうがfontやスタイル設定することがしやすいです。そしてシステムのパフォーマンスでも改善することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでpoiを利用してexcelを扱う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/185.html</guid><pubDate>Tue, 17 Mar 2020 01:49:27 +0900</pubDate></item><item><title>[Java] PDFを出力する方法(itextpdf)</title><link>https://www.nowonbun.com/184.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでpdfを出力する方法(itextpdf)に関する説明です。&lt;/p&gt;&lt;p&gt;ウェブサービスで、特にポータルサービスならデータの結果を出力するところならpdf出力が多いです。最近はほとんどpdfの出力なら標準でなっているほど多いです。&lt;/p&gt;&lt;p&gt;pdfで出力したら修正もできないし、イメージよりドキュメント形式になっているフォーマットになっているのでです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これをjava環境でpdfを作成して出力して使う方法に関して説明します。&lt;/p&gt;&lt;p&gt;java環境で使うためにmavenレポジトリを通ってitextpdf」と「xmlworker」をしなければならないです。&lt;/p&gt;&lt;p&gt;repository - &lt;a href=&quot;https://mvnrepository.com/artifact/com.itextpdf/itextpdf/5.5.13.1&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/com.itextpdf/itextpdf/5.5.13.1&lt;/a&gt;&lt;/p&gt;&lt;p&gt;repository - &lt;a href=&quot;https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker/5.5.13.1&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker/5.5.13.1&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=954&quot; data-filename=&quot;001.png&quot; style=&quot;width: 754px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;簡単なpdfを出力するプログラムを作成しましょう。コンソールで実行するとpdfが生成するプログラムです。&lt;/p&gt;&lt;p&gt;ソースでcssファイルを二つ読み込みます。&lt;/p&gt;&lt;p&gt;上のcssファイルを下記のディレクトリに設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=953&quot; data-filename=&quot;002.png&quot; style=&quot;width: 283px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;設定は完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを実行して結果を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=955&quot; data-filename=&quot;003.png&quot; style=&quot;width: 499px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでpdfを出力する方法(itextpdf)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/184.html</guid><pubDate>Fri, 13 Mar 2020 01:06:27 +0900</pubDate></item><item><title>[Java] ログライブラリ(log4j)を使う方法</title><link>https://www.nowonbun.com/183.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaで使うログライブラリ(log4j)を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ログということはプログラム開発する時にデータ追跡や呼出されたクラスや関数、エラー確認などを調べるため使うライブラリです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通に開発する時にはideツールを利用してデバックすればデータ追跡ができますが、開発が終わってプログラムをコンパイルやビルドした後、productionにリリースになったらデータ追跡することはしやすくないです。&lt;/p&gt;&lt;p&gt;でも、完璧なプログラムなら問題ないですが、人間が作ったプログラムなのでバグが必ずあるし、そのバグによって間違い演算してエラーが発生します。エラーが発生する時にデータを追跡ができなければならないですが、それがログ機能によってデータを探せるのができます。&lt;/p&gt;&lt;p&gt;javaではログライブラリが様々がありますが、その中でlog4jが一番簡単だし、楽なライブラリだと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ログはただエラー追跡だけではなく、ユーザアクションパターンやシステムメモリパターンなどを追跡して様々に統計データを活用することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaでlog4jを使うためにmavenレポジトリを通ってlog4jライブラリを連携しなければならないです。&lt;/p&gt;&lt;p&gt;repository - &lt;a href=&quot;https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core/2.13.1&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core/2.13.1&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=951&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=948&quot; data-filename=&quot;002.png&quot; style=&quot;width: 709px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実際にプログラムの中で作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=949&quot; data-filename=&quot;003.png&quot; style=&quot;width: 608px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=950&quot; data-filename=&quot;004.png&quot; style=&quot;width: 519px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://logging.apache.org/log4j/2.0/manual/api.html&quot; target=&quot;_blank&quot;&gt;https://logging.apache.org/log4j/2.0/manual/api.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;log4jはconsoleやファイルログ以外にメール送信、データベース設定などがあります。設定によって追加することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=952&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://logging.apache.org/log4net/release/manual/configuration.html&quot; target=&quot;_blank&quot;&gt;https://logging.apache.org/log4net/release/manual/configuration.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaで使うログライブラリ(log4j)を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/183.html</guid><pubDate>Thu, 12 Mar 2020 00:54:39 +0900</pubDate></item><item><title>[Java] Jsonタイプのデータを使う方法(Gsonライブラリ)</title><link>https://www.nowonbun.com/182.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでjsonタイプのデータを使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;jsonデータは「キー:値」になっているデータオブジェクトで人間が読めるテキスト形式の開放型標準フォーマットということです。&lt;/p&gt;&lt;p&gt;javaでデータオブジェクトをjsonタイプに変換するためにはgoogleで提供するgsonのライブラリを使います。&lt;/p&gt;&lt;p&gt;まず、mavenでgsonを登録してライブラリを連結しましょう。&lt;/p&gt;&lt;p&gt;reference - &lt;a href=&quot;https://mvnrepository.com/artifact/com.google.code.gson/gson&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/com.google.code.gson/gson&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=943&quot; data-filename=&quot;001.png&quot; style=&quot;width: 621px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;maven repositoryに接続してgsonの最新maven情報を読み込みます。&lt;/p&gt;&lt;p&gt;私はeclipseを利用するのでeclipseのpom.xmlに登録します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=944&quot; data-filename=&quot;002.png&quot; style=&quot;width: 466px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=945&quot; data-filename=&quot;003.png&quot; style=&quot;width: 438px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;登録した後、maven updateをしてライブラリを連結します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=947&quot; data-filename=&quot;004.png&quot; style=&quot;width: 734px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてテストクラスを作成して試してみましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=946&quot; data-filename=&quot;005.png&quot; style=&quot;width: 287px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にシリアライズに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/177.html&quot; target=&quot;_blank&quot;&gt;[java] シリアライズ(直列化: serializable)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;シリアライズとかjsonタイプに変換するのはデータをstringタイプに変換することができることです。&lt;/p&gt;&lt;p&gt;結果は違いますが、仕様によって各良い点があるし悪い点があるでしょう。&lt;/p&gt;&lt;p&gt;シリアライズはクラスのインスタンスをバイナリ化することなので、見えない変数(private)までデータが変換します。でも人間が読みにくいデータ構造に変換します。&lt;/p&gt;&lt;p&gt;jsonの場合はプロパティがないデータ(getterがない変数)ならjsonタイプに変換することは限界があります。でも人間が読みやすいテキストテキストに変換します。意味はデータ構造の直接に修正ができることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プロジェクトの仕様によってシリアライズかjsonタイプかに選択して使いましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでjsonタイプのデータを使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/182.html</guid><pubDate>Wed, 11 Mar 2020 00:30:15 +0900</pubDate></item><item><title>[CSS] 色スタイル、グラデーション</title><link>https://www.nowonbun.com/135.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cssで色のスタイルは色名で設定することもできるし、rgb表現式で設定もできるし、hexの値で設定もできます。&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;style&gt;/*色名設定*/.color-1{  color:blue;}/*rgb表現式*/.color-2{  /*赤、緑、青*/  color:rgb(255,0,0);}.color-3{  color: #008000;}&lt;/style&gt;&lt;div class=&quot;color-1&quot;&gt;color-1&lt;/div&gt;&lt;div class=&quot;color-2&quot;&gt;color-2&lt;/div&gt;&lt;div class=&quot;color-3&quot;&gt;color-3&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;色の参照は下記のurlで参考できます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.w3schools.com/cssref/css_colors.asp&quot; target=&quot;_blank&quot;&gt;https://www.w3schools.com/cssref/css_colors.asp&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿では基本色設定ではなく、グラデーションに関して調べてみました。&lt;/p&gt;&lt;p&gt;初めのdivタグのlinear-gradientは線形のグラデーションです。パラメータはグラデーションの変換角度で180度で設定すれば水平で上から下の段階でシルバー色から紫色に変わると意味で色の設定です。&lt;/p&gt;&lt;p&gt;二つ目は上右から下左の角度ですが、角度では45度ですね。初めは赤色で、真中は白色、最後は青色に設定されます。&lt;/p&gt;&lt;p&gt;三つ目のradial-gradientは丸系のグラデーションです。パラメータはcircle設定ですが初めは真中から外側に黄色から緑色に設定することです。&lt;/p&gt;&lt;p&gt;四つ目は丸の設定ですが、丸のサイズが横50px、縦50pxです。「at」の後は丸の位置ですね。右から80px、上から30pxの中心であずき色、オリーブ色、アクア色順になります。&lt;/p&gt;&lt;p&gt;五つ目のネイビー色20%、teal色80%、水平(0deg,180deg)角度で繰り返いしてグラデーションになります。&lt;/p&gt;&lt;p&gt;六つ目の角度(-45deg = 315deg)で繰り返いして初め白色から白色まで5px、黒色5pxから黒色10pxまでグラデーションになります。&lt;/p&gt;&lt;p&gt;七つ目のrepeating-radial-gradientは繰り返し丸系のグラデーションです。&lt;/p&gt;&lt;p&gt;ここのキーワードは四つがありますが、closest-side、closest-corner、farthest-side、farthest-cornerがありますね。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;キーワード&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;closest-side&lt;/td&gt;        &lt;td&gt;グラデーションの終了形状は、その中心に最も近いボックスの側面（円の場合）または中心に最も近い垂直および水平の両方の辺（楕円の場合）に一致します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;closest-corner&lt;/td&gt;        &lt;td&gt;グラデーションの終了形状は、ボックスの中心から最も近い角に正確に合うようにサイズ設定されます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;farthest-side&lt;/td&gt;        &lt;td&gt;最も近い側に似ていますが、終了形状は、ボックスの中心から最も遠い側（または垂直および水平側）に合うサイズになっています。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;farthest-corner&lt;/td&gt;        &lt;td&gt;グラデーションの終了形状は、ボックスの中心から最も遠いコーナーに正確に合うようにサイズが設定されます。&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;筆者の場合はclosest-sideの設定なので、丸が繰り返して広がるこです。グレー色0pxからライム色20pxほど丸ができます。&lt;/p&gt;&lt;p&gt;最後は透明色から白色5px,フクシア色5pxからフクシア色10pxにグラデーションすることです。&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;height: 110px;&quot;&gt;&lt;style&gt;	div.exam{	  display:inline-block;  width:9%;	  height:100px;	  border:1px solid #000;	  float:left;	}	div.exam:nth-of-type(1){	  background:linear-gradient(180deg,silver,purple);	}	div.exam:nth-of-type(2){  background:linear-gradient(to top right,red 0%,white 50%,blue 100%);	}	div.exam:nth-of-type(3){	  background:radial-gradient(circle,yellow,green);	}	div.exam:nth-of-type(4){  background:radial-gradient(50px 50px at 80px 30px,maroon,olive,あ);	}	div.exam:nth-of-type(5){  background:repeating-linear-gradient(navy 20%,teal 80%);	}	div.exam:nth-of-type(6){  background:repeating-linear-gradient(-45deg,white, white 5px,black 5px,black 10px);	}	div.exam:nth-of-type(7){  background:repeating-radial-gradient(circle closest-side,gray 0px, lime 20px);	}	div.exam:nth-of-type(8){	  background:repeating-radial-gradient(circle,transparent, white 5px,fuchsia 5px,fuchsia 10px);	}	&lt;/style&gt;&lt;div class=&quot;exam&quot;&gt;&lt;/div&gt;&lt;div class=&quot;exam&quot;&gt;&lt;/div&gt;&lt;div class=&quot;exam&quot;&gt;&lt;/div&gt;&lt;div class=&quot;exam&quot;&gt;&lt;/div&gt;&lt;div class=&quot;exam&quot;&gt;&lt;/div&gt;&lt;div class=&quot;exam&quot;&gt;&lt;/div&gt;&lt;div class=&quot;exam&quot;&gt;&lt;/div&gt;&lt;div class=&quot;exam&quot;&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;グラデーションは様々ところでよく使う色ですが、たくさん使うとやはりコンテンツの集中度を落とす効果が発生します。&lt;/p&gt;&lt;p&gt;色やポイントを与える時、広告する時には良いと思います。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/135.html</guid><pubDate>Tue, 10 Mar 2020 23:27:05 +0900</pubDate></item><item><title>[Java] cmdコマンドを実行するための方法</title><link>https://www.nowonbun.com/180.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjava環境でcmdコマンドを実行するための方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを作成する時にウェブアプリケーションや一般アプリケーションでほかのプログラムを実行するとか内部サーバをコントロールする時にあります。&lt;/p&gt;&lt;p&gt;例えば、jankinsの場合、ウェブ環境でgitやsvnのコマンドを操作するとかシェルコマンドでウェブ環境でサーバをコントロールするようなプログラムです。&lt;/p&gt;&lt;p&gt;このようにプログラムを通ってシェルコマンドを使う場合がありますが、その時に使うことができるソースコードです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=939&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果画面をみればコンソールに「cd」のコマンドと「dir」のコマンドを実行して結果を出力する結果のイメージです。最後に「exit」コマンドを実行してプログラムを終了します。&lt;/p&gt;&lt;p&gt;eclipse環境で文字化けがありますが、単純にeclipseのエンコーディング問題です。実際に変数をデバッグでみれば日本語が入力されています。それでも文字化けの問題が解決できなければinputstreamreaderにエンコーディングタイプを入れたら解決なります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjava環境でcmdコマンドを実行するための方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/180.html</guid><pubDate>Fri, 6 Mar 2020 18:01:10 +0900</pubDate></item><item><title>[Java] メール(javax.mail)を発送する方法</title><link>https://www.nowonbun.com/179.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでメール(javax.mail)を発送する方法に関する説明です。&lt;/p&gt;&lt;p&gt;プログラム上で我々がメール発送することは様々のところで使えることができます。会員登録する時に登録認証やパスワード探すことなどがあるし、システム上で様々なアラームメッセージをメール発送することもできます。&lt;/p&gt;&lt;p&gt;最近はsnsがたくさんあるのでsnsでメッセージを発送する方法もよく使いますが、それでもまだ、メール発送機能はなくならないでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私はgoogle mail(gmail)を通ってメールを発送する例です。&lt;/p&gt;&lt;p&gt;google mail - &lt;a href=&quot;https://support.google.com/a/answer/176600?hl=ja&quot; target=&quot;_blank&quot;&gt;https://support.google.com/a/answer/176600?hl=ja&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先にクロームに接続して右上のアカウント管理に行きましょう。(ログインができなかった状況なら先にログインしてから。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=933&quot; data-filename=&quot;001.png&quot; style=&quot;width: 346px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アカウント管理に移動して安全性の低いアプリのアクセスのタブに移動します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=935&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;安全性の低いアプリの許可を有効にします。&lt;/p&gt;&lt;p&gt;このチェックをしないと外部からグーグルメールを使用できないようにすることです。なので、idやpwの漏れがなければそんなに問題はありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=936&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaでメールを発送するソースを作成するためにpom.xmlでメールライブラリを登録しなければならないです。&lt;/p&gt;&lt;p&gt;レポジトリ - &lt;a href=&quot;https://mvnrepository.com/artifact/javax.mail/mail&quot; target=&quot;_blank&quot;&gt;https://mvnrepository.com/artifact/javax.mail/mail&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=934&quot; data-filename=&quot;004.png&quot; style=&quot;width: 581px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メール発送はconsoleに作成しても問題ないので、consoleで作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=937&quot; data-filename=&quot;005.png&quot; style=&quot;width: 836px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私がsessionのデバックモードに設定しましたのでメールサーバと送受信されるメッセージの状態が表示されます。もし、プロトコールで追加する内容があればこのログを見て追加すればよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メールを発送しましたので、自分のメールトレイにメールがあるかどうか確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=938&quot; data-filename=&quot;006.png&quot; style=&quot;width: 707px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メールの送信がよくできました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでメール(javax.mail)を発送する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/179.html</guid><pubDate>Thu, 5 Mar 2020 20:07:49 +0900</pubDate></item><item><title>[Java] クラス複製(Clonable, Reflection)</title><link>https://www.nowonbun.com/178.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでクラス複製(clonable, reflection)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラス複製はプリミティブデータみたいにイコール記号(=)で簡単にデータを複製することができません。&lt;/p&gt;&lt;p&gt;クラスにはスタック値とヒープメモリがあります。クラスはヒープで割当て(インスタンス宣言)して、スタック値にポインタ参照を繋がれています。&lt;/p&gt;&lt;p&gt;ただ、イコール(=)でコピーするのはクラス複製じゃなくスタック値、つまり参照値をコピーすることです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=932&quot; data-filename=&quot;001.png&quot; style=&quot;width: 272px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればnodeクラスをa変数に割当しました。node b変数にイコールでデータをコピーしました。&lt;/p&gt;&lt;p&gt;b変数に「10」のデータを格納しましたが、a変数のデータも「10」に代わりました。&lt;/p&gt;&lt;p&gt;ここでハッシュコードをみれば同じデータに出力します。&lt;/p&gt;&lt;p&gt;つまり「node b = a」でクラスが新しく割当したことじゃなく、参照値(スタック値)だけコピーして結局、同じクラスを指すものになってしまいました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々が必要なことはクラスの複製です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=930&quot; data-filename=&quot;002.png&quot; style=&quot;width: 280px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば、確かに「a」の変数と「b」の変数に各クラスが割当しています。&lt;/p&gt;&lt;p&gt;b変数にデータを格納してもa変数に影響がありません。ハッシュコードも別の値を出力するので確かに別のクラスです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の方法がjavaで一般的なクラスコピーです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でもすべてのクラスが「cloneable」を継承しているなら問題ないですが、実際には継承してないクラスもたくさんあります。&lt;/p&gt;&lt;p&gt;そのクラスはどのようにクラスを複製しましょうか。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=931&quot; data-filename=&quot;003.png&quot; style=&quot;width: 185px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はクラス複製関数を作成してコピーしました。クラスの場合は一般クラスで「cloneable」を継承してないです。&lt;/p&gt;&lt;p&gt;clone関数でクラスを新しくクラスを割当てしてメンバ変数をすべてコピーします。そのためクラス複製効果になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はクラスの修正ができない状況かつ継承もできない状況では上の方法でクラス複製をよくします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでクラス複製(clonable, reflection)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/178.html</guid><pubDate>Thu, 5 Mar 2020 00:03:19 +0900</pubDate></item><item><title>[Java] シリアライズ(直列化: Serializable)</title><link>https://www.nowonbun.com/177.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのシリアライズ(直列化: serializable)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;シリアライズとは割当てしたクラス(インスタンス)をバイナリ化することをシリアライズ(直列化: serializable)といいます。&lt;/p&gt;&lt;p&gt;クラスのメモリ割当てはクラス内部のメンバー変数で構成しています。(関数の場合はメモリに割当てないです。)メンバー変数はプリミティブタイプやクラスになっています。&lt;/p&gt;&lt;p&gt;すなわち、クラスのデータをファイルやソケット通信で転送するためにはbyteタイプに変換しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その方法でjsonタイプに変換してクラスのデータをstringタイプに変換してバイナリ化する方法もあります。&lt;/p&gt;&lt;p&gt;実際に、最近、その方法でよく使います。でも、クラスをjsonタイプに変換するのは限界があるし、クラス内部の見えないデータ(private)まで完全に変換されたとは言えません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでこのシリアライズ機能を使ってクラスをバイナリ化するとクラスをデータを完全にbyteタイプに変換するのでよいでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、シリアライズよりjsonをよく使うのは下記とおりの理由があります。&lt;/p&gt;&lt;p&gt;1.シリアライズでバイナリ化になったデータは人間がそのままに見て理解しにくい構造になっています。つまり、逆シリアライズする前にはデータが正しいかの検証ができません。&lt;/p&gt;&lt;p&gt;でも、jsonタイプになったデータは人間が見やすいし、プログラムを利用せずに修正も簡単です。逆にそれがjsonよりいいことがセキュリティにはよいでしょう。&lt;/p&gt;&lt;p&gt;2.プラットフォームの制約があります。java言語でシリアライズしたデータはc#やpythonなどで逆シリアライズができません。&lt;/p&gt;&lt;p&gt;正確には出来ないことではないですが、データ漏れが発生します。&lt;/p&gt;&lt;p&gt;3.クラス修正があれば、以前シリアライズしたデータを逆シリアライズする時にデータ漏れが発生する可能性があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;シリアライズの利点はセキュリティがよいし、クラス自体をバイナリするため、クラス状態をログにして把握することでよいでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=927&quot; data-filename=&quot;001.png&quot; style=&quot;width: 644px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は「node」クラスを割当てしてバイナリ化(byte[])にしてファイルに格納しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=928&quot; data-filename=&quot;002.png&quot; style=&quot;width: 705px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;格納したデータをまた読み込んでクラスに変換しました。jsonで一々にデータをstringタイプに変換することよりシリアライズ変換が簡単です。&lt;/p&gt;&lt;p&gt;上をみればシリアライズされたデータは構造把握が難しいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaでシリアライズされたことをc#で逆シリアライズしてみます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=929&quot; data-filename=&quot;003.png&quot; style=&quot;width: 793px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラス構造を「string data1」と「int data2」を作りましたが、データタイプが違うというエラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのシリアライズ(直列化: serializable)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/177.html</guid><pubDate>Tue, 3 Mar 2020 00:03:33 +0900</pubDate></item><item><title>[Java] StringBuilderとStringBufferの差異</title><link>https://www.nowonbun.com/176.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのstringbuilderとstringbufferの差異に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaの中で文字列タイプのデータタイプは「string」があります。&lt;/p&gt;&lt;p&gt;「string」はプリミティブデータタイプ(primitive data type: int, char, double...)じゃなく、objectクラスから継承されたクラスタイプです。&lt;/p&gt;&lt;p&gt;すなわち、「string」の内部はbyte(unsigned char)タイプになっています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで我々が「string data1 = &quot;abc&quot;;」ということに宣言すれば内部は「byte[] data1 = new byte[] {&apos;a&apos;, &apos;b&apos;, &apos;c&apos;}」になります。&lt;/p&gt;&lt;p&gt;そのため、「string」タイプと「string」タイプの文字列を合わせると思えば、下記の処理になります。&lt;/p&gt;&lt;p&gt;stringで文字列を合併すれば上のフローとおりに文字列が合併されます。&lt;/p&gt;&lt;p&gt;つまりstringにstringを合併すれば新しいstringが割当します。&lt;/p&gt;&lt;p&gt;それなら「string test = &quot;abc&quot; + &quot;def&quot; + &quot;ghi&quot; + &quot;jkl&quot;;」は合併フローがすごく複雑になります。&lt;/p&gt;&lt;p&gt;そのため、stringとstringを合併することはパーフォーマンスに影響があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすれば上のarrayタイプじゃなく、連結リストタイプ(list)みたいに文字列を「add」関数で追加する方法がないかと疑問になります。&lt;/p&gt;&lt;p&gt;それがarrayタイプじゃなく、listタイプで文字列を合併するのが「stringbuffer」と「stringbuilder」です。&lt;/p&gt;&lt;p&gt;上の例だけでみれば差異がそんなになさそうです。&lt;/p&gt;&lt;p&gt;でも文字列の合併が多いほどパーフォーマンスの差異は確かに出ると思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それなら「stringbuffer」と「stringbuilder」の差異はなにでしょうか。&lt;/p&gt;&lt;p&gt;同期化の差異です。stringbufferの場合はクラス内部で同期化しますが、stringbuilderの場合は同期化がありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=926&quot; data-filename=&quot;001.png&quot; style=&quot;width: 362px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;初めのスレッドで10個、２つ目のスレッドで10個を入れたので全ての文字桁数は20個になるはずです。&lt;/p&gt;&lt;p&gt;結果はstringbuilderには20桁数にならないです。stringbufferの場合はマルチスレッド環境でも20桁数になります。&lt;/p&gt;&lt;p&gt;理由はstringbufferの場合は同期化(lock)機能が内部で動くのでその結果になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうすればstringbuilderは使わず、stringbufferだけ使った方がいいと思われます。&lt;/p&gt;&lt;p&gt;上の結果はでません。&lt;/p&gt;&lt;p&gt;なぜならstringbufferの「lock」の機能でデッドロック(deadlock)に落ちてしまいました。&lt;/p&gt;&lt;p&gt;一番目のスレッドにはbuffer1にlockをかけてbuffer1にデータを入れようと思います。同じlockの領域なのでbuffer1.appendにはデッドロック(deadlock)に落ちてしません。&lt;/p&gt;&lt;p&gt;でも２番目のスレッドでbuffer1.appendの内部でlockを使うのでスレッド領域が違うスレッド1とスレッド2がお互い影響でデッドロックに落ちてしまう可能性が高いです。&lt;/p&gt;&lt;p&gt;実際に私もデッドロックに落ちてしまって実行中でプロセスが凍ってしまいました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なのでマルチスレッド環境で基本的にstringbufferを使う方がデータ同期化のために良いですが、仕様によってlockがあればstringbuilderが良い時もあります。&lt;/p&gt;&lt;p&gt;stringbuilderとstringbufferは機能が似てますが、仕様によって使う方法は違います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿のポイントは&lt;b&gt;「stringbuilder」は「同期化機能がない」、「stringbuffer」は「同期化機能があり」&lt;/b&gt;ということです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのstringbuilderとstringbufferの差異に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/176.html</guid><pubDate>Mon, 2 Mar 2020 07:52:22 +0900</pubDate></item><item><title>[Java] Compare関数を使う方法</title><link>https://www.nowonbun.com/175.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaでcompare関数を使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;javaで値を比較する関数で「equals」関数があります。このequals関数はobjectタイプにあり、全てのデータタイプで使うことができる関数です。&lt;/p&gt;&lt;p&gt;でもequals関数はただデータ値が同じか同じじゃないかと判断だけできるし、比較データがどっちがもっと大きいかは知ることができません。&lt;/p&gt;&lt;p&gt;もちろんif関数で「if (a &amp;gt; b) else if (a &amp;lt; b) else」でチェックしてもいいですが、少し品格があるように実装することはcompare関数を利用することがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=924&quot; data-filename=&quot;001.png&quot; style=&quot;width: 456px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;integerタイプでcompare関数のパラメータ基準で初めのパラメータをa、２つ目のパラメータをbと考えましょう。&lt;/p&gt;&lt;p&gt;aがbより小さいなら「-1」、同じなら「0」、大きいなら「1」の結果が出ます。つまり&amp;lt;=&amp;gt;順で-1,0,1の結果です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;integerではなくdateタイプで比較しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=925&quot; data-filename=&quot;002.png&quot; style=&quot;width: 543px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;dateタイプもクラスにcompare関数がありますが、今回はインスタンスから比較するcompareto関数を使用しました。&lt;/p&gt;&lt;p&gt;comparetoの場合は、インスタンス変数がa、パラメータデータがbと考えましょう。&lt;/p&gt;&lt;p&gt;aがbより前日なら「-1」、同日なら「0」、後日なら「1」の結果が出ます。つまり&amp;lt;=&amp;gt;順で-1,0,1の結果です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;compare関数は比較対象が比較値に比べてデータが小さいなら「-1」、同じなら「0」、大きいなら「1」の結果が出ます。つまり&amp;lt;=&amp;gt;順で-1,0,1の結果です。&lt;/p&gt;&lt;p&gt;このパターンをよく覚えばソート式や様々なアルゴリズムを組み立てる時、ソースが簡単に実装することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaでcompare関数を使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/175.html</guid><pubDate>Sat, 29 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[Java] 数字フォーマット(お金表示及び小数点以下表示)</title><link>https://www.nowonbun.com/174.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaで数字フォーマット(お金表示及び小数点以下表示)に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラム内で数字を扱う時にお金表示、つまり千単位でコンマがある表示を設定することが必要な時があります。&lt;/p&gt;&lt;p&gt;お金の場合は「0」が多い数字値だし、コンマ(,)表示がなければ迷う単位が多いからよく使うフォーマット変換だと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaは「int」や「double」、「float」タイプを「string」タイプに変換する時には「decimalformat」クラスを利用します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=921&quot; data-filename=&quot;001.png&quot; style=&quot;width: 490px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例で「#」はあれば表示するし、なければ表示しないことだし、「0」はなかったらデフォルトで「0」を表示するということでフォーマット設定になります。&lt;/p&gt;&lt;p&gt;そうすれば、上は小数点2桁までの設定でしだが、3桁になるとどうなるでしょうか？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=922&quot; data-filename=&quot;002.png&quot; style=&quot;width: 473px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;四捨五入になって「0.127」から「0.13」になりました。&lt;/p&gt;&lt;p&gt;でも、状況によって四捨五入じゃなく、切り捨てする時もあります。その時にはフォーマットだけじゃなく、mathクラスを利用して計算するか、bigdecimalタイプに変換して切り捨て関数で計算するかの方法があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=923&quot; data-filename=&quot;003.png&quot; style=&quot;width: 444px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;個人的にbigdecimalを使うとメモリ使用がありますが、math.floorの場合はoverflowエラー可能性があるので、bigdecimalタイプに変換して切り捨てする方が良いと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaで数字フォーマット(お金表示及び小数点以下表示)に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/174.html</guid><pubDate>Fri, 28 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[Java] サーブレット環境で現在の実行ディレクトリを取得する方法</title><link>https://www.nowonbun.com/173.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのサーブレット環境で現在の実行ディレクトリを取得する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを作成する時に現在のディレクトリを知る時があります。特にeclipse環境で実行する時にはコンパイルして実行させる場所 を探しにくいので開発する時に困る時があります。&lt;/p&gt;&lt;p&gt;例えば、環境ファイルを読み込む時やプロジェクト仕様として各種ファイルやテンプレートを読み込む時に必要です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その時にローカルディレクトリを探す方法は２つあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実行しているクラスのファイルの場所で探す方法です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=919&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;threadクラスで現在に動いているスレッドのクラスの場所を探すと現在の実行パスを探すのが出来ます。&lt;/p&gt;&lt;p&gt;上の関数の処理では問題ないですが、lambda式やマルチスレッドなどで呼出すと結果が可笑しくなる可能性があります。その時に「thread.currentthread().getcontextclassloader()」ではなく、「this.getclass().getclassloader()」を呼出して取得ができます。&lt;/p&gt;&lt;p&gt;でも全てloaderを通って取得するから、マルチスレッドなら正確に取得出来ない可能性はあります。(可能性といってもすごく低いです。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々はサーブレットを作っているのでサーブレットのcontextを利用して取得する方法もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=920&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の場合はcontextインスタンスから取得するものなので、マルチスレッドやlambda式で間違って取得する問題はありません。&lt;/p&gt;&lt;p&gt;でも、サーブレットクラス(httpservletを継承したクラス)だけ取得ができることなので一般クラスで現在パスを取得するようには上のloaderを通って取得する方法しかないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合はwebserverを起動する時にインスタンス初期化する方法で「static」タイプの変数に実行パスを格納して使うことでよく使います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/92.html&quot; target=&quot;_blank&quot;&gt;[java] java servletでインスタンスを初期する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのサーブレット環境で現在の実行ディレクトリを取得する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/173.html</guid><pubDate>Thu, 27 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[Java] 日本語をユニコードに変換して、ユニコードから日本語に変換する方法</title><link>https://www.nowonbun.com/172.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaで日本語をユニコードに変換して、ユニコードから日本語に変換する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaのプロパティや様々の設定ファイル、htmlのjsonコードなどで「\uxxxx」の形のコードを使う時があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=916&quot; data-filename=&quot;001.png&quot; style=&quot;width: 671px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「\uxxxx」はユニコードですが、英語や数字、つまりasciiコードの以外はユニコードで表示することです。グーグルで検索してユニコードをエンコードまたはデコードするライブラリやソースがありません。&lt;/p&gt;&lt;p&gt;私の検索能力が悪い可能性もありますが、一応私の場合はありませんでした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先はこのユニコードに関して確認しましょう。&lt;/p&gt;&lt;p&gt;英語とasciiコードは変換なしでそのまま表示されます。日本語になっている部分は「\u」が付けていて4文字の16進数コードになりました。&lt;/p&gt;&lt;p&gt;6^4+16^3+16^2+16^1の組み立てです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=917&quot; data-filename=&quot;002.png&quot; style=&quot;width: 430px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ユニコードが日本語に変換されてコンソールに表示しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、これをユニコードに変換する関数を作成しましょう。実は私が必要な関数はユニコード変換する関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=918&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最初、日本語に変換する前のユニコードと同じ結果になりました。eclipseのpropertiesファイルで自動変換する値が出ました。大文字、小文字の差異はありますが、フォーマットは「%04x」から「%04x」にかわれば大文字に変わります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaで日本語をユニコードに変換して、ユニコードから日本語に変換する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/172.html</guid><pubDate>Wed, 26 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[Java] コンソールからデータを受け取る方法(System.in)</title><link>https://www.nowonbun.com/171.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのコンソール環境でユーザからデータを入力させる方法に関する説明です。&lt;/p&gt;&lt;p&gt;javaのプログラミングをすると「system.out.println」関数をよく使います。「system.out.println」関数はデータをコンソールに表示する関数です。&lt;/p&gt;&lt;p&gt;eclipse(ide)の開発環境では「sysout」だけ入力しても自動変換(intellisense)機能で自動に変換されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;逆に「system.in」という関数は無いかと思ったら、逆にコンソールからデータを入力するスキャン関数であります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=914&quot; data-filename=&quot;001.png&quot; style=&quot;width: 207px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例をみればコンソールから「test」という値を受け取って、出力しました。&lt;/p&gt;&lt;p&gt;上のとおりに作成しても問題ないですが、バッファを設定することが気になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=915&quot; data-filename=&quot;002.png&quot; style=&quot;width: 207px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果は同じですが、コネクションがあるので、リソース管理がしやすいです。(コンソールもioなので結局リソースです。)&lt;/p&gt;&lt;p&gt;try ~　catchもなくなるし、バッファ設定がないので、コードがシンプルになりました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのコンソール環境でユーザからデータを入力させる方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/171.html</guid><pubDate>Tue, 25 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[Java] Servlet環境でWebSocket通信中、HttpSessionを取得する方法</title><link>https://www.nowonbun.com/170.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのservlet環境でwebsocket通信中、httpsessionを取得する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でwebsocketに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/168.html&quot; target=&quot;_blank&quot;&gt;[java] websocket (ウェブソケット)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/169.html&quot; target=&quot;_blank&quot;&gt;[java] websocketでweb sessionを使う方法(broadcast)とウェブチャットの例&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;websocketとは初め接続することはhttpプロトコルでhandshake処理をしてヘッダでwebsocketなら接続を続けて保持することになるし、一般http要請なら応答して接続を切断します。&lt;/p&gt;&lt;p&gt;websocketの要請は初め要請以外には続けて接続しているので、ソケットでメッセージを送受信するため、httpクッキー情報を貰うタイミングがありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので、初め接続する際にwebsocket sessionをキーにしてセッションオブジェクトを管理するリストにweb sessionを格納します。その後、メッセージを受信する時に「@onmessage」関数が呼ばれたらwebsocket sessionでリストからsessionを取得して使ったらよいでしょう。&lt;/p&gt;&lt;p&gt;websocket serverクラスを作成しましょう。&lt;/p&gt;&lt;p&gt;websocketを接続するようなhtmlドキュメントを作成しましょう。&lt;/p&gt;&lt;p&gt;webserverにセッションをテストするために、セッションにデータを格納するサーブレットとクリアするサーブレットを作成しましょう。&lt;/p&gt;&lt;p&gt;上のwebsocket serverでwebsessionを「testsession」キーで取得しましたので、格納する時に「testsession」キーで格納しました。&lt;/p&gt;&lt;p&gt;次はsessionをクリアするサーブレットを作成しましょう。&lt;/p&gt;&lt;p&gt;ここまでwebsocket serverからwebsessionを取得する部分とテストするためのサーブレットまで作成しました。&lt;/p&gt;&lt;p&gt;ブラウザもwebsocket serverに接続する前にはhttpプロトコールで要請します。その時、webページ要請かwebsocket接続かの判断することがhandshakeです。&lt;/p&gt;&lt;p&gt;なので、初めのhttpのプロトコールで要請する時に、サーブレットからrequestインスタンスをもらえるし、クッキーからセッションキーも取得ができるのでセッションの値の取得が可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;websocket serverにはhandshakeは最初に接続する時だけ行われることなので、websocket sessionをキーにしてマップにwebsessionインスタンスとcontextインスタンスを格納しました。&lt;/p&gt;&lt;p&gt;そうすると、ブラウザからメッセージか来る時たびに接続ユーザのwebsessionのインスタンスを取得できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=909&quot; data-filename=&quot;001.png&quot; style=&quot;width: 820px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;index.jspを接続しました。&lt;/p&gt;&lt;p&gt;index.jspにはwebsocketでwebsocket serverに接続します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=911&quot; data-filename=&quot;002.png&quot; style=&quot;width: 776px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;他のタブに「sessionin」サーブレットを要請して「param」データを「test okok!!!」というデータを送ります。&lt;/p&gt;&lt;p&gt;そうするとセッションに「testsession」キーで「test okok!!!」というデータが格納するでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=912&quot; data-filename=&quot;003.png&quot; style=&quot;width: 783px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;index.jspページに戻ってきて「send」ボタンを押下しました。&lt;/p&gt;&lt;p&gt;そうするとwebsocket serverはセッションに格納された「testsession」キーでデータをクライアントに送ります。上のイメージをみればサーバからデータを受信したことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=913&quot; data-filename=&quot;004.png&quot; style=&quot;width: 807px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は「sessionout」サーブレットを要請してセッションをクリアしました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=910&quot; data-filename=&quot;005.png&quot; style=&quot;width: 781px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、index.jspページに戻って来て「send」ボタンを押下するとセッションが初期化されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://stackoverflow.com/questions/17936440/accessing-httpsession-from-httpservletrequest-in-a-web-socket-serverendpoint&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/17936440/accessing-httpsession-from-httpservletrequest-in-a-web-socket-serverendpoint&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのservlet環境でwebsocket通信中、httpsessionを取得する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/170.html</guid><pubDate>Mon, 24 Feb 2020 07:47:20 +0900</pubDate></item><item><title>[Java] WebSocketでWeb Sessionを使う方法(Broadcast)とウェブチャットの例</title><link>https://www.nowonbun.com/169.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はwebsocketでweb sessionを使う方法(broadcast)とウェブチャットの例に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前の投稿でwebsocketを設定してブラウザから接続、メッセージを送信、受信、切断まで説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/168.html&quot; target=&quot;_blank&quot;&gt;[java] websocket (ウェブソケット)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;csプログラムでソケット通信すると思えば、サーバソケットで接続するとクライアントソケットを受け取ってリストで管理します。&lt;/p&gt;&lt;p&gt;それでサーバからクライアントに一括送信するものがあればリストからクライアントコネクションを受け取って繰り返してメッセージを送信します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;websocketにはsessionというリソースがあります。&lt;/p&gt;&lt;p&gt;このsessionはwebsession(サーバにクライアント別に情報を格納するリソース)とは違います。ただソケットのコネクションのリソースです。csプログラムだとclientsocketと同じ意味のインスタンスです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=905&quot; data-filename=&quot;001.png&quot; style=&quot;width: 308px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的に以前websocketに説明した構造と同じです。今回は各リスナーからパラメータを「session」を受け取ります。&lt;/p&gt;&lt;p&gt;「session」データはソケット通信だと「socket」クラスと同じです。サーバとクライアント(ブラウザ)間にコネクション情報があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;messageを受け取る時に呼ばれる関数でメッセージを分析する流れがあります。&lt;/p&gt;&lt;p&gt;私が各セッションの区分のため、メッセージを「{{ユーザ名}}メッセージ」の形式でサーバにメッセージを送りました。それをユーザ名とメッセージ内容を分離する作業です。&lt;/p&gt;&lt;p&gt;セッションリストからセッションを受け取ってメッセージを送る時にメッセージを送ったセッションは抜いてメッセージを転送します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=906&quot; data-filename=&quot;002.png&quot; style=&quot;width: 308px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;websocketサーバにメッセージを転送する時に形式を「{{ユーザ名}}メッセージ」形で組み立てして送りました。　それをサーバ側からユーザ名とメッセージ内容を分離して区分することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これから起動しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=907&quot; data-filename=&quot;003.png&quot; style=&quot;width: 525px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;起動した後、私が各３つのブラウザを開いて接続しました。ユーザ名は各「test1」、「test2」、「test3」で決めてメッセージを送りました。&lt;/p&gt;&lt;p&gt;「test1」から送ったメッセージが「test2」、「test3」にも見えます。このようにウェブチャットプログラムが実装されました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=908&quot; data-filename=&quot;004.png&quot; style=&quot;width: 561px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サーバ側のコンソールログはクライアント３つが接続して各メッセージを送ったことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでwebsocketでweb sessionを使う方法(broadcast)とウェブチャットの例に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/169.html</guid><pubDate>Sat, 22 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[Java] WebSocket (ウェブソケット)</title><link>https://www.nowonbun.com/168.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はjavaのservlet環境でwebsocketを使う方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通のweb環境はクライアントからwebサーバーにhtmlドキュメントを要請するとwebサーバは要請されたhtmlドキュメントを作成してクライアントに応答して後接続を切断する非同期ソケット通信です。&lt;/p&gt;&lt;p&gt;websocketとはクライアントの要請してwebサーバが応答した後、接続を切断することじゃなく、connectionをそのまま保持してクライアントの要請がなくてもデータを転送することが可能なプロトコールです。&lt;/p&gt;&lt;p&gt;例えば、チャット機能を考えば、ユーザがチャット内容を書いてサーバに転送することがあります。それはサーバにクライアントから要請することです。&lt;/p&gt;&lt;p&gt;でも、他のユーザがチャット内容を書いてサーバに転送すれば私の場合はサーバからデータを取得しなければならないです。&lt;/p&gt;&lt;p&gt;その場合はユーザから要請がなくてもサーバからクライアントにデータを転送する流れですが、既存のwebプロトコールで接続が切断する状況には転送することができないでしょう。&lt;/p&gt;&lt;p&gt;websocketの場合は接続が切断している状況じゃないので、サーバからクライアントにメッセージを転送することができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考に既存の方法でも出来ないことじゃないです。ajax(webプロトコール)で5秒や10秒単位でメッセージ確認を要請すると可能です。&lt;/p&gt;&lt;p&gt;でも、頻繁な要請でwebサーバが負荷になる可能性もあるでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;websocketはhtml5から標準になりました。プロトコール要請は「ws://~」で始まります。webプロトコールの場合は「http://~」で始まります。&lt;/p&gt;&lt;p&gt;sslセキュリティタイプの場合は「wss://~」になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にjava環境でサーブレットを構築する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/74.html&quot; target=&quot;_blank&quot;&gt;[java] web serviceプログラムのservletを作成方法(eclipse)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;web servlet環境でクラスを生成してwebsocket serverを実装しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=903&quot; data-filename=&quot;001.png&quot; style=&quot;width: 302px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;websocketは別に複雑ではなく簡単に実装ができます。別にソケットサーバやプロトコール宣言なども必要ないです。&lt;/p&gt;&lt;p&gt;ただwebsocket ホスト設定のアノテーションとwebsocketとクライアント間のイベントをアノテーションで設定可能です。&lt;/p&gt;&lt;p&gt;関数名は任意で作成してもよいです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;websocketに接続するために、jspファイルにjavascriptを実装しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=904&quot; data-filename=&quot;002.png&quot; style=&quot;width: 303px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;websocketというjavascript内部関数で宣言します。パラメータはwebsocketのアドレスを入力します。プロトコールは「ws://~」で始まります。&lt;/p&gt;&lt;p&gt;クライアントのリスナー関数は「onopen」、「onmessgae」、「onclose」、「onerror」があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「onopen」はwebsocketのサーバと接続する時に呼ばれます。「onmessage」はサーバからメッセージが受取る時に呼ばれます。&lt;/p&gt;&lt;p&gt;「onclose」はwebsocketのサーバと連結が切断する時に呼ばれます。「onerror」はエラーが発生する時に呼ばれます。&lt;/p&gt;&lt;p&gt;サーバを起動してブラウザで接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=902&quot; data-filename=&quot;003.png&quot; style=&quot;width: 398px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;接続すると「server connect...」メッセージが表示されます。&lt;/p&gt;&lt;p&gt;メッセージで「hello world」を送信しました。結果はサーバからエコメッセージで返事がきました。&lt;/p&gt;&lt;p&gt;最終にwebsocketの切断しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=901&quot; data-filename=&quot;004.png&quot; style=&quot;width: 356px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サーバ側のログをみれば接続したログがあります。クライアントから「hello world」メッセージを受け取ってエコメッセージに返事しました。&lt;/p&gt;&lt;p&gt;最後、websocketの切断ログもあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでjavaのservlet環境でwebsocketを使う方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/168.html</guid><pubDate>Fri, 21 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[CakePHP] Errorページを設定する方法</title><link>https://www.nowonbun.com/167.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はphpのcakeフレームワークでerrorページを設定する方法に関する説明です。&lt;/p&gt;&lt;p&gt;cakephpでデバッグモードでエラーが発生すると下記とおりのエラーページが表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=893&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の画面はphpで開発する時にエラー追跡するためのstack flowです。すごく有用な情報です。でも、我々が開発が終わった後、本番サーバーに転換する場合にエラーが発生する時、stack flow情報が表示されると困ります。&lt;/p&gt;&lt;p&gt;一応、ソースの内容がユーザに見えることになるし、ユーザの立場でエラーページが表示されることはサイトの信頼度を落ちることになるでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、本番サーバーではエラーが発生すれば、エラーページに遷移しなければならないです。&lt;/p&gt;&lt;p&gt;そうしたらconfigフォルダのapp.phpファイルを確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=895&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;デバッグ設定するオプションがあります。初期設定は「true」になっていますが、「false」に設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=894&quot; data-filename=&quot;003.png&quot; style=&quot;width: 764px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、エラーページを見ると上のページが表示されます。(エラーページを表示するためにはソース上でthrowをするか、要請エラーが発生するページを要請すればよいです。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとエラーページを作成しましょう。&lt;/p&gt;&lt;p&gt;先にviewフォルダのappview.phpのソースから修正します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=896&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この部分を以前smarty設定する時に説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/159.html&quot; target=&quot;_blank&quot;&gt;[cakephp] mvcフレームワークのcakeをインストールする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;上のソースをみれば、debugモードじゃない場合、エラーが発生すると「error」ページが表示するように設定しました。&lt;/p&gt;&lt;p&gt;「error」ページは各エラータイプ別で設定することも可能ですが、普通は一つのエラーページに統一します。それで我々は「error」ページだけ修正して派生ページは無視しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=900&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;既存のデフォルトで様々の文法が書いていますね。綺麗にクリアしてエラーページを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=897&quot; data-filename=&quot;006.png&quot; style=&quot;width: 404px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;appview.phpのコードで応答コードの値を「errormessage」キーとしてテンプレートページに渡しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=899&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、エラーを発生させてエラーページが正しく表示することを確認します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=898&quot; data-filename=&quot;008.png&quot; style=&quot;width: 597px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでphpのcakeフレームワークでerrorページを設定する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/167.html</guid><pubDate>Thu, 20 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[CakePHP] Transactionを使う方法とEntityクラスを利用してInsert、Update、Deleteする方法</title><link>https://www.nowonbun.com/166.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はphpのcakeフレームワークでtransactionを使う方法とentityクラスを利用してinsert、update、deleteする方法に関する説明です。&lt;/p&gt;&lt;p&gt;以前、cakephpのフレームワークを利用せずに、データベースにinsertやupdate、deleteに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/163.html&quot; target=&quot;_blank&quot;&gt;[cakephp] データベース(mariadb(mysql))を接続する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、我々はデータ無欠性のため、トランザクションを使うし、fetch機能でオブジェクト単位でデータを追加する方法で実装しなければならないです。&lt;/p&gt;&lt;p&gt;テーブルの例は以前の投稿を続けて利用します。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/165.html&quot; target=&quot;_blank&quot;&gt;[cakephp] ormのテーブルfetch設定&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;userテーブルでデータを入力する後、派生テーブルのinfoテーブルのデータを入力します。そしてinfo2テーブルのデータを入力することで考えましょう。&lt;/p&gt;&lt;p&gt;userテーブルのキーとinfoテーブルの外部キーが自動生成するタイプじゃなく、nvarcharタイプのユーザかuserテーブルのキーとinfoテーブルの外部キーが自動生成するタイプじゃなく、nvarcharタイプのユーザから取得するデータなのでuserテーブルをinsertした後infoテーブルをinsertすることの順番で問題ありません。&lt;/p&gt;&lt;p&gt;でも、info2のテーブルの場合はinfoテーブルのキーで外部キーが結んでいますが、この場合は自動生成タイプなのでinfoテーブルがinsertした後、キーを検索してinfo2テーブルに入力しなければならないです。&lt;/p&gt;&lt;p&gt;この順番のテーブル入力する作業が多いと思えば、ソースがすごく複雑になるでしょう。&lt;/p&gt;&lt;p&gt;また、データベース処理する中でエラーが発生する時、全てをロールバックしなければならないですが、それ時にトランザクション(transaction)を利用すればできるでしょう。&lt;/p&gt;&lt;p&gt;cakephpフレームワークではトランザクションがオブザーバーパターンにもう実装されています。javaやc#はパターンを実装しましたが。。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;トランザクションを利用してデータを入力しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=890&quot; data-filename=&quot;001.png&quot; style=&quot;width: 396px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でinfoテーブルの場合は外部キー(id)に入力するデータにはentityデータの「id」で設定するので別にデータベースから受取るのはありませんが、info2テーブルの場合はinfoテーブルの外部キーが自動生成のキーなのでinfoデータがinsertした後のデータをデータベースから受け取らければならないです。&lt;/p&gt;&lt;p&gt;実際にtransation中で「$info-&amp;gt;idx」キーがありませんが、「$info2-&amp;gt;info = $info-&amp;gt;idx」を設定することで、連携することが出来ます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はupdateとdeleteです。&lt;/p&gt;&lt;p&gt;updateとdeleteはデータベースからデータを修正や削除することで一応検索してデータを取得します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=891&quot; data-filename=&quot;002.png&quot; style=&quot;width: 486px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のデータを取得してentityインスタンスのnameのデータを修正してsave関数を呼出したらデータベースに格納されています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=892&quot; data-filename=&quot;003.png&quot; style=&quot;width: 377px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;削除されたことを確認できました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでphpのcakeフレームワークでtransactionを使う方法とentityクラスを利用してinsert、update、deleteする方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/166.html</guid><pubDate>Wed, 19 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[CakePHP] ORMのテーブルFetch設定</title><link>https://www.nowonbun.com/165.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はphpのcakeフレームワークでormのテーブルfetch設定に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にはcakephpでorm query式でデータ検索することに関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/164.html&quot; target=&quot;_blank&quot;&gt;[cakephp] cakeフレームワークでデータベースに接続する時に使うquery式とentityクラス、tableクラス、resultset&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;orm fetchとはテーブルでreferenceされたテーブルのデータを連結することです。例えば、userテーブルに派生テーブルinfoがあり、infoテーブルでuserテーブルのidをforeign keyで結ばれたと思えば、プログラムからuserテーブルを検索するとinfoテーブルのデータもリストタイプに検索される機能です。&lt;/p&gt;&lt;p&gt;1:1の関係ならクラス内部で一つのインスタンスで変数に派生テーブルデータがあり、1:n関係ならリストタイプでデータがあります。&lt;/p&gt;&lt;p&gt;javaのormでも同じ概念で説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/83.html&quot; target=&quot;_blank&quot;&gt;[java] jpaのentityクラス設定(cascade, fetch)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;テストのため、データベースにテーブルを新しく生成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=886&quot; data-filename=&quot;001.png&quot; style=&quot;width: 461px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;テーブルの生成が完了したらcakephpにもtableクラスとentityクラスを生成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=885&quot; data-filename=&quot;002.png&quot; style=&quot;width: 273px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cakephpの機能ではfetch機能でjoinを利用してデータを取得する方法にもあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://book.cakephp.org/3/ja/orm/retrieving-data-and-resultsets.html#changing-fetching-strategies&quot; target=&quot;_blank&quot;&gt;https://book.cakephp.org/3/ja/orm/retrieving-data-and-resultsets.html#changing-fetching-strategies&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、joinを利用する方法はすごく複雑です。entityクラスで処理することじゃなく、controllerで$table-&amp;gt;find()関数を利用してデータを取得することに紹介しています。&lt;/p&gt;&lt;p&gt;ormでデータを組み込むことじゃなく、controllerがデータによって複雑に実装することだけです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでfetch設定をしてデータを取得するように実装しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/164.html&quot; target=&quot;_blank&quot;&gt;[cakephp] cakeフレームワークでデータベースに接続する時に使うquery式とentityクラス、tableクラス、resultset&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=887&quot; data-filename=&quot;003.png&quot; style=&quot;width: 547px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一応、permissionは後で説明して上のinfoだけ確認します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=888&quot; data-filename=&quot;004.png&quot; style=&quot;width: 563px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;infosのプロパティのデータを確認すればuserテーブルから連携されたinfoのデータが表示されますね。&lt;/p&gt;&lt;p&gt;userテーブルを検索すればinfoテーブルを検索しなくても、userテーブルで連結されてデータがあることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればpermissionmapを検索してpermissionのデータを検索すればpermissionデータがあることです。&lt;/p&gt;&lt;p&gt;permissionmapテーブルも同じパターンでidはuserテーブル、codeはpermissionテーブルに連携しています。&lt;/p&gt;&lt;p&gt;なので、userテーブルでpermissionmapを取得してpermissionプロパティを呼出しすればpermissionデータが検索されることです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=889&quot; data-filename=&quot;005.png&quot; style=&quot;width: 649px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のことを実はすべてjoinして検索したことじゃなく、キーによって再検索するタイプなのでパフォーマンスを少し落ちる可能性があります。&lt;/p&gt;&lt;p&gt;でも、可読性が直感なのでプログラムを作成して管理することでは楽だと思います。&lt;/p&gt;&lt;p&gt;cakephpはtableクラスで自由にクエリを組み込むができるので必要なら別途でクエリを作成する方もいい方法だと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでphpのcakeフレームワークでormのテーブルfetch設定に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/165.html</guid><pubDate>Tue, 18 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[CSS] Columnスタイル</title><link>https://www.nowonbun.com/131.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はcolumn要素に関して調べます。&lt;/p&gt;&lt;p&gt;column要素は筆者もよく使わない機能ですが、仕様によって使うところもあると思うのでまとめておきました。&lt;/p&gt;&lt;p&gt;スタイル種類は下記とおりになります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;スタイル&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;column-count&lt;/td&gt;        &lt;td&gt;カラムの列数を指定する。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;column-width&lt;/td&gt;        &lt;td&gt;カラムの列幅を指定する（実際の列の幅は、領域のサイズに応じて変化）&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;columns: -width -count&lt;/td&gt;        &lt;td&gt;上記2つのスタイルのshorthandスタイル&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;column-gap&lt;/td&gt;        &lt;td&gt;カラムの間の間隔&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;column-span&lt;/td&gt;        &lt;td&gt;複数のカラムを横断要素&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;column-rule-width&lt;/td&gt;        &lt;td&gt;各列を区別する線の太さ&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;column-rule-style&lt;/td&gt;        &lt;td&gt;各列を区切る線の種類&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;column-rule-color&lt;/td&gt;        &lt;td&gt;各列を区切る線の色&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;column-rule&lt;/td&gt;        &lt;td&gt;上記3つのshorthandスタイル&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;break-before&lt;/td&gt;        &lt;td&gt;ページ指定のスタイル（前）&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;break-after&lt;/td&gt;        &lt;td&gt;ページ指定のスタイル（後）&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;break-inside&lt;/td&gt;        &lt;td&gt;ページの指定のスタイル&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=693&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;columnsのサイズはブラウザの幅によって変更するので、calc(10vw)に設定しても幅の(30%)になると思います。カラム数を3で設定しましたので、三つが表示されました。&lt;/p&gt;&lt;p&gt;column-gapは線の基準で余白設定です。線は2pxで実線、青色で設定しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;h1タグの場合はcolumn要素を無視して表示することです。&lt;/p&gt;&lt;p&gt;hrタグで次のカラムから作成の意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;筆者がcolumn例を作りながら、いろいろテストしましたが、カラム別のスタイル適用か段落でスタイルことで使いにくいですね。&lt;/p&gt;&lt;p&gt;イメージで使うといいと思いますが、divタグで個別スタイルが扱いやすいと思います。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/131.html</guid><pubDate>Mon, 17 Feb 2020 22:35:21 +0900</pubDate></item><item><title>[CakePHP] Cakeフレームワークでデータベースに接続する時に使うQuery式とEntityクラス、Tableクラス、ResultSet</title><link>https://www.nowonbun.com/164.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はphpのcakeフレームワークでデータベースに接続する時に使うquery式とentityクラス、tableクラス、resultsetに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にcakeフレームワークでデータベースを接続する方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/163.html&quot; target=&quot;_blank&quot;&gt;[cakephp] データベース(mariadb(mysql))を接続する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cakephpにはormフレームワークが含めているので簡単にデータベースに接続するしクエリを構成してデータを検索することができます。&lt;/p&gt;&lt;p&gt;cakephpのormはデータを取得する時に単純にsqlクエリじゃなく、query式という関数があります。それでstringタイプのクエリじゃなく、php言語の関数みたいにクエリを組立てすることができます。&lt;/p&gt;&lt;p&gt;上の例をみればc#のlinq式とjavaのstream式とすごく似てます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=883&quot; data-filename=&quot;001.png&quot; style=&quot;width: 690px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでは以前の投稿にも説明しました。&lt;/p&gt;&lt;p&gt;差があるといえば以前は$connection-&amp;gt;newquery()関数でquery式を取得しましたが、今回はtableregistryからレジストリを取得してfind関数でquery式を取得しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;connectionのnewqueryとtableregistry:getしてfind関数で取得することは文法は別に差がなさそうですが、実際にnewqueryはsqlクエリを組立てするために関数ならレジストリから取得したことはorm上でデータをオブジェクト化することです。&lt;/p&gt;&lt;p&gt;単純にみてもnewqueryはコネクションのオブジェクトで扱うことなのでリソース管理をみても良くないでしょう。&lt;/p&gt;&lt;p&gt;そうするとデータをオブジェクトにするようにtableクラスとentityクラスを作成します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ideのdirectory explorerをみればmodelのフォルダの中にentityフォルダとtableフォルダがあることを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=882&quot; data-filename=&quot;002.png&quot; style=&quot;width: 304px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クラス名は「テーブル名+table」になります。私の場合はテーブル名が「testtable」なので「testtabletable」という可笑しい命名になりました。&lt;/p&gt;&lt;p&gt;クラス名は必ず「テーブル名+table」という命名方法に従う必要はありませんが、必ず語尾に「table」は付けなければならないです。&lt;/p&gt;&lt;p&gt;そしてentityクラスをentityフォルダに作成します。entityクラスはテーブル名のままになります。&lt;/p&gt;&lt;p&gt;他の言語の場合はカラムによって変数があるし、getter setterのプロパティがあります。phpの場合は変数やgetter setterプロパティを宣言しなくてもただカラム名で取得ができます。&lt;/p&gt;&lt;p&gt;上の例はテーブルにfull_dataというカラムは無いですが、full_dataのプロパティにidxとdataのデータが出力するように作成しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=881&quot; data-filename=&quot;003.png&quot; style=&quot;width: 594px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;query式でデータベースからデータを取得して$result変数に入れました。$resultを$item変数にイタレーションして結果を画面によく出力しました。&lt;/p&gt;&lt;p&gt;上のentityクラスに宣言したfull_dataプロパティもよく出力されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今までquery式で取得する関数でtolist()関数を使いましたが、first関数を使えば一つのレコード取得もできます。&lt;/p&gt;&lt;p&gt;結果が一つならtolistではなくfirst関数で取得すればソースを綺麗に作成できるでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=884&quot; data-filename=&quot;004.png&quot; style=&quot;width: 811px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データ取得関数は様々がありますが、実際によく使うのは「tolist」、「first」、「count」関数です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://book.cakephp.org/3.0/ja/orm/query-builder.html&quot; target=&quot;_blank&quot;&gt;https://book.cakephp.org/3.0/ja/orm/query-builder.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://book.cakephp.org/3.0/ja/orm/table-objects.html&quot; target=&quot;_blank&quot;&gt;https://book.cakephp.org/3.0/ja/orm/table-objects.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://book.cakephp.org/3.0/ja/orm/entities.html&quot; target=&quot;_blank&quot;&gt;https://book.cakephp.org/3.0/ja/orm/entities.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://book.cakephp.org/3.0/ja/orm/retrieving-data-and-resultsets.html&quot; target=&quot;_blank&quot;&gt;https://book.cakephp.org/3.0/ja/orm/retrieving-data-and-resultsets.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでphpのcakeフレームワークでデータベースに接続する時に使うquery式とentityクラス、tableクラス、resultsetに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/164.html</guid><pubDate>Mon, 17 Feb 2020 08:16:23 +0900</pubDate></item><item><title>[CakePHP] データベース(MariaDB(Mysql))を接続する方法</title><link>https://www.nowonbun.com/163.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はphpのcakeフレームワークでデータベース(mariadb(mysql))を接続する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前、バニラphpバージョンでmysqliのモジュールを拡張してデータベースに接続、検索、格納、削除などに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/150.html&quot; target=&quot;_blank&quot;&gt;[php] データベース(mariadb)を連結して使う方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cakeフレームワークでデータベースを接続してデータ管理することは以前バニラphpバージョンよりいいです。&lt;/p&gt;&lt;p&gt;ormフレームワークでデータを管理するし、取得することもc#のlinq式みたいな感じの実装するので接近性がよくなりました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://book.cakephp.org/3/ja/orm/database-basics.html&quot; target=&quot;_blank&quot;&gt;https://book.cakephp.org/3/ja/orm/database-basics.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先にデータベースにクエリを作ってデータを準備しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=876&quot; data-filename=&quot;001.png&quot; style=&quot;width: 473px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前にテストで使ったデータをそのままに使います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてデータベースに接続するために設定情報ファイルを修正します。&lt;/p&gt;&lt;p&gt;設定情報ファイルはcakeフレームワークのconfigフォルダの中にapp.phpファイルがあります。app.phpファイルの中でデータベースコネクション情報を設定するところがあります。&lt;/p&gt;&lt;p&gt;それをデータベース設定環境に合わせて修正します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=880&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データベース設定が完了したらhomecontrollerのクラスからデータベースのデータを取得します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=878&quot; data-filename=&quot;003.png&quot; style=&quot;width: 496px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみれば、データベースからデータを取得したことを確認できました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のクエリをみれば、単純に「select * from testtable」式を飛ばしてassocを連関配列で取得したことで以前の方式と別に差がありません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=877&quot; data-filename=&quot;004.png&quot; style=&quot;width: 537px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば$connectionからクエリオブジェクト$($query)を受け取ります。$queryオブジェクトは「from」、「where」、「order」、「select」の関数でクエリを組み立てます。&lt;/p&gt;&lt;p&gt;この関数は「excute」関数で組み立てるので順番が変わっても結果は同じです。&lt;/p&gt;&lt;p&gt;fetchallでデータベースからデータを受け取ります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=879&quot; data-filename=&quot;005.png&quot; style=&quot;width: 490px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果はidxが偶数だけあります。60の場合は10倍数なので「new!!!」変更されたことを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$connectionにはinsert、update、deleteの関数があります。&lt;/p&gt;&lt;p&gt;insertの場合は初めのパラメータはテーブル名で２つ目は連関配列によってデータを入れることでinsertが行います。&lt;/p&gt;&lt;p&gt;updateの場合は初めのパラメータはテーブル名で２つ目は更新するデータを連関配列、３つ目はデータ更新条件です。&lt;/p&gt;&lt;p&gt;deleteの場合は初めのパラメータはテーブル名で２つ目は削除条件です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;確かに以前にモジュールだけデータベースを使うことよりormフレームワークがあればデータベース管理がしやすいみたいです。&lt;/p&gt;&lt;p&gt;次の投稿にentityやtableクラスに関してもっと詳細に説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでphpのcakeフレームワークでデータベース(mariadb(mysql))を接続する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/163.html</guid><pubDate>Fri, 14 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] namespaceとuse</title><link>https://www.nowonbun.com/162.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はphpのnamespaceとuseキーワードに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;現在cakephpフレームワークに関する分析や説明をしていますが、急にphp基礎文法に戻りました。&lt;/p&gt;&lt;p&gt;実はphpの中でnamespaceやuseをよく使いならソース管理に良いですが、ライブラリ開発じゃない以上、すごく大事なところじゃなかったので省略しようと思いました。&lt;/p&gt;&lt;p&gt;でも、やはりmvcモデルで開発するためにはパッケージ区分が必要と思って説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;namespaceとuseとはc#の場合はnamespaceとusing、javaの場合はpackageとimportと同じ意味です。&lt;/p&gt;&lt;p&gt;最近、プロジェクトサイズが以前より大きいし様々なライブラリを参照しています。それでクラス名をプロジェクト中で雄一なことに決めることが難しいです。&lt;/p&gt;&lt;p&gt;例えば、データベースを２つを扱うプロジェクトということに考えてみましょう。&lt;/p&gt;&lt;p&gt;そのデータベースの種類がmysqlとoracleといえばrdbmsのタイプなのでライブラリがすごく似ていると思います。そのため、コネクションするクラス名がmysqlライブラリは「connection」という名を、oracleライブラリでも「connection」と実装されていると思えばユーザがconnectionクラスを割当てする時にプログラムはどのconnectionを宣言するか競合エラーになるはずです。&lt;/p&gt;&lt;p&gt;他の例ではxmlデータを扱うライブラリでオブジェクトを作成するbuildクラスがあるし、jsonデータを扱うライブラリでもオブジェクトを作成するbuildクラスがあると思えば、buileクラスを割当てする時にプログラムはどのクラスを宣言するかを分からないです。&lt;/p&gt;&lt;p&gt;そうすると、全てもphpのライブラリのクラス名は固有名で作成しなければならないですが、現実的にありえないことでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;同じクラス名でも区別するためにnamespaceがあります。&lt;/p&gt;&lt;p&gt;useの場合はnamespaceをパッケージを使用する明示的に宣言することです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=873&quot; data-filename=&quot;001.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はtestclassが２つあります。namespaceは各test1とtest2にあるので、別のクラスです。&lt;/p&gt;&lt;p&gt;もし、namespaceを使ってないなら同じクラス名が重複されたというエラーメッセージがでます。エラーメッセージが出ない(エラーオプション設定で。)と言ってもcontrollerでtestclassを割当てすると思えばなにを割当てするかしらないでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;homeconrollerでnew testclassを宣言する時に、useで使うnamespaceを予約宣言しましたので、testclassはtest2/testclassのことを分かることでしょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=875&quot; data-filename=&quot;002.png&quot; style=&quot;width: 534px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=874&quot; data-filename=&quot;003.png&quot; style=&quot;width: 502px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はuseを予約宣言クラスをtest2\testclassに修正しました。結果は「test２」が得ることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例では一つのページで様々なnamespaceを宣言しましたが、実際にはフォルダ構造としてnamespaceが決めます。&lt;/p&gt;&lt;p&gt;/commonフォルダに共通クラスを集める構造だと、util関係なクラスはnamespaceをcommonに決めることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がphpを使うことなら普通はウェブサイトを構築するために使います。&lt;/p&gt;&lt;p&gt;なので様々なライブラリを参照して使う立場なのでnamespaceとuseは知らなくてもphpでサイト運用で問題ないと思いました。でもcakephpには管理するクラスが多いし、cakephpのフレームワークが大きいからプロジェクトサイズが大きくなるのでnamespaceとuseキーワードを使わないことができないです。&lt;/p&gt;&lt;p&gt;そのため、調査して説明しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/language.namespaces.basics.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/language.namespaces.basics.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでphpのnamespaceとuseキーワードに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/162.html</guid><pubDate>Thu, 13 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[CakePHP] RequestとResponseに関して</title><link>https://www.nowonbun.com/161.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はphpのcakeフレームワークのrequestとresponseに関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;requestとはウェブブラウザからウェブサーバに要請したデータ(headerとbody)です。responseとはウェブサーバからウェブブラウザに応答するデータ(headerとbody)です。&lt;/p&gt;&lt;p&gt;要請するタイプには「get」タイプと「post」タイプがあります。そのことでgetのquery stringは「$_get」から取得するしpostのform dataは「$_post」から取得することを説明したことがあります。&lt;/p&gt;&lt;p&gt;また、headerのデータは$_serverから取得することも説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/145.html&quot; target=&quot;_blank&quot;&gt;[php] $_server, $globals, $_get, $_post, $_request, $_cookie, $_session, $_files, $_env(getenv())&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前、説明したデータをcakephpフレームワークでももちろん使えます。でもデータ流れの構造を設計、管理するcakephpフレームワークを使っているから内部オブジェクトでheaderデータを取得しましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://book.cakephp.org/3/ja/controllers/request-response.html&quot; target=&quot;_blank&quot;&gt;https://book.cakephp.org/3/ja/controllers/request-response.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;request&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;ウェブブラウザからウェブサーバに接続する時の要請上です。ヘッダ情報や、セッション情報があります。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$this-&amp;gt;getrequest()-&amp;gt;getattributes()と$this-&amp;gt;getrequest()-&amp;gt;getparam(キー)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;getparamの関数の情報はgetattributesの「params」のデータになっています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=866&quot; data-filename=&quot;001.png&quot; style=&quot;width: 689px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実はgetattributes()関数はroutes.phpからcontrollerを呼出す時にデータを渡すパラメータです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=865&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例の場合はcontroller、actionしかありませんが、connect関数にパラメータを付けるとgetattributes()関数で取得ができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$this-&amp;gt;getrequest()-&amp;gt;getquery()&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;このデータはhttpメソッドがgetの時に受取るquery stringの値です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=864&quot; data-filename=&quot;003.png&quot; style=&quot;width: 482px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考にgetquery関数で初めのパラメータはキー名、２つ目のパラメータはデフォルト値です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=863&quot; data-filename=&quot;004.png&quot; style=&quot;width: 621px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$this-&amp;gt;getrequest()-&amp;gt;getdata()&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;この関数はhttpメソッドがpostの時に受取るformデータです。&lt;/p&gt;&lt;p&gt;使用方法はgetqueryと同じです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=867&quot; data-filename=&quot;005.png&quot; style=&quot;width: 576px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$this-&amp;gt;getrequest()-&amp;gt;is()&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;この関数は要請メソッドタイプチェック関数です。つまり、is(&apos;post&apos;)の場合はpostはtrueを、そうじゃないならfalseを返却します。&lt;/p&gt;&lt;p&gt;探索可能なキーワードは「get」、「put」、「patch」、「post」、「delete」、「head」、「options」、「ajax」、「ssl」、「flash」、「requested」、「json」、「xml」があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=869&quot; data-filename=&quot;006.png&quot; style=&quot;width: 576px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$this-&amp;gt;getrequest()-&amp;gt;session()&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;セッションデータを取得する関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=870&quot; data-filename=&quot;007.png&quot; style=&quot;width: 637px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$this-&amp;gt;request-&amp;gt;getcookieparams()、$this-&amp;gt;getrequest()-&amp;gt;getcookie()&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;クッキーを取得する関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=868&quot; data-filename=&quot;008.png&quot; style=&quot;width: 544px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;セッションキー値はcookieには見えないですね。クッキーの中でcsrftokenキー見えますね。ページのセキュリティでtoken設定するものですが、設定は複雑ですがそんなに有用なミドルウェアじゃないです。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;response&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;ウェブサーバからウェブブラウザに応答する情報です。基本的にcakephpはヘッダからバディまで自動に作成してくれます。&lt;/p&gt;&lt;p&gt;別にユーザが修正する領域はないですが、エラーコード管理やブラウザにサーバ側のクッキー設定(set-cookie)をする時使います。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$this-&amp;gt;getresponse()-&amp;gt;withtype() , $this-&amp;gt;getresponse()-&amp;gt;withstringbody()&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;withtypeはcontext-typeを設定します。&lt;/p&gt;&lt;p&gt;withstringbodyは応答のボディを設定します。&lt;/p&gt;&lt;p&gt;※phpは基本的にポインタレファレンスがなくて、全て値レファレンスですね。$this-&amp;gt;getresponse()で出るresponseの関数で格納や修正、設定すると返却は全てresponse値です。でも入力、返却値が違います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=862&quot; data-filename=&quot;009.png&quot; style=&quot;width: 464px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$this-&amp;gt;getresponse()-&amp;gt;withstatus(error code);&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;ブラウザ応答のエラーコードを設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=871&quot; data-filename=&quot;010.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$this-&amp;gt;getresponse()-&amp;gt;withcookie(cookie class);&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;サーバ側からクッキーを設定する。&lt;/p&gt;&lt;p&gt;参考:クッキーはブラウザに格納データですが、サーバから格納する時にはブラウザ応答する時にヘッダに「set-cookie」を入れてブラウザにクッキーが設定するようにします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=872&quot; data-filename=&quot;011.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;その以外にrequestとresponseが提供する関数はもっと多いです。でも、よく使わないし、この投稿で全て説明するのは大変ですね。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://book.cakephp.org/3/ja/controllers/request-response.html&quot; target=&quot;_blank&quot;&gt;https://book.cakephp.org/3/ja/controllers/request-response.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでphpのcakeフレームワークのrequestとresponseに関する説明でした。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/161.html</guid><pubDate>Wed, 12 Feb 2020 03:00:02 +0900</pubDate></item><item><title>[CakePHP] PHPのCakeからAjax要請がある時、jsonタイプ(json_encode関数)でResponseする方法とControllerでViewを選択する方法</title><link>https://www.nowonbun.com/160.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この投稿はphpのcakeからajax要請がある時、jsonタイプ(json_encode関数)でresponseする方法とcontrollerでviewを選択する方法に関する説明です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前の投稿でcake+smartyの組み合わせでウェブブラウザから要請がくるとcontrollerを通ってviewを読み込んでresponseする方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/159.html&quot; target=&quot;_blank&quot;&gt;[cakephp] mvcフレームワークのcakeをインストールする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブサービスでは必ずhtmlドキュメント形式でresponseすることじゃありません。例えば、ajaxの機能ならjsonタイプのデータを受取る時もあるし、ファイルをダウンロードする時もあります。&lt;/p&gt;&lt;p&gt;その時にはactionメソッドでリターン値がテキストやバイナリタイプで受け取ってブラウザ側にresponseしなければならないです。&lt;/p&gt;&lt;p&gt;javaだとresponsebodyアノテーションを設定してstring値にリターンすることと同じ意味です。&lt;/p&gt;&lt;p&gt;これからactionメソッドからajax値を受け取りましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;controllerを追加します。ajaxcontrollerを追加してajaxデータを生成します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=857&quot; data-filename=&quot;001.png&quot; style=&quot;width: 420px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=858&quot; data-filename=&quot;002.png&quot; style=&quot;width: 396px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でjson_encodeの関数はarrayをjson形式に変換する関数です。参考にobjectタイプはjsonタイプに変換しません。&lt;/p&gt;&lt;p&gt;java(gson)やc#(newton)はライブラリに提供しますが、phpの場合は内部関数で提供します。phpの長所は細かい内部関数が多いことです。別にライブラリがなくてもプログラムを立ち上げることで無理がありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、ソースに戻してhomeのindexのビューでjavascriptでajaxを呼出す関数を作って確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=861&quot; data-filename=&quot;003.png&quot; style=&quot;width: 774px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ajaxから「/ajax/index」を呼出します。ajaxcontrollerのindex関数が呼ばれます。&lt;/p&gt;&lt;p&gt;jsonタイプで要求しています。idがdataのオブジェクトにはjsonのdataの値を、data1のオブジェクトにはjsonのdata1の値を入れました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;actionメソッドのリターン値で許すデータはnullと$this-&amp;gt;response値だけです。その以外のデータはエラーが発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうするとcontrollerのactionとテンプレートのファイル名はいつも一致しなければならないかと考えるとそうじゃありません。&lt;/p&gt;&lt;p&gt;なぜならその結果は似てるなビューページがある時、例えば掲示板のサイトで追加、修正ページの場合はページ形が似ているがそうするとviewページを２つに作成して一つはコピーするという意味になります。&lt;/p&gt;&lt;p&gt;でもcakeフレームワークにはビューページを選択できるようにrenderという関数があります。&lt;/p&gt;&lt;p&gt;other関数をみるとrender関数を利用してindex.ctlページを呼出すように設定しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=860&quot; data-filename=&quot;004.png&quot; style=&quot;width: 406px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;actionメソッドとviewファイル名は必ず一致しなくてもいいという意味になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=859&quot; data-filename=&quot;005.png&quot; style=&quot;width: 754px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のajaxの例を同じ結果になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでphpのcakeからajax要請がある時、jsonタイプ(json_encode関数)でresponseする方法とcontrollerでviewを選択する方法に関する説明でした。&lt;/p&gt;&lt;p&gt;ご不明なところや間違いところがあればコメントしてください。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/160.html</guid><pubDate>Tue, 11 Feb 2020 20:15:22 +0900</pubDate></item><item><title>[CakePHP] MVCフレームワークのCakeをインストールする方法</title><link>https://www.nowonbun.com/159.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今まで、reflectionやspl_autoload_register、smarty、.htaccessなどを説明しましたが、それは全てphpのmvcフレームワークを構成するための準備作業だと言えます。&lt;/p&gt;&lt;p&gt;cakeとはphp側で有名なフレームワークです。javaだとspring、c#だとmvc frameworkと似ているな概念のmvcフレームワークです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://cakephp.org&quot; target=&quot;_blank&quot;&gt;https://cakephp.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;大勢方がcakeフレームワークがどんなフレームワークより使いやすいし、様々機能があってセキュリティやデータ管理などが強いといいますが、個人的にjavaとc#のフレームワークに馴れているからかな、以外に複雑ですね。&lt;/p&gt;&lt;p&gt;実はこの投稿を作成しながらもずいぶん迷ういました。一応、目標として、インストールまで完了してブラウザに「hello world」を出力することで始まります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cakeフレームワークを使うためにはいくつかのモジュールを設定(extension)しなければならないです。&lt;/p&gt;&lt;p&gt;php.iniを確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=849&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の３つのモジュールのコメント(;)を解除されていることを確認しなければならないです。&lt;/p&gt;&lt;p&gt;解除されているのを確認したらcomposerでcakeフレームワークをダウンロードしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/138.html&quot; target=&quot;_blank&quot;&gt;[php] composer設定&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=856&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合は一回ダウンロードした状況なので「loading from cache」で表示されます。初めにダウンロードするとライブラリが少しありますので、時間がかかります。&lt;/p&gt;&lt;p&gt;フォルダを見ればappフォルダがあることを確認できます。私の場合はrootで作業するつもりなのでappフォルダにあるファイルを全てrootフォルダに移動します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=839&quot; data-filename=&quot;003.png&quot; style=&quot;width: 270px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして.githubフォルダとappフォルダは必要ないので削除しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=845&quot; data-filename=&quot;004.png&quot; style=&quot;width: 398px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてcakeフレームワークもビューのテンプレートがありますが、我々はsmartyテンプレートに変わりましょう。&lt;/p&gt;&lt;p&gt;(cakeのテンプレートは別にphpスクリプトファイルと差がないです。)&lt;/p&gt;&lt;p&gt;composer.jsonのrequireにsmartyライブラリを追加しましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/156.html&quot; target=&quot;_blank&quot;&gt;[php] phpのコーディング領域とデザイン領域を分離するテンプレートライブラリ smarty&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=847&quot; data-filename=&quot;005.png&quot; style=&quot;width: 741px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのあとでcomposer updateをしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=848&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでcakeフレームワークを使うための準備は完了しました。使う前に簡単な構造的な説明と初期設定に関して調べましょう。&lt;/p&gt;&lt;p&gt;フォルダ構造をみれば主に使うフォルダは「config」、「src」、「webroot」フォルダがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=844&quot; data-filename=&quot;007.png&quot; style=&quot;width: 367px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;configフォルダはcakeフレームワークの設定ファイルがあるところです。route設定やデータベース接続設定などがあります。&lt;/p&gt;&lt;p&gt;srcフォルダはcontroller(仕様ソース)とmodelソース、viewソースがあるところです。&lt;/p&gt;&lt;p&gt;webrootフォルダはjavascriptファイル、cssファイルなどのファイルがあります。response側のrootはwebrootに設定されています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;configフォルダにroutes.phpファイルあります。&lt;/p&gt;&lt;p&gt;routes.phpはrequestによってcontrollerクラスを呼出すクラスです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=853&quot; data-filename=&quot;008.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;初期設定は「/」に要請されている場合、controllerはpages、actionは「display」に設定されています。つまりcontrollerはpagescontrollerを割当てしてactionでdisplay関数を呼出すことです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=850&quot; data-filename=&quot;009.png&quot; style=&quot;width: 744px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合は上のroutesを少し変更します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=851&quot; data-filename=&quot;010.png&quot; style=&quot;width: 753px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;既存のソースは全てコメントしました。$_serverからrequest urlを受け取ってディレクトリパターンによってcontrollerとactionの呼出す部分を修正しました。&lt;/p&gt;&lt;p&gt;上のパターンはc#のmvc frameworkを真似しましたが、他のパターンにしてもよいです。&lt;/p&gt;&lt;p&gt;controllerとactionの基本値は「home」、「index」になっています。でも「localhost/pages/get」に要請があればconnect関数を利用してpagescontollerのget関数を呼出します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからhomecontrollerクラスを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=852&quot; data-filename=&quot;011.png&quot; style=&quot;width: 421px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=842&quot; data-filename=&quot;012.png&quot; style=&quot;width: 424px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のindexクラスはウェブブラウザから「localhost/」や「localhost/home/index」に要請するとroutes関数が呼ばれます。&lt;/p&gt;&lt;p&gt;routes関数からhomecontollerのindex関数を呼出します。&lt;/p&gt;&lt;p&gt;index関数でset関数してビューにdataキーで「hello world」値を格納します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからcontrolからviewを呼出してビューを作成しなければならないです。&lt;/p&gt;&lt;p&gt;controllerを探す関数で「routes」ならviewを探す関数は「appview」クラスがあります。&lt;/p&gt;&lt;p&gt;appviewクラスは「src/view」フォルダにあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=855&quot; data-filename=&quot;013.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;イメージではeclipseのエラーがありますが、eclipseのphp解析機能のバグなので無視してもよいです。&lt;/p&gt;&lt;p&gt;appviewはcontrollerからviewを呼出す前にデータ設定する部分です。&lt;/p&gt;&lt;p&gt;既存cake templateからsmartyに変更しました。&lt;/p&gt;&lt;p&gt;これからviewソースを修正しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;viewソースはtemplateフォルダの中にあります。一応、そのまま使うとエラーが発生します。&lt;/p&gt;&lt;p&gt;なぜなら、cake templateで作成しているからです。先にlayoutのページを修正しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=843&quot; data-filename=&quot;014.png&quot; style=&quot;width: 650px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このレイアウトはc#のマスターページと同じ概念です。htmlファイルが作成されることはマスターページが呼ばれて中にviewのページが入ることの形です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;viewページ作成します。&lt;/p&gt;&lt;p&gt;templateフォルダにhomeフォルダがありません。なのでhomeフォルダから生成して「index.ctp」ファイルを生成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=846&quot; data-filename=&quot;015.png&quot; style=&quot;width: 404px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;index.ctlにはcontrollerから渡してもらった「data」をviewで作成するようにコードを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=841&quot; data-filename=&quot;016.png&quot; style=&quot;width: 789px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで設定したらブラウザ画面にhello worldをでるように準備が終わりました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ブラウザに「localhost」のurlで接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=840&quot; data-filename=&quot;017.png&quot; style=&quot;width: 604px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;画面上に「hello world」が表示されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は設定してないurlで接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=854&quot; data-filename=&quot;018.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「/test」に接続するとページがないというメッセージが表示します。上のページはcake templateの画面ですが、$dataforview[&quot;error&quot;]のnullチェックで既存cake template画面がでるように設定したことです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://github.com/yukikikuchi/cakephp3-smartyview&quot; target=&quot;_blank&quot;&gt;https://github.com/yukikikuchi/cakephp3-smartyview&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これから一つずつcakeを分析してしましょう。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/159.html</guid><pubDate>Fri, 7 Feb 2020 03:00:02 +0900</pubDate></item><item><title>[PHP] 自動require及びincludeをする方法(spl_autoload_register)</title><link>https://www.nowonbun.com/158.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;全樹でrequireとincludeに関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/148.html&quot; target=&quot;_blank&quot;&gt;[php] requireとinclude、そして「@」の使用方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;筆者が考えてphpでプログラミングする時に、一番不便なことがrequireとinclude宣言です。&lt;/p&gt;&lt;p&gt;小さいプロジェクトならそんなに不便とは感じられない可能性もありますが、大きいプロジェクトなら様々なところでクラスを呼出すし関連ページを全て呼び出さなければならないので、すごく大変になるでしょう。&lt;/p&gt;&lt;p&gt;javaやc#の場合はパッケージ単位、namespace単位で宣言します。それでもソースの上にimportやusingキーワードが多くなることがあります。&lt;/p&gt;&lt;p&gt;まして、クラス単位であるphpページならすごく多くなるでしょう。&lt;/p&gt;&lt;p&gt;筆者は以前に参加したプロジェクトでrequireだけで何百行目になったことも見たことがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これを解決する関数で「spl_autoload_register」ということがあります。実はこの関数はphp 5.3から提供していますが、筆者の場合は「7.0」から認識しました。&lt;/p&gt;&lt;p&gt;それで以前にはphpの場合はパッケージ管理が難しいという認識がありましたが、実はそれじゃなかったんです。やはり、ソースパフォーマンスや可読性は開発者の能力の違いですね。言語は以前から提供しましたが。。。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.spl-autoload-register.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.spl-autoload-register.php&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=837&quot; data-filename=&quot;001.png&quot; style=&quot;width: 424px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=838&quot; data-filename=&quot;002.png&quot; style=&quot;width: 736px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば、ページの中でクラスだけあるファイルは「.class.php」の拡張子で作成しました。これは標準規約じゃなく、私が楽に区分するように決めた規則です。&lt;/p&gt;&lt;p&gt;ソースでspl_autoload_registerの関数以外にはincludeやrequireがありません。でもclass1をインスタンス生成する時(newで割当て)、spl_autoload_registerの関数が呼出してclass1.class.phpファイルを読み込みます。&lt;/p&gt;&lt;p&gt;ここでinclude_onceで読み込みましたので重複読み込みはありません。class1クラスはextendsキーワードでabstractclassを経書しました。それで「abstractclass.class.php」ファイルも読み込みました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;class2.class.phpの場合は、「abstractclass.class.php」を読み込んだことがあるので、再読み込みはしません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;htmlページではrun関数を呼出しました。run関数では派生クラスのgetdata関数を呼出しますね。&lt;/p&gt;&lt;p&gt;それでclass1の場合は「this is class1」、class2の場合は「this is class2」という結果が表示されます。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/158.html</guid><pubDate>Wed, 5 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] 匿名関数(ラムダ式)とクロージャ(closure)</title><link>https://www.nowonbun.com/157.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はphpの匿名関数(ラムダ)とクロージャに関して調べてみました。&lt;/p&gt;&lt;p&gt;匿名関数は既存phpで宣言した「function methodname($param)」の形じゃなく、「function($param)」という関数名がないことです。関数名がないというのは一回性の関数で「javascript」とコールバック関数とにみたいな流れの関数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=835&quot; data-filename=&quot;001.png&quot; style=&quot;width: 473px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればruntest関数に２つのメソッド名がないメソッドを渡します。この関数では「$add」と「$substract」に結果を渡すための一回性の関数です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クロージャとは「java」と「c#」、「javascript」のクロージャと同じ概念です。クロージャと言うのは関数内部じゃないところで宣言した変数を関数の中で使えることです。&lt;/p&gt;&lt;p&gt;実際にメモリ上では別のメモリ領域なので共有ができないですが、ソース上でメモリを共有するような機能になっています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=836&quot; data-filename=&quot;002.png&quot; style=&quot;width: 650px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば$message変数に「hello」という値を入力しました。各匿名関数「$example1」と「$example2」を作成しました。&lt;/p&gt;&lt;p&gt;$example1の関数では「$message」変数を参照するとエラーが発生します。エラー内容は宣言してない変数使用ということになっています。&lt;/p&gt;&lt;p&gt;なぜなら$messageの変数は$example1関数外で宣言したものからです。でも、$example2では$messageを使いますね。&lt;/p&gt;&lt;p&gt;useキーワードを利用して関数外の変数を使えるようにしたからです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/functions.anonymous.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/functions.anonymous.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/closure&quot; target=&quot;_blank&quot;&gt;https://www.php.net/closure&lt;/a&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/157.html</guid><pubDate>Tue, 4 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] PHPのコーディング領域とデザイン領域を分離するテンプレートライブラリ Smarty</title><link>https://www.nowonbun.com/156.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今まで、我々はphpを作成する時にphpコードとhtmlコードを混ぜて作成しました。&lt;/p&gt;&lt;p&gt;簡単な仕様ならhtmlデザインパートとスクリプトパートが一緒にあるから楽かも知りませんが、少し複雑になるし大きくなるとソースコードが複雑になるでしょう。&lt;/p&gt;&lt;p&gt;昔はphpにもクラス概念がある前には単一ページ作成方法(phpスクリプトとhtmlコードが混在)でよく作成しました。(必ずそのことではないけど、普通はそうだったです。)&lt;/p&gt;&lt;p&gt;最近はhtmlタグ構成、cssスタイルコード、javascriptコードも複雑になってその上でphpコードまであるとすごく複雑なソースことになるでしょう。&lt;/p&gt;&lt;p&gt;開発する時に可読性は重要な部分なので、その時にはスクリプトコードとhtmlコードを分ける必要があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;java(spring)やc#(mvc)にはmvcモデルのフレームワークがあります。mvcモデルとはmodel(オブジェクト)、view(htmlデザイン)、controller(ロジック)を分けて作成する方法です。&lt;/p&gt;&lt;p&gt;phpにもcakeというmvcモデルがあります。でも、cakeにもコントロールとビューが分けていますが、ビューがphpコードになっているので、完全な分離だと思いません。&lt;/p&gt;&lt;p&gt;それでphpにはテンプレートフレームがありますが、それがsmartyとtwigです。&lt;/p&gt;&lt;p&gt;筆者はtwigよりsmartyが手に慣れているので、smartyを使っています。smartyとtwigは使用方法が全然違うテンプレートですが、パフォーマンスや概念は似ています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.smarty.net/&quot; target=&quot;_blank&quot;&gt;https://www.smarty.net/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;smartyを利用するためにcomposerでsmartyをダウンロードしましょう。&lt;/p&gt;&lt;p&gt;repository - &lt;a href=&quot;https://packagist.org/packages/smarty/smarty&quot; target=&quot;_blank&quot;&gt;https://packagist.org/packages/smarty/smarty&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=831&quot; data-filename=&quot;001.png&quot; style=&quot;width: 643px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=830&quot; data-filename=&quot;002.png&quot; style=&quot;width: 427px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;eclipseのexplorerでたまにエラーマークが表示される時があります。実際にエラーではないので気にしなくてもよいです。eclipseがphpソースを完全に解読できないらしいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=833&quot; data-filename=&quot;003.png&quot; style=&quot;width: 795px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;index.phpファイルでsmartyクラスを宣言してテンプレートディレクトリ設定をします。キャッシュ設定もありますが、しなくても構いません。&lt;/p&gt;&lt;p&gt;その後、smartyインスタンスでdisplay関数で「index.tpl」ファイルを読み込みます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=832&quot; data-filename=&quot;004.png&quot; style=&quot;width: 439px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpファイルでhtmlテンプレートファイルを読み込んでresponseするのは理解しました。&lt;/p&gt;&lt;p&gt;そうするとphpのデータ値をテンプレートに渡す方法とsmarty文法に関して確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=834&quot; data-filename=&quot;005.png&quot; style=&quot;width: 478px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpからsmartyテンプレートに値を渡す時にはasign関数を利用するとできます。上の例は変数を２つを渡しました。&lt;/p&gt;&lt;p&gt;titleの変数はstringタイプでdataのタイプはクラスオブジェクトタイプで渡しました。&lt;/p&gt;&lt;p&gt;tplページをみればstringタイプの場合はそのまま表示すると表示できます。オブジェクトの場合はphpの中のオブジェクト参照方法みたいにやじるしで参照します。&lt;/p&gt;&lt;p&gt;foreachとif文法の使用方法もあります。&lt;/p&gt;&lt;p&gt;foreachの場合、fromでイタレーション配列を入れ、一つのデータをitemで取得します。&lt;/p&gt;&lt;p&gt;ifの場合はgetdata3から取得したデータがブール値です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;smarty文法に関しては下記のホームページから説明しています。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.smarty.net/docs/ja/&quot; target=&quot;_blank&quot;&gt;https://www.smarty.net/docs/ja/&lt;/a&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/156.html</guid><pubDate>Sun, 2 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] Reflection - Variable編</title><link>https://www.nowonbun.com/155.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述でreflectionのclassとmethodを扱う方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;http://www.nowonbun.com/153.html&quot; target=&quot;_blank&quot;&gt;[php] reflection - class編&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;http://www.nowonbun.com/154.html&quot; target=&quot;_blank&quot;&gt;[php] reflection - method編&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflection機能はプログラムを動的に実装するように使うこともありますが、テストのために使うこともあります。&lt;/p&gt;&lt;p&gt;特にreflectionの変数を扱うことではクラスのメンバー変数に直接に参照と修正ができるのでそれぞれのテストケースを作ってunitテストが可能です。&lt;/p&gt;&lt;p&gt;その話はコンパイルが可能なjavaとc#の話です。phpはコンパイルが必要ないスクリプト言語なので、実は私の考えではreflectionのvariable機能はそんなに必要が無いと思います。&lt;/p&gt;&lt;p&gt;クラスのデータの流れを確認するようにはvar_dump関数を利用するとprivateデータまでよくみえるからもっと使うところがないと思いますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通はクラスを作れば変数はprivateに設定するほうが基本コーディング規約です。なので、privateタイプの変数にデータを格納、取得することだけ知れば良いと思います。&lt;/p&gt;&lt;p&gt;上の例をみれば、exclassの中で「data」のメンバー変数はprivateに設定されています。まず、そのデータを取得するようにexclassのインスタンスを生成します。&lt;/p&gt;&lt;p&gt;getproperty関数で変数のオブジェクトを取得してsetaccessible関数で「private」のアクセス修飾子を無効化します。&lt;/p&gt;&lt;p&gt;bodyタグの中でgetvalueを利用してobjのインスタンスのdata変数を取得して出力します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=829&quot; data-filename=&quot;001.png&quot; style=&quot;width: 495px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;取得しましたから今回は格納してみましょう。&lt;/p&gt;&lt;p&gt;上の例はインスタンスをreflectionで生成したことじゃなく、newキーワードで生成しました。普通の文法ならインスタンスを「new」で生成します。&lt;/p&gt;&lt;p&gt;getvalueでメンバー変数を取得できたら、setvalueではデータが格納できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=828&quot; data-filename=&quot;002.png&quot; style=&quot;width: 456px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果はexclassのdata変数は「change」という値に変更されたことを確認できます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/class.reflectionproperty.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/class.reflectionproperty.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionまで纏めて説明しました。次の投稿からは.htaccessと上のreflectionを利用してapache+php環境でmvcパターンを構成しようと思います。&lt;/p&gt;&lt;p&gt;phpでmvcモデルに作成が出来たら、javaやc#みたいにプロジェクト管理がしやすくなると思います。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/155.html</guid><pubDate>Sat, 1 Feb 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] Reflection - Method編</title><link>https://www.nowonbun.com/154.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述でreflectionでクラス&amp;lt;を探してインスタンスを生成する方法、インスタンスの中で変数や関数を探す方法まで説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/153.html&quot; target=&quot;_blank&quot;&gt;[php] reflection - class編&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はreflectionを利用してクラスで関数を探して実行する方法まで調べてみます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=823&quot; data-filename=&quot;001.png&quot; style=&quot;width: 547px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=824&quot; data-filename=&quot;002.png&quot; style=&quot;width: 424px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=825&quot; data-filename=&quot;003.png&quot; style=&quot;width: 496px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果をみればquery stringのパラメータによって呼出す関数を違うし結果も別で表示されます。&lt;/p&gt;&lt;p&gt;もし、reflectionがなければ下記とおりに作成したと思います。&lt;/p&gt;&lt;p&gt;ここでexclassのクラスの関数が仕様によって増えると考えば「if ~ else」も増えますよ。上の場合は簡単な例なので差をそんなに体感されないですが、拡張的に考えたらもっと複雑なプログラムならすごく複雑なロジックになるでしょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflection機能でこの関数を動的に呼出すだけではないです。関数がpublicではないアクセス修飾子も呼出すことができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=826&quot; data-filename=&quot;005.png&quot; style=&quot;width: 579px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば「test2」と「test3」関数はpublicではなく、privateやprotectedに設定されています。&lt;/p&gt;&lt;p&gt;そうすると基本的にクラス外部では呼出すことができません。でも、reflectionの「setaccessible」関数を利用してアクセスができるように設定して呼出しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=827&quot; data-filename=&quot;004.png&quot; style=&quot;width: 833px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpの場合はクラスのメソッドのオーバーロード（同じメソッド名にパラメータのタイプと個数で関数を区別すること）がありません。&lt;/p&gt;&lt;p&gt;それで特にreflectionでメソッドを検索する時にパラメータのタイプや個数の情報はいらないです。invoke関数を呼び出す時にパラメータの数が一致しないとエラーが発生するため、パラメータの検証が必要になる場合があります。&lt;/p&gt;&lt;p&gt;phpの場合は別に変数の型がないので、変数名と個数で検証処理をすれば良いと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/class.reflectionmethod.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/class.reflectionmethod.php&lt;/a&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/154.html</guid><pubDate>Fri, 31 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[CSS] 整列スタイル (float)</title><link>https://www.nowonbun.com/130.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;html中で基本的にタグが優先でウェブページを作りますが、タグだけでは画面スタイルで要素配置が限界があります。&lt;/p&gt;&lt;p&gt;タグ以外のもっと動的な配置するようには「float」のスタイルを利用してもっと綺麗に配置ができます。&lt;/p&gt;&lt;p&gt;上の例をみれば「p」タグの幅が「40%」で、「1」の「p」タグ隣に「2」の「p」タグがあることまで十分に予想できます。&lt;/p&gt;&lt;p&gt;「3」の「p」タグの位置ですが、普通なら「1」の「p」タグの下にあることが正常です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=689&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;でも、実際には「1」タグ隣に「2」、「3」の「p」タグがあります。&lt;/p&gt;&lt;p&gt;なぜ、その結果になるかというと「float」タグのことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の「p」タグを「float」設定をすべて「left」に設定します。上、右からテトリスになると思ったらよいです。&lt;/p&gt;&lt;p&gt;「1」番が右に先に整列します。「2」番を整列します。「3」番は「2」番の下に空間があるので、そこで表示します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;同じく下に「4」番のことに置くとどのようになるか？&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=688&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「1」番の下に「4」番が置くことになります。でも上の例は私が「3」番の高さを「40px」に設定しますね。&lt;/p&gt;&lt;p&gt;「1」番と「4」番の間が余白がなりました。ここで「1」番の下に余白なしで置く仕方はないかな。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=692&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「1」番と「2」番の「p」タグは「float」が「left」でしたが、「3」、「4」番は「right」に変更しました。&lt;/p&gt;&lt;p&gt;つまり、「3」番からテトリスが上、左に変わることですね。なので「3」、「4」番が上の例みたいになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通は「float」要素を「left」、「right」を混在して使わないです。&lt;/p&gt;&lt;p&gt;「float」がポータルでダッシュボードのウィジェットを作ることでよく使うスタイルですが、逆にスタイルを崩れやすいのでサイズをよく考えながら使わなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=691&quot; data-filename=&quot;004.png&quot; style=&quot;width: 731px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「float」を使いながら解除したいときには「clear:both;」タグで解除ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=690&quot; data-filename=&quot;005.png&quot; style=&quot;width: 729px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「4」と「5」番の「p」タグは「clear: both」タグで「float」を解除しました。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/130.html</guid><pubDate>Fri, 31 Jan 2020 00:13:16 +0900</pubDate></item><item><title>[PHP] Reflection - Class編</title><link>https://www.nowonbun.com/153.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionは以前javaとc#でも説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/34.html&quot; target=&quot;_blank&quot;&gt;[c#] reflection(リフレクション)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/68.html&quot; target=&quot;_blank&quot;&gt;[java] reflection - class編&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionとはプログラム構造を投影して再構築する方法のプログラム技法です。&lt;/p&gt;&lt;p&gt;その意味は我々がクラスを「$obj = new class()」形で宣言しますが、その宣言するクラスを動的宣言方法で使いたいことです。&lt;/p&gt;&lt;p&gt;つまり、パラメータで「aタイプのクラスを宣言して」というデータがあればaタイプクラスを、「bタイプのクラスを宣言して」というとbタイプのクラスを宣言することです。&lt;/p&gt;&lt;p&gt;上の例はreflectionではなく、我々がよく知っている形でクラスを宣言した方法です。パラメータでaを受取るとaクラスを宣言するしbを受取るとbクラスを宣言します。&lt;/p&gt;&lt;p&gt;普通だし、問題ないプログラムコーディングですが、もしクラスがaクラス、bクラスだけではなくたくさんある場合にはどうでしょうか？&lt;/p&gt;&lt;p&gt;後、プロジェクトが大きくなるほど上のパラメータが増えると言えばどうでしょうか？&lt;/p&gt;&lt;p&gt;その時には「$obj = new $type.class()」の形で作成したらどうかと思う時がありますね。&lt;/p&gt;&lt;p&gt;それがreflectionです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=820&quot; data-filename=&quot;001.png&quot; style=&quot;width: 489px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=821&quot; data-filename=&quot;002.png&quot; style=&quot;width: 523px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例ではパラメータから「type」を受け取ってreflectionを利用してクラスを宣言しました。&lt;/p&gt;&lt;p&gt;結果はブラウザのアドレスにquery stringの「type」に「a」を入れるとaclassのprintを呼出して「aclass」という結果が表示されました。&lt;/p&gt;&lt;p&gt;「type」に「b」を入れるとbclassのprintの関数で「bclass」の結果が表示されました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=822&quot; data-filename=&quot;003.png&quot; style=&quot;width: 492px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionの「getproperties」と「getmethods」の関数でクラス内部のメンバー変数と関数の構成を確認できます。&lt;/p&gt;&lt;p&gt;上の結果を見ると変数には「data」が表示するし、関数には「print」、「test」、「get」がみえます。&lt;/p&gt;&lt;p&gt;アクセス修飾子も関係ずにデータがすべてみえますね。でもアクセス修飾子の情報と関数の場合はパラメータ返却情報がないですね。&lt;/p&gt;&lt;p&gt;実はあるのに、私がまだ知らない状況の可能性もあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/class.reflectionclass.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/class.reflectionclass.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;reflectionに関して続けて調べてみます。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/153.html</guid><pubDate>Thu, 30 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[CSS] 位置(position),表示(display)スタイル</title><link>https://www.nowonbun.com/129.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述からcssのスタイルに関して纏めています。&lt;/p&gt;&lt;p&gt;今回は要素の表示タイプと位置(postision）に関して調べてみます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=687&quot; data-filename=&quot;001.png&quot; style=&quot;width: 582px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を見ればスタイルで「display」を使いました。&lt;/p&gt;&lt;p&gt;displayは要素のスタイルの形態を決めるものです。&lt;/p&gt;&lt;p&gt;displayの要素の値には下記とおりにあります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th&gt;値&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;inline&lt;/td&gt;        &lt;td&gt;要素をインライン要素（&amp;lt;span&amp;gt;など）として表示します。 高さと幅のプロパティは効果がありません。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;block&lt;/td&gt;        &lt;td&gt;要素をブロック要素（&amp;lt;p&amp;gt;など）として表示します。 新しい行から始まり、幅全体を占有します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;contents&lt;/td&gt;        &lt;td&gt;コンテナを非表示にし、要素の子要素をdomの次のレベルに上げます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;flex&lt;/td&gt;        &lt;td&gt;ブロックレベルのフレックスコンテナとして要素を表示します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;grid&lt;/td&gt;        &lt;td&gt;要素をブロックレベルのグリッドコンテナとして表示します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;inline-block&lt;/td&gt;        &lt;td&gt;要素をインラインレベルのブロックコンテナとして表示します。 要素自体はインライン要素としてフォーマットされますが、高さと幅の値を適用できます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;inline-flex&lt;/td&gt;        &lt;td&gt;要素をインラインレベルのフレックスコンテナとして表示します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;inline-grid&lt;/td&gt;        &lt;td&gt;要素をインラインレベルのグリッドコンテナとして表示します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;inline-table&lt;/td&gt;        &lt;td&gt;要素はインラインレベルの表として表示されます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;list-item&lt;/td&gt;        &lt;td&gt;要素を&amp;lt;li&amp;gt;要素のように動作させます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;run-in&lt;/td&gt;        &lt;td&gt;コンテキストに応じて、要素をブロックまたはインラインとして表示します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;table&lt;/td&gt;        &lt;td&gt;要素を&amp;lt;table&amp;gt;要素のように動作させます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;table-caption&lt;/td&gt;        &lt;td&gt;要素を&amp;lt;caption&amp;gt;要素のように動作させます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;table-column-group&lt;/td&gt;        &lt;td&gt;要素を&amp;lt;colgroup&amp;gt;要素のように動作させます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;table-header-group&lt;/td&gt;        &lt;td&gt;要素を&amp;lt;thead&amp;gt;要素のように動作させます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;table-footer-group&lt;/td&gt;        &lt;td&gt;要素を&amp;lt;tfoot&amp;gt;要素のように動作させます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;table-row-group&lt;/td&gt;        &lt;td&gt;要素を&amp;lt;tbody&amp;gt;要素のように動作させます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;table-cell&lt;/td&gt;        &lt;td&gt;要素を&amp;lt;td&amp;gt;要素のように動作させます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;table-column&lt;/td&gt;        &lt;td&gt;要素を&amp;lt;col&amp;gt;要素のように動作させます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;table-row&lt;/td&gt;        &lt;td&gt;要素を&amp;lt;tr&amp;gt;要素のように動作させます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;none&lt;/td&gt;        &lt;td&gt;要素は完全に削除されます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;initial&lt;/td&gt;        &lt;td&gt;このプロパティをデフォルト値に設定します。 初期について読みます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;inherit&lt;/td&gt;        &lt;td&gt;親要素からこのプロパティを継承します。 継承について読みます。&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;「div」タグは基本displayが「block」に設定されています。「block」の場合は「width」が基本「100%」です。&lt;/p&gt;&lt;p&gt;なので上の例では「display」を「initial」に設定して「width」を設定しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また「position」のスタイルは要素の位置を決めるものです。&lt;/p&gt;&lt;p&gt;基本的にhtmlタグはとキュメンとスタイルで上から下、左から右方法で作成します。でも要素によって位置を変わりたい時がありますね。その時に使います。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th&gt;値&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;static&lt;/td&gt;        &lt;td&gt;デフォルト値。 文書フローに表示されるように、要素は順番にレンダリングされます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;absolute&lt;/td&gt;        &lt;td&gt;要素は最初に配置された（静的ではない）親要素に対して配置されます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;fixed&lt;/td&gt;        &lt;td&gt;要素はブラウザウィンドウに対して相対的に配置されます。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;relative&lt;/td&gt;        &lt;td&gt;要素は通常の位置を基準にして配置されるため、「left：20px」は要素の左位置に20ピクセルを追加します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;sticky&lt;/td&gt;        &lt;td&gt;要素は、ユーザーのスクロール位置に基づいて配置されます。&lt;br&gt;スティッキー要素は、スクロール位置に応じて、相対要素と固定要素を切り替えます。 ビューポートで指定されたオフセット位置が満たされるまで相対的な位置に配置されます-そして、（position：fixedのように）所定の位置に「固定」されます。&lt;br&gt;注：ie / edge 15以前ではサポートされていません。 -webkit-プレフィックス付きのバージョン6.1のsafariでサポートされています。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;initial&lt;/td&gt;        &lt;td&gt;このプロパティをデフォルト値に設定します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;inherit&lt;/td&gt;        &lt;td&gt;親要素からこのプロパティを継承します。&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;上の例は「absolute」で設定しました。「div」の親要素は「body」なので、画面の一番上、左、基準で「top」が「100px」、「left」が「100px」を設定します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「position」と「display」はよく使わないみだいですが、たくさん使うしすごく大事なスタイル設定です。&lt;/p&gt;&lt;p&gt;特に「display」で「none」設定を利用して見えたり、見えなかったりする動的な設定を作ることができるし、「position」で「fixed」や「absolute」を設定してメニューの位置を決めるし動的に動くこともできます。&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;例&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;style&gt;  .test:hover {    display:none;  }.table-responsive table td:nth-child(1),.table-responsive table th:nth-child(1){  white-space:nowrap;}&lt;/style&gt;&lt;div style=&quot;height:40px;&quot;&gt;&lt;input type=&quot;button&quot; class=&quot;test&quot; value=&quot;これをクリックできますか？&quot; onclick=&quot;alert(&apos;まじで？&apos;);&quot;&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;上の例はマウスをボタンの上に置くとhoverの選択子によって「display」を「none」に設定します。&lt;/p&gt;&lt;p&gt;つまり、マウスを上に置くとボタンがなくなりますね。お試してください。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/129.html</guid><pubDate>Wed, 29 Jan 2020 22:58:35 +0900</pubDate></item><item><title>[PHP] エラーページ処理方法(追加: ob_cleanとdie関数使用方法)</title><link>https://www.nowonbun.com/152.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述でphpでエラーメッセージを処理する方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/147.html&quot; target=&quot;_blank&quot;&gt;[php] fatal及びnotice,、warningメッセージ処理する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを開発する時にはこのエラーメッセージは重要です。エラーメッセージを見て間違ったことを修正するし、予想以外が発生することを確認しなければならないです。&lt;/p&gt;&lt;p&gt;でも、本番のサービスは違います。実際にインタネット上でエラーが発生することだと思えばログではエラーを残るけれども、画面上ではみえないようにしなければならないです。&lt;/p&gt;&lt;p&gt;一番、いい条件は初めからエラーが発生しないことがよいですが、全てのユーザの行動パターンを予測できないし作業者のミスや様々な条件で、エラーが必ず発生します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので、本番でエラーメッセージが見えることは実際にエラーメッセージでシステム情報や見えたらためな情報が見える可能性もあるし、ユーザがみて完成になれなかったことで見えるのでユーザによってサイトの信頼感が落ちることになります。&lt;/p&gt;&lt;p&gt;サイト内でエラーが発生するとエラーページに遷移しなければならないですが、その設定を「.htaccess」で設定可能です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/151.html&quot; target=&quot;_blank&quot;&gt;[php] 分散設定ファイル(.htaccess) 使用方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://ja.wikipedia.org/wiki/http%e3%82%b9%e3%83%86%e3%83%bc%e3%82%bf%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%89&quot; target=&quot;_blank&quot;&gt;httpステータスコード&lt;/a&gt;&lt;/p&gt;&lt;p&gt;(エラーコードをみながらみると理解しやすいです。)&lt;/p&gt;&lt;p&gt;上のエラーは我々がよく知っている「404」エラーに関して対応しました。404エラーはウェブページで当該なページが無い場合に発生することです。&lt;/p&gt;&lt;p&gt;先「.htaccess」をみれば「404」エラーが発生すると「/error?code=404」にrewriteします。&lt;/p&gt;&lt;p&gt;また、rewriteruleによって「index.php?htaccess=error&amp;amp;code=404」に変換して遷移します。index.phpの中でエラーがある場合にエラーコードによってページを読み込んで画面に掲示します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=817&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;imageフォルダ中で実際に「test」ファイルは存在しません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=816&quot; data-filename=&quot;002.png&quot; style=&quot;width: 431px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので「404」エラーが発生します。&lt;/p&gt;&lt;p&gt;上の例はサーバ上でエラーが発生したことで、ソース内部でエラーが発生する時の処理です。&lt;/p&gt;&lt;p&gt;上の例はパラメータがnullかどうかでエラーが表示されるように実装しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=818&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果はdataのパラメータに「1」というデータを入れるとhttp statusが200になりますね。200は正常です。&lt;/p&gt;&lt;p&gt;ウェブページも「1」という結果が表示されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=819&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の結果はdataのパラメータにnullをいれる(何も入力してない状況)と「404」エラーになります。&lt;/p&gt;&lt;p&gt;上のソースで「response_error」関数に404のデータを入力したから「404error」ページが表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでphp組込関数として「ob_clean」と「die」関数を使いました。&lt;/p&gt;&lt;p&gt;phpは「&lt;!--?hp ?--&gt;」領域の以外にはhtmlマークで作成します。&lt;/p&gt;&lt;p&gt;そのhtmlマークはサーバからresponseする時バッファにstringタイプで格納していますよ。なので途中でincludeやphp計算式でバッファにbodyデータを書き込むと上から順番処理で格納されることです。&lt;/p&gt;&lt;p&gt;そのバッファをクリアする関数がob_cleanです。つまり、htmlタグをたくさん書いてもphpファイルの一番下に「ob_clean」を呼出すと空ページが表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「die」の場合は意味としてはエラーが発生するらしいな関数ですが、実は「die」が呼出したところで処理を止まって画面に表示するという意味です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.ob-clean.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.ob-clean.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/die&quot; target=&quot;_blank&quot;&gt;https://www.php.net/die&lt;/a&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/152.html</guid><pubDate>Wed, 29 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] 分散設定ファイル(.htaccess) 使用方法</title><link>https://www.nowonbun.com/151.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述まではブラウザでphpファイルを接続しようと思ったら「ホスト名+ファイル名」で接続しました。つまり「index.php」ファイルを作成したら「http://localhost/index.php」で接続しました。&lt;/p&gt;&lt;p&gt;そのままにウェブサービスを開始しても問題ないですが、phpファイルでクラスだけあるファイルなら空ページが見えるし、ウェブサービス側のディレクトリが漏れるのでセキュリティに考えては良くないです。&lt;/p&gt;&lt;p&gt;そうしたら直接にファイルを接続する方法ではなく、c#のmvcみたいにアドレスのディレクトリだけでphpを接続できるような設定ファイルがありますが、それが分散設定ファイル(.htaccess)です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://httpd.apache.org/docs/2.4/en/howto/htaccess.html&quot; target=&quot;_blank&quot;&gt;https://httpd.apache.org/docs/2.4/en/howto/htaccess.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先に分散設定ファイルを使うように「.htaccess」の構造に関してしらべましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=808&quot; data-filename=&quot;001.png&quot; style=&quot;width: 400px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のイメージみたいにファイル名はなしで拡張子だけ「.htaccess」に生成しましょう。&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;options -multiviews&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;このオプションはrequestデフォルト要請設定と関係があります。要請urlがルート(root)、つまり「ホスト名/」で要請すると「index.php」や「index.html」を探す機能です。&lt;/p&gt;&lt;p&gt;そのデフォルトページは「httpd.conf」に設定しています。&lt;/p&gt;&lt;p&gt;「options +multiviews」にすると当該な機能が設定されますが、「options -multiviews」にするとデフォルトページを探さないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;rewritebase /&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;rewritebaseはサーバのルート(root)ディレクトリを設定することです。&lt;/p&gt;&lt;p&gt;基本的に「httpd.conf」で設定されている「documentroot」でルートに設定されていますが、フレームワークによって下位ディレクトリに設定する場合に設定することです。&lt;/p&gt;&lt;p&gt;上の例では詳細していますが、詳細した場合は「httpd.conf」に設定しているままで動きます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;rewriteengine on&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;rewriteengine onは既存のurlパス構造を再構成してurlからデータを受取ることです。&lt;/p&gt;&lt;p&gt;例で「localhost/index.php?idx=1」のurl要請があります。&lt;/p&gt;&lt;p&gt;index.phpページにget方式のidxパラメータに1を入れるという意味です。&lt;/p&gt;&lt;p&gt;でも、rewriteengine on設定すれば「index.php」が「index.php」のページを開く意味ではなく、rewriteruleによって意味が変わります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;options -indexes&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;options -indexesの場合は要請ページがなければディレクト構造を見えるように設定することです。&lt;/p&gt;&lt;p&gt;このオプションが省略するか「options +indexes」に設定した場合に要請ページがないとディレクト構造が見えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=810&quot; data-filename=&quot;002.png&quot; style=&quot;width: 398px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;imageフォルダにno_photo.pngファイルを入れてブラウザで「localhost/image」を接続すると下記の結果になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;##003##&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;rewritecond&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;rewritecondは下のrewriteruleのurl再設定になるようなフィルタの役です。&lt;/p&gt;&lt;p&gt;つまり、「.htaccess」ファイルで上から下の方向で処理しますが、rewritecondの結果がtrueになると「rewriterule」で反映するし、falseになると再設定なしで、urlアドレスままで読み込むことです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;例えば、すべてのurlのはrewriteruleによって再設定するが、「phpinfo.php」ファイルだけ「rewriterule」を再設定しなずに、そのまま「localhost/phpinfo.php」にしたいと思うと下記とおりに設定になります。&lt;/p&gt;&lt;p&gt;rewritecondのパラメタはサーバ変数、正規表現になります。&lt;/p&gt;&lt;p&gt;使用可能なサーバ変数は下記のapacheマニュアルを参照してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond&quot; target=&quot;_blank&quot;&gt;http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond&lt;/a&gt;&lt;/p&gt;&lt;p&gt;様々な変数がありますが、筆者もすべて使ったことがありません。普通は「request_filename」と「request_url」が全てです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;request_uriの場合は要請されたurlのアドレス構成要素(例：/index.html)でgetの方法のquery stringは省略されます。&lt;/p&gt;&lt;p&gt;つまり、「localhost/test.php?data=123」で要請されると「/test.php」に表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;request_filenameの場合は要請したurlと一致するファイルのパス及びスクリプトの全体ローカルパスです。&lt;/p&gt;&lt;p&gt;request_filenameの場合は検査式で正規表現ではなく、「-d」、「-f」、「-l」で表現しますが、「-d」はディレクトリ、「-f」はファイルの意味になります。&lt;/p&gt;&lt;p&gt;上の例で「request_uri」でphpinfo.phpをフィルタしましたが、「rewritecond %{request_filename} !-f」でオプションを追加すると「phpinfo.php」ファイルが存在する場合にfalseになります。&lt;/p&gt;&lt;p&gt;でも、この場合は特定なphpファイルだけではなく、すべてのphpファイルがフィルタに対象なので、少し意味が違いますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;rewriterule&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;rewriteruleとは分散設定ファイルで一番重要な要請urlを最高性することです。&lt;/p&gt;&lt;p&gt;例えば、「localhost/123」ということで要請されると「localhost/index.php?index=123」みたいに要請ルールを変更することです。&lt;/p&gt;&lt;p&gt;再構成しよう正規表現のパターンで分けるパターンの値が$1,$2,$3でデータが分けます。&lt;/p&gt;&lt;p&gt;例えば、「^/([0-9]{4})([0-9]{2})/(.*)$」の式で作成すると「$1」は「([0-9]{4})」の「0かる9のデータで４桁」、「$2」は「([0-9]{2})」の「０から9のデータで2桁」、「$3」すべての文字列の設定になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;後、「qsa,l」を付ける意味ではパラメタの変換ルールですが、?data=123のquery stringがある場合に「htaccess=test&amp;amp;data=123」に変更することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の設定を反映するようにはhttpd.confでmod_rewrite.soのモジュールを追加しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=811&quot; data-filename=&quot;004.png&quot; style=&quot;width: 746px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その後、documentrootの権限でallowoverrideをnoneからallに修正します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=812&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;documentrootフォルダに「.htaccess」ファイルを作成しましょう。&lt;/p&gt;&lt;p&gt;サブフォルダ(image)に「.htaccess」ファイルを作成しましょう。&lt;/p&gt;&lt;p&gt;.htaccessのファイルはフォルダ別で設定ができますが、rootに「.htaccess」ファイルがあっても上の「image」フォルダに「.htaccess」にいれると「localhost/image/...」には分散設定が再設定になります。&lt;/p&gt;&lt;p&gt;つまり、javascript(js)やスタイルシート(css)、イメージなどはディレクトリを生成して「.htaccess」を別に作成して設定すると「html」の中で設定される「link」を使うことができます。&lt;/p&gt;&lt;p&gt;そして「index.php」で「.htaccess」を設定を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=814&quot; data-filename=&quot;006.png&quot; style=&quot;width: 652px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は私が「localhost/helloworld」で接続しました。内部で「index.php/htaccess=helloworld」に変換されます。&lt;/p&gt;&lt;p&gt;imageフォルダの場合は「image/.htaccess」によってファイルを読み込みました。「index.php?htaccess=image/no_photo.php」に呼ばれなかったです。&lt;/p&gt;&lt;p&gt;その理由は「image」フォルダの「.htaccess」が反映されたからです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=813&quot; data-filename=&quot;007.png&quot; style=&quot;width: 654px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は私が「localhost/data.php」で接続したことです。parameterが「data.php」に変換したことを確認できますね。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://httpd.apache.org/docs/2.2/en/howto/htaccess.html&quot; target=&quot;_blank&quot;&gt;https://httpd.apache.org/docs/2.2/en/howto/htaccess.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://stackoverflow.com/questions/15850845/request-exceeded-the-limit-of-10-internal-redirects-due-to-probable-configuratio&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/15850845&lt;/a&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/151.html</guid><pubDate>Tue, 28 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] データベース(mariaDB)を連結して使う方法</title><link>https://www.nowonbun.com/150.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブサービスを開発すると思ったら当たり前にデータベースも使います。もちろん、データを必ずデータベースを使うことではなく、バイナリやエクセルなどでもデータを管理してウェブサービスを立ち上げられます。&lt;/p&gt;&lt;p&gt;でも、データベースよりデータ管理しやすいものでは無いので、データベースをほとんど使うと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データベースの種類としてはoracleやsql server(mssql)、mysql、postgreなど様々な種類がありますが、ここではmariadb(mysql)を使います。&lt;/p&gt;&lt;p&gt;mysqlのインストールは省略します。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/109.html&quot; target=&quot;_blank&quot;&gt;[ubuntu] mariadb(mysql)をインストールする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/106.html&quot; target=&quot;_blank&quot;&gt;[centos] mariadb(mysql)をインストール&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://mariadb.org/&quot; target=&quot;_blank&quot;&gt;window用ダウンロード&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;sqlクエリは各キーワードは差がありますが、概念は同じです。&lt;/p&gt;&lt;p&gt;phpでデータベースを使うようにはphp.iniを修正しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=804&quot; data-filename=&quot;001.png&quot; style=&quot;width: 431px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;php.iniの中で「extension=mysqli」がありますが、この部分のコメント(;)を除いてapacheを再起動します。&lt;/p&gt;&lt;p&gt;そしてphpinfo()で確認すると「mysqli」がロードされたことを知ることができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=807&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一応、phpからデータ取得するソースを実装するため、データベースにデータを挿入しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=806&quot; data-filename=&quot;003.png&quot; style=&quot;width: 473px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;データを作成しました。上のデータをphpからデータを取得しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=805&quot; data-filename=&quot;004.png&quot; style=&quot;width: 508px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpからデータベースを接続するようにはmysqli_connectでコネクションを作ります。データベースコネクションはioのコネクションみたいにリソースなので最後には必ずリソース返却(close)しなければならないです。&lt;/p&gt;&lt;p&gt;コネクションを作った後、データベースを選択します。クエリでは「use データベース」と同じです。&lt;/p&gt;&lt;p&gt;そして「mysqli_query」関数でクエリを送るし結果を受け取ります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この例ではmysqli_fetch_assoc関数を使っていますが、mysqli_fetch_rowでも受け取ることが出来ます。&lt;/p&gt;&lt;p&gt;これは一般配列か、連関配列かの差ですが、mysqli_fetch_rowで一般配列(数字で探索)で結果を受け取られるし、mysqli_fetch_assocはカラム名のキーで連関配列で結果を受け取られます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpでは連関配列でも一般配列みたいに数字でデータを取得することができるので、両方使える条件ならmysqli_fetch_rowよりmysqli_fetch_assocがいいじゃないかと思われます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;sqlコネクションはリソースなのでclose関数でリソースしなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.mysqli-connect.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.mysqli-connect.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/mysqli.select-db.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/mysqli.select-db.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/mysqli.query.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/mysqli.query.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/mysqli-result.fetch-assoc.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/mysqli-result.fetch-assoc.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/mysqli.close.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/mysqli.close.php&lt;/a&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/150.html</guid><pubDate>Fri, 24 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] IOに関して</title><link>https://www.nowonbun.com/149.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;i/oとはinput/outoutという意味ですが、プログラムでi/oというとファイル入出力という意味になります。&lt;/p&gt;&lt;p&gt;プログラムを作成してみればpropertyという環境ファイルを読み取りする時もあるし、クライアントにファイルを転送するために読み込む時もあります。&lt;/p&gt;&lt;p&gt;逆にプログラム上でログやデータをデータベースではなく、ファイルで格納するしブラウザからファイルをアップロードされ、ファイルを書き込む時もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=799&quot; data-filename=&quot;001.png&quot; style=&quot;width: 712px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして同じフォルダにある「data.txt」ファイルを読み取ります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=798&quot; data-filename=&quot;002.png&quot; style=&quot;width: 368px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで「data.txt」ファイルには改行がありますが、ウェブページには一行目で表示されます。参考にウェブブラウザは改行が「&amp;lt;br /&amp;gt;」タグなので、バイナリの「\r\n」や「\n」はブラウザで改行されません。&lt;/p&gt;&lt;p&gt;fopenはファイルコネクションを生成してファイルを開いてfreadでファイルを読み取りします。&lt;/p&gt;&lt;p&gt;最後にfcloseで必ずリソースを返却しなければならないです。そうではなければプログラム上でi/oリソースをずっと使用中になるので、他のセッションで使えなくなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpはスクリプトなのでrequest&amp;amp;response単位でリソースを自動に返却しますが、プログラムパフォーマンスのため、使用が終わったらすぐリソースを返却しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はファイルを書き込みしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=800&quot; data-filename=&quot;003.png&quot; style=&quot;width: 476px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=801&quot; data-filename=&quot;004.png&quot; style=&quot;width: 295px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;初めにファイルを読み取る時にはfopen関数でパラメータを「r」を使いました。また、書き込む時には「a」を使いました。&lt;/p&gt;&lt;p&gt;上のパラメータはファイルのコネクションのタイプを選べることです。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;モード&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;r&lt;/td&gt;		&lt;td&gt;読み取り専用。ポインタは最初です。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;r+&lt;/td&gt;		&lt;td&gt;読み取り + 書き込み。ポインタは最初です。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;w&lt;/td&gt;		&lt;td&gt;書き込み専用。 ファイルは初期化になります。ファイルが存在しないなら作成します。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;w+&lt;/td&gt;		&lt;td&gt;読み取り + 書き込み。ファイルは初期化します。ファイルが存在しないなら作成します。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;a&lt;/td&gt;		&lt;td&gt;書き込み専用。ポインタは最終です。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;a+&lt;/td&gt;		&lt;td&gt;読み取り + 書き込み。ポインタは最終です。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;x&lt;/td&gt;		&lt;td&gt;書き込み専用。ポインタは最初です。ファイルが存在するとエラーが発生します。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;x+&lt;/td&gt;		&lt;td&gt;読み取り + 書き込み。「ｘ」と同じモードです。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;c&lt;/td&gt;		&lt;td&gt;書き込み専用。ポインタは最初です。このモードで作成した内容は書き直しではなく、文字列が追加する。(テストの結果は書き直すけど。。。)&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;c+&lt;/td&gt;		&lt;td&gt;読み取り + 書き込み。「c」と同じモードです。&lt;/td&gt;      &lt;/tr&gt;	  &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e&lt;/td&gt;		&lt;td&gt;開いているデスクリプタで「close-on-exec」フラグを設定しべきです。posix.1-2008互換性のあるシステムでコンパイルされたphpでのみ使用することができます。&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;マニュアルをみれば、様々なモードオプションがありますね。でも、筆者は「r,w,a」しか使わないので実は他の機能はよくしりません。&lt;/p&gt;&lt;p&gt;「+」表示があるので、読み取り、書き込みを同時に使えますが、筆者の考えは良くないです。特に「r+」で作成したらポインタが最初になるので内容が追加されることではなく、書き直しになります。&lt;/p&gt;&lt;p&gt;仕様によってポインタを移動して書き直しすることもあると思いますが、ほとんど予想されない結果になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのため、簡単に読み取りは「r」、新しく書き込むは「w」、既存ファイルから内容を追加は「a」を使う方がシンプルで使いやすいです。&lt;/p&gt;&lt;p&gt;上の例はブラウザからファイルをアップロードしたら格納するソースです。ここにはモードオプションで「b」が付けています。&lt;/p&gt;&lt;p&gt;「b」という意味はバイナリですが、ファイルからバイナリを読み取ってバイナリまま書き込みすることです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=802&quot; data-filename=&quot;005.png&quot; style=&quot;width: 356px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=803&quot; data-filename=&quot;006.png&quot; style=&quot;width: 737px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイルアップロードができました。参考に実際のプログラミングする時にアップロードしたファイルをそのままサーバに書き込むのはセキュリティとして危ないです。&lt;/p&gt;&lt;p&gt;「.php」ファイルをアップロードしてそのphpファイルにサーバ情報などが出力するようにするとハッキングの危険性があるのでです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その後、アップロードファイルがバイナリではなく、ただのテキストファイルならバイナリタイプではなく、テキストタイプでも問題ないです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.fread.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.fread.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.fopen.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.fread.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.fwrite.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.fwrite.php&lt;/a&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/149.html</guid><pubDate>Thu, 23 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] Fatal及びNotice,、Warningメッセージ処理する方法</title><link>https://www.nowonbun.com/147.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを開発する時に様々なエラーが発生することがあります。それでtry〜catchを利用してエラー処理をしますが、開発する時に全てのユーザケースを考えることも大変だし、try~catchでも処理ができなくphp側のエラーが発生する時があります。&lt;/p&gt;&lt;p&gt;例えば、ページincludeやrequireする時ですね。&lt;/p&gt;&lt;p&gt;また、phpはエラーではなくてもwarningやnoticeメッセージが出る時もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=781&quot; data-filename=&quot;001.png&quot; style=&quot;width: 632px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=782&quot; data-filename=&quot;002.png&quot; style=&quot;width: 624px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例は1から0で割り算をするとエラーが発生することと$data1の場合はデータ宣言もしなかったのに出力しようと実装したから発生したメッセージです。&lt;/p&gt;&lt;p&gt;(上と下の結果の差はxdebugを設定したかどうかの差です。)&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/146.html&quot; target=&quot;_blank&quot;&gt;phpでxdebugを設定する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;開発中でエラーが発生するとエラーメッセージが出るのは当たり前ですが、サービスのproduction(本番)でエラーの詳細情報がでるのはngですね。エラーメッセージだけではなく、noticeやwaringもngですね。&lt;/p&gt;&lt;p&gt;そのメッセージが画面上で表示されないような方法です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;php.iniで設定する方法&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;php.iniファイルをメモ帳で開くとerror_reportの領域があり、e_allで設定されています。e_allの意味は全てもメッセージを表示する設定です。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;エラーレベル&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_all&lt;/td&gt;        &lt;td&gt;すべてのメッセージと警告&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_error&lt;/td&gt;        &lt;td&gt;致命的なエラー&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_recoverable_error&lt;/td&gt;        &lt;td&gt;ほぼ全てエラー&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_warning&lt;/td&gt;        &lt;td&gt;警告&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_parse&lt;/td&gt;        &lt;td&gt;コンパイル単位のエラーphpのdllの関数のエラー&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_notice&lt;/td&gt;        &lt;td&gt;noticeレベルのメッセージ&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_strict&lt;/td&gt;        &lt;td&gt;noticeレベルのメッセージ、phpの以前バージョンの関数で新バージョンのおすすめ(?)のメッセージ&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_core_error&lt;/td&gt;        &lt;td&gt;php起動エラー&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_core_warning&lt;/td&gt;        &lt;td&gt;php起動警告&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_compile_error&lt;/td&gt;        &lt;td&gt;コンパイル単位のエラー&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_compile_warning&lt;/td&gt;        &lt;td&gt;コンパイル単位の警告&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_user_error&lt;/td&gt;        &lt;td&gt;ユーザエラー(サーバ内の権限関係)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_user_warning&lt;/td&gt;        &lt;td&gt;ユーザ警告(サーバ内の権限関係)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_user_notice&lt;/td&gt;        &lt;td&gt;ユーザnotice(サーバ内の権限関係)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_deprecated&lt;/td&gt;        &lt;td&gt;現在バージョンで使わない関数エラー&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;e_user_deprecated&lt;/td&gt;        &lt;td&gt;現在バージョンで使わないユーザエラー&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=788&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで全てのメッセージがでないようにするのは「0」を入力したらよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=786&quot; data-filename=&quot;004.png&quot; style=&quot;width: 565px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=783&quot; data-filename=&quot;005.png&quot; style=&quot;width: 542px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも仕様によって違いますが、noticeだけ表示しないようにするとビット演算子を使って「e_all &amp;amp; ~e_notice」で入力したらよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=787&quot; data-filename=&quot;006.png&quot; style=&quot;width: 642px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;全てのメッセージは出るけどnoticeは出ないという意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=785&quot; data-filename=&quot;007.png&quot; style=&quot;width: 641px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;phpページでメッセージを設定する方法&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;phpファイルの上の部分でerror_reporting関数を利用して設定できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=784&quot; data-filename=&quot;008.png&quot; style=&quot;width: 556px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考にエラーページに設定するのは全てのページに設定しべきです。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/147.html</guid><pubDate>Wed, 22 Jan 2020 20:37:23 +0900</pubDate></item><item><title>[PHP] requireとinclude、そして「@」の使用方法</title><link>https://www.nowonbun.com/148.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムプロジェクトを管理するようにはディレクトリやファイルの構成を設定することも重要な部分です。&lt;/p&gt;&lt;p&gt;例えば、javaの場合はパッケージネームがディレクトリ構造でクラス名とファイル名を一致させておいてクラスを早く探せるように設定します。&lt;/p&gt;&lt;p&gt;c#の場合もnamespaceがディレクトリ構造でクラス名がファイル名と一致させます。&lt;/p&gt;&lt;p&gt;上のルールは必ずではないけど、できれば守らなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpの場合は.phpがウェブページなのでクラス名とファイル名を一致することで少し難しい部分があります。でも、できれば合わせることは将来に可読性のため必要です。&lt;/p&gt;&lt;p&gt;そして、最近のプロジェクトは.phpで全開することではなく、.htaccessを利用してmvcモデルに構成するのでクラスようなファイル(.php)とビューファイル(.tpl)を分けることにしますね。&lt;/p&gt;&lt;p&gt;なので、phpもクラス名とファイル名、ディレクトリ名とnamespace名に分けることができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうしたら２つのウェブページを生成して一つのresponseに作りましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=789&quot; data-filename=&quot;001.png&quot; style=&quot;width: 424px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=790&quot; data-filename=&quot;002.png&quot; style=&quot;width: 491px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;index.phpファイルとextension.phpファイルを生成しました。index.phpファイルで「require」関数を利用してextension.phpファイルを読込みました。&lt;/p&gt;&lt;p&gt;extension.phpファイルはクラスしかないので、ブラウザで「localhost/extension.php」に接続しても空ページが表示されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;しかしindex.phpではextensionクラスを宣言してgetdata関数を呼出すので、「localhost/index.php」では結果が「hello world」が表示されますね。&lt;/p&gt;&lt;p&gt;そうすると「require」の使用方法に関しては理解しました。上のindex.phpで「require」キーワード代わりに「include」を入れても同じ結果ができます。&lt;/p&gt;&lt;p&gt;「require」と「include」の使用方法と結果は同じです。&lt;/p&gt;&lt;p&gt;でも、includeする時あるいはrequireする時にファイルがあるかどうかでエラーの差があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=791&quot; data-filename=&quot;003.png&quot; style=&quot;width: 424px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の場合はブラウザで「localhost/index.php」に接続するとエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=792&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;fatalエラーなのでスクリプト解析が止まるのでbodyにある「go!!」も文言が表示されないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=796&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;includeの場合はエラーではなく、警告(warning)ですね。なので、スクリプトが止まらないので、最後「go!!」メッセージまで表示されることを確認できます。&lt;/p&gt;&lt;p&gt;前述でエラーメッセージを設定する方法に関して説明したことがあります。warningメッセージなのでメッセージが見えないようにするとincludeで宣言したページがなくてもエラーメッセージが表示されなくて続けてページが処理します。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/147.html&quot; target=&quot;_blank&quot;&gt;[php] fatal及びnotice,、warningメッセージ処理する方法&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=793&quot; data-filename=&quot;006.png&quot; style=&quot;width: 486px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、エラーや警告の場合はただメッセージがでないように設定することで解決したことではないです。逆にエラーや警告を隠したら本当にエラーになる時に原因を調べることも難しいし、includeやrequireしたページが重要な部分だと思えばwarningだけではなく、requireで宣言してfatalのエラーが発生するようにした方が良いと思います。&lt;/p&gt;&lt;p&gt;その理由で「require」を使います。でも、「include」も必ずエラーではなく、動的要請する時には「include」が使います。&lt;/p&gt;&lt;p&gt;上の例はincludeページをget方式のパラメータで受け取ります。なので、ユーザから受取るパラメータで存在しないページがある可能性がありますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=795&quot; data-filename=&quot;008.png&quot; style=&quot;width: 421px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;extension1.phpファイルは存在しないので「it was not loaded」メッセージがでます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=794&quot; data-filename=&quot;007.png&quot; style=&quot;width: 505px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;パラメータがない場合はextension.phpファイルを読み込むので「it was loaded」がでますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でincludeを変わりにrequireを使うとfatalエラーが発生するので、上の処理ができないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで「@」を使いましたが説明します。&lt;/p&gt;&lt;p&gt;「@」の場合はページ内でwarningが発生する時にboolデータ(true or false)に受け取ります。&lt;/p&gt;&lt;p&gt;つまり、warningが発生すると「false」、warningが発生しないと「true」をリターンします。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;「@」マークの場合はphp内で宣言しない変数を参照することや0で割り算することやioのファイル読み込み中でファイルが存在しないことなどでwarningが発生しますが、その時に使うとよいキーワードです。&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;includeとrequireの場合は各include_onceがあるしrequire_onceがあります。&lt;/p&gt;&lt;p&gt;この意味はソースの中で一回に呼出したら次は読み込まないようにするキーワードです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=797&quot; data-filename=&quot;009.png&quot; style=&quot;width: 394px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例を見ればonceが付けるとincludeやrequireの関係しなずに、呼び出しした可否で読み込むか込まないかを決めます。&lt;/p&gt;&lt;p&gt;つまりrequireで読み出しても、include_onceには読み込まないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://andy-carter.com/blog/difference-between-include-and-require-statements-in-php&quot; target=&quot;_blank&quot;&gt;https://andy-carter.com/blog/difference-between-include-and-require-statements-in-php&lt;/a&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/148.html</guid><pubDate>Wed, 22 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] xDebug設定する方法</title><link>https://www.nowonbun.com/146.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述でphpでデバッグする方法に関して説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/144.html&quot; target=&quot;_blank&quot;&gt;[php] データ確認関数(var_dump, debug_zval_dump, print_r)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;普通、phpで開発する時にvar_dumpをよく使いますが、var_dumpやエラーが発生する時などのメッセージをもっと正確に分析してくれるライブラリのxdebugがあります。&lt;/p&gt;&lt;p&gt;これからxdebugのライブラリをインストールしましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;まず、phpinfoの関数でphpの環境設定に関して確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=772&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のphp環境設定のページをソースビューにしてソース全てをセレクトせいてコピーしましょう。(ctrl + c)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=778&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その後、下記のurlに接続してパッケージ検査をしましょう。&lt;/p&gt;&lt;p&gt;ダウンロードパッケージ検査 : &lt;a href=&quot;https://xdebug.org/wizard.php&quot; target=&quot;_blank&quot;&gt;https://xdebug.org/wizard.php&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=777&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その後でパッケージ情報が表示されますが、ダウンロードurlでxdebugライブラリがリンクされ、それを選択してダウンロードしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=780&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;(筆者の考えはphp環境設定情報でphpバージョンとタイプ(thread safeかthread unsafeか)を正確に分析するようにソースビューのデータをコピーペしたと思います。)&lt;/p&gt;&lt;p&gt;ダウンロードしたファイルをphpフォルダのextフォルダにコピーしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=779&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてphp.iniファイルを修正しましょう。&lt;/p&gt;&lt;p&gt;上のダウンロードしたページの3番をみればiniファイルの一番下に入れてください」と書いているのでコピーペすればよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=775&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてサーバを再起動してxdebugセッションがあることを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=776&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;xdebugがphp開発でどのように使うか確認しましょう。&lt;/p&gt;&lt;p&gt;上の例では$obj変数にtestクラスを宣言してbodyの領域でprint関数を呼出しています。&lt;/p&gt;&lt;p&gt;print関数ではtestクラスのdata変数の値を返却していますが、dataの変数は宣言してないです。エラーになるソースですね。&lt;/p&gt;&lt;p&gt;xdebugを設定する前には下記のイメージみたいに出力します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=771&quot; data-filename=&quot;008.png&quot; style=&quot;width: 755px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それがxdebugを設定する後は下記のイメージみたいに出力します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=773&quot; data-filename=&quot;009.png&quot; style=&quot;width: 517px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;call stack表示でどこでエラーが発生したかを追跡ができます。前よりもっと詳しい情報が出るので開発する時に楽になると思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実は初めxdebugを設定する理由はeclipseでデバック機能を付いて使おうと思いましたがeclipse側でエラーが発生しますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=774&quot; data-filename=&quot;010.png&quot; style=&quot;width: 364px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;原因はeclipseのバグだといいますが、私の場合は関連資料を調べても解決が出来ないです。もし知ってる方がいらっしゃったらお知らせてください。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://xdebug.org/&quot; target=&quot;_blank&quot;&gt;https://xdebug.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://wiki.eclipse.org/debugging_using_xdebug&quot; target=&quot;_blank&quot;&gt;https://wiki.eclipse.org/debugging_using_xdebug&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://yard.tistory.com/entry/eclipse-php-debug&quot; target=&quot;_blank&quot;&gt;https://yard.tistory.com/entry/eclipse-php-debug&lt;/a&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/146.html</guid><pubDate>Sat, 18 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] $_SERVER, $GLOBALS, $_GET, $_POST, $_REQUEST, $_COOKIE, $_SESSION, $_FILES, $_ENV(getenv())</title><link>https://www.nowonbun.com/145.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpのはウェブスクリプト言語です。ウェブサービスを立ち上がってウェブブラウザと連携すれば様々な情報をブラウザから受け取ります。&lt;/p&gt;&lt;p&gt;例えば、ウェブサービスの環境情報やブラウザからのrequest情報、セッション、クッキーなどの情報がありますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それをphpは「$_server, $globals, $_get, $_post, $_request, $_cookie, $_session, $_files, $_env(getenv())」の変数でサーバとクライアント間で発生した情報を取得するのができます。&lt;/p&gt;&lt;p&gt;上の変数を理解するようにはウェブ環境の理解が少し必要です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブとは簡単に考えるとウェブサーバとブラウザ間で非同期通信するプログラムです。ブラウザからurlのアドレスでウェブページをサーバに要請(request)するとサーバの場合はその要請によってhtmlファイルを作成してブラウザに応答(response)します。&lt;/p&gt;&lt;p&gt;すごくシンプルな形式でその以外のファイルはファイルサーバみたいにイメージやjavascriptファイル(.js)、style sheetファイル(.css)をダウンロードして、ブラウザで動作するし(javascript)、デザインを描画(styel sheet)、イメージを表示するなどの動作します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ブラウザからウェブサーバに要請するタイプは２つがあります。それはget方式とpost方式があります。getの場合はブラウザのurlの中でクエスチョンマークの区切りでデータをurlに付けサーバに要請するタイプです。&lt;/p&gt;&lt;p&gt;postの場合はデータをプロトコールのヘッダに含めて要請するタイプですね。&lt;/p&gt;&lt;p&gt;各サーバとブラウザにはプログラム実行中でデータを格納して使っていますが、ブラウザ側でデータを持っていることをクッキー(cookie)というし、サーバ側にデータを持っているのはセッション(session)といいます。&lt;/p&gt;&lt;p&gt;しかしブラウザ単位でどのセッションを使うかの設定はブラウザ側のクッキーの格納して要請するたびにセッションキーでサーバ側のセッションを持って来て使う流れで運用しています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;すごくシンプルに説明しましたが、詳細のは下記のところで確認してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://developer.mozilla.org/ja/docs/web/http/overview&quot; target=&quot;_blank&quot;&gt;https://developer.mozilla.org/ja/docs/web/http/overview&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$_server&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/reserved.variables.server.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/reserved.variables.server.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$_serverの変数ではサーバの環境設定に関するデータがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=758&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$_server変数をvar_dumpに確認するとデータが多いですね。&lt;/p&gt;&lt;p&gt;この中でよく使えるデータは「document_root」と「server_name」、「http_host」、「http_accept」などがありますね。特に「$_server[&quot;document_root&quot;]」の場合は物理的にサーバの中のファイルを読み出す時やphpファイルincludeなどをする時によく使います。&lt;/p&gt;&lt;p&gt;os情報があれば良いと思いますが、os情報はないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$globals&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/language.variables.superglobals.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/language.variables.superglobals.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$globalsは流れているセッションのステップで宣言されている全ての変数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=767&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の出力結果をみれば、$_serverのデータもあります。そして$dataとtestクラスを$objで宣言しましたので、それも$globalsの変数で確認できますね。&lt;/p&gt;&lt;p&gt;クラスのprivateの値まで確認できます。率直に全てのデータがみえる変数なのでセキュリティとしてはかなり危ない変数ですね。&lt;/p&gt;&lt;p&gt;この変数を間違って使用して本番ウェブサイトなどで出力されたらパスワードやサーバ情報が漏れになる可能性があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$globalsの変数は連関配列タイプなので$globals[&quot;data&quot;]みたいの形式でデータを読込みや書込みができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$_get&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/reserved.variables.get.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/reserved.variables.get.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$_getはブラウザからget方式で要請する時にパラメタ値を取得する変数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=755&quot; data-filename=&quot;003.png&quot; style=&quot;width: 509px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例でみるとブラウザのurlで「localhost/index.php?data=1&amp;amp;test=helloworld」で要請しました。&lt;/p&gt;&lt;p&gt;意味はlocalhostのホストサーバでindex.phpを要請します。後「?」の区切りでget方式のパラメタデータをサーバに送ることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;変数の区切りは「&amp;amp;」で「data」の値は「1」、「test」の値は「helloworld」になります。ここで注意点はgetのデータは全て文字列です。&lt;/p&gt;&lt;p&gt;つまり「data」の値が「1」ですが、数のデータの「1」ではなく、文字列としての「1」です。php側で定数値で使いたいならデータタイプ変換が必要です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$_post&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/reserved.variables.post.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/reserved.variables.post.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;要請方式でgetの場合はurlで含めて要請することならpostの場合はhttpプロトコールでデータ値を含めて要請することです。&lt;/p&gt;&lt;p&gt;ウェブでpostタイプで要請するのを再現したいなら「form」タグを生成してメソッドを「post」で設定します。「form」タグの中で「input」タグの値(value)をいれてサブミット(submit)するとpostタイプに要請します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=756&quot; data-filename=&quot;004.png&quot; style=&quot;width: 482px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=768&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば初めのイメージの結果はget方式でウェブサイトに接続しましたので、$_postの値がありません。テキストボックスにデータをいれてサブミットボタンを押下するとそのデータがpost形式でサーバに要請するのでデータが表示されることを確認できます。&lt;/p&gt;&lt;p&gt;postで変数名はinputのnameの属性で決めることになります。つまり、初めのテキストボックスはnameが「data」なので「data=1」、次は「test」なので「test=hello world」に転送します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$_request&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/reserved.variables.request.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/reserved.variables.request.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上で$_getと$_postを区分してデータを取得しましたが、$_requestはget、postと関係しずにパラメタデータを取得する変数です。&lt;/p&gt;&lt;p&gt;(phpマニュアルでは$_requestで$_cookieの値も出ると説明していますが、筆者が確認したところでcookieはでないですね。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=759&quot; data-filename=&quot;006.png&quot; style=&quot;width: 506px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のテキストデータで初めは「test」、２つめは「aaaa」のデータを入れてサブミットボタンを押下しました。&lt;/p&gt;&lt;p&gt;結果はgetデータ「data=1&amp;amp;test1=helloworld」とpostデータ「data=test&amp;amp;posttest=aaaa」にサーバに転送しますね。&lt;/p&gt;&lt;p&gt;$_requestのけっかは「data」の場合はgetとpostの両方データがありますが、postの値がありますね。getのtest1とpostのposttestがあります。&lt;/p&gt;&lt;p&gt;$_requestの場合は要請方法に関係しずにデータを読み込むのができるので楽だと思いますが、postの値をgetのパラメタで変調が可能にみえるのでセキュリティとしてはよくないですね。&lt;/p&gt;&lt;p&gt;筆者もpost、getを使うことが楽でrequest変数はよく使わないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$_cookie&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/reserved.variables.cookies.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/reserved.variables.cookies.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cookieやsessionを理解するようにはウェブ構造に関して調べなければならないです。ここではcookieとsessionの概念を知ることで説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ブラウザのcookieの値はgetやpostで要請する時にサーバ側に全てヘッダにつけて転送します。(ブラウザの仕様)なのでサーバ側にはクライアントのcookieの値を確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=764&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=763&quot; data-filename=&quot;008.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=766&quot; data-filename=&quot;009.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javascriptでcookie設定が可能ですが、そうするとプログラムが複雑になるので、一応ブラウザのapplicationタブでcookie設定ができるので、ブラウザで設定しました。&lt;/p&gt;&lt;p&gt;初めのページ要請する時にはcookieの値がなかったのでnullになりましたが、dataとtestのデータを入れたら$_cookieの変数でデータがあることを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$_session&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/reserved.variables.session.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/reserved.variables.session.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;server-clientのセッション間でブラウザ側に格納するデータはcookieだと思うとsessionはサーバ側に格納するデータです。&lt;/p&gt;&lt;p&gt;session値はブラウザ側のcookieにあるセッションキーによってサーバ側に格納します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=770&quot; data-filename=&quot;010.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=765&quot; data-filename=&quot;011.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpでsessionを使うようにはsession_start()関数を呼び出さなければならないです。session_start()関数はブラウザのcookieにセッションキーを与えてサーバ側でsessionデータを使えるように設定する役の関数です。&lt;/p&gt;&lt;p&gt;初めの結果イメージをみればresponseのヘッダで「set-cookie」にセッションキーが設定することをみれます。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.session-start.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.session-start.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それをウェブページを再要請するとsessionの「sessiontest」キーで「good job」のデータがあることを確認できます。&lt;/p&gt;&lt;p&gt;sessionの値はサーバ側でデータを削除するかsessionがexpireになるとなくなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$_files&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/reserved.variables.files.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/reserved.variables.files.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$_filesの場合はブラウザからファイルをアップロードする時にファイルの情報がある変数です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=757&quot; data-filename=&quot;012.png&quot; style=&quot;width: 542px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=760&quot; data-filename=&quot;013.png&quot; style=&quot;width: 737px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のタイプがfileに設定したinputオブジェクトにデータを設定してサブミットボタンを押下するとブラウザからウェブサーバにファイルをアップロードします。&lt;/p&gt;&lt;p&gt;実際にアップロードしたデータは$_files[&quot;tmp_name&quot;]で確認すると任意フォルダに格納されますが、そこからデータをファイルコピーやファイル移動すればよいです。&lt;/p&gt;&lt;p&gt;詳しい説明はphpのioを説明する時に詳細に調べます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;$_env&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/reserved.variables.environment.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/reserved.variables.environment.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$_envに関してマニュアルを確認すると環境変数の設定値がある変数だと説明していますが、自分の場合は「null」がでますね。&lt;/p&gt;&lt;p&gt;グーグルで調べてみますが、正確な情報がないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;マニュアルで$_envとgetenv()関数は同じ役で結果も同じだと書いていますが、getenv()は値があるのに$_envがnull理由を分からないですね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=769&quot; data-filename=&quot;014.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一応、個人情報がでるのでデータをブロックしましたが、ロカールのシステム環境変数データが表示されます。&lt;/p&gt;&lt;p&gt;環境変数データはシステム環境変数をいうことです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=762&quot; data-filename=&quot;015.png&quot; style=&quot;width: 493px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=761&quot; data-filename=&quot;016.png&quot; style=&quot;width: 457px;&quot;&gt;&lt;br&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/145.html</guid><pubDate>Fri, 17 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] データ確認関数(var_dump, debug_zval_dump, print_r)</title><link>https://www.nowonbun.com/144.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラムを開発する時にデータの流れを確認しなければならない時があります。その流れのポイントを取って確認する作業をデバッグと言います。&lt;/p&gt;&lt;p&gt;簡単なウェブページを作成することならデバッグなしでも値の流れを確認できて、作業ができるかもしれませんが、データベースからデータを検索して取得する流れだと思えば、データの中間でデータが上手く入れ込むか、上手く取得するかを確認することや、もし予想以外のデータがあり、途中で何が間違っているかの確認が必要な時がありますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaやc#の場合はいい開発ツール(ide)があり、breakpointでデータ追跡が可能ですが、phpの場合はスクリプト言語なので、デバックができるいい開発ツールがないと思います。&lt;/p&gt;&lt;p&gt;先にグーグルで検索してみたらzendstudioがありますね。まだ使ったことがないのでどうかなよく知りません。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.zend.com/en/downloads&quot; target=&quot;_blank&quot;&gt;https://www.zend.com/en/downloads&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今はphpのideツールではjavaでも使うideツールのeclipseを使っていますが、これがphpのデバックができないです。&lt;/p&gt;&lt;p&gt;正確に言うとできないことではないですが、筆者の場合は使ったことがないです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://xdebug.org/&quot; target=&quot;_blank&quot;&gt;https://xdebug.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://wiki.eclipse.org/debugging_using_xdebug&quot; target=&quot;_blank&quot;&gt;https://wiki.eclipse.org/debugging_using_xdebug&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://yard.tistory.com/entry/eclipse-php-debug-&quot; target=&quot;_blank&quot;&gt;https://yard.tistory.com/entry/eclipse-php-debug-&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=752&quot; data-filename=&quot;001.png&quot; style=&quot;width: 364px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私もデバックができるように設定してみましたが、結局失敗しました。&lt;/p&gt;&lt;p&gt;stack-overflowの説明とおりだと、eclipse自体にバッグがありそうですね。もし、できる方がいらっしゃいなら教えてください。&lt;/p&gt;&lt;p&gt;後でzendstudioで挑戦してみなければならないですね。(zendstudioが無料ではなく、有料です。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;筆者の場合は今までphpを開発する時に別にデバックをしながら開発したことではないです。今はeclipseが慣れているから使いますが、10年前はただnotepad++で開発しました。&lt;/p&gt;&lt;p&gt;phpはスクリプトなので、ソース修正が簡単だし、すぐ確認できるので「var_dump」の関数を利用して確認ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=753&quot; data-filename=&quot;002.png&quot; style=&quot;width: 377px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一応、文字がすごく小さく表示されますが、index.phpの8行目、intタイプの値が101ということで表示されますね。phpでデータタイプのことを別に気にしませんが、var_dumpではデータタイプも表示しますね。&lt;/p&gt;&lt;p&gt;筆者の場合は普通でvar_dumpを利用しますが、それと似ているな「debug_zval_dump」、「print_r」という関数もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=754&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればデータを確認することでは「var_dump」がみやすいですね。しかし「debug_zval_dump」、「print_r」も悪くなさそうなので、簡単に値を確認する状況なら使ってみるのも悪くないと思います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.var-dump.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.var-dump.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.debug-zval-dump.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.debug-zval-dump.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.print-r.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.print-r.php&lt;/a&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/144.html</guid><pubDate>Thu, 16 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] 例外処理(try ~ catch ~ finally)</title><link>https://www.nowonbun.com/143.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラミングで例外処理は重要です。例外処理はプログラムロジックで開発者が考えられなかったこと、ユーザから可笑しいデータを受け取ったものを処理する文法です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/24.html&quot; target=&quot;_blank&quot;&gt;[c# スタディ - 23] 例外処理(try〜catch,throwそしてfinally)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/59.html&quot; target=&quot;_blank&quot;&gt;[java スタディ - 19] 例外処理( try ~ catch)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;特に「php」で他の言語と差別性があることではないです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/language.exceptions.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/language.exceptions.php&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=750&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば、example関数は呼び出せたらthrowでexceptionが発生します。メインロジックで「try ~ catch ~ finally」の構文でtryの領域でexample関数を呼出します。&lt;/p&gt;&lt;p&gt;example関数ではexceptionで例外が発生して、catch領域に移動し、＄errormessageの変数にエラーメッセージのデータを入れます。&lt;/p&gt;&lt;p&gt;最終的に「try ~ catch」構文の関係なずに、finallyの領域に移動しますが、$checkデータを「1」を加算しますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;結果をみるとエラーメッセージと$checkの値が「1」になることを確認できます。&lt;/p&gt;&lt;p&gt;ここで確認ポイントはtry領域でexample()関数を呼出した後checkの変数が加算するところがありますが、example関数でエラーが発生しましたので、checkの加算は実施してないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的にthrowを発生すると処理インタラプトの「try ~ catch」に移動しますが、exceptionを継承してcatchを種類別で処理することもできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=749&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;example関数に「1」という値をいれて「myexception1」を発生する。&lt;/p&gt;&lt;p&gt;catchでは「myexception1」、「myexception2」、「exception」の例外を設定してエラー別で処理領域を分離しました。&lt;/p&gt;&lt;p&gt;結果をみれば「101」になりましたので、「myexcepion1」が呼び出せ、finallyの領域に移動したことを確認できますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参考で文字上の例で「myexception1」が設定してない場合は「exception」のエラーが発生されます。&lt;/p&gt;&lt;p&gt;「exception」の領域が一番上に設定すると区分なしですべてのエラーがexceptionに通るので、一番下に配置しなければならないです。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/143.html</guid><pubDate>Wed, 15 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[CSS] 範囲と指定に関する選択子(全体選択子、要素選択子、孫選択子、子選択子、隣接選択子)</title><link>https://www.nowonbun.com/124.html</link><description>&lt;p&gt;選択された要素の基準で隣接された要素や派生(下位)要素を選択する方法に関する記述です。&lt;/p&gt;&lt;p&gt;styleでアスタリスクマーク(*)はすべての要素を選択する方法です。すべての要素はfont-styleや基本padding、marginを設定する時に使いますが、すべての要素に反映があるのでよく使わない選択子です。&lt;/p&gt;&lt;p&gt;そしてstyle設定でタグあるいはidやclass、属性で要素を選択しますが、コンマ(,)を使えば複数選択も可能です。&lt;/p&gt;&lt;p&gt;例えば「p, div」といえばpタグとdivタグを選択することです。&lt;/p&gt;&lt;p&gt;そして孫選択子、子選択子の意味は孫選択子の場合、選択要素の中であるすべての派生タグをいうことで子選択子は選択した直下の派生タグを選択することです。&lt;/p&gt;&lt;p&gt;上の条件の構造でhtmlが作成したと思えば、aタグの孫要素は「b, c, d, e」タグになるし、子要素は「b, c」にあんることです。&lt;/p&gt;&lt;p&gt;つまり、「a d」の指定みたいに、aとd間にスペースを置くと、aタグの孫要素のdタグを選択することです。&lt;/p&gt;&lt;p&gt;子要素でみると「a &amp;gt; b &amp;gt; d」の選択子になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;隣接選択子で「+」を使用すれば同じレベルの要素で次(派生ではない)に配置された要素、つまり「b + c」で設定するえば「c」を選択することです。「b + f」の場合はbタグすぐあとで「f」タグがないので何も選択されない結果になります。&lt;/p&gt;&lt;p&gt;「~」の場合は「+」みたいに派生ではなく同じレベルの後で配置された要素ですが、すぐ後ろふくめすべての要素ですね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=751&quot; data-filename=&quot;001.png&quot; style=&quot;width: 674px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみれば初めは孫要素を選択するので.p1のh1と.p3のh3になります。でも.p2のh2の場合は.p2の子要素なので.p4のh2タグは当該事項ではありません。&lt;/p&gt;&lt;p&gt;~を使って+をつかったので先にクラスが.p1タグの後のdivタグの背景をすべて黄色に設定して、p1タグの次の要素を赤色に設定しますね。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/124.html</guid><pubDate>Tue, 14 Jan 2020 18:04:37 +0900</pubDate></item><item><title>[CSS] 属性選択子</title><link>https://www.nowonbun.com/120.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cssの選択子で一番良く使う選択子はタグによって、「id」によって(#id)、「class」によって(.class)が一番良く使う選択子で次がこの属性選択子ではないかと思います。&lt;/p&gt;&lt;p&gt;htmlタグではタグ名があるし、タグテキストがあります。そして属性(アトリビュート)がありますね。&lt;/p&gt;&lt;p&gt;css側で上の属性によって選択しましょう。&lt;/p&gt;&lt;p&gt;上の例は全て「input」タグが４つ、「a」タグが３つがありますね。&lt;/p&gt;&lt;p&gt;cssｍｐ属性選択子で選択してスタイルを付けましょう。&lt;/p&gt;&lt;p&gt;上の例をみればbodyの中でタグは全て７つがあります。inputタグは４つで、aタグが３つがあります。&lt;/p&gt;&lt;p&gt;属性選択子はブランケット([])で選択します。&lt;/p&gt;&lt;p&gt;上の通りで一番上のテキストボックスは枠が黒くなりますね。&lt;/p&gt;&lt;p&gt;２つ目のスタイルはボタンタイプのinputタグの枠が赤になります。&lt;/p&gt;&lt;p&gt;３つ目はvalue属性、つまり、値がsubmitを含めているボタンは枠が青になります。&lt;/p&gt;&lt;p&gt;４つ目はhrefの属性が「https」で始まる「a」タグの文字が緑になります。&lt;/p&gt;&lt;p&gt;５つ目はhrefの属性が「localhost」で終わる「a」タグの文字がグレーになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=668&quot; data-filename=&quot;001.png&quot; style=&quot;width: 365px;&quot;&gt;&lt;/p&gt;&lt;p&gt;属性選択子はcss selectorの中で良く使う選択子です。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/120.html</guid><pubDate>Tue, 14 Jan 2020 17:25:53 +0900</pubDate></item><item><title>[PHP] 配列とリスト(list)</title><link>https://www.nowonbun.com/142.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaやc#で配列とリスト(list)は別の文法です。array(配列)の場合はその個数を決めてデータを入れるし、配列の個数を減らしたり増えたりするのが出来ないです。&lt;/p&gt;&lt;p&gt;list(リスト)の場合は連結リストアルゴリズムでなっている構造でポインタを連携しながら追加したり削除したりする資料構造になっています。&lt;/p&gt;&lt;p&gt;phpではその配列とリストの区分が別に分けていることではなく、arraryで宣言してリストみたいに追加や削除ができる構造になっています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=744&quot; data-filename=&quot;001.png&quot; style=&quot;width: 592px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてphpには連関配列ということでマップやディクショナリみたいに使う配列があります。&lt;/p&gt;&lt;p&gt;連関配列は上の配列でインデックスの数代わりに文字を入れると連関配列になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=747&quot; data-filename=&quot;002.png&quot; style=&quot;width: 640px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで配列(リスト)の定義を確認しました。それでデータを追加や削除に関して確認しましょう。&lt;/p&gt;&lt;p&gt;関数としてはarray_pushとarray_pop関数があります。array_pushは配列のデータを続けて入れることです。つまり、上の例で[3]までデータを入れたら[4]にデータを入れることですね。&lt;/p&gt;&lt;p&gt;array_popは最後のデータ[4]までデータを入れたら[4]データをリターンして削除する関数です。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.array-push.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.array-push.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.array-pop.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.array-pop.php&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=748&quot; data-filename=&quot;003.png&quot; style=&quot;width: 594px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;array_popの場合は最後でデータを取り除きますが、最初のデータを取り除き関数(array_shift)もあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.array-shift.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.array-shift.php&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=745&quot; data-filename=&quot;004.png&quot; style=&quot;width: 587px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は配列の中でデータを入れる関数(array_splice)です。&lt;/p&gt;&lt;p&gt;array_spliceは一つのデータを入れることより、２つの配列を合わせることと同じです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.array-splice.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.array-splice.php&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=746&quot; data-filename=&quot;005.png&quot; style=&quot;width: 584px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その後、sort関数、extract関数、array_walk関数がありますが、sortの場合は整列、extractは抽出ですが、あまり使わないですね。&lt;/p&gt;&lt;p&gt;sortの場合はリストの数字の対象なので、クラスやオブジェクトタイプならsort関数を作らなければならないと思います。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.sort.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.sort.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.extract.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.extract.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/manual/en/function.array-walk.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/manual/en/function.array-walk.php&lt;/a&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/142.html</guid><pubDate>Tue, 14 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[CSS] Selector(選択子)</title><link>https://www.nowonbun.com/119.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cssでselectorというのはhtmlドキュメントにスタイルを付けるような指示子ということです。このselectorは単一のタグを設定も可能し、復讐のタグの設定も可能です。&lt;/p&gt;&lt;p&gt;そして、タグだけの指示だと特定タグを選択するのは大変ですが、アトリビュート、配列順番なのでも選択が可能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参照リンク - &lt;a href=&quot;https://www.w3schools.com/cssref/css_selectors.asp&quot; target=&quot;_blank&quot;&gt;https://www.w3schools.com/cssref/css_selectors.asp&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;css selectorを確認するように先にhtmlドキュメントを作成しましょう。&lt;/p&gt;&lt;p&gt;上のhtmlタグは普通のテーブルタグです。htmlタグを作成したことがある方なら構造がすく理解すると思いますね。&lt;/p&gt;&lt;p&gt;そうすると我々は「tbody」タグの１番の「tr」タグの１版「td」タグを選択したいならどうしましょうか？&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;簡単にタグで選択すると「table#test &amp;gt; tbody &amp;gt; tr:nth-child(0) &amp;gt; td:nth-child(0)」になります。&lt;/p&gt;&lt;p&gt;意味としてはtableのアトリビュートのiｄがtestのタグの直下派生のtbodyの直下派生のtrタグの０番目の直下派生のtdタグの0番目のタグを指しています。&lt;/p&gt;&lt;p&gt;複雑ですね。でもタグを指しる時にはこんなに細かく全てのタグ名を書く必要はないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=667&quot; data-filename=&quot;001.png&quot; style=&quot;width: 623px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;タグでスタイルを定義するのはそんなに難しくないですね。&lt;/p&gt;&lt;p&gt;それなら、css selectorに関して纏めます。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr&gt;        &lt;th&gt;選択子&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;.class&lt;/td&gt;        &lt;td&gt;class=”class”の全てのオブジェクトを選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;#id&lt;/td&gt;        &lt;td&gt;id=”id”のオブジェクトを選択(タグのidはページの雄一が仕様です。)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;*&lt;/td&gt;        &lt;td&gt;全体選択子全てのオブジェクトを選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;element&lt;/td&gt;        &lt;td&gt;要素選択子 - 指定した要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;element1,element2&lt;/td&gt;        &lt;td&gt;要素選択子 - 選択する要素を様々を指定(element1とelement2を選択)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;element1 element2&lt;/td&gt;        &lt;td&gt;子選択子 - 指定された親要素の指定された派生要素の全て要素を指定(element1の派生の全てelement2)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;element&amp;gt;element&lt;/td&gt;        &lt;td&gt;子選択子 - 指定された親要素の直下の派生要素だけ指定(elementの直下の派生element2)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;element+element&lt;/td&gt;        &lt;td&gt;隣接選択子 - 指定された要素と同じレーベルの次の要素を指定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;element1~element2&lt;/td&gt;        &lt;td&gt;element1要素の後である全てのelement2要素を指定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;[attribute]&lt;/td&gt;        &lt;td&gt;属性選択子 - 指定された属性を持っている全て要素を指定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;[attribute=value]&lt;/td&gt;        &lt;td&gt;属性選択子 - 指定された属性の値を持っている全ての要素を指定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;[attribute~=value]&lt;/td&gt;        &lt;td&gt;属性選択子 - 指定された属性に指定された値を含めている全ての要素を指定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;[attribute|=value]&lt;/td&gt;        &lt;td&gt;属性選択子 - 指定された属性の値が指定された値で始まる全ての要素を指定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;[attribute^=value]&lt;/td&gt;        &lt;td&gt;属性選択子 - 指定された属性の値が指定された値で始まる全ての要素を指定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;[attribute$=value]&lt;/td&gt;        &lt;td&gt;属性選択子 - 指定された属性が指定された値で終わる全ての要素を指定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;[attribute*=value]&lt;/td&gt;        &lt;td&gt;属性選択子 - 指定された属性値が指定された値を含めている全ての要素を指定&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:active&lt;/td&gt;        &lt;td&gt;全ての活性化になっている要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:after&lt;/td&gt;        &lt;td&gt;指定された要素の次を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:before&lt;/td&gt;        &lt;td&gt;指定された要素の前を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:checked&lt;/td&gt;        &lt;td&gt;全てのcheckedされた要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:disabled&lt;/td&gt;        &lt;td&gt;全てのdisabledされた要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:empty&lt;/td&gt;        &lt;td&gt;派生ノードがない要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:enabled&lt;/td&gt;        &lt;td&gt;全てのenabledされた要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:first-child&lt;/td&gt;        &lt;td&gt;指定された要素の初めの派生ノードを選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:first-letter&lt;/td&gt;        &lt;td&gt;指定された要素の初めの文字を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:first-line&lt;/td&gt;        &lt;td&gt;指定された要素の初め行を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:first-of-type&lt;/td&gt;        &lt;td&gt;指定された要素の初めの派生ノードの全ての要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:focus&lt;/td&gt;        &lt;td&gt;全てのフォーカスされた要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:hover&lt;/td&gt;        &lt;td&gt;マウスがhoverされた要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:in-range&lt;/td&gt;        &lt;td&gt;指定された範囲内の値で入力要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:invalid&lt;/td&gt;        &lt;td&gt;間違って値を持っている全ての入力要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:lang(language)&lt;/td&gt;        &lt;td&gt;指定された値の言語でされている要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:last-child&lt;/td&gt;        &lt;td&gt;指定された派生ノードの最後要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:last-of-type&lt;/td&gt;        &lt;td&gt;指定された要素の最後の派生ノードの全ての要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:not&lt;/td&gt;        &lt;td&gt;指定された要素がない要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:nth-child(n)&lt;/td&gt;        &lt;td&gt;指定された要素と同じレベルの(n)番目の要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:nth-last-child(n)&lt;/td&gt;        &lt;td&gt;指定された要素と同じレベルの後から(ｎ)番目の要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:nth-last-of-type(n)&lt;/td&gt;        &lt;td&gt;最後ノードから計算、親の２つ目に指定された要素の全ての要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:nth-of-type(n)&lt;/td&gt;        &lt;td&gt;親の２つ目に指定された要素の全ての要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:only-of-type&lt;/td&gt;        &lt;td&gt;親の雄一な指定された要素の全ての要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:only-child&lt;/td&gt;        &lt;td&gt;派生ノードが一つの要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:optional&lt;/td&gt;        &lt;td&gt;指定された必須属性がない要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:out-of-range&lt;/td&gt;        &lt;td&gt;指定された範囲外になっている入力要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:read-only&lt;/td&gt;        &lt;td&gt;読み取り専用の入力要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:read-write&lt;/td&gt;        &lt;td&gt;読み取り専用がない入力要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:required&lt;/td&gt;        &lt;td&gt;指定された必須属性の要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:root&lt;/td&gt;        &lt;td&gt;ドキュメントのルートの要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;::selection&lt;/td&gt;        &lt;td&gt;ユーザによって選択された要素の一部を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:target&lt;/td&gt;        &lt;td&gt;targetに指定された要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:valid&lt;/td&gt;        &lt;td&gt;有効な値を持っている全ての入力要素を選択&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;:visited&lt;/td&gt;        &lt;td&gt;訪問したページのリンクの要素&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;纏めてみると量がかなりありますね。部分的にセレクトの種類別で分けて例や詳しく説明します。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/119.html</guid><pubDate>Mon, 13 Jan 2020 13:59:26 +0900</pubDate></item><item><title>[PHP] インタフェースと抽象クラス、クラス継承、parent、this</title><link>https://www.nowonbun.com/141.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述でphpのclassを宣言して使う方法に関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/140.html&quot; target=&quot;_blank&quot;&gt;[php] functionとclass使用方法、アクセス修飾子、そしてstatic&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpもクラスがあるのでインタフェース(interface)と抽象クラス(abstract class)があります。&lt;/p&gt;&lt;p&gt;個人的な考えはphpにはデータタイプの指示子がないのでインタフェース役がコンパイル言語(javaやc#)より活用性が少ないではないかと思います。筆者も実際にphpでinterfaceを使ったことがないですね。&lt;/p&gt;&lt;p&gt;でも抽象クラスはよく使います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=743&quot; data-filename=&quot;001.png&quot; style=&quot;width: 543px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればitestインタフェースとabstract抽象クラスとtestクラスがあります。&lt;/p&gt;&lt;p&gt;依存層は「itest -&amp;gt; abstracttest -&amp;gt; test」でなっています。それでtestを宣言してrunを実行すればabstracttestのrunメソッドが実行してrunメソッド中では派生クラスの「print()」関数を呼び出す結果は「helloworld」になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでparentとthisの概念ですね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=742&quot; data-filename=&quot;002.png&quot; style=&quot;width: 543px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$thisの場合は実行しているクラスのメンバーをさしています。すなわち、メンバー変数か関数を指しています。$thisの場合はc++のポインタの形で矢印で指示(-&amp;gt;)をしています。&lt;/p&gt;&lt;p&gt;しかしparentの場合はparent::の形で指しています。&amp;amp;parent-&amp;gt;の形ではエラーが発生します。文法が面白いですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例はobj-&amp;gt;runを通ってabstracttestのrunが呼び出してrun関数で抽象メソッドprintが呼び出します。&lt;/p&gt;&lt;p&gt;抽象メソッドprintが呼び出したのでtestクラスのprintが呼び出してprint関数で上位クラスのsetdataにデータを入れてgetdataでデータを持ってきて変換する形です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私がデータを「hello world」を入れたので結果は「hello world」が出ます。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/141.html</guid><pubDate>Mon, 13 Jan 2020 03:00:00 +0900</pubDate></item><item><title>[PHP] functionとclass使用方法、アクセス修飾子、そしてstatic</title><link>https://www.nowonbun.com/140.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;phpは基本的にスクリプト言語なので、javascriptみたいに「function」と「class」を宣言しなくてもphpページを作ることができます。&lt;/p&gt;&lt;p&gt;でも、最近ウェブプログラムはデータベースからデータを読み込んでそのままにウェブサービスに書き出すことではなく、複雑な計算と様々なデータを総合的に見せるポータルプログラム形式が多いのでかなり複雑に作成することになります。&lt;/p&gt;&lt;p&gt;その時に単純にデータベースあるいはファイルなどからデータを読み込んで計算しながらウェブページに掲示すればプログラムがかなり複雑になるし再使用性がたくさん落ちることになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それでfunction(関数)やclass形式な構造が必要です。&lt;/p&gt;&lt;p&gt;先、functionの構造は「java」と「c#」みたいに返却タイプがあることではなく、「javascript」みたいにないですね。初めからphpは変数宣言する時もデータタイプを宣言することではないからだと思いますね。&lt;/p&gt;&lt;p&gt;「javascript」と似てるな構造になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=739&quot; data-filename=&quot;001.png&quot; style=&quot;width: 461px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpでクラスの構造は一般oopプログラムと似てます。メンバー変数があるし、関数がある構造になります。&lt;/p&gt;&lt;p&gt;ここでメンバー変数で「private」というアクセス修飾子を使いました。クラス内部の関数の場合はアクセス修飾子が必須ではないですが、メンバー変数には必ずアクセス修飾子が必要です。&lt;/p&gt;&lt;p&gt;アクセス修飾子は「private」、「protected」、「public」があります。「private」の場合はインスタント外部でアクセス禁止、「protected」の場合はインスタントの内部、派生クラスの関数だけでアクセスができます。「public」の場合はインスタントの外部、内部でとこでもアクセスができます。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;	&lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;区分&lt;/th&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;アクセス修飾子&lt;/th&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;  	&lt;tbody&gt;  		&lt;tr&gt;			&lt;td rowspan=&quot;3&quot; style=&quot;background-color:#c5fdfd;text-align:center;white-space: nowrap;&quot;&gt;アクセス権限&lt;/td&gt;  			&lt;td style=&quot;white-space: nowrap;&quot;&gt;public&lt;/td&gt;  			&lt;td&gt;すべてクラスでアクセスが可能です。&lt;/td&gt;  		&lt;/tr&gt;  		&lt;tr&gt;  			&lt;td style=&quot;white-space: nowrap;&quot;&gt;private&lt;/td&gt;  			&lt;td&gt;クラス内だけアクセスが可能です。&lt;/td&gt;  		&lt;/tr&gt;  		&lt;tr&gt;  			&lt;td&gt;protected&lt;/td&gt;  			&lt;td&gt;クラスと派生クラス関係のクラスによってアクセスが可能です。&lt;/td&gt;  		&lt;/tr&gt;  	&lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/51.html&quot; target=&quot;_blank&quot;&gt;[java スタディ - 11] アクセス修飾子&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/14.html&quot; target=&quot;_blank&quot;&gt;[c# スタディ - 13] アクセス修飾子(public, private, protected)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;関数の場合はアクセス修飾子が必須ではないですが、クラスのカプセル化で構成するようにはアクセス修飾子が必要です。&lt;/p&gt;&lt;p&gt;クラスのコンストラクタはjavaやc#みたいにクラスと同名で作成することではなく、__constructの関数名が定義されています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして関数の内でメンバー変数をアクセスするようには必ず「$this」のキーワードを使用して「$this-&amp;gt;変数名」でアクセスすればよいです。&lt;/p&gt;&lt;p&gt;phpには別に変数宣言方法がないので、「$this」を省略することになるとローカル変数になります。筆者もたまにミスする領域ですが、変数を間違って参照してバグが発生する時があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インスタンスを生成する時にはコンストラクトがない場合は「()」を省略してもよいですが、ソースの可読性のため、必ず書いているのが良いと思います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=740&quot; data-filename=&quot;002.png&quot; style=&quot;width: 540px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpでもインスタンスを生成するのは「new」キーワードで生成します。oopと似ているな構造になりますね。&lt;/p&gt;&lt;p&gt;しかし内部的には「oop」と動作方法は差がありますが、実装する形は似ているので初心者がphpを初めに勉強するのはしやすいと思います。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=741&quot; data-filename=&quot;003.png&quot; style=&quot;width: 592px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例をみればstaticもparentと似ている構造でアクセスします。「クラス名::変数名」あるいは「クラス名::関数名」でアクセスします。&lt;/p&gt;&lt;p&gt;上の例は「static」変数でもアクセス修飾子が「private」なので、インスタンス内部だけでアクセスできますね。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/140.html</guid><pubDate>Thu, 9 Jan 2020 23:32:40 +0900</pubDate></item><item><title>[PHP] 基本ページ作成方法と変数使用方法</title><link>https://www.nowonbun.com/139.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpをインストールしてideを構成しました。後、composerまでインストールまで完了しました。&lt;/p&gt;&lt;p&gt;そのことでphpの基本的な開発準備は終わりました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/137.html&quot; target=&quot;_blank&quot;&gt;[php] php 開発環境設定とeclipse(ide)の設定&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/138.html&quot; target=&quot;_blank&quot;&gt;[php] composer設定&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpはjavaとc#と比べてコンパイル言語ではなく、スクリプト言語です。スクリプト言語はコンパイル、すなわち機械語の変換がなしでスクリプト自体を解読して運用する言語といいます。&lt;/p&gt;&lt;p&gt;スクリプト言語とは代表的にjavascriptとpythonなどがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpファイルの構成形は下記となります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=734&quot; data-filename=&quot;001.png&quot; style=&quot;width: 360px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=738&quot; data-filename=&quot;002.png&quot; style=&quot;width: 528px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;php処理領域は&amp;lt;?phpで始まって?&amp;gt;で終了します。値を出力する時は&amp;lt;?=変数 ?&amp;gt;形で出力が可能です。&lt;/p&gt;&lt;p&gt;もちろん、出力を&amp;lt;?=変数 ?&amp;gt;ではなく、&amp;lt;?php echo 変数 ?&amp;gt;でも可能です。&lt;/p&gt;&lt;p&gt;その以外の領域はそのままhtmlで出力になると思えばなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpは別途のデータタイプをもってないです。それで変数宣言も必要ないです。単純に$変数名で宣言が可能です。&lt;/p&gt;&lt;p&gt;でもデータタイプ宣言をしないって言っても変数タイプがないことではないです。&lt;/p&gt;&lt;p&gt;例えば、文字列タイプで定数タイプを加算すればエラーが発生します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=735&quot; data-filename=&quot;003.png&quot; style=&quot;width: 773px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;エラーではなく、warningが発生します。&lt;/p&gt;&lt;p&gt;定数や実数などで数と関係がある処理式は既存とみたいに「+,-,*,/」で使用が可能です。そして文字列はデータを合わせる時に「+」ではなく、「.」を使用して文字列を合わせます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=736&quot; data-filename=&quot;004.png&quot; style=&quot;width: 572px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その後、制御文、繰返し文と使用可能です。これは他の言語と似てるので「java」や「c#」を参考してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/45.html&quot; target=&quot;_blank&quot;&gt;[java スタディ - 5] 制御文 - 分岐 (if, switch〜case)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/10.html&quot; target=&quot;_blank&quot;&gt;[c# スタディ - 9] 制御文 - 分岐 (if, switch〜case, goto)&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=737&quot; data-filename=&quot;005.png&quot; style=&quot;width: 644px;&quot;&gt;&lt;br&gt;&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/139.html</guid><pubDate>Mon, 6 Jan 2020 23:20:36 +0900</pubDate></item><item><title>[PHP] Composer設定</title><link>https://www.nowonbun.com/138.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpのcomposerとはjavaのmaven、c#のnugetと同じ機能で、パッケージ間の依存性を管理するし、ライブラリをダウンロード及びリンクを管理するモジュールです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先、composerをインストールするように「php.ini」を設定しなければならないです。&lt;/p&gt;&lt;p&gt;以前にインストールした「php」フォルダに移動しましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/137.html&quot; target=&quot;_blank&quot;&gt;[php] php 開発環境設定とeclipse(ide)の設定&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=724&quot; data-filename=&quot;001.png&quot; style=&quot;width: 775px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の設定ファイルの中でextension=opensslのモジュールがありますがセミコロン(;)でコメント処理になっております。このセミコロンを削除しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてコマンドで「php」がインストールされたフォルダに移動しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=722&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;(※参考に私の場合は今プロクシ設定している環境で使っているので「-x -u」オプションでプロクシ設定しましたが、この部分は省略してもよいです。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールが完了しました。というメッセージが表示されました。&lt;/p&gt;&lt;p&gt;その後、composerバッチファイルを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=723&quot; data-filename=&quot;003.png&quot; style=&quot;width: 583px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてコマンドで「composer」ということで入れたら、下記とおりの画面がでます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=727&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまでcomposerがインストールが終わって設定が完了しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://packagist.org/&quot; target=&quot;_blank&quot;&gt;https://packagist.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaのmavenレポジトリより少し整理されてない雰囲気ですが、必要な情報はあるのでかなり便利です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;検索テキストで「carbon」ということで入れて検索しましょう。参考に「carbon」はデートフォーマット関連ライブラリです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=732&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そうしたらよく使う順番で検索されますが、一番上の結果を選択しましょう。&lt;/p&gt;&lt;p&gt;様々な説明がありますが、時間があれば詳しくみるのはよいですね。でも、我々はライブラリリンクするのが目的なので、下の「installation」の項目をみましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=731&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;リンク情報を得たのでドキュメントルートのフォルダに移動しましょう。&lt;/p&gt;&lt;p&gt;ここで「composer.json」ファイルを生成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=726&quot; data-filename=&quot;007.png&quot; style=&quot;width: 459px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてリンク情報を入力しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=725&quot; data-filename=&quot;008.png&quot; style=&quot;width: 425px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;composerを実行すればよいですが、筆者の場合はcomposerバッチがあるところをシステムパス設定をしなかったので、直接に絶対パスで実行しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=730&quot; data-filename=&quot;009.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ライブラリがタウンロードさせてリンクが完了しました。&lt;/p&gt;&lt;p&gt;これからダウンロードしたライブラリを使ってみましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=729&quot; data-filename=&quot;009.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;eclipseを起動してproject explorerを見ると「vendor」フォルダが生成されています。ここでライブラリがダウンロードされたことです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=728&quot; data-filename=&quot;010.png&quot; style=&quot;width: 766px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここで全てのライブラリに「require」宣言する必要がなしで、「autoload.php」だけ宣言すると使えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=733&quot; data-filename=&quot;011.png&quot; style=&quot;width: 449px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;現在時間が朝1時に出力しました。これはcarbonライブラリ問題ではなく、ローカル時間設定の問題です。&lt;/p&gt;&lt;p&gt;composerを利用してライブラリをダウンロード、使用することまで完了しました。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/138.html</guid><pubDate>Fri, 27 Dec 2019 08:52:22 +0900</pubDate></item><item><title>[PHP] PHP 開発環境設定とEclipse(IDE)の設定</title><link>https://www.nowonbun.com/137.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ネットサーフィンすれば、「java vs c#」、「php vs java」、「php　vs c#」など、言語の優秀性、性能、短所などを比較して書いた投稿が多いです。&lt;/p&gt;&lt;p&gt;筆者の場合はプログラム言語を3～4個の言語を運用が可能ですが、言語の間に比較するのは意味がないと思います。&lt;/p&gt;&lt;p&gt;例えば、リンゴとミカンがあります。リンゴが栄養が多いか？ミカンが栄養が多いか？健康にいいものか？どの果物がもっといいかというとみんなリンゴはリンゴの味で美味しいし必要な栄養があるし、ミカンはミカンで美味しいし栄養がありますといいますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;プログラム言語も同じです。これから紹介するphpはウェブスクリプトですが、javaとc#の比べてphpだけの魅力があるプログラム言語です。&lt;/p&gt;&lt;p&gt;それで意味がない比較を少ししてphpの特性を説明します。&lt;/p&gt;&lt;p&gt;phpとjavaを比べるとphpはjavaより基本環境設定が簡単です。「php+apache+db」の設定で終わります。javaの場合は「apache+tomcat+java+db」です。そういえば、「tomcat」だけ追加されたですね。&lt;/p&gt;&lt;p&gt;phpの場合はコンパイル言語ではなく、スクリプト言語なので、ソース修正する時に、別途のコンパイルの手続きが要らなく、画面ページに反映が早いですが、javaの場合は再コンパイル、サーバ再起動などの手続きが必要なので修正から反映までphpの開発時間が圧倒的に早いです。&lt;/p&gt;&lt;p&gt;プログラムのパフォーマンスはプログラム言語の性能もありますが、開発する人(デベロッパー)の能力の比重が多いので、省略します。&lt;/p&gt;&lt;p&gt;まだ、プロぐジェクト管理能力に関してもphpが大きいプロジェクトには悪く、javaが大きいプロジェクトでよいといいますが、これも設計、環境設定なのによって差があるので、どっちがいいかとは言えません。&lt;/p&gt;&lt;p&gt;オープンソースはコミュニティに関してはjavaの方が大きいではないかと思います。でもphpコミュニティも小さくなく、すごく大きいです。筆者はメイン言語がphpよりjavaなので筆者の感じだけの可能性もあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の状況だけみればphpがjavaよりいい言語みたいに見えます。&lt;/p&gt;&lt;p&gt;phpの場合はスレッド処理が難しいです。例えば、phpではゲームサーバーを作られないです。正確には出来ないことではなく、難しいというのが正確だと思います。javaの場合はthreadpoolを利用してソケットサーバーを作ればそれがアプリケーションサーバーになりますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで私の場合は単純な「ウェブ-db」ならphpを利用するし、「ウェブ-バッチ-コアー-db」の場合はjavaを、windowアプリの場合はc#を利用しますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからphpを説明する前にapacheとphpをインストールしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/103.html&quot; target=&quot;_blank&quot;&gt;[centos] phpインストールする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/93.html&quot; target=&quot;_blank&quot;&gt;[window] apacheをインストール方法、サービスに登録する方法。&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;筆者はwindow基準で説明します。&lt;/p&gt;&lt;p&gt;上のリンクをみてapacheをインストールしましょう。開発環境を作ることなので、サービス登録まではいらないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=701&quot; data-filename=&quot;001.png&quot; style=&quot;width: 566px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;筆者は「dローカルディスク」の「apachephp」のフォルダにインストールしました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてphpをダウンロードしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.php.net/downloads.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/downloads.php&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=707&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=718&quot; data-filename=&quot;003.png&quot; style=&quot;width: 637px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;筆者の場合は「7.3.9」バージョンをダウンロードしました。注意点は「none thread safe」ではなく、「thread safe」バージョンをダウンロードしなければならないです。&lt;/p&gt;&lt;p&gt;zipファイルをダウンロードして「apachephp」の下位フォルダの「php」を生成して圧縮を解凍しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=719&quot; data-filename=&quot;004.png&quot; style=&quot;width: 597px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「php」フォルダにいってみれば、「php.ini-development」のファイルがありますが、「php.ini」ファイルに変更します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=716&quot; data-filename=&quot;005.png&quot; style=&quot;width: 595px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてメモ帳でphp.iniファイルを開いて「 ;extension_dir = &quot;./&quot; 」の部分を探します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=706&quot; data-filename=&quot;006.png&quot; style=&quot;width: 663px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここのコメントを解除して「phpフォルダ+/ext」や「./ext」で修正しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=709&quot; data-filename=&quot;007.png&quot; style=&quot;width: 718px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてapache設定ファイル「conf/http.conf」ファイルに行って下記の内容を追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=715&quot; data-filename=&quot;008.png&quot; style=&quot;width: 793px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そして開始ページをindex.htmlからindex.phpに修正します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=708&quot; data-filename=&quot;009.png&quot; style=&quot;width: 474px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここまで設定が完了すればphpインストールは完了しました。起動しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先、apacheフォルダのhtdocsフォルダの中に「index.php」ファイルを生成して「&amp;lt;?php phpinfo()?&amp;gt;」を追加します。&lt;/p&gt;&lt;p&gt;(※既存にあったindex.htmlファイルは削除しましょう。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=704&quot; data-filename=&quot;010.png&quot; style=&quot;width: 598px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=702&quot; data-filename=&quot;011.png&quot; style=&quot;width: 474px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;apacheフォルダのbinフォルダに移動してapacheを起動しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=703&quot; data-filename=&quot;012.png&quot; style=&quot;width: 467px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ブラウザでlocalhostで接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=720&quot; data-filename=&quot;013.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のphp情報画面が出ると開発設定は完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからはphpを開発するように開発ツール(ide)をインストールしましょう。&lt;/p&gt;&lt;p&gt;php ideに関して様々なツールがありますが、筆者の場合は「eclipse」が慣れているので「eclipse」をインストールしてみましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「eclipse」ホームページに接続します。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.eclipse.org/downloads/?featured_story&quot; target=&quot;_blank&quot;&gt;https://www.eclipse.org/downloads/?featured_story&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;タウンロードページに移動すると下記のイメージみたいに「download package」があります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=710&quot; data-filename=&quot;014.png&quot; style=&quot;width: 387px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.eclipse.org/downloads/packages/&quot; target=&quot;_blank&quot;&gt;https://www.eclipse.org/downloads/packages/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=721&quot; data-filename=&quot;015.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;パッケージページをみれば「php開発用」があります。(参考にeclipseを使うようにはjavaがインストールされなければならないです。)&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/41.html&quot; target=&quot;_blank&quot;&gt;[java スタディ - 1] javaとは？、javaインストール、eclipseインストール&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ダウンロードをして適当なところで圧縮を解凍して「eclipse」を起動しましょう。&lt;/p&gt;&lt;p&gt;起動すると「workspace」を設定するウィンドウがでますが、適当なところを設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=712&quot; data-filename=&quot;016.png&quot; style=&quot;width: 615px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合は「apachephp」の「workspace」に設定しました。&lt;/p&gt;&lt;p&gt;起動した後で「create project」を選択します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=714&quot; data-filename=&quot;017.png&quot; style=&quot;width: 605px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてプロジェクト名前を適当に決めてprojectフォrだを「apachephp\htdocs」に設定します。&lt;/p&gt;&lt;p&gt;つまり、apacheサーバのドキュメントルートを設定することです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=717&quot; data-filename=&quot;018.png&quot; style=&quot;width: 652px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=713&quot; data-filename=&quot;019.png&quot; style=&quot;width: 821px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしたら先に作成した「index.php」がロードされることを確認できます。&lt;/p&gt;&lt;p&gt;ここに「hello.php」を作成して「hello world」を作成してみます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=711&quot; data-filename=&quot;020.png&quot; style=&quot;width: 745px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpは別にコンパイルが要らないので、そのままブラウザに「localhost/hello.php」に接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=705&quot; data-filename=&quot;021.png&quot; style=&quot;width: 447px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の画面まで出るとphpのインストールからideのインストールまで完了できました。&lt;/p&gt;&lt;p&gt;これからphp開発する準備が終わりましたね。&lt;/p&gt;</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/137.html</guid><pubDate>Thu, 26 Dec 2019 07:36:47 +0900</pubDate></item><item><title>[CSS] ブラウザから開発する方法 (developer mode)</title><link>https://www.nowonbun.com/136.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今まで、cssスタイルに関して説明しました。cssスタイルはセレクトからデザインスタイル、トランジションなど様々な機能がありますね。&lt;/p&gt;&lt;p&gt;html編集ツールもあるし、他のプログラム言語はideや開発ツールがありますが、cssの場合はないかと疑問になりますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cssの開発は全てウェブアプリケーションで画面の領域です。cssことでサーバサイドの開発はないですね。&lt;/p&gt;&lt;p&gt;画面なので、普通はブラウザにcssの編集や開発ツールがありますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=695&quot; data-filename=&quot;001.png&quot; style=&quot;width: 641px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;クロームの基準で「設定」の「その他」の「開発ツール」があります。上のイメージはクロームですが、全てのブラウザがその開発ツールの機能を持っているはずです。&lt;/p&gt;&lt;p&gt;ショットキーでは「ctrl+s方法hift+i」です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;開発ツールを起動すると下記のイメージみたいなタブが出ます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=697&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の「elements」、「console」、「sources」などのサブタブがありますが、「elements」以外はほとんどjavasciprtと関係があるものなので、ここでは省略します。&lt;/p&gt;&lt;p&gt;「elements」タグでみるとウェブサイトのタグ構成が見えます。&lt;/p&gt;&lt;p&gt;「elements」のタブの下を見るとスタイルというタブでcssスタイルがありますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで使用方法は下記通りです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=699&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;開発ツールの右上をクリックして確認した要素を選択します。&lt;/p&gt;&lt;p&gt;選択すると開発ツールの下の部分でcssスタイルがでます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=698&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;様々のスタイルの設定を試すことができますね。今までcssのスタイルや値について説明しましたが、実は開発ツールを利用すると別に全て覚えてスタイル作成する必要はないですね。&lt;/p&gt;&lt;p&gt;ただ、概念だけ知っていれば開発ができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、ブラウザで設定して画面でスタイルが反映することみても実際のソースには反映されないので、気をつけてください。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのツールを見れば、「-webkit-」がつけているcssスタイルがあります。&lt;/p&gt;&lt;p&gt;cssを設定してファイアフォックスやオペラ、ie、クロームを同じページを見ればスタイルが微妙に違います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その時に上の接頭辞でブラウザ別で設定できます。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th style=&quot;white-space: nowrap;&quot;&gt;接頭辞&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;-webkit-&lt;/td&gt;        &lt;td&gt;クローム、サパーリブラウザ&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;-moz-&lt;/td&gt;        &lt;td&gt;ファイアフォックスブラウザ&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;-ms-&lt;/td&gt;        &lt;td&gt;ieブラウザ&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td style=&quot;white-space: nowrap;&quot;&gt;-o-&lt;/td&gt;        &lt;td&gt;オペラブラウザ&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=696&quot; data-filename=&quot;005.png&quot; style=&quot;width: 771px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これはクロームで実行した結果です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=700&quot; data-filename=&quot;006.png&quot; style=&quot;width: 744px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これはファイアフォックスで実行した結果です。&lt;/p&gt;&lt;p&gt;クロームでは右から左に赤から青に設定しましたが、ファイアフォックスは左から右側になりますね。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/136.html</guid><pubDate>Wed, 25 Dec 2019 07:58:13 +0900</pubDate></item><item><title>[CSS] アニメーション (animation)</title><link>https://www.nowonbun.com/134.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;アニメーションスタイルは前述で紹介したトランジションと似ているな効果になります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/132.html&quot; target=&quot;_blank&quot;&gt;[css] トランジション(transition)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;様々な要素を動的に動く効果と関係があることですね。差異というとトランジション(transition)の場合は指定したcssスタイルによる効果を制御するが、アニメーションの場合は様々なアクションをもっと複雑な効果ができることだといいます。&lt;/p&gt;&lt;p&gt;複雑な効果というとトランジション(transition)の場合はスタイルで色の変換、要素移動する時に遅くしたり、早くしたりする制御ですが、アニメーションは要素を回しながら色をキラキラすることができると意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合は「loading」イメージやコンテンツの効果よりアイコン要素で動的要素を作る時によく使います。&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;style&gt;@keyframes test-animation{	    0% {	        min-width:0%;	        background-color:red;	    }	    50%	{	        min-width:50%;	        background-color:blue;	        color:white;	    }	    100% {	        min-width:100%;	        background-color:green;	        color:white;	    }	}	div.example-box {	    display:inline-block;	    animation-name : test-animation;	    animation-duration :3s;	    animation-delay:1s;	    animation-timing-function:linear;	    animation-fill-mode:both;	    animation-iteration-count: infinite;	    animation-direction:reverse;	}	div.example-box:hover {	    animation-play-state:paused;	}&lt;/style&gt;&lt;div class=&quot;example-box&quot;&gt;マウスをバーの上に置いてみてくたさい。&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;アニメーションスタイルをみれば、ほぼトランジションと似てますね。&lt;/p&gt;&lt;p&gt;「animation-name」はアニメーションスタイルのプロパティを設定することができます。アニメーションプロパティは「@keyframes プロパティ名」形式で作成できます。&lt;/p&gt;&lt;p&gt;プロパティをみれば「0%」、「50%」、「100%」の表現があります。「0%」アニメーションの初期の状況、「100%」は完了した時の状況、50％は「duration」を3sに設定しましたが、アニメーションが開始してから1.5秒後の状況になります。&lt;/p&gt;&lt;p&gt;そして「delay」はアニメーションがローディングされて何秒後から開始するかの設定する項目です。&lt;/p&gt;&lt;p&gt;「animaion-timing-function」はトランジションと同じオプションで「linear」は一定な速度、ease-inは遅くなる速度、ease-outは早くなる速度、ease-in-out遅くなってまた早くなる速度、cubic-bezier(n,n,n,n)速度指定があります。&lt;/p&gt;&lt;p&gt;そして「fill-mode」はアニメーションが終わった時に状況ですが、「animation-iteration-count」で「infinite」で設定しましたので、アニメーションが終わらない設定になっていますね。&lt;/p&gt;&lt;p&gt;もし、「both」ということで設定すると「100%」の状況で残っています。その以外に「initial」に設定すると「0%」に戻りますね。&lt;/p&gt;&lt;p&gt;「animation-direction」はなれるのタイプですが、「reverse」を設定すると「0→100%」ではなく、「100%→0%」に動きます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最後「hover」オプションで「animation-play-state」でアニメーションを止まる効果も付けました。&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;style&gt;@keyframes uil-battery-demo-anim4 {    0% {        opacity: 0;    }    10% {        opacity: 0;    }    30% {        opacity: 1;    }}@keyframes uil-battery-demo-anim3 {    0% {        opacity: 0;    }    30% {        opacity: 0;    }    50% {        opacity: 1;    }}@keyframes uil-battery-demo-anim2 {    0% {        opacity: 0;    }    50% {        opacity: 0;    }    70% {        opacity: 1;    }}@keyframes uil-battery-demo-anim1 {    0% {        opacity: 0;    }    70% {        opacity: 0;    }    90% {        opacity: 1;    }}.uil-battery-demo-css .outer {  position: relative;  width: 80px;  border: 13px solid #0d8c30;  height: 120px;  top: 50px;  left: 20px;  border-radius: 10px;}.uil-battery-demo-css .outer:after {  content: &quot; &quot;;  display: block;  position: absolute;  top: -33px;  left: 0px;  width: 52px;  height: 32px;  border-radius: 10px;  background: #0d8c30;}.uil-battery-demo-css .inner {  position: relative;  width: 45px;  height: 19px;  left: 38px;  background: #00f1ff;}.uil-battery-demo-css .inner:nth-of-type(2) {  top: -53px;  animation: uil-battery-demo-anim1 1.5s linear infinite;}.uil-battery-demo-css .inner:nth-of-type(3) {  top: -50px;  animation: uil-battery-demo-anim2 1.5s linear infinite;}.uil-battery-demo-css .inner:nth-of-type(4) {  top: -47px;  animation: uil-battery-demo-anim3 1.5s linear infinite;}.uil-battery-demo-css .inner:nth-of-type(5) {  top: -44px;  animation: uil-battery-demo-anim4 1.5s linear infinite;}.uil-battery-demo-css{  display: inline-block;}&lt;/style&gt;&lt;div class=&quot;uil-battery-demo-css&quot;&gt;    &lt;div class=&quot;outer&quot;&gt;&lt;/div&gt;    &lt;div class=&quot;inner&quot;&gt;&lt;/div&gt;    &lt;div class=&quot;inner&quot;&gt;&lt;/div&gt;    &lt;div class=&quot;inner&quot;&gt;&lt;/div&gt;    &lt;div class=&quot;inner&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;上の例ではアニメーションタグだけの電池のマークを付けってみました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;このアニメーションタグもトランジションと同じ効果で静的なウェブサイトで動的な感じを与える機能ですね。でも、多く使えば、コンテンツの集中度を落としサイトが乱雑になる傾向があるので、適切に使えなければならないと思います。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/134.html</guid><pubDate>Mon, 23 Dec 2019 07:44:49 +0900</pubDate></item><item><title>[CSS] トランスフォーム (transform)</title><link>https://www.nowonbun.com/133.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;トランスフォームとは3dな表現するように回転、拡大、縮小するスタイルといいます。&lt;/p&gt;&lt;p&gt;何かというと下記の形です。&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;height:110px;&quot;&gt;&lt;div&gt;  &lt;style scoped=&quot;scoped&quot;&gt;    p.sample{      border: 1px solid #000;      width: 300px;      height: 70px;      font-size: 20px;      margin-left: -50px;      margin-top: -40px;      transform: translate(50px,50px) skew(200deg,-5deg);    }  &lt;/style&gt;  &lt;p class=&quot;sample&quot;&gt;おはようございます。こんにちは。こんばんは。&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;トランスフォーム属性は「transform」,「transform-origin」,「perspective」,「transform-style」,「perspective-origin」,「backface-visibility」の６つがあります。&lt;/p&gt;&lt;p&gt;「transform」の属性は変更スタイルを指定することです。回転しようか(rotate)、移動するか(translate),3d軸で移動(translate3d)するオプションもあります。&lt;/p&gt;&lt;p&gt;心痛なオプション(scew)、拡大、縮小(scale)、3d的な拡大、縮小(scake)もあります。&lt;/p&gt;&lt;p&gt;参照 - &lt;a href=&quot;https://www.w3schools.com/cssref/css3_pr_transform.asp&quot; target=&quot;_blank&quot;&gt;https://www.w3schools.com/cssref/css3_pr_transform.asp&lt;/a&gt;&lt;/p&gt;&lt;p&gt;参照 - &lt;a href=&quot;https://www.w3.org/talks/2012/0416-css-www2012/demos/transforms/demo-translate3d-cube.html&quot; target=&quot;_blank&quot;&gt;https://www.w3.org/talks/2012/0416-css-www2012/demos/transforms/demo-translate3d-cube.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;「transform-origin」は回転の軸を決定するもので基本値は「transform-origin: center center」です。回転、拡大、縮小、心痛で使います。&lt;/p&gt;&lt;p&gt;「perspective」は遠近感の設定です。「perspective-origin」は上の遠近感の設定する時に位置になります。&lt;/p&gt;&lt;p&gt;「perspective-origin:top left;perspective:100px」なら上左の基準で100px距離の遠近感に表示することです。&lt;/p&gt;&lt;p&gt;「transform-style」は上の「perspective」と「perspective-origin」をしようとすると設定する属性です。値は「transform-style: preserve-3d;」だけです。&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;height:250px;&quot;&gt;&lt;style scoped=&quot;scoped&quot;&gt;.cube {    perspective-origin: 300px 300px;    perspective: 300px;    transform-style: preserve-3d;    margin-left:100px;    margin-top: 100px;}.cube .face {  display: block;  position: absolute;  width: 100px;  height: 100px;  line-height: 100px;  color: white;  text-align: center;}.cube .front {    background: rgba(0, 0, 0, 0.3);    transform: translatez(50px);}.cube .back {    background: rgba(0, 255, 0, 1);    color: black;    transform: rotatey(180deg) translatez(50px);}.cube .right {  background: rgba(196, 0, 0, 0.7);  transform: rotatey(90deg) translatez(50px);}.cube .left {    background: rgba(0, 0, 196, 0.7);    transform: rotatey(-90deg) translatez(50px);}.cube .top {    background: rgba(196, 196, 0, 0.7);    transform: rotatex(90deg) translatez(50px);}.cube .bottom {    background: rgba(196, 0, 196, 0.7);    transform: rotatex(-90deg) translatez(50px);}&lt;/style&gt;&lt;div class=&quot;cube&quot;&gt;&lt;div class=&quot;face front&quot;&gt;1&lt;/div&gt;&lt;div class=&quot;face back&quot;&gt;2&lt;/div&gt;&lt;div class=&quot;face right&quot;&gt;3&lt;/div&gt;&lt;div class=&quot;face left&quot;&gt;4&lt;/div&gt;&lt;div class=&quot;face top&quot;&gt;5&lt;/div&gt;&lt;div class=&quot;face bottom&quot;&gt;6&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;「backface-visibility」の場合は「transform」要素で裏面になると見えるかどうかの設定です。&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;style&gt;.item {    display: inline-block;    width: 100px;    height: 100px;    margin: 10px;    background-color: blue;    transition: 2s;    color:white;}.item-1 {    backface-visibility: visible;}.item-2 {    backface-visibility: hidden;}.item-test-checkbox:checked ~ .item {    transform: rotatey( 180deg )}&lt;/style&gt;&lt;input type=&quot;checkbox&quot; class=&quot;item-test-checkbox&quot;&gt;click!&lt;br&gt;&lt;div class=&quot;item item-1&quot;&gt;テスト&lt;/div&gt;&lt;div class=&quot;item item-2&quot;&gt;テスト&lt;/div&gt;&lt;/blockquote&gt;最後にウェブサイトなどでよく使える簡単なtrasitionの例を作ります。&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;div style=&quot;max-width: 300px;border:1px solid #000;&quot;&gt;  &lt;style&gt;    div#exam1 {      background-color: blue;      width: 100%;      font-size: 15px;      color: white;      padding: 100px;    }    div#exam1.off1 {      transition-property: transform;      transition-duration: 1s;      transform: perspective(100px) rotatex(-90deg);      transform-origin: top;    }    div#exam1.on1 {      transition-property: transform;      transition-duration: 1s;      transform: rotatex(0deg);      transform-origin: top;    }  &lt;/style&gt;  &lt;script&gt;    function exam1() {      if ($(&quot;div#exam1&quot;).hasclass(&quot;on1&quot;)) {        $(&quot;div#exam1&quot;).removeclass(&quot;on1&quot;);        $(&quot;div#exam1&quot;).addclass(&quot;off1&quot;);        return;      }      $(&quot;div#exam1&quot;).removeclass(&quot;off1&quot;);      $(&quot;div#exam1&quot;).addclass(&quot;on1&quot;);      return;    }  &lt;/script&gt;  &lt;div id=&quot;exam1&quot; class=&quot;off1&quot;&gt;    こんにちは。  &lt;/div&gt;  &lt;input type=&quot;button&quot; value=&quot;押してください。&quot; style=&quot;width:100%;&quot; onclick=&quot;exam1()&quot;&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;何処かで上の似てるな効果を見たことありますが、真似して作ってみました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;筆者の場合はウェブサイトで様々なアクションがあることを別に好きではないです。&lt;/p&gt;&lt;p&gt;アクションが多ければ、コンテンツ集中度が落ちるからです。でも、逆にポイントなどの効果を与える時には良いと思いますね。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/133.html</guid><pubDate>Thu, 19 Dec 2019 15:23:12 +0900</pubDate></item><item><title>[CSS] トランジション(transition)</title><link>https://www.nowonbun.com/132.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cssのトランジション(transition)とは属性変更時に変更の速度を調節すること、変更のサイクルを設定することだと思われます。&lt;/p&gt;&lt;p&gt;例えば、「div」タグの背景色を黄色にしてマウスを置く(hover)と緑色になることに設定すると思うと実際にタグで設定するとあっというまで処理されますね。&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;例&lt;/p&gt;&lt;style&gt;    .example-1 .item{        background-color: yellow;        height: 50px;    }    .example-1 .item:hover{        background-color: green;    }&lt;/style&gt;&lt;div class=&quot;example-1&quot;&gt;    &lt;div class=&quot;item&quot;&gt;マウスを上に置いてください。&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;でもユーザによってこの変更することをスムースにアニメーションのようなアクションを与えたい人が言うと思います。&lt;/p&gt;&lt;p&gt;その時にトランジション(transition)を利用すると設定ができます。&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;例&lt;/p&gt;&lt;style&gt;    .example-2 .item{        background-color: yellow;        height: 50px;        transition: background-color 2s ease-out 50ms;    }    .example-2 .item:hover{        background-color: green;        transition: background-color 2s ease-out 50ms;    }&lt;/style&gt;&lt;div class=&quot;example-2&quot;&gt;    &lt;div class=&quot;item&quot;&gt;マウスを上に置いてください。&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;トランジションは４つのスタイル属性があります。４つと言ってもdelayの属性以外にはすべて設定しなければ作動しないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「transition-property」はトランジションの属性を与えるcssスタイル名です。上の例では「background-color」に効果を与えますね。&lt;/p&gt;&lt;p&gt;「transition-duration」は変換する時間です。上の例とは黄色から緑色に変換することで2秒かかりますということですね。&lt;/p&gt;&lt;p&gt;「transition-timing-function」は変換のタイプですが、「ease-out」は初めは遅くて早く変換するタイプ、「ease-in」は初めは早くて遅く変換するタイプ、「ease-in-out」は初めは早くて遅くなるがまた、早く変換するタイプ、「linear」は一定な速度で変換するタイプ、「cubic-bezier(n,n,n,n)」は直接に変換速度を指定するタイプがあります。&lt;/p&gt;&lt;p&gt;「transition-delay」は初めから変換ではなく、指定した時間の後で変換することです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のことは黄色から緑色に変換することで0.5秒あと2秒間に初めは遅く早く変換するスタイルです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その以外にテキストにもアクションを上げることが出来ます。&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;例&lt;/p&gt;&lt;style&gt;      textarea.example-textarea {        width: 100%;        height: 50px;        transition-property: height;        transition-duration: 1s;        transition-timing-function: ease-out;      }      textarea.example-textarea:focus {        height: 200px;        transition-property: height;        transition-duration: 5s;        transition-timing-function: ease-in-out;      }    &lt;/style&gt;&lt;div&gt;  &lt;textarea class=&quot;example-textarea&quot; placeholder=&quot;please input text!&quot;&gt;&lt;/textarea&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;実際にウェブサービスでも、色々アクションや広告などのフォーカスを与え視線を集めるようにする方法でよく使っているスタイプです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、逆にウェブページでトランジションが多ければ集中度を落とす逆効果もあります。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/132.html</guid><pubDate>Wed, 18 Dec 2019 20:35:20 +0900</pubDate></item><item><title>[CSS] border(枠)、余白スタイル - border, margin, padding</title><link>https://www.nowonbun.com/128.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cssのスタイルと言うと基本的に文字列、余白、枠、位置、状態のスタイルが基本だと思います。&lt;/p&gt;&lt;p&gt;文字列は前述で説明しましたから、今回は枠(border)と余白に関して調べてみます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;htmlタグでよく使うダグだというと「div」タグと「table」タグだと思います。&lt;/p&gt;&lt;p&gt;そのところで「table」タグで例を作ります。&lt;/p&gt;&lt;p&gt;上をみれば、例としてテーブルを作ってヘッダとボディを分けてテーブルのタイトルと内容を分けてタグを作成しました。スタイルを何もない状況でウェブブラウザに見るとテーブルで作成したとは感じられません。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=684&quot; data-filename=&quot;001.png&quot; style=&quot;width: 221px;&quot;&gt;&lt;/p&gt;&lt;p&gt;タグだけではテーブルスタイルができないですね。そうするとcssスタイルでテーブルみたいに修正しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=685&quot; data-filename=&quot;002.png&quot; style=&quot;width: 524px;&quot;&gt;&lt;/p&gt;&lt;p&gt;今回は「table」タグではなく「span」タグでスタイルを付けましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=686&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上の例では「div」タグの中で「span」タグを入れました。&lt;/p&gt;&lt;p&gt;「div」タグは基本スタイルが「width:100%」です。それは「display:block」タイプですが、「display」タイプには次の投稿で説明します。&lt;/p&gt;&lt;p&gt;そのことで高さ、枠を設定しました。「padding」のスタイルがありますね。&lt;/p&gt;&lt;p&gt;「padding」は内余白、「margin」は外余白です。&lt;/p&gt;&lt;p&gt;例えば「div」と「span」の左の余白は「div」の内余白(padding)の「10px」と「span」の外余白(margin)の「30px」で全て「40px」の余白があります。&lt;/p&gt;&lt;p&gt;また「span」の「width」と「height」で「vw」は「vh」単位があります。&lt;/p&gt;&lt;p&gt;「vw」はブラウザの画面コントロールにのサイズによって「70vw」は幅の「70%」という意味です。「vh」は縦のサイズによって何パーセントと意味ですね。&lt;/p&gt;&lt;p&gt;また、「calc()」でプログラムで関数みたいな文法がありますね。それは括弧の内を計算してって意味です。&lt;/p&gt;&lt;p&gt;つまり、cal(70vw-10px)と意味はブラウザの幅の70パーセントサイズで10pxを引くことですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「margin」や「padding」、「border」の場合は「right」、「left」、「top」、「bottom」の小スタイルを持っています。&lt;/p&gt;&lt;p&gt;「radius」の場合は長方形の角を丸くするスタイルです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「box-shadow」の場合は要素の影を描くスタイルですね。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/128.html</guid><pubDate>Thu, 12 Dec 2019 20:17:24 +0900</pubDate></item><item><title>[CSS] 文字スタイル</title><link>https://www.nowonbun.com/127.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cssはhtmlタグでスタイルを付ける言語です。&lt;/p&gt;&lt;p&gt;webの構造は基本文字でなっているドキュメント形式です。そこでcssで文字スタイルを付けるのが基本ではないかと思います。&lt;/p&gt;&lt;p&gt;実はfontのスタイルは上よりもっと多いですね。でも筆者も使ったことがないし、よく使うことは上の以外にはないかと思います。&lt;/p&gt;&lt;p&gt;font-sizeは文字のサイスのスタイルです。文字単位では、「px」、「pt」、「em」、「rem」があります。&lt;/p&gt;&lt;p&gt;「px」の場合はピクセルの単位で文字のサイズを幅、縦がモニターの12ピクセルサイズになることです。&lt;/p&gt;&lt;p&gt;「pt」の場合はフォントサイズの単位ですが、基準としては筆者もよく知りません。でもwordやメモ帳でよく使うフォント単位なので大体にどのサイズかは分かると思います。&lt;/p&gt;&lt;p&gt;「em」と「rem」は比率サイズですが、「em」の場合は違いところで設定したサイズによって倍率、「rem」の場合は「root」のサイズ、つまり「html」で設定したサイズの倍率です。&lt;/p&gt;&lt;p&gt;上の例は「em」で定義しました。「div.test」は「body」の派生位置になっているので、bodyタグの「font-size:12px」の「1倍」で設定されます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「font-style」はイタリックなどの設定です。「font-family」はフォントの種類を設定することですね。&lt;/p&gt;&lt;p&gt;「font-weight」はフォントの太さを設定するところです。数値は何の意味かを詳しくしらないですが、「100」単位で大きい数字だと太くなります。boldやbolder、lighterでも設定ができます。&lt;/p&gt;&lt;p&gt;font-colorはフォントの色の設定ですが、代表的な色は英語で設定してもいいです。でも細かい色はhexの色値で設定ができます。&lt;/p&gt;&lt;p&gt;hexの色は下記のリンクを参照してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://htmlcolorcodes.com/&quot; target=&quot;_blank&quot;&gt;https://htmlcolorcodes.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;text-alignはテキストの整列設定です。text-decorationの場合は取り消し線やアンダーラインなどの設定ができます。&lt;/p&gt;&lt;p&gt;text-shadowの場合は影効果ですが、「左右 上下 遠さ」の順番で設定ができます。&lt;/p&gt;&lt;p&gt;white-spaceは文字列の折り返し設定ですが、テーブルの場合は自動に折り返すことがあるので、たまにテーブル見方が崩れることがあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=683&quot; data-filename=&quot;001.png&quot; style=&quot;width: 775px;&quot;&gt;&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/127.html</guid><pubDate>Wed, 11 Dec 2019 21:13:45 +0900</pubDate></item><item><title>[CSS] その他の疑似選択子 - link, visited, target, enabled, disabled, not, active, hover, focus</title><link>https://www.nowonbun.com/126.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回でcss選択子の整理が全て終わると思います。今日、紹介する選択子の使用頻度はよく使いますが、よく使わない。つまり、ウェブサービスのスタイルよって違いますが、よく使うところには使いますが、使わないところは全然使わない、その選択子です。&lt;/p&gt;&lt;p&gt;上の例をみれば、３つの「a」タグと「div」タグ、そして５つの「input」タグがあります。&lt;/p&gt;&lt;p&gt;先、「a」タグの「link」、「visited」は「link」タグによっては一回もクリックしなかった場合の「a」タグを選択、「visited」は一回以上にクリックした場合の「a」タグを選択することです。&lt;/p&gt;&lt;p&gt;つまり、初めは赤色の「a」タグが３つありますが、「選択１」をクリックしてしまうと「選択１」の「a」タグはピンク色になりますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「:target」は「a」タグで「id」によってフォーカスされたものを選択するものです。つまり、ブラウザのアドレスに「#id」名が指しているものが選択されます。&lt;/p&gt;&lt;p&gt;「:enable」と「:disabled」は「input」タグで「diabled」属性が「disabled」か「none」かの選択子です。タグの属性で「enabled=&quot;enabled&quot;」とはありませんので、「disabled=&quot;disabled&quot;」がなければ、「:enabled」の対象、あれば「:disabled」の対象になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「hover」はマウスのイベントによって選択するものです。「hover」は要素でマウスが上にあると選択されます。つまり、テキストボックスの上にマウスを置くとテキストが白色になりますね。&lt;/p&gt;&lt;p&gt;「focus」の場合はテキストボックスの場合、キーボードのカーソルがテキストボックスにあると選択する選択子です。テキストで入力がおわり、他のことを選択するとこの選択子は解除してしまいます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=682&quot; data-filename=&quot;001.png&quot; style=&quot;width: 437px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ここまでcssの選択子に関してほとんど纏めて説明しました。&lt;/p&gt;&lt;p&gt;cssの選択子はjavascriptやjqueryでも同じ形式で選択子を使うので「css選択子」はウェブで重要な部分だと思います。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/126.html</guid><pubDate>Tue, 10 Dec 2019 07:32:01 +0900</pubDate></item><item><title>[CSS] 疑似要素選択子 - fist-line, first-letter, before, after</title><link>https://www.nowonbun.com/125.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述で疑似クラス選択子に関して説明しましたが、今回は疑似要素選択子ですね。&lt;/p&gt;&lt;p&gt;名称が似てますが、選択対象に関しては全然違いますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;疑似クラスの場合は同じタグのリストで何番目の要素を選択ということですが、疑似要素選択子はタグ要素を選択するという意味が近いではないかと思います。&lt;/p&gt;&lt;p&gt;この疑似要素はよく使いますが、特に内容を強調やiconを付ける時によく使いますね。&lt;/p&gt;&lt;p&gt;「first-line」は「p」、「span」、「div」タグなどの文字列を入れられるタグに使う選択子です。&lt;/p&gt;&lt;p&gt;文字列で一行目だけ反映する選択子、つまり「br」タグの前までの適用される選択子です。タグの形式ではなく、文字列で選択する特徴をもっています。&lt;/p&gt;&lt;p&gt;「first-letter」の場合、初めの文字だけ反映する選択子です。日本語より英語で似合う選択子で、筆者も使ったことがないですね。&lt;/p&gt;&lt;p&gt;そして「before」と「after」はタグの前後に「content」の値を入れるタグです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=681&quot; data-filename=&quot;001.png&quot; style=&quot;width: 401px;&quot;&gt;&lt;/p&gt;&lt;p&gt;疑似要素選択子はメニューやアクティブ効果などで使うとよい選択子だと思います。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/125.html</guid><pubDate>Mon, 9 Dec 2019 07:28:47 +0900</pubDate></item><item><title>[CSS] 疑似クラス - only-child, only-of-type, empty, empty, root</title><link>https://www.nowonbun.com/123.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述で疑似クラス nth-childとnth-of-type,first-child,fist-of-typeに関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/121.html&quot; target=&quot;_blank&quot;&gt;[css] 疑似クラス - nth-child, nth-of-type, nth-last-child, nth-last-of-type&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/122.html&quot; target=&quot;_blank&quot;&gt;[css] 疑似クラス - first-child, last-child, first-of-type, last-of-type&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回の投稿ではonly-child, only-of-type, empty, empty, rootを調べると思いますが、あまり使わない選択子ですね。&lt;/p&gt;&lt;p&gt;それで例を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=676&quot; data-filename=&quot;001.png&quot; style=&quot;width: 254px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてcssで「only-child, only-of-type, empty, empty, root」を作成してまましょう。&lt;/p&gt;&lt;p&gt;「only-child」の疑似クラスは「test」クラスの派生タグで「p」タグが一つだけあることを探します。&lt;/p&gt;&lt;p&gt;そしたら「p」タグを持っている「.test」クラスのエレメントは初めの「div」タグと２つ目の「div」タグですね。でも２つ目の「div」タグは「p」タグ以外に「span」タグも持っているので、「only-child」では初めの「dev &amp;gt; p」タグが文字が赤くなると思います。&lt;/p&gt;&lt;p&gt;次は「only-of-type」です。&lt;/p&gt;&lt;p&gt;「only-of-type」は「only-child」と似てますが、結果は全然違います。&lt;/p&gt;&lt;p&gt;「p:only-child」の場合は全ての派生タグで一つの「p」タグと意味です。&lt;/p&gt;&lt;p&gt;「span:only-of-type」の場合は全ての派生タグではなく「span」のバグが一つだけのタグですね。&lt;/p&gt;&lt;p&gt;「div.test」タグを見ると２つ目と３つ目が「div」タグで「span」タグを持っていますが、２つ目の場合は「span」タグが２つですね。&lt;/p&gt;&lt;p&gt;３番目の「div」タグだけ対象です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「:empty」の場合は派生のタグがないタグを調べます。参考に「&amp;lt;タグ&amp;gt;テスト値&amp;lt;/タグ&amp;gt;」の形式も派生データがあることで判断します。つまり、「:empty」に選択されません。&lt;/p&gt;&lt;p&gt;「:root」は「html」を選択することと同じ意味です。「html」や「body」選択することと「:root」で選択することと差異があるかな。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=677&quot; data-filename=&quot;002.png&quot; style=&quot;width: 599px;&quot;&gt;&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/123.html</guid><pubDate>Thu, 5 Dec 2019 07:29:41 +0900</pubDate></item><item><title>[CSS] 疑似クラス - first-child, last-child, first-of-type, last-of-type</title><link>https://www.nowonbun.com/122.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述で疑似クラス nth-childとnth-of-typeに関して説明しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/121.html&quot; target=&quot;_blank&quot;&gt;[css] 疑似クラス - nth-child, nth-of-type, nth-last-child, nth-last-of-type&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回は「first-child」と「first-of-type」に関して調べてみます。&lt;/p&gt;&lt;p&gt;簡単に「first-child」に説明すると「first-child」は「nth-child(1)」と同じ意味です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=673&quot; data-filename=&quot;001.jpeg&quot; style=&quot;width: 409px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のテーブルで全ての枠を描こうと思いまして、「td」のタグで重ねないようにしようと考えています。&lt;/p&gt;&lt;p&gt;初めの行の初めの列だけの左上の枠を描いて全ての「td」の右下を描くと全ての枠が描くことに出来ます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=674&quot; data-filename=&quot;002.jpeg&quot; style=&quot;width: 441px;&quot;&gt;&lt;/p&gt;&lt;p&gt;参考に「first-child」の代わりに「nth-child(1)」を入れても同じ結果になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=675&quot; data-filename=&quot;003.jpeg&quot; style=&quot;width: 441px;&quot;&gt;&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/122.html</guid><pubDate>Wed, 4 Dec 2019 07:29:26 +0900</pubDate></item><item><title>[CSS] 疑似クラス - nth-child, nth-of-type, nth-last-child, nth-last-of-type</title><link>https://www.nowonbun.com/121.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cssの擬似クラスは役12個ごろありますが、そのなかで「nth-child」、「nth-of-type」、「nth-last-child」、「nth-last-of-type」に関して調べてみました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=669&quot; data-filename=&quot;001.jpeg&quot; style=&quot;width: 282px;&quot;&gt;&lt;/p&gt;&lt;p&gt;先、nth-childやnth-last-childは要素のn番目を選択することです。&lt;/p&gt;&lt;p&gt;offsetタイプで数えることではないので初めの番後は「1」から始まります。&lt;/p&gt;&lt;p&gt;(プログラムで配列などを数える時にoffset概念で「0」から数えますが、cssの場合は人間が数えるみたいに「1」から始まります。)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上の例のテーブルで「4」を選択するようには「tbody &amp;gt; tr:nth-child(1) &amp;gt; td:nth-child(2)　&amp;gt; p:nth-child(2)」で選択すると選択されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=670&quot; data-filename=&quot;002.jpeg&quot; style=&quot;width: 282px;&quot;&gt;&lt;/p&gt;&lt;p&gt;でも、nth-childで「8」番を選択しようと思うと少し迷ってしまいます。なぜなら、8番のタグは「p」タグではなく「span」タグなのです。&lt;/p&gt;&lt;p&gt;簡単に考えるとその「td」の中である「span」タグは一つだけなので「tbody &amp;gt; tr:nth-child(2) &amp;gt; td:nth-child(2) &amp;gt; span:nth-child(1)」で選択するとできそうです。&lt;/p&gt;&lt;p&gt;でも、実際はできないですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;理由はnth-childの選択子はタグの要素に関係しずに、選択するからです。つまり、span:nth-child(1)の場合はtr:nth-child(2)の派生タグでspanタグがないので、何も選択されない状況になります。&lt;/p&gt;&lt;p&gt;纏めて、上のspanタグを選択したいなら「tbody&amp;gt;tr:nth-child(2)&amp;gt;td:nth-child(2)&amp;gt;span:nth-child(2)」の選択子で選択しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;この状況になると何か迷いますね。単純な構造ならすぐ気づきますが、複雑なタグ構造なら迷ういますね。&lt;/p&gt;&lt;p&gt;それでタグ別で順番を選択できる選択子はnth-of-typeです。このことは同じレベルの同じタグ要素のn番目を選択するのができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=671&quot; data-filename=&quot;003.jpeg&quot; style=&quot;width: 282px;&quot;&gt;&lt;/p&gt;&lt;p&gt;その後は「nth-last-child」と「nth-last-of-type」の選択子です。この選択子はネーミングで気づきますが、逆に選択する選択子です。&lt;/p&gt;&lt;p&gt;今回は「6」と「5」を選択しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=672&quot; data-filename=&quot;004.jpeg&quot; style=&quot;width: 282px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のタグを見れば、逆の順番で最初が赤色でpタグで逆に最初タグが青色になります。&lt;/p&gt;&lt;p&gt;つまり、6番が赤色で5番が青色になります。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/121.html</guid><pubDate>Tue, 3 Dec 2019 07:22:19 +0900</pubDate></item><item><title>[CSS] CSS Stylesとは？</title><link>https://www.nowonbun.com/118.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述までhtmlに関して説明しました。これからcssに関して調べてみます。&lt;/p&gt;&lt;p&gt;cssは簡単にいうとhtmlタグでドキュメントを作成したらcss styleでドキュメントにスタイルを付けることかな。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;cssを反映するように先にhtmlを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=665&quot; data-filename=&quot;001.png&quot; style=&quot;width: 777px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上の例はただhtmlだけ作成しました。htmlタグだけでもウェブドキュメントが作成できますが、何か我々が使う一般ウェブスタイルではないですね。ここでcss styleを入れます。&lt;/p&gt;&lt;p&gt;一応、cssのスタイルを付けるようにはcss selecterを理解しなければならないですが、それは少し複雑なので別途の投稿で説明します。&lt;/p&gt;&lt;p&gt;簡単に見ると「h1」や「li」はタグ名です。「li &amp;gt; a」の場合は「li」タグ直下派生の「a」タグです。つまり「&amp;lt;li&amp;gt;&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;li&amp;gt;」の「a」タグですね。&lt;/p&gt;&lt;p&gt;スペースがある場合(「div div」)はdivタグの派生タグの中で全ての「div」です。&lt;/p&gt;&lt;p&gt;上の選択になります。&lt;/p&gt;&lt;p&gt;各タグを指定して括弧の中がスタイル形式です。スタイルに関しても量が多いので別途の投稿で説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のスタイルをhtmlのドキュメントの「head」タグの中でいれましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=666&quot; data-filename=&quot;002.png&quot; style=&quot;width: 767px;&quot;&gt;&lt;/p&gt;&lt;p&gt;また、ブラウザを再更新すると上の結果になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;htmlタグだけで作られるウェブドキュメントより少し華やかになりました。&lt;/p&gt;&lt;p&gt;これからcssに関してもっと詳しく調べてみましょう。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/118.html</guid><pubDate>Wed, 27 Nov 2019 07:31:26 +0900</pubDate></item><item><title>[HTML] Open graph(ogタグ)</title><link>https://www.nowonbun.com/117.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述でタグに関して調べて見ました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/116.html&quot; target=&quot;_blank&quot;&gt;[html] metaタグに関して(seo最適化)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今日、説明しようという「opengraph」も実はhtmlのメタタグの中ですが、その特性が一般メタタグと違うので別の投稿で掲示しました。&lt;/p&gt;&lt;p&gt;「opengraph」はsns(ソーシャルネットワーク)でよく使うタグです。我々がsnsでウェブページのリックを##00コピペーする時に、ただurlアドレスだけあればそのリンクだけではウェブページの情報が何があるかを知らないですね。&lt;/p&gt;&lt;p&gt;例えば、私がツイッターにブログのリンクを掲示した場合、他人がそのリンクが開発サイトかアダルトサイトかは知らないです。また、最近ウェブページでスパムや悪性コードがあるサイトが多い時代にはただリンクだけでは接続が大変ですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その時に使うプリビュータグでイメージやリンクの説明、タイトルを表示するようなタグです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=664&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のイメージは私がツイッターに掲示したブログのリンクです。イメージやタイトル、説明が表示されますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「opengraph」に関して調べましょう。&lt;/p&gt;&lt;p&gt;link -  &lt;a href=&quot;http://ogp.me&quot; target=&quot;_blank&quot;&gt;http://ogp.me&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;opengraphの基本タグ&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;1. og:title - サイトのタイトルタグ&lt;/p&gt;&lt;p&gt;2. og:type - サイトの種類スタイル (例)video.movie&lt;/p&gt;&lt;p&gt;3. og:image - サイトの代表イメージ&lt;/p&gt;&lt;p&gt;4. og:url - サイトの代表url&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;opengraphのオプションタグ&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;1. og:audio - サイトで含めるオーディオファイルurl&lt;/p&gt;&lt;p&gt;2. og:description - サイトの説明&lt;/p&gt;&lt;p&gt;3. og:determiner - 文言の始まる単語の選択ですが、日本語とは関係ないと思います。&lt;/p&gt;&lt;p&gt;4. og:locale - サイトの言語です。基本値は「en_us」ですが、日本語は「ja_jp」です。&lt;/p&gt;&lt;p&gt;5. og:locale:alternate - サイトの多国語設定タグです。&lt;/p&gt;&lt;p&gt;6. og:site_name - サイトタイトルはtitleタグで設定しますが、site_nameは細かいカテゴリタイトルです。&lt;/p&gt;&lt;p&gt;7. og:video - サイトで含めている動画ファイルurl&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;opengraphの構造プロパティ&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;og:オブジェクト:url - イメージあるいはビデオ、オーディオオブジェクトアドレス&lt;/p&gt;&lt;p&gt;og:オブジェクト:secure_url - ssl(https)のアドレス&lt;/p&gt;&lt;p&gt;og:オブジェクト:type - オブジェクトタイプの種類&lt;/p&gt;&lt;p&gt;og:オブジェクト:width - オブジェクト幅&lt;/p&gt;&lt;p&gt;og:オブジェクト:height - オブジェクト高さ&lt;/p&gt;&lt;p&gt;og:オブジェクト:alt - オブジェクト説明&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;arrays(配列)とobject typesのこともありますが、必要がないと思います。&lt;/p&gt;&lt;p&gt;ここまで、opengraphに関して調査しましたが、opengraphは検索最適化とは関係ないです。&lt;/p&gt;&lt;p&gt;googleマニュアルでもopengraphは検索順位で影響があるということはありません。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://support.google.com/webmasters/answer/7451184?hl=ko&quot; target=&quot;_blank&quot;&gt;https://support.google.com/webmasters/answer/7451184?hl=ko&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でも、googleでは他のサイトでどのぐらいリンクされていることは検索順位では影響があります。&lt;/p&gt;&lt;p&gt;つまり、opengraphだけでは検索順位では影響がないですが、opengraphが設定されているサイトはsnsでリンク共有がしやすいので、2次的にグーグルの検索順位で影響があります。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/117.html</guid><pubDate>Tue, 26 Nov 2019 07:42:56 +0900</pubDate></item><item><title>[HTML] Metaタグに関して(SEO最適化)</title><link>https://www.nowonbun.com/116.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブドキュメントの中でメタタグのウェブドキュメントの説明、キーワード、要約情報と考えられます。&lt;/p&gt;&lt;p&gt;htmlはウェブページの基本骨格で考えられるし、cssはこの骨格で色やフォントサイズなどのスタイルを付けてユーザがもっと綺麗、よく見えるようにすることで、javascriptはそのページを動的に変換させ整合性ウェブプロシージャを実装、動的に変換をあげ、プログラムらしく動くようにする機能です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そのなかでhtmlのタグ、タグの中でメタタグということがあり、ウェブページの詳細情報になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;メタタグは３つのアトリビュート(属性)を持っています。&lt;/p&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;1. http-equiv&lt;/p&gt;&lt;p&gt; - ヘッドの値を正義することができる属性だし、この属性でサーバとブラウザ間の作動方法、指示を正義するアトリビュートです。&lt;/p&gt;&lt;p&gt;2. content&lt;/p&gt;&lt;p&gt; - meta情報の内容です。&lt;/p&gt;&lt;p&gt;3. name&lt;/p&gt;&lt;p&gt; - ドキュメントラベルのメタデータの名を正義します。itemprop、http-equivあるいはcharsetの属性の中で一つでも設定された場合、設定できません。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border: 1px solid;border-left: 5px solid;&quot;&gt;&lt;p&gt;1. 文字コードの種類設定&lt;/p&gt;&lt;p&gt; ウェブページのエンコーディング属性を指定できます。&lt;/p&gt;&lt;p&gt;2. 互換性設定&lt;/p&gt;&lt;p&gt;ブラウザ別の互換性を設定するタグです。ie 8から11、edgeまでの各バージョンによってレンダリング特性が違います。少なくとも色のコードも少し違いますね。&lt;/p&gt;&lt;p&gt;そのことでウェブのドキュメントが何のバージョンに最適化になっているかを設定することです。&lt;/p&gt;&lt;p&gt;最近にはie８バージョンや9、10バージョンに合わせる必要がないので、前よりは重要が少ないです。普通は基本的に入れるタグですが別にこのタグがなくてもウェブサイトを実装することではそんなに問題ないと思います。&lt;/p&gt;&lt;p&gt;3. ビューポート設定&lt;/p&gt;&lt;p&gt;モバイルとpcは解像度は違います。特にモバイルの場合、モニターのサイズによって解像度が高いですが、この解像度によってウェブを設定するとモバイルでは文字がすごく小さく見えると思います。&lt;/p&gt;&lt;p&gt;そして、ウェブの形が解像度ではなくサイズによって表現しなければならないですが、そのことを設定するタグです。&lt;/p&gt;&lt;p&gt;4. 説明タグ(description)&lt;/p&gt;&lt;p&gt;このタグは検索エンジンで説明がでる部分です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=663&quot; data-filename=&quot;001.png&quot; style=&quot;width: 633px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の考えではseoタグの中では一番重要な部分ではないかと思います。このタグの内容がなくても検索ができないか説明表示をしないことではないですが、検索の優先順位で高くできないし、正確なキーワード検索が難しいではないかと思います。&lt;/p&gt;&lt;p&gt;5. クローリング及びインデックス生成、動作制御タグ&lt;/p&gt;&lt;p&gt;このタグは検索エンジンでインデックスになれ、検索エンジンの検索タイプを設定するタイプです。&lt;/p&gt;&lt;p&gt;もしこのタグを省略すれば基本設定のallで認識します。しかし、「none」で設定すればクローリング、リンクを設定しません。「noindex」の場合はクローリングはするけど、検索結果にはでないようにすること、「nofollow」はリンクが見えないようにすることです。&lt;/p&gt;&lt;p&gt;「nosnippet」はイメージと動画はクローリングをしないようにすること、「noimageindex」はイメージや動画が検索結果にでないように設定することです。&lt;/p&gt;&lt;p&gt;私の場合はブログで検索ができないようにする設定がなかったので、普通は「all」で設定します。&lt;/p&gt;&lt;p&gt;6. 指定されたタイムアウトになるとリダイレクト制御タグ&lt;/p&gt;&lt;p&gt;このタグは設定したタイム時間がすぎるとリダイレクトにする機能です。このタグによってはブラウザ別でエラーになることがありますね。&lt;/p&gt;&lt;p&gt;３０秒後で「https://www.nowonbun.com」に繊維すると意味です。&lt;/p&gt;&lt;p&gt;7. アダルトサイトということを設定する。&lt;/p&gt;&lt;p&gt;8. そのた&lt;/p&gt;&lt;p&gt;「author」タグや「keywords」、「copyright」などのタグもあります。でも最近は使わないタグになりますね。&lt;/p&gt;&lt;p&gt;検索エンジンでもクローリングしないし、ウェブページでも設定しないですね。なので、説明を省略します。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.w3schools.com/tags/tag_meta.asp&quot; target=&quot;_blank&quot;&gt;https://www.w3schools.com/tags/tag_meta.asp&lt;/a&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://support.google.com/webmasters/answer/79812?hl=ja&quot; target=&quot;_blank&quot;&gt;https://support.google.com/webmasters/answer/79812?hl=ja&lt;/a&gt;&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/116.html</guid><pubDate>Mon, 25 Nov 2019 20:16:18 +0900</pubDate></item><item><title>[HTML] HTMLタグ構造</title><link>https://www.nowonbun.com/115.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブサービスで構成するものは大幅で「html」と「javascript」、「css style」があります。&lt;/p&gt;&lt;p&gt;その中で「html」はxml形式でドキュメントの構造を担当しているし、「css style」はuiデザインスタイルを担当しています。「javascript」の場合はウェブドキュメントを動的に動くようにスクリプトの領域です。&lt;/p&gt;&lt;p&gt;先に「html」の構造に関して調べましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「html」はxml形式を継承したので、基本はタグが開くと閉める構造になっています。&lt;/p&gt;&lt;p&gt;「&amp;lt;タグ&amp;gt;&amp;lt;/タグ&amp;gt;」の構造ですね。閉めるタグには「/」記号を入れて表示します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本構造は初めドキュメントタイプ宣言してhtmlタグから始まります。&lt;/p&gt;&lt;p&gt;htmlタグはheadタグとbodyタグが必須にあるし、headタグはtitleタグが必須にあります。&lt;/p&gt;&lt;p&gt;上の構造になっています。headのタグはtitleやメタタグ、style宣言、script宣言などがあります。bodyタグは実際にブラウザから見えるデータタグがあります。&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th&gt;タグ&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;html&lt;/td&gt;        &lt;td&gt;htmlタグの最上位タグです。(必須)&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;head&lt;/td&gt;        &lt;td&gt;htmlの下位タグでheadではタイトル、メタ情報があります。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;body&lt;/td&gt;        &lt;td&gt;htmlの下位タグでhtmlのドキュメント情報があります。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;meta&lt;/td&gt;        &lt;td&gt;headの下位タグでドキュメントのメタ情報があります。&lt;br&gt;        メタ情報はドキュメントエンコーディング情報、キーワード、検索サイトの制御設定、外部リンク情報があります。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;title&lt;/td&gt;        &lt;td&gt;headの下位タグでhtmlドキュメントのタイトルで宣言するし、ブラウザのタイトルで表示します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;link&lt;/td&gt;        &lt;td&gt;headの下位タグでライブラリなどをリンクします。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;header&lt;/td&gt;        &lt;td&gt;bodyの下位タグでドキュメントの上端部分を作成します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;main&lt;/td&gt;        &lt;td&gt;bodyの下位タグでとキュメンとのメインコンテンツを作成します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;article&lt;/td&gt;        &lt;td&gt;bodyの下位タグで独立的なコンテンツを作成します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;session&lt;/td&gt;        &lt;td&gt;bodyの下位タグでコンテンツのセッションを区分します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;nav&lt;/td&gt;        &lt;td&gt;bodyの下位タグでドキュメントのナビを作成します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;aside&lt;/td&gt;        &lt;td&gt;bodyの下位タグでmainタグのメインコンテンツと情報を分離します。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;footer&lt;/td&gt;        &lt;td&gt;bodyの下位タグでドキュメントの下端部分を作成します。&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;p&gt;構造的なhtmlを説明しましたが、理解しにくいですね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=662&quot; data-filename=&quot;001.jpeg&quot; style=&quot;width: 650px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のイメージはheadタグは省略してbodyタグの領域だけ説明しました。実際には上みたいにタグをまもりながらコード実装はしないですね。&lt;/p&gt;&lt;p&gt;でも、タグを確実に分けて作成するとデータ区分もしやすくなるし、css可読性をよくなります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;既存よりhtml5の場合はタグがたくさんありますね。昔は筆者もこのタグの種類をよく知らずに、全て「div」タグでcssを付けて作成した記憶があります。&lt;/p&gt;&lt;p&gt;その時より、htmlがもっとドキュメントらしいな雰囲気もあるし、みやすいですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;また、このタグにはseoと関係があり、タグの目的をきちんとまもって使うと検索順位でも影響がありそうです。本当かどうかをもっとテストをしなければならないですね。&lt;/p&gt;</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/115.html</guid><pubDate>Fri, 22 Nov 2019 19:49:41 +0900</pubDate></item><item><title>[Ubuntu] PHPをインストール、Composer設定する方法</title><link>https://www.nowonbun.com/114.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述でubuntuでapache2をインストールする方法に関して投稿しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/112.html&quot; target=&quot;_blank&quot;&gt;[ubuntu] apache2をインストールする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ubuntuでphpをインストールする方法は難しくないです。設定は少し必要ですが。&lt;/p&gt;&lt;p&gt;先にapt-getにレポジトリを追加してインストールしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.liquidweb.com/kb/install-php-7-2-ubuntu-16-04/&quot; target=&quot;_blank&quot;&gt;https://www.liquidweb.com/kb/install-php-7-2-ubuntu-16-04/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ターミナルでapt repositoryを登録してphp 7.2をインストールすればできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=650&quot; data-filename=&quot;001.jpeg&quot; style=&quot;width: 734px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ubuntuではapache2のphp設定が別に必要ないです。これでphpのインストールは完了です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;apache2のドキュメントパスを修正します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=654&quot; data-filename=&quot;002.jpeg&quot; style=&quot;width: 734px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「/etc/apache2/sites-enabled」フォルダの「000-default.conf」のファイルを修正します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=657&quot; data-filename=&quot;003.jpeg&quot; style=&quot;width: 734px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「/home/htdocs」フォルダに「index.php」ファイルを追加してphpinfo()を作成しましょう。&lt;/p&gt;&lt;p&gt;そして「apache2」を再起動して「localhost」で接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=658&quot; data-filename=&quot;004.jpeg&quot; style=&quot;width: 734px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=661&quot; data-filename=&quot;005.jpeg&quot; style=&quot;width: 765px;&quot;&gt;&lt;/p&gt;&lt;p&gt;phpがインストールされたことを確認できます。そして「php.ini」ファイルが何処にあるかを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpが完了しましたから、composerをインストールしましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先、curlをインストールしましょう。&lt;/p&gt;&lt;p&gt;そしてcurlのインストールファイルをダウンロードしてインストールします。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://getcomposer.org/download/&quot; target=&quot;_blank&quot;&gt;https://getcomposer.org/download/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=655&quot; data-filename=&quot;006.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ここまでcomposerはセット完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;簡単にライブラリを一つ連携して使用してみましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;php用composerレポジトリは下記通りです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://packagist.org/&quot; target=&quot;_blank&quot;&gt;https://packagist.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;javaのmavenレポジトリに比べると少し片付けれている雰囲気ではないけど、必要な情報はすべてあるので、良いサイトです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先、検索テキストにcarbonと言うことで検索してみましょう。参考にcarbonはphpでデートフォマットを使えるライブラリです。(date関数があるのに？)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=656&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;それでよく使える順位で検索させますが、一番上のリストをクリックしましょう。&lt;/p&gt;&lt;p&gt;様々な説明がありますが、我々はこのライブラリが目的ではなく、composerのリンクが目的なので一応installationの項目を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=653&quot; data-filename=&quot;008.png&quot; style&lt;p=&quot;&quot;&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述でubuntuでapache2をインストールする方法に関して投稿しました。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/112.html&quot; target=&quot;_blank&quot;&gt;[ubuntu] apache2をインストールする方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ubuntuでphpをインストールする方法は難しくないです。設定は少し必要ですが。&lt;/p&gt;&lt;p&gt;先にapt-getにレポジトリを追加してインストールしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.liquidweb.com/kb/install-php-7-2-ubuntu-16-04/&quot; target=&quot;_blank&quot;&gt;https://www.liquidweb.com/kb/install-php-7-2-ubuntu-16-04/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ターミナルでapt repositoryを登録してphp 7.2をインストールすればできます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=650&quot; data-filename=&quot;001.jpeg&quot; style=&quot;width: 734px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ubuntuではapache2のphp設定が別に必要ないです。これでphpのインストールは完了です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;apache2のドキュメントパスを修正します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=654&quot; data-filename=&quot;002.jpeg&quot; style=&quot;width: 734px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「/etc/apache2/sites-enabled」フォルダの「000-default.conf」のファイルを修正します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=657&quot; data-filename=&quot;003.jpeg&quot; style=&quot;width: 734px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「/home/htdocs」フォルダに「index.php」ファイルを追加してphpinfo()を作成しましょう。&lt;/p&gt;&lt;p&gt;そして「apache2」を再起動して「localhost」で接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=658&quot; data-filename=&quot;004.jpeg&quot; style=&quot;width: 734px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;##005##&lt;/p&gt;&lt;p&gt;phpがインストールされたことを確認できます。そして「php.ini」ファイルが何処にあるかを確認できます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpが完了しましたから、composerをインストールしましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先、curlをインストールしましょう。&lt;/p&gt;&lt;p&gt;そしてcurlのインストールファイルをダウンロードしてインストールします。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://getcomposer.org/download/&quot; target=&quot;_blank&quot;&gt;https://getcomposer.org/download/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=655&quot; data-filename=&quot;006.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ここまでcomposerはセット完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;簡単にライブラリを一つ連携して使用してみましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;php用composerレポジトリは下記通りです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://packagist.org/&quot; target=&quot;_blank&quot;&gt;https://packagist.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;javaのmavenレポジトリに比べると少し片付けれている雰囲気ではないけど、必要な情報はすべてあるので、良いサイトです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先、検索テキストにcarbonと言うことで検索してみましょう。参考にcarbonはphpでデートフォマットを使えるライブラリです。(date関数があるのに？)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=656&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;それでよく使える順位で検索させますが、一番上のリストをクリックしましょう。&lt;/p&gt;&lt;p&gt;様々な説明がありますが、我々はこのライブラリが目的ではなく、composerのリンクが目的なので一応installationの項目を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=653&quot; data-filename=&quot;008.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;その後、「composer.json」を作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=651&quot; data-filename=&quot;009.jpeg&quot; style=&quot;width: 462px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「composer install」で当該なレポジトリをタウンロードしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=660&quot; data-filename=&quot;010.jpeg&quot; style=&quot;width: 791px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これでインストールが完了したらしいです。ダウンロードしたライブラリを使ってみましょう。&lt;/p&gt;&lt;p&gt;作成が完了されたら「localhost」で確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=652&quot; data-filename=&quot;011.jpeg&quot; style=&quot;width: 373px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これでubuntuでphpとcomposerが使用できるので、開発環境のセットは完了ですね。&lt;/p&gt;=&quot;width: 848px;&quot;&amp;gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;その後、「composer.json」を作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=651&quot; data-filename=&quot;009.jpeg&quot; style=&quot;width: 462px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「composer install」で当該なレポジトリをタウンロードしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=660&quot; data-filename=&quot;010.jpeg&quot; style=&quot;width: 791px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これでインストールが完了したらしいです。ダウンロードしたライブラリを使ってみましょう。&lt;/p&gt;&lt;p&gt;作成が完了されたら「localhost」で確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=652&quot; data-filename=&quot;011.jpeg&quot; style=&quot;width: 373px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これでubuntuでphpとcomposerが使用できるので、開発環境のセットは完了ですね。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/114.html</guid><pubDate>Wed, 13 Nov 2019 07:35:07 +0900</pubDate></item><item><title>[Ubuntu] テーマ(Arc)を変更する方法(tweak)</title><link>https://www.nowonbun.com/113.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;筆者は貧しいデベロッパーなのでwindowosよりubuntuをよく使っています。windowは高いですが、ubuntuは無料だからですね。&lt;/p&gt;&lt;p&gt;でも、ubuntuが貧しい人が使うものではないです。もちろん、windowよりubuntuを好きなマニアックも多いです。&lt;/p&gt;&lt;p&gt;macはどうかな。。macは高いですね。筆者が考えてmacよりwindowがアプリも多いし、macが楽なことはよくしりません。それは人によって違うですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ubuntuを初めて使う時には基本テーマが綺麗ではないですね。少しやぼったいかな。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=649&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でもubuntuの特徴の一つがuiテーマを変更ができることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;筆者は別に気になるテーマがあることではありません。ただ、googleを検索して一番人気があるものを選択してインストールして使いますね。&lt;/p&gt;&lt;p&gt;今の経験でそのほうが一番満足だったんです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.omgubuntu.co.uk/2017/11/best-gtk-themes-for-ubuntu&quot; target=&quot;_blank&quot;&gt;https://www.omgubuntu.co.uk/2017/11/best-gtk-themes-for-ubuntu&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のリンクで人気テーマを検索するとarcテーマが一位でよく使うと書いています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=646&quot; data-filename=&quot;002.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のサイトは信用性が高いチャートや特別なサイトではなく、ただgoogle検索で一番上で表示されたサイトです。筆者が使うのはどのテーマが一位かが重要ではなく、arcデザインがいいし、そのサイトでただ１位だったという参照だけです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先、テーマをインストールするようには「tweak」と言うプログラムがインストールされなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=635&quot; data-filename=&quot;003.jpeg&quot; style=&quot;width: 708px;&quot;&gt;&lt;/p&gt;&lt;p&gt;私の場合は「tweak」というプログラムはもうインストールされています。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=636&quot; data-filename=&quot;004.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてターミナルでターマをダウンロードしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.ubuntupit.com/install-arc-theme-icon-ubuntu-fedora-linux-desktop/&quot; target=&quot;_blank&quot;&gt;https://www.ubuntupit.com/install-arc-theme-icon-ubuntu-fedora-linux-desktop/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ダウンロードが完了されるとapplicationsとiconにarcの語頭が付けているテーマがあることを確認できます。筆者の場合は「arc-dark」が気になって選択しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=638&quot; data-filename=&quot;005.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてshellとdockerのテーマも変更しましょう。&lt;/p&gt;&lt;p&gt;gnomeのshell拡張をターミナルでインストールしましょう。&lt;/p&gt;&lt;p&gt;firefoxで下記のサイトを接続しましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://extensions.gnome.org/&quot; target=&quot;_blank&quot;&gt;https://extensions.gnome.org/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=644&quot; data-filename=&quot;006.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして確認add-onをインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=642&quot; data-filename=&quot;007.jpeg&quot; style=&quot;width: 760px;&quot;&gt;&lt;/p&gt;&lt;p&gt;このサイトはgnom(ubuntuのグラフィックユーザインタフェースのos(gui))の拡張が可能なウィジェットがあるサイトです。テーマを変わるように必要なウィジェットは３つです。&lt;/p&gt;&lt;p&gt;メインリストで見えないと別々に検索すればでます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=648&quot; data-filename=&quot;008.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;インストールはウィジェットのページで上左に「off/on」のボタンがありますがそれを「on」にすればインストールします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=640&quot; data-filename=&quot;009.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=643&quot; data-filename=&quot;010.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=645&quot; data-filename=&quot;011.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;また、tweakのプログラムを実行するとshellの部分でビックリマークがなくなって設定できるようにドロップダウンがでます。(もしなければ、tweakプログラムを終了して再実行するとできます。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=639&quot; data-filename=&quot;012.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;筆者の場合はshellも「arc-dark」で設定しました。上のshellのテーマが変わったことを確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=634&quot; data-filename=&quot;013.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてextensionsタブに移動してdash to dockの画面に移動しましょう。&lt;/p&gt;&lt;p&gt;dockをbottomで設定してautohideをoffにしましょう。onにしたい方はそのままにおいてもいいですが、なんかバグがあるかなたまに反応しない時がありますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=647&quot; data-filename=&quot;014.jpeg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてiconサイズは画面によって変更すればよいです。個人的に「24」の設定がいいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=637&quot; data-filename=&quot;015.jpeg&quot; style=&quot;width: 640px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてappearanceタブのshrink the dashをチェックしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=641&quot; data-filename=&quot;016.jpeg&quot; style=&quot;width: 600px;&quot;&gt;&lt;/p&gt;&lt;p&gt;完成になりました。&lt;/p&gt;&lt;p&gt;ubuntuはこんなにテーマを自由に変更ができるのでよいです。探したらマックのスタイルのmacbuntuもあります。マックスタイルを好きなかたはそれを使ったらよいですね。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/113.html</guid><pubDate>Tue, 12 Nov 2019 07:40:11 +0900</pubDate></item><item><title>[Ubuntu] Apache2をインストールする方法</title><link>https://www.nowonbun.com/112.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述でcentosでapacheをインストールする方法に関して投稿したことがあります。別にubuntuだって差があることではないです。&lt;/p&gt;&lt;p&gt;「yum」のインストールから「apt-get」で変わったことと、環境設定ファイルパスが違うということですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;apt-getを利用してapache2をインストールします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=628&quot; data-filename=&quot;001.png&quot; style=&quot;width: 733px;&quot;&gt;&lt;/p&gt;&lt;p&gt;インストールが終わったら環境設定を修正しましょう。&lt;/p&gt;&lt;p&gt;環境設定ファイルは「/etc/apache2/apache2.conf」であります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=633&quot; data-filename=&quot;002.png&quot; style=&quot;width: 720px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ubuntu環境でも普通のapache設定とはそんなに差がないです。まだ、javaやtomcatとphpをインストールしなかったのでただ静的ウェブサーバですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の場合は「apache2 -t」というコマンドを実行すればエラーが表示されますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=629&quot; data-filename=&quot;003.png&quot; style=&quot;width: 732px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のファイルの環境ファイルを登録すると解決されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=630&quot; data-filename=&quot;004.png&quot; style=&quot;width: 735px;&quot;&gt;&lt;/p&gt;&lt;p&gt;また、ブラウザでローカルを接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=631&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ウェブサーバを立ち上げるのは完了しました。&lt;/p&gt;&lt;p&gt;ウェブページの基本ディレクトリは「/var/www/html」です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=632&quot; data-filename=&quot;006.png&quot; style=&quot;width: 721px;&quot;&gt;&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/112.html</guid><pubDate>Mon, 11 Nov 2019 07:29:19 +0900</pubDate></item><item><title>[Ubuntu] 「acquire the dpkg frontend lock」のエラーを解決方法</title><link>https://www.nowonbun.com/111.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ubuntuを利用する時に「apt-get」コマンドをよく使います。パッケージをインストールする時やアップデートする時や。。。&lt;/p&gt;&lt;p&gt;その時に、たまに「acquire the dpkg frontend lock」エラーが発生しますが、その時に解決方法です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;実は「acquire the dpkg frontend lock」のエラーはインストールやアップデート中でパソコンの電源を切る時、apt-getのロックがそのまま残っているままで「apt-get」でまたインストールやアップデートすると発生することですね。&lt;/p&gt;&lt;p&gt;また、別途のターミナルで「apt-get」を使う時も発生します。その時には解除するとngですね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=624&quot; data-filename=&quot;001.png&quot; style=&quot;width: 733px;&quot;&gt;&lt;/p&gt;&lt;p&gt;筆者の場合は「apt-get upgrade」中でパソコンパワを消してしまって、また起動してアップデードコマンドを実行したら発生しました。&lt;/p&gt;&lt;p&gt;先は「lock」をすべて削除します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=625&quot; data-filename=&quot;002.png&quot; style=&quot;width: 733px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=626&quot; data-filename=&quot;003.png&quot; style=&quot;width: 735px;&quot;&gt;&lt;/p&gt;&lt;p&gt;その後でまた「apt-get upgrade」のコマンドを実行しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=627&quot; data-filename=&quot;004.png&quot; style=&quot;width: 733px;&quot;&gt;&lt;/p&gt;&lt;p&gt;lock関係なエラーがなくなってupgradeが実行されました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;参照 - &lt;a href=&quot;https://www.linuxuprising.com/2018/07/how-to-fix-could-not-get-lock.html&quot; target=&quot;_blank&quot;&gt;https://www.linuxuprising.com/2018/07/how-to-fix-could-not-get-lock.html&lt;/a&gt;&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/111.html</guid><pubDate>Sun, 10 Nov 2019 22:20:09 +0900</pubDate></item><item><title>[Ubuntu] JavaインストールとEclipseをインストールする方法</title><link>https://www.nowonbun.com/110.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ubuntuのosはcentosと比べてサーバよりデスクトップで使う方が多いです。なので、centosではプログラム開発することより完成したプログラムをデプロイすることが多いです。&lt;/p&gt;&lt;p&gt;でもubuntuの場合はデスクトップで使うのでデプロイより開発する方法が多いですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaをインストールとjavaのideのeclipseをインストールして開発完了を作ってみましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;初期ubuntuをインストールするオプションでjavaをインストールする時もあるので一応インストールされているかを確認しましょう。&lt;/p&gt;&lt;p&gt;上のコマンドでjavaバージョン情報がでるとインストールされているし、「not found」というメッセージがでるとインストールされてないことです。&lt;/p&gt;&lt;p&gt;インストールは「apt install default-jdk」でインストールしました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=613&quot; data-filename=&quot;001.png&quot; style=&quot;width: 733px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=618&quot; data-filename=&quot;002.png&quot; style=&quot;width: 734px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=617&quot; data-filename=&quot;003.png&quot; style=&quot;width: 730px;&quot;&gt;&lt;/p&gt;&lt;p&gt;(イメージは間違ってjreをインストールしました。jdkも同じです。)&lt;/p&gt;&lt;p&gt;javaがインストールされたらeclipseサイトに接続しましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.eclipse.org/downloads/&quot; target=&quot;_blank&quot;&gt;https://www.eclipse.org/downloads/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=620&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=622&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=621&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ダウンロードが完了したら圧縮を解凍しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=619&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これから実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=616&quot; data-filename=&quot;008.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;正常に実行しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;eclipseの場合はショートカットはwindowみたいに簡単に作られないですね。ショートカットファイルを作成しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=615&quot; data-filename=&quot;009.png&quot; style=&quot;width: 732px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=623&quot; data-filename=&quot;010.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=614&quot; data-filename=&quot;011.png&quot; style=&quot;width: 437px;&quot;&gt;&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/110.html</guid><pubDate>Fri, 8 Nov 2019 07:31:45 +0900</pubDate></item><item><title>[Ubuntu] MariaDB(Mysql)をインストールする方法</title><link>https://www.nowonbun.com/109.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;mariadbに関しては以前centosでインストールする方法で説明したことがあります。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/106.html&quot; target=&quot;_blank&quot;&gt;[centos] mariadb(mysql)をインストール&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ubuntuもcentosでインストールすることと似てますね。&lt;/p&gt;&lt;p&gt;ただ、yumではなく、apt-getを利用してインストールすることだけです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先、ターミナルで接続して(ctrl + alt + t)apt-getでmariadbをインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=605&quot; data-filename=&quot;001.png&quot; style=&quot;width: 737px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=607&quot; data-filename=&quot;002.png&quot; style=&quot;width: 733px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これでインストールは完了しました。環境設定しましょう。&lt;/p&gt;&lt;p&gt;「/etc/mysql/mariadb.conf.d/」に移動して「50-server.cnf」を下記の設定で追加します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=610&quot; data-filename=&quot;003.png&quot; style=&quot;width: 708px;&quot;&gt;&lt;/p&gt;&lt;p&gt;次は「50-client.cnf」で下記の設定を追加します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=611&quot; data-filename=&quot;004.png&quot; style=&quot;width: 708px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてmariadbを再起動しましょう。&lt;/p&gt;&lt;p&gt;そして「mysql -u root -p」で接続します。初めはパスワードが設定されてないのでそのままenterキーで接続できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=606&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;初めは「root」のパスワードを変更しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=612&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「root」設定を完了しましたので、ユーザを追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=609&quot; data-filename=&quot;007.png&quot; style=&quot;width: 732px;&quot;&gt;&lt;/p&gt;&lt;p&gt;設定を完了しました。これからsqlブラウザで接続を確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=608&quot; data-filename=&quot;008.png&quot; style=&quot;width: 658px;&quot;&gt;&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/109.html</guid><pubDate>Thu, 7 Nov 2019 07:51:58 +0900</pubDate></item><item><title>[Ubuntu] Chromeをインストールする方法</title><link>https://www.nowonbun.com/108.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;linuxには大きい幅で種類が２つがありますね。redhat系のredhatとcentosとdebian系のubuntuがありますね。&lt;/p&gt;&lt;p&gt;redhat系はほとんどサーバosで使います。一般、デスクトップosモードもありますが、uiが可能なアプリも少ないし使用にくいですね。でも、プロセスやフリージング(パソコンが凍る現象)が少ないのでサーバとして合うと思います。&lt;/p&gt;&lt;p&gt;debian系のubuntuはcentosより安定性が落ちるけれど、互換アプリ、uiが可能なアプリが多いし、インストールがしやすいです。&lt;/p&gt;&lt;p&gt;コミュニティーも大きいので問題がある時にすぐ調べることも出来ます。&lt;/p&gt;&lt;p&gt;普通はデスクトップでwindowを使いますが、ライセンス費用がかかるので安くパソコンを運用したいならこのubuntuもいいではないかと思います。&lt;/p&gt;&lt;p&gt;筆者はパソコンが何台にありますが、windowは一台でその後は全てubuntuですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ubuntuは初期ブラウザでfirefoxがインストールされています。firefoxもいいブラウザですが、最近は多いウェブサイトがchromeでuiデザインが合わせていますのでchromeもインストールする必要がありますね。&lt;/p&gt;&lt;p&gt;先にgoogleのchromeページに接続します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=603&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;多分、ubuntuで接続するとlinux系のインストールができるファイルがでます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=602&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;そしてwindow環境みたいにダウンロードボタンを押下すると選択画面が出ます。rpmはyumでインストールすることで(実はrpmはrpmでインストールしなければならないですが、yumでもインストールができます。)debがubuntu環境でインストールするファイルなのでダウンロードしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=600&quot; data-filename=&quot;003.png&quot; style=&quot;width: 509px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ダウンロードが終われば実行します。そしたらubuntu software管理ウィンドウが開きますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=601&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ここでインストールボタンを押下してインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=604&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールが完了したらluncher(画面の左下)をクリックするとchromeがインストールされたことを確認できます。add to favoritesをクリックしてdockに固定ができます。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/108.html</guid><pubDate>Wed, 6 Nov 2019 19:48:19 +0900</pubDate></item><item><title>[CentOS] YUMについて、YUMが出来ない場合処理方法</title><link>https://www.nowonbun.com/107.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がよく使うウィンドウ環境はインストールパッケージファイルをダウンロードしてダブルクリックでインストールができます。&lt;/p&gt;&lt;p&gt;でも、linuxの場合はそんな簡単ではないです。サーバ起動する時に登録しなければならないし、パッケージ管理、依存性管理もしなければならないです。&lt;/p&gt;&lt;p&gt;それを一々で手動でするとすごく面倒になりますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それを管理するプログラムがありますが、それが「yum」です。&lt;/p&gt;&lt;p&gt;「yum」とは「yellowdog updater modified」の略語で「rpm基盤のシステムのため、自動アップデータ、パッケージ管理ツール」です。また「yum」は自動に依存性を処理してくれるし、rpmパッケージを安全にインストール、削除及びアップデートのため、必ずしなければならないものを自ら処理します。&lt;/p&gt;&lt;p&gt;簡単に説明するとスマートフォンなどであるappストアと似てます。パッケージは全て無料ですね。昔、スマートフォンがある前には不慣れな概念でしたが。。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;纏めて、「yum」は簡単で使用可能し、接近性もよいパッケージ管理ツールです。&lt;/p&gt;&lt;p&gt;「yum」に関して使用方法はコマンドで「yum help」で詳しく確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=598&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;table-responsive&quot;&gt;  &lt;table class=&quot;table table-striped table-bordered table-condensed&quot;&gt;    &lt;thead&gt;      &lt;tr style=&quot;background-color:#dad7d7&quot;&gt;        &lt;th&gt;コマンド&lt;/th&gt;        &lt;th&gt;説明&lt;/th&gt;      &lt;/tr&gt;    &lt;/thead&gt;    &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;yum check-update&lt;/td&gt;&lt;td&gt;現在、インストールされたプログラムでアップデータしたことをチェックします。&lt;/td&gt;      &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum clean all&lt;/td&gt;&lt;td&gt;キャッシュされたリストをクリアする。&lt;/td&gt;    &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum deplist&lt;/td&gt;&lt;td&gt;yumパッケージによる依存性テスト。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum downgrade パッケージ&lt;/td&gt;&lt;td&gt;yumをとおってパッケージをダウングレードする。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum erase パッケージ&lt;/td&gt;&lt;td&gt;yumをとおってシステムで削除する。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum groupinfo グループ&lt;/td&gt;&lt;td&gt;グループパッケージの情報を表示。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum groupinstall グループ&lt;/td&gt;&lt;td&gt;グループパケージをインストールする。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum grouplist グループ&lt;/td&gt;&lt;td&gt;グループリストに関する情報を確認する。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum groupremove グループ&lt;/td&gt;&lt;td&gt;グループリストに関して削除する。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum help&lt;/td&gt;&lt;td&gt;yumの使用方法を確認する。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum info グループまたはパッケージ&lt;/td&gt;&lt;td&gt;パッケージまたはグループのパッケージを詳しく確認する。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum install パッケージ&lt;/td&gt;&lt;td&gt;システムでパッケージのinstallを実施する。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum list&lt;/td&gt;&lt;td&gt;サーバにあるグループ及びパッケージのリスト&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum localinstall パッケージ&lt;/td&gt;&lt;td&gt;ローカルでインストールをします。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum makecache&lt;/td&gt;&lt;td&gt;キャッシュを再作成する。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum provides ファイルパス名&lt;/td&gt;&lt;td&gt;ファイルで提供するパッケージ情報&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum reinstall パッケージ&lt;/td&gt;&lt;td&gt;パッケージを再インストールする。&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum update パッケージ&lt;/td&gt;&lt;td&gt;パッケージをアップデータする。(yumのバージョン情報など)&lt;/td&gt;        &lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;yum upgrade パッケージ&lt;/td&gt;&lt;td&gt;パッケージをアップグレードする。(実際に当該プログラムを更新する。)&lt;/td&gt;      &lt;/tr&gt;    &lt;/tbody&gt;  &lt;/table&gt;&lt;/div&gt;&lt;h2&gt;&lt;b&gt;&lt;span&gt;centosを初めにインストールする時にyumが動作しない時&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;基本的に設定されているyumの接続urlが間違っていることもあるし、様々な理由でできない時があります。&lt;/p&gt;&lt;p&gt;その時に参照すればよいセット方法です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「/etc/resolv.conf」でdnsサーバ設定をしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=597&quot; data-filename=&quot;002.png&quot; style=&quot;width: 537px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のサーバアドレスは上は「cloudflare」で下は「google」dnsサーバです。速度及び安全性が一番いいものではないかと思います。&lt;/p&gt;&lt;p&gt;それに変更してyumの動作確認しましょう。&lt;/p&gt;&lt;p&gt;それでも出来なかった場合にはレポジトリを修正しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;基本的にcentosで提供するレポジトリで接続ができなければ、日本では「riken.jp」で提供するcentosレポジトリを使ったら良いです。&lt;/p&gt;&lt;p&gt;基本centosのレポジトリは外海だからかな、たまに遅くなり、接続が失敗する時あります。国内のレポジトリを使うとその可能性が低いので良いと思います。&lt;/p&gt;&lt;p&gt;レポジトリを修正するためにはvim編集ツールで「/etc/yum.repos.d/centos-base.repo」を修正すると良いです。&lt;/p&gt;&lt;p&gt;レポジトリ中で「baseurl」のurlアドレスが「mirrorlist.centos.org」を 「ftp.riken.jp/linux」に修正しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=599&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;設定した後でまた「yum」をテストしてそれでもエラーがなると再起動することでできます。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/107.html</guid><pubDate>Tue, 5 Nov 2019 07:21:20 +0900</pubDate></item><item><title>[CentOS] MariaDB(Mysql)をインストール</title><link>https://www.nowonbun.com/106.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;今回はcentosでmariadbをインストールしましょう。mariadbは旧mysqlと同じですが、mysqlがoracle社に買収されて配布しましたが、最近mysqlも無料ではなく、一部有料政策に変わって最初開発者が退職して無料sqlを作ったことがmaraidbです。&lt;/p&gt;&lt;p&gt;なので、mariadbをcentosにインストールしましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;mariadbをインストールする方法で様々がありますが、sourceで直接にコンパイルする方法、binaryでインストールする方法、yumを利用してインストールする方法があります。&lt;/p&gt;&lt;p&gt;筆者の場合は別に基本設定で使うつもりなので、管理がしやすいなyumでインストールします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=590&quot; data-filename=&quot;001.png&quot; style=&quot;width: 739px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のリストの中で「mariadb-server.x86_64」をインストールします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=592&quot; data-filename=&quot;002.png&quot; style=&quot;width: 739px;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;インストールが終わったらmariadbの環境設定しましょう。環境設定ファイルは「/etc/my.cnf」であります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=596&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;設定が完了したら起動設定に登録しましょう。&lt;/p&gt;&lt;p&gt;ここまでサーバ側の設定は完了しました。&lt;/p&gt;&lt;p&gt;内部データベースのユーザ追加とパスワード設定をしなければならないです。&lt;/p&gt;&lt;p&gt;一応、mysqlを接続してmysql dbでユーザテーブルを確認します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=593&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;見るとパスワードが設定されてないです。&lt;/p&gt;&lt;p&gt;一応、パスワード全体を設定しましょう。&lt;/p&gt;&lt;p&gt;上の場合は「root」ユーザはサーバローカルの場合はよいですが、外部だと接続ができません。でもrootのidを外部で公開する方はセキュリティの考えでは嫌ですね。&lt;/p&gt;&lt;p&gt;それでユーザを追加しましょう。&lt;/p&gt;&lt;p&gt;筆者の場合はcクラス192.168.0.%で公開しましたが、全体公開はただ「%」で設定すると全「ip」で公開されます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=594&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;最後でファイアウォールを開放しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=591&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;サーバではなく、自分のパソコンでsql編集ツールを利用して接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=595&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/106.html</guid><pubDate>Mon, 4 Nov 2019 18:36:24 +0900</pubDate></item><item><title>[CentOS] FTPインストールする方法(vsftpd)</title><link>https://www.nowonbun.com/105.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述でsambaのネットワークドライブに関してインストールしました。sambaの場合は「c class」中で簡単にファイルを電送しますが、問題は「c class」内部ではなく、外部ならsambaを利用ができません。&lt;/p&gt;&lt;p&gt;なので、外部でサーバにファイルを電送するようにはファイルプロトコールが必要ですが、それが「ftp」です。&lt;/p&gt;&lt;p&gt;ftpとは「file transfer protocol」の略語でサーバの初期設定でsambaほど重要な設定だと考えられます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで「ftp」をインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=587&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;インストールは完了しました。設定ファイルで設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=588&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;サーバ起動時、vsftpdも起動されるような設定です。&lt;/p&gt;&lt;p&gt;次はファイアウォールを解除しましょう。&lt;/p&gt;&lt;p&gt;次に「selinux」を解除する方法です。&lt;/p&gt;&lt;p&gt;設定は完了しました。これから接続して確認しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=589&quot; data-filename=&quot;003.png&quot; style=&quot;width: 576px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=586&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;接続が完了しました。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/105.html</guid><pubDate>Fri, 1 Nov 2019 07:30:32 +0900</pubDate></item><item><title>[CentOS] SAMBAインストール方法</title><link>https://www.nowonbun.com/104.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;会社や組織グループの中でよくいうネットワークドライブという格納の場所があります。&lt;/p&gt;&lt;p&gt;でも、ネットワークドライブではなく、正式なプロコール名は「samba」です。&lt;/p&gt;&lt;p&gt;sambaとは「session message block」というプロトコールでcクラスネットワーク、すなわち192.168.0.1のipを持っている環境なら、192.168.0.xxxの範囲でプリンターやファイルなどを共有するようなプログラムということです。&lt;/p&gt;&lt;p&gt;それでsambaをインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=581&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;インストールはyumを利用して簡単に完了しました。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ファイアウォールの解除と共有フォルダーを設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=582&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;解除されました。共有フォルダーを設定します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=584&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;次はsambaパスワードを設定しましょう。このパスワードはサーバを接続パスワードではなく、samba接続パスワードです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=583&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;サーバが起動する時にsambaを起動するような設定をしましょう。&lt;/p&gt;&lt;p&gt;参考にselinuxで接続できない場合は解除する方法を下記通りです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=585&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;接続が確認できました。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/104.html</guid><pubDate>Wed, 30 Oct 2019 07:39:42 +0900</pubDate></item><item><title>[CentOS] PHPインストールする方法</title><link>https://www.nowonbun.com/103.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpとは「apache」サーバの基盤で動作するウェブスクリプトプログラム言語です。phpはjavaとc#と比べてコンパイル言語ではなく、スクリプト言語です。&lt;/p&gt;&lt;p&gt;phpの良い点は軽く、早く開発できるし、サーバの再起動がなしでソース修正が可能なことが利点ではないかと思います。悪い点はやはりスクリプト言語なので、サイトが大きくなると遅くなるしソース管理が難しくなるということです。&lt;/p&gt;&lt;p&gt;まぁ。開発者の腕によって違うことですからね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それではcentosでphpをインストールしましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;phpの場合は「yum」を通ってインストールしましょう。&lt;/p&gt;&lt;p&gt;先、listを通ってphpを確認しましょう。でも、phpバージョンが低いですね。。。現在は「php7」なのに。。「yum」ではなく、直接にインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=570&quot; data-filename=&quot;001.png&quot; style=&quot;width: 788px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=571&quot; data-filename=&quot;002.png&quot; style=&quot;width: 789px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「yum」のconfigで「php5.4」を非活性化して「php7.3」を活性化しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=575&quot; data-filename=&quot;003.png&quot; style=&quot;width: 789px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=576&quot; data-filename=&quot;004.png&quot; style=&quot;width: 789px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=577&quot; data-filename=&quot;010.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これからインストールする雰囲気になります。&lt;/p&gt;&lt;p&gt;phpと関係あるライブラリをインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=579&quot; data-filename=&quot;005.png&quot; style=&quot;width: 789px;&quot;&gt;&lt;/p&gt;&lt;p&gt;インストールが完了でサービスを活性化します。&lt;/p&gt;&lt;p&gt;これで「php-v」でphpのバージョンを確認すればphpがよくインストールされていることを確認できます。&lt;/p&gt;&lt;p&gt;でも、ただのphpインストールだけではなく、「apache」を通ってphpが動くことを確認しなければ完了ではないですね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=580&quot; data-filename=&quot;006.png&quot; style=&quot;width: 789px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これから「httpd」の環境設定ディレクトリに移動しましょう。&lt;/p&gt;&lt;p&gt;httpd.confの下の部分で下記の構文を追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=574&quot; data-filename=&quot;007.png&quot; style=&quot;width: 789px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「dir_module」でスタートページで「index.php」を追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=573&quot; data-filename=&quot;008.png&quot; style=&quot;width: 727px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「/var/www/http」のディレクトリに「phpinfo.php」ファイルを作成して下記の内容を入れましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=572&quot; data-filename=&quot;009.png&quot; style=&quot;width: 589px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてブラウザで./phpinfo.phpに接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=578&quot; data-filename=&quot;011.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のphpの仕様に関して表がでればインストール成功です。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/103.html</guid><pubDate>Tue, 29 Oct 2019 20:10:02 +0900</pubDate></item><item><title>[CentOS] ApacheとTomcatの連携</title><link>https://www.nowonbun.com/102.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;前述でcentosでapacheとtomcatをインストールしました。&lt;/p&gt;&lt;p&gt;先にtomcatの場合は独立でウェブサーバで運用できますが、なぜ別で「apache」をインストールして「tomcat」を連携するのかは「tomcat」は確かにウェブサーバの機能がありますが、「apache」よりロードバランシングや仮想機能が落ちています。&lt;/p&gt;&lt;p&gt;最近、バージョンが「9.x」まで上がって性能が以前よりは良くなりましたが、それでも分ける方がよいですね。&lt;/p&gt;&lt;p&gt;筆者の場合はサーバで「java」だけではなく、jsp、phpなど混在してプログラミングするタイプなので、「apache」の「virtual host」機能をよく使うので、「tomcat」のサーバの一つだけではなく、様々な「tomcat」かつ一つの「apache」を紐付いて使っています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで、「apache」と「tomcat」を連携しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=566&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;先、「tomcat」にはhttpポートを設定してブラウザと通信するhttpプロトコル領域があります。または、「ajp」プロトコルという「apache」と通信するポートがあります。&lt;/p&gt;&lt;p&gt;「apache」と「tomcat」を連携するようにはこの「ajp」プロトコルを利用しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「apache」側で「ajp」プロトコルを使うようには「mod_jk」がインストールされなければならないです。&lt;/p&gt;&lt;p&gt;mok_jk - &lt;a href=&quot;https://tomcat.apache.org/download-connectors.cgi&quot; target=&quot;_blank&quot;&gt;https://tomcat.apache.org/download-connectors.cgi&lt;/a&gt;&lt;/p&gt;&lt;p&gt;圧縮を解凍したらこれからコンパイルをしなべきです。「native」フォルダにいきましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=567&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「/etc/httpd/modules」フォルダで「mod_jk.so」ファイルがあれば、コンパイル成功です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=561&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「httpd.conf」に行って下記とおりに設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=564&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;その後、「workers.properties」を作成しましょう。筆者の場合は「jenkins」とウェブサーバがあるので２つで設定しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=563&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;また「httpd.conf」を下記とおりに追加しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=565&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そしてそれぞれのディレクトリに「apache」権限を与えます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=569&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=568&quot; data-filename=&quot;008.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=562&quot; data-filename=&quot;009.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/102.html</guid><pubDate>Tue, 29 Oct 2019 07:37:07 +0900</pubDate></item><item><title>[CentOS] Tomcat インストール方法</title><link>https://www.nowonbun.com/101.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaでウェブサーバーを立ち上がるようには「apache-tomcat」が必要です。&lt;/p&gt;&lt;p&gt;「apache-tomcat」とはウェブブラウザからhttp要請が来る時に動的にウェブページを作り直し、ウェブブラウザに応答するウェブアプリケーションサーバ(was)です。&lt;/p&gt;&lt;p&gt;正確にいうとウェブサーバではなく、ウェブアプリケーションサーバですね。でもこのトムキャットは「apache」機能も一部含めているので、独立でサーバを立ち上がることができます。&lt;/p&gt;&lt;p&gt;でも、ロードバランシングや仮想ホストなどで純正な「apache」よりはパフォーマンスや機能が足りないので、実際には「apache」 + 「tomcat」でサーバを構成することになります。&lt;/p&gt;&lt;p&gt;開発環境は「tomcat」だけでも十分ですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「centos」に「tomcat」をインストールしましょう。&lt;/p&gt;&lt;p&gt;先、「tomcat」をサーバで使うようには「java」が先にインストールされなければならないです。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/100.html&quot; target=&quot;_blank&quot;&gt;[centos] java インストール&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=552&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これから「/usr/local/lib」のディレクトリに行ってトムキャットをダウンロードしましょう。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://tomcat.apache.org/download-90.cgi&quot; target=&quot;_blank&quot;&gt;https://tomcat.apache.org/download-90.cgi&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=558&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=554&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ダウンロードが終わったら圧縮を解凍して、起動しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=557&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=556&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ファイアウォールでウェブポート(tomcatの場合は基本8080)を開放しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=553&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ブラウザで8080ポートで接続すれば下記とおりの結果がでます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=559&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;起動することができたら、サーバが起動するたびに自動にトムキャットと起動されるように設定しなければならないです。&lt;/p&gt;&lt;p&gt;「/etc/rc.d/init.d」に行って「tomcat」という起動実行ファイルを作りましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=551&quot; data-filename=&quot;008.png&quot; style=&quot;width: 767px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そこで下記とおりにスクリプトを作成しましょう。&lt;/p&gt;&lt;p&gt;そのファイルタイプを「chmode」で変更して「chkconfig」で登録すれば完了になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=555&quot; data-filename=&quot;009.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/101.html</guid><pubDate>Tue, 29 Oct 2019 07:28:47 +0900</pubDate></item><item><title>[CentOS] Java インストール</title><link>https://www.nowonbun.com/100.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaをcentosにインストールする方法では二つがあります。先、「yum」をとおってインストールする方法と直接にjavaをダウンロードして圧縮を解凍してパス設定する方法があります。&lt;/p&gt;&lt;p&gt;個人的には「yum」を通ってインストール方法が良いと思います。なぜなら「yum」でインストールする後で「update」管理を受け取られるからです。でも「production」サーバや「java」バージョンに敏感なプロジェクトの場合は「yum」より手動で管理するほうが良いと思います。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先に手動にインストール方法を確認して「yum」でインストールする方法も確認しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;javaのホームページに行きましょう。&lt;/p&gt;&lt;p&gt;javaホームページ - &lt;a href=&quot;https://www.oracle.com/technetwork/java/javase/downloads/index.html&quot; target=&quot;_blank&quot;&gt;https://www.oracle.com/technetwork/java/javase/downloads/index.html&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=546&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;サーバで運用するjvmをインストールすることなのでjreでも別にいいですが、なんか自分の場合はjdkが楽ですね。我々はjreのjvmを使うので別にどっちでもよいですが筆者はjdkでインストールします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=550&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;64ビットと32ビットがあるし、rpmとtar.gzの種類が二つがあります。先にosのビットは「getconf long_bit」で確認できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=536&quot; data-filename=&quot;003.png&quot; style=&quot;width: 589px;&quot;&gt;&lt;/p&gt;&lt;p&gt;rpmの場合は「yum」でインストールすることなので一応スキップして手動のインストールなので「tar.gz」でダウンロードします。&lt;/p&gt;&lt;p&gt;(wgetでダウンロードすると認証エラーになります。ただ、私はウェブでダウンロードして「samba」でコピーしました。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=549&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=535&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;筆者は綺麗に「/usr/local/lib」でコピーしておきました。これから圧縮を解凍しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=542&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=538&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;シンボリックリンクを設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=537&quot; data-filename=&quot;008.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「/etc/profile」でパスを指定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=540&quot; data-filename=&quot;009.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ここで「source profile」でもよいし再起動してもよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=547&quot; data-filename=&quot;010.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ここまでが手動インストールです。これからは「yum」をとおってインストールしましょう。先に「yum list」でなにがあるか確認しましょう。ただ「java*」で検索するとデータが多すぎで「java-1.8.0*」で検索しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=548&quot; data-filename=&quot;011.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;1.8.0バージョンだけで種類がすごく多いですね。この種類はよくしらなくただ「devel」が含めている名をインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=544&quot; data-filename=&quot;012.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=543&quot; data-filename=&quot;013.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「java」の依存性があるアプリもすべてインストールしますね。インストールが終わりました。でも「yum」でインストールしても環境変数の設定はしなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=541&quot; data-filename=&quot;014.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「yum」でインストールすると「java」が「/usr/lib/jvm」でインストールされます。インストールパスが少しおかしいと思いますが、我々が必要なことはシンボリックリンクだけなのでリンクで設定しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=539&quot; data-filename=&quot;015.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ここも「source profile」でもよいし再起動してもよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=545&quot; data-filename=&quot;016.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;インストール終わりです。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/100.html</guid><pubDate>Mon, 28 Oct 2019 00:23:28 +0900</pubDate></item><item><title>[CentOS] apacheをインストールする方法</title><link>https://www.nowonbun.com/99.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我々がサーバosをインストールする理由はいつも動いているサーバプログラムを起動するためですね。その中で代表的なことがウェブサーバです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブサーバの種類は様々がありますが、その中で「iis」と「apache」が有名ではないかと思いますね。&lt;/p&gt;&lt;p&gt;でも「iis」の場合はlinux型ではなく、windowサーバosで動いているし、ウェブサーバと言っても実はasp.netとaspのアプリサーバというのが近いですね。&lt;/p&gt;&lt;p&gt;参考にウェブアプリサーバはブラウザとウェブサーバが通信する時に必要な応答ヘッダとボディを動的にパーシングするの役のサーバです。つまり、「iis」の場合はwindowサーバosので動いてるしウェブサーバとアプリサーバ機能があるウェブサーバです。&lt;/p&gt;&lt;p&gt;「apache」の場合はwindowとlinuxバージョン両方あります。基本的に「apache」だけにはアプリサーバ機能はありません。&lt;/p&gt;&lt;p&gt;なので静的なファイルを要請、応答することです。拡張機能で「php」をつけるとphp言語はパーシングができます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その後でウェブサーバはトラフィック分散機能、仮想機能などがありますが、それは別途で必要な時に投稿します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これから「apache」をインストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=530&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;インストールが完了するとサーバを起動しましょう。&lt;/p&gt;&lt;p&gt;ファイアウォールも設定しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=531&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;これからブラウザを接続して下記通りに画面が出るとokです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=534&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;後は、サーバosが起動する時に自動にサーバが起動できるように設定をしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=529&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;サービスがdisabledになっていますね。&lt;/p&gt;&lt;p&gt;上のコマンドを実行すると「enable」に変わります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=533&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そうするとサーバを再起動しても「apache」が起動します。環境設定パスは「/etc/httpd」です。&lt;/p&gt;&lt;p&gt;「/etc/httpd」の中には「conf」のディレクトリがありますが、そこで「httpd.conf」が「apache」の環境設定ファイルです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=532&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/99.html</guid><pubDate>Fri, 25 Oct 2019 21:44:13 +0900</pubDate></item><item><title>[Linux] ディスク使用率チェック(df, du, lsof)とdfバグを解決方法</title><link>https://www.nowonbun.com/98.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;centosを運用する時にハードディスクの量を確認しべきな時があります。それを「df」,「du」のコマンドで確認ができます。&lt;/p&gt;&lt;p&gt;でも、「df」と「du」の場合はチェックする方法が違い「df」の場合でバグが発生する時があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最近、centos運用中でサーバディスクがいっぱいになった時があります。普通のローカルのウィンドウpcだとハードディスクの量が足りなかったらアラムメッセージが出るからすぐ気づきますが、centosの場合は別にメッセージもないし、普通はリモートでターミナルで運用するからよく知ることが大変ですね。&lt;/p&gt;&lt;p&gt;私の場合はファイルをアップロードする時に急にアップロードができなくなって、何かとみたらハードディスクがいっぱいになっていました。&lt;/p&gt;&lt;p&gt;サーバでそれぞれのアプリケーションを運用するからログがたくさん貯まっていましたよね。よく確認しなければならないです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;その時に確認する方法が「df -h」コマンドでした。rootで「du -hs *」で確認する方法もあります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=523&quot; data-filename=&quot;001.jpg&quot; style=&quot;width: 713px;&quot;&gt;&lt;/p&gt;&lt;p&gt;すごく簡単です。そして実際に「df -h」と「du -hs *」のコマンドを実行すれば「df -h」の方が処理速度が早いです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;でもこの「df -h」はバグがあります。「df」のコマンドはそれぞれのアプリケーションでよく使うコマンドなので困りますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=526&quot; data-filename=&quot;002.jpg&quot; style=&quot;width: 845px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のイメージで自分のファイルリストを見れば、トムキャットのログがすごく貯まっていますね。約36gbファイルが２つありますね。ログで。。。&lt;/p&gt;&lt;p&gt;実は私がトムキャットの設定が間違っているから発生したことですが、一応、そのことは対応してログを消さなければならないですね。それでそのファイルを消しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=524&quot; data-filename=&quot;003.jpg&quot; style=&quot;width: 673px;&quot;&gt;&lt;/p&gt;&lt;p&gt;それでもう一度「df -h」と「du -hs *」を確認すると「du -hs *」で見るのは確実に60gbが減らしました。でも「df -h」はそのままですね。&lt;/p&gt;&lt;p&gt;私が確かにログファイルを消したので「du -hs *」の結果が合ってると思います。&lt;/p&gt;&lt;p&gt;そうすると「df -h」が問題ですが。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;様々を調べると多分「ioライブラリ」と関係がありそうです。コネクションによって問題が発生したと意味ですが。。コネクションによって問題になる気がします。&lt;/p&gt;&lt;p&gt;以前にも私の場合は同じエラーがなった時があります。その時もハードディスクの使用率が「100%」まで使ったことがあります。やはりその時もログを全て消しましたが、ディスクがいっぱいでエラーに発生して再起動した記憶があります。&lt;/p&gt;&lt;p&gt;そのことが多分「df -h」と関係がありそうですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;私の結論は「du」のコマンドは物理的データを確認するから正確値で出ますが、ioと関係あるライブラリを「df」コマンドと関係があり、実際にディスクが空いても「df -h」上でデータがいっぱいになっているともうファイル書き込むのが出来ないという意味です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで「lsof」コマンドでioクリアができるので、インストールしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=525&quot; data-filename=&quot;004.jpg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「lsof」コマンドを実行したら下記とおりの結果が出ました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=528&quot; data-filename=&quot;005.jpg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;確実に「5388」のpsを持っているアプリが「deleted」ファイルのコネクションを捕まっていることが見えます。プロセスキルするほうが簡単ですが、ただプロセスキルよりなんのプログラムということを確認して再起動がいいでしょう。&lt;/p&gt;&lt;p&gt;「ps」のコマンドで確認すると知れるが、上のイメージだけでもトムキャットだってすぐ予想ができますね。&lt;/p&gt;&lt;p&gt;それでトムキャットを再起動しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=527&quot; data-filename=&quot;006.jpg&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;再起動をすれば、一応アプリが落ちる時にリソースを全てosに返却するので、コネクションも解除されますね。その後「df -h」のコマンドで確認するとハードディスクが戻りました。&lt;/p&gt;&lt;p&gt;それで別にプロセスキルや再起動しなくてもリソースを使えるようになりました。&lt;/p&gt;&lt;p&gt;多分、ディスクがあるのにioエラーが発生する方はこの方法も考慮するほうが良いと思いますね。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/98.html</guid><pubDate>Thu, 24 Oct 2019 21:47:26 +0900</pubDate></item><item><title>[CentOS] Wheel設定</title><link>https://www.nowonbun.com/97.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;centosをインストールする時には基本「root」のidでパスワードを設定します。でもサーバでidをそのままを置いたらもしサーバが露出されると最高権限の「root」が見つかれされてしまいます。&lt;/p&gt;&lt;p&gt;そのままだとサーバのセキュリティに大問題になります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで「root」のidを接続を制限して「wheel」のグループのidで接続して「sudo su」で管理者権限(root)を受け取って運用することになります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それで「wheel」権限を設定してみましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;先、vi編集ツールで「/etc/pam.d/su」のファイルを開きます。&lt;/p&gt;&lt;p&gt;編集ツールで確認すると「auth required pam_wheel.so usd_uid」部分にコメント(#)になっています。この部分のコメントを解除します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=517&quot; data-filename=&quot;001.png&quot; style=&quot;width: 666px;&quot;&gt;&lt;/p&gt;&lt;p&gt;その後、ユーザを追加しましょう。もう登録したユーザがあれば諸略してもよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=518&quot; data-filename=&quot;002.png&quot; style=&quot;width: 553px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして追加したユーザを「wheel」グループに追加します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=519&quot; data-filename=&quot;003.png&quot; style=&quot;width: 528px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「bin」にある「su」のファイルを「wheel」グループに実行権限を与えましょう。&lt;/p&gt;&lt;p&gt;最後に「root」のidを隠します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=521&quot; data-filename=&quot;004.png&quot; style=&quot;width: 567px;&quot;&gt;&lt;/p&gt;&lt;p&gt;その後、サーバをrebootをします。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=520&quot; data-filename=&quot;005.png&quot; style=&quot;width: 393px;&quot;&gt;&lt;/p&gt;&lt;p&gt;rootで接続を試したが、認証失敗のメッセージが出ました。&lt;/p&gt;&lt;p&gt;最後に登録したユーザで接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=522&quot; data-filename=&quot;006.png&quot; style=&quot;width: 509px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「sudo su」でコマンドを入れると権限が「root」に代わります。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/97.html</guid><pubDate>Wed, 23 Oct 2019 23:55:04 +0900</pubDate></item><item><title>[CentOS] システムの文字セット変更</title><link>https://www.nowonbun.com/96.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;centosをインストールする時に日本語でインストールする方もいると思いますが、普通では英語でインストールをします。&lt;/p&gt;&lt;p&gt;インストールする時に勝手に日本語名のディレクトリーができることがあるからです。最近はそうではないと思いますが。。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;なので、英語でインストールしてユーザ別で文字セットを設定します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;文字セットをする方法では下記のコマンド名で修正します。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=512&quot; data-filename=&quot;001.png&quot; style=&quot;width: 592px;&quot;&gt;&lt;/p&gt;&lt;p&gt;一応、私の場合は「ja_jp.eucjp」なので「ja_jp.utf8」をダウンロードしなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=515&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=513&quot; data-filename=&quot;003.png&quot; style=&quot;width: 531px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「ja_jp.utf8」があります。文字セットを変更しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=514&quot; data-filename=&quot;004.png&quot; style=&quot;width: 540px;&quot;&gt;&lt;/p&gt;&lt;p&gt;リブートすると日本語がちゃんとできました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=516&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そのあとでサーバーをリブートすると文字セットが変わっています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;文字セットを変わって文字化けになると下記のリンクを参考してください。&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.nowonbun.com/94.html&quot; target=&quot;_blank&quot;&gt;[linux] putty使用方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;上のリンクを参考すると解決します。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/96.html</guid><pubDate>Mon, 21 Oct 2019 17:01:35 +0900</pubDate></item><item><title>[CentOS] Vim編集ツールをインストールする方法</title><link>https://www.nowonbun.com/95.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;linuxを使う時、よく使うエディタがvi編集ツールではないかと面ます。でもvi編集ツールはウィンドウosで考えるとメモ帳ですね。&lt;/p&gt;&lt;p&gt;メモ帳はただのime編集機能しかないので、普通は「sakura」や「notepad++」を使いますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「linux」と同じ状況なので「vi」はただメモ帳なら「vim」ならターミナルの「sakura」や「notepad++」ですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それならインストールをしましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=510&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=511&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;vi編集ツールとvim編集ツールをhttpd.confファイルでどの差があるかを確認しましょう。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;下記はvi編集ツールです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=509&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;下記はvim編集ツールです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=508&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;色が付けているので可読性がよいですね。その以外に検索、grep機能などがよいといいますが、自分もそこまでの差はよく知らないですね。&lt;/p&gt;&lt;p&gt;もともとvi編集ツールも悪くないからですね。でも、linuxターミナルをよく使う人はvim編集ツールをよく使いますね。&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/95.html</guid><pubDate>Mon, 21 Oct 2019 00:25:09 +0900</pubDate></item><item><title>[Linux] Putty使用方法</title><link>https://www.nowonbun.com/94.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サーバの種類は色々がありますが、代表的には「linux server」と「window server」があります。「window server」なら「window」のosから「remote desktop」という基本プログラムを利用して接続します。&lt;/p&gt;&lt;p&gt;「linux」の場合は「ssh」プロトコルで接続しなければならないですが、「window」では基本プログラムがないですね。&lt;/p&gt;&lt;p&gt;「ssh」で接続するプログラムが様々なことがありますが、その中で機能は少ないけれども、すごく軽くて簡単に使える「putty」があります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.putty.org/&quot; target=&quot;_blank&quot;&gt;https://www.putty.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ダウンロード - &lt;a href=&quot;https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe&quot; target=&quot;_blank&quot;&gt;https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;上のリンクでダウンロードして実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=496&quot; data-filename=&quot;001.png&quot; style=&quot;width: 452px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「putty」はすごく簡単なプログラムなので特に説明することがないですね。&lt;/p&gt;&lt;p&gt;基本設定のほどを説明します。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;サーバをインストールする時に文字でエラーが発生しないようにほとんど英語でインストールしますが、たまに日本語バージョンでインストールする時があります。&lt;/p&gt;&lt;p&gt;その時に文字化けが発生するときがあります。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;それを解決する方法はエンコーディング種類を変更すればできます。&lt;/p&gt;&lt;p&gt;「window」=&amp;gt;「translation」項目でキャラクターセットを変更すればよいです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=498&quot; data-filename=&quot;002.png&quot; style=&quot;width: 451px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「putty」の基本色は黒い背景で白い文字が基本ですね。ディレクトリやファイルタイプによって色が変わります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=497&quot; data-filename=&quot;004.png&quot; style=&quot;width: 661px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=501&quot; data-filename=&quot;005.png&quot; style=&quot;width: 452px;&quot;&gt;&lt;/p&gt;&lt;p&gt;また、黒い背景で白い文字を変更したいなら、変更ができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=503&quot; data-filename=&quot;006.png&quot; style=&quot;width: 452px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=504&quot; data-filename=&quot;007.png&quot; style=&quot;width: 452px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=500&quot; data-filename=&quot;008.png&quot; style=&quot;width: 452px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=499&quot; data-filename=&quot;009.png&quot; style=&quot;width: 661px;&quot;&gt;&lt;/p&gt;&lt;p&gt;格納したディフォルト設定は「regedit」で削除ができます。もちろんバックアップもできますね。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=505&quot; data-filename=&quot;010.png&quot; style=&quot;width: 415px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=506&quot; data-filename=&quot;011.png&quot; style=&quot;width: 718px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「コンピューター\hkey_current_user\softeare\simon tatham」を削除すれば、設定がすべてなくなるし「エクスポート」するとバックアップができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=507&quot; data-filename=&quot;012.png&quot; style=&quot;width: 709px;&quot;&gt;&lt;/p&gt;</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/94.html</guid><pubDate>Sun, 20 Oct 2019 00:56:11 +0900</pubDate></item><item><title>[Window] Apacheをインストール方法、サービスに登録する方法。</title><link>https://www.nowonbun.com/93.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ウェブサーバということで代表的なミドルウェアは「apache」と「iis」があります。&lt;/p&gt;&lt;p&gt;「iis」の場合はwindowサーバの専用のウェブサーバです。iisで使えるプログラム言語は「asp」と「asp.net」があります。追加モジュールをインストールすると「php」や「java」も出来ないことではないですが、普通で使わないです。&lt;/p&gt;&lt;p&gt;「apache」の場合はwindowサーバやlinuxサーバで別にosの関係なくて運用できるウェブサーバです。「apache」の場合はアプリサーバではないので「apache」ままでは静的ウェブページと「perl」、「python」だけを使えますが、「tomcat」や「php」を拡張すると「java」や「php」まで使えます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.apache.org&quot; target=&quot;_blank&quot;&gt;https://www.apache.org&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=494&quot; data-filename=&quot;001.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;実は上の公式ホームページでは「apache」サーバをダウンロードができません。いや、正確にいうとコンパイル前のソースがあるのでダウンロードしてもコンパイルをしなければならないです。&lt;/p&gt;&lt;p&gt;その手続きが簡単ではないですね。&lt;/p&gt;&lt;p&gt;それでコンパイルされたファイルをダウンロードしなければならないですが、それは別のアドレスで提供しています。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;link - &lt;a href=&quot;https://www.apachelounge.com/download/&quot; target=&quot;_blank&quot;&gt;https://www.apachelounge.com/download/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=495&quot; data-filename=&quot;002.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;この間まではバージョン2.2も提供しましたが、もう、提供しないらしいですね。それなら「2.4」バージョンをダウンロードしましょう。&lt;/p&gt;&lt;p&gt;ダウンロードして適当なところで解凍しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=484&quot; data-filename=&quot;003.png&quot; style=&quot;width: 642px;&quot;&gt;&lt;/p&gt;&lt;p&gt;そして「conf」フォルダの中で「httpd.conf」ファイルがありますが、メモ帳で開きます。&lt;/p&gt;&lt;p&gt;その中で「server root」を変更しなければならないです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=485&quot; data-filename=&quot;004.png&quot; style=&quot;width: 434px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上の37行目で「serverroot」が「c:\apache24」で設定されていますね。&lt;/p&gt;&lt;p&gt;私の場合はdドライブでインストールしましたので、「d:\apache」で設定しました。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=486&quot; data-filename=&quot;005.png&quot; style=&quot;width: 393px;&quot;&gt;&lt;/p&gt;&lt;p&gt;2.2バージョンでは置換子がなかったので修正する項目が多かったが、2.4バージョンは置換子(define)があるのでそこだけ修正すれば良いですね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;コンソールに当該なディレクトリに移動して「bin」フォルダの「httpd」を実行しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=487&quot; data-filename=&quot;006.png&quot; style=&quot;width: 414px;&quot;&gt;&lt;/p&gt;&lt;p&gt;後、ブラウザに「localhost」を打って接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=488&quot; data-filename=&quot;007.png&quot; style=&quot;width: 474px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「it&apos;s work」という文言が出ればきちんとインストールがされていることです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これから「apache」を「window service」に同録しましょう。&lt;/p&gt;&lt;p&gt;「apache」をサービスに同録する方法では「httpd」のコマンドで「-k」オプションを与えると登録できます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=489&quot; data-filename=&quot;008.png&quot; style=&quot;width: 733px;&quot;&gt;&lt;/p&gt;&lt;p&gt;※もし登録中で上のメッセージではなく、エラーが発生する場合は管理者モードですると出来ます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからサービス設定に行きます。コマンド名は「service.msc」です。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=490&quot; data-filename=&quot;009.png&quot; style=&quot;width: 694px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=492&quot; data-filename=&quot;010.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「apache」を起動しましょう。&lt;/p&gt;&lt;p&gt;また、ブラウザで「localhost」を打って接続しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=488&quot; data-filename=&quot;007.png&quot; style=&quot;width: 474px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「it&apos;s work」が出れば、ちゃんと同録して起動されますね。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;これからは「window service」から「apache」サービスを解除しましょう。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=491&quot; data-filename=&quot;011.png&quot; style=&quot;width: 466px;&quot;&gt;&lt;/p&gt;&lt;p&gt;逆に「install」のオプションを「uninstall」に変わるとよいです。参考に「uninstall」だってサービス名を入力しなければ、エラーになります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=493&quot; data-filename=&quot;012.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;※もしサービスで無くならなく、そのままあればサービス停止してサービスウィンドウを閉じて再起動するとなくなります。&lt;/p&gt;</description><category>Devlopment note / Window</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/93.html</guid><pubDate>Fri, 18 Oct 2019 07:38:38 +0900</pubDate></item><item><title>[Window] WindowでExplorerのContext menuを修正する方法。</title><link>https://www.nowonbun.com/1.html</link><description>&lt;p&gt;こんにちは。明月です。&lt;/p&gt;&lt;p&gt;我々が「window」を使う間に「context」メニューをカスタムマイズや編集ができれば「window」運用中でもっと楽になるではないかと思ったことがあります。&lt;/p&gt;&lt;p&gt;その前に「window」の「context」メニューが何かと言うと「window」の画面のバックグラウンドにマウスの右クリックすると出るメニューです。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=472&quot; data-filename=&quot;001.png&quot; style=&quot;width: 269px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のイメージのメニューが「context」。メニューです。(ここで「context」メニュを知らないなら説明が続けられないので、「window」のバックグラウンドでマウス右クリックしてみて確認してください。)&lt;/p&gt;&lt;p&gt;そうするとこれから「context」メニューに命令語を登録して編集してみます。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;「window」の環境設定は「regedit」というところに「window」の全て設定があります。例えば、拡張名が「.xxx」の場合に何のプログラムを連携することや、「window」が始動する時にバックグラウンドで実行するプログラム設定などの様々な設定があります。&lt;/p&gt;&lt;p&gt;(そのため「regedit」を間違って設定すると「window」が可笑しくなる可能性があるので気をつけてください。)&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=474&quot; data-filename=&quot;002.png&quot; style=&quot;width: 415px;&quot;&gt;&lt;/p&gt;&lt;p&gt;※「ファイル名を指定して実行」は「window」マークボタン(左の下のaltキー隣)＋「r」キーを押下すると開けられます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=477&quot; data-filename=&quot;003.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;上のイメージが「regedit」の「window」です。「regedit」の「window」が開いたら様々な「key」があると思いますが、我々はcontextのmenuの設定だけ編集するなので「hkey_classes_root」の群だけ確認します。&lt;/p&gt;&lt;p&gt;参考に「hkey_classes_root」のキーは拡張子別で連携されるプログラムの環境設定です。「hkey_classes_root」のキーを開くと様々なサブキーが見えると思います。そのキーの中で我々は「directory」キーを編集するつもりです。&lt;/p&gt;&lt;p&gt;「directory」キーは「explorer」の「directory」と関係があるキーです。ここで我々が「context」-「menu」を編集することができます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=479&quot; data-filename=&quot;004.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=481&quot; data-filename=&quot;005.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=476&quot; data-filename=&quot;006.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=478&quot; data-filename=&quot;007.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=480&quot; data-filename=&quot;008.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=482&quot; data-filename=&quot;009.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=483&quot; data-filename=&quot;010.png&quot; style=&quot;width: 848px;&quot;&gt;&lt;/p&gt;&lt;p&gt;下記のイメージは「context」メニューを編集した結果になります。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=473&quot; data-filename=&quot;011.png&quot; style=&quot;width: 332px;&quot;&gt;&lt;/p&gt;&lt;p&gt;「examplemenu」のメニューをクリックすると我々が「command」キーに設定した命令語が実行させ、コマンドウィンドウが開けられます。&lt;/p&gt;&lt;p style=&quot;text-align:left;&quot;&gt;&lt;img src=&quot;./getattachfile.ajax?idx=475&quot; data-filename=&quot;012.png&quot; style=&quot;width: 669px;&quot;&gt;&lt;/p&gt;&lt;p&gt;ここまで「context」のメニューを編集することについて勉強しました。この「context」メニュー編集の「tip」は単純な情報になると思いますが、以外にjavaやc#のコンソールプログラムを連携すると「window」を楽に運用ができます。皆様もこのtipの利用してみましょう。&lt;/p&gt;</description><category>Devlopment note / Window</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/1.html</guid><pubDate>Fri, 18 Oct 2019 07:31:58 +0900</pubDate></item><item><title>Devlopment note</title><link>https://www.nowonbun.com/developmentnote.html</link><description>Devlopment note</description><category>Devlopment note</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/developmentnote.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Devlopment note / C, C++, MFC</title><link>https://www.nowonbun.com/dev_clanguage.html</link><description>Devlopment note / C, C++, MFC</description><category>Devlopment note / C, C++, MFC</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/dev_clanguage.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Study / C, C++, MFC</title><link>https://www.nowonbun.com/study_clanguage.html</link><description>Study / C, C++, MFC</description><category>Study / C, C++, MFC</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/study_clanguage.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Open source / Bootstrap</title><link>https://www.nowonbun.com/opensource_bootstrap.html</link><description>Open source / Bootstrap</description><category>Open source / Bootstrap</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/opensource_bootstrap.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Devlopment note / C#</title><link>https://www.nowonbun.com/dev_csharp.html</link><description>Devlopment note / C#</description><category>Devlopment note / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/dev_csharp.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Study</title><link>https://www.nowonbun.com/study.html</link><description>Study</description><category>Study</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/study.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Study / C#</title><link>https://www.nowonbun.com/study_csharp.html</link><description>Study / C#</description><category>Study / C#</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/study_csharp.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Open source / Tools</title><link>https://www.nowonbun.com/opensource_tools.html</link><description>Open source / Tools</description><category>Open source / Tools</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/opensource_tools.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Devlopment note / Java</title><link>https://www.nowonbun.com/dev_java.html</link><description>Devlopment note / Java</description><category>Devlopment note / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/dev_java.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Study / Java</title><link>https://www.nowonbun.com/study_java.html</link><description>Study / Java</description><category>Study / Java</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/study_java.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Open source</title><link>https://www.nowonbun.com/opensource.html</link><description>Open source</description><category>Open source</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/opensource.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Open source / Javascript, Jquery, CSS</title><link>https://www.nowonbun.com/optionsource_javascript.html</link><description>Open source / Javascript, Jquery, CSS</description><category>Open source / Javascript, Jquery, CSS</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/optionsource_javascript.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Devlopment note / Javascript, Jquery, Css</title><link>https://www.nowonbun.com/dev_javascript.html</link><description>Devlopment note / Javascript, Jquery, Css</description><category>Devlopment note / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/dev_javascript.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Study / Javascript, Jquery, Css</title><link>https://www.nowonbun.com/study_javascript.html</link><description>Study / Javascript, Jquery, Css</description><category>Study / Javascript, Jquery, Css</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/study_javascript.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Project</title><link>https://www.nowonbun.com/project.html</link><description>Project</description><category>Project</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/project.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Devlopment note / Window</title><link>https://www.nowonbun.com/dev_window.html</link><description>Devlopment note / Window</description><category>Devlopment note / Window</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/dev_window.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Study / PHP</title><link>https://www.nowonbun.com/study_php.html</link><description>Study / PHP</description><category>Study / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/study_php.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Experience</title><link>https://www.nowonbun.com/experience.html</link><description>Experience</description><category>Experience</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/experience.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Devlopment note / Linux</title><link>https://www.nowonbun.com/dev_linux.html</link><description>Devlopment note / Linux</description><category>Devlopment note / Linux</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/dev_linux.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Study / Python</title><link>https://www.nowonbun.com/study_python.html</link><description>Study / Python</description><category>Study / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/study_python.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Other</title><link>https://www.nowonbun.com/other.html</link><description>Other</description><category>Other</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/other.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Devlopment note / Etc.</title><link>https://www.nowonbun.com/dev_etc.html</link><description>Devlopment note / Etc.</description><category>Devlopment note / Etc.</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/dev_etc.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Study / Database</title><link>https://www.nowonbun.com/study_database.html</link><description>Study / Database</description><category>Study / Database</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/study_database.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Devlopment note / Python</title><link>https://www.nowonbun.com/dev_python.html</link><description>Devlopment note / Python</description><category>Devlopment note / Python</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/dev_python.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Study / Design pattern</title><link>https://www.nowonbun.com/study_design_pattern.html</link><description>Study / Design pattern</description><category>Study / Design pattern</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/study_design_pattern.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Devlopment note / PHP</title><link>https://www.nowonbun.com/dev_php.html</link><description>Devlopment note / PHP</description><category>Devlopment note / PHP</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/dev_php.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Study / Algorithm</title><link>https://www.nowonbun.com/study_algorithm.html</link><description>Study / Algorithm</description><category>Study / Algorithm</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/study_algorithm.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>Study / Project design</title><link>https://www.nowonbun.com/study_project_design.html</link><description>Study / Project design</description><category>Study / Project design</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/study_project_design.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item><item><title>明月の開発ストーリ</title><link>https://www.nowonbun.com/index.html</link><description>明月の開発ストーリ</description><category>明月の開発ストーリ</category><author>nowonbun@gmail.com</author><guid>https://www.nowonbun.com/index.html</guid><pubDate>Wed, 10 Apr 2024 19:04:41 +0900</pubDate></item></channel></rss>