検索結果

検索件数 :

1

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

Study / Java

#java,#react,#springboot

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

2

こんにちは。明月です。この投稿はnode.jsをインストールしてreactを使う方法に関する説明です。私がアルバイトや勉強した時期を除いて、学校を卒業してプログラムを開発した経験が約14年から15年間になります。始めから「ウェブ開発しよう」と思ってからやったことではなくcs(client server)プログラムから組み込み開発などの様々な分野でさまようした後、結局に需要が多いのウェブ開発者になりました。ウェブというのは初期にはそんなに難しいと思わなかったですが、どの分野でも同じですが、知る深さが深くなるほど知るべきな規約も多いし、毎日に出るライブラリとフレームワークなどを学ばなければならないことが凄く多いですね。実はそれがウェブ開発の面白さかも知れません。人により開発の価値観が違いますが、私の場合は新しいライブラリとフレームワークを早く学んで使うスタイルではありません。理由は様々がありますが、安定性の理由ですね。javaの場合は始めjava servlet環境から始まってstruts(ストラッツ)、spring web framework、spring bootまで使いました。以前にはjava servletをかなり長い時間で使いましたが、フレームワークの必要性を感じて、struts(ストラッツ)を使った時がありました。始めにはservletより早い開発と特別な概念で良いと思いましたが、strutsが思ったより問題が多かったんです。structの問題なら代表的なことがセキュリティイッシューですね。今でも理解できないことがservletにもできるinjection問題がstrutsにはなぜできないかな。。それでプロジェクトと関係ない回避コードもたくさん作るし、どの場合はフレームワークのライブラリのほぼを継承して再定義した時もありましたね。その経験があるので、フレームワークとライブラリを使いことが厳しくなりました。フレームワークというのは使ったら途中で変わることがずいぶん難しいでしょう。つまり、プロジェクトでstrutsを使いながらspringが良いと思ってフレームワークを簡単に変更できることがありません。普通は初めからやり直しするケースが多いです。なので、spring web frameworkがトレンドになる時にも相当にjava servletを使って私のフレームワーク(?)を構築して使いました。経歴の

Study / Javascript, Jquery, Css

#java

作成日付 : 2022/03/23 18:01:34       修正日付 : 2022/03/23 18:03:14

3

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

Study / Java

#spring,#cron,#component

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

4

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

Study / Java

#java,#web-filter

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

5

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

Devlopment note / Java

#java,#jwt

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

6

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

Study / Java

#java,#redis,#springboot

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

7

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

Study / Java

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

8

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

Study / Java

#java,#springboot,#jpa

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

9

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

Study / Java

#java,#jpa,#springboot

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

10

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

Study / Java

#java,#springboot

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

11

こんにちは。明月です。この投稿はpythonでredisデータベースに接続して使い方に関する説明です。redisデータベースはrdb種類ではなく、nosql種類のkey-valueタイプのデータベースです。簡単に共有メモリのデータベースです。以前の投稿でlinux環境にインストール及び使い方に関して説明したことがあります。リンク - [centos] redisデータベースをインストールする方法とコマンドを使い方そのredisデータベースをpythonで使ってみましょう。pythonでredisデータベースを使うためにはredisライブラリをインストールするべきです。私はもうインストールされているのでインストール済みで表示しますね。インストールをしてない方は上のコマンドでインストールしたら良いでしょう。インストールしたらpythonソースでredisを使ってみましょう。基本的な使い方はkeyを利用してデータを入力して取得する関数です。接続方法にはstrictredis関数を利用して直接にconnectionを取得する方法があるし、poolをまず生成してpoolからconnectionを取得する方法があります。どっちらかが良いか言うことは難しいですが、poolがコネクションを管理するので、リソース管理ではpoolの方が良いでしょう。上の例はシングルプロセスで動いているのでpoolを使わなくても特にコネクション管理が必要ないですが、マルチスレッド環境ならconnection管理が必要なのでpoolを使う方が良いということです。上のソースはキーの満了時間設定です。単位は秒単位で設定できます。次はredisで使うlistとmap、set、sortedsetのデータタイプです。pythonは使う人により実装する仕方が違いますが、私はpythonでプログラムを作ることよりプロジェクトの補助手段としてバッチスクリプトなどを作成して使うことでよく活用します。その状況で様々なローカルでデータを共有するかjavaやc#でredisを使うならその値を確認してテストする目的でよく使います。ここまでpythonでredisデータベースに接続して使い方に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Python

#python,#redis

作成日付 : 2022/02/21 18:23:49       修正日付 : 2022/02/21 18:24:37

12

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

Devlopment note / Java

#java,#jedis,#redis

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

13

こんにちは。明月です。この投稿はc#でredisのデータベースを接続して使い方に関する説明です。redisデータベースはrdb種類ではなく、nosql種類のkey-valueタイプのデータベースです。簡単に共有メモリのデータベースです。以前の投稿でlinux環境にインストール及び使い方に関して説明したことがあります。リング - [centos] redisデータベースをインストールする方法とコマンドを使い方そのredisデータベースをc#で使ってみましょう。まず、c#で使うためにはnugetを利用してstackexchange.redisライブラリをインストールしましょう。ライブラリがインストールされたらredisデータベースに値を格納して取得しましょう。上のソースでtestのキーでhello worldを格納しました。そして10分後では自動にkey-valueが消えます。そしてtestキーで取得すると入力したデータがコンソールに出よくします。関連な関数に関してはapiドキュメントを参照してください。リンク - https://stackexchange.github.io/stackexchange.redis/上には単純にkeyでデータの値を格納して取得する基本的な処理です。そうすると実践でプログラムを作成する時によく使われるコードを作成して見ましょう。上のソースでnodeクラスのインスタンスをシリアル化で利用してbyteに変換して、またstringタイプに変換してredisデータベースに入力しました。そうするとこのことで別のプログラムで取得できます。別のプログラムで生成したnodeインスタンスをredisデータベースに格納して、また、別のプログラムで取得してインスタンスに変換して使うことを確認しました。この意味はシリアル化を通ってクラス形式で様々なプログラムで値を共有できるという意味です。c#のシリアル化なので、別の言語プログラムでは使うことは出来ずに、同じ言語のc#だけで使うことが可能です。別の言語で使うためにはjsonタイプで変換して使うなら言語が違くても値を共有することが可能ですね。上のシリアル化を通ってstringに変換してredisデータベースに格納することと似てますが、今回はシリアル化ではなくjson構造タイプに変換して入力しました。redisデータベースでtest1のkey値でjson

Devlopment note / C#

#C#,#Redis

作成日付 : 2022/02/15 18:46:09       修正日付 : 2022/02/16 16:06:46

14

こんにちは。明月です。この投稿はcentosでredisデータベースをインストールする方法とコマンドを使い方に関する説明です。redisとはrdbタイプとは別のnosqlタイプのデータベースです。つまり、sqlでデータを入力、取得するデータベースではなく、特定なapiを通って扱うデータベースです。構造はkey - valueの構造で、inmemory構造になっているのでデータ挿入が早いし、検索が早くなるデータベースになります。redisに関する定義や内容はグーグルを利用して調査すると様々な正確な定義と説明があります。私が少し理解しやすく説明するとただshare memory、つまり、メモリを共有するシステムだと思います。普通にプログラムを起動するとプログラム中の変数などを通ってメモリにデータを割り当てします。そのメモリに割り当てしたデータはosのプロセスメモリ保護機能で別のプログラムで該当なメモリにアクセスができません。つまり、aプログラムとbプログラムを実行して、bプログラムで割り当てたクラスのデータをaプログラムで使いたいと思えば、ソケット通信を通ってデータを共有します。一般的な方法です。もしかして、ここでプログラムが一つを追加するとメモリ共有の流れが複雑になります。bプログラムで生成されたメモリデータをaプログラムで修正します。その後、bプログラムはcプログラムに値が更新されたことを通報します。また、ここでプログラムを一つを追加します。つまり、プログラムが増えるほど流れがもっと複雑になります。もちろん、file ioで共有することができますが、それならioのconnectionの流れに関して考えなければならないです。つまり、ファイルにデータを書き込みする役でconnectionを繋いでるなら別のプログラムではファイル修正が不可能です。様々な不便な流れと規約ができますね。そうすると一番しやすく解決する方法はmap構造になるメモリとソケット通信でset、getでmapメモリにアクセスが可能なプログラムがあれば良いです。そのプログラムがredisです。redisプログラムはjavaではmap、c#ではdictionary構造の変数一つとソケットを通って外部でデータを格納、取得することが可能なプログラムです。centosでは簡単にyumでインストールが可能です。そして環境設定は「/etc/redis.con

Devlopment note / Linux

#centos,#redis

作成日付 : 2022/02/14 18:33:07       修正日付 : 2022/02/14 18:37:17

15

こんにちは。明月です。この投稿はデザインパターンのステートパターン(state pattern)に関する説明です。ステートという意味では状態です。つまり、クラスの状態により処理する結果が別々になる意味です。よく見るとストラテジーパターンと似ている構造になりますが。。。差異を置いたらストラテジーパターンはストラテジーインスタンスにより外部の値が変わることだし、ステートパターンはステートインスタンスにより内部の値が変わることだと思います。実は、デザインパターンというのは実務でこれはこのパターンという定義されていることではなく、その内容だけ理解して使ったら良いでしょう。reference - https://en.wikipedia.org/wiki/state_patternストラテジーパターンには多分、run関数に何かの値を受け取ります。つまり、run関数で値を受け取ってストラテジーパターンにより別の値がリターンすることだし、ステートパターンはrunの関数で値を受け取ることではないですが、ステートインスタンスにより内部処理が変わったということです。私が知っているストラテジーパターンとステートパターンの差異はこれです。実は私も実務でストラテジーパターン、ステートパターンを区切りして使うことではありません。ただ仕様に合わせてパターンを使うことで。。ステートパターンもストラテジーパターンと同じ構造でflyweightパターンを使ってステートパターンのインスタンス生成を最小化にしました。そしてインスタンスの再使用率を高めにしてシステムの性能を上げられます。ステートパターンもストラテジーパターンと同じ目的で使います。クラスの結合度を低くして再使用率を高めにするために使うでしょう。ただ、その差異はストラテジーパターンは外部の値がパターンにより別々の結果を出すこと、ステートパターンはパターンにより内部値が別々の結果を出すことです。ここまでデザインパターンのステートパターン(state pattern)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Design pattern

#designpattern,#statepattern

作成日付 : 2021/11/17 20:04:47       修正日付 : 2021/11/17 20:05:36

16

こんにちは。明月です。この投稿はデザインパターンのメメントパターン(memento pattern)に関する説明です。メメントパターンはクラスの現在の状況を別にクラスに格納するパターンです。クラスのデータを格納する型ではメメントパターンではなく、クラスのコピー(インスタンスのコピー)で現在状況を格納することができます。でも、そのようにすると現在のインスタンスオブジェクトではなく、新しいインスタンスオブジェクトを生成することで、もしオブジェクト中でリソース(ioやsocket)を使っている場合は新しいコネクションを生成しなければならない問題もあります。つまり、メメントパターンはインスタンスのオブジェクトは変わらず、中の値だけ更新して、状態を復旧する役割をするパターンがメメントパターンです。reference - https://en.wikipedia.org/wiki/memento_pattern上の例でnodeクラスの状態を格納するmementoインスタンスを取得しました。このmementoクラスで該当なクラスをファイルに書き出しするし、また、ファイルから読み込んでnodeインスタンスに更新するとデータが以前データに復旧することを確認できます。例えば、ゲームの中でファイルにセーブしてまたファイルから読み込んで現在の状態を復旧することと同じ流れのパターンです。c/c++で作成したソースの構造と似ています。ただ、memenoクラスをnodeクラスのインラインで作成しました。つまり、mementoクラスの仕様は状態を格納する役割があるので、nodeクラスの以外ではデータ設定ができないようにすることが基本ルールです。メメントのインスタンスの値を外部で設定することが可能にすると、それはメメントのパターンではなく、単純なパラメータをやり取りのクラスの役割になることです。c#もjavaと似ている構造なソースです。mementoクラスがnodeクラスにインラインで設定して、nodeクラスの外部では設定できないように作成しました。でも、c#はインラインクラスでも、publicではなければアクセスができないので、reflectionの機能を利用して直接にprivate変数を設定できるように作成しました。ここまでデザインパターンのメメントパターン(memento pattern)に関する説明でした。ご不明なところや間違いと

Study / Design pattern

#designpattern,#mementopattern

作成日付 : 2021/11/16 20:01:36       修正日付 : 2021/11/16 20:02:25

17

こんにちは。明月です。この投稿はデザインパターンのイテレータパターン(iterator pattern)に関する説明です。イテレータパターン(iterator pattern)は我々がデザインパターンを知らない状況でもよく使うパターンです。c#にはlistをforeachで使うパターンだし、javaにはfor(var x : list)の型でよく使うパターンです。一般的に配列(array)には当たり前にindexで配列を参照するのでイテレータパターンが意味がありませんが、連結リスト(linkedlist)なら話が違います。get(100)を取得するためにはindex 0から100まで移動するので実際にforで使うことならすごく遅くなります。例えば、0番目はリストの最初なので問題がありませんが、forの1になると0を参照して1番目を取得します。また、2になると0を参照して1に移動、2を取得します。3になると0を参照して1に移動、2に移動して3を取得します。なのでイテレータパターンを利用して毎回に参照するたびにポインタを移動して探す必要がなしで現在の位置を格納して現在の値をリターン、そして次のポインタに移動する型のパターンが必要です。実務ではこれを実装する必要がなしで、listタイプはすべてイテレータパターンを継承しているのでforeachで使ったら自動にイテレータパターン(iterator pattern)に変わるにで、ただこのパターンの内容だけ認知して応用して使うと良いでしょう。reference - https://en.wikipedia.org/wiki/iterator_pattern我々が実際にプログラムで使うイテレータパターンはforを利用して値のポインタを取得、一連の順番とおりに出力するパターンです。実は私がc/c++でイテレータパターンを実装しようと思いましたが、難しいですね。c/c++を使うのも古くなったし、いざ実装するのが簡単ではありません。それでここではただイテレータパターンを使う方法だけ説明します。もし、イテレータパターンを実装する人がいらっしゃいならお知らせてください。上の例は簡単な連結リストのアルゴリズムです。そして任意で連結リストのlinkedlistクラスをforの繰り返し文にイテレータパターン(iterator pattern)でデータが順番とおりに出力されることを確認で

Study / Design pattern

#designpattern,#iteratorpattern

作成日付 : 2021/11/15 19:31:28       修正日付 : 2021/11/15 19:32:13

18

こんにちは。明月です。 この投稿はlinux環境(centos)でcassandra(nosql db)をインストールする方法(dbeaverブラウザでnosql使い方)に関する説明です。 プログラムを作成すると主に使うデータベースはrdbms(関係型データベース)だと思います。rdbmsだというと何のデータベースと思われますが、オラクルやms sql server, mysql, mariadb, postgresなどのデータベースの意味です。このrdbmsは多い利点があります、インストールがしやすいし、クエリ検索も早いし、管理もしやすいし、等々のすごく良い利点がありますが、欠点は拡張性とデータ量に対する性能があります。最近はサーバの性能は過去に比べて非常によくなりまして、大容量のデータもrdbmsで処理ができるようになりましたが、でも、いつかはデータ量に比べて性能が限界に届きます。軽くにrdbmsは一つのサーバでインストールするのでサーバのハードウェアの容量の限界に届きます。そのことでrdbmsを拡張すると思えば、そのことが簡単ではありません。クラスタリングするのは一般的に設定することも難しいし、管理することでも簡単ではありません。この欠点を解決するのがnosqlです。 このnosqlはrdbmsのデータベースに慣れている方が使うのはすごく不便ですね。joinもできないし、様々な制約も多いです。でも、データベース量に対する性能でも問題ないし、拡張性もすごくいいことなので大容量のデータを扱うプロジェクトならnosqlを使うことも悪くないでしょう。nosqlとrdbmsに関する差異と説明は別の投稿で詳細に説明します。 nosqlもデータベース種類が多いです。この投稿ではapache財団のnosqlのcassandraをインストールしましょう。まず、nosqlをインストールするためにはjava 1.8以上とpython 2.xです。javaをインストールする方法に関しては以前の投稿で説明したことがあります。link - [centos] java インストール pythonの場合は3.xがインストールされたらcqlshが実行されません。そのため、2.xがインストールされなければならないです。私はpython2がもうイン

Devlopment note / Linux

#CentOS,#Cassandra

作成日付 : 2021/11/12 17:33:58       修正日付 : 2021/11/12 17:36:39

19

こんにちは。明月です。この投稿はデザインパターンのコマンドパターン(command pattern)に関する説明です。コマンドパターン(command pattern)は少し複雑なパターンですが、簡単に言うと発動子(invoker)が受信子(receiver)を実行するためのコマンド(command)を中に置くパターンです。普通のコマンドパターンの例なら電灯の例で説明しますが、スウィッチ(invoker)があり、電灯(receiver)があります、それを電源のonとoffのコマンド(command)が型です。reference - https://en.wikipedia.org/wiki/command_pattern上の例をみると理解しやすくなります。コマンドパターンは発動子(invoker)の関数をクラス別に分け割ったことです。関数はインスタンスで実装することができないので、関数別でインスタンスを作った型がコマンドパターン(command pattern)です。関数をクラスのインスタンスで生成ができれば、上みたいにlistなどで命令順番を設定することもできます。コマンドパターンは重要なポイントは発動子(invoker)の関数をクラス別で割り分けしたことです。つまり、様々な関数を複合的にコマンドパターンで作成することができます。ここでの例は発動子(invoker)のクラスを一つだけ生成してコマンドパターンを作りましたが、数多く発動子クラスをコマンドパターン別で割り分けてストラテジーパターンとともに使うことができます。ここまでデザインパターンのコマンドパターン(command pattern)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Design pattern

#designpattern,#commandpattern

作成日付 : 2021/11/05 17:01:42       修正日付 : 2021/11/05 17:02:32

20

こんにちは。明月です。 この投稿はapache-tomcatでロードバランシング(load balancing)する方法とセッションクラスタリング(セッション共有)に関する説明です。 以前の投稿で私がapacheとtomcatを連携する方法に関して説明したことがあります。link - [centos] apacheとtomcatの連携 その時にはapache-tomcatの1:1の連携だったんですが、今回はapacheから数多くのtomcatを連結してトラフィックを分散する方法です。運用中でウェブサイトで接続者が多くなると始めに構成することがapache-tomcatとの分散です。動的なウェブサイトなら以外にこのweb servletで処理トラフィックが多くなります。なぜならservletでデータベース接続もしなければならないし、様々な設定ファイルを読み込し、複雑な仕様だったらservletで処理することが多くなります。これを数多くのサーバで運用してapacheでトラフィックを集まってロードバランシング、つまり、トラフィックに合わせてservletを分散してサイトがトラフィックにより遅くなることを少しでも改善することではないかと思います。apache段階でのトラフィックが多くなるとdns段階でapache分散するべきですね。私もそこまでの作業をしたことがないので、正確に言うことは難しいです。 apacheでmod_jkを連携するためにはworkers.propertiesを修正しなければならないです。httpd.confにはworker listを設定すれば良いでしょう。上の例をみればjkmanagerを別途に設定しました。jkmanagerはapache - tomcatを連結する時にロードバランシングの状態を確認できるページです。apache-tomcatで数多くのサーバを管理する時、しっかり連携されているかを確認するページです。もし、一つのtomcatが問題になると状態ページでその結果を知らせてくれます。ここまで設定すっればロードバランシング設定は完了です。でも実際にウェブサーバを運用すればロードバランシングだけ設定する場合にセッション共有がしなかったので、変な現象が発生します。。代表的に急にログアウトされる場合があります。なぜ

Devlopment note / Window

#apache,#tomcat,#loadbalancing,#sessionclustering

作成日付 : 2021/11/05 16:58:45       修正日付 : 2021/11/05 17:00:24

21

こんにちは。明月です。 この投稿はapacheでmod_jkとmod_proxyの差異、apacheでtomcatのwebsocketのプロキシフォーワードする方法に関する説明です。 以前にtomcatとapacheを連携する方法に関して説明したことがあります。link - [centos] apacheとtomcatの連携link - [php] apache環境の同じホスト中でphpとjava(servlet)を同時に起動、運用する方法 上のリンクを見るとapacheとtomcatを連携する方法に関してmod_jkを利用する方法があるし、mod_proxyを利用する方法があります。始めのリンクはmod_jkでapacheとtomcatを連携する方法で説明したし、二つ目はmod_proxyでapacheとtomcatを連携してcomplex languageを使う方法に関して説明しました。 二つの連携方法に関して各の特徴がありますが、mod_jkで連携する方がapacheとtomcatを完全に連結することです。つまり、仮想ディレクトリを作成するならapacheだけ設定することではなく、tomcatにも設定をしなければならないです。もちろん、apacheにも仮想ディレクトリを設定することが可能ですが、様々な問題が発生する可能性があります。mod_jkで連携したvirtualhostですが、ここで私が「jkmount /* websocketex」を「jkmount /java/* websocketex」に設定を変わると「localhost/java」や「localhost:8009/」をフォーワードすることではなく、「localhost:8009/java」を指すことになります。つまり、tomcatにも仮想ディレクトリを合わせなければならないです。このように設定するとかなり複雑になります。なぜならルートは仮想ディレクトリに使うことができなくなったからです。でも、complex languageにはルート(/)をphpで使って「proxypass /java ajp://localhost:8009/」を使う場合は「localhost/java」が「localhost:8009/」にフォーワードすることになります。つまり、tomcat

Devlopment note / Window

#window,#apache,#mod_jk,#mod_proxy,#tomcat

作成日付 : 2021/11/05 16:55:05       修正日付 : 2021/11/05 16:56:55

22

こんにちは。明月です。 この投稿はapache環境の同じホスト中でphpとjava(servlet)を同時に起動、運用する方法に関する説明です。 phpのウェブプログラムスクリプト言語は魅力が多い言語です。もちろん、javaのservletも多い利点がある言語です。私が考えるphpのウェブプログラム言語の一番の利点はコンパイルとビルド、デプロイ(deploy)が必要ないことです。これが別になにと思いますが、実務では差異が大きいでしょう。例えば、サービス運用中のプログラムで致命的なエラーやバグが発生しました。それなら当たり前に直すべきです。そうするとどのように修正するか、javaならtomcatをshutdownしてデプロイして再起動しなければならないです。その間にサーバは落ちます。もし、これが接続が多い時間帯なら考えましょう。バグを目前にあっても修正できません。もちろん、バグの種類により違いますが、サーバを落ちることはもっと大きいリスクを発生する可能性があるからです。でも、phpの場合はどうでしょう?ただ、ソースを修正すればよいでしょう。コンパイルとビルド、デプロイが要らないのでサーバ再起動が必要なし、修正したすぐ反映です。 javaはphpよりもっといい利点がないかというと、スレッド管理です。単純なホームページやデータベースのデータを取得して見せる簡単なウェブページならjavaで開発する必要があるかなと思いますが、スレッド管理が必要なサービスなら話が違います。どのシステムの他の管理システムやウェブのrequest、response管理だけではなく、継続的にシステムが動いているプログラムならphpで実装が不可能でしょう。率直に不可能ではありませんが、safe threadではなく、non thread phpで作成すればいいですが、これがメモリ管理が難しいと聞きました。(実際に私も使ったことがないので。。。) それならまず、apacheでphpサーバーを構築しましょう。これは以前に説明した構築の方法と同じです。そのため、別にphpを構築する方法は省略します。link - [php] php 開発環境設定とeclipse(ide)の設定 まず、index.phpにphpinfo()を呼び出して画面に表示しましょう。를

Devlopment note / PHP

#php,#apache,#tomcat

作成日付 : 2021/11/05 16:52:04       修正日付 : 2021/11/05 16:53:16

23

こんにちは。明月です。この投稿はc#のウィンドウフォーム(window form)でスレッド(thread)を使い方、クロススレッド問題解決に関する説明です。以前の投稿でc#のスレッドに関して説明したことがあります。link - [c#] 37. スレッド(thread)を使い方、thread.sleep関数を使い方スレッドはプログラム内で並列処理することの意味です。まずウィンドウはシングルスレッドの無限ループで動いています。でも、我々がボタンのクリックイベントでループを実行するロジックを作りましょう。プログラムを実行してボタンを押下するとループが終わるまでウィンドウフォームは動きません。時間が流れたら応答なしになってプログラムが凍っている時もあります。つまり、ウィンドウはシングルスレッド状況なのでその関数のスタックに掛けると処理が終わるまで動きません。そうするとボタンを押下する時、複雑な処理をすると思えばどのように処理するでしょう?スレッドを利用すれば良いでしょう。ボタンをクリックしてコンソールに1ずつに出力してもウィンドウが凍らないことを確認できます。そうすると今回はコンソールに出力することではなく、ウィンドウのコントロールで出力するように作成しましょう。ボタンをクリックするとすぐエラーが発生します。理由はwindowで動いているスレッドとスレッドプールで動いているスレッドが同期化されてないからです。スレッド間に同期化しようと思えば、お互いにlockを設定して同期化すればよいのに、ウィンドウメッセージを動いているスレッドにlockを掛ける方法がありません。これをc#ウィンドウ開発ではクロススレッド問題と言います。これを解決する方法が各コントロールにあるinvoke関数を利用してvisitorパターン、つまりコールバック関数という方法で処理ができます。ソース上にstatic utilクラスを作成してcontrolクラスの拡張関数を作成しました。そしてスレッドプールの中でlabel1インスタンスにinvokecontrol関数を呼び出してラムダ式でコールバック関数を作成しました。ボタンをクリックするとlabelに数字が1秒単位で更新することを確認できます。ここまでc#のウィンドウフォーム(window form)でスレッド(thread)を使い方、クロススレッド問題解決に関する説明でした。ご不明なところや

Study / C#

#C#,#window,#thread

作成日付 : 2021/11/04 19:29:51       修正日付 : 2021/11/04 19:30:43

24

こんにちは。明月です。この投稿はデザインパターンの責任の連鎖パターン(chain of responsibility pattern)に関する説明です。責任の連鎖パターンとはクラス間に連結リストアルゴリズムを掛けて、特定な関数を実行すると連鎖的に実行するパターンということです。reference - https://en.wikipedia.org/wiki/chain-of-responsibility_patternこれがすごくよく使うパターンではないですが、ログ処理や一つの処理で様々な結果を同時に作成する時に使うパターンです。ソースコードを作成したら完全に連結リストのアルゴリズムになりました。連結リストのアルゴリズムをよく知っている方はよく目に入れると思いますが、アルゴリズムの分野が弱い方はすごく複雑に見える可能性がありますね。内容は私がloggermanagerにconsoleloggerとfileloggerのインスタンスを格納しました。そしてwrite関数を呼び出したら順番とおりにコンソールに出力されますね。つまり、setloggerの関数でインスタンスを格納した数程、write関数で連鎖的に出力するパターンです。javaには連結リストのlinkedlistクラスがあります。つまり、javaには連結リストが実装されているのでそれを使ったら良いでしょう。もちろん、必ずlinkedlistを使う必要なく、arraylistでも構いません。つまり、責任の連鎖パターン(chain of responsibility pattern)はポインターで連結すると言いますが、c/c++にもvectorオブジェクトを使っても実装することでは問題ないでしょう。loggermanagerというクラスが必要なく、loggerクラスに次のポインタを連結して最初に生成されたインスタンスの関数を呼び出すと連鎖的に実行する方法もあります。責任の連鎖パターンはクラスの結合度を弱くして様々な応用にかなり良いパターンですが、以外に使用頻度が低いパターンです。適応する仕様が多くないからではないかな。ほとんどファサードパターンとストラテジーパターンで解決される仕様が多いからかなここまでデザインパターンの責任の連鎖パターン(chain of responsibility pattern)に関する説明でした。ご不明なところや間違いところが

Study / Design pattern

#designpattern,#chainofresponsibility

作成日付 : 2021/11/04 19:27:58       修正日付 : 2021/11/04 19:28:32

25

こんにちは。明月です。この投稿はデザインパターンのストラテジーパターン(strategy pattern)に関する説明です。この投稿からは振り舞パターンに関する説明です。生成パターンはプログラムでインスタンスをどのように生成するかに関する型だし、構造パターンはインターフェースと抽象クラス、そして一般クラス間の構造的な定義に関する型です。振り舞パターンはクラスとアルゴリズムを実際のプログラムでどのように使うかに関する説明するパターンです。その中でストラテジーパターンは戦略という意味があるパターンですが、使うクラスに入力されるクラスのインスタンスにタイプにより結果を別にするパターンと言います。reference - https://en.wikipedia.org/wiki/strategy_patternすごく単純な構造です。processクラスにストラテジーパターンを設定しなければそのまま10の値が出力されるし、normalstrategyインスタンスを入力すると100の値が出力、specialstrategyインスタンスを入力すると1000が出力されます。仕様に違いますが、ストラテジーパターンのクラスをフライウェイトパターンと一緒に使えばクラスの再使用率が高めるし、性能改善にもいい利点があります。上の例はストラテジーパターンにflyweightパターンを追加してストラテジーパターンのインスタンスを取得する時、メモリ使用を最小にしてクラスの再使用率を高めにしました。ストラテジーパターンはできればクラスの結合度を低くして再使用率を高めにして性能改善がメイン目標です。そしてクラスはできれば分ける作業によりプログラムのutテストや個別テストが良いと利点があります。でも、このストラテジーパターンの欠点はクラスを分けすぎることでストラテジーパターンで分散化すると可読性が悪くなることがあります。そしてクラス作成が多くなるので、プロジェクト管理が難しくなるし、プロジェクト難易度が高くなる問題があります。ここまでデザインパターンのストラテジーパターン(strategy pattern)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Design pattern

#designpattern,#strategypattern

作成日付 : 2021/11/03 18:38:52       修正日付 : 2021/11/03 18:38:52

26

こんにちは。明月です。この投稿はc#のウィンドウフォーム(window form)のイベント設定する方法に関する説明です。以前の投稿でウィンドウフォームにコントルールを追加してcontrolクラスを継承してコントロールを作成する方法に関して説明しました。link - [c#] 59. ウィンドウフォーム(window form)にコントロール(control)を使い方法コントロールというのはフォームで動的に動いているオブジェクトという意味ですね。ユーザから入力を受け取るか(textbox)、マウスからクリックのアクションを受け取るか(button)、データを表示する(gridview)などの様々なコントロールがあります。このコントロールの状態が更新する時に発生する処理をイベントと言います。基本的にコントロールのイベントを受け取る方法が二つの方法があります。始めはオブジェクトの再定義(override)する方法があります。ボタンをクリックするとコンソールにclickの値が出力されます。でも、上みたいにイベントを設定することになったら基本的に提供するコントロールを使うためにはすべてのコントロールクラスを継承して再定義しなければならないですね。二つ目はeventキーワードを利用するイベント設定です。eventを利用してクリックイベントを追加する方法です。eventキーワードに関しては以前の投稿で説明したことがあるのでご参考してください。link - [c#] 25. イベント(event)キーワードを使い方二つの方法ではどの方法が良いかというと仕様別で差異があります。一応、overrideとeventキーワードを利用するイベントでどの流れで動いているかを説明します。実行順番を見ると再定義したonclick関数が呼び出されます。その後でeventキーワードのイベント関数が呼び出されます。そしてまた、onclick関数のコンソールに出力が実行します。つまり、外部クラスのイベントを発生する前には再定義したonclick関数が呼び出されるし、base.onclickを通って外部eventキーワードの関数を実行して、再定義した関数に戻ってスタックが終了します。もし、base.onclick関数をコメントしたらどうでしょう?外部に登録したeventキーワードの関数が実行されません。そしてbase.onclickの呼び出すと

Study / C#

#C#,#controlevent

作成日付 : 2021/11/02 21:18:08       修正日付 : 2021/11/02 21:18:08

27

こんにちは。明月です。この投稿はファサードパターン(facade pattern)に関する説明です。ファサードパターンはデザインパターンで一番よく使うパターンの中で、我々がデザインパターンを知らなくても自然に使うパターンではないかと思います。このパターンを簡単に説明すると以前に生成されたオブジェクトや関数を仕様により合わせて配置する構造です。reference - https://en.wikipedia.org/wiki/facade_pattern上の例を説明すると、main関数には、ファサードパターンのクラスで設定したrunaやrunb関数を実行することで、仕様により順番とおりに実行する構造です。つまり、facadeクラスには処理する順番を設定して、main関数にはruna関数を呼び出すことで処理が開始される型の構造になっています。ファサードパターンだっても別にクラスを生成する必要はなくて、controllerの型でオブジェクトの各処理はprivateで処理して、クラスの外部ではファサードパターンでアクセスが可能にするようにexectype1関数やexectype2関数みたいに作成することが一般的ですね。実務でよく使うファサードパターンで例を作成しました。実は上にはファサードパターンだけではなく、interpreterパターンも含めています。main関数には我々がwebでよく使うurlの値を入れました。実は文字列切りは正規表現式を利用して切り分けるべきですが、個人的に正規表現式が得意な分野でもないし、面倒なのでただsplitで切り分けました。つまり、mvcモデルで上みたいにウェブブラウザで呼び出すとroute関数を通って関数を探すことになります。そしてパラメータに合わせてパラメータクラスのインスタンスも生成して呼び出しすることになります。我々はそのfacadeパターンで作成されているフレームワークで要請メソッドだけ作成すればよいでしょう。つまり、フレームワークのmvc構造はfacadeパターンで実装されていることです。実はfacadeパターンはこのパターンを知らなくても、もうプログラムを作成する時によく使う方法ですね。でも、少し理論的なパターン流れを分かれば、上みたいにreflection機能まで追加して応用が可能なパターンを実装することができます。ここまでファサードパターン(facade patt

Study / Design pattern

#designpattern,#facadepattern

作成日付 : 2021/11/02 19:32:31       修正日付 : 2021/11/02 19:32:31

28

こんにちは。明月です。この投稿はデザインパターンのプロキシパターン(proxy pattern)に関する説明です。プロキシパターンはデコレーターパターンと似ているな構造を構成していますが、デコレータパターンは継承したインターフェースでコンストラクタから同じインターフェースを継承したインスタンスを受け取って内容を追加する内容なら、プロキシパターンは継承したインターフェースでクラス内部で同じインターフェースを継承したインスタンスを生成するパターンです。reference - https://en.wikipedia.org/wiki/proxy_pattern上の構造がプロキシパターンの基本構造です。nodeproxyクラスのコンストラクタからinodeインターフェースを継承したnodeクラスのインスタンスを生成します。そしてprint関数にはnodeインスタンスのprint関数を呼び出します。普通はnodeクラスをnodeproxyクラスのインラインクラスに作成する場合もあります。上みたいになぜこのように作成するかと思われますね。ただ、proxyクラスではなく、nodeクラスのインスタンスを生成すればよいのに。。proxyクラスのコンストラクタのパラメータにより内部のメンバー変数のinode nodeに生成されたインスタンスが違います。つまり、パラメータやデータによりインスタンスを区分する時に使うパターンだということです。今回にはnode1クラスとnode2クラスをnodeproxyクラスのインラインクラスに作成しました。そしてインスタンスをコンストラクタから生成することではなく、print関数から生成します。つまり、もしnodeクラスが多いデータを持っていることやリソースを使うクラスなら、上みたいにコンストラクタではなく、関数を呼び出す時にインスタンスを生成することで性能を考えて設計することができる利点もあります。私の考えはパターン構造としては生成パターンのファクトリーメソッドパターンとflyweightパターン、デコレーターパターンをよく使う状況でプロキシパターンがよく使うかなと思うパターンですね。そうからかな、実際によく使うパターンではありません。また、似ている構造でインターフェースを継承せずに、メンバー変数に様々のクラスのインスタンスを入れて使いますね。でも、仕様によりプロキシパターンがもっと最適な

Study / Design pattern

#designpattern,#proxypattern

作成日付 : 2021/11/01 19:42:44       修正日付 : 2021/11/01 19:42:44

29

こんにちは。明月です。この投稿はデザインパターンのフライウェイトパターン(flyweight pattern)に関する説明です。フライウェイトパターン(flyweight pattern)という英語の意味は軽量化するという意味です。なので、インスタンスの生成を最小化してメモリの使用をできれば節約する方法です。構造パターンのシングルトンバージョンだと思えば良いでしょう。でもsingletonみたいにstaticを利用することではなく、普通のmap(dictionary)を利用します。reference - https://en.wikipedia.org/wiki/flyweight_patternbuilderというクラスでgetnodeからnodeインスタンスを取得します。そのことでaのキーで取得した時にはcountが2になりました。その意味はaを二回呼び出しましたが、インスタンスは同じという意味ですね。つまり、二回目から呼び出したらインスタンスを新しく生成しなくて、mapに同じインスタンスを取得することがフライウェイトパターンです。実はフライウェイトパターンは上のファクトリーメソッドパターンとともによく使います。factoryでインスタンスを生成せずに一回生成されたインスタンスは再使用ということです。でも、ファクトリ―メソッドパターンなのでclassを追加するたびにfactory関数を修正しなければならないですね。上のれ例ではjavaの例と似ていますが、factorydao中をreflectionとgeneric機能を利用してインスタンスを取得することにしました。このパターンどのところで使うかと思えば、ormフレームワークのdaoを取得する関数で使う方法です。特にspringで依存性注入でdaoを取得する時に、フレームワークでは上みたいな構造でインスタンスを取得することです。つまり、一回に生成されたインスタンスは再使用しようという意味ですね。ここまでデザインパターンのフライウェイトパターン(flyweight pattern)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Design pattern

#disignpattern,#flyweightpattern

作成日付 : 2021/10/29 19:48:27       修正日付 : 2021/10/29 19:48:27

30

こんにちは。明月です。この投稿はc#のウィンドウフォーム(window form)にコントロール(control)を使い方法に関する説明です。以前の投稿でwindow formを作成する方法に関して簡単に説明しました。link - [c#] 58. ウィンドウフォーム(window form)を作成する方法、そしてウィンドウメッセージとキュー一般的に我々がウィンドウプログラムを作成するとよく使うクラスはたぶんコントロール(control)オブジェクトです。このコントロールオブジェクトは基本的に.net frameworkから提供しています。実はこの基本的なコントロール(control)だけ使ってもほぼすべてのウィンドウプログラムを作成することができます。仕様により必要なコントロール(control)を開発することができますが、私の考えで多いプロジェクトが基本的に提供するコントロールだけで十分に開発ができると思います。まず、フォームにコントロールを追加する方法はデザイン画面でドラッグアンドドロップ(drag and drop)を利用して追加することがあるし、form1.designer.csページでソースを作成して追加することができます。様々な簡単なコントロールを追加する部分はやはりデザイン環境で作業することが便利ですが、デザインで追加すると精密な設定は大変な部分があります。そうならform1.designer.csで追加する方法です。私がwindowフォームでコントロールを作成する方法はいったんdesignerソース画面で使うコントロールメンバー変数とインスタンス生成、そしてname設定(これが一番重要)、text設定、そしてcontrols.addを通ってwindowフォームにコントロール設定を追加します。次はまた、デザイン`モード画面に戻ってコントロールをウィンドウフォームに合わせて配置、サイズ設定をします。そしてまた、ソースに戻って精密な設定をします。なぜ、このように複雑に作るかなと思いますが、率直にvisual studioに提供するデザインモードはすごく便利です。でも、自動設定が多すぎるので気づかなくソースが作成されてしまうことも多いです。例えば、name項目です。このname項目はwindow formで別に要らないとみえますが、実は識別ですごく重要な部分です。我々がメンバー変数を宣言してメン

Study / C#

#C#,#windowform,#control

作成日付 : 2021/10/29 19:45:43       修正日付 : 2021/10/29 19:45:43

31

こんにちは。明月です。この投稿はデザインパターンのデコレーターパターン(decorator pattern)に関する説明です。デコレーターという英語の意味では飾るという意味です。その意味でデコレーターパターンはインターフェースから継承したクラスの機能を拡張するためのパターンだと言えます。reference - https://en.wikipedia.org/wiki/decorator_pattern上の例をみると始めのnodeクラスからは単純なnode->print()の出力だけあるでしょう。でも、nodetimedecoratorのデコレーターを追加して、nodelogdecoratorのデコレーターを追加しました。結果はnodelogdecoratorのprintが呼び出してnodetimedecoratorのprintが呼び出して、最終的にnodeクラスのprintが呼び出されました。デコレーター構造は抽象クラスからインターフェースを継承してコンストラクタには継承したインターフェースを継承したインスタンスを受け取ります。そしてデコレーター抽象クラスを継承したクラスにはインターフェースの定義により作成してメンバー変数にある継承したインターフェースのインスタンスを実行します。そうならデコレータークラスはinodeを継承したすべてのインスタンスの抽象化された関数にデータを追加することができます。上の例はデコレーターパターンでファクトリーメソッドパターンを追加したことです。getnodefactory関数でcaltypeタイプのパラメータの結果により取得するインスタンス種類が違いますね。個人的に構造パターンの中でファサードパターン(facade pattern)の以外によく使うパターンではないかと思います。例えば、フレームワークや.net frameworkで提供する基本クラスを仕様により変更することが多いですが、その場合、デコレーターパターンを適用するとすごくコーディングが楽になることを感じますね。特にログ処理クラスやデータベースのデータ処理クラスでよく使います。ここまでデザインパターンのデコレーターパターン(decorator pattern)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Design pattern

#designpattern,#Decoratorpattern

作成日付 : 2021/10/28 20:11:13       修正日付 : 2021/10/28 20:11:13

32

こんにちは。明月です。この投稿はc#でウィンドウフォーム(window form)を作成する方法、そしてウィンドウメッセージとキューに関する説明です。c#という言語はms社で開発した言語でwindow osに環境で特化されています。つまり、c#言語で我々がよく使うウィンドウ環境でウィンドウプログラムを開発することができます。javaやその以外のpythonなどを通ってウィンドウプログラムを作れないということではありませんが、でも、ウィンドウがms社の製品なのでc#からwindow apiを使うのがもっとしやすいです。実は、c#言語を勉強することはウィンドウプログラムを作るためというのも間違ってありません。最近、ゲームエンジンでよく使うunityも基本的に使う言語もc#です。それなら簡単にウィンドウフォームを作成しましょう。visual studioを起動してプロジェクト作成します。そうするとwindow forms app項目が二つが出ます。一つはcore用だし、もう一つは.net framework用です。core用を使っても構いないですが、window formは基本的にwindow環境で実行するプログラムなのに、coreを選択する必要はありません。最近に使うwindow 10には基本的に.net frameworkがインストールされていますね。そしてプロジェクト名を入力してプロジェクト作成します。それならvisual studioに基本的にwindow formが生成されています。そのままにf5(starting debugging)を押下するとウィンドウにウィンドウプログラムが実行されていることを確認できます。実はここまでしてもウィンドウプログラムを一つ作ったことと同じ意味ですね。ここで我々がウィンドウフォームにボタンを一つ追加しましょう。visual studioの隣を見るとtoolboxがあることを確認できます。そこでbuttonを探してフォームにマウスを押下しながら引き付けます。(drag-and-drop)そうするとフォームにボタンが生成されたことを確認できます。そうするとボタンをダブルクリックしましょう。そうなるとソース画面に変わったことを確認できます。何かを知らないですが、button1_clickという関数がありますね。ここでクリックする時に動作するソースを実装するらしいです。but

Study / C#

#C#,#windowform

作成日付 : 2021/10/27 20:35:44       修正日付 : 2021/10/27 20:35:44

33

こんにちは。明月です。この投稿はデザインパターンのブリッジパターン(bridge pattern)に関する説明です。ブリッジパターンとは概念として抽象部の処理と実装部の処理を独立的に使えるような方法です。理解しやすく言えば、抽象部は、つまりインターフェースから関数に関する処理を定義すると、継承した実装部、つまり、クラスには受け取ったインスタンスにより別の結果を実装する構造です。reference - https://en.wikipedia.org/wiki/bridge_pattern上の結果をみればbridgeのクラスにどのインスタンスを渡すことにより結果が違います。つまり、node1インスタンスを渡すとnode1の結果がコンソールに出力するし、node2インスタンスを渡すとnode2の結果がコンソールに出力されます。bridgeクラスはinodeクラスの実行に関する定義を実装することでそのデータ値により結果が別々に出力されます。javaの例もc++と似ている構造です。ブリッジパターンはほぼ規格されたパターンかな?別の型で応用しようと思うが、良い例がないですね。私が知らない可能性もあります。このブリッジパターンは我々が良く使うmvc型のフレームワークでよく見えるパターンです。client(browser)から要請が来るとパラメータをmodelクラスにインスタンス生成してcontrollerを呼び出して実際に我々が作成する実装部はcontrollerのexecute関数です。抽象部分はすべてフレームワークで実行されていますね。ここまでデザインパターンのブリッジパターン(bridge pattern)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Design pattern

#designpattern,#bridgepattern

作成日付 : 2021/10/27 20:32:21       修正日付 : 2021/10/27 20:32:21

34

こんにちは。明月です。この投稿はデザインパターンのコンポジットパターン(composite pattern)に関する説明です。コンポジットパターン、合成パターンと呼ばれるパターンです。一つのクラスと複合クラス(つまり、リスト)を同一な構成して使うパターンという意味です。reference - https://en.wikipedia.org/wiki/composite_patternコンポジットパターンの基本的な型です。共通のインターフェースに一つは単一実行に関するインスタンスにprint関数を再定義して、一つは複数のインスタンスに関するprint関数を再定義して実行しました。つまり、コンポジットクラスは同じなインターフェースから継承してリストタイプのメンバー変数を生成し、add関数を通って同じインターフェースを継承したインスタンスを受け取って同じ関数名を実行する型のパターンです。普通はlistをメンバー変数に実装しますが、listを継承して実装することもできます。個人的にlistを継承するほうが別にadd関数やremove関数を実装する必要がなくて便利だと思いますが、仕様によりメンバー変数でlistの関数を隠すことやアダプターパターンで別の型に変換する可能性もあります。一つのクラスに対するパターンではありません。inodeを継承したすべてのインスタンスを同じ構造のcompositeクラスで一括的に実行するための目的です。ここまでデザインパターンのコンポジットパターン(composite pattern)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Design pattern

#designpattern,#compositepattern

作成日付 : 2021/10/27 20:30:54       修正日付 : 2021/10/27 20:30:54

35

こんにちは。明月です。この投稿はデザインパターンのアダプターパターン(adapter pattern)に関する説明です。アダプターパターンからは構造パターンです。構造パターンとは様々なクラスやオブジェクトを組み合わせてもっと大きい構造を作るパターンです。以前の生成パターンはnewキーワードを利用してインスタンスを生成する型がメインだったら、構造パターンはクラスやオブジェクトの構造をどのように構成するかをメインに考えるパターンです。アダプターパターンはインターフェースに連結されてない他のクラスを同じインターフェースの型に変換することが目標です。reference - https://en.wikipedia.org/wiki/adapter_pattern上の例をみれば私がmain関数でinodeインターフェースタイプのインスタンスをvectorを使って格納するため、宣言しました。でも、node2クラスはinodeインターフェースを継承したクラスではないので、inodeインターフェースグループに格納することができません。クラス構造は似てますが。。。node2をinodeから継承したら簡単に解決するかも知れませんが、状況によりnode2クラスを修正したらダメなら上みたいにadapterクラスを作成してnode2クラスをinodeインターフェースから継承したらしく使えます。adapterパターンが必ずクラスだけ使うことではありません。上みたいにinterfaceアダプタークラスを作成してinodeanotherから継承したクラスはinodeインターフェースを化粧したアダプタークラスに変換することが可能です。アダプターパターンは基本的にコンストラクタでタイプを変更しようと思うクラスのインスタンスを受け取って新しいクラスで包むことです。でも、必ずコンストラクタでインスタンスを受け取ることではなく、上みたいに継承を利用してアダプターパターンを実装することができます。ここまでデザインパターンのアダプターパターン(adapter pattern)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Design pattern

#designpattern,#adapterpattern

作成日付 : 2021/10/26 19:12:40       修正日付 : 2021/10/26 19:12:40

36

こんにちは。明月です。この投稿はプログラム最終テスト - st(system test(standard, scenario))に関する説明です。プログラムが納品する前のテストでstテストと言います。略語がsystem testと言いますが、人によりstandard(ステンダード:標準)やscenarioテストという人もいます。略語の解析だけ違いますが、みんな認識するのはテストの流れは似ています。以前にテスト範囲に関して説明したことがあります。上の流れでテストが実施しますが、最終テストは基本設計に対するテストです。つまり、以前の単体テスト(ut)や結合テスト(it)にはプログラムに関するバグや操作に関するテストがメイン項目だと、stにはプログラムの仕様によるテストがメインです。つまり、プログラム的なバグではなく、論理的なバグに関するテストです。例えば、特定要請ページで生成だれたデータを特定な流れにより計算して最終的なデータが表示されることが正確かというテストです。以前のテストまではプログラムツールやライブラリを通って自動化テストをできることならstはすべてのテストケースは人が実施して値が正確かを確認しなければならないです。テストの方法に関してはプログラムの種類や型により違います。例えば、ゲームの場合は普通にアルファー、クローズベータ、オープンベータのタイプでテストが行う場合が多いし、一般プログラムツールに関してもunstableバージョン、stableバージョン(安定化バージョン)を区分してunstableバージョンがテストバージョン、stableやltsバージョンが正式なバージョンになります。そしてウェブ環境にはテストバージョン(dev環境バージョン)、正式バージョン(productionバージョン、本番バージョン)で区分して配布する(deploy)場合もあります。これはプログラムの種類やバグの重要性により方法と期間が区分になります。stテスト仕様書を作成する時にはステップ数、つまり、テストの項目数は普通はプログラムコードライン数の5~10%を作成します。つまり、プログラムのコードが総10万ラインだとテスト項目を5千件から1万件ほどを作成します。テストの仕様書の内容は基本設計により論理的なデータ確認なので、単純なutやitで確認したものでは除きます。例えば、pdfや帳票を出力するボタンを押下する時にちゃ

Study / Project design

#projectdesign

作成日付 : 2021/10/26 19:10:07       修正日付 : 2021/10/26 19:10:07

37

こんにちは。明月です。この投稿はプログラム結合テスト - it(integration test)に関する説明です。以前の投稿で単体テスト(unitテスト)に関して説明しました。link - [project design] プログラム検証とテスト - unitテスト単体テストでは関数とクラス単位でテストすることですが、テストの回数がciツールを利用して相当に頻繁にテストをします。結合テストはunitテストから検証された関数とクラスを全体的に合わせて一つの流れでテストすることです。ウェブプロジェクトには実際にウェブサーバ(開発サーバ - dev server)に配布(deploy)して運用しながら検査することです。開発サーバなので、本データを扱うことではなく、から偽データを使います。テストの範囲は下記の構造により動きます。結合テストは詳細設計で作成したシークエンスやインターフェースを確認することなので、プロジェクトの仕様をテストすることよりプログラム的な不良要素を検証することです。例えば、どのデータを渡したらnullエラーが発生するとか、関数によりinputからoutputは正解ですが、関数の順番で値が間違いか((1+2)*3と1+(2*3)の差異)、ウェブ画面から数字を入れなければならないが、テキスト文字が入っている場合に表示するエラーメッセージなどをチェックするテストなら良いでしょう。結合テストは大幅で二つのパターンで実施します。一つはseleniumというライブラリを使うことと人がいろいろをクリックしながらチェックすることです。seleniumライブラリを利用するのはウェブスクレイピングという技術です。link - [python] seleniumライブラリを使う方法(自動ウェブテスト、ウェブスクレイピング)seleniumライブラリを通ってテストボットを作成するのはjavaもできるし、c#もできますが、テストの特性上にスクリプト修正が多く発生する領域なので修正するたびにビルドすることより修正と実行が便利なpythonに個人的に良いではないかと思います。seleniumライブラリを使うことの利点は我々がウェブページを単純な繰り返しなテストはプログラムとして流すことでテスト時間を短縮することができるし、特定な部分を修正して発生するリグレッションテストを簡単にできます。または、ブラウザによりchrom

Study / Project design

#projectdesign

作成日付 : 2021/10/25 20:12:17       修正日付 : 2021/10/25 20:12:17

38

こんにちは。明月です。この投稿はpythonでseleniumライブラリを使う方法(自動ウェブテスト、ウェブスクレイピング)に関する説明です。まず、seleniumとは、ウェブブラウザのドライバーに接続して制御できるライブラリで普通はウェブテストやウェブスクレイピング領域でよく使う技術です。理解しやすく説明すると、pythonのスクリプトで我々がよく使うクロームブラウザを制御することで特定ボタンを自動にクリックするかウェブページを移動しながらデータを収集してウェブテストやウェブスクレイピングで活用できるライブラリです。以前にはc#でgeckoブラウザをブラウザをコントロールする方法に関して説明したことがあります。link - [c#] geckoライブラリを利用してウェブスクレイピングする方法seleniumとgeckoブラウザの差異はgeckoブラウザをブラウザのオブジェクトを取得してformコントロールに付けて開発することで実際のブラウザを使うことではなくブラウザのオブジェクトライブラリを使うことです。でも、seleniumの場合はブラウザのライブラリを利用することではなく、もうpcにインストールされたウェブブラウザをseleniumライブラリを通って制御することです。これはもっとユーザ環境みたいに設定ができるのでgeckoブラウザより実際的なウェブテスト環境を構築することができる利点があります。このseleniumライブラリを使うためにはpythonからseleniumライブラリをダウンロードしましょう。私はもうインストールされているとメッセージが出ました。ライブラリをインストールしたら今回はドライバーをインストールしなければならないです。ここではクローム(chrome)の例で説明します。firefoxやieに関しても同じ流れです。まず、インストールされたクローム(chrome)のバージョンを確認しましょう。クローム(chrome)ブラウザの右上のメニューをクリックしてhelp -> about google chromeを押下しましょう。そうすると上のイメージ通りに現在のバージョンが表示されます。下記のリンクに移動して小数点前のバージョンを合わせて選択しましょう。link - https://sites.google.com/a/chromium.org/chromedriver/d

Devlopment note / Python

#python,#selenium

作成日付 : 2021/10/25 19:29:00       修正日付 : 2021/10/25 19:29:00

39

こんにちは。明月です。この投稿はデザインパターンのプロトタイプパターン(prototype pattern)に関する説明です。プロトタイプはパターンのアルゴリズムはすごく単純なパターンですが、概念的にポインターとスタック、ヒープメモリに関する概念をよく知らないなら理解するのが難しいパターンです。我々がプログラム上でクラスのインスタンスを生成すると変数にポインターアドレスが格納されるし、ポインターアドレスによりヒープメモリにインスタンスが割り当てすることです。そのため、変数で新しいインスタンスを生成せずに、等号(equal: =)記号で新しい変数名にインスタンスのアドレスをコピーすると二つの変数で一つのインスタンスを指しているので、変数の間でデータの影響に及ぼします。当たり前の話ですが、当然に影響を及ぼします。結果を見るとnode変数とnodeclone変数のメモリアドレスが同じなことを確認できます。上のイメージみたいな構造で二つの変数に一つのインスタンスを指しているからです。link - [c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)link - [java] 10. メモリの割り当て(stackメモリとheapメモリ、そしてnew)とcall by reference(ポインタによる参照)そうなら逆にそのインスタンスアドレスをコピーせずに、クラスのデータを同じくしてクラスをコピーすることができないだろうか?上のクラスはすごく単純な構造なのでnew nodeしてdataの値をコピーすることで可能ですが、複雑なクラスだし、メンバー変数がすべてprivateに設定している場合は単純にコピーすることが難しいですね。reference - https://en.wikipedia.org/wiki/prototype_patternc/c++には単純にclone関数で新しいインスタンスを生成するnewキーワードを使ってthisポインターをパラメータに渡すとインスタンスコピーになります。結果を見るとdataの値は同じですが、メモリアドレスが違うことを確認できます。javaの場合はcloneableインターフェースを継承してからプロトタイプ関数のclone関数を使えます。そしてobjectクラスにはclone関数がprotectedのアクセス修

Study / Design pattern

#prototype,#designpattern

作成日付 : 2021/10/22 19:35:45       修正日付 : 2021/10/22 19:35:45

40

こんにちは。明月です。この投稿はプログラム検証とテスト - unitテストに関する説明です。プログラムテストというのはプログラム設計と作成よりに凄く重要な作業です。普通に新人開発者やプログラムを始めに勉強するかたにはテストに大事な比重に思わずに工数計算や工程を設定します。少なくても私はその時期がありました。テストというのはプログラムを商品だと思ったら、商品の品質と関連がある部分だし、サービスが開始する時にはサービスの信頼度に関する問題なので、テストというのは設計と実装よりもっと重要な作業だと思います。組織により違いますが、実務ではプログラム工程で設計と実装よりテスト工程にもっと重要だと思うし、プロジェクト管理者の中でも品質管理者(テスト管理者)がプロジェクト内で権限が強いの場合もあります。テストをすることでプログラムには基本的に人が設計するしコードを作成する作業なので、基本的にミスが必ず発生するという前提で始まります。テストの段階は大幅で3段階になりますが、単体テスト(ut: unit test)、結合テスト(it: integration test)、シナリオテストあるいはスタンダードテスト(st: standard test or system test)になります。そしてテストの設定範囲は単体テスト(ut)はコードミスをチェックするし、結合テスト(it)は詳細設計のインターフェースなどをテスト、システムテストは基本設計及びユーズケースをテストします。上の工程はウォーターフォール工程で設計から開発、そしてテストの機能構造です。プログラムテスト設計と実行も人がすることなので、この過程でもミスが発生する可能性があります。つまり、最悪の結果が設計でミスして、コードも間違って実装、最後にテスト中でも確認ができないとバグが発生することです。テストというのはプログラムの納品する前の最終確認と同じ意味なので、テストは最小2人以上が一つのチームになり、クロスチェック(cross check)することが重要です。設計あるいは実装した人がテスト設計を作成します。そしてテストの実行、テスト結果確認に関しては別の人が実施します。私が設計、実装した人がテストまですると自分の論理と計算の影響で、バグを見つけることが難しいですね。率直にこのようにテストしてもバグは発生しますが、上のルールでするとプログラムを作成する段階でバグを最小

Study / Project design

#projectdesign

作成日付 : 2021/10/22 19:34:09       修正日付 : 2021/10/22 19:34:09

41

こんにちは。明月です。この投稿はc#のコーティング規約に関する説明です。まず、コーティング規約に関して簡単に説明すると、コーティング規約は我々がプログラムを作成する時に守らなければならないルールと言います。プログラムの性能と効率性とは関係がないし、複数の人とプログラムを作成する時にソースを見やすくするために決めたルールです。簡単に例で話すと、関数命名法をみると「動詞 + 名詞」の型で普通は「getdata」名で作成します。でも「dataget」という関数名を作成してもプログラムが動かないということではありません。いや、「abcdefghijklm」という関数名にしてもプログラムが動くことでは何も問題がありません。でも「getdata」という関数名を作成すると関数のソースを見なくてもこの関数は「どのデータを取得する関数だ」だと予想することができますが、変な関数名で作成すると関数名だけでどの動作するかを分かりません。それでmsにはc#をコーディングする時に、関数命名法、ソース内でスペース規則などのルールを設定して使うことでお勧めしています。これをコーディング規約と言います。link - msのコーティング標準命名ルール正規化されたクラスの名前に一行目に長く表示されないようにしましょう。つまり、含めているすべてのnamespaceを設定する必要がありません。< p="">レイアウトルール良いレイアウトルールは、コードの構文を強調して読みやすく作成することです。1. 基本コード編集ツールの設定 (4文字インデント、スペースで保存されたタブ)を使いましょう。   ショットキーはctrl + k + dです。   link - https://docs.microsoft.com/en-us/visualstudio/ide/reference/options-text-editor-csharp-formatting?view=vs-20192. 一行目には一つのステップだけ作成しましょう。3. 連続的にチェインパターンの関数宣言する時、自動にインデントができないなら、タブ間隔をインデントしましょう。(4スペース)  &

Study / C#

#C#

作成日付 : 2021/10/21 18:57:02       修正日付 : 2021/10/21 19:04:52

42

こんにちは。明月です。この投稿はc#の値の初期化及び基本データ値(default)を設定する方法、そして原始データのnull処理、?と??の使い方に関する説明です。我々がプログラムを作成すると変数の初期値を設定する場合があります。例えばintタイプのメンバー変数を作成すると初期データを-1にするか? 0にするかの悩みがある場合があります。もちろん、-1に設定するか、0に設定するかに関しては仕様により設定しなければならないですが、int a = 0;式の設定よりもっとプログラムらしいな設定がないかな?上の例をみればintタイプのdataメンバー変数にdefaultキーワードを使ってintの初期値を設定しました。コンソールに出力すると0の値が出力されますね。つまり、defaultは該当なデータタイプの初期データの値をリターンするキーワードです。原始データの場合は初期intの場合0を、floatの場合は0.0を設定します。それならここでメンバー変数の値にdefault(int)を外して出力するとどの値がリターンされるかな?同じの0の値があります。そうれならdefaultを設定する必要がないかな?正解は設定する必要がありません。基本的にメンバー変数は基本初期値が設定されます。つまり、default(int)を作成しなくてもdefault(int)値で設定することです。でも、仕様によりintの値にnullを許して設定したい場合があります。つまり、基本値が0ではなくnullをします。データタイプに?を入れたら原始データにnullを許します。そしてdefault(int?)はnullです。つまり、、基本初期値がnullになります。原始データではないクラスの場合はどうでしょう?classは基本的にnullを許すため、?を入れなくてもdefault(string)はnullの値です。そうすると原始データとclassの差異が何があるので、この差異があるかな?基本的にc#には原始データを構造体(struct)で認識しています。つまり、構造体はnullを許せません。私がstructで構造体を生成すると使い方は基本的にclassと似てますがnullを許せません。構造体でnullを許すためには?を使わなければならないです。ここでまた知りたいことがメンバー変数はdefaultを使わなくてもクラスの場合はnullになるし構造体(stru

Study / C#

#C#

作成日付 : 2021/10/21 18:54:41       修正日付 : 2021/10/21 18:55:58

43

こんにちは。明月です。この投稿はc#でのnamespaceとusing、そしてpartialの使い方に関する説明です。namespacec#では最小単位のオブジェクト(object)をクラスだと説明しました。link - [c#] 10. クラスを作成する方法(コンストラクタ、デストラクタ)我々が実行関数(main)を使ってもその関数は必ずクラスの中で含めなければならないです。つまり、関数だけには使えません。それで我々がプログラムを扱ったら様々なライブラリを連結して色々ソースを作成することになります。その場合、クラス名がすべて別々に作成することが可能かな?参考にクラスはオーバーライド(override:同じ名で別の処理)ができないです。同じ名のクラスを作成すると必ずエラーが発生します。そうすると我々がプログラムを作成する時にはそれを気を付けて作成すると思っても、オープンライブラリを連結して使う時にそのライブラリ中であるクラス名が絶対に重複されないか?可能性が十分にあります。それなら我々がライブラリを連結して使わなければならないなのにクラスが重複になって実行されません。それを避けるためにnamespaceがあります。namespaceを二つに分けてclassを生成すれば同じclass名でも生成が可能です。正解にはtest1.node名とtest2.node名のクラスなので別のクラス名です。このように別のnamespaceをユニークに指定しておいたら別のライブラリとクラス名が衝突する可能性がありません。usingでも、namespaceは重複宣言が可能です。上の例ではnamespaceをa、b、cで作成しましたが、この命名が長くなると、インスタンスを生成する時にクラス名が長くなります。それを短くするためにusingキーワードを使います。usingを使ってnamespaceを指定するとusingを書いたコードライン以降はa.b.cを書いてなくてもa.b.cのクラスを使えます。上の例では私が説明しやすくするために一つのページで説明しましたが、普通はクラス別でファイル(.cs)を作成するしnamespace別でフォルダを作成するため、usingをソースの最初のラインに作成します。そうなら最初の例みたいに同じクラスはどのように処理するかな?この場合はnodeのクラス区分ができないので、usingを使ってもクラスの前で

Study / C#

#C#

作成日付 : 2021/10/21 18:51:39       修正日付 : 2021/10/21 18:52:48

44

こんにちは。明月です。この投稿はc#でreflection機能を使い方 - attributeに関する説明です。以前の投稿までreflection機能を説明しましたが、簡単に要約するとソースにクラスの割り当てやクラス呼び出すことの静的な方法をデータなどにより動的なクラスを割り当てするか関数を呼び出しする方法です。実はc#にdynamicタイプがあるし、様々なパターンによりフレームワークを作成するかコアークラスを作成することではなければ別に使うことはありません。でも、reflection機能中でattributeによりクラス区分やメソッド呼び出す方法はすごくよく使います。link - [c#] 31. アトリビュート(attribute)を使い方c#のアトリビュート(attribute)はメタデータとしての役割だけですが、reflectionの機能と一緒に使うと単純なメタデータの機能だけではなく、プログラムを制御する機能に使えます。上の例は簡単にnode1クラスとnode2クラスのアトリビュートを取得する例です。他のreflectionの機能と別に差異がなさそうです。実際にはアトリビュートのタイプで関数の実行可否や順番を設定するところでよく使います。例えば、ウェブプロジェクトでアトリビュートを設定すれば、接続するユーザの権限により関数を実行するかどうかの検査やデータにより実行順番を設定することなどを設定することができます。上の例はnodeクラスでexecuteorderのアトリビュートが設定されている関数を取得して実行順番が設定されている順番とおりに関数を実行します。私が任意でアトリビュートにintタイプの値を入れて順番を設定しましたが、データベースやユーザから入力された値により順番を決定することになるとそれがinterpreterパターンになります。アトリビュートは上の例みたいにreflectionの動的実行のために使う場合がたくさんあります。実は単純にメタデータのためならただコメントを使う方がよいでしょう。reflectionとアトリビュートをよく使えば、様々なデザインパターンのアルゴリズムを作成することができるし、このようにフレームワークを作成することができます。ここまでc#でreflection機能を使い方 - attributeに関する説明でした。ご不明なところや間違いところがあればコメントしてく

Study / C#

#C#

作成日付 : 2021/10/20 19:29:31       修正日付 : 2021/10/20 19:29:46

45

こんにちは。明月です。この投稿はプログラム制作(コーディング) - クラス作成方法に関する説明です。以前の投稿でコーディングする時に関数を作成する方法に関して説明しました。作成方法に関しては規約が決めていることや必ずこのように作成しなければならないということではありません。ただ、私の経験により、このように作成するとプロジェクト管理することで便利だし、もっと直観的なコーディングすることではないかと思います。クラスを作成する方法に関しても自分の規則があります。ウェブプロジェクトの基準で作成したものなので、c/sやアプリ開発する場合は差異があると思います。オブジェクト指向プログラミング(oop)の4つの特性で抽象化、カプセル化、継承化、多相化(ポリモーフィズム)があります。私の場合はこの4つの特性が何かを深刻に考えたことがあります。実は我々がプログラム作成する時、4つの特性を無視して開発してもプログラムを作成することで問題がありません。抽象化しなくてもプログラムを作成できないことではないし、カプセル化、つまり、メンバー変数はpublicに設定してクラス外部にも参照することにしてもプログラムがエラーになることでもありません。もちろん、継承化と多相化(ポリモーフィズム)に関しても同じです。この4つの特性がなにかというとプログラムを作成する時に、もっと可読性をよくなるし、我々がドキュメントを作成しなくても、プログラムのコードを設計図みたいに作成するコーディング技法だと思います。例えば、我々が人の名前と生年月日を入れると年齢を計算するプログラムを作成すると思いましょう。上のソースをみれば私がpeopleというクラスを作成しました。コンストラクタで名前と生年だけいれて年齢は計算します。ここで年齢の変数がpublicならどうでしょう?calcoldという関数が意味がなくなります。つまり、クラスのメンバー変数がクラス外部で修正ができるので無欠性を保証することができません。なのでメンバー変数を読み取り専用に設定するために、関数を通って制御します。それがカプセル化です。ここで出力をtostringで再定義しましたので、ただpをconsole.writeline関数に入れると自動にtostringを出力することになります。このようにクラスの特性を活用してプログラムを作成すればクラスを割りあって使うところではfacadeパターンによ

Study / Project design

#projectdesign

作成日付 : 2021/10/20 19:28:09       修正日付 : 2021/10/20 19:28:17

46

こんにちは。明月です。この投稿はc#でreflection機能を使い方 - propertyとeventに関する説明です。以前の投稿までc#のreflectionのclassとmethod、variable(変数)に関して説明しました。link - [c#] 50. reflection機能を使い方 - classlink - [c#] 51. reflection機能を使い方 - methodlink - [c#] 52. reflection機能を使い方 - variablereflectionはクラスの構成要素に関して動的にデータを取得及び呼び出す方法です。javaにはclassの構成要素が関数とメンバー変数しかないですが、c#の場合はプロパティやイベントなどの特殊機能(?)をもっている関数があります。プロパティは関数機能と変数の機能を合わせた要素だし、イベントは関数を複数で重畳して呼び出す機能です。link - [c#] 21. c#のプロパティ(property)link - [c#] 25. イベント(event)キーワードを使い方まず、プロパティのreflectionは関数のreflectionと似ています。上の例はnodeクラスのdataプロパティのset関数とget関数を呼び出すreflectionです。プロパティがoopの規約のためにget、set関数なので、関数のreflectionと差異がありません。プロパティもprivateを設定することができるし、staticで設定することができますが、普通はpublicで設定します。でも、publicではなくても関数のreflectionみたいにbindingflags.public | bindingflags.nonpublic | bindingflags.staticのオプションで取得することができます。eventの場合は関数を重畳して一括で呼び出す方法です。上の例ではgetevent関数を通ってnodeクラスのeventを取得します。イベントにはdelegateタイプでイベントを追加しますが、delegate.createdelegateを通って関数をデリゲート(関数ポインター)タイプに変換しなければならないです。そしてevent reflectionを通ってイベントを追加します。私の場合は3回に追加しました。実はイベントはクラス内

Study / C#

#C#

作成日付 : 2021/10/19 21:02:58       修正日付 : 2021/10/19 21:02:58

47

こんにちは。明月です。この投稿はプログラム制作(コーディング) - 関数作成方法に関する説明です。実務のプログラムコーディングは工程に話すと普通は生産や作成という表現を使います。ただ、それは言葉の表現で、実際は我々が知っているプログラムコーディング(実装)になります。実務あるいは工程を設定してプログラムを作成してもプログラムコーディングする方法は普通に開発することと大幅で変わることではありません。前に設計図が作成して置いたらそのままに作成することだけです。ここでは各のスタイルがあるし、作成方法があるので別に規約を決める必要はありませんが、自分の経験に関して工程の中でプログラムを作成方法を説明しようと思います。一般的にウォーターフォール工程でプロジェクトを運用したら基本設計と詳細設計の段階でもうプログラム作成に関する設計が作成されたのでそのままに作成すると良いです。別に追加する内容はありません。私が説明しようと思うのは今まで説明したアジャイル工程と混ぜている工程(設計はアジャイル、テストはウォーターフォール工程)で私のスタイル作成方法があります。まず、アジャイル工程でプログラム設計書を作成する場合もありますが、普通はjiraやredmineなどのツールを利用してスクラムサイクルを設定してアイテム(ticket)別で作成します。そのため、詳細設計の段階で抽象クラス、インターフェースを作成します。そのように思ってもプログラムを作成する時になると、予想できなかった共通部品と抽象化が必要なクラスや関数がありますね。その場合に我々が共通部品を作成する方法に関して説明します。この共通部品を作成する時、私はフィボナッチ数列のアルゴリズムを考えています。普通はフィボナッチ数列アルゴリズムは再帰関数で作成します。実は再帰関数を使うのはプログラムの性能上で悪いです。for文で作成することができるものを再帰関数を作成する必要はありません。でも、関数を理解するために再帰関数みたいに良い例がありません。我々が関数を作成することを私の新人の時によくミスした部分ですが、ソースが長いので可読性を上がるために、見やすくために作成したときがあります。つまり、ソースを上から下まで読み込む部分で一つの関数ですべてのソースを作成することが悪いと思い、関数でソースを分割する役割だと思う時があります。そのことで関数を考えたら、上のフィボナッチ数列の再帰

Study / Project design

#projectdesign

作成日付 : 2021/10/19 21:01:32       修正日付 : 2021/10/19 21:01:32

48

こんにちは。明月です。この投稿はcentosでジェンキンス(jenkins)をインストールする方法に関する説明です。ジェンキンス(jenkins)とはソフトウェアを開発する時に統合サービスをするツール、つまり、ci(continuous integration)と言います。統合サービスというツールは我々がプロジェクトを開発する時、一人ではなく、多数の人と開発する時に一つのブランチで統合してアップデートするツールと言います。まず、ソースを統合するツールとして最近よく使うgitがあり、svnなどがあります。これはソースを統合するツールなのでciツールとは差異があります。各のローカルpcで開発して我々がgitを通ってコミット及びpull requestをします。でも、これは各の環境で開発したものなので、すべての環境で統合されたということではありません。つまり、私のローカルではエラーがありませんが、環境が違うと開発環境(dev env)や実際のサーバ(prod env)にアップデートするとエラーが発生する時があります。代表的にデータベース接続設定やファイルパースなどの差異があります。それでこのジェンキンスを通って統合環境で再デプロイ(redeploy)をして最終的にサービスを安全に運用するためのツールだと思えば良いでしょう。ciツールの概念はこれですが、実は上のエラー処理まですべて検証するなら凄く複雑な作業をしなければならないですが、一般的にはソースを再統合して該当なサーバに再ビルドしてデプロイする機能だと思えば良いです。まず、centosのこのjenkinsをインストールする方法は二つの方法があります。yumを通ってinstallする方法があり、ソースをそのままにdeployして使う方法があります。私もyumを通ってやったことではないので、詳細に説明は大変ですが、yumを通ってインストールする方法は簡単ですが、権限設定が少し複雑だと聞きました。そのため、私はソースをダウンロードしてインストールする方法でやりましょう。(私の個人開発サーバは一台なので二回は大変ですね。)jenkinsをインストールするためにはjavaが必要だし、tomcatとgit、そしてmavenをインストールしなければならないです。link - [centos] java インストールlink - [centos] tomcat インストール

Devlopment note / Linux

#jenkins

作成日付 : 2021/10/18 18:28:58       修正日付 : 2021/10/18 18:28:58

49

こんにちは。明月です。この投稿は詳細設計(インターフェース設計と抽象化作業)に関する説明です。以前の投稿で基本設計に関して説明しました。link - [project design] 基本設計(画面設計とdb設計)基本設計というのは簡単に要約するとプログラムの全体的な構造を設定することです。それなら詳細設計はもっとプログラムをどのように作成するかを設定することです。基本設計ではユーズケースやアクティブダイアグラムなどを通ってプログラムの要素よりユーザがプログラムをどのように使うか、プログラムの流れはどのようになるかの説明すると思ったら詳細設計はもっと具体的にプログラムの設計になり、プログラムらしい設計になります。つまり、uml(unified modeling language:統合モデリング言語)にはシークエンスダイアグラムやクラスダイアグラムを利用してプログラム設計することです。シークエンスダイアグラム reference - https://en.wikipedia.org/クラスダイアグラム reference - https://stackoverflow.com/この詳細設計する理由としては様々な工程のインターフェースを確定するためです。今回はウェブプログラムではなく、c/s(clieng-server)プログラムの例で説明します。我々が業務c/sプログラムを作成すると思ったら、serverには大幅でnetworkパート、業務パート、core(共通部品)、その他のユーティリティに分けて開発します。一人で開発すると思えば別にパートを分ける理由がないですが、実務では一人で開発する場合が少ないので大幅で4パートで分けて開発すると思いましょう。詳細設計がなく、すぐ開発を開始すると思えば、各パートでは工数(step count)が設定されます。それなら、私が業務パートを作成しようと思うと、作成中でcoreの特定なデータを取得するコードを作成すると思いましょう。でも、coreパートではまだその部分が作成せずに、重要度が低く、優先順位で離れています。そうなら我々はそのcoreが作成する時まで今の作業が止まります。networkを利用してclientにデータを送信しなければならない部分だとnetworkパートが作成する時まで待機するべきです。もっと大きく考えるとclientプログラムはserverプログラムが

Study / Project design

#projectdesign

作成日付 : 2021/10/18 18:23:15       修正日付 : 2021/10/18 18:23:59

50

こんにちは。明月です。この投稿は基本設計(画面設計とdb設計) に関する説明です。以前にプロジェクト工程に関して説明しました。link - [project design] プロジェクトを工程(ウォーターフォール vs アジャイル)プロジェクト工程というのは全体的にプロジェクトをどの順番で進めるかを設定することなら、基本設計はプログラムをどのように作ろうかを設定することです。ウォーターフォールの工程での基本設計はuml(unified modeling languagu:統合モデリング言語)のユーズケース、アクティブダイアグラムを通ってユーザがプログラムをどの目的で使うかどのように利用するかを設定することです。必ず、ユーズケースやアクティブダイアグラムではなく、ストーリボードを通って設定することも悪くないです。ユーズケースのreference - https://www.javatpoint.com/アクティブダイアグラムのreference - https://sourcemaking.com/ストーリボードのreference - http://nmasse.com/この方法の利点はプログラムの目的を正確に設定することができるしプログラムを一緒に作成するメンバーとコミュニケーションがしやすいことと結果物に確実な目標設定が可能なことがあります。問題は工程で上の設計書をすべて作成すると時間がすごく長くなる欠点があります。そして次の工程の詳細設計とコーディングの工程に進める時、お客様とユーザの追加要請事項ができた場合に変更の柔軟性がずいぶん厳しくなります。なので、私の場合は別にumlやストーリボードの設計を省略する方法です。(もちろん、お客様の要請がある場合は作成しますが、時間と金額に関して説明します。)でも、すべて省略することではプログラムの目標を設定することが難しいですが、私は画面設計(htmlコードでプログラムを作成)してコメントに利用してストーリボードの流れを作成します。画面設計というのは別にエクセルやパワーポイントのワードプロセッサーで作成することではなく、apacheを起動してvisual codeを利用して直接にhtmlを作成します。この方法の利点はウェブプログラムというのはwas(web application server)からパーシングされたhtmlタイプとデータをブラウザーに転送するこ

Study / Project design

#projectdesign

作成日付 : 2021/10/17 21:21:11       修正日付 : 2021/10/17 21:21:11

51

こんにちは。明月です。この投稿はデザインパターンの抽象ファクトリーパターン(abstract factory pattern)に関する説明です。デザインパターンの生成パターンの中で一番複雑なパターンの抽象ファクトリーパターン(abstract factory pattern)です。構造は複雑ですが、細かく見るとファクトリーメソッドパターンでファクトリーをクラスで作成してその上に抽象インターフェースによりファクトリーを取得するし、そのファクトリーでクラスを取得する構造です。つまり、ファクトリーメソッドパターンが重畳していると思えば良いです。reference - https://en.wikipedia.org/wiki/abstract_factory_pattern上の例をみればfactoryクラスをgetfactoryという関数からインスタンスを受け取ります。また、factoryクラスにはgettypedaoを通ってインスタンスを受け取ります。私はここでビルドパターンを通ってidaoを受け取りますが、gettypedaoにパラメータを入れてまたファクトリーメソッドパターンを使えます。上の例はjavaで作成した抽象ファクトリーパターン例です。c/c++と違い、ファクトリークラスの中でビルドパターンを代わりにファクトリーメソッドパターンでインスタンスを取得します。上の例はc/c++と同じく、ファクトリークラスでビルドパターンでインスタンスを取得して実行します。私がfactoryクラスではなく、一般クラスをdaoというクラス名で作成しました。なぜならこの抽象ファクトリーパターンがormフレームワークで一番よく使うパターンからです。例えば、データベースの各テーブルのdaoクラスを作成します。でも、仕様によりこれがoracleになれるし、mssqlになれるし、mysql(mariadb)になれる可能性があります。各データベースのシステムのテーブルの設計構造は同じだと思えば、この抽象ファクトリーパターンを使ったらoracle用dao生成ファクトリーを生成することができるし、mssql用dao生成ファクトリーを生成することができます。その以外にデータ管理や生成、pdf生成やexcel生成などで仕様により装置を区分する時、該当なクラスの構造は同じく作ろうと思えば、よく使えるパターンです。ここまでデザインパターンの抽象

Study / Design pattern

#designpattern,#Abstractfactorypattern

作成日付 : 2021/10/15 19:31:03       修正日付 : 2021/10/15 19:31:03

52

こんにちは。明月です。この投稿は要件定義(要求事項整理)に関する説明です。要件定義はプログラムの工程に関係せずにどのプロジェクトでも必ず整理しなければならない段階です。要件定義というのはプログラムをなぜ作るか、どのところで活用するか、どのプログラムを作るかを定義することの意味です。プログラムというのはどのデータや情報を収集してそれをどのように出力することや統計、算出数値を計算することがほとんどです。ほとんどというのはプログラムがデータ収集だけではなく、便利性のためのバッチプログラム、人ができない仕事を代わりにやるロボットや機械をコントロールするためのプログラムも存在します。しかし、私の場合は主なプロジェクトがウェブプログラムだし、ウェブプログラムは普通にデータを収集、掲示の目的が多いです。ウェブプログラムというのはもっと詳しく説明すると、普通のプログラム流れが申請や要請などのページでデータを入力するとユーザやプログラムによりデータが収集、加工になり、データが算出して最終的にウェブページにテーブルや統計グラフなどを通って表示することが一般的です。もちろん、特殊な要請事項により申請や要請は省略してボットや収集、検索プログラムによりデータが自動に生成してウェブにデータ結果が表示する流れも多いです。この流れでみると、ウェブプログラムの要件定義の構造はinput -> calculate -> outputの流れで定義されます。上の例は私が簡単に作成した要件定義表です。実務にはもっと詳細な内容がありますが、機能的にinput、calculate、outputの内容があれば、次の段階の設計をするときにどの内容が重要か、コーディングとunitテストの区分とシナリオテストのアクションのタイプを定義する時に明確になります。上の構造は個人的に私はこのようにすればやりやすかったと意味で、その方法が必ず正解ということではないので、ただ参考だけしたら良いです。要件定義の構造を考え終わったら誰からの要件定義かを考えなければならないです。普通のプログラムは自分が必要から作る場合もありますが、実務は誰からプログラムの開発要請がある場合が多いです。その要請がお客様がなることもあるし、現場の上司や他部署の仲間から必要により開発要請がある場合もあります。要請の種類は様々ですが、形態はほぼ似てます。まず、要請者のタイ

Study / Project design

#projectdesign

作成日付 : 2021/10/15 19:28:58       修正日付 : 2021/10/15 19:28:58

53

こんにちは。明月です。この投稿はc#でreflection機能を使い方 - variableに関する説明です。以前の投稿でreflectionに関するクラスと関数を使い方に関して説明しました。link - [c#] 50. reflection機能を使い方 - classlink - [c#] 51. reflection機能を使い方 - methodreflectionというのはクラスや関数でソースにインスタンス生成(new)や関数を呼び出し(method())の普通の仕方ではなく、動的にreflection機能を利用して生成及び呼び出す方法という意味です。変数も同じ意味です。特にc#にはクラスの中で変数はオブジェクト指向プログラミング(oop)によるメンバー変数はprivateで生成することが一般的です。しかし、仕様により強制的に変数の値を変更するかユニットテスト(nunit)を実施する時にデバックの資料で使う場合があります。上の例は一般的なコーティングする方法でnodeクラスのインスタンスを生成する時、コンストラクタに10という値を入れてprint関数を通ってコンソールに出力しました。当然にmain関数にはnodeのインスタンスのメンバー変数のdataを参照することができません。コンストラクタからデータを入れること以外は値を変更するか値を取得することができなく、print関数を通って出力だけできます。上の例でtypeof(node)でnodeクラスのtype構造を取得した後にdataのメンバー変数を取得しました。そしてコンソールに出力するとメンバー変数の値が出力しました。その後、setvalueを通って値を格納してprint関数を呼び出したら変更された値が出力されました。ここで見るとreflectionを通って関数を取得する場合とすごく似ています。実は同じですね。上の例はnodeクラスにメンバー変数がありません。ただプロパティだけあります。でも、私がreflectionを通ってnodeクラスのメンバー変数を取得するとdataのbackingfieldというメンバー変数があります。つまり、プロパティでget、setだけで設定してコンパイルしたら自動にprivate変数が生成されることを確認できます。つまり、プロパティだけ作成しても内部的にはprivateメンバー変数が生成してoop規約に合わせることを

Study / C#

#C#

作成日付 : 2021/10/15 19:27:37       修正日付 : 2021/10/15 19:27:37

54

こんにちは。明月です。この投稿はプロジェクトを工程(ウォーターフォール vs アジャイル)に関する説明です。普通にどのプログラムを作成する時に、多い方がパソコンをパワーを付けて、ideツール(visual studioやeclipse)を実行し、コードを作成してプログラムを作ろうと思います。私も大学生時代にはそう思ったと思います。でも、この方法でプログラムを作成すればプログラムが思ったより違うか想像したことよりクオリティ(品質)がすごく悪く完成する場合が多いです。凄く素晴らしいプログラム作成能力や頭が天才ほど良い方にはこんなに作成しても良い品質なプログラムを作られるかもしれませんが、私の場合は思った通りに出来なった場合が多かったんです。理由はいろいろがあると思いますが、一応始めに考えた計画内容を忘れたり、作成しながら欲心が出来て元々考えた内容より様々な機能を入れ込んだり、テストが足りなくて思われないバグが発生することなどの理由があります。勉強する時にはこのことでプロジェクト失敗にしても別に損害がないですが、実務でそのようにしてプロジェクト失敗にするとすぐ損害になります。また、勉強する時とは違い、実務では一人ではなく、チーム単位で動くので、チーム員が目標をちゃんと決められないとかプロジェクトの方向が見えないのでチーム内の雰囲気が悪くなる場合もあります。そのようにならないためにはプロジェクトを設計する人には先に工程に関して考えなければならないです。プロジェクト工程は我々がどのプログラムを作成するかを設定して、そのプログラムを作成するためにはどの過程を通って作成するか、どの方法でテストをするかどの方法で情報を共有するかを設定することだと思えば良いです。理論的には代表的にウォーターフォール工程とアジャイル工程があります。理論的な説明はここで説明することよりウィキペディアで確認する方法が良いです。link - https://ja.wikipedia.org/wiki/ウォーターフォール・モデルウォーターフォールは簡単に説明すると下記通りの工程です。簡単に説明すると要件定義はお客様が作りたい定義、どのデータをどのように出力するか、どの環境で使うかを決定する部分です。普通にはpm(project manager)がお客様と会議などを通って決める部分です。基本設計はumlで色々なダイアグラムを作成することも良いですが、

Study / Project design

#projectdesign

作成日付 : 2021/10/14 18:36:04       修正日付 : 2021/10/14 18:36:04

55

こんにちは。明月です。この投稿はc#でreflection機能を使い方 - methodに関する説明です。以前の投稿でreflectionの機能を利用してクラスのインスタンスを生成する方法に関して説明しました。link - [c#] 50. reflection機能を使い方 - classreflectionというのは簡単に説明すると、既存、ソースでnewキーワードを使ってインスタンスを生成する方法からstringの値により動的にインスタンスが生成されることということです。関数(method)も既存、ソース上で関数名を作成して呼び出す方法ではなく、クラス内で関数を探索して動的に実行するための方法ということです。上の例は既存の方法でprint関数を呼び出す方法です。上の例はreflectionで関数を探して実行する方法です。ソース上ではstringのデータを利用してprintの値で関数を呼び出します。上のgetmethods関数を利用してnodeクラスにあるすべての関数を取得しました。でも、c#にはすべてのクラスはobjectクラスを継承します。なので、objectの関数にも実行されます。それでパラメータが無くて、returnタイプがvoidということだけフィルターして実行しました。結果はa,b,cの関数が実行されました。私は例のために上みたいに作成しましたが、reflectionを利用するとユーザの入力値あるいはデータベースやファイルの値により実行できる関数を制御できます。簡単にインタープリターパターン(interpret pattern)を作成することができます。link - 作成中そしてreflectionを利用すればpublicになっている関数だけではなく、private、protectedのアクセス修飾子にもアクセスができます。上の例でprint関数はprivateで設定されていても、main関数から実行することが確認できます。我々が完璧なカプセル化でプロジェクトを作成しました。でもunitテストのために途中で関数がしっかり作動しているかをテストする場合もあります。祖の場合、reflectionを利用してtestclassを作成してクラスのunitテストをするとソースの修正なしでテストクラスを作成することも可能です。そしてstaticとパラメータがある関数にもアクセスが可能です。上の例はnodeク

Study / C#

#C#

作成日付 : 2021/10/14 18:34:21       修正日付 : 2021/10/14 18:34:54

56

こんにちは。明月です。この投稿はc#でreflection機能を使い方 - classに関する説明です。reflection機能とはインスタンスを動的で割り当てするか関数やフィールドおよび属性を動的に呼び出せる機能だという説明になっています。link - https://docs.microsoft.com/この説明は難しいですね。インスタンスを動的で割り当てするというのは我々がクラスのインスタンスを生成する時には普通はnewというキーワードを使います。クラスのインスタンスは基本的にnewを利用して生成するというのは、以前に十分に説明しました。link - [c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)インスタンスを生成する時、ソースにnew nodeという作成します。reflectionにはこれを静的の表現と言います。つまり、データや分岐により他のインスタンスを生成したいならifを使ってソースを作成しなければならないです。上の例をみればtypeという任意のデータを置いてnode1ならnode1のインスタンスを生成してその以外にはnode2のインスタンスを生成します。でも、ここで仕様によりnode3のクラスが生成したら? ifを分岐してインスタンス生成する区間を作ることになります。もちろん、クラスをもっと生成するとmain関数がずっと修正が必要になります。このように作成するとクラスが生成してもtype.gettypeのstring値によりインスタンス生成します。また、我々がクラスのコンストラクタをprivateで生成することができます。コンストラクタをprivateで設定をすればnewでインスタンスを生成することができません。コンストラクタが内部だけ生成することに設定したからです。代表的にシングルトンパターンがあります。link - [design pattern] 1-1. シングルトンパターン(singleton pattern)でも、reflectionを使ったらコンストラクタをprivateに設定されてもインスタンス生成が可能です。getparameters関数を使ってコンストラクタの種類を取得してlinqのwhereでパラメータがないコンストラクタを一つ取得します。取得すればinvoke関数を使ってインスタンスを生成します

Study / C#

作成日付 : 2021/10/13 18:34:13       修正日付 : 2021/10/13 18:34:13

57

こんにちは。明月です。この投稿はc#のoperator(演算子)のオーバーロードを使い方に関する説明です。c#でoperator(演算子)とは足す(+)、引く(-)の記号です。link - [c#] 6. 演算子どのプログラムを学んでも始めにみることは演算子じゃないかと思います。そしてオーバーロード(overrode)の意味はプログラムで再定義という意味です。link - [c#] 13. クラスの継承と再定義(override)する方法、overrideとnewの差異つまり、operator(演算子)オーバーロードというのは演算子を再定義という意味です。すなわち、我々が使っている足す(+)や引く(-)を単純に数字演算だけではなく、別の処理で再定義することができる意味です。上の例が演算子の再定義です。既存の定数タイプ(int)と実数タイプ(float)には足す(+)や引く(-)を入れたら四則演算になりますが、クラスには上みたいに再定義して使ったらコードステップを減らす効果があります。この演算記号はすべて記号が再定義することではありません。link - https://docs.microsoft.com/ 演算子 説明 +x, -x, !x, ~x, ++, --, true, false パラメータが一つの演算子として、再定義が可能です。ここでtrue、falseは二つを同時に定義しなければならないoperatorとしてboolタイプで暗黙的型変換で可能な再定義です。 x + y, x - y, x * y, x / y, x % y, x & y, x | y, x ^ y, x << y, x >> y, x == y, x != y, x < y, x > y, x <= y, x >= y パラメータが二つの演算子として、再定義が可能です。 x && y

Study / C#

#C#

作成日付 : 2021/10/12 18:28:42       修正日付 : 2021/10/12 18:28:42

58

こんにちは。明月です。この投稿はienumerableとienumerator、そしてyieldキーワードに関する説明です。以前に私がlinq式を説明しながらienumerableに関して簡単に説明したことがあります。link - [c#] 32. ジェネリックタイプ(generic type)を使い方ienumerableのインタフェースは繰り返しパターンと関係あるパターンですが、我々がよく使う繰り返しキーワードforeachで使っているインターフェースです。link - 作成中ienumerableのインタフェースはgetenumerator関数が定義されているし、ienumeratorタイプで返却することになっています。そしてienumeratorの場合はforeachで使っているパターンの動作インターフェースとして、現在値に関するプロパティのcurrent、ポイント移動と値が存在するかを確認する関数のmovenext、そしてポインタの位置を初期化する関数resetになっています。foeachの繰り返しキーワードはienumerableのインスタンスを継承したクラスの値を使えます。 我々が普通にlistやarrayをforeachに入れて使いますが、このクラスがienumerableのインスタンスを継承したことと同じ意味です。ienumerableのインタフェースはgetenumerator関数が定義されているし、ienumeratorのインタフェースを継承したインスタンスをリターンします。ienumeratorのインタフェースにはforeachで使うならreset関数を呼び出してポインタを初期化してforeachで次のポインタに移動する時にmovenextの関数を呼び出して、itemでデータを取得する時にはcurrentプロパティを使います。ここで少し変なコードが見えますが、movenext関数が先に呼び出してcurrentのプロパティからデータを取得します。movenextの返却値は現在の値がnullかどうかに関するチェックだし、ポイントを移動しなければならないです。currentは現在の値を取得することなのでcurrentではpos - 1で値をリターンするし、movenext関数では現在ポインタの現在のポインタに関するnullチェックでpos >= data.lengtのことで

Study / C#

#C#

作成日付 : 2021/10/11 19:49:33       修正日付 : 2021/10/11 19:50:10

59

こんにちは。明月です。この投稿はc#でnugetを使い方(外部ライブラリ)とデータベース(mariadb(mysql))を使い方、そしてトランザクション(transaction)に関する説明です。c#が言語的で利点だと思う部分は.net framework中で基本的なライブラリがすごく多く含めています。その以外にもvisual studioのideツールもすごく便利だし、同じ製品系(ms製品系)に関しても互換性がすごくいい利点があります。でも、多いライブラリを含めていると思っても、実際に使ってされるすべてのライブラリを持っていることではありません。例えば、基本的にc#ではmssqlデータベースに関する接続ライブラリを持っています。別に外部ライブラリが必要ありません。なので別の種類のデータベースのライブラリは.net frameworkでありません。つまり、c#を使ったらmssqlを使うことをお勧めすることです。でも、仕様により、あるいは様々な理由で開発言語はc#で開発してもデータベースはoracle(오라클)やmysql(mariadb)を使わなければならない場合もあります。そうなら外部ライブラリを使わなければならないですが、mariadbホームページに接続するとc#ライブラリファイルがあります。link - mariadb net-connectorsこのようにライブラリをダウンロードしてプロジェクトに連結して使ってもよいですが、このようにするとバージョン管理や配布(deploy)や他人とプロジェクトを共有する時、ライブラリ管理などの問題が発生します。そのため、プロジェクトのライブラリ管理ツールがありますが、javaにはmavenがあるみたいにc#にはnugetがあります。nugetはvisual studioがインストールされていると別途にインストールする必要はありません。プロジェクトでreferencesの項目でマウスの右クリックしてcontextメニューをみればmanage nuget項目があります。browseタブで検索すればインストールができるライブラリが表示されます。我々はmariadbを使っているのでmysql.data ライブラリをクリックしてversionを確認してinstallボタンを押下します。そうなら規約が表示されるし、acceptを押下してインストールを開始します。そして、re

Study / C#

#C#

作成日付 : 2021/10/08 18:58:57       修正日付 : 2021/10/08 19:00:07

60

こんにちは。明月です。この投稿はwindowにmariadbをインストールする方法に関する説明です。我々がプロジェクトを設計してプログラムを作成して一番よく使うプログラムがデータベースです。データベースの種類はすごく多いですが、その中で無料だし、性能が良いrdbmsプログラムのmariadbをインストールしましょう。以前の投稿でcentos(linux)環境でインストールしたことがあります。link - [centos] mariadb(mysql)をインストールwindow環境にはlinux環境ほど、複雑ではありません。ただ、インストールファイルをダウンロードしてインストールしたら良いです。link - https://go.mariadb.com/download-mariadb-server-community.htmlウェブページに接続すると名前と職業などの基本情報を入力しますが、正確に入力する必要なしで、簡単に作成してダウンロードしたら良いです。そうするとosのバージョンを選択する画面が出ますが、我々はwindow環境でインストールするので、window 64を選択してダウンロードしましょう。ダウンロードが完了すると下記とおりにインストールファイルができます。インストールファイルをダブルクリックして実行しましょう。ライセンスを同意選択をしましょう。インストールするドライブを選択しましょう。次はrootの基本初期パスワードを設定します。そしてservices.mscに表示するサービス名とポート設定ですが、特に設定することではなければdefaultで設定してnextボタンを押下します。mariadbはオープンソースなので、使用するところでフィードバックが必要ですね。私はチェックボックスを選択せずにnextボタンを押下しました。これからインストールが始まります。インストールが完了するとウィンドウメニューでmariadbフォルダが作成されました。この中でmysql clientをクリックして接続します。そしてmysqlデータベースに接続してuser情報を確認します。そしてユーザを一つ生成して権限を与えます。これからsql queryの探索機を利用して接続してみましょう。私はdbeaverというクエリ探索機を使います。link - [tools] dbeaver(無料sql queryブラウザツール)プロ

Devlopment note / Window

#mariaDB,#window

作成日付 : 2021/10/08 18:56:05       修正日付 : 2021/10/08 18:56:05

61

こんにちは。明月です。この投稿はc#でデータベース(mssql)に接続する方法に関する説明です。我々がプログラムを作成すればデータを格納する場合が多いですが、ioを利用するファイルで格納する方法やsocketサーバを利用して他のpcやプログラムを利用して格納する方法などの様々な方法があります。でも、データを格納する方法で一番しやすいし、検索やフィルターする方法でデータベースを利用する方法があります。データベースの種類はすごく多いですが、その中でoracle(オラクル)、mssql(sql-server)、mysqlあるいはmariadbがよく使うデータベースです。その中でmssqlはms(microsoft)社で提供するデータベースだし、c#もms(microsoft)社で提供するプログラム言語なのでc#では他のデータベースよりmssqlが扱いしやすいです。扱いしやすいより別途のライブラリがなくても使えるデータベースです。まず、データベースを接続するためにはデータベースをインストールしなければならないですが、それは別途の投稿で説明します。link - 予定データベースがインストールされたら簡単なテーブルを作成してc#プログラムで検索してみましょう。上の例みたいにデータベースでテーブルを作成して簡単なデータを入力しました。このデータを利用してc#プログラムでデータを取得しましょう。上の例をみればデータベースにあるtestのテーブルのデータを読み込んでコンソールに出力しました。sqlcommandクラスのインスタンスを生成してコネクションを作ってexecutereaderの関数を実行してデータを読み込みました。そしてexecutereaderの関数のリターン値はsqldatareaderのインスタンスだし、sqldatareaderのread関数を利用してデータを読み込みました。上の例ではdeleteとinsertをしてデータを削除と追加しました。そして関数はexecutereaderの関数ではなく、executenonqueryの関数を使って実行しました。なぜならdeleteとinsertは検索の結果を取得することではなく、実行だけが重要だからです。上の方法は連結指向タイプのデータベース接続だといいます。つまり、データベースからデータを一括に取得することではなく、read()関数を通って一つ一つに取得するこ

Study / C#

#C#

作成日付 : 2021/10/07 18:39:58       修正日付 : 2021/10/07 22:27:12

62

こんにちは。明月です。この投稿はc#でネットワークソケット通信(socket)を使い方に関する説明です。プログラムとプログラム、そしてパソコンとパソコンでデータを送受信することを通信と言います。通信をもっと詳しく説明すると、伝送するパケット(データ)がパソコンのlanカードによってランケーブルに伝送します。ランケーブルに伝送したデータはdnsとルータなどを通って到達しようとpcのlanカードによって最終に目標したプログラムでパケット(データ)を読み込みます。端末と端末の間にデータを通信します。この時、我々は各端末間にデータ変換や装置間のプロトコール、規約などに関して実装してないです。この通信規約に関してはすべてos側で設定して(osi7階層)、我々はその上で差し込んで使うという意味でsocket通信という言います。link - osi参照モデルsocket通信規約は規則が決めています。 통신 규약은 규칙이 정해져 있습니다.先に通信を待つ側のpcをサーバというし、portを開いてクライアントの接続を待ちます。そして接続する側をクライアントと言うし、サーバのipとportに接続して通信が繋がります。サーバとクライアント間の通信はsend、 receiveのタイプでデータを送受信します。そして通信が終わったらclose関数で接続を切ります。この規約を利用してc#でソケット通信を作成してみましょう。先にserverを作成してwindowのtelnetプログラムを利用して接続を確認し、そして仕様に合わせてclientを作成します。上の内容はウィンドウtelnetプログラムで私が作ったサーバプログラムに接続する例を作成しました。先にプログラムを説明すればsocketクラスでサーバのsocketサーバのインスタンスを生成しました。bind関数を使って待機ポートを設定します。listenで同時接続待機設定をしてaccept関数を通ってクライアントの接続を待機します。プログラム上ではaccept関数が呼び出したらclient接続が発生する時までプロセスが止まることになります。そしてtelnetプログラムで接続をすることになればaccept関数を通ってクライアントsocketインスタンスをリターンするし、sendとreceive関数を通ってサーバとクライアントからお互いにメッセージを送受信することができます。上の例は私が

Study / C#

#C#

作成日付 : 2021/10/06 19:06:25       修正日付 : 2021/10/06 20:07:44

63

こんにちは。明月です。この投稿はc#でファイル(fileinfo)とディレクトリ(directoryinfo)を扱いに関する説明です。以前の投稿でioを通ってファイルを作成して読み込む方法に関して説明しました。link - [c#] 42. ファイルを扱い(io)とファイルメタデータ(fileinfo)を使い方今度はファイルを作成して読み込みより、ディレクトリとファイルのメタデータを利用してディレクトリとファイルに関する情報を取得して探索する方法に関して説明します。fileinfoクラスはファイルに関するメタデータ、つまり、ファイルのパス、サイズ、作成日時、修正日時に関する情報があります。ディレクトリは実際にバイナリデータで存在することではなく、osで管理するメタデータです。fileinfoとみたいにdirectoryinfoがありますが、ディレクトリ(フォルダ)に関する情報があります。ファイルのメタファイルみたいにディレクトリのメタ情報を取得することができます。directoryinfoにはfileinfoと違い、ディレクトリを追加、削除があります。ファイル生成は当該なファイルに関するバイナリデータが必要ですが、ディレクトリの場合はメタデータ追加、削除だけで扱えるからです。ディレクトリが追加されました。ディレクトリが削除されました。そしてfileinfoとdirectoryinfoの場合はインスタンスを生成して使わなければならないですが、毎度、メタデータを使うためにインスタンスを生成することには気になります。それでstaticクラスでもメタデータを取得することができます。existsの関数はfileinfoとdirectoryinfoにもある関数ですが、fileとdirectoryのstaticクラスにもメタデータを使えます。このfileとdirectoryクラスで単純にファイルとディレクトリのメタ情報を取得するクラスですが、探索アルゴリズムを利用して作成すれば簡単なファイル探索プログラムを作成することができます。上の例でディレクトリからサブディレクトリを呼び出す時にはディレクトリ探索する再帰関数を通ってサブディレクトリとサブファイルを探索します。再帰関数というのはstack interruptが掛ける作業なので、性能が遅くなるし、overflow可能性もあるので、効率性が悪いですが、ソースがすごく見や

Study / C#

#C#

作成日付 : 2021/10/05 19:29:34       修正日付 : 2021/10/05 19:29:34

64

こんにちは。明月です。この投稿はc#でストリーム(stream)とバイナリ(byte[])、エンコード(encoding)、そしてusingを使い方とidisposableインターフェースに関する説明です。以前の投稿でファイルを扱い(io)に関して説明しました。link - [c#] 42. ファイルを扱い(io)とファイルメタデータ(fileinfo)を使い方ここでstringデータをファイルに作成する時、encodingを使ってbyte[]配列に変換してファイルを作成するし、ファイルの内容を読み込む時にはbyte[]配列で読み込んでencodingを使ってstringに変換してコンソールに出力することまで例で説明しました。我々がファイルを読み込んで作成する時、filestreamというクラスを使ってファイルを作成するし読み込みました。まず、streamに関する説明ですが、ストリームとは一連のデータ配列という意味です。つまり、一つのデータ値では意味がなく、データの集合あるいは配列が一つのデータとして意味になるという意味です。我々がstringのデータをbyteに変換したので、utf-8の変換により英語文字の一つが一つの値で配列に格納されていますが、もし英語ではなく日本語ならどのぐらいのバイトになるでしょう?上の例で最後の0x2e(46)はasciiコードのピリオドです。その以外の15バイトは日本語です。つまり、ひらがなの一文字で3バイトのサイズを持っています。この「こ」になるデータは「e3 81 93」ですが、ここで一つのbyteは値は意味がありません。データの意味を持つためには3byteが合わせて、stringに「こ」というデータに認識することです。これがストリームということです。一つのデータを表現するためには一連の値を配列で表すことです。ここで説明しやすくするためにstringのデータで説明しましたが、プログラムでは使ってるリソースはイメージや動画などのデータのファイルなどがあります。そのデータはすべてバイトになっています。つまり、このデータは一つのbyteの値では意味がありませんが、byteの値が一連の配列になるとイメージや動画になることです。これをストリームと言います。例えば、我々がイメージプログラムでイメージをモニターに出力するため、約束したbyteの集合(規約)、データストリームが必要という

Study / C#

#C#

作成日付 : 2021/10/04 18:33:04       修正日付 : 2021/10/04 18:34:18

65

こんにちは。明月です。この投稿はc#でファイルを扱い(io)とファイルメタデータ(fileinfo)を使い方に関する説明です。プログラムで使う代表的な装置リソースならファイル扱い(ファイルで書込、読取、io)と通信ソケット(socket)があります。このファイル扱いは英語の略語でioといいますが、ioはinput ouputで入出力という意味です。入出力装置ならマウス、キーボード、モニターなどがありますが、プログラムでioといいならファイルを扱うリソースだと思えば良いです。我々がプログラムを使う時にプログラムを終了すればメモリに格納したデータはすべてなくなります。そのために、プログラムでデータを保管する方法の一つでファイルで格納する方法があります。ファイルはbyteタイプで構成されているし、プログラムではunsigned char(byte)で構成します。私はdドライブでworkというフォルダでtest.txtというファイルを作成しました。内容はhello worldで正確にスペースまで11バイトを生成します。結果をみればファイルサイズが11バイトで生成されたことを確認できます。ファイルをtxtファイルで作成し、stringデータをencodingを通ってbyteタイプに変換しました。そのため、メモ帳で該当のファイルを開くとhello worldの内容が作成されたことを確認できます。そして、最終的にリソースを使った後にはclose関数で閉めなければならないです。今回はファイルのデータを読み込んでコンソールに表示しましょう。上はファイルを読み取ってコンソール出力する例です。ファイルメタデータでファイルの情報を読み取ってファイルサイズ程にbyte配列を生成します。そしてstreamで読み取ってstringに変換しました。変換した内容をまたコンソールに表示するとhello worldが表示されます。ここのencodingとバイナリ(byte[])に関しては別の投稿で詳細に説明します。先、filestreamに関して始めのパラメータは対象ファイルのパス、ファイルモード、ファイルアクセス権限設定でストリームを生成します。ファイルモードではcreate、open、write、createnew、appendを使ったらcreateはファイルを生成する(既存ファイルがあれば上書き)、createnewもファイル生成します

Study / C#

#C#

作成日付 : 2021/10/01 20:10:21       修正日付 : 2021/10/04 18:33:35

66

こんにちは。明月です。この投稿はtaskクラスとasync、awaitを使い方に関する説明です。以前の投稿でthreadに関して説明したことがあります。link - [c#] 37. スレッド(thread)を使い方、thread.sleep関数を使い方スレッドとは並列処理だということを何度も説明したので、この投稿では省略します。threadを生成する時にシステムのリソースを使って逆にthreadが多すぎるならシステムの性能が落ちます。そのためスレッドプールに生成してスレッドの個数制限、スレッドのリソースを再活用してシステムの性能を改善することができます。でも、スレッドプールはスレッドのステータスを制御することができないので、スレッドが終了する時まで待つ(join)機能を実装しなければならない不便があります。taskはthreadpool中で動くスレッドだし、threadみたいに簡単に生成してjoin機能まで使える機能があります。上の結果をみれば先にthreadpoolで設定したスレッド制限設定がtaskで宣言したスレッドにも影響されることを確認できます。つまり、実装はthreadみたいに簡単に使えますが、内容はthreadpoolで動くことを確認できます。そしてthreadpoolと違い、return値を受け取ることができて1から5まで足すと15、スレッドが5個なので総合の75の結果が出ることを確認できます。lockを使えなくても各スレッドで結果の値を受け取ってメインプロセスでスレッドの値を受け取って使えます。そしてtaskの別の機能はasync、awaitキーワードと密接な関係があります。始めの例と結果は同じですが、taskをもっと扱いやすく実装されています。asyncが宣言された関数でtaskを生成して実行し、awaitでスレッドが終了するまで待機します。そして結果をリターンするならmainプロセスで結果を合算して結果が出ることを確認できます。ここまでtaskとasync、awaitの基本構造です。taskでcontinuewithの関数を提供しますが、これは各スレッドが終了すれば続けて処理するラムダ処理です。状況により他のtaskスレッドを付けることもできるし、様々な実行を連結して実行できる関数です。taskは.net framework 4.0から追加された機能なので、もし以前のプレームワークな

Study / C#

#C#

作成日付 : 2021/10/01 18:59:14       修正日付 : 2021/10/01 18:59:14

67

こんにちは。明月です。この投稿はwebのfull calendar(スケジュールカレンダー)の使い方法に関する説明です。我々がwebプログラミングを作成したら普通はyahooみたいなポータルサイトより会社や様々なグループなどで使うコミュニティサイトやスケジュール管理サイトを作成することが多いと思います。そのプロジェクトの中で一番よく使うプレームワークライブラリはwysiwygエディタでウェブ環境でメモ帳みたいに使うエディタ機能だと思います。その以外は多分スケジュール管理するカレンダープレームワークではないかと思います。カレンダープレームワークに関しても様々なプレームワークがありますが、個人的にfull-calendarというライブラリが一番使いやすいではないかと紹介しようと思います。リンク - https://fullcalendar.io/一応fullcalendarを使うために該当なjavascriptとスタイルシート(css)をダウンロードして使ってもよいですが、ウェブ環境の性能のため、cdnリンクを使うほうをお勧めします。ダウンロードリンク - https://fullcalendar.io/docs/initialize-globalscdnリンク - https://www.jsdelivr.com/package/npm/fullcalendar .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; } (function(){$(function(){ var calendarel = $('#calendar')[0]; var calendar = new fullcalendar.calendar(calendarel, { height: &

Open source / Javascript, Jquery, CSS

#fullcalendar

作成日付 : 2021/07/15 21:35:36       修正日付 : 2021/07/15 21:40:55

68

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

Study / Java

#java

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

69

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

Study / Java

java

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

70

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

Study / Java

java

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

71

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

Study / Java

Java

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

72

こんにちは。明月です。この投稿はデザインパターンのファクトリーメソッドパターン(factory method pattern)に関する説明です。以前の投稿でビルダーパターンに関して説明しました。link - [design pattern] 1-2. ビルダーパターン(builder pattern)ビルダーパターンは簡単に説明するとbuilderクラスとdirectorクラスの組み合いで一つのインスタンスを生成する生成パターンです。このファクトリーメソッドパターンもビルダーパターンと同じ生成パターンの一つで、インスタンスを生成するパターンです。このファクトリーメソッドパターンはメソッドのパラメータにより生成されるインスタンスを変わる形のパターンです。reference - https://en.wikipedia.org/wiki/factory_method_pattern上の例をみればfactory関数のパラメータの値によりnode1クラスのインスタンスを生成するかnode2クラスのインスタンスを生成することが決めます。ビルダーパターンと比べたらすごく簡単な構造です。javaの例ではパラメータの値をstringで受けます。つまり、stringデータによりインスタンスを生成することができます。こんなことになると実際のプロジェクトにはデータベースやユーザから受ける値により生成するインスタンスを変わって実行するロジックを選択することができます。そしてファクトリーメソッドにはリターンするタイプを一つ種類のタイプに統一しなければならないのでinterfaceを使いました。上の例はstringタイプではなく、列挙型の値によりインスタンスを生成しました。stringタイプを使うことはもし、string値にタイプミスがある場合、デバッグ段階でエラーをチェックしないので、バグが発生する可能性があります。でも、列挙型でパラメータを設定すればバグが発生する可能性は少しなくすことができます。ファクトリーメソッドパターンは普通はシングルトンパターンと組み合いしてよく使います。なので、entityタイプのデータクラスよりcontrollerみたいに処理クラスによく使います。上の例はnode1クラスとnode2クラスにあるコンストラクタをprivateに設定してgetinstance関数でインスタンスを取得する形のシングルトンパ

Study / Design pattern

Factory method pattern

作成日付 : 2021/06/23 19:45:37       修正日付 : 2021/06/23 19:46:01

73

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

Devlopment note / Java

java

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

74

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

Devlopment note / Java

java

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

75

こんにちは。明月です。この投稿はデザインパターンのビルダーパターン(builder pattern)に関する説明です。ビルダーパターンとは我々が普通にクラスのインスタンスを生成する時にnewキーワードを使った生成しますが、その方法ではなく、他のクラスを利用してインスタンスを生成するパターンだといいます。そしてインスタンス中でデータを入力するし、そのついて処理関数などを呼び出してクラスのデータを処理する方法です。仕様によって違いますが、クラスの目的があり、初期値及びデータはどのぐらい決まっているし特定なパターンによりクラスのデータを入力する方法で使います。実行関数及びロジック関数でクラスの初期値を入力する方もありますが、その方法は不便なこともあるし、ソース読みにくいです。上のソースが間違っているかエラーが発生するか、パフォーマンスが悪いソースではありません。でも、nodeクラスのインスタンスを生成してメンバー変数にデータを格納する形が少しコードが汚いらしいです。もし、nodeクラスで使う変数が多い状況や、クラスのインスタンスを生成するために処理が多い場合(パラメータデータを作成するための処理)にはそのほどソースの可読性が悪くなります。そうなら、コンストラクタでnodeクラスに必要なパラメータデータを渡したらいいではないかと思いますが、インスタンスを生成して変数値を格納する構造と別に変数を生成して入力してコンストラクタパラメータで渡す構造と結局同じ構造になります。そうならすこしソースを減らすような方法でnode1とnode2の共通インターフェースを作って関数などを通ってインスタンスを生成して受け取ったらソースステップを減らすこともできるし可読性を高められます。上のソースはbuild関数を使ってクラスインスタンスを生成しました。そして始めのパラメータを通ってクラスを区分してインスタンスを生成しました。ロジック流れだけみれば上の例もビルダーパターン(builder pattern)です。でも、build関数をみれば変数設定のために強制キャストしてデータを入力しました。結局、初めの例と差異がありません。正確にビルダーパターン(builder pattern)を実装するためにはパラメータ役のbuilderクラスとbuildを実行するdirectorクラスを通ってデータを設定して最終結果のnodeクラスを受け取ることが

Study / Design pattern

design pattern

作成日付 : 2021/06/11 19:06:28       修正日付 : 2021/06/11 19:07:16

76

こんにちは。明月です。この投稿はデザインパターンのシングルトンパターン(singleton pattern)に関する説明です。シングルトンパターンはデザインパターンの中で一番有名なパターンです。デザインパターンを聞いたことがなくてもシングルトンパターン(singleton pattern)を聞いたことがあるほど有名なパターンです。シングルトンパターンはクラスのインスタンスをプログラム実行中で一回だけ生成して続けて再使用するパターンです。利点ではクラスのデータを変わらずにずっと使うかすべてのオブジェクトからデータを共有しなければならない状況で使います。c/c++例から確認しましょう。シングルトンの特性はコンストラクタをprivateに設定することが重要です。コンストラクタをprivateに設定するとクラス外部からインスタンス生成をできません。そしてクラスのインスタンスはプログラムが終了する時まで保持しなければならないので、staticで宣言してクラス内部で管理します。また、static関数(getinstance())でクラスのインスタンスを生成してsingleton変数に管理すればインスタンスを一回生成して再使用するシングルトンが作られます。上の結果をみればnode1とnode2のメモリアドレスが同じです。つまり、node::getinstance()でインスタンスを取得すれば同じクラスが返却します。javaのシングルトンパターンもコンストラクタをprivateに設定してクラスインスタンスをもっている変数をprivate staticで宣言します。つまり、プログラムが終了する時まで変数のインスタンスが保持されます。javaのhashcodeを出力値をみれば同じ値が出力することを確認できます。つまり、同じクラスという意味です。c#にもコンストラクタをprivateに設定してgetinstance()関数を利用してインスタンスを取得します。結果も同じhashcodeが出力することで同じクラスインスタンスということを確認できます。シングルトンパターンは普通リソースを扱うクラスでよく使います。例えば、file ioや通信socketクラスと共に使います。なぜなら一つのfileを読み込んで書き込むクラスを様々なインスタンスで生成して接続すればconnection errorが発生します。ログシステムがその例です。ロ

Study / Design pattern

作成日付 : 2021/06/09 19:40:05       修正日付 : 2021/06/09 19:41:09

77

こんにちは。明月です。この投稿はデザインパターンの紹介に関する説明です。デザインパターンとは英語でdesignですが、我々が考える画面デザインという意味ではなく、設計の意味です。つまり、設計パターンということです。始めにこのデザインパターンを提案する人はgofと呼ばれる四人のパソコン科学者です。私のけ願書で勉強したことではなく、翻訳書や解説書で勉強したのでgofに関して詳しく説明ができません。とにかく、その四人がプログラムコードを作成する方法でどうすれば効率的なコードパターンを設計できるか、実際の業務からプログラムに作成する時に綺麗に解析できるパターンを纏めておいたことです。でも、今はこのデザインパターンは効率的な設計パターンとしても重要ですが、開発者(デベロッパー)の間の暗黙的なコードルールもあります。例として私の経験を話します。私が大学校を通う時、つまり役10年前にはデザインパターンを軽く勉強したことがあります。その時にはオブジェクト指向プログラミング(oop)を完全に理解できない状況で勉強しようと思ったので理解もよくできませんでした。また、先輩からもデザインパターンはプログラムを勉強することで邪魔だと聞いたことがあるので重要だと思っていませんでした。その状況で卒業して実務経験で3~4年の時に実力が停滞期が来ました。その時に設計実力も伸びないし勉強しても、毎回の基礎研究に大変でした。それで始まったことはopen source projectに参加することでした。オープンソースプロジェクトに参加してショックをたくさん貰いました。その時にプログラム開発に関して自身もあったし勉強も十分だと思いましたが、オープンソースが全然理解できませんでした。同然、理解ができないから参加も上手くできないし、時々に理解できる部分があって修正して要請(request)してもいつも断り(decline)でした。個人的にすごくスランプが来た時でした。その状況でいつも断り(decline)だけ貰って、勇気を出してなぜ断り(decline)ですかと聞きました。返事はコーディング規約も合わないし、パターン式で解決しなければならないので、単純コーディングアルゴリズムで解決しようとするから他のバグが発生する可能があると答えを貰いました。今、考えてもすごくショックですが、その後からプログラムプロジェクト工程や設計テクニック、標準規約などがなぜ

Study / Design pattern

Design pattern

作成日付 : 2021/06/08 20:42:36       修正日付 : 2021/06/08 20:42:36

78

こんにちは。明月です。この投稿はdbeaver(無料sql queryブラウザツール)に関する説明です。私が今までsql queryブラウザで「これが良い!」と思うブラウザがありません。mssql(sql-server)はsql managementというブラウザがあり、様々な機能がありますが、mssql(sql-server)専用です。mariadbやoracleにも使えません。oracleの場合はsql developerがありますが、使いにくいです。その以外にa5m2というブラウザもがありますが、自分が使う時に様々のバグがあり、信用性が低かったんです。他のことではwindowだけではなく、ubuntuやlinuxosで使うユーザもいますが、上のツールは使えません。上の問題をすべて解決しているツールがdbeaverというツールがあります。ホームページ - https://dbeaver.io/ツールの開発した言語はjavaみたいでツールの雰囲気はeclipseと似てます。そしてcommunityバージョンとenterpriseバージョンがありますが、enterpriseバージョンは有料です。communityバージョンが無料ですが、私の基準ではcommunityバージョンだけでも使うことで不便がありませんでした。dbeaverで接続できるデータベースは上のイメージみたいです。私も世界にあるデータベースがそんなに多いか知らなかったです。dbeaverツールでは様々な機能もありますが、erd機能もありますね。erd機能とはデータベースを関係図を人が見やすく表すための機能です。その以外にパフォーマンステストやチューニングする機能もあります。私もまだすべての機能は分かりませんが、os関係ずにwindowやlinux、macで使えることが良いじゃはないかと思います。なので特定なsqlだけ使うことではなく、汎用性が良いし、パフォーマンスや信用性が優秀なプログラムでdbeaverというブラウザがあります。ここまでdbeaver(無料sql queryブラウザツール)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Open source / Tools

#Dbeaver

作成日付 : 2021/04/28 18:26:49       修正日付 : 2021/04/28 18:26:49

79

こんにちは。明月です。この投稿はbootstrapライブラリに関する説明です。10年前か15年前だけでもwebサービスのプロジェクトをする時にチーム構成はpm(プロジェクトマネージャー)、デザイナー、開発者で作業しました。開発者がhtmlの基本標準オブジェクトでプログラムデザインをできないことではないですが、基本オブジェクトで作成すればプログラムが何か足りない感じがたくさんあります。その時にはhtml 5の標準を発表する前なのでcssデザインすることも限界がありました。なのでウェブデザイナーがphotoshopツールでデザイン作業後のイメージを割ってウェブデザインしたと覚えがあります。今の状況で考えたら、そのイメージファイルのトラフィックをどのように処理したか疑問です。とにかくその時の後にhtml 5が発表してcss 3.0が出現しました。イメージを割ってwebページ作ることがだんだんなくなって、cssでデザイン作業することになりました。その時もcssの作業はほぼデザイナーが任せて作業しました。人によって違うと思いますが私の場合はたくさん努力してもデザイナーみたいに作ることができないです。多分、デザイン感覚がないと思います。そのため、大きいプログラムプロジェクトを運用する時にデザインと開発者の役割が出来るし、開発者は工程の概念を知りますが、デザイナーは工程の概念を知らない方も結構います。なのでプロジェクトスケジュール調整が簡単にできない時が結構あります。例えば、ある会社のホームページのメインページを修正する時、デザインポートフォリオが作成して、デザインの承認を受けて、部分修正やイメージを割る作業してcss作成するし...私の経験には、設計が終わって、デザイン作業が終わるまでずっと待ってた時もあります。デザインは開発と領域が違うので早めに焦ることもできないし、様々で大変だった時があります。多分、自分の考えはこの部分の差異があるので、mvc工程のモデルが出来たと思います。時間は決めてるが、デザインの領域を抜いてcontrollerやdbを先に作業すること?私の経験で10年前までの状況がそうでした。そうするうちにbootstrapライブラリを認知して初めに使ったことが約2013年ぐらいです。始めは驚きました。デザイナーがいなくてもhtmlオブジェクトのclass設定だけで綺麗なデザインを作成することが可能し、モ

Open source / Bootstrap

#bootstrap

作成日付 : 2020/07/30 19:06:36       修正日付 : 2020/07/30 19:06:36

80

こんにちは。明月です。この投稿はpythonでメール(smtplib)を送信する方法に関する説明です。プログラムのプロジェクト中でメール発送することに関するプログラム作成がすごくあると思います。例えば、ウェブサービスで会員加入認証やパスワード再設定、様々なアラムオプション、お知らせなどがあると思います。ウェブサービスではなくてもローカルでは大量広告メール(spam)もあるし、スケジュールアラムもあります。そのため、どんなプログラムでもメールに関するモジュールは大事だと思います。pythonでメールライブラリを使うためにはメールプロトコールに関しても少し知らなければならないです。メールプロトコールはsmtp(simple mail transfer protocol)を使いますが、これがテルネット方式になっているしhelo、mail、rcpt、dataのコマンドで通信します。私の説明よりウィキによく説明されているのでご参考をお願いします。link - https://ja.wikipedia.org/wiki/pythonでメールを発送する前にメールサーバー設定が必要です。google mail - https://support.google.com/私の場合はgoogleのメールをよく使います。先にクロムに接続して右上のアカウントの管理に行きます。アカウント管理に移動して安全性の低いアプリのアクセスのタブに移動します。安全性の低いアプリの許可を有効にします。このチェックをしないと外部からグーグルメールを使用できないようにすることです。なので、idやpwの漏れがなければそんなに問題はありません。pythonでソースを作成してメールを発送しましょう。作成が終わったら実行しましょう。実行すれば上みたいにバウンダリーが作成されたことを確認できます。メールがよく発送されたことを確認できます。link - https://docs.python.org/3/library/smtplib.htmllink - https://docs.python.org/3.4/library/email-examples.htmllink - https://stackoverflow.com/questions/17759860/ここまでpythonでメール(smtplib)を送信する方法に関する説明でした。ご不明なところや

Devlopment note / Python

#python,#smtplib,#mail

作成日付 : 2020/07/27 18:38:43       修正日付 : 2020/07/27 18:38:43

81

こんにちは。明月です。この投稿はpythonでhttpconnection(requestsモジュール)でウェブサーバーで接続する方法に関する説明です。ウェブサーバーとブラウザの通信は要請、応答構造でなっています。要請はホストアドレスを含めてページを要請することだし、応答は要請に対して応答メッセージ(ヘッダー)とhtmlをブラウザに送信することです。ウェブページはブラウザでjavascriptが実行してcss styleに合わせて画面に見えることですが、ブラウザのレンダリングの役割です。サーバーとブラウザの間の通信はstring(byte[])タイプで送受信することだけです。ローカルにphpで簡単な例のソースを作成し、pythonでrequest要請して、応答を受けましょう。pythonでウェブサーバーを接続することを簡単です。requestのモジュールからセッションを受け取ります。後、そのセッションでlocalhostを要請して応答する結果を受け取ります。応答結果はheadersとtext、contentが一番重要なデータです。textの結果をみれば、paramのキーでquery string testを送ったので、上のphpソースの結果通りget - query string testの結果が出ました。今回はpostタイプでsession値を入れてgetタイプで値を取得する方法を説明します。pythonではrequestsモジュールを使う時、sessionだけちゃんと管理すれば別にクッキー設定がなくてもセッションの保持が可能です。(c#とjavaと同じ機能があるかどうかしらべなければならないな。)そうすれば応用でウェブサーバからもloginしてデータを取得することができます。requestの関数はpost, getのメソッドがるクラスタイプです。responseは仕様によって様々の関数と変数を使います。下記の表で纏めました。 関数及びプロパティ 説明 apparent_encoding エンコード値に変換 content 応答内容をバイト単位で変換 cookies サーバーから送っ

Devlopment note / Python

#python,#requests

作成日付 : 2020/07/20 14:41:51       修正日付 : 2020/07/20 14:41:51

82

こんにちは。明月です。この投稿はpythonでexcel(openpyxl)を扱う方法に関する説明です。会社で仕事する方なら必須的に知るべきなプログラムはエクセルだと思います。そのためかエクセルライブラリはどのプログラム言語でも存在します。javaとc#ではapache財団で提供するpoiライブラリがありますが、pyhonは独自のライブラリがあります。link - https://openpyxl.readthedocs.io/en/stable/usage.htmlexcelファイルを生成する方法に関して説明します。上の結果はソース上でprint関数を使って結果を出力しました。始めはエクセルを生成してシートの状況を確認する時にリストタイプでsheetがあることを確認できます。workbookを生成すればsheetというシートが自動に生成されます。次はsheetの名を「test1」に変更し、「test2」というシートを使いしました。また、検索すればシートが「test1」、「test2」があることを確認できます。その後、セルに文字タイプのデータを入れました。タイプがgeneralということで出ました。次のセルに日付を格納して'yyyy-mm-dd'のタイプにデータを設定しました。main.pyファイルがあるところでexample1.xlsxファイルが生成されたことを確認できます。test1のシートにはhello worldと日付がフォーマットに合わせて入力されたことを確認できます。test2のシートにはa1の値とa2の値があってsum関数が実行されたことを確認できます。今回はexcelファイルを生成することではなくファイルを読み込んでスタイルまで変更します。(参考にpythonのopenpyxlはxlsタイプのエクセルは参照ができません。)c1からd13までデータを入れればグラフが自動に変更されるエクセルシートを作成しました。上の例はtestexcel.xlsxファイルを読み込んでsheetの値を変更する例です。c列とd列はrandom関数で-20から20までの数を格納します。結果はランダムなので可笑しい気温グラフになります。そしてc列にはfont設定とバックグラウンド色設定、枠設定をしました。枠のside関数の値はcolorの場合、hexデータを入れるし、styleの場合、格のスタイル

Devlopment note / Python

#python,#openpyxl,#excel

作成日付 : 2020/07/16 16:40:31       修正日付 : 2020/07/16 16:40:31

83

こんにちは。明月です。この投稿はpythonでファイル圧縮、解凍(zipfile)する方法に関する説明です。プログラムのプロジェクトを開発する時に圧縮ファイルをよく使います。圧縮ファイルの長所はファイルサイズを減らすこともあるし、複数のファイルを一つのファイルで管理するために使う時もあります。そのため、pythonに圧縮ファイル(zip)を扱うライブラリがありますが、それがzipfileモジュールです。link - https://docs.python.org/3/library/zipfile.htmlまず、zip圧縮ファイルを作成する例です。zipfileでオプションがあります。ioと似ているな概念ですが'r','w','a','x'があります。wとxはファイルを作成するためのオプションですが、wはファイルが存在する場合に削除した後に新しく作成します。xはファイルが存在する場合にfileexistserrorエラーを発生します。aの場合は、存在するファイルに追加のファイルを挿入するか、変更するときに使用されます。rの場合は、zipファイルを読んでオプションです。結果を見れば、apacheのソースを圧縮しましたが、text.txtファイルとtext1.txtを追加されました。上の例は圧縮ファイルを解凍するソースです。まず、zipで必ず解凍しなくてもopenとreadで読み込んでファイルを書き出しができます。参考で上の例ではzipfile.zipfileの関数に圧縮ファイルを入れてstreamタイプのデータを読み込んて処理ができます。socket通信間に圧縮送受信する時、ローカルのディスクに圧縮を解凍しなくても圧縮ファイルのデータを読み込まれます。結果は上のtext.txtファイルとtext1.txtファイルだけ読み込んでコンソール出力しました。結果は「hello world!!」と「hello world string!!」の結果が出ました。pythonではzipfileモジュールでzipファイル内でファイルを別に削除する機能がないです。解凍して、ファイルを除いて再圧縮することですることしかないです。ここまでpythonでファイル圧縮、解凍(zipfile)する方法に関する説明でした。ご不明なところや間違いところがあればコ

Devlopment note / Python

#python,#zipfile

作成日付 : 2020/07/14 19:14:22       修正日付 : 2020/07/14 19:14:22

84

こんにちは。明月です。この投稿はapache cgiでpythonを使う方法に関する説明です。以前に私がpythonを利用してウェブサーバー(http.server)を構築する方法に関して説明したことがあります。link - [python] web serverを起動する方法(http.server)でも、私も実際にhttp.serverを利用してウェブサーバーを構築したことはありません。実はhttp.serverでサービスを構築すると思えばちゃんと運用するかの疑問もあるし、良いapiやオープンソースも多いのでpython(http.server)で構築する必要性を感じられません。ウェブapiプラットフォームをphpに決め、構築する場合にapacheで構築します。 php言語も個人的に素晴らしいウェブスクリプト言語だし、よく使うプログラム言語です。でも、ウェブの流れは様々のユーザが接続するマルチスレッド環境ですが、スクリプト言語のphp言語だけでコントロールが限界があるし様々なcのdllを参照して使うことはオブジェクトポイントやリソースを扱うことも簡単ではありません。その限界はapacheのcgiでpythonを運用してある程度に補完がされます。私の場合、特にpythonは統計やグラフなどのライブラリがすごく多いのでよく使います。なので、phpの言語の限界を超えてプログラミングを実装する場合はありません。apacheにphpを設定する方法は以前に説明したことがあるのでご参考をお願します。link - [php] php 開発環境設定とeclipse(ide)の設定apacheのcgiではperlとpythonを使うことがあります。perlも良いプログラム言語ですが、少し古い言語だし、コミュニティも以前より小さくなったので、最近はよく使わないかと思いもあります。(perl開発者にはすみません。)そうならapacheのhttpd.confでcgiを設定しなければならないです。apacheは基本的にcgiがperlで設定されているのでpythonを追加します。(参考にapacheが実行するpcにはpythonがインストールしなければならないです。)そしてapacheフォルダに行ったらcgi-binフォルダにあるのでそこにindex.pyを作成します。上の例をみれば私がパラメータでdataとtestの値を出力す

Devlopment note / Python

#python,#apache,#cgi

作成日付 : 2020/07/09 19:58:19       修正日付 : 2020/07/09 19:58:19

85

こんにちは。明月です。この投稿はpythonでweb serverを起動する方法(http.server)に関する説明です。私の場合はpythonをローカルスクリプトによく使うので、pythonでウェブサーバーを構築する場合はほぼないです。また、pythonではdjangoというウェブフレームワークがあるのでpythonで直接にウェブサーバーを構築する方はいないと思います。個人的の考えですが、普通のデベロッパーならpythonだけ扱う人はいないと思います。メインはjavaあるいはc#、phpを扱うことで足りない部分(?)や開発の便利性のためpythonを使う人がほとんどなのでウェブサーバを作ることはもっとないと思います。javaやc#の場合にpythonとともに使ってcomplex言語タイプで使うこともできますが、そんなことまで実装する方はいないと思います。phpの場合はスクリプトのウェブ言語なので言語の限界があるのでpythonと一緒に使うことがあると思います。でも、そのケースもpythonで独立的にhttp.serverでサーバーを構築することよりapacheのcgiを利用することがsessionやcookie管理的にも楽なのでhttp.serverは使いません。でも、よく使わないライブラリをなぜ紹介することではそれでも全然使うことではなく、すごく簡単に構築できるので簡単なことを構築することでよいからです。私の場合はこのhttp.serverを使う時、業務する時に様々なスクリプトを管理する場合があります。例えば、logファイル整理からデータベースバックアップ、マイグレーション、jenkinsなどで様々なスクリプトがあります。スクリプトだけではなく、パラメータによって実行する対象も設定する時もあります。それをただコンソールやスクリプトで管理することよりはウェブブラウザを利用する画面で管理することがよいと思って使います。(ロカールスクリプト管理ツールでjavaやphp、iisなどで管理することは大変です。)それならすごく簡単にウェブサーバーを構築します。ただ、静的なウェブサーバでwebsocketを設定して運用してもよいです。link - [python] websocketを使う方法でも、ここでは静的なサーバーを構築してjavascriptのwebsocketを使うための説明ではありません。動的なサーバ

Devlopment note / Python

#python,#web server

作成日付 : 2020/07/09 00:13:13       修正日付 : 2020/07/09 00:13:13

86

こんにちは。明月です。この投稿はpythonでwebsocketを使う方法に関する説明です。websocketはウェブブラウザからjavascriptでtcp同期通信するためのプロトコルです。以前、javaでwebsocketを実装したことがあるので、ご参考すれば理解しやすいと思います。link - [java] websocket (ウェブソケット)websocketの場合は普通はweb環境で実装します。でもphpの場合はwebsocketを実装することができません。現在はそうです。後はどうか知りません。でも、phpの場合は言語特性のせいにthreadを直接に管理することが難しいので将来でもできないじゃないかと思います。なのでその対策でnode.jsのsocket.ioとpythonのwebsocketがあります。グーグルで検索するとphpのwebsocketの対策でsocket.ioの説明が多いです。いつか機会があればnode.jsも説明したいですが、個人的にnode.jsを好きではありません。node.jsの言語的に限界があることよりpythonの良いローカルスクリプトがあるのに、あえてなぜ?と認識があるのでです。そしてsocket.ioは正確にwebsocket技術ではありません。ajax long polling技術ということでhttpプロトコルでrequest&response後に接続をすぐに切ることではなく、少しギャップをあげることです。なので、データが変わる時にブラウザにとって再要求をするようにすることです。ユーザが感じるには、httpのプーリングで、まるで接続が接続を維持するような効果を出す方法です。しかし、tcpで同期的に連結していることではないので、いろいろなバグが発生します。代表的なのが反応が遅い点がありますね。なので私の場合はpythonのwebsocketの実装がいいではないかと思います。pythonでwebsocketを使うためにライブラリをダウンロードしなければならないです。インストールが完了すればwebsocketスクリプトを作成しましょう。そしてクライアントはローカルの適当な場所にhtmlファイルで作成します。(pythonでwebサーバーを実装していないため、webブラウザを実行すべきhtmlファイルが必要です。)ウェブブラウザでの上に作成したhtmlを実行すると、j

Devlopment note / Python

#python,#websocket

作成日付 : 2020/07/07 17:29:18       修正日付 : 2020/07/07 17:29:18

87

こんにちは。明月です。この投稿はpythonとjavaのソケット通信する方法に関する説明です。以前にpythonとc#のソケット通信に関して説明したことがあります。link - [python] pythonとc#のソケット通信それでpythonとjavaのソケット通信に関しても説明した方がよいではないかと思って作成します。私の場合はjavaで開発すると思えば9割がトムキャットを利用するウェブプロジェクトになります。トムキャットを利用するのでウェブプロジェクトになりますが、内部でthreadを一つ作ってソケットサーバを待機してモバイルクライアントや各種アプリケーションが接続するサーバーを開発する時もあります。つまり、内部重要なプログラムの流れはソケットサーバですが、ソケットサーバをコントロールプログラムはウェブプロジェクトで開発することです。そのため、javaでソケット通信する時が全然ないことではないので、そのようなc#みたいに模擬サーバやクライアントが必要です。pythonのサーバソケットを作成しましょう。link - [python] 18. ネットワーク(socket)通信する方法データサイズの転送バイトはlittleエンディアンを使います。次はクライアントをjavaで作成しましょう。上の例をみればclient(java)で10回のメッセージを送る時、メッセージにindex番号を付けて送信しました。順番通りに受信することを確認できます。サーバにはメッセージを受け取ってコンソールに出力して「echo:」メッセージを付けってclientに再送信したことも確認できます。今回はjavaのサーバを作成してpythonのクライアントで接続します。上のjavaでsocketserverクラスを利用してソケット通信サーバを作成しました。今回はpythonでクライアントを作成しましょう。clientでメッセージを作って10回のループでサーバにメッセージを送信します。その後、サーバにはメッセージのメッセージにechoの文字列を付けてclientでメッセージを送信します。java server - python clientも問題なしでよくできます。javaサーバでエラーメッセージが表示される理由はclientで強制終了すればexceptionに発生します。javaの60番目exceptionでエラーメッセージが表示され

Devlopment note / Python

#Python,#java,#socket

作成日付 : 2020/07/03 18:35:50       修正日付 : 2020/07/03 18:35:50

88

こんにちは。明月です。この投稿はpythonとc#のソケット通信に関する説明です。開発の目的によってプログラムを使う方法の差がありますが、私の場合はメイン言語はjavaとc#でその以外に開発補助言語でpythonを使っています。その意味は例えばc#のプロジェクトでcs(client server)プログラムを開発する時、普通はチームでclientかserverのことを担当して開発することになります。(プロジェクトのサイズによって両方を一緒で開発する時もあります。)もし、私がclientを開発すると思えば、serverとclientの通信のプロトコルを開発する部分があります。その部分はhttpconnectionを利用することもあるし、soap通信することもあるし、一般ソケット通信することもあります。その時、serverとclientの通信部分を一緒で開発する方がよいですが、お互いにスケジュールの差異がある場合、clientでserverのスケジュールを合わせて待つことしかできないです。私の場合はスクリプト(pythonやnode.js)で模擬サーバを作って開発します。(逆にserver側で模擬クライアントを作ります。)個人的にjavascript(node.js)の言語もいいと思いますが、ローカルスクリプト言語としてnode.jsよりpythonがライブラリも多いし、早めに作成することができるのでよく使います。その目的ではなくても、スクリプトで他の言語間に通信することもできます。それならpythonサーバとc#のクライアント通信を説明します。上のソースは以前作成したpythonサーバーとそんなに差異がありません。link - [python] 18. ネットワーク(socket)通信する方法差異はlittleエンディアンを使うことではなく、bigエンディアンを使います。でも、to_bytesでbyteorderをbigに設定してもlittleエンディアンで転送します。from_bytesの場合はbigに設定するとbigエンディアンになりますが。。サーバを起動してクライアントを起動します。上の例をみればclient(c#)で「this message is sent from c# client.」というメッセージを送信するとserverではコンソールで出力して「echo :」を付けてclientに転送しま

Devlopment note / Python

#Python,#C#,#Socket

作成日付 : 2020/07/01 19:28:22       修正日付 : 2020/07/01 19:28:22

89

こんにちは。明月です。この投稿はpythonでini(環境設定ファイル)を扱う方法に関する説明です。以前、c言語やc++言語プログラムで環境ファイル設定タイプでinitialization設定ファイルということです。iniファイルの拡張子は普通はiniでなっていますが、confやcfgに使う時もあります。iniの設定構造はセッションとキーになっています。コメントはセミコロン(;)を使います。apacheなどini設定ファイルで環境ファイルがまだあります。なのでciツール(jenkins)でビルドする時、pythonで自動環境ファイル設定スクリプトを作ることでよく使います。configをリストのキーでセッション名を設定します。そのリストでディクショナリを設定すればディクショナリのキー、値によって環境ファイルを設定します。今回はiniファイルを読み込んでpythonで使いましょう。iniを読み込んでsectionsの関数を通ってセッションキーを取得します。そしてkeysの関数で環境ファイルのキーを取得することができるし、そのキーを通って値を出力することができます。phpをインストールするとphp.iniファイルがあります。pythonを利用してphp.iniファイルを扱いましょう。上のイメージはphp.iniをメモ帳で読み込むことです。親切にコメントがあります。でも、コメントが多すぎです。なので逆に値を探すのが大変です。私もたまにコメントが多すぎてコメントをすべて消したい時があります。上みたいにiniファイルを読み込んで再作成するとコメントがすべてなくなって綺麗なiniファイルができると思いました。でも、エラーが発生しました。調べるとiniファイルでセッションとキー単位で同じキーがあります。実際iniでセッションかつキーはユニックなのでデータが複数にあることは存在しません。でも、php.iniでは使います。インタネットを調べると私と同じ問題で解決したことがあります。link - https://stackoverflow.com/questions/15848674結果はコメントが削除されてiniが新しく作成されました。でも重複されたextensionのキーでは可笑しく入力されています。コメントが除いたiniファイルが生成されました。ここまでpythonでini(環境設定ファイル)を扱う方法に関する説明でした

Devlopment note / Python

#python,#ini

作成日付 : 2020/06/30 18:26:01       修正日付 : 2020/06/30 18:26:01

90

こんにちは。明月です。この投稿はpythonでjsonを扱う方法に関する説明です。以前にcsvとxmlを扱う方法に関して説明したことがあります。link - [python] ioを利用してcsvファイルを扱う方法link - [python] xmlファイルを扱う方法プログラムで人間が認識するデータ構造で様々がありますが、最近はjsonタイプをよく使います。jsonとはjavascript object notationの略語でjavascriptのデータ表記法です。つまり、javascriptの文法構造がjsonタイプです。javascriptがpythonと同じスクリプトだから表記法も似てます。例えば、中括弧{キー:値}のタイプはpythonのディクショナリです。[データ、データ]のタイプはリストタイプです。また、jsonのxmlの階層的表現も可能するので様々な活用度もたくさん高いタイプです。それならjsonデータを出力しましょう。ディクショナリタイプがjsonタイプなのでpythonのデータがそのままメモ帳に出力されました。今回はjsonタイプでデータを読み込んでpythonのディクショナリタイプに変換しましょう。結果をみればファイルのstrデータを確実に読み込みました。jsonタイプはphpのcomposerかnode.jsなどでよく使うデータタイプです。pythonを利用すれば環境ファイル設定が可能です。ここまでpythonでjsonを扱う方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Python

#python,#json

作成日付 : 2020/06/29 19:18:15       修正日付 : 2020/06/29 19:18:15

91

こんにちは。明月です。この投稿はpythonでxmlファイルを扱う方法に関する説明です。最近はxmlファイルは以前よりよく使わないですけど、10年前でもプログラムの環境設定や標準データ構造でxmlをよく使いました。最近はjsonタイプがたくさん使います。xmlが構造がタグを開き、閉めの構造だし、各タグにアトリビュートを入れられる構造なのでデータを表現することではすごくいい構造です。例えば、コンパイル言語でクラスをデータとして作ると思えば、最初のタグをクラス名に作成し、派生タグに変数の値を格納できます。派生タグのアトリビュートを利用して変数のデータタイプなどを指定してクラスすることでドキュメントに作成することができます。xmlがこんなにいいことだけあることではなく、短所もあります。タグが開き、閉めることがあるのでファイルのサイズが大きくなるし、アトリビュートやデータが多くなれば可読性が落ちることがあります。特にデータサイズが大きくなることはパフォーマンスなどに関係があるものなので特に致命的な短所です。その為、最近はxmlと似ているjsonタイプをよく使います。でも、xmlタイプを全然使わないことではなく、パフォーマンスを関係ず、データの詳細に表現する必要がある時に使えます。特に、環境設定などでよく使いますが、代表的にc#のapp.configとtomcatのserver.xml、javaのpom設定などでよく使います。それで環境ファイルをプログラム的に管理することや整合性チェックなどでpythonソースを作成して管理します。例えば、jenkinsみたいにciでデプロイする時、jenkinsのshell commandを作成することでpythonコードを使えば環境設定管理をしやすくできます。上の結果をみればxmlがよく作られたことを確認できます。element.elementを使ってappendすることはsubelementを使うことと同じ結果になります。ソースステップのため、subelementを使うほうが良いと思います。そしてアトリビュートの場合、set関数を使って格納できます。今回はxmlファイルを読み込んでディクショナリタイプに生成しましょう。ルートによってリストではなくディクショナリタイプに生成されました。なので、ルートの中で出力すれば最初のリストのディクショナリタイプに生成されることを確認できます

Devlopment note / Python

#python,#xml

作成日付 : 2020/06/26 19:18:14       修正日付 : 2020/06/26 19:18:14

92

こんにちは。明月です。この投稿はpythonでioを利用してcsvファイルを扱う方法に関する説明です。pythonはローカルでよく使うスクリプト言語ですから様々なファイルを扱うライブラリがよく整理しているらしいです。他のプログラム言語だってできないことではありませんが、個人的にpythonが環境ファイルらしいなデータを作ることでは便利ではないかと思います。csvファイルはデータベースや様々テーブル形式のデータでよく使う形式です。csvファイルがカンマ(,)と改行の区分で作られました。今回はcsvファイルを読み込んで使いましょう。ファイルのコンマ(,)と改行区分でデータを読み込んでコンソールに出力しました。csvファイルにヘッダーが必要な場合があります。ディクショナリタイプを利用すればcsvファイルの一行目はデータのヘッダーで使えます。ディクショナリタイプになっているリストでcsvファイルを作成しました。そして一行目はheaderとしてタイトルを入れました。今回はまたcsvファイルをディレクトリタイプで読み込みます。結果はorderdictタイプで出力されます。一般ディクショナリタイプではないですが、ディクショナリの種類なのでディクショナリタイプでcsvファイルを読み込みました。ここまでpythonでioを利用してcsvファイルを扱う方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Python

#python,#IO,#CSV

作成日付 : 2020/06/25 18:20:30       修正日付 : 2020/06/25 18:20:30

93

こんにちは。明月です。この投稿はpythonでデータベース(mariadb)を連結する方法に関する説明です。私の場合はpythonをローカルスクリプト言語でよく使います。ローカルスクリプト言語で使うというのはプログラムを開発することや運用する時に一回性で使うプログラムスクリプトということです。ただ、一回性だけではなく、スケジュールで使う時もあるし、batchをかけて問題がある時やトリガーにかけるかアップデータで使えます。コンパイル言語でもローカルスクリプト言語で使えますが、ソース修正がスクリプトより大変です。(buildが必要から)その以外にインストールも多いし、ライブラリも多いのでpythonをよく使います。そのためプログラムを開発すればデータベースに接続する場合が多いですが、簡単な検索などはsql browserなどで処理ができますが、データ検証や様々なsql scriptを管理する時にはローカルスクリプトを利用するばよいです。データベースの種類はoracleやsql server(ms-sql)、postgreなど多いですが、私の場合はmariadbをよく使います。それでここにはmariadbの対して例を作成しましょう。先にpythonでmysqlを使うためにはpipモジュールをインストールしなければならないです。モジュールインストールが完了したらpythonでmaraidbを接続しましょう。上の例でテーブル追加からデータ入力、修正、削除そしてテーブル削除まで処理するスクリプトを一列で作成しました。先、dbconnというmysqlコネクションを生成して受け取ります。pythonはスクリプトなのでプログラム実行が終わると自動にリソースを閉めますが、明確にするためソースの最後にclose関数でリソースを閉めて返却する処理式を作成します。そしてexecuteを実行するとforの繰り返しでデータセットを受け取ります。execute関数でクエリを実行することもできるし二つのパラメータでクエリバインディングもできます。executemany関数の場合は大量処理も可能です。fetchall関数を使えば一つのfetchデータではなくすべてのデータを受け取ることもできます。コンプリヘンションでデータソートが可能です。でも、すべてのデータがメモリにあることなので、パフォーマンスが遅くなります。link - https:

Study / Python

#Python,#database

作成日付 : 2020/06/24 18:51:50       修正日付 : 2020/06/24 18:51:50

94

こんにちは。明月です。この投稿はpythonでstringフォーマッティング(formatting)と補間法(interpolation)に関する説明です。stringフォーマッティングは定数タイプなどを文字列タイプに変換することやstringのデータタイプにstringの値を入れるような方法です。フォーマッティングはパーセント(%)を利用します。パーセント(%)の前はformat文字列、後は置換する値を設定します。最終結果はイコールで左の変数に格納されます。フォーマッティングの文字列で置換領域もパーセント(%)で区分します。そしてパーセント(%)の後は置換値のタイプによるコードを入力します。置換値は複数(2個以上)ならタプルで入力します。 コード 説明 %s 文字列(string) %c 文字一つ(character) %d 定数(integer) %f 浮動小数点(floating-point) %o 8進数 %x 16進数 stringタイプでフォーマッティングではなく本当にパーセント(%)を使いたい時があります。その時にはパーセント(%)を二つ入れることで入力します。pythonはフォーマッティングで文字列整列も可能です。補間法とはフォーマッティングする文法でもっと見やすくするための文法です。例えば置換するデータが多い時に置換場所を迷う時があります。補間法は文字列の表現するダブルクォートやクォートの前でfを付けます。そうすると領域中では中括弧で直接にフォーマッティングを作成することができます。stringフォマード(formattingと補間法(interpolation)に関して各長所、短所がありますが、私の場合は補間法(interpolation)のほうが見やすいのでよく使います。ここまでpythonでstringフォマード(formatting)と補間法(interpolation)に関する説明で

Study / Python

#python,#Formatting,#interpolation

作成日付 : 2020/06/23 19:03:21       修正日付 : 2020/06/23 19:03:21

95

こんにちは。明月です。この投稿はpythonで非同期ioのasync/await(asyncio)を使う方法に関する説明です。threadで関数を実行する時にその結果を受け取ることが難しいです。link - [python] 17. スレッド(thread)とロック(lock)、そしてデッドロック(deadlock)つまり様々な制御文を並列で処理して結果をすべて待たなければならないです。上みたいにfor文を二つのスレッドに実行して計算することができます。でも、何かソースが複雑みたいです。グローバル変数でretを生成して各スレッドでデータを入力、修正します。もし各スレッドでパラメータによってデータを変わることにしようと思うとすごく複雑になります。でも非同期処理(async/await(asyncio))を使うと簡単に処理することができます。asyncとawaitを使えばthreadingを使う時よりソースを綺麗に作成することができます。まず、asyncとは関数の前に使うキーワードです。外部では非同期を実行するためのキーワードだし、内部的にはawaitを使えるような予約語です。main関数でt1とt2を待つawaitを使いましたが、もしmainがasyncではないしグローバル領域でawaitキーワードを使うとエラーが発生することになります。awaitキーワードは非同期で待機する意味で、await asyncio.sleep(i)の場合はiを秒単位です待機する意味です。つまりtime.sleepと同じ意味です。create_task担っているtaskオブジェクトからawaitを使えばスレッドが終了する時まで待機するthread.joinと同じ意味です。最後にasyncio.runはasyncをcreate_taskみたいに非同期ではなく同期(プロセスの順番とおりに処理)で処理する呼び出しです。asyncio.runを使ってもよいです。でも最近はrun_until_completeを使うことをお勧めしています。またcreate_taskで非同期に分けましたが、asyncio.gatherも非同期処理が可能です。link - https://docs.python.org/3/library/asyncio-task.htmllink - https://docs.python.org/3/library/asyn

Study / Python

#python,#asyncio

作成日付 : 2020/06/22 18:10:12       修正日付 : 2020/06/22 18:10:12

96

こんにちは。明月です。この投稿はpythonでネットワーク(socket)通信する方法に関する説明です。プログラムでネットワーク通信することはソケット通信といいます。ネットワーク通信はプログラムとプログラム間に通信することやpcとpc間に通信するという意味です。ソケットはpythonだけではなく、他のプログラム言語でも同じ通信標準です。基本的にソケット通信流れは下記とおりになります。ソケット通信はサーバーとクライアントがあります。サーバーはソケット接続を待っているもの(listen)です。クライアントは接続を待っているサーバーに接続するものです。つまり、サーバーがlisten状況になっているとクライアントがサーバーにconnectionします。そうするとサーバー側はacceptが発生してサーバーとクライアントがsendとreceiveでデータを送受信します。データを送受信するデータタイプはバイナリ(byte)タイプになります。上の例をソケットサーバーソースです。基本的にbindしてlistenでクライアントを待機します。その後、acceptが発生すればスレッドでクライアントソケットを渡してメッセージ受信を待機します。binder関数では受信するデータサイズ、データ受信、echoを付けたデータのサイズを送信、echoデータ送信順の流れで繰り返しています。thread環境で作ったので接続が切れなくても別のスレッドでクライアントを待つことができます。上の例をソケットクライアントソースです。まず、サーバーを起動してクライアントを接続します。クライアントからサーバーに接続してhelloというメッセージを10回にループで転送しました。サーバーには10回のhelloというメッセージを受信してecho :という文字を付けてecho : helloというメッセージをクライアントに転送しました。その結果クライアントにはecho: helloが10回にコンソールに出力されました。ソケットインスタンスを生成する時socket.af_inetとsocket.sock_streamを使いましたが、socket.af_inetはip4インターネットを使うという意味だし、socket.sock_streamはデータをバイナリ(byte stream)タイプに使うという意味です。af_inet以外にaf_inet6、af_unix、af_

Study / Python

#python,#socket

作成日付 : 2020/06/18 19:53:56       修正日付 : 2020/06/18 19:53:56

97

こんにちは。明月です。この投稿はpythonでスレッド(thread)とロック(lock)、そしてデッドロック(deadlock)に関する説明です。スレッドとはプロセスの中で動いている最小の実行単位をスレッドといいます。ただ、このように説明すると何の意味がよく理解できません。まず、プロセスというのはメモリに割り当てている一つのプログラムということです。プログラムは一つ以上のプロセスを運用することができず、プログラムとは一つのプロセスという意味と同じです。一つのプロセスは二つ以上のスレッドを運用することができます。簡単に説明するとプロセスで二つ以上のスレッドを同時に実行できる並列処理方法だと思えば良いです。簡単な例として説明しましょう。上の例を見ればexample関数を二回に呼び出しました。example関数で1から9まで繰り返してコンソールに出力します。当然に始めのexample関数の呼び出しが終わったら次のexample関数の呼び出しに実行することで順番に実行することを確認できます。でも、私はこの関数を順番ではなく、同時に実行したいです。つまり始めのexample関数の呼び出しの終了を関係ずに次のexample関数の呼び出ししたいです。結果をみれば6から7間に1と2が出力されました。7は2の次にあります。つまりexample関数を二回に呼び出しましたが始めのexample関数が終わる前に二つ目のexample関数が呼び出されたことを確認できます。このように使ったらthreadの特徴を確認するのが大変です。今回はqueueを使って様々の作業を同時に処理する例を作って説明します。上の例をみればキューのtask_doneとjoin関数を使いました。簡単に説明するとキューからget関数でデータを出せば別にカウンターが更新しないです。キューのデータ数を更新する関数がtask_done関数です。queueの詳細な説明は次のリンクから確認できます。link - https://docs.python.org/ja/3/library/asyncio-queue.htmljoinはキューが空けるまでプロセスを止まる関数です。一つのリストに複数のスレッドで無差別にデータを入れると、データが失われる場合があります。確かにgenerator関数を二回に呼び出しします。generator関数は1から9まで繰り返すのでコンソール

Study / Python

#python,#thread

作成日付 : 2020/06/18 00:19:45       修正日付 : 2020/06/18 00:19:45

98

こんにちは。明月です。この投稿はpythonでio(ファイル読み取り、書き込み)を扱う方法に関する説明です。プログラム言語で重要なリソースならio(ファイルを扱う)とソケット通信ではないかと思います。特にプログラムを作成する時に主に使う言語はjavaやc#ですが、そのプログラムで使うテストデータを作ることや仮想マシンを作る時にスクリプト言語としてpythonをよく使う方です。スクリプト言語はパフォーマンスやメモリ管理の側ではコンパイル言語より疑問点があります。でも、テストデータ(jsonやxmlデータ)を作ることやサーバを管理するshellスクリプト管理、sqlスクリプト管理、ミドルウェアやサーバプログラムの環境設定ファイル管理などでは簡単にプログラムを実装ができる言語でpythonがいいではないかと思います。そのため、ioがpythonの言語で一番重要ではないと思います。ファイルは入出力(input/output)が基本の流れです。入力はファイルからデータを読み取ることだし、出力はデータをファイルに書き込むことです。上でopen関数を利用してファイルリソースを取得します。open関数のパラメータは使うファイル名とファイルオプションです。ファイルオプションタイプは下記通りになります。 タイプ 説明 r ファイル読み取り w ファイル書き込み(ファイルがなければ生成するし、存在すれば既存ファイルを削除して新しく生成する。) x ファイル書き込み(ファイルが存在すればエラーを発生するし、なければ生成する。) a ファイル書き込み(ファイルがなければ生成するし、存在すれば既存内容からデータを追加する。) モード 説明 t 一般テキストタイプ(省略可能) b バイナリタイプ(テキスト文字以外のデータを作る時に使う。) 上の例でタ

Study / Python

#python,#IO

作成日付 : 2020/06/16 18:37:00       修正日付 : 2020/06/16 18:37:00

99

こんにちは。明月です。この投稿はpythonでクラスを継承する方法に関する説明です。以前の投稿でpythonでクラスを生成して使う方法に関して説明したことがあります。link - [python] 12. クラス(class)を使う方法pythonでクラスを生成する時、既存にあるクラスでもっと機能を拡張して使いたい時があります。でも、ただクラスを修正すると既存に参照した領域で影響されるので修正することはできないなのでコピペする時があります。ただ、コピペすると元のクラスがバグがある時にコピペしたクラスをすべて修正しなければならないです。そのことより、ディベロッパーらしくないコーディングスタイルです。その時にただコピペでクラスを生成することではなく、継承することで再定義することができます。上の例をみればmain2クラスは確かにexec_functionがありません。でもmainクラスを継承しましたので、mainのクラスの機能を使えます。アンダーバー(_)を一つ使いましたが、protectedという意味で外部では参照できないですが、継承したクラスと内部では参照できるようなアクセス修飾子です。まとめるとアンダーバーがない場合はpublicですべて参照が可能、アンダーバー(_)が一つで変数名が始まる場合はprotecetdで継承したクラスと内部、アンダーバー(_)が二つで変数名が始まる場合はprivateで内部だけ参照できるような設定です。つまり、_dataの場合はアンダーバーが一つで変数名が始まるのでmainクラスを継承したmain2で参照ができます。なのでexec_function関数を呼び出すとmainは「main class」がmain2は「main2 class」が出力されます。上の例ではmainクラスで_get_data関数を生成しましたが、main2クラスで継承する時に再定義する構造です。結果はexec_function関数を呼び出すと再定義した_get_data関数を呼び出します。でも、再定義したが親のクラスを使いたい時があります。上の例はmain2クラスで_get_dataを再定義しました。でもexec_function関数でmain2の_get_dataではなく、親クラス(super())の_get_data関数を呼び出しました。今まで、使うクラスを継承して機能をそのままで使うクラスを生成しまし

Study / Python

#python,#abstract

作成日付 : 2020/06/15 18:20:07       修正日付 : 2020/06/15 18:20:07

100

こんにちは。明月です。この投稿はpythonのクラスプロパティ(property)に関する説明です。まず、クラスのプロパティはクラス内部変数を参照するような関数の意味です。 普通はゲッター(getter)、セッター(setter)という時もあります。クラスを生成する時に内部メンバー変数をpublicタイプで生成することはできますが、oopのカプセルの特性でクラスの内部メンバー変数を直接に参照することはよくないです。(pythonは別にoopプログラム言語ではないですが。。。)なぜなら、クラスを生成する理由はオブジェクトの意味を合わせて作った変数がクラスですが、直接に変数を参照することになるとクラスの意味がなくなることです。上の例をみればpeopleクラスに国語、数学、英語をいれてcalc関数で総点と平均点数を計算します。でもpublicになるとa.avgで平均点数値を修正ができます。上みたいにクラスを設計すればクラスの意味がなくなります。なので変数のアクセスを制御する必要がありますが、それがクラスプロパティです。でも、クラスのメンバー変数を参照しなければならない時があります。その時にはpublicにすることではなく、ゲッター、セッターのプロパティを設定して参照します。実は上みたいにゲッター、セッター関数で変数を参照してもpythonの標準コーディングに間違いことではないです。javaの場合はプロパティを上みたいにゲッター、セッター関数で参照します。c#の場合はプロパティ文法が別にあります。pythonもデコレートを使ってプロパティを設定することができます。pythonのクラスプロパティはセッターだけを生成ができません。@ゲッター名.setterなのでゲッターが無ければセッター設定ができないです。でも、ゲッターだけには設定ができます。ゲッターだけあれば読み取り専用変数になります。セッターを設定してないので産所するとエラーが発生します。ここまでpythonのクラスプロパティ(property)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Python

#python,#property

作成日付 : 2020/06/12 17:45:13       修正日付 : 2020/06/12 17:45:13

101

こんにちは。明月です。この投稿はpythonでクラス関数(class method)とダック・タイピング、そして特殊メソッドに関する説明です。クラス関数(class method)以前の投稿でpythonクラスと関数に関して説明したことがあります。link - [python] 12. クラス(class)を使う方法link - [python] 06. 関数(function) - インライン関数、callbak、ラムダ(lambda)そしてクロージャクラスで関数を使う方法は一番のパラメータでselfを入れるとクラスをインスタンス生成した後関数を呼び出せます。 pythonではクラス関数という関数があります。他のプログラム言語ならstatic関数ということです。static関数はインスタンスを生成がしなくて呼び出せるものです。ダック・タイピングダック・タイピングはc#のdynamic変数と似ているし、javascriptのコールバック関数と似ています。pythonではインターフェイスが存在しないからダック・タイピングで多態性を実現したようです。でも、インタフェースがない環境でダック・タイピングを作成すると逆にバグの発生や可読性が悪くなると思います。個人的な考えですが上のソースみたいに作成して、後にtestclass3クラスのcall_functionを変更したり削除したらエラーが発生する可能性があります。個人的な考えです。特殊メソッド特別なメソッドは、javaやc#なら最上位クラスobjectで宣言された基本関数の意味です。つまり、tostring()と同様のことでしょう。link - https://docs.python.org/3/reference/datamodel.html#special-method-names特殊メソッドは種類がすごく多いですが、よく使う__eq__と__ne__、__str__、__repr__、__len__を説明します。特殊メソッドは演算子を再定義する機能があります。よく使うとソースステップをたくさん減らせると思います。ここまでpythonでクラス関数(class method)とダック・タイピング、そして特殊メソッドに関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Python

#python,#class method,# duck

作成日付 : 2020/06/11 19:42:29       修正日付 : 2020/06/11 19:42:29

102

こんにちは。明月です。この投稿はpythonでクラス(class)を使う方法に関する説明です。クラスの概念は他のコンパイル言語を扱った方なら別に説明がなくても十分に知っていると思います。pythonの場合はスクリプト言語なのでクラス概念を知らなくてもソース実装することや設計を作成することができます。でも、管理が必要なデータや一つの概念でデータを結ばなければならないデータならクラスの概念で作ったほうが設計や実装することが理解しやすいしソースステップを減らすことができます。下記の例を通ってクラスがあることとないことの差異を確認しましょう。例は国語、数学、英語の成績を持っている学生の平均値とクラスの平均値を計算しましょう。上の例をみれば各人、国語、数学、英語成績のリスト宣言して人を追加する時に各成績リストも同じく追加します。つまり、4個のリストのデータ個数はいつも同じくなります。もし同じではない場合、整合性の問題になります。つまり、personリストは4個なのに、mathリストは2個ならデータが可笑しいでしょう。また、リストだけ確認すると誰のデータかは知りません。例えばmathの3番目のデータはpersionの3番目のデータを確認しないと知らないという意味です。上の例は簡単なソースなので難しくないですが、ロジックが複雑だし、データが多いならデータ管理は簡単ではないでしょう。ソースステップだけ見てもクラスを扱うことと使わないこととソースステップも差異が大きいです。また、各人の点数を各リストに格納したことよりクラス内部のメンバー変数で管理するので整合性も問題ないです。つまり、リストから取り除くと成績も一緒に削除されるので可笑しいデータが入ることがありません。pythonでクラスを使う方法は関数のdef代わりにclassキーワードを使えば生成します。小括弧はクラス継承のためにあることですが、他の投稿で詳しく説明します。クラスはメソッドだけ構成されています。他の言語みたいに変数を宣言することができません。各関数の最初のパラメータはselfで固定になっています。__init__の関数は初期化関数で他の言語ならコンストラクタということです。コンストラクタは無くてもクラスを扱うのは問題はないけど、可読性のためにコンストラクタを生成するほうがいいです。特にメンバー変数はどの関数で宣言しても問題ないですが、コンストラクタで初期値

Study / Python

#python,#class

作成日付 : 2020/06/10 19:33:33       修正日付 : 2020/06/10 19:33:33

103

こんにちは。明月です。この投稿はpythonのデコレーター(decorator)を使う方法に関する説明です。デコレーターは関数の再使用と関係があることですが、ただ再使用だけではなく機能を追加する機能だと思えばいいです。関数系の継承だと考えばいいです。例えば、二つのパラメータを受け取って総合計を計算する関数があります。ここで我々は平均まで計算したいなら関数を修正しなければならないですが、修正しなくても機能を追加することで関数を続けて使用するような方法です。実務では上みたいにデコレーターを使うことはありません。ただ、デコレーターを理解しやすく説明するために作成しました。普通はデコレーターはcallback関数やcount関数、ログを作成するために使います。上の例みたいに使えばadd関数に呼び出すたびにログを残せます。デコレーター側にはパラメータ個数とは関係ないので、他の関数でも使うことができます。callback関数ではラムダだけではなく、一般関数を入れることができます。なので複雑なロジックでも設定ができます。ここまでpythonのデコレーター(decorator)を使う方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Python

#python,#Decorator

作成日付 : 2020/06/09 17:27:18       修正日付 : 2020/06/09 17:27:18

104

こんにちは。明月です。この投稿はpythonのモジュールとパッケージ(import)に関する説明です。pythonでモジュールの意味は拡張子がpyになっているpythonコードのファイルということです。その意味は私がmain.pyを生成してその中でpythonコードを作成すればそれがmainモジュールということです。他のプログラム言語はファイルの意味はクラス名と一致する以外は特に意味がないし、大体にnamespaceやpackage単位とクラス中心で動きます。私の考えはコンパイル言語はコンパイルすれば一つのファイルにアウトプットになるので別に意味がないじゃないかと思います。逆にpythonはスクリプト言語なのでファイルの意味があることではないかと思います。上のソースをみればimportキーワードでexample.pyを登録します。ここの重要なポイントは拡張子が必ず.pyになるべきです。そしてexample.print_function()でexample.pyの中にあるprint_function関数を呼び出します。こんなモジュールをディレクトリ別で管理することもできます。 このモジュールがあるディレクトリをpythonではパッケージといいます。参考にディレクトリをパッケージ化するためには__init__.pyが必要です。__init__.pyがなければパッケージでインポートができません。(python3.3からは省略ができます。)参考 - https://dojang.io/mod/page/view.php?id=2449それなら私がexampleフォルダでtestディレクトリを生成して同じくexample1.pyファイルとexample2.pyを生成します。エラーは発生しないですが、import順番でexampleパッケージのexample1.print_functionを使うことができなくなりました。この時はパッケージ再命名方法で解決できます。これみたいにモジュール名が同じだても再命名方法で使うことができます。pythonはユーザー、つまりプログラマーのためよく使うモジュールやパッケージを作成しておりましたが、これをpythonでは標準ライブラリだといいます。link - 標準ライブラリ例でosモジュール使ってみましょう。私はwindowで実行しましたので、ntという結果が出力されます。別途でpy

Study / Python

#python,#module,#import

作成日付 : 2020/06/08 19:07:50       修正日付 : 2020/06/08 19:07:50

105

こんにちは。明月です。この投稿はpythonで例外処理する方法に関する説明です。プログラムを作成すると様々なエラーが発生することがあります。例えば、stringタイプにintタイプの数字を加算するとか、文字タイプを定数タイプにキャストするとかがあります。上の例をみれば4行目でエラーが発生したと表示されます。その後にpythonコードは中断されました。下のprint関数が実行されませんでした。様々な変数を間違ってエラーが発生することは悪くないです。ただ、エラーをどのように処理することが重要です。エラー処理を上手くできなければ上みたいにプログラム実行が止まります。エラーが発生する時にはエラー処理をしてエラー部分のステップを超えます。上の例でエラーが発生する部分をtry ~ exceptで囲んでました。c = a + bのステップでエラーが発生してexceptのところに移動しました。print(c)でコンソール出力が行わないです。後、exceptであるコンソール出力してprint(a)が実行されました。区間内でエラーの種類は一つではなく様々なエラーが発生する可能性があります。そのエラーの種類によってエラー処理を別々にすることができます。上の結果をみればdivision_functionを三回に呼び出しますが、上の二回はエラーが発生します。でも上のエラー種類が違うので別のprint関数を呼び出します。参考に上の「エラータイプ as e」構造ならe変数にエラー内容が格納されます。ここで例外の最上位エラータイプはexceptionです。上みたいに作成すればtypeerrorとzerodivisionerrorが発生してもすべてexceptionに行ってしまいます。上の結果はtypeerrorとzerodivisionerrorのところに移動しました。エラーが発生してエラーか、エラーではないかの関係しず、ステップ処理するキーワードはfinallyです。一般ソースステップではfinallyキーワードを使わなくてもexceptが呼び出したら次のステップに実行するのでfinallyの必要性を感じられません。でも関数の中でreturnキーワードと一緒に使えばtryの中でreturnしても最後にfinallyの部分が実行されます。特にリソース管理する部分で使えばいい文法です。ここまでエラーが発生すればどのように処理することを説明

Study / Python

#python,#try

作成日付 : 2020/06/05 17:11:47       修正日付 : 2020/06/05 17:11:47

106

こんにちは。明月です。この投稿はpythonのジェネレータ(generator)に関する説明です。ジェネレータ(generator)という辞典的な意味は生成するという意味です。pythonでもジェネレータ(generator)は生成する意味ではないことではないですが、繰り返し(ループ)文法でイテレータ(iterator)パターンを実装するような機能です。少し説明が難しくなりますが、関数を呼び出すたびに結果が違うような機能です。上の例はジェネレータでrange関数と同じ結果が出るように実装しました。range関数も1から9まで出力して1ずつ増加します。ジェネレータは上の例みたいに関数で使えますが、実はコンプリヘンションでよく使います。参考 - [python] 05. コンプリヘンション(comprehension)を使用する方法上の例をみれば同じ結果になります。コンプリヘンションを利用してリストを作ることとジェネレータを作ることは差がないです。そうすればジェネレータは別に意味がなさそうです。でも、パフォーマンスに大幅差があります。メモリをみればリストは43,000バイトを使うしジェネレータは120バイトです。なんでこの差が出るでしょう。リストの場合はコンプリヘンションで計算した結果をすべて持っていることです。でも、ジェネレータの場合はデータをメモリに持っていることではなく、構造的なオブジェクトでデータを呼び出す時だけ返却するのでこの結果になりました。(構造的なオブジェクトとは値を持っていることではなく、関数のスタックを持っていることです。)なので、一回性のデータならリストにデータを格納することではなく、ジェネレータを使うほうがパフォーマンスを上げることができます。ジェネレータはリストによる短所もあります。再使用ができないことです。なので結果は一回だけ出力されました。ジェネレータはループだけ使うことではありません。next関数で2,4,6,8のデータを一つずつ出力しました。8の以降はデータがないので、エラーが発生します。ここまでpythonのジェネレータ(generator)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Python

#python,#generator

作成日付 : 2020/06/04 18:46:08       修正日付 : 2020/06/04 18:46:08

107

こんにちは。明月です。この投稿はpythonでglobalとnonlocalに関する説明です。以前の投稿でクロージャ(closure)に関して説明したことがあります。link - [python] 06. 関数(function) - インライン関数、callbak、ラムダ(lambda)そしてクロージャクロージャとはインライン関数で関数の外部から宣言したデータを持ち込むということです。でも外部から宣言したデータを関数の内部で修正することはどうでしょう。example_function関数の内部でdataの値をhelloに変更しましたが、外部でコンソール出力するとデータが変更されないでした。理由はexample_functionの中でdata="hello"したことは内部変数に認識して新しい変数を宣言したからです。そうすると、仕様によってグローバル変数を関数の内部で変更する時もありますが、その時にはどうでしょう。今回はdataの変数の値がちゃんと変更されました。今回はインライン関数関数で使いましょう。上のグローバル変数でdata変数があり、example_functionの関数の中でもdata変数があります。その状況でinline_function関数でdata変数を参照すれば、inline_function関数の一番近いステップの変数を参照します。グローバル変数よりexample_functionの変数がもっと近いステップということです。でも、使用によってグローバル変数を使いたいです。そうすればinline_function中でもglobal関数を修正ができます。global dataをしてdata ="値"をいれば修正できます。それなら、inline_function中でexample_functionのデータはどのように修正するでしょう?単純にdata="値"を入れれば初めの例みたいにinline_function関数のデータに宣言されてしまいます。globalはグローバル変数をnonlocalは一番近いステップの変数を参照することです。そうすればインライン関数の中でインライン関数でグローバル変数ではないけど、一番トップにある変数を修正したいです。そこまでは参照ができないです。(何処まで参照したいのか?)実は上みたいにソースを作成するとプロ

Study / Python

#python,#global,#nonlocal

作成日付 : 2020/06/03 20:34:49       修正日付 : 2020/06/03 20:34:49

108

こんにちは。明月です。この投稿はpythonで関数(function) - インライン関数、callbak、ラムダ(lambda)そしてクロージャに関する説明です。プログラムで変数と制御文を学ぶと次に学ぶのはこの関数ではないかと思います。関数はpythonで一番小さい単位のコードだしコードを再使用ができる文法です。関数の基本構造は下記通りになります。関数はdefで定義して最後にはコロン(:)を付けます。関数領域のはじめはインデントで区分します。インデントが終わるところが関数の末です。パラメータは小括弧の中で定義します。関数を呼び出すところで値を受け取るところです。pythonで関数名を作成する方法は決めてないですが、コード標準では動詞+名詞の形式で作成するようにお勧めしています。他のプログラム言語と似ていますが、動詞、名詞の区分を大文字ではなくアンダーバーで区分します。pythonではパラメータを使う方法が二つあります。一つはパラメータ位置で値を渡す方法(一般的な方法)があり、キーワードでパラメータを渡す方法があります。そしてパラメータの個数を決めなく、可変的に設定することもできます。結果をみれば可変パラメータはタプルタイプになります。パラメータをディクショナリタイプで渡すこともできます。pythonはjavascriptと似ている文法が多いです。インライン関数で関数の中の関数を設定することができます。関数をオブジェクトタイプで設定することもできます。get_functionの中で関数をリターンしました。javascriptの経験がある方ならどの意味か分かると思います。callbackはデザインパターンでvisitパターンで関数をパラメータで渡す意味です。javascriptみたいにcallback関数が作成されました。やはり、スクリプト言語なので似ている文法が多いです。参考にnoneのキーワードは他のプログラム言語だとnullと同じ意味です。この頃になるとjavascriptみたいにクロージャやラムダ(lambda)があるか知りたくなります。pythonもクロージャがあるしラムダ(lambda)があります。クロージャ機能は関数の中で宣言したデータではなく、外部で宣言したデータを持ち込んで使う方法ということです。それならラムダ(lambda)式はどのように実装できましょうか?lambdaの作成方法はコンプ

Study / Python

#python,#function,#inlinefunction,#callback,#lambda

作成日付 : 2020/06/02 20:51:22       修正日付 : 2020/06/02 20:51:22

109

こんにちは。明月です。この投稿はpythonのコンプリヘンション(comprehension)を使用する方法に関する説明です。pythonのデータタイプでリスト、ディクショナリ、タプルなどを説明したことがあります。link - [python] 03. pythonでリスト(list)とタプル(tuple)、そしてディクショナリ(dictionary)、セット(set)コンプリヘンション(comprehension)とはリスト、ディクショナリ、タプルの資料構造をよりしやすく検索、抽出するpythonの文法です。個人的にc#のlinqやjavaのstream apiと似てる文法だと思います。例のため、リストを作りましょう。結果をみれば以前にforの繰り返し式でifの条件で偶数でフィルターして実数タイプに変換しました。forとifをよく知っているとそのように実装します。でもコードステップが少なくても5行目ですね。でもコンプリヘンションを使うと1行目で抽出ができます。コンプリヘンションでを使う方法ではリストなので大括弧([])で始めは出力タイプ、forでlist1から抽出する。条件はif x%2 == 0の意味です。リストコンプリヘンションがあればディクショナリコンプリヘンションもあります。リストとディクショナリが可能ならセットも作られます。そのほコンプリヘンションはifを重ねることもできるし、if〜else構造にすることもできます。ここまでリスト(list)、ディクショナリ(dictionary)、セット(set)のコンプリヘンションを説明しました。上記の形態を見れば、リストは大括弧([])、ディクショナリとセットは中括弧を({})を使用してヒコンプリヘンションを生成します。それを従って括弧でコンプリヘンションができると思い、タプルも小括弧(())でコンプリヘンションができると思われます。でもタプルはコンプリヘンションは存在しません。タプルは修正できないリストだからです。でも、小括弧(())でコンプリヘンションの文法を作成すれば、コンプリヘンションではなく、ジェネレータになります。ジェネレータは、データ構造ではなく、関数の構造であるため、他の投稿で説明します。ここまでpythonのコンプリヘンション(comprehension)を使用する方法に関する説明でした。ご不明なところや間違いところがあればコメントして

Study / Python

#python,#Comprehension

作成日付 : 2020/06/01 19:38:58       修正日付 : 2020/06/01 19:38:58

110

こんにちは。明月です。この投稿は pythonで使う制御文(if, while, for, break, continue)とインデントに関する説明です。制御文という文字とおりにプログラムを制御するキーワードです。例えば、aという変数にユーザー任意の数1をユーザーから受け取る時、偶数の時は「even number」を出力して、奇数の時は「odd number」を出力したいです。その時にaの変数が偶数、奇数かを判断することを制御文といいます。if ~ elif ~ else分岐文と呼ばれるifです。上の例ですこし確認しましたが、その条件式にtrueの条件になると実行する制御文です。if文は、単独で「if」のみを使うことができます。「if〜else」、「if〜elif」として使うこともできます。でも、「elif〜else」や「elif単独」、「else単独」では使えません。注意点は、条件式が終わると、必ずコロン(:)を付けなければならないです。そして、条件式の中の実行区分は、他の言語の場合は、「{}」の中括弧で実行領域を設定するが、pythonの場合はインデントを決定します。インデントは投稿の最後に詳しく説明します。whilewhileはループです。ループは、条件がfalseになるまで繰り返し実行する制御文です。for他のプログラム言語のjavaやc#は、for文は、for初期式、条件式、増減式からなるループです。でも、pythonの場合は、初期式、条件式、増減式ではなく、リストやタプル、ディクショナリ、セットのデータ値をシーケンスどおり取得ループです。break上びwhileとforのループで条件式がありますが、条件によってループ(繰り返し)を強制的に終了するキーワードです。参考にrangeタイプは(初期値、終了値、増加値)からなるデータを作成する関数です。ここで1から10まで1ずつ増加するrange値を順に1,2,3...と出力して、9まで出力すると正常ですが、ループの中にif文があり、iの値が3を超えるとループが止まります。つまり、4になるとbreakで繰り返しをロープが終了することです。それで1から4まで出力することです。ここでbreakを使用すれば、forやwhileにelseを付けることができます。このelse文はループの中でbreakを会わなければ実行される構文です。continuecontin

Study / Python

#python,#if,# while,#for,#break,#contine

作成日付 : 2020/05/29 21:09:08       修正日付 : 2020/05/29 21:09:08

111

こんにちは。明月です。この投稿はpythonでリスト(list)とタプル(tuple)、そしてディクショナリ(dictionary)、セット(set)に関する説明です。一般のプログラム言語の流れだと変数宣言とデータタイプを確認すると次は制御文を確認します。でも、pythonの場合はリスト系のデータ集合から確認します。リストとタプルはデータが集まっている配列タイプでリストは追加、削除が可能、タプルは不可能なタイプです。その中でディクショナリはリストでキーがあるデータセットです。セットはリストと似ていますが、数学の集合計算の和集合、積集合を計算するようなデータタイプです。pythonには同じリストタイプでも種類がもっと精密に分けています。リスト(list)リストは他のプログラム言語と同じく、push(append)とputが存在するリスト構造のアルゴリズムです。リストはpythonで大括弧([])で宣言します。リストには格納、挿入、削除機能もありますが、ソート、コピー機能もあるのでデータ集合管理がしやすいです。タプル(tuple)タプルは上のリスト機能で宣言だけできるし、挿入、格納、削除ができないし、ソート、コピーもできないです。タプルはpythonで小括弧(())で宣言します。タプルの0番のデータを修正しようとすればエラーが発生します。タプルは関数の結果、キーなどで使うタイプです。なのでタプルになっているデータを一つの変数に変換ができますが、それをpythonではタプルアンパッキングといいます。タプルアンパッキングはコンマ(,)の区切りでやりますが、タプルの個数は一致しないとエラーが発生します。ディクショナリ(dictionary)pythonのディクショナリはjavascriptのjsonの構造と同じです。ディクショナリはpythonで中括弧({})で宣言します。セット(set)setは集合計算専用のデータタイプです。つまり、数学の特性をもっているデータタイプです。セットはpythonで中括弧({})で宣言します。ここで区分することはディクショナリも中括弧({})で宣言します。差異はディクショナリはキーがあるしセットはキーがないことです。セットとリストの差はリストはユーザーが格納順番でデータがありますが、セットは順番がありません。格納したことが初めにある可能性もあるし、最後にある可能ですもあります。集合の

Study / Python

#python,#list,#set,#dictionary,#tuple

作成日付 : 2020/05/27 18:49:08       修正日付 : 2020/05/27 18:49:08

112

こんにちは。明月です。この投稿はpythonでデータタイプ、変数宣言そしてコメントする方法に関する説明です。どのプログラムでも最初はデータタイプから確認します。pythonでデータタイプを説明する前に、簡単に変数宣言する方法に説明します。pythonの場合はc++やjavaなどのコンパイル言語と違って別に指示タイプが無いです。javascriptみたいにvarやletを使う必要もありません。ただ、使いたい変数名を宣言して値を格納すればpython内部で自動に変数タイプを指定して値を格納します。結果をみればaの変数に1を格納したらintタイプになることを確認できます。後で、"hello world"のデータを格納したら自動にstringタイプに変換されます。pythonではこんなに自動にデータタイプを設定してデータを変数に格納します。※これかスクリプト言語のいい点ですが、個人的にプログラムが複雑になるとこのデータタイプが固定にならないので、データが変換されると何処で変換されたか把握が大変になります。pythonにはどのデータタイプがあるかを確認しましょう。データタイプが一般プログラム言語より多いです。基本的に文字列、定数、実数、ブールは別に他のプログラム言語でもよくあるタイプです。面白いことは複素数タイプがあることです。複素数タイプは実数と虚数を計算するためのタイプです。数学的な計算や数値計算を行う時に必要なデータタイプだと思います。そしてリストとタプル、dictionaryタイプがあります。リストは文字通り、リストとしてデータを挿入、削除が可能なデータタイプです。リストは挿入、削除が簡単にできるタイプならタプルは配列みたいに一回に挿入すると削除ができないタイプです。つまり、タプルが宣言されたら、挿入、削除、修正ができません。 dictionaryはマップタイプみたいにキーを設定してデータを挿入するタイプです。集合タイプはsetとfrozensetのタイプがあります。 集合タイプはと数学の集合と関係があるタイプです。、和集合、積集合などを計算のためのタイプです。setはデータの変更が可能、frozensetは変更が不可能な集合タイプです。byteとbyte配列とbyteのメモリタイプはバイナリと関係があるデータタイプです。つまり、特定のファイルをバイナリで読み込む時にbyteに変換するこ

Study / Python

#python,#data type

作成日付 : 2020/05/26 18:16:52       修正日付 : 2020/05/26 18:16:52

113

こんにちは。明月です。この投稿はpython3をインストールする方法(anacondaインストール)に関する説明です。ユーザーがプログラムでpcを扱う方法に関して三つがあります。一つはシェルコマンドで操作する方法、二つはプログラム(コンパイルになったプログラム)を実装して実行する方法、最後にスクリプトを作成して実行する方法があります。スクリプトとは一応プログラム言語ですが、c++やjavaみたいにコンパイル(作成したソースを機械語で変換する作業)でバイナリコードに変換することではないですが、シェルみたいに会話式で一つのコマンドで実行することではなくプロシージャ(作業順番)を配置して実行することです。簡単にコンパイルプログラムとシェルコマンドと半分ずつ混ぜているプログラム言語だと思えばよいでしょう。スクリプト言語では代表的な言語はpython、javascript,phpがあります。phpとはスクリプト言語ですがウェブサーバーサイドで使う言語だし、javascriptはウェブクライアント側でよく使うプログラム言語です。javascriptの場合はnode.jsを利用してローカルでも使えますが、個人的にnode.jsとpythonの選択肢があればpythonがもっといいではないかと思います。なぜならpythonの場合はnode.jsよりコミュニティサイズやライブラリの量を考えてもnode.jsより何倍に大きいしプログラム開発もjavascriptよりもっと簡単だし、理解しやすいのでpythonを選択して運用するほうがいいではないかと個人的な考えです。これからpythonをインストールしましょう。pythonを直接にホームページに接続してダウンロードしてインストールすることができます。link - https://www.python.org/pythonホームページで直接にダウンロードしてインストールすれば、後に必要なライブラリがあるとき別々にすべてインストールしなければならないです。でもよく使うライブラリパッケージを含めているpythonバージョンがあります。それがanacondaです。anacondaをインストールするほうが様々ことに楽でしょう。link - https://www.anaconda.com/distribution/バージョンは3.xバージョンと2.xバージョンがあります。参考に2.xと

Study / Python

#python,#install

作成日付 : 2020/05/25 19:02:44       修正日付 : 2020/05/25 19:02:44

114

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

Devlopment note / Java

#java,#HttpConnection

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

115

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

Devlopment note / Java

#java,#Jsoup

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

116

こんにちは。明月です。この投稿はc#の非同期ソケット通信(iocp)-apmパターンに関する説明です。以前、非同期ソケット通信(iocp)に関して説明してその中でeap(event-based asynchronous pattern)に関して説明しました。link - [c#] 非同期ソケット通信(iocp)-eapパターンapmパターンも同じ非同期ソケット通信(iocp)ですが、パターンが少し違うことです。eapの場合はイベントタイプでsocketasynceventargsクラスのcompletedイベントを利用してacceptasyncとsendasync、receiveasyncのクライアント待機、送信、受信をしました。このeapの短所はすべて同じイベントで実行するので可読性がよくない問題があります。それで.net framework 4.0からはasynccallbackのデリゲートを利用してbeginacceptやbeginsend、beginreceiveの関数で待機、送信、受信をします。私の考えでは4.0からはc#がlambda式にも対応することができるのでイベント方式からデリゲート方式に実装が可能になったと思います。個人的にみるとパフォーマンスや概念は別に変わったことは無く、ソースステップがもっとシンプルになったと思います。windowのtelnetのプログラムを利用してデータを受け取るサーバーを作成しましょう。作成が終わったらサーバーを起動してtelnetプログラムで接続します。ipはローカル(127.0.0.1)に設定してポートは10000です。telnetからメッセージを送信したらサーバー側でメッセージをちゃんと受け取ってコンソールに表示します。telnet側にはechoメッセージがちゃんと表示します。終了まで綺麗に送受信ができます。サーバーは作成できましたからこれからクライアントを作成します。クライアントプログラムでもlisten、acceptとconnectの差だけです。サーバーを起動してクライアントで接続しましょう。上のtelnetで接続したことと同じ結果になりました。参照 - https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/ここまでc#の非同期ソケット通信

Devlopment note / C#

#C#,#IOCP

作成日付 : 2020/05/18 18:45:37       修正日付 : 2020/05/18 18:45:37

117

こんにちは。明月です。この投稿はc#の非同期ソケット通信(iocp)-eapパターンに関する説明です。以前、同期ソケット通信に関して説明したことがあります。link - [c#] ソケット(socket)通信をする方法普通の同期、非同期の意味はクライアントとサーバーの連結状態が続いていれば同期だし、非同期は連結を続けていることではなくデータを送受信すれば連結を切断することです。でも、ここで説明する同期と非同期は意味が少し違います。システム内部でスレッドリソースでソケット通信を保持するかどうかの差です。つまり、同期ソケット通信ならsocketクラスをサーバーにlistenしてclientが接続するたびにスレッドを生成してオブジェクトを保持することです。スレッドのリストはvectorやlistで管理して切断する時、オブジェクトを解除することです。でもこの同期ソケット通信はプログラム実装が簡単ですが、リソース問題があります。システムリソースは限定的なので、スレッドとsocketオブジェクトを無限に生成することができません。ゲームサーバーだと考えても同時接続200clientから300clientだけでもスレッドが200個から300個が生成されることです。最近は、ハードウェアが以前より非常に向上になりましたが、c#の長所であり短所であるgc(ガベージコレクション)があるのでリソース管理がしやすくないでしょう。c#というのはインスタンスを生成することは可能ですが、メモリ解除はできません。gcが自動に解除してくれますが、リソースをたくさん使っている状況でサーバーがフリージング状態になっても可笑しくないでしょう。その問題を解決することが非同期ソケットです。非同期ソケットはclientが接続すると接続する時の処理をためのイベントを発生して連結リソースをキュー構造のiocpに格納します。その後からclientからメッセージが発生するとiocpから連結リソースを持ち込んでソケット通信を続けることです。そのことでサーバはthreadを生成する必要がないので、リソースをたくさん節約することができます。非同期ソケットサーバーはスレッドを管理するスレッドプールを生成する必要がないし、スレッドを管理する必要がないので、その部分はソースが簡単になります。これが同期ソケット通信と非同期ソケット通信の差です。非同期ソケットはメモリ効率もいい

Devlopment note / C#

#C#,#IOCP,#EAP

作成日付 : 2020/05/15 19:31:02       修正日付 : 2020/05/15 19:31:02

118

こんにちは。明月です。この投稿はc#でlinqを利用した並列処理(parallel)を使い方に関する説明です。以前の投稿で私がthreadに関して説明したことがあります。link - [c#] 37. スレッド(thread)を使い方、thread.sleep関数を使い方スレッドというのはプログラム内でいろんな処理を同時に処理、つまり、同時に処理してシステムの性能を向上させる機能です。でも、このスレッドは個数が無限的に増やすこともできないし、どのぐらいにスレッドが多くなると性能低下になるため、個数管理するthreadpoolが存在します。しかし、このthreadpoolはjoin機能が無くて、eventwaithandleクラスで同期化する機能を別に作成しなければならない不便なこともあります。linq式ではこの問題を解決する並列処理を作成できます。上の例をみればnodeクラスのインスタンスをlistに格納して、linq式のasparallel関数を呼び出すことなら並列処理になります。withdegreeofparallelismの関数を通ってparallelのスレッドの最大個数を設定してforallを通って実行します。forallはラムダ式で設定してパラメータはlistに設定されたnodeインスタンスを取得して実行します。ここまで見るとthreadとthreadpoolの欠点がなくなる機能ではないかと思います。parallel機能をlistだけ付けて使うことではなく、staticタイプのクラスで独立的に使うことができます。parallelクラスの並列処理は基本の形はfor関数です。意味はforの初期式、条件式、増減式をparallelで設定することです。つまり、forを並列に処理することです。parallelのforeachはforeach文を並列に処理する関数です。形式はlistタイプのデータを始めのパラメータに入れて、ラムダ式で各データを取得して並列処理になります。上のれ例は別に関係ないラムダ式を並列処理にしました。invoke関数のパラメータはparamsの処理なので可変的にラムダ式を入れられます。この投稿を作成しながら思いましたが、linq式のasparallel()の関数は自分もよく使える関数です。parallelクラスは別に使ったらいい利点がなさそうです。実は私も投稿を書く前には単純にaspa

Study / C#

#C#,#Socket

作成日付 : 2020/05/13 17:37:13       修正日付 : 2021/09/29 19:29:03

119

こんにちは。明月です。この投稿はc#のnpoiを利用してexcelを読み込んで出力する方法に関する説明です。以前の投稿でc#でエクセルファイルを生成する方法でnpoiのライブラリを説明しました。link - [c#] npoiライブラリを利用してエクセルファイルを生成する方法今回はnpoiを利用してエクセルを生成することではなく、エクセルのテンプレートを読み込んでエクセルを出力する方法に関して説明します。例のデータは始めの列は月、二つ目は温度平均、三つ目は午前の温度、四つ目は午後の温度です。右下のグラフは基本の表の数値の基盤で表れた一年間の気温平均です。ここでやろうと思うことはエクセルで温度平均は関数でカラムを関数で計算するし、グラフもb列のデータで表示するので、エクセルを読み込んでc列のデータとd列のデータを修正すればb列のデータが更新されグラフが変わるかを確認しましょう。npoiを利用するためにnugetからライブラリをダウンロード及び連携しましょう。これからエクセル生成したディレクトリに移動してファイルを開きましょう。結果をみれば既存b列のデータをc列のデータが変更されました。そのあとb列の関数データが更新され、グラフの結果まで更新されました。作業しながらなぜかc列とd列のデータを変更することだけでb列のデータが自動に更新されませんでした。トリガーみたいな呼び出しが必要らしいです。私の場合はsetcellformula関数を利用してエクセル関数を再設定しました。グラフの場合はb列のデータが変わることですぐデータが反映されます。私の例の場合は簡単なデータを扱うので別の最初からエクセルを作成することと読み込んで後修正することとの差異がありません。でも、実務ではかなり複雑なデータを扱う可能性が高いです。その時、最初からエクセルをc#で作成することはすごく大変だと思います。デザインまで必要な部分ならスタイル設定はフォント設定まで必要です。エクセルをもっと知る方ならvba領域も考えなければならないです。それをすべてc#で作成することになると複雑です。なのでプログラムのパフォーマンス部分もすごく遅くなります。なので実際はある程度にエクセルを作成してc#で読み込んで後データ値だけ更新することでエクセル出力する仕様が多いです。ここまでc#のnpoiを利用してexcelを読み込んで出力する方法に関する説明でした。ご不

Devlopment note / C#

#C#,#NPOI

作成日付 : 2020/05/08 10:43:52       修正日付 : 2020/05/08 10:44:48

120

こんにちは。明月です。この投稿はc#でnpoiライブラリを利用してエクセルファイルを生成する方法に関する説明です。npoiライブラリはapache財団で提供するエクセル、パワーポイント、ワードファイルフォーマットを運用するためのライブラリです。元はjavaのpoiライブラリから始まりましたが、c#でも使うためにnpoiの名でライブラリを提供していることです。それならこれからnpoiを使ってエクセルを作成しましょう。npoiを使うためにnugetを利用してライブラリをダウンロードと連携します。これからエクセル生成したディレクトリに移動してファイルを開きましょう。xlsバージョンとxlsxバージョンはnamespaceが違うし扱うクラスも違います。でも、クラスは違いますが、インタフェースは iworkbook과 isheetで作業するのでクラスを割り当てする時だけ分けて、次からはインタフェースで運用するとバージョン関係せずにエクセルを扱うことができます。上の例では基本的にnpoiでよく使うデータ格納、関数式、色の設定、セルのスタイル設定まで実装しておきました。npoiのapiはすごく多いので、下記のurlのドキュメントを参考してください。link - https://poi.apache.org/apidocs/(javaのドキュメントですが、使用方法はc#と同じです。)でも、実際の業務ではexcelを始めから生成して出力することは少ないです。普通はexcelのテンプレートを作成して、そのテンプレートを参照して出力する方法で使います。その方法に関しては別の投稿で紹介します。ここまでc#でnpoiライブラリを利用してエクセルファイルを生成する方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#NPOI

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

121

こんにちは。明月です。この投稿はc#でgeckoライブラリを利用してウェブスクレイピングする方法に関する説明です。htmlのレイアウトエンジンとはhtmlドキュメントとcss style、javascriptを画面に描画するレンダリングするエンジンです。レンダリングエンジンの種類は代表的にmsのieとmozilla財団のgeckoがあります。ieレンダリングのmshtmlがありますが、ie 8.0バージョンまではc#で参照して使えます。ieの8.0バージョンはもう10年前のレンダリングエンジンだし、今のスタイルなら様々でエラーが発生するかもしれません。geckoレンダリングは60バージョンです。ieより最新バージョンです。geckoレイアウトのライブラリはc#のnugetでダウンロード及び連携が可能です。ブラウザライブラリは一応、windowのprocメッセージのキューが必要なのでwindow forms appでプロジェクトを生成します。そしてnugetを通ってgeckoライブラリを連携します。上のイメージをみれば以前45バージョンもあります。45バージョンで作成するなら60バージョンと同じです。ここでは60で作成します。一応、私のosは64ビットなので64ビットで作成します。 32ビットも作成方法も同じです。windowデザインフォームの隣のtoolbarをみればgecko-browserコントロールができたことを確認できます。このwindowsフォームにdrap&dropした後でプロパティのdockをfillに合わせています。これからfirefox.dllファイルを注入する必要があります。右program.csファイルを開いて,下記のソースを追加します。そして右のform1.csファイルを右クリックしをして、ソースビューでソースを開きます。上みたいにスクレイピングソースを作成しました。結果みたいにスクレイピングになったことを確認できます。-- もしエラーが発生する場合 -- 1. 64ビットに設定しても64ビットでできない場合があります。デバッグ設定をx64に変更すれば解決できます。デバッグのpropertyメニューを開きます。メニューのbuildタブでプラットフォームをx64に変更すると解決できます。2. dllファイルを読み込めませんというエラーメッセージが発生する可能性があります。この場合はd

Devlopment note / C#

#C#,#Gecko

作成日付 : 2020/05/05 00:52:26       修正日付 : 2020/05/05 00:55:27

122

こんにちは。明月です。この投稿はcでpdfを作成する方法(itextsharp)に関する説明です。プログラムを運用すれば結果レポートや帳票などを出力する場合が多いです。その時にcsvファイルやexcelファイル、xmlファイルタイプで出力する場合があります。その中で契約書やデータ形式ではなくドキュメント形式、でも編集ができないタイプで出力したい場合はpdfを利用します。c#でpdfを出力するために提供するオープンライブラリはitextsharpがあります。itextsharpを使うためにnugetを利用してダウンロードして連携します。itextsharpライブラリを連携したらソースを作成してpdfを出力しましょう。上のhtmlからファイルを生成することまで下記の流れになります。「filestream -> pdfwriter取得 -> pdfwriterpipeline生成 -> htmlpipeline生成 -> cssresolverpipeline生成 -> xmlworker生成 -> xmlparser生成 -> xmlparserによってhtmlをpdfに変換する。」ということになります。上のcssファイルを実行するデバッグフォルダに置きます。実行すると「simple.pdf」というpdfファイルが生成されます。結果は上のとおりに出ました。私は簡単にソースを作成しましたが、少しhtml作成する部分とcssを紐づく部分を整理すると一般プロジェクトにも十分に使えると思います。ここまでcでpdfを作成する方法(itextsharp)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#iTextSharp

作成日付 : 2020/05/03 10:22:40       修正日付 : 2020/05/03 10:22:40

123

こんにちは。明月です。この投稿はc#でシリアライズ(serialization)をする方法に関する説明です。シリアライズとはメモリに割り当てしているクラスのデータをバイナリ化することです。つまり、クラス内部で変数のデータをすべてbyteタイプに変換することだと思えば良いです。シリアライズは昔にたくさん使った記憶がありますが、最近はシリアライズよりjsonタイプに変換してデータ化することがトレンドなので、最近はよく使わないみたいです。link - [c#] newtonsoft.jsonライブラリを利用してjsonデータ構造を扱う方法でも、newtonsoft.jsonを利用してデータをjsonタイプに変換することはクラスのpublicタイプだけ変換するし、データをすべてstringタイプに変換するので、限界があります。シリアライズはpublicデータだけではなく、privateも構造化するし、クラス自体をすべてbyteタイプに変換することなので、クラス自体を格納することではよいです。でも、シリアライズも短所があります。バイナリ化するので、当該なデータを人が読みにくいです。なのでメモ帳でデータ変更ができないです。また、クラス自体を変換しましたから、クラスが変更がある場合に復元ができない可能性もあります。jsonも場合はプログラム言語に関係しずに、読み込む移植性がよいですが、シリアライズはc#で作成したらc#しか読み込まれないです。正確にはクラス変更や他のプレートフォームでも読み込まられないことではないですが、データ漏れが発生したり、データが可笑しくなる可能性があります。つまり、バグ発生する可能性があることです。仕様によってシリアライズがよいかjsonを使うかを正しく選択して使う方がよいです。nodeというクラスをシリアライズしてbyte[]タイプに変換しました。変換してファイルに格納します。また、格納したファイルを読み込んでデシリアライズでbyte[]データをクラスタイプに変換します。ファイルをメモ帳で開きました。人が解析することでは無理があります。ここまでc#でシリアライズ(serialization)をする方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#Serialization

作成日付 : 2020/04/30 19:32:04       修正日付 : 2020/04/30 19:32:04

124

こんにちは。明月です。この投稿はc#でdynamicタイプの動的パラメータ-dynamicobject(winformでasp.mvcのviewbagオブジェクトを使用する方法)に関する説明です。asp.mvcのcontrollerでview(.cshtml)にデータを渡す時、viewbagというオブジェクトを使う場合があります。viewbagというオブジェクトはすごく便利です。可読性やパフォーマンスはよくないですが、クラスを一々宣言する必要なしでそのままに動的なプロパティを生成してデータを格納、取得するの可能です。でも、viewbagとはasp.mvcだけで使うものなので、それを同じ仕様で実装してc#のwindowフォーム開発する時にも使ってみましょう。コントロールでviewbagオブジェクトに任意のプロパティにデータを格納しましょう。viewファイルはviewbagの任意のプロパティからデータを取得しましょう。link - 参照リンクを作成中コンソールのプロジェクトを生成してviewbagを使ってみましょう。viewbagオブジェクトがありませんというメッセージが表示されいます。私がc#でwindowを作成する時、値を渡すために一つ一つエンティティクラスを生成して開発したことがあります。そのため、一回性の値のクラスがだんだん多くなったし、プロジェクトがすごく大きくなったし、その結果、プロジェクトの管理性、可読性、パフォーマンスなどがすべて悪くなった経験があります。それで、window form開発する時にもasp.mvcのviewbagを使ったらすごく便利かと思いました。探してみたらありました。link - https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework-4.8前からこのことを知ってたらよかったのにという物足りなさがあります。ここまでc#でdynamicタイプの動的パラメータ-dynamicobject(winformでasp.mvcのviewbagオブジェクトを使用する方法)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#dynamic,#ViewBag

作成日付 : 2020/04/29 22:41:32       修正日付 : 2020/04/29 22:41:32

125

こんにちは。明月です。この投稿はc#でstringの補間式(interpolation)に関する説明です。最近、c#のコード標準でstringの補間式に関して説明がありました。既存、c#でstringのフォーマットを使うとstring.format関数を利用しましたが、それが数字で「{0},{1}」で表現するので、可読性が悪いです。なので、もっと可読性を上がるため、に補間式(interpolation)があり、もっとフォーマットをしやすく表現できます。link - https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolatedstringでstringの補間式を使うために、ダブルクォートの前に「$」を付けて設定することで使えます。stringのの補間式(interpolation)は下記とおりになります。 要素 説明 interpolationexpression 形式化する結果を生成する表現式です。nullの結果のライン表現はstring.emptyです。 alignment 補間表現式の結果の文字列で最小文字数を定義する定数式です。正の場合は、文字列表現が右揃えされます。負の場合は左揃えです。 formatstring 式の結果タイプによってサポートされる形式の文字列です。 補間表現式は三項演算子でも計算可能です。中括弧の表現は中括弧を重ねることで表現できます。ここまでc#でstringの補間式(interpolation)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#interpolation

作成日付 : 2020/04/27 20:39:57       修正日付 : 2020/04/27 20:39:57

126

こんにちは。明月です。この投稿はc#でnewtonsoft.jsonライブラリを利用してjsonデータ構造を扱う方法に関する説明です。まず、jsonに関して説明しますとjsonとは(キー,値)構造で人が認識できる開放型標準データフォーマットです。私が10年前に開発する時にはxmlの構造でデータを扱うことが多くありましたが、最近はほとんどjsonタイプのデータを扱うプログラムが多いです。でもxmlを使わないことではないけれども、xmlより直観的な構造だし、データ修正がxmlよりしやすいからだと思います。(xmlはタグの開き、閉めが間違っても全体エラーが発生します。)そのため、プログラムライブラリでjsonを読み取るか書き込むのライブラリが多いですが、newtonsoft.jsonがたくさん使うし、一番機能が多いので紹介します。まず、nugetでnewtonsoft.jsonライブラリを連携しましょう。結果をみれば、stringタイプのjsonデータがクラスに変換されたし、クラスのデータがstringタイプのjsonデータに変換することを確認できます。注意点はjsonタイプでシングルクォートはstringでないことは定数に表記されます。なのでjsonとクラスのデータタイプが合わない場合にはエラーが発生します。後、上のことはプロパティ名とjsonのキーを一致しましたが、仕様によって一致できない場合もあります。その場合はjsonpropertyアトリビュートを利用して設定が可能です。newtonsoft.jsonのライブラリは様々な機能がありますが、私の基準では上の以外には使わないです。ここまでc#でnewtonsoft.jsonライブラリを利用してjsonデータ構造を扱う方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#Newtonsoft.JSON

作成日付 : 2020/04/23 20:19:53       修正日付 : 2020/04/23 20:19:53

127

こんにちは。明月です。この投稿はc#でemailを送信する方法(system.net.mail)に関する説明です。プロジェクトでよく使う機能と思えばemailを送ることではないかと思います。例えば、ウェブページでユーザ登録からパスワード初期化、お知らせのメールなど様々で使います。c#ではメールを送信する方法がいろいろありますが、その中で.net frameworkのsystem.net.mailを使う方法があります。system.net.mailの場合は.net frameworkの基本の機能なので別にnugetを利用してライブラリを連携する必要がないです。ソースは作成しました。その後、smtpサーバーを設定しましょう。私の場合はgoogleメールを利用します。google mail - https://support.google.com/a/answer/176600?hl=ja先にクロームに接続して右上のアカウント管理に行きましょう。(ログインができなかった状況なら先にログインしてから。)アカウント管理に移動して安全性の低いアプリのアクセスのタブに移動します。安全性の低いアプリの許可を有効にします。このチェックをしないと外部からグーグルメールを使用できないようにすることです。なので、idやpwの漏れがなければそんなに問題はありません。上のソースを実行してメールを送信しましょう。プログラムが正常に実行されました。gmailのメールの受信トレイを見れば、メールが届いたことを確認できます。ここまでc#でemailを送信する方法(system.net.mail)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#Email

作成日付 : 2020/04/22 19:00:42       修正日付 : 2020/04/22 19:00:42

129

こんにちは。明月です。この投稿はc#で環境設定ファイルを扱う方法(system.configuration)に関する説明です。プログラムを作成する時にプログラムによって環境ファイルを設定する場合があります。例えば、ログファイルの格納パスやサーバによって設定するデータなどです。以前、c++ファイルの場合はiniファイルを設定ファイルによく使いました。もちろん、c#でiniファイルを使えないことではないですが、基本xmlファイルで環境設定を行います。javaの場合「.property」ファイルが環境ファイルでよく使います。(xml形式も多いです。)c#ではxmlになっているapp.configファイルを環境ファイルでよく使います。プロジェクトを生成すればc#は基本的にapp.configファイルが生成されます。その後、app.configファイルにデータを設定してプログラム上で読み込みます。appsettingsのタグの中でaddタグを追加します。ここでkeyというアトリビュートはプログラムで読み込むキーでvalueは値です。configファイルを読み込むためにライブラリを追加しなければならないです。(app.configは基本的に生成されるのにライブラリは追加することで。。)configurationmanager.appsettingsクラスにindexer形式でキーの値を入れればapp.configに設定した値を取得できます。プログラムをリリースしたらapp.configファイル名は「プロジェクト名.exe.config」で変更されます。ここまでc#で環境設定ファイルを扱う方法(system.configuration)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#System.Configuration

作成日付 : 2020/04/20 19:37:57       修正日付 : 2020/04/20 19:37:57

130

こんにちは。明月です。この投稿はc#でreflectionを利用してクラス複製する方法に関する説明です。oopでクラス複製することはプロトタイプパターン(デザインパターン)によってクラスを複製する方法があります。結果をみればnodeとnode1は同じクラスです。その意味はnodeでdataの値を修正したらnode1にも影響があると意味です。でもnode2の場合は複製になったのでnodeと違うクラスです。その意味はnodeのdataの値が修正してもnode2は影響がないと意味です。上の結果見ればnode.dataが2になっていることを確認できます。クラス複製をするようにはmemberwiseclone関数を利用すべきですが、memberwiseclone関数はobjectクラスのprotectedタイプです。その意味は私が作成するクラスつまり、memberwiseclone関数を使うことができる状況なら複製ができますが、ライブラリのクラスや修正ができないクラスの場合はクラス複製ができないと意味になります。その場合は新しくnewキーワードを使ってメモリ割り当てして変数の値を一々にコピーことしかないです。でもこれも問題があるのはpublicの値は出来ますが、privateやprotectedはコピーが不可能なので、クラス複製ができないと意味になります。上の状況ならdata2を設定する方法がないです。完全にコピーができないです。それをreflectionを利用して解決ができます。link - https://www.nowonbun.com/34.htmlクラスでmemberwisecloneを利用しなくてクラス複製になりました。nodeクラスの修正がなしで外部でクラスコピーができるといみです。ここまでc#でreflectionを利用してクラス複製する方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#Reflection,#proto

作成日付 : 2020/04/17 00:34:33       修正日付 : 2020/04/17 00:34:33

131

こんにちは。明月です。この投稿はc#でxmlをxpathを利用してデータを取得する方法に関する説明です。以前、xmlをcssselectorエンジン(sizzle)みたいに要素を検索してデータを取得する方法に関して説明したことがあります。link - [c#] nsoupライブラリを利用してxmlとhtmlをパーシングする方法最近はxpathを利用して検索することよりnsoupのライブラリを利用してデータを取得することが一般的なことになりました。でも、sizzleエンジンの要素を検索する方法の以前はxpathで検索することが一般的だったんです。でも、xpathの方法が悪いことではなく、css selectorで検索するキーが単純だし、理解しやすいのでよく使うことです。でも以前の方法がもっとよい時があります。例えば、xmlから一つのデータとノードを検索することではnsoupのほうがいいです。でも、xmlの全体を構造化するしクラスを変換することではreaderを利用するかもっと明確なルールを決めて検索することならxpathがよいです。stringで正規表現でreplaceするか、ただ特定文字でreplaceするかの差と似てます。実はxpathを使うためにはxpathを詳しく知らなければならないですが、いつかxpathは別途で説明します。xpathを使うために以前で使った私のブログの検索エンジンに登録するようなrssファイルを使いましょう。link - https://www.nowonbun.com/rssxpathを利用するクラスのnsoupみたいにオープンソースではなく、system.xmlの.net frameworkを使います。コンソールの結果をみればrssのtitleのタグの内容だけ出力したことを確認できます。後、descriptionのタグのテキストデータを変更して、ファイルに格納しました。結果を確認すればdescriptionタグの内容が変更されたことを確認できます。nsoupとsystem.xmlの差はnsoupの場合はhtmlまで検索ができます。でも、system.xmlの場合はhtmlファイルが検索ができません。htmlを読み込めば許せないアトリビュートや開き閉めタグタイプではないこと(inputタグ)などでエラーが発生します。個人的にはほぼnsoupを使いますが、逆に環境ファイルのxml

Devlopment note / C#

#C#,#Xml

作成日付 : 2020/04/16 00:47:17       修正日付 : 2020/04/16 00:47:17

132

こんにちは。明月です。この投稿はc#でnsoupライブラリを利用してxmlとhtmlをパーシングする方法に関する説明です。最近、プログラムを作成する時に環境設定ファイルとしてxmlを利用することがあります。以前はxpathを利用してxmlを探索して値を取得しましたが、jqueryのライブラリが登場してcssselectorエンジン(sizzle)の概念が生じ、classやidなどのアトリビュートで検索する方法ができました。nsoupライブラリはxmlやhtml形式にあるファイルやデータをcssselectorで探索するライブラリです。個人的にxpathはxmlを探索する時にもっと明確に検索ができますが、javascriptや様々でcssselectorをよく使う今はcssselectorタイプで探索するほうがもっとしやすくなったと思います。visual studioでnsoupライブラリを使うためにnugetを利用してライブラリをダウンロード及び連結しましょう。私のブログで検索エンジンに登録するようなrssファイルがあります。それをnsoupライブラリを利用してタイトルだけ取得します。上のxmlファイルを取得してitemのtitleタグのデータをコンソールに出力しました。 jquryでelement探索することと同じ方法で探索が可能です。nsoupの場合は探索だけではなく、書き直し機能もあります。上のdescriptionのテキストを「hello world」に書き直しました。そのあと、コンソールにxmlを出力しました。descriptionの部分が「hello world」になっています。ここまでc#でnsoupライブラリを利用してxmlとhtmlをパーシングする方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#Nsoup

作成日付 : 2020/04/14 19:34:15       修正日付 : 2020/04/14 19:34:15

133

こんにちは。明月です。この投稿はc#で日付フォーマットに関する説明です。以前、数字フォーマットに関して、桁数とお金表示などを説明したことがあります。link - [c#] 数字フォーマット(お金表示及び小数点以下表示)日付フォーマットはdatetimeのデータタイプをでtostringやstring.formatを利用して変換ができます。日付フォーマットは置換文字が多いです。基本的に「yyyy」は年度、「mm」は月、「dd」は日、「hh」は時間、「mm」は分です。ここで「mm」は「mm」は小文字、大文字で月、分の区分にします。気を付けなければならないです。 フォーマット指定子 説明 例 d 日: 1日から31日まで 2009-06-01t13:45:30 -> 1 dd 日: 01日から31日まで(10日の未満は十桁に「0」をつける) 2009-06-01t13:45:30 -> 01 ddd 曜日(略称) 月、火、水。。 dddd 曜日(プル名) 月曜日、火曜日、水曜日。。 f ミリセカンド1桁(なければ0に満たす。) 2019-08-05 12:00:00.1 -> 1 ff ミリセカンド2桁(なければ0に満たす。) 2019-08-05 12:00:00.12 -> 12 fff ミリセカンド3桁(なければ0に満たす。) 2019-08-05 12:00:00.123 -> 123 ffff ミリセカンド4桁(なければ0に満たす。) 2019-08-05 12:00:00.1234 -> 1234 fffff ミリセカンド5桁(なければ0に満たす。) 2019-08-05 12:00:00.12345 -> 12345 ffffff ミリセカンド6桁(なければ0に満

Devlopment note / C#

#C#,#DateFormat

作成日付 : 2020/04/09 20:53:20       修正日付 : 2020/04/09 20:53:20

134

こんにちは。明月です。この投稿はc#のログライブラリ(log4net)を設定する方法に関する説明です。プログラムを開発する時にvisual studioなどのideツールでデバッグ機能を通ってプログラムの流れを把握することができます。それで開発中でエラーが発生するか間違う結果が出る時にはデバッグ値を追跡してソースコードを修正することができます。でも、開発が終わって本番(production)にビルドしたものをサーバにデプロイして運用する時にもバグが発生する可能性があります。その時には別にエラーログを作成する機能がなければエラー原因と問題を把握することが大変になります。そのため、出来る方法でログを残して(テキストファイルやデータベースにエラー内容を格納すること)プログラムの流れを記録します。問題が発生する時に、ログ内容を追跡してエラーを予測するか見つけることができます。その以外にログを通ってユーザの行動パターンの分析、追跡、学習などの統計資料も必要です。c#ではログを作成するライブラリは代表的に二つがあります。elmahとlog4netがあります。elmahも随分多いプロジェクトで使っていると思いますが、個人的にlog4netをお勧めです。理由はlog4net、log4j、log4phpなどで他のプログラム言語でも使っているライブラリなので、互換性がよいし、ライブラリのコミュニティも大きいので様々な情報や派生ライブラリを得やすいです。それならlog4netを使うためにはnugetを利用してlog4netを連結します。パターンレイアウトと領域を確認するとパターン式があることを確認できます。 パターンレイアウトに関しては詳しく説明したいですが、別に大事部分ではないし、パターンレイアウトの内容が多いので、log4netのapiで直接に確認するほうがよいです。参照 - https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/patternlayout.html別にレイアウトに関して問題なければ、「%d [%t] %-5p %c - %m%n」の式はよいです。ここまで設定すればログを使うことができます。でも、実際に本番(production)に使うと思えばログ設定がソースの中にあるので、設定ができないです。パラメータで設定ができますが、それはそれで設

Devlopment note / C#

#C#,#Log4Net

作成日付 : 2020/04/08 13:04:22       修正日付 : 2020/04/08 13:04:22

135

こんにちは。明月です。この投稿はc#でzipの圧縮ファイルを解凍するコードを作成する方法に関する説明です。以前、c#でファイルをzipアルゴリズムで圧縮するソースコードに関して説明したことがあります。link - [c#] zip圧縮コードを作成する方法その投稿にも説明しましたが、zipアルゴリズムは様々なところでよく使うアルゴリズムです。ionicライブラリと.net frameworkを利用して圧縮する方法に関して説明しましたが、解凍も同じで作成しましょう。ionicライブラリionicライブラリは外部ライブラリなのでnugetを通ってionicライブラリをダウンロードと連結をしましょう。zipファイルの状況は下記のイメージになっています。解凍しましょう。実行しました。解凍されました。.net framework内部を利用する方法先に「system.io.commpress」と「system.io.comppression.filesystem」を追加しましょう。zipファイルの状況は下記のイメージになっています。解凍しましょう。実行しました。ionicと.net frameworkにあるライブラリで圧縮することと違ってソースの差異があります。ionicの場合は圧縮のファイルを読み込んで解凍することではなく、extractallの関数を呼び出しで一括で解凍されます。標準ライブラリの場合は一つ一つの圧縮ファイルを読み込んでioで作成することです。個人的に解凍の場合は標準ライブラリがよいと思います。一つ一つのエラー確認やソース応用が可能することを比べてionicの場合は解凍ソースはすごく簡単だけど、一つのコントロールが難しいなので様々ところで使いにくいと思います。ここまでc#でzipの圧縮ファイルを解凍するコードを作成する方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#zip

作成日付 : 2020/04/07 11:17:44       修正日付 : 2020/04/07 11:22:01

136

こんにちは。明月です。この投稿はc#でzip圧縮コードを作成する方法に関する説明です。zip圧縮アルゴリズムは私の考えて世界の中で一番よく使う圧縮アルゴリズムではないかと思います。アルゴリズムの優秀性もいいけれども、zip圧縮アルゴリズムに関して多いライブラリがあり、接近性と便利性がよいからよく使うと思います。c#の.net framework内部でもzipアルゴリズムがあります。そのため、.net frameworkのソースをを利用して圧縮する方法と、ionicライブラリを利用して圧縮する方法があります。二つのライブラリでパフォーマンスの差がありません。ソースのステップの差もないので、ユーザが気になるもので使えばよいです。ionicライブラリionicライブラリは外部ライブラリなのでnugetを通ってionicライブラリをダウンロードと連結をしましょう。d:\work\compresstestのディレクトリを圧縮しましょう。実行しました。圧縮ファイルが作成されたことを確認できます。圧縮ファイル内を確認しましょう。圧縮が正常にできました。.net framework内部を利用する方法先に「system.io.commpress」と「system.io.comppression.filesystem」を追加しましょう。d:\work\compresstestのディレクトリを圧縮しましょう。実行しました。圧縮ファイルが作成されたことを確認できます。圧縮ファイル内を確認しましょう。ionicライブラリと標準ライブラリを利用するソーススタイルが似てます。圧縮解凍は少し差がありますが、圧縮することは同じです。そうすると標準ライブラリを使うほうがオープンライブラリを利用することより良いと思います。ここまでc#でzip圧縮コードを作成する方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#Zip

作成日付 : 2020/04/06 14:56:13       修正日付 : 2020/04/06 14:57:21

137

こんにちは。明月です。この投稿はc#で数字フォーマット(お金表示及び小数点以下表示)に関する説明です。我々がプログラム上で数を扱えばintやdouble、decimalのデータタイプで数を使います。その中で計算はおそらくお金と関係があることが多くないかと思います。でも、お金を計算した結果を出力する時に単純に数だけ表現すると見づらいことになります。特に億や兆単位までなれば行くと間違って読んで間違って判断する可能性もあります。数を間違って読むことはお金の単位は100万円ですが、コンマなしで1000000円のことに出力されたら一目で100万円に認識するのが難しいことです。つまり1000万円のことで誤解することがあります。1億の場合は100000000 です。そのため、我々は誤解しないようにコンマを表示して数の単位を区分します。上の例をみれば変数に1億を格納して「#,##0」のフォーマットで出力フォーマット(tostring関数)を設定してお金形式で表示しました。エクセルを使ったことがある方なら数字フォーマット形式を知るかもしりません。数字を表現することで「0」と「#」があります。この差は「0」の場合は数字データが当該な桁数でデータがなくても「0」を表示することだし、「#」の場合は表示しないことです。すなわち、フォーマットを「0,000」に設定して「1」のデータを出力すると下記の結果が出力します。数字は基本「0」と「#」で表現しますが、その以外の表現を説明します。数字フォーマッティングは「tostring」がよく使いますが、状況によってstring.formatを利用する時もあります。cultureinfoクラスを利用してお金を表示する方法もあります。cultureinfoはシステムによって地域別お金を表示する方法です。つまり日本なら日本の形式でアメリカならアメリカタイプに表示する機能です。link - https://docs.microsoft.com/ja-jp/dotnet/api/system.globalization.cultureinfo?redirectedfrom=msdn&view=netframework-4.8ここまでc#で数字フォーマット(お金表示及び小数点以下表示)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#decimal format

作成日付 : 2020/04/03 00:38:37       修正日付 : 2020/04/03 00:46:31

139

こんにちは。明月です。この投稿はc#でftpに接続してファイルダウンロード、アップロードする方法に関する説明です。プログラム通信上でよく使うプロトコールはhttp、mail(メール)があるし、ftpがあります。sambaもネットワーク通信ですが、プロトコールではなく、ユーティリティ名だし、プログラム内で通信設定が必要なことではなく、os側でネットワークドライブを割り当てして使うかlinux環境ならmountして内部ディスクみたいに使うので、プログラム内で別途で開発が必要なことではないです。率直に全然要らないことではないですが、しやすい方法を置いて大変に開発する必要はありません。最近はcloudやwebサーバのrest apiを利用するか、またはhttpヘッダを利用してcontext-typeをapplication/octet-streamに指定して直接にウェブサーバにアップロード、ダウンロードする方法でファイルを管理するので、以前みたいにftpをよく使いません。また、ファイルストレージではなく、アプリサーバ(ゲームサーバなど)でも以前みたいに直接にサーバを開発することより、webサーバにつけて使う方法になったので、データ格納サーバ(ftpサーバ)を別途で構築せずに開発するのが最近のトレンドです。(必ずwebサーバではなく仕様によって違います。)でも、逆にftpプロトコールはhttpプロトコールと似ていることが多し、以前より良いライブラリも多いので、よく使うことになると様々なサービスのパフォーマンス改善によくなると思います。以前にftpサーバを構築する方法に関して説明したことがあるから参考してください。link - [window] windowでftpサーバを構築する方法link - [centos] ftpインストールする方法(vsftpd)上のソースをみればftpからリストを取得する時にディレクトリやファイルの区分がありません。もちろん、検索メソッドをlistdirectoryではなく、listdirectorydetailでするとファイルとディレクトリの区分ができますが、結果パーシングしなければならないし、様々なことに大変になるのでtry~catchを利用してファイルとディレクトリを区分する方が簡単です。実はtry~catchで分岐することはパフォーマンスで致命的に悪いのでできればif~elseで

Devlopment note / C#

#C#,#ftp

作成日付 : 2020/03/27 19:20:14       修正日付 : 2020/03/27 19:21:49

140

こんにちは。明月です。この投稿はc#のhttpwebrequestを利用してウェブページを読み込みする方法に関する説明です。我々がプログラミングをする時にウェブのオブジェクトを読み込みが必要な時があります。例えば、ブログのrssあるいはsitemapのxmlを読み込みするかまたはウェブページの情報を取得する必要な時です。でもhttpwebrequestはウェブページだけ読み込むことでスクレイピングとは意味が違います。スクレイピングはウェブのレンダリング、つまり、javascriptの動的に処理されたデータを読み込むデータを取得することです。httpwebrequestはウェブレンダリングがされてない純粋なページの要素データを読み込むことです。httpプロトコールは単純なソケット方法で要請(request)と応答(response)が終わればソケット接続を終わらせる流れです。プロトコールの中でヘッダを定義して要請すればそのヘッダ値に合わせて応答することがhttpプロトコールです。httpプロトコールはソケットでたくさん使うオブジェクトです。それでc#にはhttpwebrequestのクラスがあってそれを簡単に接続してデータを取得できるようになっています。上のソースをテストするようにphpファイルを作成しましょう。「200」は応答コードでgetrequest関数の中でresponse.statuscodeをコンソール出力したことです。「200」は正常です。私がgetrequest関数を二回に呼び出したので、二つの結果を受け取りました。始めはgetタイプで接続したので、getの変数に「test」というデータがあります。二つ目はpostタイプで接続したので、postの変数に「test」というデータがあります。ここまでc#のhttpwebrequestを利用してウェブページを読み込みする方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#C#,#HttpWebRequest

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

141

こんにちは。明月です。この投稿はc#でbase64のエンコード、デコードする方法に関する説明です。base64とはbyteタイプになっているバイナリデータをプログラムの間にもっと扱いやすくするため、asciiコードに変換したデータをbase64といいます。簡単に説明すると「byteデータやstreamデータをstringタイプに変換したことです。そのstringタイプになっているデータもエンコードタイプに関係ないasciiコードになっている」ということで理解するとよいです。簡単なファイルを読み込んでbase64タイプに変換しましょう。「hello world」というテキストを作成したファイルを準備しましょう。そしてそれをbyteタイプに読み込んでbase64に変換しましょう。結果をみればhello worldのバイナリが暗号コードみたいに変換されました。また、bsse64になったコードをstringタイプに変換して出力しましょう。コンソールで「hello world」という結果が表示されました。プログラム間に通信する時にbase64コードでエンコード、デコードすれば逆にデータが大きくなるので、非効率的です。ただ、byteタイプに送信すればよいからです。でも、このbase64が必要な時があります。例えば、バイナリタイプをstringタイプに変換する時です。暗号化する時にも必要な時があります。ここまでc#でbase64のエンコード、デコードする方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / C#

#c#,#base64

作成日付 : 2020/03/26 02:19:50       修正日付 : 2020/03/26 02:20:59

143

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

Devlopment note / Java

#java,#servlet,#upload

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

144

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

Devlopment note / Java

#java,#form-ajax

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

145

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

Devlopment note / Java

#java,#ftp

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

146

こんにちは。明月です。この投稿はwindowでftpサーバを構築する方法に関する説明です。最近、cloud driveというクラウドストレージがあり、どんなパソコンでも簡単にファイルを共有、バックアップなどをできますが、わずか10年前には大勢の人がメールやusbなどでファイルを共有やバックアップをたくさんしました。メールの短所はインタネットができるところならファイルを共有できますが、ファイルバージョン管理が難しいし、データサイズのリミットがあります。usbの場合は常に所持しなければならならない不便があるし、データサイズのリミットもあります。それでサーバを扱うデベロッパーやseなら家やデータセンターにnasサーバを構築してftpでファイルを共有しました。でも、先に説明した通りにcloud driveがあるので最近はftpを使用する頻度がたくさん低くなったし、社内ではftpよりサンバーサーバ(samba)というネットワークドライブが楽なので最近はよく使いません。しかし、個人的にプログラム開発上ではcloud drive apiを使うことでは少し負担があるし、社内ではサンバーサーバ(smb)よりもっとセキュリティ的だし簡単に開発できるプロトコールなのでftpが良いではないかと思います。window環境ではftpサーバを構築するために別にプログラムをインストールする必要がないし、windowの基本パッケージであるのでインストールだけでよいです。コントロールで「プログラムと機能」を開きます。そして「windowsの機能の有効化または無効化」を選択しましょう。そしてftpサーバーとiis管理コンソールなどを選択しましょう。確認ボタンを押下すればインストールが開始します。そして数分をお待ちしたらインストールが完了します。そしてプログラム検索に「iis」というコマンドを打ったらインタネットインフォメーションサービス(iis)マネージャーのプログラムが検索されますが、それをクリックして実行します。そしてサイト項目でマウス右をクリックすればftpサイトの追加項目があります。サイトの名前を入力してftpサーバーでファイルアップロード及びダウンロードするパスを設定します。もしかして別にホスト設定があればip設定でホストドメインを入力します。でも別に制限がなければ指定しなくてもよいです。また、ssl設定が必要なら証明書を入れるしな

Devlopment note / Window

#window,#ftp

作成日付 : 2020/03/19 03:27:22       修正日付 : 2020/03/19 03:27:22

147

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

Devlopment note / Java

#java,#cron

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

148

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

Devlopment note / Java

#java,#excel,#poi

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

149

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

Devlopment note / Java

#java,#pdf,#itextpdf

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

150

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

Devlopment note / Java

#java,#log4j

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

151

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

Devlopment note / Java

#java,#gson

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

152

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

Devlopment note / Java

#java,#base64

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

153

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

Devlopment note / Java

#java,#process

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

154

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

Devlopment note / Java

#java,#mail

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

155

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

Devlopment note / Java

#java,#clone

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

156

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

Devlopment note / Java

#java,#Serializable

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

157

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

Devlopment note / Java

#java,#StringBuilder,#StringBuffer

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

158

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

Devlopment note / Java

#java,#compare

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

159

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

Devlopment note / Java

#java,#dataformatting

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

160

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

Devlopment note / Java

#java,#servlet,#path

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

161

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

Devlopment note / Java

#java,#unicode

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

162

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

Devlopment note / Java

#java,#system.in

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

163

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

Devlopment note / Java

#java,#WebSocket,#servlet

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

164

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

Devlopment note / Java

#java,#websocket

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

165

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

Devlopment note / Java

#java,#websocket

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

166

こんにちは。明月です。この投稿はphpのcakeフレームワークでerrorページを設定する方法に関する説明です。cakephpでデバッグモードでエラーが発生すると下記とおりのエラーページが表示されます。上の画面はphpで開発する時にエラー追跡するためのstack flowです。すごく有用な情報です。でも、我々が開発が終わった後、本番サーバーに転換する場合にエラーが発生する時、stack flow情報が表示されると困ります。一応、ソースの内容がユーザに見えることになるし、ユーザの立場でエラーページが表示されることはサイトの信頼度を落ちることになるでしょう。そのため、本番サーバーではエラーが発生すれば、エラーページに遷移しなければならないです。そうしたらconfigフォルダのapp.phpファイルを確認しましょう。デバッグ設定するオプションがあります。初期設定は「true」になっていますが、「false」に設定しましょう。また、エラーページを見ると上のページが表示されます。(エラーページを表示するためにはソース上でthrowをするか、要請エラーが発生するページを要請すればよいです。)そうするとエラーページを作成しましょう。先にviewフォルダのappview.phpのソースから修正します。この部分を以前smarty設定する時に説明したことがあります。link - [cakephp] mvcフレームワークのcakeをインストールする方法上のソースをみれば、debugモードじゃない場合、エラーが発生すると「error」ページが表示するように設定しました。「error」ページは各エラータイプ別で設定することも可能ですが、普通は一つのエラーページに統一します。それで我々は「error」ページだけ修正して派生ページは無視しましょう。既存のデフォルトで様々の文法が書いていますね。綺麗にクリアしてエラーページを作成しましょう。appview.phpのコードで応答コードの値を「errormessage」キーとしてテンプレートページに渡しましょう。また、エラーを発生させてエラーページが正しく表示することを確認します。ここまでphpのcakeフレームワークでerrorページを設定する方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / PHP

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

167

こんにちは。明月です。この投稿はphpのcakeフレームワークでtransactionを使う方法とentityクラスを利用してinsert、update、deleteする方法に関する説明です。以前、cakephpのフレームワークを利用せずに、データベースにinsertやupdate、deleteに関して説明したことがあります。link - [cakephp] データベース(mariadb(mysql))を接続する方法でも、我々はデータ無欠性のため、トランザクションを使うし、fetch機能でオブジェクト単位でデータを追加する方法で実装しなければならないです。テーブルの例は以前の投稿を続けて利用します。link - [cakephp] ormのテーブルfetch設定userテーブルでデータを入力する後、派生テーブルのinfoテーブルのデータを入力します。そしてinfo2テーブルのデータを入力することで考えましょう。userテーブルのキーとinfoテーブルの外部キーが自動生成するタイプじゃなく、nvarcharタイプのユーザかuserテーブルのキーとinfoテーブルの外部キーが自動生成するタイプじゃなく、nvarcharタイプのユーザから取得するデータなのでuserテーブルをinsertした後infoテーブルをinsertすることの順番で問題ありません。でも、info2のテーブルの場合はinfoテーブルのキーで外部キーが結んでいますが、この場合は自動生成タイプなのでinfoテーブルがinsertした後、キーを検索してinfo2テーブルに入力しなければならないです。この順番のテーブル入力する作業が多いと思えば、ソースがすごく複雑になるでしょう。また、データベース処理する中でエラーが発生する時、全てをロールバックしなければならないですが、それ時にトランザクション(transaction)を利用すればできるでしょう。cakephpフレームワークではトランザクションがオブザーバーパターンにもう実装されています。javaやc#はパターンを実装しましたが。。トランザクションを利用してデータを入力しましょう。上の例でinfoテーブルの場合は外部キー(id)に入力するデータにはentityデータの「id」で設定するので別にデータベースから受取るのはありませんが、info2テーブルの場合はinfoテーブルの外部キーが自動生成のキ

Study / PHP

#php,#orm

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

168

こんにちは。明月です。この投稿はphpのcakeフレームワークでormのテーブルfetch設定に関する説明です。以前にはcakephpでorm query式でデータ検索することに関して説明しました。link - [cakephp] cakeフレームワークでデータベースに接続する時に使うquery式とentityクラス、tableクラス、resultsetorm fetchとはテーブルでreferenceされたテーブルのデータを連結することです。例えば、userテーブルに派生テーブルinfoがあり、infoテーブルでuserテーブルのidをforeign keyで結ばれたと思えば、プログラムからuserテーブルを検索するとinfoテーブルのデータもリストタイプに検索される機能です。1:1の関係ならクラス内部で一つのインスタンスで変数に派生テーブルデータがあり、1:n関係ならリストタイプでデータがあります。javaのormでも同じ概念で説明したことがあります。link - [java] jpaのentityクラス設定(cascade, fetch)テストのため、データベースにテーブルを新しく生成しましょう。テーブルの生成が完了したらcakephpにもtableクラスとentityクラスを生成します。cakephpの機能ではfetch機能でjoinを利用してデータを取得する方法にもあります。link - https://book.cakephp.org/3/ja/orm/retrieving-data-and-resultsets.html#changing-fetching-strategiesでも、joinを利用する方法はすごく複雑です。entityクラスで処理することじゃなく、controllerで$table->find()関数を利用してデータを取得することに紹介しています。ormでデータを組み込むことじゃなく、controllerがデータによって複雑に実装することだけです。それでfetch設定をしてデータを取得するように実装しました。link - [cakephp] cakeフレームワークでデータベースに接続する時に使うquery式とentityクラス、tableクラス、resultset一応、permissionは後で説明して上のinfoだけ確認します。infosのプロパティのデータを

Study / PHP

#php,#orm

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

169

こんにちは。明月です。この投稿はphpのcakeフレームワークでデータベースに接続する時に使うquery式とentityクラス、tableクラス、resultsetに関する説明です。以前にcakeフレームワークでデータベースを接続する方法に関して説明しました。link - [cakephp] データベース(mariadb(mysql))を接続する方法cakephpにはormフレームワークが含めているので簡単にデータベースに接続するしクエリを構成してデータを検索することができます。cakephpのormはデータを取得する時に単純にsqlクエリじゃなく、query式という関数があります。それでstringタイプのクエリじゃなく、php言語の関数みたいにクエリを組立てすることができます。上の例をみればc#のlinq式とjavaのstream式とすごく似てます。ここまでは以前の投稿にも説明しました。差があるといえば以前は$connection->newquery()関数でquery式を取得しましたが、今回はtableregistryからレジストリを取得してfind関数でquery式を取得しました。connectionのnewqueryとtableregistry:getしてfind関数で取得することは文法は別に差がなさそうですが、実際にnewqueryはsqlクエリを組立てするために関数ならレジストリから取得したことはorm上でデータをオブジェクト化することです。単純にみてもnewqueryはコネクションのオブジェクトで扱うことなのでリソース管理をみても良くないでしょう。そうするとデータをオブジェクトにするようにtableクラスとentityクラスを作成します。ideのdirectory explorerをみればmodelのフォルダの中にentityフォルダとtableフォルダがあることを確認できます。クラス名は「テーブル名+table」になります。私の場合はテーブル名が「testtable」なので「testtabletable」という可笑しい命名になりました。クラス名は必ず「テーブル名+table」という命名方法に従う必要はありませんが、必ず語尾に「table」は付けなければならないです。そしてentityクラスをentityフォルダに作成します。entityクラスはテーブル名のままになります。他

Study / PHP

作成日付 : 2020/02/17 08:16:23       修正日付 : 2020/02/17 08:16:23

170

こんにちは。明月です。この投稿はphpのcakeフレームワークでデータベース(mariadb(mysql))を接続する方法に関する説明です。以前、バニラphpバージョンでmysqliのモジュールを拡張してデータベースに接続、検索、格納、削除などに関して説明したことがあります。link - [php] データベース(mariadb)を連結して使う方法cakeフレームワークでデータベースを接続してデータ管理することは以前バニラphpバージョンよりいいです。ormフレームワークでデータを管理するし、取得することもc#のlinq式みたいな感じの実装するので接近性がよくなりました。link - https://book.cakephp.org/3/ja/orm/database-basics.html先にデータベースにクエリを作ってデータを準備しましょう。以前にテストで使ったデータをそのままに使います。そしてデータベースに接続するために設定情報ファイルを修正します。設定情報ファイルはcakeフレームワークのconfigフォルダの中にapp.phpファイルがあります。app.phpファイルの中でデータベースコネクション情報を設定するところがあります。それをデータベース設定環境に合わせて修正します。データベース設定が完了したらhomecontrollerのクラスからデータベースのデータを取得します。上の結果をみれば、データベースからデータを取得したことを確認できました。上のクエリをみれば、単純に「select * from testtable」式を飛ばしてassocを連関配列で取得したことで以前の方式と別に差がありません。上の例をみれば$connectionからクエリオブジェクト$($query)を受け取ります。$queryオブジェクトは「from」、「where」、「order」、「select」の関数でクエリを組み立てます。この関数は「excute」関数で組み立てるので順番が変わっても結果は同じです。fetchallでデータベースからデータを受け取ります。結果はidxが偶数だけあります。60の場合は10倍数なので「new!!!」変更されたことを確認できます。$connectionにはinsert、update、deleteの関数があります。insertの場合は初めのパラメータはテーブル名で2つ目は連関配列によってデ

Study / PHP

#php,#cakePHP,#database

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

171

こんにちは。明月です。この投稿はphpのnamespaceとuseキーワードに関する説明です。現在cakephpフレームワークに関する分析や説明をしていますが、急にphp基礎文法に戻りました。実はphpの中でnamespaceやuseをよく使いならソース管理に良いですが、ライブラリ開発じゃない以上、すごく大事なところじゃなかったので省略しようと思いました。でも、やはりmvcモデルで開発するためにはパッケージ区分が必要と思って説明します。namespaceとuseとはc#の場合はnamespaceとusing、javaの場合はpackageとimportと同じ意味です。最近、プロジェクトサイズが以前より大きいし様々なライブラリを参照しています。それでクラス名をプロジェクト中で雄一なことに決めることが難しいです。例えば、データベースを2つを扱うプロジェクトということに考えてみましょう。そのデータベースの種類がmysqlとoracleといえばrdbmsのタイプなのでライブラリがすごく似ていると思います。そのため、コネクションするクラス名がmysqlライブラリは「connection」という名を、oracleライブラリでも「connection」と実装されていると思えばユーザがconnectionクラスを割当てする時にプログラムはどのconnectionを宣言するか競合エラーになるはずです。他の例ではxmlデータを扱うライブラリでオブジェクトを作成するbuildクラスがあるし、jsonデータを扱うライブラリでもオブジェクトを作成するbuildクラスがあると思えば、buileクラスを割当てする時にプログラムはどのクラスを宣言するかを分からないです。そうすると、全てもphpのライブラリのクラス名は固有名で作成しなければならないですが、現実的にありえないことでしょう。同じクラス名でも区別するためにnamespaceがあります。useの場合はnamespaceをパッケージを使用する明示的に宣言することです。上の例はtestclassが2つあります。namespaceは各test1とtest2にあるので、別のクラスです。もし、namespaceを使ってないなら同じクラス名が重複されたというエラーメッセージがでます。エラーメッセージが出ない(エラーオプション設定で。)と言ってもcontrollerでtestclassを割当て

Study / PHP

#php,#namespace,#use

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

172

こんにちは。明月です。この投稿はphpのcakeフレームワークのrequestとresponseに関する説明です。requestとはウェブブラウザからウェブサーバに要請したデータ(headerとbody)です。responseとはウェブサーバからウェブブラウザに応答するデータ(headerとbody)です。要請するタイプには「get」タイプと「post」タイプがあります。そのことでgetのquery stringは「$_get」から取得するしpostのform dataは「$_post」から取得することを説明したことがあります。また、headerのデータは$_serverから取得することも説明しました。link - [php] $_server, $globals, $_get, $_post, $_request, $_cookie, $_session, $_files, $_env(getenv())以前、説明したデータをcakephpフレームワークでももちろん使えます。でもデータ流れの構造を設計、管理するcakephpフレームワークを使っているから内部オブジェクトでheaderデータを取得しましょう。link - https://book.cakephp.org/3/ja/controllers/request-response.htmlrequestウェブブラウザからウェブサーバに接続する時の要請上です。ヘッダ情報や、セッション情報があります。$this->getrequest()->getattributes()と$this->getrequest()->getparam(キー)getparamの関数の情報はgetattributesの「params」のデータになっています。実はgetattributes()関数はroutes.phpからcontrollerを呼出す時にデータを渡すパラメータです。上の例の場合はcontroller、actionしかありませんが、connect関数にパラメータを付けるとgetattributes()関数で取得ができます。$this->getrequest()->getquery()このデータはhttpメソッドがgetの時に受取るquery stringの値です。参考にgetque

Study / PHP

#php,#request,#response

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

173

こんにちは。明月です。この投稿はphpのcakeからajax要請がある時、jsonタイプ(json_encode関数)でresponseする方法とcontrollerでviewを選択する方法に関する説明です。前の投稿でcake+smartyの組み合わせでウェブブラウザから要請がくるとcontrollerを通ってviewを読み込んでresponseする方法に関して説明しました。link - [cakephp] mvcフレームワークのcakeをインストールする方法ウェブサービスでは必ずhtmlドキュメント形式でresponseすることじゃありません。例えば、ajaxの機能ならjsonタイプのデータを受取る時もあるし、ファイルをダウンロードする時もあります。その時にはactionメソッドでリターン値がテキストやバイナリタイプで受け取ってブラウザ側にresponseしなければならないです。javaだとresponsebodyアノテーションを設定してstring値にリターンすることと同じ意味です。これからactionメソッドからajax値を受け取りましょう。controllerを追加します。ajaxcontrollerを追加してajaxデータを生成します。上の例でjson_encodeの関数はarrayをjson形式に変換する関数です。参考にobjectタイプはjsonタイプに変換しません。java(gson)やc#(newton)はライブラリに提供しますが、phpの場合は内部関数で提供します。phpの長所は細かい内部関数が多いことです。別にライブラリがなくてもプログラムを立ち上げることで無理がありません。また、ソースに戻してhomeのindexのビューでjavascriptでajaxを呼出す関数を作って確認しましょう。ajaxから「/ajax/index」を呼出します。ajaxcontrollerのindex関数が呼ばれます。jsonタイプで要求しています。idがdataのオブジェクトにはjsonのdataの値を、data1のオブジェクトにはjsonのdata1の値を入れました。actionメソッドのリターン値で許すデータはnullと$this->response値だけです。その以外のデータはエラーが発生します。そうするとcontrollerのactionとテンプレートのファイル名はいつも一致しなけ

Study / PHP

#php,#ajax

作成日付 : 2020/02/08 03:00:00       修正日付 : 2020/02/11 20:15:22

174

こんにちは。明月です。今まで、reflectionやspl_autoload_register、smarty、.htaccessなどを説明しましたが、それは全てphpのmvcフレームワークを構成するための準備作業だと言えます。cakeとはphp側で有名なフレームワークです。javaだとspring、c#だとmvc frameworkと似ているな概念のmvcフレームワークです。link - https://cakephp.org大勢方がcakeフレームワークがどんなフレームワークより使いやすいし、様々機能があってセキュリティやデータ管理などが強いといいますが、個人的にjavaとc#のフレームワークに馴れているからかな、以外に複雑ですね。実はこの投稿を作成しながらもずいぶん迷ういました。一応、目標として、インストールまで完了してブラウザに「hello world」を出力することで始まります。cakeフレームワークを使うためにはいくつかのモジュールを設定(extension)しなければならないです。php.iniを確認しましょう。上の3つのモジュールのコメント(;)を解除されていることを確認しなければならないです。解除されているのを確認したらcomposerでcakeフレームワークをダウンロードしましょう。link - [php] composer設定私の場合は一回ダウンロードした状況なので「loading from cache」で表示されます。初めにダウンロードするとライブラリが少しありますので、時間がかかります。フォルダを見ればappフォルダがあることを確認できます。私の場合はrootで作業するつもりなのでappフォルダにあるファイルを全てrootフォルダに移動します。そして.githubフォルダとappフォルダは必要ないので削除しましょう。そしてcakeフレームワークもビューのテンプレートがありますが、我々はsmartyテンプレートに変わりましょう。(cakeのテンプレートは別にphpスクリプトファイルと差がないです。)composer.jsonのrequireにsmartyライブラリを追加しましょう。link - [php] phpのコーディング領域とデザイン領域を分離するテンプレートライブラリ smartyそのあとでcomposer updateをしましょう。ここでcakeフレームワークを使うための準

Study / PHP

#php,#CakePhp

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

175

こんにちは。明月です。全樹でrequireとincludeに関して説明したことがあります。link - [php] requireとinclude、そして「@」の使用方法筆者が考えてphpでプログラミングする時に、一番不便なことがrequireとinclude宣言です。小さいプロジェクトならそんなに不便とは感じられない可能性もありますが、大きいプロジェクトなら様々なところでクラスを呼出すし関連ページを全て呼び出さなければならないので、すごく大変になるでしょう。javaやc#の場合はパッケージ単位、namespace単位で宣言します。それでもソースの上にimportやusingキーワードが多くなることがあります。まして、クラス単位であるphpページならすごく多くなるでしょう。筆者は以前に参加したプロジェクトでrequireだけで何百行目になったことも見たことがあります。これを解決する関数で「spl_autoload_register」ということがあります。実はこの関数はphp 5.3から提供していますが、筆者の場合は「7.0」から認識しました。それで以前にはphpの場合はパッケージ管理が難しいという認識がありましたが、実はそれじゃなかったんです。やはり、ソースパフォーマンスや可読性は開発者の能力の違いですね。言語は以前から提供しましたが。。。link - https://www.php.net/manual/en/function.spl-autoload-register.php上の例をみれば、ページの中でクラスだけあるファイルは「.class.php」の拡張子で作成しました。これは標準規約じゃなく、私が楽に区分するように決めた規則です。ソースでspl_autoload_registerの関数以外にはincludeやrequireがありません。でもclass1をインスタンス生成する時(newで割当て)、spl_autoload_registerの関数が呼出してclass1.class.phpファイルを読み込みます。ここでinclude_onceで読み込みましたので重複読み込みはありません。class1クラスはextendsキーワードでabstractclassを経書しました。それで「abstractclass.class.php」ファイルも読み込みました。class2.class.phpの場合は、「abs

Study / PHP

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

176

こんにちは。明月です。今回はphpの匿名関数(ラムダ)とクロージャに関して調べてみました。匿名関数は既存phpで宣言した「function methodname($param)」の形じゃなく、「function($param)」という関数名がないことです。関数名がないというのは一回性の関数で「javascript」とコールバック関数とにみたいな流れの関数です。上の例をみればruntest関数に2つのメソッド名がないメソッドを渡します。この関数では「$add」と「$substract」に結果を渡すための一回性の関数です。クロージャとは「java」と「c#」、「javascript」のクロージャと同じ概念です。クロージャと言うのは関数内部じゃないところで宣言した変数を関数の中で使えることです。実際にメモリ上では別のメモリ領域なので共有ができないですが、ソース上でメモリを共有するような機能になっています。上の例をみれば$message変数に「hello」という値を入力しました。各匿名関数「$example1」と「$example2」を作成しました。$example1の関数では「$message」変数を参照するとエラーが発生します。エラー内容は宣言してない変数使用ということになっています。なぜなら$messageの変数は$example1関数外で宣言したものからです。でも、$example2では$messageを使いますね。useキーワードを利用して関数外の変数を使えるようにしたからです。link - https://www.php.net/manual/en/functions.anonymous.phplink - https://www.php.net/closure

Study / PHP

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

177

こんにちは。明月です。今まで、我々はphpを作成する時にphpコードとhtmlコードを混ぜて作成しました。簡単な仕様ならhtmlデザインパートとスクリプトパートが一緒にあるから楽かも知りませんが、少し複雑になるし大きくなるとソースコードが複雑になるでしょう。昔はphpにもクラス概念がある前には単一ページ作成方法(phpスクリプトとhtmlコードが混在)でよく作成しました。(必ずそのことではないけど、普通はそうだったです。)最近はhtmlタグ構成、cssスタイルコード、javascriptコードも複雑になってその上でphpコードまであるとすごく複雑なソースことになるでしょう。開発する時に可読性は重要な部分なので、その時にはスクリプトコードとhtmlコードを分ける必要があります。java(spring)やc#(mvc)にはmvcモデルのフレームワークがあります。mvcモデルとはmodel(オブジェクト)、view(htmlデザイン)、controller(ロジック)を分けて作成する方法です。phpにもcakeというmvcモデルがあります。でも、cakeにもコントロールとビューが分けていますが、ビューがphpコードになっているので、完全な分離だと思いません。それでphpにはテンプレートフレームがありますが、それがsmartyとtwigです。筆者はtwigよりsmartyが手に慣れているので、smartyを使っています。smartyとtwigは使用方法が全然違うテンプレートですが、パフォーマンスや概念は似ています。link - https://www.smarty.net/smartyを利用するためにcomposerでsmartyをダウンロードしましょう。repository - https://packagist.org/packages/smarty/smartyeclipseのexplorerでたまにエラーマークが表示される時があります。実際にエラーではないので気にしなくてもよいです。eclipseがphpソースを完全に解読できないらしいです。index.phpファイルでsmartyクラスを宣言してテンプレートディレクトリ設定をします。キャッシュ設定もありますが、しなくても構いません。その後、smartyインスタンスでdisplay関数で「index.tpl」ファイルを読み込みます。phpファイルでhtml

Study / PHP

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

178

こんにちは。明月です。前述でreflectionのclassとmethodを扱う方法に関して説明しました。link - [php] reflection - class編link - [php] reflection - method編reflection機能はプログラムを動的に実装するように使うこともありますが、テストのために使うこともあります。特にreflectionの変数を扱うことではクラスのメンバー変数に直接に参照と修正ができるのでそれぞれのテストケースを作ってunitテストが可能です。その話はコンパイルが可能なjavaとc#の話です。phpはコンパイルが必要ないスクリプト言語なので、実は私の考えではreflectionのvariable機能はそんなに必要が無いと思います。クラスのデータの流れを確認するようにはvar_dump関数を利用するとprivateデータまでよくみえるからもっと使うところがないと思いますね。普通はクラスを作れば変数はprivateに設定するほうが基本コーディング規約です。なので、privateタイプの変数にデータを格納、取得することだけ知れば良いと思います。上の例をみれば、exclassの中で「data」のメンバー変数はprivateに設定されています。まず、そのデータを取得するようにexclassのインスタンスを生成します。getproperty関数で変数のオブジェクトを取得してsetaccessible関数で「private」のアクセス修飾子を無効化します。bodyタグの中でgetvalueを利用してobjのインスタンスのdata変数を取得して出力します。取得しましたから今回は格納してみましょう。上の例はインスタンスをreflectionで生成したことじゃなく、newキーワードで生成しました。普通の文法ならインスタンスを「new」で生成します。getvalueでメンバー変数を取得できたら、setvalueではデータが格納できます。結果はexclassのdata変数は「change」という値に変更されたことを確認できます。link - https://www.php.net/manual/en/class.reflectionproperty.phpreflectionまで纏めて説明しました。次の投稿からは.htaccessと上のreflectionを利用してapache

Study / PHP

#php,#reflection

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

179

こんにちは。明月です。前述でreflectionでクラス<を探してインスタンスを生成する方法、インスタンスの中で変数や関数を探す方法まで説明しました。link - [php] reflection - class編今回はreflectionを利用してクラスで関数を探して実行する方法まで調べてみます。上の結果をみればquery stringのパラメータによって呼出す関数を違うし結果も別で表示されます。もし、reflectionがなければ下記とおりに作成したと思います。ここでexclassのクラスの関数が仕様によって増えると考えば「if ~ else」も増えますよ。上の場合は簡単な例なので差をそんなに体感されないですが、拡張的に考えたらもっと複雑なプログラムならすごく複雑なロジックになるでしょう。reflection機能でこの関数を動的に呼出すだけではないです。関数がpublicではないアクセス修飾子も呼出すことができます。上の例をみれば「test2」と「test3」関数はpublicではなく、privateやprotectedに設定されています。そうすると基本的にクラス外部では呼出すことができません。でも、reflectionの「setaccessible」関数を利用してアクセスができるように設定して呼出しました。phpの場合はクラスのメソッドのオーバーロード(同じメソッド名にパラメータのタイプと個数で関数を区別すること)がありません。それで特にreflectionでメソッドを検索する時にパラメータのタイプや個数の情報はいらないです。invoke関数を呼び出す時にパラメータの数が一致しないとエラーが発生するため、パラメータの検証が必要になる場合があります。phpの場合は別に変数の型がないので、変数名と個数で検証処理をすれば良いと思います。link - https://www.php.net/manual/en/class.reflectionmethod.php

Study / PHP

#php,#reflection

作成日付 : 2020/01/31 03:00:00       修正日付 : 2020/01/31 03:00:00

180

こんにちは。明月です。reflectionは以前javaとc#でも説明したことがあります。link - [c#] reflection(リフレクション)link - [java] reflection - class編reflectionとはプログラム構造を投影して再構築する方法のプログラム技法です。その意味は我々がクラスを「$obj = new class()」形で宣言しますが、その宣言するクラスを動的宣言方法で使いたいことです。つまり、パラメータで「aタイプのクラスを宣言して」というデータがあればaタイプクラスを、「bタイプのクラスを宣言して」というとbタイプのクラスを宣言することです。上の例はreflectionではなく、我々がよく知っている形でクラスを宣言した方法です。パラメータでaを受取るとaクラスを宣言するしbを受取るとbクラスを宣言します。普通だし、問題ないプログラムコーディングですが、もしクラスがaクラス、bクラスだけではなくたくさんある場合にはどうでしょうか?後、プロジェクトが大きくなるほど上のパラメータが増えると言えばどうでしょうか?その時には「$obj = new $type.class()」の形で作成したらどうかと思う時がありますね。それがreflectionです。上の例ではパラメータから「type」を受け取ってreflectionを利用してクラスを宣言しました。結果はブラウザのアドレスにquery stringの「type」に「a」を入れるとaclassのprintを呼出して「aclass」という結果が表示されました。「type」に「b」を入れるとbclassのprintの関数で「bclass」の結果が表示されました。reflectionの「getproperties」と「getmethods」の関数でクラス内部のメンバー変数と関数の構成を確認できます。上の結果を見ると変数には「data」が表示するし、関数には「print」、「test」、「get」がみえます。アクセス修飾子も関係ずにデータがすべてみえますね。でもアクセス修飾子の情報と関数の場合はパラメータ返却情報がないですね。実はあるのに、私がまだ知らない状況の可能性もあります。link - https://www.php.net/manual/en/class.reflectionclass.phpreflectionに関し

Study / PHP

#php,#reflection

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

181

こんにちは。明月です。前述でphpでエラーメッセージを処理する方法に関して説明したことがあります。link - [php] fatal及びnotice,、warningメッセージ処理する方法プログラムを開発する時にはこのエラーメッセージは重要です。エラーメッセージを見て間違ったことを修正するし、予想以外が発生することを確認しなければならないです。でも、本番のサービスは違います。実際にインタネット上でエラーが発生することだと思えばログではエラーを残るけれども、画面上ではみえないようにしなければならないです。一番、いい条件は初めからエラーが発生しないことがよいですが、全てのユーザの行動パターンを予測できないし作業者のミスや様々な条件で、エラーが必ず発生します。なので、本番でエラーメッセージが見えることは実際にエラーメッセージでシステム情報や見えたらためな情報が見える可能性もあるし、ユーザがみて完成になれなかったことで見えるのでユーザによってサイトの信頼感が落ちることになります。サイト内でエラーが発生するとエラーページに遷移しなければならないですが、その設定を「.htaccess」で設定可能です。link - [php] 分散設定ファイル(.htaccess) 使用方法link - httpステータスコード(エラーコードをみながらみると理解しやすいです。)上のエラーは我々がよく知っている「404」エラーに関して対応しました。404エラーはウェブページで当該なページが無い場合に発生することです。先「.htaccess」をみれば「404」エラーが発生すると「/error?code=404」にrewriteします。また、rewriteruleによって「index.php?htaccess=error&code=404」に変換して遷移します。index.phpの中でエラーがある場合にエラーコードによってページを読み込んで画面に掲示します。imageフォルダ中で実際に「test」ファイルは存在しません。なので「404」エラーが発生します。上の例はサーバ上でエラーが発生したことで、ソース内部でエラーが発生する時の処理です。上の例はパラメータがnullかどうかでエラーが表示されるように実装しました。上の結果はdataのパラメータに「1」というデータを入れるとhttp statusが200になりますね。200は

Study / PHP

#php,#ob_clean,#die

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

182

こんにちは。明月です。前述まではブラウザでphpファイルを接続しようと思ったら「ホスト名+ファイル名」で接続しました。つまり「index.php」ファイルを作成したら「http://localhost/index.php」で接続しました。そのままにウェブサービスを開始しても問題ないですが、phpファイルでクラスだけあるファイルなら空ページが見えるし、ウェブサービス側のディレクトリが漏れるのでセキュリティに考えては良くないです。そうしたら直接にファイルを接続する方法ではなく、c#のmvcみたいにアドレスのディレクトリだけでphpを接続できるような設定ファイルがありますが、それが分散設定ファイル(.htaccess)です。link - https://httpd.apache.org/docs/2.4/en/howto/htaccess.html先に分散設定ファイルを使うように「.htaccess」の構造に関してしらべましょう。上のイメージみたいにファイル名はなしで拡張子だけ「.htaccess」に生成しましょう。options -multiviewsこのオプションはrequestデフォルト要請設定と関係があります。要請urlがルート(root)、つまり「ホスト名/」で要請すると「index.php」や「index.html」を探す機能です。そのデフォルトページは「httpd.conf」に設定しています。「options +multiviews」にすると当該な機能が設定されますが、「options -multiviews」にするとデフォルトページを探さないです。rewritebase /rewritebaseはサーバのルート(root)ディレクトリを設定することです。基本的に「httpd.conf」で設定されている「documentroot」でルートに設定されていますが、フレームワークによって下位ディレクトリに設定する場合に設定することです。上の例では詳細していますが、詳細した場合は「httpd.conf」に設定しているままで動きます。rewriteengine onrewriteengine onは既存のurlパス構造を再構成してurlからデータを受取ることです。例で「localhost/index.php?idx=1」のurl要請があります。index.phpページにget方式のidxパラメータに1を入れ

Study / PHP

#php,#.htaccess

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

183

こんにちは。明月です。ウェブサービスを開発すると思ったら当たり前にデータベースも使います。もちろん、データを必ずデータベースを使うことではなく、バイナリやエクセルなどでもデータを管理してウェブサービスを立ち上げられます。でも、データベースよりデータ管理しやすいものでは無いので、データベースをほとんど使うと思います。データベースの種類としてはoracleやsql server(mssql)、mysql、postgreなど様々な種類がありますが、ここではmariadb(mysql)を使います。mysqlのインストールは省略します。link - [ubuntu] mariadb(mysql)をインストールする方法link - [centos] mariadb(mysql)をインストールlink - window用ダウンロードsqlクエリは各キーワードは差がありますが、概念は同じです。phpでデータベースを使うようにはphp.iniを修正しなければならないです。php.iniの中で「extension=mysqli」がありますが、この部分のコメント(;)を除いてapacheを再起動します。そしてphpinfo()で確認すると「mysqli」がロードされたことを知ることができます。一応、phpからデータ取得するソースを実装するため、データベースにデータを挿入しましょう。データを作成しました。上のデータをphpからデータを取得しましょう。phpからデータベースを接続するようにはmysqli_connectでコネクションを作ります。データベースコネクションはioのコネクションみたいにリソースなので最後には必ずリソース返却(close)しなければならないです。コネクションを作った後、データベースを選択します。クエリでは「use データベース」と同じです。そして「mysqli_query」関数でクエリを送るし結果を受け取ります。この例ではmysqli_fetch_assoc関数を使っていますが、mysqli_fetch_rowでも受け取ることが出来ます。これは一般配列か、連関配列かの差ですが、mysqli_fetch_rowで一般配列(数字で探索)で結果を受け取られるし、mysqli_fetch_assocはカラム名のキーで連関配列で結果を受け取られます。phpでは連関配列でも一般配列みたいに数字でデータを取得することがで

Study / PHP

#php,#mariadb,#db connector

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

184

こんにちは。明月です。i/oとはinput/outoutという意味ですが、プログラムでi/oというとファイル入出力という意味になります。プログラムを作成してみればpropertyという環境ファイルを読み取りする時もあるし、クライアントにファイルを転送するために読み込む時もあります。逆にプログラム上でログやデータをデータベースではなく、ファイルで格納するしブラウザからファイルをアップロードされ、ファイルを書き込む時もあります。そして同じフォルダにある「data.txt」ファイルを読み取ります。ここで「data.txt」ファイルには改行がありますが、ウェブページには一行目で表示されます。参考にウェブブラウザは改行が「<br />」タグなので、バイナリの「\r\n」や「\n」はブラウザで改行されません。fopenはファイルコネクションを生成してファイルを開いてfreadでファイルを読み取りします。最後にfcloseで必ずリソースを返却しなければならないです。そうではなければプログラム上でi/oリソースをずっと使用中になるので、他のセッションで使えなくなります。phpはスクリプトなのでrequest&response単位でリソースを自動に返却しますが、プログラムパフォーマンスのため、使用が終わったらすぐリソースを返却しましょう。今回はファイルを書き込みしましょう。初めにファイルを読み取る時にはfopen関数でパラメータを「r」を使いました。また、書き込む時には「a」を使いました。上のパラメータはファイルのコネクションのタイプを選べることです。 モード 説明 r 読み取り専用。ポインタは最初です。 r+ 読み取り + 書き込み。ポインタは最初です。 w 書き込み専用。 ファイルは初期化になります。ファイルが存在しないなら作成します。 w+ 読み取り + 書き込み。ファイルは初期化します。ファイルが存在しないなら作成します。 a 書き込み専用。ポインタは最終です。 a+ 読み取り + 書き込み。ポイン

Study / PHP

#php,#io

作成日付 : 2020/01/23 03:00:00       修正日付 : 2020/01/23 03:00:00

185

こんにちは。明月です。プログラムプロジェクトを管理するようにはディレクトリやファイルの構成を設定することも重要な部分です。例えば、javaの場合はパッケージネームがディレクトリ構造でクラス名とファイル名を一致させておいてクラスを早く探せるように設定します。c#の場合もnamespaceがディレクトリ構造でクラス名がファイル名と一致させます。上のルールは必ずではないけど、できれば守らなければならないです。phpの場合は.phpがウェブページなのでクラス名とファイル名を一致することで少し難しい部分があります。でも、できれば合わせることは将来に可読性のため必要です。そして、最近のプロジェクトは.phpで全開することではなく、.htaccessを利用してmvcモデルに構成するのでクラスようなファイル(.php)とビューファイル(.tpl)を分けることにしますね。なので、phpもクラス名とファイル名、ディレクトリ名とnamespace名に分けることができます。そうしたら2つのウェブページを生成して一つのresponseに作りましょう。index.phpファイルとextension.phpファイルを生成しました。index.phpファイルで「require」関数を利用してextension.phpファイルを読込みました。extension.phpファイルはクラスしかないので、ブラウザで「localhost/extension.php」に接続しても空ページが表示されます。しかしindex.phpではextensionクラスを宣言してgetdata関数を呼出すので、「localhost/index.php」では結果が「hello world」が表示されますね。そうすると「require」の使用方法に関しては理解しました。上のindex.phpで「require」キーワード代わりに「include」を入れても同じ結果ができます。「require」と「include」の使用方法と結果は同じです。でも、includeする時あるいはrequireする時にファイルがあるかどうかでエラーの差があります。上の場合はブラウザで「localhost/index.php」に接続するとエラーが発生します。fatalエラーなのでスクリプト解析が止まるのでbodyにある「go!!」も文言が表示されないです。includeの場合はエラーではなく、警

Study / PHP

#php,#require,#include,#@

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

186

こんにちは。明月です。プログラムを開発する時に様々なエラーが発生することがあります。それでtry〜catchを利用してエラー処理をしますが、開発する時に全てのユーザケースを考えることも大変だし、try~catchでも処理ができなくphp側のエラーが発生する時があります。例えば、ページincludeやrequireする時ですね。また、phpはエラーではなくてもwarningやnoticeメッセージが出る時もあります。上の例は1から0で割り算をするとエラーが発生することと$data1の場合はデータ宣言もしなかったのに出力しようと実装したから発生したメッセージです。(上と下の結果の差はxdebugを設定したかどうかの差です。)link - phpでxdebugを設定する方法開発中でエラーが発生するとエラーメッセージが出るのは当たり前ですが、サービスのproduction(本番)でエラーの詳細情報がでるのはngですね。エラーメッセージだけではなく、noticeやwaringもngですね。そのメッセージが画面上で表示されないような方法です。php.iniで設定する方法php.iniファイルをメモ帳で開くとerror_reportの領域があり、e_allで設定されています。e_allの意味は全てもメッセージを表示する設定です。 エラーレベル 説明 e_all すべてのメッセージと警告 e_error 致命的なエラー e_recoverable_error ほぼ全てエラー e_warning 警告 e_parse コンパイル単位のエラーphpのdllの関数のエラー e_notice noticeレベルのメッセージ e_strict noticeレベルのメッセージ、phpの以前バージョンの関数で新バージョンのおすすめ(?)のメッセージ e_core_error

Study / PHP

#php,#error_reporting

作成日付 : 2020/01/19 03:00:00       修正日付 : 2020/01/22 20:37:23

187

こんにちは。明月です。前述でphpでデバッグする方法に関して説明したことがあります。link - [php] データ確認関数(var_dump, debug_zval_dump, print_r)普通、phpで開発する時にvar_dumpをよく使いますが、var_dumpやエラーが発生する時などのメッセージをもっと正確に分析してくれるライブラリのxdebugがあります。これからxdebugのライブラリをインストールしましょう。まず、phpinfoの関数でphpの環境設定に関して確認しましょう。上のphp環境設定のページをソースビューにしてソース全てをセレクトせいてコピーしましょう。(ctrl + c)その後、下記のurlに接続してパッケージ検査をしましょう。ダウンロードパッケージ検査 : https://xdebug.org/wizard.phpその後でパッケージ情報が表示されますが、ダウンロードurlでxdebugライブラリがリンクされ、それを選択してダウンロードしましょう。(筆者の考えはphp環境設定情報でphpバージョンとタイプ(thread safeかthread unsafeか)を正確に分析するようにソースビューのデータをコピーペしたと思います。)ダウンロードしたファイルをphpフォルダのextフォルダにコピーしましょう。そしてphp.iniファイルを修正しましょう。上のダウンロードしたページの3番をみればiniファイルの一番下に入れてください」と書いているのでコピーペすればよいです。そしてサーバを再起動してxdebugセッションがあることを確認できます。xdebugがphp開発でどのように使うか確認しましょう。上の例では$obj変数にtestクラスを宣言してbodyの領域でprint関数を呼出しています。print関数ではtestクラスのdata変数の値を返却していますが、dataの変数は宣言してないです。エラーになるソースですね。xdebugを設定する前には下記のイメージみたいに出力します。それがxdebugを設定する後は下記のイメージみたいに出力します。call stack表示でどこでエラーが発生したかを追跡ができます。前よりもっと詳しい情報が出るので開発する時に楽になると思います。実は初めxdebugを設定する理由はeclipseでデバック機能を付いて使おうと思いましたがeclipse側

Study / PHP

#php,#xDebug

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

188

こんにちは。明月です。phpのはウェブスクリプト言語です。ウェブサービスを立ち上がってウェブブラウザと連携すれば様々な情報をブラウザから受け取ります。例えば、ウェブサービスの環境情報やブラウザからのrequest情報、セッション、クッキーなどの情報がありますね。それをphpは「$_server, $globals, $_get, $_post, $_request, $_cookie, $_session, $_files, $_env(getenv())」の変数でサーバとクライアント間で発生した情報を取得するのができます。上の変数を理解するようにはウェブ環境の理解が少し必要です。ウェブとは簡単に考えるとウェブサーバとブラウザ間で非同期通信するプログラムです。ブラウザからurlのアドレスでウェブページをサーバに要請(request)するとサーバの場合はその要請によってhtmlファイルを作成してブラウザに応答(response)します。すごくシンプルな形式でその以外のファイルはファイルサーバみたいにイメージやjavascriptファイル(.js)、style sheetファイル(.css)をダウンロードして、ブラウザで動作するし(javascript)、デザインを描画(styel sheet)、イメージを表示するなどの動作します。ブラウザからウェブサーバに要請するタイプは2つがあります。それはget方式とpost方式があります。getの場合はブラウザのurlの中でクエスチョンマークの区切りでデータをurlに付けサーバに要請するタイプです。postの場合はデータをプロトコールのヘッダに含めて要請するタイプですね。各サーバとブラウザにはプログラム実行中でデータを格納して使っていますが、ブラウザ側でデータを持っていることをクッキー(cookie)というし、サーバ側にデータを持っているのはセッション(session)といいます。しかしブラウザ単位でどのセッションを使うかの設定はブラウザ側のクッキーの格納して要請するたびにセッションキーでサーバ側のセッションを持って来て使う流れで運用しています。すごくシンプルに説明しましたが、詳細のは下記のところで確認してください。link - https://developer.mozilla.org/ja/docs/web/http/overview$_serverlink -

Study / PHP

#php,#$_SERVER,#$GLOBALS,#$_GET,#$_POST,#$_REQUEST,#$_COOKIE,#$_SESSION,#$_FILES,#$_ENV

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

189

こんにちは。明月です。プログラムを開発する時にデータの流れを確認しなければならない時があります。その流れのポイントを取って確認する作業をデバッグと言います。簡単なウェブページを作成することならデバッグなしでも値の流れを確認できて、作業ができるかもしれませんが、データベースからデータを検索して取得する流れだと思えば、データの中間でデータが上手く入れ込むか、上手く取得するかを確認することや、もし予想以外のデータがあり、途中で何が間違っているかの確認が必要な時がありますね。javaやc#の場合はいい開発ツール(ide)があり、breakpointでデータ追跡が可能ですが、phpの場合はスクリプト言語なので、デバックができるいい開発ツールがないと思います。先にグーグルで検索してみたらzendstudioがありますね。まだ使ったことがないのでどうかなよく知りません。link - https://www.zend.com/en/downloads今はphpのideツールではjavaでも使うideツールのeclipseを使っていますが、これがphpのデバックができないです。正確に言うとできないことではないですが、筆者の場合は使ったことがないです。link - https://xdebug.org/link - https://wiki.eclipse.org/debugging_using_xdebuglink - https://yard.tistory.com/entry/eclipse-php-debug-私もデバックができるように設定してみましたが、結局失敗しました。stack-overflowの説明とおりだと、eclipse自体にバッグがありそうですね。もし、できる方がいらっしゃいなら教えてください。後でzendstudioで挑戦してみなければならないですね。(zendstudioが無料ではなく、有料です。)筆者の場合は今までphpを開発する時に別にデバックをしながら開発したことではないです。今はeclipseが慣れているから使いますが、10年前はただnotepad++で開発しました。phpはスクリプトなので、ソース修正が簡単だし、すぐ確認できるので「var_dump」の関数を利用して確認ができます。一応、文字がすごく小さく表示されますが、index.phpの8行目、intタイプの値が101ということで表示さ

Study / PHP

#php,#var_dump

作成日付 : 2020/01/16 03:00:00       修正日付 : 2020/01/16 03:00:00

190

こんにちは。明月です。プログラミングで例外処理は重要です。例外処理はプログラムロジックで開発者が考えられなかったこと、ユーザから可笑しいデータを受け取ったものを処理する文法です。link - [c# スタディ - 23] 例外処理(try〜catch,throwそしてfinally)link - [java スタディ - 19] 例外処理( try ~ catch)特に「php」で他の言語と差別性があることではないです。link - https://www.php.net/manual/en/language.exceptions.php上の例をみれば、example関数は呼び出せたらthrowでexceptionが発生します。メインロジックで「try ~ catch ~ finally」の構文でtryの領域でexample関数を呼出します。example関数ではexceptionで例外が発生して、catch領域に移動し、$errormessageの変数にエラーメッセージのデータを入れます。最終的に「try ~ catch」構文の関係なずに、finallyの領域に移動しますが、$checkデータを「1」を加算しますね。結果をみるとエラーメッセージと$checkの値が「1」になることを確認できます。ここで確認ポイントはtry領域でexample()関数を呼出した後checkの変数が加算するところがありますが、example関数でエラーが発生しましたので、checkの加算は実施してないです。基本的にthrowを発生すると処理インタラプトの「try ~ catch」に移動しますが、exceptionを継承してcatchを種類別で処理することもできます。example関数に「1」という値をいれて「myexception1」を発生する。catchでは「myexception1」、「myexception2」、「exception」の例外を設定してエラー別で処理領域を分離しました。結果をみれば「101」になりましたので、「myexcepion1」が呼び出せ、finallyの領域に移動したことを確認できますね。参考で文字上の例で「myexception1」が設定してない場合は「exception」のエラーが発生されます。「exception」の領域が一番上に設定すると区分なしですべてのエラーがexceptionに通るの

Study / PHP

#php,#try,#catch,#finallly

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

191

こんにちは。明月です。javaやc#で配列とリスト(list)は別の文法です。array(配列)の場合はその個数を決めてデータを入れるし、配列の個数を減らしたり増えたりするのが出来ないです。list(リスト)の場合は連結リストアルゴリズムでなっている構造でポインタを連携しながら追加したり削除したりする資料構造になっています。phpではその配列とリストの区分が別に分けていることではなく、arraryで宣言してリストみたいに追加や削除ができる構造になっています。そしてphpには連関配列ということでマップやディクショナリみたいに使う配列があります。連関配列は上の配列でインデックスの数代わりに文字を入れると連関配列になります。ここまで配列(リスト)の定義を確認しました。それでデータを追加や削除に関して確認しましょう。関数としてはarray_pushとarray_pop関数があります。array_pushは配列のデータを続けて入れることです。つまり、上の例で[3]までデータを入れたら[4]にデータを入れることですね。array_popは最後のデータ[4]までデータを入れたら[4]データをリターンして削除する関数です。link - https://www.php.net/manual/en/function.array-push.phplink - https://www.php.net/manual/en/function.array-pop.phparray_popの場合は最後でデータを取り除きますが、最初のデータを取り除き関数(array_shift)もあります。link - https://www.php.net/manual/en/function.array-shift.php今回は配列の中でデータを入れる関数(array_splice)です。array_spliceは一つのデータを入れることより、2つの配列を合わせることと同じです。link - https://www.php.net/manual/en/function.array-splice.phpその後、sort関数、extract関数、array_walk関数がありますが、sortの場合は整列、extractは抽出ですが、あまり使わないですね。sortの場合はリストの数字の対象なので、クラスやオブジェクトタイプならsort関数を作らなければなら

Study / PHP

#php,#array,#list

作成日付 : 2020/01/14 03:00:00       修正日付 : 2020/01/14 03:00:00

192

こんにちは。明月です。前述でphpのclassを宣言して使う方法に関して説明しました。link - [php] functionとclass使用方法、アクセス修飾子、そしてstaticphpもクラスがあるのでインタフェース(interface)と抽象クラス(abstract class)があります。個人的な考えはphpにはデータタイプの指示子がないのでインタフェース役がコンパイル言語(javaやc#)より活用性が少ないではないかと思います。筆者も実際にphpでinterfaceを使ったことがないですね。でも抽象クラスはよく使います。上の例をみればitestインタフェースとabstract抽象クラスとtestクラスがあります。依存層は「itest -> abstracttest -> test」でなっています。それでtestを宣言してrunを実行すればabstracttestのrunメソッドが実行してrunメソッド中では派生クラスの「print()」関数を呼び出す結果は「helloworld」になります。ここでparentとthisの概念ですね。$thisの場合は実行しているクラスのメンバーをさしています。すなわち、メンバー変数か関数を指しています。$thisの場合はc++のポインタの形で矢印で指示(->)をしています。しかしparentの場合はparent::の形で指しています。&parent->の形ではエラーが発生します。文法が面白いですね。上の例はobj->runを通ってabstracttestのrunが呼び出してrun関数で抽象メソッドprintが呼び出します。抽象メソッドprintが呼び出したのでtestクラスのprintが呼び出してprint関数で上位クラスのsetdataにデータを入れてgetdataでデータを持ってきて変換する形です。私がデータを「hello world」を入れたので結果は「hello world」が出ます。

Study / PHP

#php,#interface,#abstract,#parent,#this

作成日付 : 2020/01/13 03:00:00       修正日付 : 2020/01/13 03:00:00

193

こんにちは。明月です。phpは基本的にスクリプト言語なので、javascriptみたいに「function」と「class」を宣言しなくてもphpページを作ることができます。でも、最近ウェブプログラムはデータベースからデータを読み込んでそのままにウェブサービスに書き出すことではなく、複雑な計算と様々なデータを総合的に見せるポータルプログラム形式が多いのでかなり複雑に作成することになります。その時に単純にデータベースあるいはファイルなどからデータを読み込んで計算しながらウェブページに掲示すればプログラムがかなり複雑になるし再使用性がたくさん落ちることになります。それでfunction(関数)やclass形式な構造が必要です。先、functionの構造は「java」と「c#」みたいに返却タイプがあることではなく、「javascript」みたいにないですね。初めからphpは変数宣言する時もデータタイプを宣言することではないからだと思いますね。「javascript」と似てるな構造になります。phpでクラスの構造は一般oopプログラムと似てます。メンバー変数があるし、関数がある構造になります。ここでメンバー変数で「private」というアクセス修飾子を使いました。クラス内部の関数の場合はアクセス修飾子が必須ではないですが、メンバー変数には必ずアクセス修飾子が必要です。アクセス修飾子は「private」、「protected」、「public」があります。「private」の場合はインスタント外部でアクセス禁止、「protected」の場合はインスタントの内部、派生クラスの関数だけでアクセスができます。「public」の場合はインスタントの外部、内部でとこでもアクセスができます。 区分 アクセス修飾子 説明 アクセス権限 public すべてクラスでアクセスが可能です。 private クラス内だけアクセスが可能です。 protected クラスと派生クラス関係のクラスによってアクセスが可能です。 link - [java スタディ - 11] アクセス修飾子link - [c# スタディ - 13] アクセス修飾子(p

Study / PHP

#php,#function,#class,#static

作成日付 : 2020/01/09 23:35:27       修正日付 : 2020/01/09 23:32:40

194

こんにちは。明月です。phpをインストールしてideを構成しました。後、composerまでインストールまで完了しました。そのことでphpの基本的な開発準備は終わりました。link - [php] php 開発環境設定とeclipse(ide)の設定link - [php] composer設定phpはjavaとc#と比べてコンパイル言語ではなく、スクリプト言語です。スクリプト言語はコンパイル、すなわち機械語の変換がなしでスクリプト自体を解読して運用する言語といいます。スクリプト言語とは代表的にjavascriptとpythonなどがあります。phpファイルの構成形は下記となります。php処理領域は<?phpで始まって?>で終了します。値を出力する時は<?=変数 ?>形で出力が可能です。もちろん、出力を<?=変数 ?>ではなく、<?php echo 変数 ?>でも可能です。その以外の領域はそのままhtmlで出力になると思えばなります。phpは別途のデータタイプをもってないです。それで変数宣言も必要ないです。単純に$変数名で宣言が可能です。でもデータタイプ宣言をしないって言っても変数タイプがないことではないです。例えば、文字列タイプで定数タイプを加算すればエラーが発生します。エラーではなく、warningが発生します。定数や実数などで数と関係がある処理式は既存とみたいに「+,-,*,/」で使用が可能です。そして文字列はデータを合わせる時に「+」ではなく、「.」を使用して文字列を合わせます。その後、制御文、繰返し文と使用可能です。これは他の言語と似てるので「java」や「c#」を参考してください。link - [java スタディ - 5] 制御文 - 分岐 (if, switch〜case)link - [c# スタディ - 9] 制御文 - 分岐 (if, switch〜case, goto)

Study / PHP

#php,#variable

作成日付 : 2020/01/06 23:44:20       修正日付 : 2020/01/06 23:20:36

195

こんにちは。明月です。phpのcomposerとはjavaのmaven、c#のnugetと同じ機能で、パッケージ間の依存性を管理するし、ライブラリをダウンロード及びリンクを管理するモジュールです。先、composerをインストールするように「php.ini」を設定しなければならないです。以前にインストールした「php」フォルダに移動しましょう。link - [php] php 開発環境設定とeclipse(ide)の設定上の設定ファイルの中でextension=opensslのモジュールがありますがセミコロン(;)でコメント処理になっております。このセミコロンを削除しましょう。そしてコマンドで「php」がインストールされたフォルダに移動しましょう。(※参考に私の場合は今プロクシ設定している環境で使っているので「-x -u」オプションでプロクシ設定しましたが、この部分は省略してもよいです。)インストールが完了しました。というメッセージが表示されました。その後、composerバッチファイルを作成しましょう。そしてコマンドで「composer」ということで入れたら、下記とおりの画面がでます。ここまでcomposerがインストールが終わって設定が完了しました。link - https://packagist.org/javaのmavenレポジトリより少し整理されてない雰囲気ですが、必要な情報はあるのでかなり便利です。検索テキストで「carbon」ということで入れて検索しましょう。参考に「carbon」はデートフォーマット関連ライブラリです。そうしたらよく使う順番で検索されますが、一番上の結果を選択しましょう。様々な説明がありますが、時間があれば詳しくみるのはよいですね。でも、我々はライブラリリンクするのが目的なので、下の「installation」の項目をみましょう。リンク情報を得たのでドキュメントルートのフォルダに移動しましょう。ここで「composer.json」ファイルを生成しましょう。そしてリンク情報を入力しましょう。composerを実行すればよいですが、筆者の場合はcomposerバッチがあるところをシステムパス設定をしなかったので、直接に絶対パスで実行しました。ライブラリがタウンロードさせてリンクが完了しました。これからダウンロードしたライブラリを使ってみましょう。eclipseを起動してproj

Study / PHP

#php,#composer

作成日付 : 2019/12/27 08:49:09       修正日付 : 2019/12/27 08:52:22

196

こんにちは。明月です。ネットサーフィンすれば、「java vs c#」、「php vs java」、「php vs c#」など、言語の優秀性、性能、短所などを比較して書いた投稿が多いです。筆者の場合はプログラム言語を3~4個の言語を運用が可能ですが、言語の間に比較するのは意味がないと思います。例えば、リンゴとミカンがあります。リンゴが栄養が多いか?ミカンが栄養が多いか?健康にいいものか?どの果物がもっといいかというとみんなリンゴはリンゴの味で美味しいし必要な栄養があるし、ミカンはミカンで美味しいし栄養がありますといいますね。プログラム言語も同じです。これから紹介するphpはウェブスクリプトですが、javaとc#の比べてphpだけの魅力があるプログラム言語です。それで意味がない比較を少ししてphpの特性を説明します。phpとjavaを比べるとphpはjavaより基本環境設定が簡単です。「php+apache+db」の設定で終わります。javaの場合は「apache+tomcat+java+db」です。そういえば、「tomcat」だけ追加されたですね。phpの場合はコンパイル言語ではなく、スクリプト言語なので、ソース修正する時に、別途のコンパイルの手続きが要らなく、画面ページに反映が早いですが、javaの場合は再コンパイル、サーバ再起動などの手続きが必要なので修正から反映までphpの開発時間が圧倒的に早いです。プログラムのパフォーマンスはプログラム言語の性能もありますが、開発する人(デベロッパー)の能力の比重が多いので、省略します。まだ、プロぐジェクト管理能力に関してもphpが大きいプロジェクトには悪く、javaが大きいプロジェクトでよいといいますが、これも設計、環境設定なのによって差があるので、どっちがいいかとは言えません。オープンソースはコミュニティに関してはjavaの方が大きいではないかと思います。でもphpコミュニティも小さくなく、すごく大きいです。筆者はメイン言語がphpよりjavaなので筆者の感じだけの可能性もあります。上の状況だけみればphpがjavaよりいい言語みたいに見えます。phpの場合はスレッド処理が難しいです。例えば、phpではゲームサーバーを作られないです。正確には出来ないことではなく、難しいというのが正確だと思います。javaの場合はthreadpoolを利用してソケットサーバーを

Study / PHP

#php,#install

作成日付 : 2019/12/26 07:36:47       修正日付 : 2019/12/26 07:36:47

197

こんにちは。明月です。今まで、cssスタイルに関して説明しました。cssスタイルはセレクトからデザインスタイル、トランジションなど様々な機能がありますね。html編集ツールもあるし、他のプログラム言語はideや開発ツールがありますが、cssの場合はないかと疑問になりますね。cssの開発は全てウェブアプリケーションで画面の領域です。cssことでサーバサイドの開発はないですね。画面なので、普通はブラウザにcssの編集や開発ツールがありますね。クロームの基準で「設定」の「その他」の「開発ツール」があります。上のイメージはクロームですが、全てのブラウザがその開発ツールの機能を持っているはずです。ショットキーでは「ctrl+s方法hift+i」です。開発ツールを起動すると下記のイメージみたいなタブが出ます。上の「elements」、「console」、「sources」などのサブタブがありますが、「elements」以外はほとんどjavasciprtと関係があるものなので、ここでは省略します。「elements」タグでみるとウェブサイトのタグ構成が見えます。「elements」のタブの下を見るとスタイルというタブでcssスタイルがありますね。それで使用方法は下記通りです。開発ツールの右上をクリックして確認した要素を選択します。選択すると開発ツールの下の部分でcssスタイルがでます。様々のスタイルの設定を試すことができますね。今までcssのスタイルや値について説明しましたが、実は開発ツールを利用すると別に全て覚えてスタイル作成する必要はないですね。ただ、概念だけ知っていれば開発ができます。でも、ブラウザで設定して画面でスタイルが反映することみても実際のソースには反映されないので、気をつけてください。そのツールを見れば、「-webkit-」がつけているcssスタイルがあります。cssを設定してファイアフォックスやオペラ、ie、クロームを同じページを見ればスタイルが微妙に違います。その時に上の接頭辞でブラウザ別で設定できます。 接頭辞 説明 -webkit- クローム、サパーリブラウザ -moz- ファイアフォックスブラウザ

Study / Javascript, Jquery, Css

#css,#debug,#developer mode

作成日付 : 2019/12/25 07:54:31       修正日付 : 2019/12/25 07:58:13

198

こんにちは。明月です。cssで色のスタイルは色名で設定することもできるし、rgb表現式で設定もできるし、hexの値で設定もできます。/*色名設定*/.color-1{ color:blue;}/*rgb表現式*/.color-2{ /*赤、緑、青*/ color:rgb(255,0,0);}.color-3{ color: #008000;}color-1color-2color-3色の参照は下記のurlで参考できます。link - https://www.w3schools.com/cssref/css_colors.aspこの投稿では基本色設定ではなく、グラデーションに関して調べてみました。初めのdivタグのlinear-gradientは線形のグラデーションです。パラメータはグラデーションの変換角度で180度で設定すれば水平で上から下の段階でシルバー色から紫色に変わると意味で色の設定です。二つ目は上右から下左の角度ですが、角度では45度ですね。初めは赤色で、真中は白色、最後は青色に設定されます。三つ目のradial-gradientは丸系のグラデーションです。パラメータはcircle設定ですが初めは真中から外側に黄色から緑色に設定することです。四つ目は丸の設定ですが、丸のサイズが横50px、縦50pxです。「at」の後は丸の位置ですね。右から80px、上から30pxの中心であずき色、オリーブ色、アクア色順になります。五つ目のネイビー色20%、teal色80%、水平(0deg,180deg)角度で繰り返いしてグラデーションになります。六つ目の角度(-45deg = 315deg)で繰り返いして初め白色から白色まで5px、黒色5pxから黒色10pxまでグラデーションになります。七つ目のrepeating-radial-gradientは繰り返し丸系のグラデーションです。ここのキーワードは四つがありますが、closest-side、closest-corner、farthest-side、farthest-cornerがありますね。 キーワード 説明 closest-side グラデーションの終了形状は、その中心に最も近いボックスの側面(円の場合)または中心に最も近い垂直および水

Study / Javascript, Jquery, Css

#css,#gradation

作成日付 : 2019/12/24 07:37:22       修正日付 : 2020/03/10 23:27:05

199

こんにちは。明月です。アニメーションスタイルは前述で紹介したトランジションと似ているな効果になります。link - [css] トランジション(transition)様々な要素を動的に動く効果と関係があることですね。差異というとトランジション(transition)の場合は指定したcssスタイルによる効果を制御するが、アニメーションの場合は様々なアクションをもっと複雑な効果ができることだといいます。複雑な効果というとトランジション(transition)の場合はスタイルで色の変換、要素移動する時に遅くしたり、早くしたりする制御ですが、アニメーションは要素を回しながら色をキラキラすることができると意味です。私の場合は「loading」イメージやコンテンツの効果よりアイコン要素で動的要素を作る時によく使います。@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; }マウスをバーの上に置いてみてくたさい。アニメーションスタイルをみれば、ほぼトランジションと似

Study / Javascript, Jquery, Css

#css,#animation

作成日付 : 2019/12/20 20:51:38       修正日付 : 2019/12/23 07:44:49

200

こんにちは。明月です。トランスフォームとは3dな表現するように回転、拡大、縮小するスタイルといいます。何かというと下記の形です。 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); } おはようございます。こんにちは。こんばんは。トランスフォーム属性は「transform」,「transform-origin」,「perspective」,「transform-style」,「perspective-origin」,「backface-visibility」の6つがあります。「transform」の属性は変更スタイルを指定することです。回転しようか(rotate)、移動するか(translate),3d軸で移動(translate3d)するオプションもあります。心痛なオプション(scew)、拡大、縮小(scale)、3d的な拡大、縮小(scake)もあります。参照 - https://www.w3schools.com/cssref/css3_pr_transform.asp参照 - https://www.w3.org/talks/2012/0416-css-www2012/demos/transforms/demo-translate3d-cube.html「transform-origin」は回転の軸を決定するもので基本値は「transform-origin: center center」です。回転、拡大、縮小、心痛で使います。「perspective」は遠近感の設定です。「perspective-origin」は上の遠近感の設定する時に位置になります。「perspective-origin:top left;perspective:100px」なら上左の基準で100px距離の遠近感に表示することです。「transform-style」は上の「perspective」と「perspective-origin」をしようとすると設

Study / Javascript, Jquery, Css

#css,#transform

作成日付 : 2019/12/19 13:00:26       修正日付 : 2019/12/19 15:23:12

201

こんにちは。明月です。cssのトランジション(transition)とは属性変更時に変更の速度を調節すること、変更のサイクルを設定することだと思われます。例えば、「div」タグの背景色を黄色にしてマウスを置く(hover)と緑色になることに設定すると思うと実際にタグで設定するとあっというまで処理されますね。例 .example-1 .item{ background-color: yellow; height: 50px; } .example-1 .item:hover{ background-color: green; } マウスを上に置いてください。でもユーザによってこの変更することをスムースにアニメーションのようなアクションを与えたい人が言うと思います。その時にトランジション(transition)を利用すると設定ができます。例 .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; } マウスを上に置いてください。トランジションは4つのスタイル属性があります。4つと言ってもdelayの属性以外にはすべて設定しなければ作動しないですね。「transition-property」はトランジションの属性を与えるcssスタイル名です。上の例では「background-color」に効果を与えますね。「transition-duration」は変換する時間です。上の例とは黄色から緑色に変換することで2秒かかりますということですね。「transition-timing-function」は変換のタイプですが、「ease-out」は初めは遅くて早く変換するタイプ、「ease-in」は初めは早くて遅く変換するタイプ、「ease-in-out」は初めは早くて遅くなるがまた、早く変換するタイプ、「lin

Study / Javascript, Jquery, Css

#css,#transition

作成日付 : 2019/12/18 20:33:57       修正日付 : 2019/12/18 20:35:20

202

こんにちは。明月です。今回はcolumn要素に関して調べます。column要素は筆者もよく使わない機能ですが、仕様によって使うところもあると思うのでまとめておきました。スタイル種類は下記とおりになります。 スタイル 説明 column-count カラムの列数を指定する。 column-width カラムの列幅を指定する(実際の列の幅は、領域のサイズに応じて変化) columns: -width -count 上記2つのスタイルのshorthandスタイル column-gap カラムの間の間隔 column-span 複数のカラムを横断要素 column-rule-width 各列を区別する線の太さ column-rule-style 各列を区切る線の種類 column-rule-color 各列を区切る線の色 column-rule 上記3つのshorthandスタイル break-before ページ指定のスタイル(前) break-after ページ指定のスタイル(後) break-inside ページの指定のスタイル columnsのサイズはブラウザの幅によって変更するので、calc(10vw)に設定しても幅の(30%)になると思います。カラム数を3で設定しましたので、三つが表示されました。column-gapは線の基準で余白設定です。線は2pxで実線、青色で設定しました。h1タグの場合はcolumn要素を無視して表示することです。hrタグで次のカラムから作成の意味です。筆者がcolumn例を作

Study / Javascript, Jquery, Css

#css,#column

作成日付 : 2019/12/17 19:52:56       修正日付 : 2020/02/17 22:35:21

203

こんにちは。明月です。html中で基本的にタグが優先でウェブページを作りますが、タグだけでは画面スタイルで要素配置が限界があります。タグ以外のもっと動的な配置するようには「float」のスタイルを利用してもっと綺麗に配置ができます。上の例をみれば「p」タグの幅が「40%」で、「1」の「p」タグ隣に「2」の「p」タグがあることまで十分に予想できます。「3」の「p」タグの位置ですが、普通なら「1」の「p」タグの下にあることが正常です。でも、実際には「1」タグ隣に「2」、「3」の「p」タグがあります。なぜ、その結果になるかというと「float」タグのことです。上の「p」タグを「float」設定をすべて「left」に設定します。上、右からテトリスになると思ったらよいです。「1」番が右に先に整列します。「2」番を整列します。「3」番は「2」番の下に空間があるので、そこで表示します。同じく下に「4」番のことに置くとどのようになるか?「1」番の下に「4」番が置くことになります。でも上の例は私が「3」番の高さを「40px」に設定しますね。「1」番と「4」番の間が余白がなりました。ここで「1」番の下に余白なしで置く仕方はないかな。「1」番と「2」番の「p」タグは「float」が「left」でしたが、「3」、「4」番は「right」に変更しました。つまり、「3」番からテトリスが上、左に変わることですね。なので「3」、「4」番が上の例みたいになります。普通は「float」要素を「left」、「right」を混在して使わないです。「float」がポータルでダッシュボードのウィジェットを作ることでよく使うスタイルですが、逆にスタイルを崩れやすいのでサイズをよく考えながら使わなければならないです。「float」を使いながら解除したいときには「clear:both;」タグで解除ができます。「4」と「5」番の「p」タグは「clear: both」タグで「float」を解除しました。

Study / Javascript, Jquery, Css

#css,#float

作成日付 : 2019/12/17 00:08:54       修正日付 : 2020/01/31 00:13:16

204

こんにちは。明月です。前述からcssのスタイルに関して纏めています。今回は要素の表示タイプと位置(postision)に関して調べてみます。上の例を見ればスタイルで「display」を使いました。displayは要素のスタイルの形態を決めるものです。displayの要素の値には下記とおりにあります。 値 説明 inline 要素をインライン要素(<span>など)として表示します。 高さと幅のプロパティは効果がありません。 block 要素をブロック要素(<p>など)として表示します。 新しい行から始まり、幅全体を占有します。 contents コンテナを非表示にし、要素の子要素をdomの次のレベルに上げます。 flex ブロックレベルのフレックスコンテナとして要素を表示します。 grid 要素をブロックレベルのグリッドコンテナとして表示します。 inline-block 要素をインラインレベルのブロックコンテナとして表示します。 要素自体はインライン要素としてフォーマットされますが、高さと幅の値を適用できます。 inline-flex 要素をインラインレベルのフレックスコンテナとして表示します。 inline-grid 要素をインラインレベルのグリッドコンテナとして表示します。 inline-table 要素はインラインレベルの表として表示されます。 list-item 要素を<li>要素のように動作させます。 run-in コンテキストに応じて、要素をブロックまたはインラインとして表示します

Study / Javascript, Jquery, Css

#css,#position,#display

作成日付 : 2019/12/13 20:08:50       修正日付 : 2020/01/29 22:58:35

205

こんにちは。明月です。cssのスタイルと言うと基本的に文字列、余白、枠、位置、状態のスタイルが基本だと思います。文字列は前述で説明しましたから、今回は枠(border)と余白に関して調べてみます。htmlタグでよく使うダグだというと「div」タグと「table」タグだと思います。そのところで「table」タグで例を作ります。上をみれば、例としてテーブルを作ってヘッダとボディを分けてテーブルのタイトルと内容を分けてタグを作成しました。スタイルを何もない状況でウェブブラウザに見るとテーブルで作成したとは感じられません。タグだけではテーブルスタイルができないですね。そうするとcssスタイルでテーブルみたいに修正しましょう。今回は「table」タグではなく「span」タグでスタイルを付けましょう。上の例では「div」タグの中で「span」タグを入れました。「div」タグは基本スタイルが「width:100%」です。それは「display:block」タイプですが、「display」タイプには次の投稿で説明します。そのことで高さ、枠を設定しました。「padding」のスタイルがありますね。「padding」は内余白、「margin」は外余白です。例えば「div」と「span」の左の余白は「div」の内余白(padding)の「10px」と「span」の外余白(margin)の「30px」で全て「40px」の余白があります。また「span」の「width」と「height」で「vw」は「vh」単位があります。「vw」はブラウザの画面コントロールにのサイズによって「70vw」は幅の「70%」という意味です。「vh」は縦のサイズによって何パーセントと意味ですね。また、「calc()」でプログラムで関数みたいな文法がありますね。それは括弧の内を計算してって意味です。つまり、cal(70vw-10px)と意味はブラウザの幅の70パーセントサイズで10pxを引くことですね。「margin」や「padding」、「border」の場合は「right」、「left」、「top」、「bottom」の小スタイルを持っています。「radius」の場合は長方形の角を丸くするスタイルです。「box-shadow」の場合は要素の影を描くスタイルですね。

Study / Javascript, Jquery, Css

#css,#style,#border,#margin,#padding

作成日付 : 2019/12/12 20:16:43       修正日付 : 2019/12/12 20:17:24

206

こんにちは。明月です。cssはhtmlタグでスタイルを付ける言語です。webの構造は基本文字でなっているドキュメント形式です。そこでcssで文字スタイルを付けるのが基本ではないかと思います。実はfontのスタイルは上よりもっと多いですね。でも筆者も使ったことがないし、よく使うことは上の以外にはないかと思います。font-sizeは文字のサイスのスタイルです。文字単位では、「px」、「pt」、「em」、「rem」があります。「px」の場合はピクセルの単位で文字のサイズを幅、縦がモニターの12ピクセルサイズになることです。「pt」の場合はフォントサイズの単位ですが、基準としては筆者もよく知りません。でもwordやメモ帳でよく使うフォント単位なので大体にどのサイズかは分かると思います。「em」と「rem」は比率サイズですが、「em」の場合は違いところで設定したサイズによって倍率、「rem」の場合は「root」のサイズ、つまり「html」で設定したサイズの倍率です。上の例は「em」で定義しました。「div.test」は「body」の派生位置になっているので、bodyタグの「font-size:12px」の「1倍」で設定されます。「font-style」はイタリックなどの設定です。「font-family」はフォントの種類を設定することですね。「font-weight」はフォントの太さを設定するところです。数値は何の意味かを詳しくしらないですが、「100」単位で大きい数字だと太くなります。boldやbolder、lighterでも設定ができます。font-colorはフォントの色の設定ですが、代表的な色は英語で設定してもいいです。でも細かい色はhexの色値で設定ができます。hexの色は下記のリンクを参照してください。link - https://htmlcolorcodes.com/text-alignはテキストの整列設定です。text-decorationの場合は取り消し線やアンダーラインなどの設定ができます。text-shadowの場合は影効果ですが、「左右 上下 遠さ」の順番で設定ができます。white-spaceは文字列の折り返し設定ですが、テーブルの場合は自動に折り返すことがあるので、たまにテーブル見方が崩れることがあります。

Study / Javascript, Jquery, Css

#css,#font style

作成日付 : 2019/12/11 21:13:22       修正日付 : 2019/12/11 21:13:45

207

こんにちは。明月です。今回でcss選択子の整理が全て終わると思います。今日、紹介する選択子の使用頻度はよく使いますが、よく使わない。つまり、ウェブサービスのスタイルよって違いますが、よく使うところには使いますが、使わないところは全然使わない、その選択子です。上の例をみれば、3つの「a」タグと「div」タグ、そして5つの「input」タグがあります。先、「a」タグの「link」、「visited」は「link」タグによっては一回もクリックしなかった場合の「a」タグを選択、「visited」は一回以上にクリックした場合の「a」タグを選択することです。つまり、初めは赤色の「a」タグが3つありますが、「選択1」をクリックしてしまうと「選択1」の「a」タグはピンク色になりますね。「:target」は「a」タグで「id」によってフォーカスされたものを選択するものです。つまり、ブラウザのアドレスに「#id」名が指しているものが選択されます。「:enable」と「:disabled」は「input」タグで「diabled」属性が「disabled」か「none」かの選択子です。タグの属性で「enabled="enabled"」とはありませんので、「disabled="disabled"」がなければ、「:enabled」の対象、あれば「:disabled」の対象になります。「hover」はマウスのイベントによって選択するものです。「hover」は要素でマウスが上にあると選択されます。つまり、テキストボックスの上にマウスを置くとテキストが白色になりますね。「focus」の場合はテキストボックスの場合、キーボードのカーソルがテキストボックスにあると選択する選択子です。テキストで入力がおわり、他のことを選択するとこの選択子は解除してしまいます。ここまでcssの選択子に関してほとんど纏めて説明しました。cssの選択子はjavascriptやjqueryでも同じ形式で選択子を使うので「css選択子」はウェブで重要な部分だと思います。

Study / Javascript, Jquery, Css

#css,#selector

作成日付 : 2019/12/10 07:31:28       修正日付 : 2019/12/10 07:32:01

209

選択された要素の基準で隣接された要素や派生(下位)要素を選択する方法に関する記述です。styleでアスタリスクマーク(*)はすべての要素を選択する方法です。すべての要素はfont-styleや基本padding、marginを設定する時に使いますが、すべての要素に反映があるのでよく使わない選択子です。そしてstyle設定でタグあるいはidやclass、属性で要素を選択しますが、コンマ(,)を使えば複数選択も可能です。例えば「p, div」といえばpタグとdivタグを選択することです。そして孫選択子、子選択子の意味は孫選択子の場合、選択要素の中であるすべての派生タグをいうことで子選択子は選択した直下の派生タグを選択することです。上の条件の構造でhtmlが作成したと思えば、aタグの孫要素は「b, c, d, e」タグになるし、子要素は「b, c」にあんることです。つまり、「a d」の指定みたいに、aとd間にスペースを置くと、aタグの孫要素のdタグを選択することです。子要素でみると「a > b > d」の選択子になります。隣接選択子で「+」を使用すれば同じレベルの要素で次(派生ではない)に配置された要素、つまり「b + c」で設定するえば「c」を選択することです。「b + f」の場合はbタグすぐあとで「f」タグがないので何も選択されない結果になります。「~」の場合は「+」みたいに派生ではなく同じレベルの後で配置された要素ですが、すぐ後ろふくめすべての要素ですね。上の例をみれば初めは孫要素を選択するので.p1のh1と.p3のh3になります。でも.p2のh2の場合は.p2の子要素なので.p4のh2タグは当該事項ではありません。~を使って+をつかったので先にクラスが.p1タグの後のdivタグの背景をすべて黄色に設定して、p1タグの次の要素を赤色に設定しますね。

Study / Javascript, Jquery, Css

#css,#selecteor

作成日付 : 2019/12/06 07:27:36       修正日付 : 2020/01/14 18:04:37

210

こんにちは。明月です。前述で疑似クラス nth-childとnth-of-type,first-child,fist-of-typeに関して説明しました。link - [css] 疑似クラス - nth-child, nth-of-type, nth-last-child, nth-last-of-typelink - [css] 疑似クラス - first-child, last-child, first-of-type, last-of-type今回の投稿ではonly-child, only-of-type, empty, empty, rootを調べると思いますが、あまり使わない選択子ですね。それで例を確認しましょう。そしてcssで「only-child, only-of-type, empty, empty, root」を作成してまましょう。「only-child」の疑似クラスは「test」クラスの派生タグで「p」タグが一つだけあることを探します。そしたら「p」タグを持っている「.test」クラスのエレメントは初めの「div」タグと2つ目の「div」タグですね。でも2つ目の「div」タグは「p」タグ以外に「span」タグも持っているので、「only-child」では初めの「dev > p」タグが文字が赤くなると思います。次は「only-of-type」です。「only-of-type」は「only-child」と似てますが、結果は全然違います。「p:only-child」の場合は全ての派生タグで一つの「p」タグと意味です。「span:only-of-type」の場合は全ての派生タグではなく「span」のバグが一つだけのタグですね。「div.test」タグを見ると2つ目と3つ目が「div」タグで「span」タグを持っていますが、2つ目の場合は「span」タグが2つですね。3番目の「div」タグだけ対象です。「:empty」の場合は派生のタグがないタグを調べます。参考に「<タグ>テスト値</タグ>」の形式も派生データがあることで判断します。つまり、「:empty」に選択されません。「:root」は「html」を選択することと同じ意味です。「html」や「body」選択することと「:root」で選択することと差異があるかな。

Study / Javascript, Jquery, Css

#CSS,#Selector

作成日付 : 2019/12/05 07:29:15       修正日付 : 2019/12/05 07:29:41

212

こんにちは。明月です。cssの擬似クラスは役12個ごろありますが、そのなかで「nth-child」、「nth-of-type」、「nth-last-child」、「nth-last-of-type」に関して調べてみました。先、nth-childやnth-last-childは要素のn番目を選択することです。offsetタイプで数えることではないので初めの番後は「1」から始まります。(プログラムで配列などを数える時にoffset概念で「0」から数えますが、cssの場合は人間が数えるみたいに「1」から始まります。)上の例のテーブルで「4」を選択するようには「tbody > tr:nth-child(1) > td:nth-child(2) > p:nth-child(2)」で選択すると選択されます。でも、nth-childで「8」番を選択しようと思うと少し迷ってしまいます。なぜなら、8番のタグは「p」タグではなく「span」タグなのです。簡単に考えるとその「td」の中である「span」タグは一つだけなので「tbody > tr:nth-child(2) > td:nth-child(2) > span:nth-child(1)」で選択するとできそうです。でも、実際はできないですね。理由はnth-childの選択子はタグの要素に関係しずに、選択するからです。つまり、span:nth-child(1)の場合はtr:nth-child(2)の派生タグでspanタグがないので、何も選択されない状況になります。纏めて、上のspanタグを選択したいなら「tbody>tr:nth-child(2)>td:nth-child(2)>span:nth-child(2)」の選択子で選択しなければならないです。この状況になると何か迷いますね。単純な構造ならすぐ気づきますが、複雑なタグ構造なら迷ういますね。それでタグ別で順番を選択できる選択子はnth-of-typeです。このことは同じレベルの同じタグ要素のn番目を選択するのができます。その後は「nth-last-child」と「nth-last-of-type」の選択子です。この選択子はネーミングで気づきますが、逆に選択する選択子です。今回は「6」と「5」を

Study / Javascript, Jquery, Css

#css,#selector

作成日付 : 2019/12/03 07:21:20       修正日付 : 2019/12/03 07:22:19

213

こんにちは。明月です。cssの選択子で一番良く使う選択子はタグによって、「id」によって(#id)、「class」によって(.class)が一番良く使う選択子で次がこの属性選択子ではないかと思います。htmlタグではタグ名があるし、タグテキストがあります。そして属性(アトリビュート)がありますね。css側で上の属性によって選択しましょう。上の例は全て「input」タグが4つ、「a」タグが3つがありますね。cssmp属性選択子で選択してスタイルを付けましょう。上の例をみればbodyの中でタグは全て7つがあります。inputタグは4つで、aタグが3つがあります。属性選択子はブランケット([])で選択します。上の通りで一番上のテキストボックスは枠が黒くなりますね。2つ目のスタイルはボタンタイプのinputタグの枠が赤になります。3つ目はvalue属性、つまり、値がsubmitを含めているボタンは枠が青になります。4つ目はhrefの属性が「https」で始まる「a」タグの文字が緑になります。5つ目はhrefの属性が「localhost」で終わる「a」タグの文字がグレーになります。属性選択子はcss selectorの中で良く使う選択子です。

Study / Javascript, Jquery, Css

#css,#selector

作成日付 : 2019/12/02 07:32:37       修正日付 : 2020/01/14 17:25:53

214

こんにちは。明月です。cssでselectorというのはhtmlドキュメントにスタイルを付けるような指示子ということです。このselectorは単一のタグを設定も可能し、復讐のタグの設定も可能です。そして、タグだけの指示だと特定タグを選択するのは大変ですが、アトリビュート、配列順番なのでも選択が可能です。参照リンク - https://www.w3schools.com/cssref/css_selectors.aspcss selectorを確認するように先にhtmlドキュメントを作成しましょう。上のhtmlタグは普通のテーブルタグです。htmlタグを作成したことがある方なら構造がすく理解すると思いますね。そうすると我々は「tbody」タグの1番の「tr」タグの1版「td」タグを選択したいならどうしましょうか?簡単にタグで選択すると「table#test > tbody > tr:nth-child(0) > td:nth-child(0)」になります。意味としてはtableのアトリビュートのidがtestのタグの直下派生のtbodyの直下派生のtrタグの0番目の直下派生のtdタグの0番目のタグを指しています。複雑ですね。でもタグを指しる時にはこんなに細かく全てのタグ名を書く必要はないです。タグでスタイルを定義するのはそんなに難しくないですね。それなら、css selectorに関して纏めます。 選択子 説明 .class class=”class”の全てのオブジェクトを選択 #id id=”id”のオブジェクトを選択(タグのidはページの雄一が仕様です。) * 全体選択子全てのオブジェクトを選択 element 要素選択子 - 指定した要素を選択 element1,element2 要素選択子 - 選択する要素を様々を指定(element1とelement2を選択) element1 element2

Study / Javascript, Jquery, Css

##Css Selector

作成日付 : 2019/11/28 07:28:03       修正日付 : 2020/01/13 13:59:26

215

こんにちは。明月です。前述までhtmlに関して説明しました。これからcssに関して調べてみます。cssは簡単にいうとhtmlタグでドキュメントを作成したらcss styleでドキュメントにスタイルを付けることかな。cssを反映するように先にhtmlを作成しましょう。上の例はただhtmlだけ作成しました。htmlタグだけでもウェブドキュメントが作成できますが、何か我々が使う一般ウェブスタイルではないですね。ここでcss styleを入れます。一応、cssのスタイルを付けるようにはcss selecterを理解しなければならないですが、それは少し複雑なので別途の投稿で説明します。簡単に見ると「h1」や「li」はタグ名です。「li > a」の場合は「li」タグ直下派生の「a」タグです。つまり「<li><a></a><li>」の「a」タグですね。スペースがある場合(「div div」)はdivタグの派生タグの中で全ての「div」です。上の選択になります。各タグを指定して括弧の中がスタイル形式です。スタイルに関しても量が多いので別途の投稿で説明します。上のスタイルをhtmlのドキュメントの「head」タグの中でいれましょう。また、ブラウザを再更新すると上の結果になります。htmlタグだけで作られるウェブドキュメントより少し華やかになりました。これからcssに関してもっと詳しく調べてみましょう。

Study / Javascript, Jquery, Css

#css

作成日付 : 2019/11/27 07:30:30       修正日付 : 2019/11/27 07:31:26

216

こんにちは。明月です。前述でタグに関して調べて見ました。link - [html] metaタグに関して(seo最適化)今日、説明しようという「opengraph」も実はhtmlのメタタグの中ですが、その特性が一般メタタグと違うので別の投稿で掲示しました。「opengraph」はsns(ソーシャルネットワーク)でよく使うタグです。我々がsnsでウェブページのリックを##00コピペーする時に、ただurlアドレスだけあればそのリンクだけではウェブページの情報が何があるかを知らないですね。例えば、私がツイッターにブログのリンクを掲示した場合、他人がそのリンクが開発サイトかアダルトサイトかは知らないです。また、最近ウェブページでスパムや悪性コードがあるサイトが多い時代にはただリンクだけでは接続が大変ですね。その時に使うプリビュータグでイメージやリンクの説明、タイトルを表示するようなタグです。上のイメージは私がツイッターに掲示したブログのリンクです。イメージやタイトル、説明が表示されますね。「opengraph」に関して調べましょう。link - http://ogp.meopengraphの基本タグ1. og:title - サイトのタイトルタグ2. og:type - サイトの種類スタイル (例)video.movie3. og:image - サイトの代表イメージ4. og:url - サイトの代表urlopengraphのオプションタグ1. og:audio - サイトで含めるオーディオファイルurl2. og:description - サイトの説明3. og:determiner - 文言の始まる単語の選択ですが、日本語とは関係ないと思います。4. og:locale - サイトの言語です。基本値は「en_us」ですが、日本語は「ja_jp」です。5. og:locale:alternate - サイトの多国語設定タグです。6. og:site_name - サイトタイトルはtitleタグで設定しますが、site_nameは細かいカテゴリタイトルです。7. og:video - サイトで含めている動画ファイルurlopengraphの構造プロパティog:オブジェクト:url - イメージあるいはビデオ、オーディオオブジェクトアドレスog:オブジェクト:secure_url - ssl(https)のア

Study / Javascript, Jquery, Css

#ogtag

作成日付 : 2019/11/26 07:42:20       修正日付 : 2019/11/26 07:42:56

217

こんにちは。明月です。ウェブドキュメントの中でメタタグのウェブドキュメントの説明、キーワード、要約情報と考えられます。htmlはウェブページの基本骨格で考えられるし、cssはこの骨格で色やフォントサイズなどのスタイルを付けてユーザがもっと綺麗、よく見えるようにすることで、javascriptはそのページを動的に変換させ整合性ウェブプロシージャを実装、動的に変換をあげ、プログラムらしく動くようにする機能です。そのなかでhtmlのタグ、タグの中でメタタグということがあり、ウェブページの詳細情報になります。メタタグは3つのアトリビュート(属性)を持っています。1. http-equiv - ヘッドの値を正義することができる属性だし、この属性でサーバとブラウザ間の作動方法、指示を正義するアトリビュートです。2. content - meta情報の内容です。3. name - ドキュメントラベルのメタデータの名を正義します。itemprop、http-equivあるいはcharsetの属性の中で一つでも設定された場合、設定できません。1. 文字コードの種類設定 ウェブページのエンコーディング属性を指定できます。2. 互換性設定ブラウザ別の互換性を設定するタグです。ie 8から11、edgeまでの各バージョンによってレンダリング特性が違います。少なくとも色のコードも少し違いますね。そのことでウェブのドキュメントが何のバージョンに最適化になっているかを設定することです。最近にはie8バージョンや9、10バージョンに合わせる必要がないので、前よりは重要が少ないです。普通は基本的に入れるタグですが別にこのタグがなくてもウェブサイトを実装することではそんなに問題ないと思います。3. ビューポート設定モバイルとpcは解像度は違います。特にモバイルの場合、モニターのサイズによって解像度が高いですが、この解像度によってウェブを設定するとモバイルでは文字がすごく小さく見えると思います。そして、ウェブの形が解像度ではなくサイズによって表現しなければならないですが、そのことを設定するタグです。4. 説明タグ(description)このタグは検索エンジンで説明がでる部分です。私の考えではseoタグの中では一番重要な部分ではないかと思います。このタグの内容がなくても検索ができないか説明表示をしないことではないですが、検索の優先順位で高くで

Study / Javascript, Jquery, Css

#metatag,#SEO

作成日付 : 2019/11/25 20:16:18       修正日付 : 2019/11/25 20:16:18

218

こんにちは。明月です。ウェブサービスで構成するものは大幅で「html」と「javascript」、「css style」があります。その中で「html」はxml形式でドキュメントの構造を担当しているし、「css style」はuiデザインスタイルを担当しています。「javascript」の場合はウェブドキュメントを動的に動くようにスクリプトの領域です。先に「html」の構造に関して調べましょう。「html」はxml形式を継承したので、基本はタグが開くと閉める構造になっています。「<タグ></タグ>」の構造ですね。閉めるタグには「/」記号を入れて表示します。基本構造は初めドキュメントタイプ宣言してhtmlタグから始まります。htmlタグはheadタグとbodyタグが必須にあるし、headタグはtitleタグが必須にあります。上の構造になっています。headのタグはtitleやメタタグ、style宣言、script宣言などがあります。bodyタグは実際にブラウザから見えるデータタグがあります。 タグ 説明 html htmlタグの最上位タグです。(必須) head htmlの下位タグでheadではタイトル、メタ情報があります。 body htmlの下位タグでhtmlのドキュメント情報があります。 meta headの下位タグでドキュメントのメタ情報があります。 メタ情報はドキュメントエンコーディング情報、キーワード、検索サイトの制御設定、外部リンク情報があります。 title headの下位タグでhtmlドキュメントのタイトルで宣言するし、ブラウザのタイトルで表示します。 link headの下位タグでライブラリなどをリンクします。 header bodyの下位タグでドキュメントの上端部分を作成します。

Study / Javascript, Jquery, Css

#html,#tag

作成日付 : 2019/11/22 19:49:41       修正日付 : 2019/11/22 19:49:41

219

こんにちは。明月です。前述でubuntuでapache2をインストールする方法に関して投稿しました。link - [ubuntu] apache2をインストールする方法ubuntuでphpをインストールする方法は難しくないです。設定は少し必要ですが。先にapt-getにレポジトリを追加してインストールしましょう。link - https://www.liquidweb.com/kb/install-php-7-2-ubuntu-16-04/ターミナルでapt repositoryを登録してphp 7.2をインストールすればできます。ubuntuではapache2のphp設定が別に必要ないです。これでphpのインストールは完了です。apache2のドキュメントパスを修正します。「/etc/apache2/sites-enabled」フォルダの「000-default.conf」のファイルを修正します。そして「/home/htdocs」フォルダに「index.php」ファイルを追加してphpinfo()を作成しましょう。そして「apache2」を再起動して「localhost」で接続しましょう。phpがインストールされたことを確認できます。そして「php.ini」ファイルが何処にあるかを確認できます。phpが完了しましたから、composerをインストールしましょう。先、curlをインストールしましょう。そしてcurlのインストールファイルをダウンロードしてインストールします。link - https://getcomposer.org/download/ここまでcomposerはセット完了しました。簡単にライブラリを一つ連携して使用してみましょう。php用composerレポジトリは下記通りです。link - https://packagist.org/javaのmavenレポジトリに比べると少し片付けれている雰囲気ではないけど、必要な情報はすべてあるので、良いサイトです。先、検索テキストにcarbonと言うことで検索してみましょう。参考にcarbonはphpでデートフォマットを使えるライブラリです。(date関数があるのに?)それでよく使える順位で検索させますが、一番上のリストをクリックしましょう。様々な説明がありますが、我々はこのライブラリが目的ではなく、composerのリンクが目的なので一応inst

Devlopment note / Linux

#Ubuntu,#PHP,#Composer

作成日付 : 2019/11/13 07:32:21       修正日付 : 2019/11/13 07:35:07

220

こんにちは。明月です。筆者は貧しいデベロッパーなのでwindowosよりubuntuをよく使っています。windowは高いですが、ubuntuは無料だからですね。でも、ubuntuが貧しい人が使うものではないです。もちろん、windowよりubuntuを好きなマニアックも多いです。macはどうかな。。macは高いですね。筆者が考えてmacよりwindowがアプリも多いし、macが楽なことはよくしりません。それは人によって違うですね。ubuntuを初めて使う時には基本テーマが綺麗ではないですね。少しやぼったいかな。でもubuntuの特徴の一つがuiテーマを変更ができることです。筆者は別に気になるテーマがあることではありません。ただ、googleを検索して一番人気があるものを選択してインストールして使いますね。今の経験でそのほうが一番満足だったんです。link - https://www.omgubuntu.co.uk/2017/11/best-gtk-themes-for-ubuntu上のリンクで人気テーマを検索するとarcテーマが一位でよく使うと書いています。上のサイトは信用性が高いチャートや特別なサイトではなく、ただgoogle検索で一番上で表示されたサイトです。筆者が使うのはどのテーマが一位かが重要ではなく、arcデザインがいいし、そのサイトでただ1位だったという参照だけです。先、テーマをインストールするようには「tweak」と言うプログラムがインストールされなければならないです。私の場合は「tweak」というプログラムはもうインストールされています。そしてターミナルでターマをダウンロードしましょう。link - https://www.ubuntupit.com/install-arc-theme-icon-ubuntu-fedora-linux-desktop/ダウンロードが完了されるとapplicationsとiconにarcの語頭が付けているテーマがあることを確認できます。筆者の場合は「arc-dark」が気になって選択しました。そしてshellとdockerのテーマも変更しましょう。gnomeのshell拡張をターミナルでインストールしましょう。firefoxで下記のサイトを接続しましょう。link - https://extensions.gnome.org/そして確認add-onをインス

Devlopment note / Linux

#Ubuntu,#tweak,#arc

作成日付 : 2019/11/12 07:32:13       修正日付 : 2019/11/12 07:40:11

223

こんにちは。明月です。ubuntuのosはcentosと比べてサーバよりデスクトップで使う方が多いです。なので、centosではプログラム開発することより完成したプログラムをデプロイすることが多いです。でもubuntuの場合はデスクトップで使うのでデプロイより開発する方法が多いですね。javaをインストールとjavaのideのeclipseをインストールして開発完了を作ってみましょう。初期ubuntuをインストールするオプションでjavaをインストールする時もあるので一応インストールされているかを確認しましょう。上のコマンドでjavaバージョン情報がでるとインストールされているし、「not found」というメッセージがでるとインストールされてないことです。インストールは「apt install default-jdk」でインストールしました。(イメージは間違ってjreをインストールしました。jdkも同じです。)javaがインストールされたらeclipseサイトに接続しましょう。link - https://www.eclipse.org/downloads/ダウンロードが完了したら圧縮を解凍しましょう。これから実行しましょう。正常に実行しました。eclipseの場合はショートカットはwindowみたいに簡単に作られないですね。ショートカットファイルを作成しましょう。

Devlopment note / Linux

#Ubuntu,#java,#eclipse

作成日付 : 2019/11/08 07:29:55       修正日付 : 2019/11/08 07:31:45

225

こんにちは。明月です。linuxには大きい幅で種類が2つがありますね。redhat系のredhatとcentosとdebian系のubuntuがありますね。redhat系はほとんどサーバosで使います。一般、デスクトップosモードもありますが、uiが可能なアプリも少ないし使用にくいですね。でも、プロセスやフリージング(パソコンが凍る現象)が少ないのでサーバとして合うと思います。debian系のubuntuはcentosより安定性が落ちるけれど、互換アプリ、uiが可能なアプリが多いし、インストールがしやすいです。コミュニティーも大きいので問題がある時にすぐ調べることも出来ます。普通はデスクトップでwindowを使いますが、ライセンス費用がかかるので安くパソコンを運用したいならこのubuntuもいいではないかと思います。筆者はパソコンが何台にありますが、windowは一台でその後は全てubuntuですね。ubuntuは初期ブラウザでfirefoxがインストールされています。firefoxもいいブラウザですが、最近は多いウェブサイトがchromeでuiデザインが合わせていますのでchromeもインストールする必要がありますね。先にgoogleのchromeページに接続します。多分、ubuntuで接続するとlinux系のインストールができるファイルがでます。そしてwindow環境みたいにダウンロードボタンを押下すると選択画面が出ます。rpmはyumでインストールすることで(実はrpmはrpmでインストールしなければならないですが、yumでもインストールができます。)debがubuntu環境でインストールするファイルなのでダウンロードしましょう。ダウンロードが終われば実行します。そしたらubuntu software管理ウィンドウが開きますね。ここでインストールボタンを押下してインストールしましょう。インストールが完了したらluncher(画面の左下)をクリックするとchromeがインストールされたことを確認できます。add to favoritesをクリックしてdockに固定ができます。

Devlopment note / Linux

#chrome,#ubuntu

作成日付 : 2019/11/06 19:48:19       修正日付 : 2019/11/06 19:48:19

226

こんにちは。明月です。我々がよく使うウィンドウ環境はインストールパッケージファイルをダウンロードしてダブルクリックでインストールができます。でも、linuxの場合はそんな簡単ではないです。サーバ起動する時に登録しなければならないし、パッケージ管理、依存性管理もしなければならないです。それを一々で手動でするとすごく面倒になりますね。それを管理するプログラムがありますが、それが「yum」です。「yum」とは「yellowdog updater modified」の略語で「rpm基盤のシステムのため、自動アップデータ、パッケージ管理ツール」です。また「yum」は自動に依存性を処理してくれるし、rpmパッケージを安全にインストール、削除及びアップデートのため、必ずしなければならないものを自ら処理します。簡単に説明するとスマートフォンなどであるappストアと似てます。パッケージは全て無料ですね。昔、スマートフォンがある前には不慣れな概念でしたが。。纏めて、「yum」は簡単で使用可能し、接近性もよいパッケージ管理ツールです。「yum」に関して使用方法はコマンドで「yum help」で詳しく確認できます。 コマンド 説明 yum check-update現在、インストールされたプログラムでアップデータしたことをチェックします。 yum clean allキャッシュされたリストをクリアする。 yum deplistyumパッケージによる依存性テスト。 yum downgrade パッケージyumをとおってパッケージをダウングレードする。 yum erase パッケージyumをとおってシステムで削除する。 yum groupinfo グループグループパッケージの情報を表示。 yum groupinstall グループグループパケージをインストールする。 yum grouplist グループグループリストに関する情報を確認する。

Devlopment note / Linux

#centos,#yum

作成日付 : 2019/11/05 07:17:58       修正日付 : 2019/11/05 07:21:20

227

こんにちは。明月です。今回はcentosでmariadbをインストールしましょう。mariadbは旧mysqlと同じですが、mysqlがoracle社に買収されて配布しましたが、最近mysqlも無料ではなく、一部有料政策に変わって最初開発者が退職して無料sqlを作ったことがmaraidbです。なので、mariadbをcentosにインストールしましょう。mariadbをインストールする方法で様々がありますが、sourceで直接にコンパイルする方法、binaryでインストールする方法、yumを利用してインストールする方法があります。筆者の場合は別に基本設定で使うつもりなので、管理がしやすいなyumでインストールします。上のリストの中で「mariadb-server.x86_64」をインストールします。インストールが終わったらmariadbの環境設定しましょう。環境設定ファイルは「/etc/my.cnf」であります。設定が完了したら起動設定に登録しましょう。ここまでサーバ側の設定は完了しました。内部データベースのユーザ追加とパスワード設定をしなければならないです。一応、mysqlを接続してmysql dbでユーザテーブルを確認します。見るとパスワードが設定されてないです。一応、パスワード全体を設定しましょう。上の場合は「root」ユーザはサーバローカルの場合はよいですが、外部だと接続ができません。でもrootのidを外部で公開する方はセキュリティの考えでは嫌ですね。それでユーザを追加しましょう。筆者の場合はcクラス192.168.0.%で公開しましたが、全体公開はただ「%」で設定すると全「ip」で公開されます。最後でファイアウォールを開放しましょう。サーバではなく、自分のパソコンでsql編集ツールを利用して接続しましょう。

Devlopment note / Linux

#centos,#mariadb,#mysql

作成日付 : 2019/11/04 18:35:10       修正日付 : 2019/11/04 18:36:24

230

こんにちは。明月です。phpとは「apache」サーバの基盤で動作するウェブスクリプトプログラム言語です。phpはjavaとc#と比べてコンパイル言語ではなく、スクリプト言語です。phpの良い点は軽く、早く開発できるし、サーバの再起動がなしでソース修正が可能なことが利点ではないかと思います。悪い点はやはりスクリプト言語なので、サイトが大きくなると遅くなるしソース管理が難しくなるということです。まぁ。開発者の腕によって違うことですからね。それではcentosでphpをインストールしましょう。phpの場合は「yum」を通ってインストールしましょう。先、listを通ってphpを確認しましょう。でも、phpバージョンが低いですね。。。現在は「php7」なのに。。「yum」ではなく、直接にインストールしましょう。「yum」のconfigで「php5.4」を非活性化して「php7.3」を活性化しましょう。これからインストールする雰囲気になります。phpと関係あるライブラリをインストールしましょう。インストールが完了でサービスを活性化します。これで「php-v」でphpのバージョンを確認すればphpがよくインストールされていることを確認できます。でも、ただのphpインストールだけではなく、「apache」を通ってphpが動くことを確認しなければ完了ではないですね。これから「httpd」の環境設定ディレクトリに移動しましょう。httpd.confの下の部分で下記の構文を追加しましょう。そして「dir_module」でスタートページで「index.php」を追加しましょう。そして「/var/www/http」のディレクトリに「phpinfo.php」ファイルを作成して下記の内容を入れましょう。そしてブラウザで./phpinfo.phpに接続しましょう。上のphpの仕様に関して表がでればインストール成功です。

Devlopment note / Linux

#centos,#php

作成日付 : 2019/10/29 20:09:03       修正日付 : 2019/10/29 20:10:02

231

こんにちは。明月です。前述でcentosでapacheとtomcatをインストールしました。先にtomcatの場合は独立でウェブサーバで運用できますが、なぜ別で「apache」をインストールして「tomcat」を連携するのかは「tomcat」は確かにウェブサーバの機能がありますが、「apache」よりロードバランシングや仮想機能が落ちています。最近、バージョンが「9.x」まで上がって性能が以前よりは良くなりましたが、それでも分ける方がよいですね。筆者の場合はサーバで「java」だけではなく、jsp、phpなど混在してプログラミングするタイプなので、「apache」の「virtual host」機能をよく使うので、「tomcat」のサーバの一つだけではなく、様々な「tomcat」かつ一つの「apache」を紐付いて使っています。それで、「apache」と「tomcat」を連携しましょう。先、「tomcat」にはhttpポートを設定してブラウザと通信するhttpプロトコル領域があります。または、「ajp」プロトコルという「apache」と通信するポートがあります。「apache」と「tomcat」を連携するようにはこの「ajp」プロトコルを利用しましょう。「apache」側で「ajp」プロトコルを使うようには「mod_jk」がインストールされなければならないです。mok_jk - https://tomcat.apache.org/download-connectors.cgi圧縮を解凍したらこれからコンパイルをしなべきです。「native」フォルダにいきましょう。「/etc/httpd/modules」フォルダで「mod_jk.so」ファイルがあれば、コンパイル成功です。そして「httpd.conf」に行って下記とおりに設定しましょう。その後、「workers.properties」を作成しましょう。筆者の場合は「jenkins」とウェブサーバがあるので2つで設定しました。また「httpd.conf」を下記とおりに追加しましょう。そしてそれぞれのディレクトリに「apache」権限を与えます。

Devlopment note / Linux

#centos,#apache,#tomcat

作成日付 : 2019/10/29 07:28:33       修正日付 : 2019/10/29 07:37:07

232

こんにちは。明月です。javaでウェブサーバーを立ち上がるようには「apache-tomcat」が必要です。「apache-tomcat」とはウェブブラウザからhttp要請が来る時に動的にウェブページを作り直し、ウェブブラウザに応答するウェブアプリケーションサーバ(was)です。正確にいうとウェブサーバではなく、ウェブアプリケーションサーバですね。でもこのトムキャットは「apache」機能も一部含めているので、独立でサーバを立ち上がることができます。でも、ロードバランシングや仮想ホストなどで純正な「apache」よりはパフォーマンスや機能が足りないので、実際には「apache」 + 「tomcat」でサーバを構成することになります。開発環境は「tomcat」だけでも十分ですね。「centos」に「tomcat」をインストールしましょう。先、「tomcat」をサーバで使うようには「java」が先にインストールされなければならないです。link - [centos] java インストールこれから「/usr/local/lib」のディレクトリに行ってトムキャットをダウンロードしましょう。link - https://tomcat.apache.org/download-90.cgiダウンロードが終わったら圧縮を解凍して、起動しましょう。ファイアウォールでウェブポート(tomcatの場合は基本8080)を開放しましょう。ブラウザで8080ポートで接続すれば下記とおりの結果がでます。起動することができたら、サーバが起動するたびに自動にトムキャットと起動されるように設定しなければならないです。「/etc/rc.d/init.d」に行って「tomcat」という起動実行ファイルを作りましょう。そこで下記とおりにスクリプトを作成しましょう。そのファイルタイプを「chmode」で変更して「chkconfig」で登録すれば完了になります。

Devlopment note / Linux

#centos,#tomcat,#linux

作成日付 : 2019/10/28 22:38:56       修正日付 : 2019/10/29 07:28:47

233

こんにちは。明月です。javaをcentosにインストールする方法では二つがあります。先、「yum」をとおってインストールする方法と直接にjavaをダウンロードして圧縮を解凍してパス設定する方法があります。個人的には「yum」を通ってインストール方法が良いと思います。なぜなら「yum」でインストールする後で「update」管理を受け取られるからです。でも「production」サーバや「java」バージョンに敏感なプロジェクトの場合は「yum」より手動で管理するほうが良いと思います。先に手動にインストール方法を確認して「yum」でインストールする方法も確認しましょう。javaのホームページに行きましょう。javaホームページ - https://www.oracle.com/technetwork/java/javase/downloads/index.htmlサーバで運用するjvmをインストールすることなのでjreでも別にいいですが、なんか自分の場合はjdkが楽ですね。我々はjreのjvmを使うので別にどっちでもよいですが筆者はjdkでインストールします。64ビットと32ビットがあるし、rpmとtar.gzの種類が二つがあります。先にosのビットは「getconf long_bit」で確認できます。rpmの場合は「yum」でインストールすることなので一応スキップして手動のインストールなので「tar.gz」でダウンロードします。(wgetでダウンロードすると認証エラーになります。ただ、私はウェブでダウンロードして「samba」でコピーしました。)筆者は綺麗に「/usr/local/lib」でコピーしておきました。これから圧縮を解凍しましょう。シンボリックリンクを設定しましょう。そして「/etc/profile」でパスを指定しましょう。ここで「source profile」でもよいし再起動してもよいです。ここまでが手動インストールです。これからは「yum」をとおってインストールしましょう。先に「yum list」でなにがあるか確認しましょう。ただ「java*」で検索するとデータが多すぎで「java-1.8.0*」で検索しましょう。1.8.0バージョンだけで種類がすごく多いですね。この種類はよくしらなくただ「devel」が含めている名をインストールしましょう。「java」の依存性があるアプリもすべてインストー

Devlopment note / Linux

#centos,#java

作成日付 : 2019/10/28 00:22:32       修正日付 : 2019/10/28 00:23:28

234

こんにちは。明月です。我々がサーバosをインストールする理由はいつも動いているサーバプログラムを起動するためですね。その中で代表的なことがウェブサーバです。ウェブサーバの種類は様々がありますが、その中で「iis」と「apache」が有名ではないかと思いますね。でも「iis」の場合はlinux型ではなく、windowサーバosで動いているし、ウェブサーバと言っても実はasp.netとaspのアプリサーバというのが近いですね。参考にウェブアプリサーバはブラウザとウェブサーバが通信する時に必要な応答ヘッダとボディを動的にパーシングするの役のサーバです。つまり、「iis」の場合はwindowサーバosので動いてるしウェブサーバとアプリサーバ機能があるウェブサーバです。「apache」の場合はwindowとlinuxバージョン両方あります。基本的に「apache」だけにはアプリサーバ機能はありません。なので静的なファイルを要請、応答することです。拡張機能で「php」をつけるとphp言語はパーシングができます。その後でウェブサーバはトラフィック分散機能、仮想機能などがありますが、それは別途で必要な時に投稿します。これから「apache」をインストールしましょう。インストールが完了するとサーバを起動しましょう。ファイアウォールも設定しなければならないです。これからブラウザを接続して下記通りに画面が出るとokです。後は、サーバosが起動する時に自動にサーバが起動できるように設定をしましょう。サービスがdisabledになっていますね。上のコマンドを実行すると「enable」に変わります。そうするとサーバを再起動しても「apache」が起動します。環境設定パスは「/etc/httpd」です。「/etc/httpd」の中には「conf」のディレクトリがありますが、そこで「httpd.conf」が「apache」の環境設定ファイルです。

Devlopment note / Linux

#linux,#centos,#apache

作成日付 : 2019/10/25 21:43:27       修正日付 : 2019/10/25 21:44:13

235

こんにちは。明月です。centosを運用する時にハードディスクの量を確認しべきな時があります。それを「df」,「du」のコマンドで確認ができます。でも、「df」と「du」の場合はチェックする方法が違い「df」の場合でバグが発生する時があります。最近、centos運用中でサーバディスクがいっぱいになった時があります。普通のローカルのウィンドウpcだとハードディスクの量が足りなかったらアラムメッセージが出るからすぐ気づきますが、centosの場合は別にメッセージもないし、普通はリモートでターミナルで運用するからよく知ることが大変ですね。私の場合はファイルをアップロードする時に急にアップロードができなくなって、何かとみたらハードディスクがいっぱいになっていました。サーバでそれぞれのアプリケーションを運用するからログがたくさん貯まっていましたよね。よく確認しなければならないです。その時に確認する方法が「df -h」コマンドでした。rootで「du -hs *」で確認する方法もあります。すごく簡単です。そして実際に「df -h」と「du -hs *」のコマンドを実行すれば「df -h」の方が処理速度が早いです。でもこの「df -h」はバグがあります。「df」のコマンドはそれぞれのアプリケーションでよく使うコマンドなので困りますね。上のイメージで自分のファイルリストを見れば、トムキャットのログがすごく貯まっていますね。約36gbファイルが2つありますね。ログで。。。実は私がトムキャットの設定が間違っているから発生したことですが、一応、そのことは対応してログを消さなければならないですね。それでそのファイルを消しました。それでもう一度「df -h」と「du -hs *」を確認すると「du -hs *」で見るのは確実に60gbが減らしました。でも「df -h」はそのままですね。私が確かにログファイルを消したので「du -hs *」の結果が合ってると思います。そうすると「df -h」が問題ですが。様々を調べると多分「ioライブラリ」と関係がありそうです。コネクションによって問題が発生したと意味ですが。。コネクションによって問題になる気がします。以前にも私の場合は同じエラーがなった時があります。その時もハードディスクの使用率が「100%」まで使ったことがあります。やはりその時もログを全て消しましたが、ディスクがいっぱいでエラー

Devlopment note / Linux

#linux,#centos,#df,#du,lsof

作成日付 : 2019/10/24 21:46:31       修正日付 : 2019/10/24 21:47:26

236

こんにちは。明月です。centosをインストールする時には基本「root」のidでパスワードを設定します。でもサーバでidをそのままを置いたらもしサーバが露出されると最高権限の「root」が見つかれされてしまいます。そのままだとサーバのセキュリティに大問題になります。それで「root」のidを接続を制限して「wheel」のグループのidで接続して「sudo su」で管理者権限(root)を受け取って運用することになります。それで「wheel」権限を設定してみましょう。先、vi編集ツールで「/etc/pam.d/su」のファイルを開きます。編集ツールで確認すると「auth required pam_wheel.so usd_uid」部分にコメント(#)になっています。この部分のコメントを解除します。その後、ユーザを追加しましょう。もう登録したユーザがあれば諸略してもよいです。そして追加したユーザを「wheel」グループに追加します。そして「bin」にある「su」のファイルを「wheel」グループに実行権限を与えましょう。最後に「root」のidを隠します。その後、サーバをrebootをします。rootで接続を試したが、認証失敗のメッセージが出ました。最後に登録したユーザで接続しましょう。「sudo su」でコマンドを入れると権限が「root」に代わります。

Devlopment note / Linux

#centos,#wheel,#linux

作成日付 : 2019/10/23 23:53:40       修正日付 : 2019/10/23 23:55:04

239

こんにちは。明月です。サーバの種類は色々がありますが、代表的には「linux server」と「window server」があります。「window server」なら「window」のosから「remote desktop」という基本プログラムを利用して接続します。「linux」の場合は「ssh」プロトコルで接続しなければならないですが、「window」では基本プログラムがないですね。「ssh」で接続するプログラムが様々なことがありますが、その中で機能は少ないけれども、すごく軽くて簡単に使える「putty」があります。link - https://www.putty.org/ダウンロード - https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe上のリンクでダウンロードして実行しましょう。「putty」はすごく簡単なプログラムなので特に説明することがないですね。基本設定のほどを説明します。サーバをインストールする時に文字でエラーが発生しないようにほとんど英語でインストールしますが、たまに日本語バージョンでインストールする時があります。その時に文字化けが発生するときがあります。それを解決する方法はエンコーディング種類を変更すればできます。「window」=>「translation」項目でキャラクターセットを変更すればよいです。そして「putty」の基本色は黒い背景で白い文字が基本ですね。ディレクトリやファイルタイプによって色が変わります。また、黒い背景で白い文字を変更したいなら、変更ができます。格納したディフォルト設定は「regedit」で削除ができます。もちろんバックアップもできますね。「コンピューター\hkey_current_user\softeare\simon tatham」を削除すれば、設定がすべてなくなるし「エクスポート」するとバックアップができます。

Devlopment note / Linux

#putty,#linux

作成日付 : 2019/10/20 00:42:54       修正日付 : 2019/10/20 00:56:11

240

こんにちは。明月です。ウェブサーバということで代表的なミドルウェアは「apache」と「iis」があります。「iis」の場合はwindowサーバの専用のウェブサーバです。iisで使えるプログラム言語は「asp」と「asp.net」があります。追加モジュールをインストールすると「php」や「java」も出来ないことではないですが、普通で使わないです。「apache」の場合はwindowサーバやlinuxサーバで別にosの関係なくて運用できるウェブサーバです。「apache」の場合はアプリサーバではないので「apache」ままでは静的ウェブページと「perl」、「python」だけを使えますが、「tomcat」や「php」を拡張すると「java」や「php」まで使えます。link - https://www.apache.org実は上の公式ホームページでは「apache」サーバをダウンロードができません。いや、正確にいうとコンパイル前のソースがあるのでダウンロードしてもコンパイルをしなければならないです。その手続きが簡単ではないですね。それでコンパイルされたファイルをダウンロードしなければならないですが、それは別のアドレスで提供しています。link - https://www.apachelounge.com/download/この間まではバージョン2.2も提供しましたが、もう、提供しないらしいですね。それなら「2.4」バージョンをダウンロードしましょう。ダウンロードして適当なところで解凍しましょう。そして「conf」フォルダの中で「httpd.conf」ファイルがありますが、メモ帳で開きます。その中で「server root」を変更しなければならないです。上の37行目で「serverroot」が「c:\apache24」で設定されていますね。私の場合はdドライブでインストールしましたので、「d:\apache」で設定しました。2.2バージョンでは置換子がなかったので修正する項目が多かったが、2.4バージョンは置換子(define)があるのでそこだけ修正すれば良いですね。コンソールに当該なディレクトリに移動して「bin」フォルダの「httpd」を実行しましょう。後、ブラウザに「localhost」を打って接続しましょう。「it's work」という文言が出ればきちんとインストールがされていることです

Devlopment note / Window

#window,#apache

作成日付 : 2019/10/18 07:36:51       修正日付 : 2019/10/18 07:38:38

241

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

Study / Java

#java

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

242

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

Study / Java

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

243

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

Study / Java

#java

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

244

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

Study / Java

#java

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

245

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

Study / Java

#java

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

246

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

Study / Java

#java

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

247

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

Study / Java

#java

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

248

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

Study / Java

#java

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

249

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

Study / Java

#java

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

250

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

Study / Java

#java

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

251

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

Study / Java

#java

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

252

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

Study / Java

#java

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

253

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

Study / Java

#java

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

254

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

Study / Java

#java

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

255

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

Study / Java

#java

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

256

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

Study / Java

#java

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

257

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

Study / Java

#java

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

258

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

Study / Java

#java

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

259

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

Study / Java

#java

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

260

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

Study / Java

#java

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

261

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

Study / Java

#java

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

262

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

Study / Java

#java

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

263

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

Study / Java

#java

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

264

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

Study / Java

#java

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

265

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

Study / Java

#java

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

266

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

Study / Java

#java

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

267

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

Study / Java

#java

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

268

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

Study / Java

#java

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

269

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

Study / Java

#java

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

270

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

Study / Java

#java

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

271

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

Study / Java

#java

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

272

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

Study / Java

#java

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

273

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

Study / Java

#java

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

274

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

Study / Java

#java

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

275

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

Study / Java

#java

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

276

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

Study / Java

#Java

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

277

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

Study / Java

#Java

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

278

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

Study / Java

#java

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

279

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

Study / Java

#java

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

280

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

Study / Java

#java

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

281

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

Study / Java

#java

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

282

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

Study / Java

#java

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

283

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

Study / Java

#Java

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

284

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

Study / Java

#java

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

285

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

Study / Java

#java

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

286

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

Study / Java

#java

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

287

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

Study / Java

#java

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

288

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

Study / Java

#Java#

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

289

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

Study / Java

#Java#

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

290

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

Study / Java

#Java#

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

291

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

Study / Java

#Java#

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

292

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

Study / Java

#Java#

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

293

こんにちは。明月です。この投稿はc#のlockキーワードとdeadlock(デッドロック)に関する説明です。以前の投稿でスレッドに関して説明しました。link - [c#] 37. スレッド(thread)を使い方、thread.sleep関数を使い方スレッドとはプロセスの中で同時にいろんな処理を実行するための並列処理ということに説明しました。それならこの並列処理を処理する時に、一つのインスタンスや変数に値を処理するとどのようになるかな?上の結果をみると0から10まで足すスレッドを10回に実行しました。なので、0から10まで足すと55だし、10回に実行したので予想する結果の値は550が出力することが正常です。でも結果は550ではなく481ですね。望んだ結果が出ませんでした。理由はsumに値を足す時、sumの値が0の場合、始めのスレッドで1を足して1になるし、二つ目のスレッドで足す時に、1を足して2がなると予想します。でも、threadというのは並列処理なので、始めのスレッドで0から1を足す時、二つ目のスレッドで1から2になることが確かではありません。つまり、始めから0から1を足す時、二つ目のスレッドで1を足す時、まだsumの値が始めのスレッドで1になる前なので、sumの値が0の可能性があります。改めて説明すると、始めスレッド、二つ目のスレッドで0から1を足すことになります。そのように重なる処理が多くなるとsumの値が550まで届かないことになります。スレッドは少し早い処理のため、並列処理をしますが、予想する値が出ないなら意味がありません。しかし、スレッド、このすべての並列処理でsumに足す処理だけスレッドをすべて同期化したらこの問題が解決になります。クラスインスタンスにlockを掛けたらlock掛けた領域を使ったら他のlockを掛けるところでlockを通過することを待つことになります。つまり、並列処理の始めのスレッドでlock(node)を通過することになると二つ目のスレッドでの始めのスレッドのlock(node)のスタック領域が終了するまで待機することになります。そうなら始めのスレッドのlock(node)でスタックが終了になると二つ目のスレッドのlock(node)が通過して三つ目のスレッドのlock(node)が待機することになります。その順番とおりにlock(node)領域を通過することになるので

Study / C#

#C#

作成日付 : 2019/07/24 00:57:35       修正日付 : 2021/09/28 19:17:28

294

こんにちは。明月です。この投稿はc#のthreadpoolの使い方に関する説明です。以前の投稿でthreadに関して説明しました。link - [c#] 37. スレッド(thread)を使い方、thread.sleep関数を使い方threadとはプログラム内で並列処理のための機能です。でも、このthreadは個数を制御することができないと逆にプログラムの性能が落ちるということも説明しました。そのため、thread個数を管理することも作成しなければならないですが、.net frameworkにはこのthreadの個数を管理する機能があり、それがthreadpoolです。上の例をみれば私がthreadpoolクラスを利用してスレッドを総5個生成します。でも、threadpoolには同時に実行するスレッド個数は0個から最大に2個まで生成されるように設定しました。つまり、threadを無制限に生成して実行することではなく、pool中で総量を設定してその以上は待機状況に待ちます。つまり、結果を見ても、aとbは同時に実行されますが、cからはbが終了された状況で実行されることを確認でいます。threadを最大に2個を実行しますが、その以上は実行されない設定でthreadpoolを管理します。threadpoolにはthreadの生成を管理することになります。でも、このthreadpoolはjoin関数がないので、threadのすべてが終了する時まで待つ関数がありません。上の例はthreadpooljoinという関数を作成してthreadpoolで使えるスレッド個数を確認してスレッドを使える最大量と同じなら無限ループが終了することでjoin関数を作成しました。簡単なプログラムなら上みたいにthreadpoolを制御することができます。問題は大きいプログラムならthreadpoolクラスの特性がstaticなのでどのところで使っているか確認することが難しいです。ですから設計しているところでthreadpoolの使いが終了しました。と思っても、ライブラリや他のクラスでthreadpoolを使うと思えば、待機状況の個数でjoinをコントロールすると予想できないバグが発生する可能性があります。それでtaskで使えるeventwaithandleを利用すれば部分的にthreadpoolを制御することができます。listをローカル

Study / C#

#C#

作成日付 : 2019/07/23 00:05:40       修正日付 : 2021/09/27 19:33:26

295

こんにちは。明月です。この投稿はc#でスレッド(thread)を使い方、thread.sleep関数を使い方に関する説明です。我々がプログラムを作成して実行するとソースの順番とおりに実行されることが基本流れです。これがプロセスということにします。つまり、プログラムが実行して終了するまでは一つのプロセスが実行することです。上の例は0から9までの繰り返しを2回実行します。同然にa =の出力が先に実行して終了すると、b =の出力が次に実行します。これが一つのプロセスです。でも、仕様によりこの二つのfor文を並列で同時に実行したい時があります。上の例をみれば始めのスレッドと2つ目のスレッドが同時に実行してコンソールに無作為で出力されることを確認できます。つまり、上の例は一つのプロセスで2つのスレッドが実行したことです。3つの並列処理が実行されることです。例を見れは"press any key..."が先に出力されることを確認できますが、これはスレッドを実行することに少しディレイが発生したのでプロセス処理が先に出力されてしまうことです。スレッドを使う方法はthreadクラスのインスタンスを生成して、コンストラクタのパラメータは返却値とパラメータがないデリゲートで受け取ります。それでこのthread関数には変数を渡せないので、上のラムダ式を使ってクロージャ(closure)機能を利用して変数を渡す方法をよく使います。それで、上の例をみればthreadを使ってfor文で値を足したが、結果は0が出力されました。理由はスレッドが終了する時まで待たなくて、プロセスが先に実行されるからです。つまり、コンソールが出力される時にはsumの変数の値が0からです。並列で実行されるのでコンソールが出力された後でsumの変数が変わりそうですね。並列処理をすれば性能は速くなるけど、プロセスでスレッドの値をしっかり受け取ることができないと意味がありません。thread1変数でjoin関数を使ったらプロセスでスレッドが終了する時まで待ってる役割します。つまり、何個のスレッドを使ったらjoin関数を使ってプロセスと同期化するとプログラムを早く処理することができます。また、仕様によりthreadをわざと処理を遅くなることもできます。thread.sleep()関数を利用してスレッドを1秒間に停止します。sleep関数ではミリ秒単

Study / C#

#C#

作成日付 : 2019/07/22 23:45:05       修正日付 : 2021/09/24 20:40:58

296

こんにちは。明月です。この投稿はc#の拡張メソッドを使い方に関する説明です。以前の投稿でc#のメソッド(関数)を使い方に関して説明したことがあります。link - [c#] 9. 関数(method)とオーバーロード、再帰呼び出し関数というのはクラス内でデータを変更、処理する機能という文法です。クラスを作成して関数を作って、クラスの外部から呼び出すことに関してはよく知っています。でも、我々がプロジェクト内で作成したクラスではなく、.net frameworkで提供するクラスや外部ライブラリから取得するクラスに関して関数を追加したい場合はどうしよう。上の例は基本的に関数生成と使う方法に関することです。でも、もっとしやすくするためにconverttointfromstring関数がstringクラスの関数みたいに設定したいです。始めの例と差異は拡張関数をstatic classに関数を生成しなければならないです。staticが付けたらプログラムが起動する時、一括的に読み込みますが、その時に既存のstringクラスに関数を追加する役割をするらしいです。拡張関数はstaticで生成すること、始めのパラメータにthisを付けて該当のクラスの拡張関数になります。使用方法はstringでの関数みたいに使えます。visual studioのインテリジェンス(自動完成機能)にも関数があるみたいに制御になります。そして拡張関数で設定しても既存方法みたいに一般関数を呼び出すことにも使うこともできます。一般プロジェクトで処理機能だけある関数の場合、普通はutilやcommon、defineのクラスを作成して管理します。その方法が悪いことではないですが、このみたいに拡張関数で設定して置いたら可読性やソース整理することにすごく良いと思います。ここまでc#の拡張メソッドを使い方に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / C#

#C#

作成日付 : 2019/07/22 23:30:17       修正日付 : 2021/09/23 18:08:59

297

こんにちは。明月です。この投稿はc#で使う文字列クラス、stringとstringbuilderを使い方に関する説明です。プログラム上で使う原始データタイプは整数と実数タイプが多いですが、文字列はstringタイプで一つです。正確にはstringタイプは原始データタイプではなく、charの配列タイプになっているクラスタイプです。つまり、文字はasciiコートになっている整数タイプでそのデータタイプはcharです。改めて説明するとstringはcharの配列タイプで定義しているし、プログラム内ではstringタイプにデータを格納すると文字列で出力されます。上の例をみればstringタイプをchar[]配列タイプに変換になり、char[]配列タイプがstringタイプに変換することができることを確認でいます。link - アスキーコードここまで整理すると、stringはchar[]の配列タイプになっているし、その整数の値はアスキーコードになっていることに説明しました。ここで詳しく考えることはcharのデータサイズは1byteで2^8になっているし、その値の範囲は0~255(unsigned char)になっています。つまり、サイズが256ですが、世界のすべての文字を256のサイズで表現できません。日本語だけ見ても漢字が256個以上にありますが、そのため、文字列エンコードのutf-8があります。実はこのエンコードタイプに関しても内容が複雑だし、説明する部分が多いですが、今の標準のエンコードタイプはutf-8で統一になっているし、今はほぼエンコードタイプがutf-8だと思えば良いです。このutf-8のエンコードタイプは可変長さ文字列で最小1byteから4byteまで使って文字列を表現します。つまり、2^32になるので、役42億個の文字を表現できます。詳細な部分はbyteとエンコード部分で詳細に説明します。また、stringの説明に戻って、c#でstringのデータ構成はchar[]配列だし、構造はクラスタイプになっています。stringクラスには文字列を扱うための関数があります。isnullorempty、isnullorwhitespacestringはクラスなので、nullがあります。なのでnullの値は比較演算子で値の可否を確認できますが、nullではない文字列がないstringもあります。文字列関係の関数

Study / C#

#C#

作成日付 : 2019/07/22 23:15:42       修正日付 : 2021/09/22 18:08:53

298

こんにちは。明月です。この投稿は最上位クラス(object クラス)に関する説明です。c#にはオブジェクトの最小単位がクラスになっています。link - [c#] 10. クラスを作成する方法(コンストラクタ、デストラクタ)そのクラスは基本的にobjectのクラスを継承することになっています。link - [c#] 13. クラスの継承と再定義(override)する方法、overrideとnewの差異その意味はクラスの隣に継承する定義をしなくてもobjectクラスを継承します。つまり、c#に存在するすべてのクラスはobjectクラスを継承します。objectクラスの基本構成は下記通りです。基本的にstaticが付けてないequals関数は比較(クラスの中でメンバー変数のデータではなく、インスタンスが同じかを比較)関数、gethashcode関数はポインタアドレスをhashデータで変換した値、gettypeはクラスのデータタイプ、tostringはクラスをstringタイプに表す関数、memberwisecloneの関数はデザインパターンのプロトタイプのクラスインスタンスコピー(ポインタコピーではなく、クラスのデータがすべて複製)があります。つまり、すべてのクラスは上の関数を基本的に継承して使えます。上の例をみればprogramクラスはobjectクラスを明示的に継承してないです。でも、objectの関数を使えますね。つまり、明示的に継承することを実装しなくても、クラスは基本的にobjectクラスを継承することを確認できます。そしてequals関数とgethashcode関数、tostring関数はvirtualキーワードが付けているので再定義も可能です。上の例ををみればequals関数とgethashcode関数、tostring関数を再定義します。なのでgethashcodeの関数は常にインスタンスポインタアドレスではない可能性もあります。参考にstringクラスのgethashcodeはポインタアドレスではなく、リテラル値です。stringに関しては他の投稿で詳細に説明します。objectのクラスは最上位クラスになるので、変数宣言する時、どのインスタンスでも変数のデータタイプに設定することができます。objectクラスにはprintという関数がないので、エラーが発生します。dynamicキーワードが

Study / C#

#C#

作成日付 : 2019/07/20 02:27:23       修正日付 : 2021/09/21 19:47:40

299

こんにちは。明月です。この投稿は匿名形式(anonymous types)を使い方に関する説明です。クラスはc#でプログラムを作成するところで最小単位です。クラスの基本構造はメンバー変数と関数があり、その以外にプロパティ、デリゲート、イベント、インデクスがあります。link - [c#] 10. クラスを作成する方法(コンストラクタ、デストラクタ)そして我々が作成したクラスをメモリにインスタンス生成するためにnewというキーワードを使って生成することになります。クラスで一番重要なことはメンバー変数です。プロパティはメンバー変数に値を格納するための関数だし、デリゲートやイベント、インデクサーなども関数の役割について区分するための関数です。関数というのはプログラムを実装するための実行処理だけで、クラスのデータを格納するしクラスのサイズを決定するのは結局メンバー変数です。でも、その使い目的によりクラスをすべて作成することにはソースがすごく複雑になる可能性もあります。簡単の例として、単一目的によりデータを渡すためのクラスならそれをためクラスを作成することは無駄なこともあります。改めて説明すると、データを関数のパラメータにより渡す時、原始データだけでパラメータを作成するとパラメータが多くなりますが、パラメータのクラスを作成して渡すとソースが簡単になります。上の例をみれば、始めの関数の場合はパラメータをただ原始データタイプで受け取ります。簡単な例なのでパラメータが4個ですが、仕様によりこのパラメータが10個、20個になる可能性もあります。実際にそのように作成するとパラメータが多すぎて可読性が悪くなります。なので、普通はパラメータのデータのクラスを作成して、クラスからパラメータのデータを受け取りますが、利点はソースが読みやすくなります。でも、この問題は大きいプロジェクトだと思えば各関数のためパラメータのクラスを作成することはソースコードがすごく多くなります。それでこのように一回性のインスタンスのための匿名形式のクラスがあります。上の例でprint関数のパラメータによりデータインスタンスを渡すために、newキーワードを使ってインスタンスを生成しましたが、クラス名はありません。インスタンスの変数タイプはvarタイプで設定して、print関数からはvarタイプの変数名を使えないので、dynamicキーワードでパラメータを受け

Study / C#

#C#

作成日付 : 2019/07/20 02:22:03       修正日付 : 2021/09/20 20:38:42

300

こんにちは。明月です。この投稿はc#のジェネリックタイプ(generic type)を使い方に関する説明です。我々がリスト(list)やディクショナリ(dictionary)を使う時、どのデータタイプをリスト中で使うのかを括弧で設定します。もし、設定したデータを使わなかったらエラーが発生します。このようにどのデータタイプを使うのかを設定することがジェネリック(generic)です。つまり、クラスやメソッド中ではデータタイプを設定せず、インスタンスを生成する位置でデータタイプを設定して使う方法という意味です。上の例は簡単な連結リストのアルゴリズムです。実は連結リストのアルゴリズムは凄く簡単なアルゴリズムですが、foreachでデータを出力するためにインラインクラスのpointerを作りました。その理由で少し複雑になりました。上の例のlistクラスはintタイプだけ使えます。add関数のパラメータとnodeクラスのdataのタイプをintタイプに設定したのでintだけ使えます。しかし、状況によりintタイプではなくstringタイプのリストも作りたいです。現在の状況では上のクラスでadd関数とnodeクラスのデータタイプだけ変更してコピペするべきですね。そしてc#.net frameworkで提供するクラスや原始データではなければ、使いたい時たびに作成しなければならないです。でも、我々は実際のリスト(list)クラスを使う時にはそのように使いません。括弧(<>)を使ってデータタイプを設定して使います。ジェネリックはデータタイプが設定されてないのでtという任意の文字で置換します。つまり、インスタンスを生成する場所でintやstringで設定すればtという文字が全部intやstringタイプで変更すると思えば良いです。そうことでデータタイプによりリストコードを作成する必要せずに、ジェネリックを使えばどのタイプでも対応ができるという意味です。ジェネリックは基本的にクラスで宣言する方法があるし、メソッドだけ使う方法もあります。メソッドジェネリックは関数名の隣に設定します。上の例では関数を呼び出す時に括弧(<>)を使いますが、実際にはパラメータにstring値を入れたら自動にジェネリックが設定されます。なので関数ジェネリックを使う時は呼び出すときにジェネリックを設

Study / C#

#C#

作成日付 : 2019/07/18 22:50:16       修正日付 : 2021/09/20 20:11:14

301

こんにちは。明月です。この投稿はc#でアトリビュート(attribute)を使い方に関する説明です。c#でのアトリビュート(attribute)とはクラスやメソッドのメタデータを記録するデータです。ここでメタデータとは例えば、イメージファイルを考えるとイメージファイルはバイナリデータになっています。もちろん、このバイナリデータのはイメージに関する情報がありますが、ファイル名や拡張名などの関するデータはありません。つまり、このデータはウィンドウosのファイルに関するメタデータです。改めて説明すると、クラスやメソッドに関する区分するための表示データだと思えば良いです。上のobsoleteのアトリビュートは関数やクラスをもう使わない時、エラーを発生することです。始めのパラメータはエラーの時のメッセージです。上の結果のイメージをみればエラーメッセージがnot usedだと表示されます。その後でtrueを設定すればビルドする時にエラーが発生することだし、falseを設定すれば関数やクラスを使えますが、visual studioからの警告メッセージが発生します。アトリビュートは上の例みたいに実際のプログラム実行では影響になることではなく、プログラムのビルドやデバッグする時のメッセージ、リフレクション(reflection)でクラスやメソッドの一括管理する役で使います。リフレクション(reflection)でアトリビュートを使う方法はリフレクションを説明する時に詳細に説明します。まず、c# .netフレームワークで基本的に提供するアトリビュートは下記通りです。 アトリビュート 説明 clscompliant アセンブリのすべてのタイプをclsに合わせて使う。 obsolete 使わない要素だと表示する。 conditional プリプロセッサ識別子によって実行する

Study / C#

#C#

作成日付 : 2019/07/18 20:22:16       修正日付 : 2021/09/17 17:18:09

302

こんにちは。明月です。この投稿はc#のlinq関数式を使う方法に関する説明です。以前の投稿でlinq式に関して簡単な説明とlinqクエリ式に関して説明したことがあります。link - [c#] 28. リスト(list)とディクショナリ(dictionary)、そしてlinq式を使い方link - [c#] 29. linqクエリ式を使い方linq式に関してはプログラム内のオブジェクト(object)を効果的にフィルター、建さんしてデータを分類する文法です。クエリ式の場合はsqlクエリみたいに作成してデータを分類する方法です。クエリ式の利点はsqlクエリ式に慣れている方にはこの文法が慣れしやすいですが、少しプログラム文法と違和感があるし、途中でデバッグ状況を確認することが難しいので使うことでお勧めではありません。それでlinq式にはプログラム関数と同じlinq関数式があります。上のソースではクエリ式のfrom node in list where node.data > 5 select node.data;をlist.where(x => x.data > 5).select(x => x.data);で作成しました。ここでwhere関数とselect関数の中ではラムダ式を使ってフィルターと検索条件を生成しました。そしてwhere関数の返却値とselect関数の返却値はienumerableタイプなので、関数を連結するみたいにチェインパターンで生成することができます。つまり、上みたいにチェインパターンではなく、一行目ずつ作成することもできます。(参考、selectの場合はreturn値によりジェネリックタイプが変わるので注意)基本的にlinq関数式の場合はwhereとselectをよく使いますが、仕様により、joinと整列、グループ別に分離することもできます。first, firstordefault, single, singleordefault, last, lastordefaultこの関数はリストの結果を一つの結果に受け取る場合に使います。最終の返却値はlistではなく、listのジェネリックタイプにより結果を返却します。first、lastの場合はリストから始めの値と最後のの値を返却する関数式です。でもデータがなければexception

Study / C#

#C#

作成日付 : 2019/07/17 23:06:42       修正日付 : 2021/09/15 19:30:49

303

こんにちは。明月です。この投稿はc#のlinqクエリ式を使い方に関する説明です。以前の投稿でlinq式に関して簡単に説明したことがあります。link - [c#] 28. リスト(list)とディクショナリ(dictionary)、そしてlinq式を使い方また、簡単に説明するとlinqとはプログラム上で設定されたオブジェクトの集合、つまりリスト(list)やディクショナリ(dictionary)で設定されたデータを効果的に分類及び検索するためのc#のプログラム文法です。linqを作成する方法はクエリ式と関数式がありますが、その中でクエリ式はデータベースで使うsqlクエリ式と似ている方法です。基本的に使う方法はfrom in where selectです。まず、from inに関して説明するとinの後の変数は検索しようと思うリストの変数です。そしてforeachの繰り返し文みたいに一つのオブジェクトに置換することがfromの後の変数です。つまり、foreach(node node in list)がfrom node in listと同じ意味になります。whereは繰り返し文の中で条件を作ることでnode.data > 5はif(node.data > 5)と同じ意味です。selectはreturnされた結果により最終のfilterlistのデータタイプが決められます。select nodeをしたらienumerable<node>のタイプになりますが、上の例ではnode.dataをしたのでienumerable<int>タイプで生成されます。ここで参考にienumerableのインタフェースはlistの親インタフェースです。つまり、listみたいに使えるインタフェースですが、正確にはイテレータパターン(iterator pattern)のインタフェースです。つまり、listと似てますが、addやremoveみたいにデータを追加、削除をできなく、foreachでデータを取得することしかできないです。参考でlinqで抽出した結果にデータを追加、削除するためにはtolist()関数でlistタイプにキャストして使ったら良いです。また、クエリ式に戻って、実務プログラムを開発するとfrom where selectが一番よく使います

Study / C#

#C#

作成日付 : 2019/07/17 20:57:00       修正日付 : 2021/09/14 20:56:04

304

こんにちは。明月です。この投稿はc#のリスト(list)とディクショナリ(dictionary)、そしてlinq式を使い方に関する説明です。以前の投稿で配列とオブジェクト指向プログラミング(oop)に関して説明したことがあります。에 대해서 설명한 적이 있습니다.link - [c#] 8. 配列とリストlink - [c#] 20. オブジェクト指向プログラミング(oop)の4つの原則(カプセル化、抽象化、継承化、多相化(ポリモーフィズム))オブジェクト指向プログラミング(oop)に関して簡単に改めて説明するとプログラムを開発する時、すべてをオブジェクト(object)に考えて開発することという意味です。つまり、オブジェクトというのはプログラムでクラス(class)の形で管理すること、またはこのオブジェクトを効果的に管理するためにリスト(list)とディクショナリ(dictionary)をよく使います。リストはデータ構造アルゴリズムでは連結リストアルゴリズムだし、ディクショナリ(dictionary)はマップアルゴリズムです。連結リストのアルゴリズムは始めから最後までのデータをポインタで連結したことだし、ディクショナリはキーと値で連結したデータ構造です。リストから0の値から9までのdataを持っているnodeインスタンスを順番とおりに格納されています。リストは確実に順番が決めているし、5番目のnodeインスタンスを取得してリストから取り除きました。そして、2番目のリストに100のdataを持っているnodeインスタンスを挿入しました。これかリストの特性です。ディクショナリ(dictionary)の場合は始めから最後までの順番が決めていることではなく、keyからデータを取得します。ディクショナリのkeyを通ってデータを入力して取り除く、出力しました。リストと違うのはデータが順番とおりにあることではなく、keyというデータを通ってデータが管理することを確認できます。参考でkeyの値はリストの形式で順番とおりに格納されていることではなく、keysでキーのリスト(?)を取得するとリストが順番とおりではないことを確認できます。c#はオブジェクト指向プログラム言語(oop)としてデータを管理するためにリストとディクショナリをたくさん使います。リストで上の例みたいに入力、出力することができますが、特定データを検索す

Study / C#

#C#

作成日付 : 2019/07/16 22:40:03       修正日付 : 2021/09/13 19:14:55

305

こんにちは。明月です。この投稿はvarキーワードとdynamicキーワードに関する説明です。以前の投稿でプログラムのstackメモリとheapメモリの関係に関して説明したことがあります。link - [c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)変数で宣言されているデータタイプはheapに生成するインスタンスのポインタのアドレスということで説明したことがあります。このポインタのアドレスというのは大きいデータがあることではなく、普通の整数になっているデータです。それで、一々にクラス名に合わせてソースを作成することは面倒くさいことですね。それで、この変数のデータタイプを作成しやすいようにするキーワードがありますが、それがvarキーワードです。上の例の結果をみればnodeの変数とnode1の変数の差異はソース上で作成するところでnodeのクラスタイプからvarタイプに変わったことだけで、プログラム上で実装する処理に関して同じです。つまり、varキーワードとは変数で宣言を簡単にするためのキーワードだけで、性能と処理に関してはなにも影響はありません。それでc#のソース規約(コーディングに関する規則)に従うとローカル変数宣言はvarキーワードを使うのをお勧めします。でも、このvarキーワードには何個か制約条件があります。最初の宣言する時にnullで設定はできません。そして最初の宣言したタイプは途中でタイプ変更はできません。そしてvarキーワードは関数のスタック領域だけ、つまりローカルだけ使うことができるしメンバー変数や関数のリターン値、パラメータは使えません。改めてまとめると、varキーワードは最初の宣言した原始データあるいはクラスタイプで設定ができるし、次は設定を変わりません。なので、当然に最初宣言する時にタイプを設定するのでnullは使えないし、メンバー変数とリターンタイプ、パラメータタイプでは設定を区分することができないので使えません。c#にはvarキーワードと似ているdynamicキーワードがあります。dynamicキーワードはvarキーワードと似ていますが、最初に宣言する時にデータタイプが決定することではなく、基本データタイプのobjectで設定があります。objectクラスに関して簡単に説明するとc#ではクラスが最小単位です。c#で

Study / C#

#C#

作成日付 : 2019/07/16 20:41:27       修正日付 : 2021/09/10 21:16:32

306

こんにちは。明月です。この投稿はc#で例外処理(try ~ catch)する方法に関する説明です。我々がプログラムを作成したら予想できないエラーが発生する場合があります。例えば、プログラムを作成する時に変数の値がない場合(nullエラー)か、正数の値に割り算をする時に整数を0で割る場合かの問題が発生することがあります。プログラムの実行中でエラーが発生しました。普通のプログラムの実行中でこんなエラーが発生すれば、エラーが発生した部分を飛び越えてプログラムが進めることではなく、プログラムがそのままに止まることになります。もちろん、上の例みたいに宣言された変数の値が間違ったら、変数の値を直したら解決しますが、もし、ユーザが受け取ったデータが間違えたり、データベースの値が予想しない場合にはプログラムを止まることではなく、例外処理をするべきです。つまり、エラーが発生してもプログラムが止まったり、終了されたらダメです。結果をみれば割る領域でエラーが発生しますが、エラーメッセージをコンソールに出力して"press any key..."のメッセージまでコンソールに出力されました。つまり、エラーが発生してもプログラムが止まらなくて最後まで実行されることを確認できます。エラー処理というのはエラーの区分によりcatchのスタック領域を分けることができます。上のtry領域では割り算エラーが発生しましたので、dividebyzeroexceptionのスタック領域に移動します。もし、try領域でdividebyzeroexceptionではないエラーが発生すれば、すべてのエラーをキャッチするexception領域に移動します。(ここでエラークラスの種類を分かる方法は始めにexceptionを作ってエラーを発生するとどのエラーが発生するかエラーメッセージで表示されます。始めの例を参考)普通の一般コードならすべてのexceptionで処理しても構いないですが、発生するエラー別で処理することが違いなら上のソースみたいにエラー別で区分する作業が必要です。つまり、exceptionですべてのエラーをキャッチしても別に性能上で問題ありません。そうなら我々がクラスを作成する時にクラスの特性上によりわざわざエラーを発生する時があります。上の例では私がエラークラスを作成しました。このエラークラスは基本的にexceptionクラ

Study / C#

#C#

作成日付 : 2019/07/16 00:59:34       修正日付 : 2021/09/09 19:10:28

307

こんにちは。明月です。この投稿はc#でのイベント(event)キーワードを使い方に関する説明です。プログラム言語ではイベント(event)の意味ではユーザの行動あるいはプログラム的にはアクションが発生する時、実行される関数という意味です。つまり、ウィンドウフォームでボタンがある場合、ユーザがボタンをクリックすると実行される関数という意味です。上の例では簡単なウィンドウフォームを作成しました。実行するとボタンがあるウィンドウフォームが生成されますが、ここでボタンをクリックするとbuttton_click関数が呼び出して実行されます。こんなアクションをイベントと言います。我々が以前の投稿で似ている機能に関して、デリゲート(delegate)で説明したことがあります。link - [c#] 23. デリゲート(delegate)上のソースはコンソールからユーザで入力イベントを受け取ったらprint_event関数を発生します。ここまでみるとデリゲートだけでイベント関数を実装しました。ここまでだけでもイベント関数を実装することでは問題がありませんが、実はここにはオブジェクト指向プログラミング(oop)のルール違反があります。それがconsolecmmandのデリゲートリストです。上のデリゲートの呼び出しをコンストラクタ中でユーザから入力が発生すると実行する役割です。でも、このリストがpublicで設定されているので、list("")形式でmain関数でも実行できることが欠点があります。つまり、外部からはイベント関数を連結することが可能にしますが、実行はできないようにするべきです。それがeventキーワードです。上の例をみればmain関数でデリゲートを実行しました。実はこんなことになるとクラス中で縛っているイベントが外部から強制(?)に実行される問題があります。それならデリゲートの前でイベント付けたらどのようになるか?コンパイル段階でエラーが発生しました。つまり、イベントの関数を外部で付けることは可能ですが、実行はクラス中だけで実行することが可能です。要約すればイベント関数は以前のデリゲートから実行を我部で実行できないためのキーワードです。ここまでc#でのイベント(event)キーワードを使い方に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / C#

#C#

作成日付 : 2019/07/16 00:48:03       修正日付 : 2021/09/08 18:18:07

308

こんにちは。明月です。この投稿はc#でラムダ式(匿名関数)とaction、func関数を使い方、そしてクロージャ(closure)に関する説明です。以前の投稿でデリゲート(delegate)に関して説明したことがあります。link - [c#] 23. デリゲート(delegate)デリゲートとは関数ポインタで関数をインスタンスのポインタみたいに管理ができるような機能ということです。つまり、関数をポインタで管理ができればもっと考えると関数の名前が要らずに関数を作成することができます。ラムダ式とは匿名関数の意味とおりに関数名せずに作成が可能な関数です。上の例をみれば返却式はなく、stringのパラメータを受け取るデリゲートを作成しました。そしてmain関数で(val) => {}の形式のラムダ(匿名関数)を作ってデリゲートリストに追加しました。ここでvalのデータタイプはデリゲートで宣言したstringのタイプのデータになり、返却タイプはないのでreturnは要りません。そして中括弧({})のスタック領域で関数が呼び出したら実行するプログラムのコードを実装します。実行すればlistのデリゲートを実行して登録されて二つのラムダ式が実行することを確認できます。そうならこのラムダ式を使うためにはそれを合わせてデリゲートを常に宣言するべきだと思いますが、func関数とaction関数を利用すればデリゲートが要りません。上の例では匿名関数を作成しましたが、delegateを宣言せずにfuncとaction関数を使いました。func関数は返却値がある匿名関数で、action関数は返却値がない匿名関数です。func関数の最後のパラメータは返却値のデータタイプです。その以外は順番とおりのパラメータのデータタイプです。ラムダ式というのは実は文法規約を破壊する方法です。ラムダ式が使うことも楽だしデリゲート(delegate)やリストとfunc、actionを適当に混ぜて作成するならプログラムを実装する時に凄く楽になります。問題はラムダ式が多くなるとソースは凄く複雑になるし、可読性が凄く悪くなる欠点があります。そのため、一般関数を使うことができれば関数名を作成してラムダ式を使うことを抑える方が良いです。そうならラムダ式をいつ使うほうが良いか?デザインパターンのオブザーバーパターンを実装する時、つまり、イベントやコー

Study / C#

#C#

作成日付 : 2019/07/16 00:36:19       修正日付 : 2021/09/07 20:47:10

309

こんにちは。明月です。この投稿はc#のデリゲート(delegate)を使う方法に関する説明です。c#のデリゲートは代理子のいう意味でc++の関数ポインタと似ている概念を持っているキーワードです。つまり、関数ポインタとは関数式(function)をインスタンスのポインタみたいに認識して変数に値を格納するかパラメータに渡して実行する代理に実行する役をします。上の例でprint関数をデリゲートで使ってポインタでインスタンスのポインタを変換してpdの変数をインスタンス値みたいに使えます。実行はデリゲートの変数でただ関数を呼び出すみたいにパラメータ値を入れれば実行されて、コンソール出力することを確認できます。上の式はデリゲートを説明するために凄くシンプルに作成したことで実際は変数の値みたいに使ういい点があります。上の例をみればexample클래스とnode1、node2クラスをinodeインタフェースを継承しました。上の形式はデザインパターンの中で合成パターンです。exampleクラスにnode1クラスのprint関数とnode2クラスのprint関数を入れてexampleクラスのprint関数を実行すれば同時に実行されるパターンです。上の例は私がlistにデリゲートを格納して関数ポインタを管理するようにしました。でも、デリゲートは関数を管理するリスト機能もあります。+=と-=の対入演算子を通って追加、削除をできます。上の例には二つ目のlistクラスの変わりにデリゲートで関数式を追加、削除することができます。最近にはc#コードでラムダ式(lambda)をよく見えますが、このラムダ式がデリゲート基盤で生成して使います。ラムダ式は匿名関数の意味で関数で名前がない関数という意味です。このラムダ式は関数名が存在しないので関数ポインタだけ存在します。つまり、ラムダ式を使うためにはこのデリゲートで関数のポインタを持つべきだと意味です。ラムダ式はラムダ式を説明する時にもっと詳細に説明します。ここまでc#のデリゲート(delegate)を使う方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / C#

#C#

作成日付 : 2019/07/15 02:25:26       修正日付 : 2021/09/06 18:56:03

310

こんにちは。明月です。この投稿はc#のインデクサー(indexer)を使う方法に関する説明です。c#には他の言語にはない文法が何個かあります。その中で一つが以前の投稿で説明したプロパティ(property)です。link - [c#] 21. c#のプロパティ(property)この投稿もc#の特別な文法のインデクサー(indexer)です。インデクサー(indexer)は簡単に説明すると配列の形で関数を呼び出す機能です。文法の形はプロパティ(property)と似てます。上の例をみれば私がnodeクラスでインデクサー(indexer)関数を作りました。インデクサー(indexer)はプロパティの文法みたに配列の値を受け取るデータタイプと入力するデータタイプを設定して関数名にはthisキーワードを使います。そして配列みたいに使うので、配列のインデクサー役でstring値を格納するし、イコールでデータは返却データタイプで値を格納します。mainの実行関数でnode[string] = intの形で実装するとset関数が呼び出すし、node[string]の型で実装するとget関数が呼び出します。文法がプロパティ(property)と似てます。なのでアクセス修飾子を設定する方法も似てますが、基本のアクセス修飾子はgetで設定して、set関数だけ別途にアクセス修飾子を設定することができます。プロパティ(property)とインデクサー(indexer)は他の言語にはない文法です。この文法があることはオブジェクト指向プログラミング(oop)のカプセル化により、メンバー変数をprivateに設定しますが、ゲッター、セッターを少し効率的に格納、取得するための文法です。でも、プロパティの場合はよく使いますが、インデクサー(indexer)はよく使いません。なぜかというと配列と似ている形なので、逆に迷う時が発生します。ソースコードは可読性、つまり、ソースを読みやすく作ることが重要ですが、インデクサー文法が多いソースは逆に迷い込みやすいです。そのことでよく使わないですね。特にc#だけ開発するデベロッパー(開発者)の方はインデクサー(indexer)が凄く読みやすいっていうかもしれませんが、javaやpythonなどの他の言語がメインのデベロッパー(開発者)の方は難しいというかもしれません。その理由かな、実務プロジェクトでも

Study / C#

#C#

作成日付 : 2019/07/13 01:06:04       修正日付 : 2021/09/03 17:21:01

311

こんにちは。明月です。この投稿はc#のプロパティ(property)に関する説明です。以前の投稿でオブジェクト指向プログラミング(oop)の4つの原則とアクセス修飾子、カプセル化に関して説明したことがあります。link - [c#] 12. staticとアクセス修飾子、そしてカプセル化link - [c#] 20. オブジェクト指向プログラミング(oop)の4つの原則(カプセル化、抽象化、継承化、多相化(ポリモーフィズム))基本的にオブジェクト指向プログラミングでメンバー変数はprivateに設定してクラスの外部から接続ができないように設定します。そうならクラスのメンバー変数の値はすべてコンストラクタや関数を通ってデータを設定しますが、そのところでデータを格納、取得だけの関数があります。それをjava言語ではゲッター(getter)、セッター(setter)と言います。何でこのように実装するかというとメンバー変数はオブジェクト指向プログラミングによりメンバー変数はprivateに設定することが原則です。上の例は何の制限がなしてゲッター、セッターを設定したからデータ設定、取得することにしますが、ゲッター、セッターで権限により、あるいは設定によりデータのアクセスを制御することが可能です。例えば、メンバー変数をpublic設定する場合は読み込み専用変数や書き込み専用変数に設定ができないですが、ゲッター(getter)だけ実装すると読み込み専用、セッター(setter)だけすると書き込み専用の変数に設定することができるし、また、ログなどを設定してデバッグする時にcall stackヒストリにより参照追跡も可能です。なので、オブジェクト指向プログラミング(oop)ではメンバー変数をpublicを設定することではなく、privateに設定してゲッターやセッターにより設定、取得するように実装します。c#ではjavaとは違い、ゲッターとセッターを文法的に実装することがありますが、それがプロパティ(property)です。普通、メンバー変数はすべて小文字で作成して、プロパティはその変数名から始めの文字だけ大文字に設定します。その後、プロパティのデータタイプによりゲッターのリターンタイプが設定されるし、セッターのパラメータのデータタイプが設定されます。スタック領域の中で実装するのは、getの場合はgetterと似ているし、

Study / C#

#C#

作成日付 : 2019/07/13 00:56:20       修正日付 : 2021/09/02 17:36:37

312

こんにちは。明月です。この投稿はc#のオブジェクト指向プログラミング(oop)の4つの原則(カプセル化、抽象化、継承化、多相化(ポリモーフィズム))に関する説明です。オブジェクト指向プログラミング(object-oriented programming)とはプログラミングの方法の一つです。プログラミングの方法とは、プログラムを開発する時にどの目的の中心に開発しようということの意味です。その中でオブジェクト指向はオブジェクト(object)を中心にプログラムを設計、開発することの意味です。例えば、「業務計画書作成 -> 計画実行 -> テスト -> 結果確認 -> 報告書作成 -> 承認」のプロセスの業務があると思いましょう。ここで、まず全体の業務単位(controller)で構成して計画データ(object)、テストデータ(object)、結果データ(object)、報告書データ(object)、承認データ(object)をプロセスの流れで配置します。プログラム言語で考えば最小単位のクラスでオブジェクト(object)を作成して管理することがオブジェクト指向プログラミング(object-oriented programming)です。ごのオブジェクト指向プログラミング(object-oriented programming)には4つの原則がありますが、それがカプセル、抽象化、継承、多相化(ポリモーフィズム)です。その4つの原則に関しては部分的に他の投稿で説明したことがあります。link - [c#] 12. staticとアクセス修飾子、そしてカプセル化link - [c#] 15. インタフェース(interface)link - [c#] 14. 抽象クラス(abstract)と抽象メソッド(abstract)、そして仮想関数(virtual)link - [c#] 9. 関数(method)とオーバーロード、再帰呼び出しこの投稿ではその特性をもっと詳細に説明します。カプセル化カプセル化はクラスのアクセスを制限することです。例えば、クラスのメンバー変数と関数がすべてpublic(すべてアクセス可能)で作成する場合、クラスの固有の特性がなくなります。なので、クラスの特性を活かせるためにはクラスのデータ格納、取得する関数以外はpriva

Study / C#

#C#

作成日付 : 2019/07/12 00:17:35       修正日付 : 2021/09/01 18:47:47

313

こんにちは。明月です。この投稿はc#で列挙型(enum)を使う方法に関する説明です。我々がプログラムを作成する時に、固定値を使う場合があります。その時に変数の定数化(値が変わらない変数)を通って値を定義して使います。link - [c#] 3. プログラミングの始めと変数と定数を使う方法上の例をみればprintという関数のパラメータのタイプがintタイプなのでただ、1や2を入れても問題なく作動します。でも、実際のプロジェクトでコーディングする際にコード上でただ1や2で作成すると、次でコードを見る時に何の意味が分からない場合があります。それで意味を分かりやすくするために定数に変換して1や2の意味を分かるように作成します。上の例では私がtype1とtype2の定数を作成して意味を作ることです。実際にもこのようによく作成しますが、それも可読性の限界があります。typeaのパラメータにはatype1とatype2を使ってtypebのパラメータにはbtype1とbtype2を使います。私がソースを読みやすいためにtypeaのパラメータの定数とtypebのパラメータの定数を区分しておきました。でも、このパラメータのデータタイプはintタイプなので、区分してもtypeaパラメータにもbtype1やbtype2定数を使っても問題ありません。でも、そのルールを従って作成しないと、後でソースを解析する立場で意味が可笑しくなります。可読性が悪くなることも当たり前です。それを整理することが可能にするものが列挙型(enum)です。定数を列挙型に纏めてtypeaのパラメータにtypebを入れることや数の1を入れて間違いコーディングを作成することができないし、可読性が悪くならないことにして、綺麗なソースコードを作成することができます。列挙型は単純な定数の値を処理することではなく、bit flag値を設定して、もっと読みやすいソースコードを作成することができます。上の例はビットのtype1とtype4、type7をor演算処理してパラメータに渡して、and演算処理してデータのflag情報を取得することができます。つまり、一つの変数でflagの情報を格納、取得ができます。tostring関数を利用すると列挙型の値ではなく、ソースに作成した列挙型の文字が出力します。私は新入社員の際に先輩からプログラム作成する時に定数、変数の宣言の以外にソー

Study / C#

#C#

作成日付 : 2019/07/11 23:13:25       修正日付 : 2021/08/31 19:42:39

314

こんにちは。明月です。この投稿はc#で構造体(struct)、そして値型を参照するタイプ(reference of value type)と参照型を参照するタイプ(reference of reference type)に関する説明です。以前の投稿でクラスとインスタンス生成に関して説明したことがあります。link - [c#] 10. クラスを作成する方法(コンストラクタ、デストラクタ)link - [c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)基本的にc#で構造体というのはクラスと似ています。上の例をみればクラスを作成することと構造体を作成することは同じですね。クラスと構造体が何の差異があるかとみれば値型を参照するタイプ(reference of value type)と参照型を参照するタイプ(reference of reference type)があります。つまり、クラスの場合はheapメモリにクラスのインスタンス生成してstackメモリに変数を設定してインスタンスのポインタを格納します。そうしたら、他の変数にイコール(=)を使ってポインタ値を格納するかパラメータでポインタを渡した後、インスタンスの値を変更したら、他に連携したインスタンスにも影響になります。上の結果をみればexの変数のdataの値が変わっています。つまり、クラスの参照するタイプ(reference of reference type)は下記とおりに連携しています。クラスの連携構造は以前に説明したことがあります。でも構造体がクラスと違いいます。上のソースは以前のexampleクラス(class)で構造体(struct)に変更したことしかありません。でも、結果は違います。構造体の連携図をみれば下記通りになります。構造体はイコール(=)でポインタコピーではなく、インスタンスがコピーされています。これが値型を参照するタイプ(reference of value type)と言います。つまり、我々が原始データを扱う時、つまり、int a=1;int b=a;ということに設定する場合、変数のbを設定したら変数のaの値は変わらないです。これが値型を参照するタイプ(reference of value type)です。でも、この構造体(struct)を関数のパラメータにデータ

Study / C#

#C#

作成日付 : 2019/07/10 23:57:25       修正日付 : 2021/08/31 18:20:54

315

こんにちは。明月です。この投稿はc#のthisとbaseのキーワードに関する説明です。以前の投稿でクラスのインスタンスを生成する方法に関して説明したことがあります。link - [c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)クラスの構成は基本的にメンバー変数と関数があります。c#にはプロパティやデリゲート、イベントなどがありますが、全部関数の変形型なので、関数で思えば良いです。ここで我々がクラスを継承する時に親クラスのメンバー変数、関数を参照する時もあるし、本クラスを参照する時があります。その時に再定義する場合、関数名が同じなので参照する区分が必要です。また、関数の中で、メンバー変数名とパラメータ名が同じの場合は?上の例をみればexampleクラスのprint関数にはパラメータ名をdataで受け取ってクラスのメンバー変数にはdataの変数名があります。この場合に関数の中でdata変数を呼ばれると基本的にstack領域の内部のdataを参照します。つまり、パラメータのdataを参照します。そうならstackで同じ名の変数名がある場合にメンバー変数のdataを使うことできないかな。そのため、thisキーワードがあります。インスタンス中でthisの意味は本クラスのインスタンスを指すことになります。つまり、this.dataということに使うとメンバー変数を指すことになります。上の例をみれば、this.dataはメンバー変数を指しているので、結果が10になることを確認しました。少し正確にインスタンスのポインタアドレスで確認しましょう。上の例でex変数名になっているインスタンスでgetinstance関数を呼び出してthisでリターンします。thisはexのインスタンスを指すことです。リターンを受け取ったex1のhashcodeをみればexと同じインスタンスって確認できます。そうならthisは自分のインスタンスを指していますが、継承する場合に親クラスを参照する必要がある時があります。subexampleでgetdata関数を再定義しました。しかし、仕様により親クラスのgetdata関数を参照したい時があります。その場合はthisではなく、baseキーワードで参照することができます。上の場合はprint関数でbaseキーワードを使っているので親ク

Study / C#

#C#

作成日付 : 2019/07/10 23:43:56       修正日付 : 2021/08/27 14:37:25

316

こんにちは。明月です。この投稿はc#の継承禁止のキーワードのsealedに関する説明です。以前の投稿でクラスを継承する方法に関して説明しました。link - [c#] 13. クラスの継承と再定義(override)する方法、overrideとnewの差異クラスを継承する理由に関して簡単に説明すると同じコードの作成を避けるし再使用率を高めるために使います。しかし継承することで親クラスを直接参照ができることになります。もし、ライブラリを配布する立場ならセキュリティや様々な理由でクラスの継承をできないようにする場合もあります。例えば、我々がよく使うstringクラスがありますが、このstringクラスは他のクラスと違い、ソース上の文字列なリートンネルを直接に読み込みする機能(string a = "test"; つまり、インスタンス生成なnewキーワードを使わなく、ソース上の直接にstringで割り当て変換)があるため、stringクラスを継承すると様々な部分で効率的にプログラムを再構成することができます。しかし、よく使えることならそうですが、すべてのプロジェクトが設定と規約通りに作成しないので、プロジェクトを進めるときっと始めの意図より違いに使うことになり、stringのオブジェクトを継承するクラスは実は拡張文字列を作りたかったと思いますが、変なクラスになり、後は凄く複雑なプログラムができる可能性が高いです。(例、c++のoperatorと前処理問い合わせ欠点)そのため、その問題を発生しないため、継承禁止するキーワードが必要ですが、それがsealedキーワードです。単純にクラス前にabstractキーワードみたいにsealedキーワードを入れれば継承禁止になります。visual studioでエラーを発生してコンパイルからできないです。クラス継承はできますが、関数の再定義をてきないように設定することもできます。上の例はexampleクラスをsubexampleクラスが継承して、subexample2クラスがまたsubexampleクラスを継承しました。ここでprint関数をsubexampleクラスでexampleクラスから再定義して、subexample2クラスでsubexampleクラスから再定義しようと作成しましたが、subexampleクラスからprint関数をsealed設定し

Study / C#

#C#

作成日付 : 2019/07/10 00:19:18       修正日付 : 2021/08/27 11:36:05

317

こんにちは。明月です。この投稿はc#のインタフェース(interface)に関する説明です。以前の投稿でインスタンスを生成する方法と継承に関して説明しました。link - [c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)link - [c#] 13. クラスの継承と再定義(override)する方法、overrideとnewの差異クラスの共通的な内容を抽象クラスで作成して継承しながらクラスを定義することに関して説明しました。でも、c#では二つ以上の抽象クラスを継承することができません。エラーが発生します。理由としては、複数継承エラーです。複数の継承でも上みたいに使うと問題がなさそうです。でも、print関数がexampleのクラスではなく、抽象クラスにある関数なら。継承するクラスではatypeabstractclassのクラスの関数が使うかbtypeabstractclassのクラスの関数が使うかを分からなくなります。それでc#には複数の継承を禁止させています。上の話はheapメモリの中でも話です。それならstackメモリに変数を宣言する時にはオブジェクトの特性上のオブジェクト別に片付ける必要がある時があります。exampleクラスを見ればiatypeinterfaceのインタフェースとibtypeinterfaceのインタフェースを継承しました。つまり、iatypeinterfaceのインタフェースの関数とibtypeinterfaceのインタフェースの関数を再定義すべきです。それで二つのインタフェースを継承したexampleクラスは二つのインタフェースの関数を再定義しました。aexampleクラスの場合はiatypeinterfaceインタフェースを継承したので、iatypeinterfaceインタフェースの関数を再定義しました。bexampleクラスの場合はibtypeinterfaceインタフェースを継承したので、ibtypeinterfaceインタフェースの関数を再定義しました。そしてmain関数でインスタンスを生成してprint関数を呼び出ししました。インタフェースは抽象クラスと違うのが中でメンバー変数と一般関数を実装することができません。ただ、定義だけします。そうなので、継承する関数では再定義(override)のキーワ

Study / C#

#C#

作成日付 : 2019/07/10 00:06:17       修正日付 : 2021/08/26 17:00:48

318

こんにちは。明月です。この投稿はc#で使う抽象クラス(abstract)と抽象メソッド(abstract)、そして仮想関数(virtual)に関する説明です。以前の投稿でクラスの継承、再定義する方法に関して説明したことがあります。link - [c#] 13. クラスの継承と再定義(override)する方法、overrideとnewの差異クラスの継承は基本的にクラスの機能をそのままに引き続きに継承して新しくクラスを拡張、修正する概念だと説明しました。そのところで、親クラスは継承する前にもインスタンスを生成して使えますが、今回はクラス自体は使えない不完全なクラスでただ継承して再定義してから使うクラスを紹介します。つまり、クラス自体をインスタンス生成が不可能で継承して再定義して使えるという意味です。上の例をみればabstractexampleクラスのgetdata関数は宣言だけして内容は実装してないです。そしてクラスと関数の前にabstractのキーワードを使いました。それならabstractexampleクラスは抽象クラスになり、getdataは抽象メソッドになります。つまり、抽象クラスは未完成クラスで抽象クラス自体はインスタンス生成ができなくて、必ず継承してから使えます。また、抽象メソッドは継承するクラスで必ず再定義(override)すべきになります。なので、exampleクラスで抽象クラスのabstractexampleクラスを継承する時に抽象メソッドを再定義(override)しました。この抽象クラスを使う目的は多いクラスの共通部分を一つに取り縛って共通クラスとして実装する時によく使います。上のmain関数で指示子は抽象クラスでインスタンス生成して割り当てするのは継承したクラスです。その関係に関しては以前の投稿で説明したことがあるのでご参考してください。link - [c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)またmain関数をみるとforeachでprint関数を呼び出します。指示子の抽象クラスには実装はしてないですが、print関数が宣言されています。なので、print関数を呼び出して各インスタンスの関数を呼び出すことができます。結果はprint関数の文言と各インスタンスで再定義した関数getdataの結果がコンソール

Study / C#

#C#

作成日付 : 2019/07/08 23:04:09       修正日付 : 2021/08/20 19:17:30

319

こんにちは。明月です。この投稿はc#でクラスの継承と再定義(override)する方法、overrideとnewの差異に関する説明です。プロジェクトでクラスを作成する時に既存にあるクラスと似てますが、少しずつ違うクラスを作成する場合があります。また、クラスを修正する時に初期開発の場合はただ修正して使いますが、もし運用中なら既存クラスを勝手に修正すると参照するところでエラーが発生する場合があるので、既存のクラスと似てるクラスを新しく作成するしかないです。その時に一番簡単な方法はただクラスをコピペして作成したら楽です。例として、我々が10個のクラスをコピペしてクラスを作成しました。でも、コピペした元のクラスでエラー(バグ)が発生しました。その場合はコピペしたクラスを修正するために10回に修正するべきになります。簡単なプログラムならそれでもできる範囲ですが、仕様が大きいプログラムなら10個だけではなく、100個以上になる可能性もあるので、それをすべて修正することは簡単な話ではありません。参考に実務でもこんなに作成したケースが多いですね。なので、プログラム言語では既存のクラスの機能をそのままに持ってきて拡張、修正する機能がありますが、それを継承といいます。上の例をみればcopyexampleというクラスはexampleのクラスから継承しました。クラスの継承はクラスを生成する時に隣でコロン(:)を付けて親クラスを指定するとクラスが継承になります。実際にmain関数でcopyexampleクラスのインスタンスを生成して関数を呼び出すとexampleの機能をそのままに使えることを確認できます。クラスを継承すると親クラスの機能をそのままに持ってきて関数やメンバー変数を新しく追加することができます。しかし、親クラスの関数や変数でそのままに使わなくて再定義する時もあります。上の例でcopyexampleクラスでnewキーワードを使って関数を再定義しました。結果は親クラスのprintの値ではなく、再定義した結果がコンソールに表示されます。実は再定義キーワードはoverrideです。このoverrideは親クラスで再定義を許した場合(abstractやvirtual)に使います。しかし上みたいに親クラスの一般関数を再定義する時にはnewキーワードを使ったらよいです。上の例はexampleクラスでprint関数にvirtualキー

Study / C#

#C#

作成日付 : 2019/07/08 22:55:00       修正日付 : 2021/08/18 15:17:07

320

こんにちは。明月です。この投稿はc#でstaticとアクセス修飾子、そしてカプセル化に関する説明です。以前の投稿でインスタンス生成とstackメモリとheapメモリに関して説明しました。link - [c#] 11. インスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)c#では基本的にnewのキーワードでクラスのインスタンスを生成してheapメモリにインスタンスを割り当てしてメンバー変数や関数などを呼び出して使えます。このことがc#の最小の実行単位になります。それならmain関数はどうでしょう。つまり、我々が実行関数と呼ばれるmain関数を呼び出すためにはクラスのインスタンスを何処で生成して割り当てするでしょう。改めて考えると我々が関数を呼び出すためにはインスタンス生成が必要です。つまり、鶏が先か、卵が先かの話ですね。関数を呼び出すためにはインスタンスが必要、ならインスタンスを何処で生成する?それであるキーワードはstaticです。このstaticが付けているクラス、関数、変数はプログラムが開始する時にstackメモリに登録します。つまり、インスタンスの生成がなくても関数や変数を使えるという意味です。上の例をみればexampleクラスのインスタンスを生成せずに、print関数を呼び出すことができます。その中でmain関数は少し特別な規約がありますが、staticが付けられたmain関数はプロジェクトの中で必ず一つだけです。プログラム内でmain関数が二つなら開始の実行関数が分からなくなるのでです。このstaticキーワードは関数だけではなく、変数にも付けることができます。上の例をみればexampleクラスのインスタンスを二つ生成して各のインスタンスのメンバー変数にデータを格納しました。でも結果はex1とex2のインスタンスのメンバー変数が同じ値が出力されます。つまり、exampleのdataメンバー変数はインスタンスと関係ずにプログラムが実行する時に生成する変数だからです。それならインスタンスと関係ないのでmain関数から直接にメンバー変数を参照することができると思いますが、実はprivateというアクセス修飾子により参照ができません。アクセス修飾子は実行する位置(ステップ)でクラスや関数、変数を参照する権限(?)と思えば良いです。

Study / C#

#C#

作成日付 : 2019/07/07 23:12:30       修正日付 : 2021/08/04 19:29:21

321

こんにちは。明月です。この投稿はインスタンスう生成(new)とメモリ割り当て(stackメモリとheapメモリ)そしてヌル(null)に関する説明です。以前の投稿でクラスを作成する方法に関して説明したことがあります。link - [c#] 10. クラスを作成する方法(コンストラクタ、デストラクタ)クラスを作成してインスタンスを生成する方法でnewというキーワードを使います。ここでexample ex = new example(int)の意味はexampleタイプのex変数にnew exampleのインスタンスを生成してintタイプのパラメータを持つコンストラクタを呼び出すことの意味です。先に確認しべきなところは変数の宣言です。以前に変数宣言に関して説明したことがありますが、変数宣言にはデータタイプと値が一致しなければならないです。つまり、intタイプに実数タイプを格納するか文字列を格納することができないみたいにexampleタイプには必ずexampleクラスのインスタンスが格納しなければならないです。このexample exは割り当てメモリアドレスを指していることで一応ポインター変数といいます。つまり、変数に値が格納することではなく、メモリアドレスが格納することです。上のイメージみたいな構造になります。ここでstackメモリとheapメモリの構造が表させています。stackメモリは我々がプログラムで関数を作成する時に実行領域を設定する中括弧({})があります。この中括弧の領域を我々はstack領域といいます。このstack領域で宣言する変数の値はstackメモリに格納することで思えば良いです。上のイメージを見ればmain関数の中で任意な中括弧を使って新しいstack領域を生成しました。その新しいstack領域でintタイプのdata変数を宣言しましたが、領域の外側で使ったら存在しない変数というエラーメッセージが表示されます。つまり、example exはmain関数のstack領域で宣言した変数という意味になります。new example(10)はheap領域で割り当てしたインスタンスですが、heapはプログラムの領域のメモリ構造です。つまり、プログラムが実行する時にheapメモリの領域が生成してそのメモリの領域を自由にインスタンスを生成したり解除したりすることが可能です。プログラムが終了するとhea

Study / C#

#C#

作成日付 : 2019/07/07 22:54:13       修正日付 : 2021/08/02 15:07:51

322

こんにちは。明月です。この投稿はc#でクラスを作成する方法(コンストラクタ、デストラクタ)に関する説明です。c#でクラスはプログラムを実行するための最小単位の要素です。つまり、プログラムを実行するために必ず作成しなければならない要素という意味です。今までの投稿で我々はmain関数の実行関数を作成して実装しました。しかし、main関数を作成した構造をみるとmain関数を囲まれているprogramのクラスがあるし、クラスを囲まれているexampleのネームスペースがあります。(参考にネームスペース(namespace)は省略してもc#のプログラムを作成することでは問題ありません。)上の例をみればnamespaceを除いてprogramクラスだけ生成してその中でmain関数を作成してプログラムを最小単位を設定して実装しました。エラーがなくてちゃんと実行されます。クラスには作成する構造があります。 クラスの要素 説明 コンストラクタ インスタンスが生成する時(メモリにクラスを割り当て)に呼び出す関数、関数で返却がなしでコンストラクタ名はクラス名と同じです。 デストラクタ インスタンスがなくなる時(gcによりメモリ上で解除)に呼び出す関数、クラス名と同じで前に「~」を付けること。 メンバー変数 フィールドというメンバー変数、クラスないで使う変数 プロパティ 実行する動作は関数と同じですが、プログラムで使う形式は変数と似ている関数(getter、setter) インデクサー クラスを配列文法を使って使える関数

Study / C#

#C#

作成日付 : 2019/07/06 00:53:17       修正日付 : 2021/07/16 20:45:02

323

こんにちは。明月です。この投稿はc#の関数(method)とオーバーロード、再帰呼び出しに関する説明です。以前の投稿までの例をみればmain関数(実行関数)でソースの上行から下行まで順番に実行されます。この形式で制御文だけでもプログラムを作成することができます。でも、プログラムが複雑になるし、大きくなるとこの形式だけでは限界があります。そのため、その長くなるソースを解決するために、関数(method:メソッド)でソースを分割して作成することができます。参考にプログラムの関数は数学の関数と同じ意味です。任意の元素(パラメータ)を代入して結果を返却してもらう数学の二項関係式です。関数のパラメータにデータを入れると関数の中の演算をして返却データタイプにデータに合わせてデータを返却してもらいます。上のソースでexecutemethod1関数とexecutemethod2関数を作成しました。関数の前にあるキーワードでprivateはアクセス修飾子です。staticは静的タイプに設定するキーワードですが、そのことについては別の投稿で説明します。また、データタイプを設定しますが、intの場合は関数から整数のデータタイプの値が返却するという意味です。なので、関数の中では必ずreturnキーワードを作成しなければならないし、returnデータタイプは必ずintタイプで返却しなければならないです。voidの場合は返却がないという意味のデータタイプで関数の中でreturnキーワードでデータを返却する必要がないです。(返却データタープがvoidの場合、returnを使うとreturnキーワードがあるところで関数を終了します。)パラメータはintタイプで受け取ります。パラメータの場合は関数により必須項目ではなく、パラメータが無いことで関数を作成することができます。main関数(実行関数)でexecutemethod1関数とexecutemethod2関数を呼び出しました。まず、executemethod1関数からはintタイプのパラメータを要求するので、intタイプの変数のaを渡します。a変数で5の値があるのでexecutemethod1関数を通ると5掛けて10になり、返却データは50になります。ret変数にはxecutemethod1関数の返却値を格納するので、50のデータがあります。executemethod2関数にはret変

Study / C#

#C#

作成日付 : 2019/07/06 00:38:29       修正日付 : 2021/07/14 20:20:43

324

こんにちは。明月です。この投稿はc#の配列とリスト(list)に関する説明です。配列とは同じデータタイプのデータを連続的に格納するデータタイプです。(参考に連続的に格納することは論理的です。c++と比べてc#はstackメモリ割り当てがないので、物理的には連続ではありません。)上の例では配列を10個宣言しました。つまり、intタイプの変数が10個あることです。配列のインデクスは0から始まります。結果は変数名一つで10個のデータが格納しました。上の例みたいな配列を一次配列といいます。つまり、一列にデータがあると想像できますね。そうなら、多次配列もあります。配列は単純に変数名を一つで何個のデータを格納することの目的ではないです。データが論理的に連続であることを考え、整列などで使うことができます。整列のは無作為にあるデータを昇順、降順に順番を片付けることです。初期に配列変数に整列しようと思うデータを格納しました。配列状況を確認するため、無作為なデータを格納しました。ここで配列0番目と次の位置のデータを比較して大きいデータが高次数に移動するように計算します。0番目の比較が完了すると1番目と次の位置のデータを比較します。この繰り返しで最高の位置の前のデータまで比較します。(最高の位置のデータは比較する対象がありません。)この方法で整列することをバブル整列といいます。次はデバッグ表です。 入力値 512 64 24 7 23 623 1 5 17 10 1次整列 64 24 7 23 512 1 5 17 10 623 2次整列 24 7 23 64 1 5 17 10 512 623 3次整列 7 23 24 1 5 17 10 64 512 623 4次整列 7 23 1 5 17 10 24 64 512 623 5次整列 7 1 5 17 10 23 24 64 512 623 6次整列 1 5 7 10 17 2

Study / C#

#C#

作成日付 : 2019/07/05 00:12:42       修正日付 : 2021/07/13 21:04:45

325

こんにちは。明月です。この投稿はc#の制御文に関する説明です。プログラムで制御文というのはプログラムの処理順番を制御するか繰り返して実行することの制御回数を決定することの意味です。改めて簡単に説明すると、プログラムのコードは基本的にソースの上の行から下の行の向きで処理します。単純に上から下の行に処理の流れの中で繰り返して処理する内容があることもあるし、処理を飛び越える部分、省略しなければならない処理がある可能性があります。この繰り返し、飛び越える、省略する処理を制御文といいます。制御文は選択文、繰り返し文、分岐文があります。選択分は条件により真偽の可否により処理する制御文です。種類はif~else文、switch~case文があります。繰り返し文は一定な条件が満たす時まで同じ処理を繰り返して処理する制御文です。種類はfor文、while文、do~while文、foreach文があります。分岐文は流れの処理順番を変わることにする制御文です。break文、continue文です。if~else- if~else文は真偽の可否により処理する制御文ですif文の条件が真(true)なら該当なスタックが実行する構造です。最後にelseがあればすべての条件が偽(false)なら実行する流れです。上の例を説明すれば始めの条件でaの変数の値を確認します。aのブール値がtrueならif(a)のスタック領域が実行されます。aという変数にtrueの値を格納しましたので、コンソールに「first condition = true」というメッセージが出力しました。二つ目の条件式はif~elseの条件式です。変数aがtrueならif(a)のスタック領域を実行するしfalseならelseのスタック領域を実行します。二つ目の条件式前に私がaの変数の値をfalseを格納しましたので、コンソールに「second condition = false」というメッセージが出力しました。三つ目の条件式は変数bの値を関係演算子でtrue、falseの値を計算します。bの値を2で設定しましたので、if(b==2)の条件が真(true)になるので、コンソールに「third condition b = 2」というメッセージが出力しました。switch~case- switch~caseは選択文ですが、if~else if~elseと似ている処理をします。sw

Study / C#

#C#

作成日付 : 2019/07/05 00:05:30       修正日付 : 2021/07/12 20:12:48

326

こんにちは。明月です。この投稿はc#の演算子に関する説明です。我々がパソコンを使う時にゲームもするし、様々な業務のためにデータを格納するかプログラムを作りますが、実は性能がすごくよい計算機です。つまり、グラフィックを描画や業務のためのプログラムはすべて計算により出力することです。なので、プログラム中で一番に重量なことは演算です。演算とは一般数学の足す、引く、掛ける、分ける計算と同じです。 でも、プログラムは単純な数学の計算だけではなく、ビットの計算、論理計算もあります。 演算子 使用方法 説明 算術演算子 + a + b 足す - a - b 引く * a * b 掛ける / a / b 分ける % a % b 分けるのあまり ++ ++a, a++ 値を1を増加する。(前位、後位演算子) -- --a, a-- 値を1を減少する。(前位、後位演算子) 関係演算子 > a > b aがbより大きいならtrueを返却、小さいや同じならfalseを返却 >= a >= b aがbより大きいか同じならtrueを返却、小さいならfalseを返却 < a < b aがbより小さいならtrueを返却、大きいか同じならfalseを返却 <= a <= b aがbより小さいか同じならtrueを返却、大きいならfalseを返却 == a == b aとb同じならtrueを返却、違いならfalseを返却 != a != b aとbが違いならtrueを返却、同じならtrueを返却 ビット演算子 << a << b 整数aの2進数値を左にb程移

Study / C#

#C#

作成日付 : 2019/07/04 00:09:43       修正日付 : 2021/07/12 19:56:09

327

こんにちは。明月です。この投稿はデータタイプ変換(キャスト:cast)とコメント(comment)に関する説明です。データタイプ変換(キャスト:cast)以前の投稿でデータタイプに関して説明しました。link - [c#] 04. データタイプとリテラル(literal)、 nullableプログラムで我々がすべてのデータタイプを合わせてデータを入力するし、その入力データにより計算することはできません。例えば、我々はプログラムで実数のデータと整数のデータを受け取りました。上の例は整数タイプのa変数と実数タイプのb変数の値を足して整数タイプのcの変数に格納したいです。デバッグでデータタイプが違うというエラーが発生します。そうすると我々は実数タイプ(float)のデータを整数タイプ(int)に変換しなければならないです。そのことをデータイプ変換、つまりキャスト(cast)と言います。実数から整数、整数から実数の変換はただ括弧でキャストが可能です。この括弧でキャストすることは数のデータタイプだけです。つまり、整数タイプから実数タイプ、実数タイプから整数タイプだけです。そうなら数タイプではない文字列(string)タイプはどうでしょう。int32クラスのparse関数を利用すればキャストが可能です。parse関数はstringタイプだけではなく、実数タイプ(float、double)のキャストも可能です。改めてまとめると、キャストする時には数の関係なデータは括弧でキャストが可能ですが、確実にキャストをするためにはint32クラスのparse関数を利用する方が良いです。また、文字列のタイプをキャストする時に文字列に数字だけあることではないです。文字がある可能性もありますね。実行中でエラーが発生します。当たり前の話ですが、文字は数字に変換ができないのでエラーが発生しますね。でも、プログラム中でデータが間違いにある可能性があるので、エラーを発生することよりキャストができないデータならデータデフォルト値(0)に設定する方法があります。上の例は各データタイプのクラスを利用してキャストしました。c#にはキャスト専用クラスがあります。convertクラスの場合はキャスト専用クラスです。つまり、実数から整数、文字列から整数などをキャストする関数があります。 メソッド 説明 boo

Study / C#

#C#

作成日付 : 2019/07/04 00:01:12       修正日付 : 2021/07/09 19:49:31

329

こんにちは。明月です。この投稿はプログラミングの始めと変数と定数を使う方法に関する説明です。c#で一つのプログラムを作成しようと思えば基本的にクラスと関数、ライブラリを知らなければならないです。上のソースをvisual stuioツールを利用して作成してf5を押下してビルド及び実行すれば下記通りの結果が表示されます。そのことで任意のキーを押下するとプログラムを終了になります。上の例だけ確認しても基本的にnamespaceの中でprogramというクラスがあります。また、クラスの中ではmainという関数があります。main関数にはstring[]タイプになっているパラメータがあるし、staticとvoidのキーワードで関数を定義しています。namespaceとクラス、関数は中括弧({})でその領域を定義しているし、main関数にはconsoleクラスのwritelineとreadkeyの関数を使っています。上のプログラムを開始するとコンソールで動きますが、consoleクラスはコンソールウィンドウで作動するライブラリです。つまり、writeline関数はコンソールウィンドウで文字を出力する関数、readkeyはユーザからキーボードデータを入力値を受け取る関数です。上の形がc#のプログラム基本形式です。それならこれからプログラムを作成しましょう。我々がプログラムを作成すれば一番扱うキーワードは変数と定数です。プログラムを簡単に定義すると高性能な計算機です。つまり、1+1や1+2を計算する計算機です。この計算機は計算した値を何処かで格納することができますが、それが変数です。上の例は1+1の結果値をaという変数に格納しました。aという変数の前にはintというデータタイプキーワードを宣言しました。つまり、変数宣言はデータタープと変数名で宣言することができます。そしてbという変数には1+2の結果値を格納しました。また、consoleクラスのwriteline関数を利用してコンソールに出力しました。ここで""のマークで書いている文字列はそのままにコンソールに出力されます。その後で+aを入れてaの変数に格納された値が出力します。変数の値は数を計算して格納する機能をありますが、変数と変数の計算して格納することもできます。予想とおりにcの値は5が出力しました。変数は数を計算して値を格納し、その値を修正する

Study / C#

#C#

作成日付 : 2019/07/02 23:46:49       修正日付 : 2021/07/07 14:24:45

330

こんにちは。明月です。この投稿はvisual studioをインストールする方法に関する説明です。c#で開発するためには一応、開発ツール(ide)をインストールしなければならないです。c#の開発ツールはjavaみたいに様々があることではなく、visual studioで決まっています。もちろん、メモ帳で作成してビルドファイルを利用して開発することもできますが、visual studioが値段が高いプログラムでもないし、無料ツールなのでただダウンロードして使ったらよいです。(会社で商業的に開発することはライセンス値段が必要です。)visual studioはパソコンの高いスペックが必要です。なので、開発準備する前にパソコンのスペックをアップグレードしましょう。visual studioをダウンロードしてインストールしましょう。link - https://visualstudio.microsoft.com/ja/vs/visual studioのバージョンでprofessionalとenterpriseがあります。そのバージョンは無料ではないので、我々はcommunityバージョンを使いましょう。その後でインストールファイルをクリックして実行すればインストールに必要なファイルを先にインストールするということにメッセージが表示されます。そのままにインストールしましょう。インストールが終わったらインストールオプションメニューが表示されます。我々は一応、たくさんの機能が必要ないのでasp.netとpython、.net desktop、c++だけ選択してインストールしましょう。インストールした後には必要なコンポーネントがあれば追加インストールができるので、始めは必ず必要なことだけインストールしましょう。(時間がたくさんかかります。)インストールが完了するとログインするメニューが表示されます。microsoftのidを入れてログインすればよいです。(もし、idがなければ会員登録しましょう。登録で別に料金がかかることではありません。ログインしないとcommunityバージョンでも30日しか使えません。)ログインしたらプロジェクト選択画面が表示されます。一応、しっかりインストールされたかを確認するためにcreate new projectを選択しましょう。そしてc#コンソールプロジェクトを選択しましょう。ここでcor

Study / C#

#C#

作成日付 : 2019/07/01 23:58:20       修正日付 : 2021/07/06 20:04:50

331

こんにちは。明月です。この投稿はc#とはに関する説明です。プログラム言語はc、c++、java、c#など様々な言語があります。言語の誕生時期はc言語が一番早いし、次はmicrosoftからウィンドウ開発をしやすくするc++(mfc)、プログラムについて少し知ってる方なら一回ごろは聞いたことがある言語のjava、これから説明しようと思うc#の順になります。誕生時期を見るとc#は上の4つの言語の中で最後になりますが、最後に誕生したから一番いい言語だと思いますが、そうではありません。プログラム言語は各特徴があり、開発状況のたびに使う方法が違います。各言語について簡単に説明するとc言語の場合はハードウェア系とos系(カーネル)、ドライバー系で主に開発するし、c++(mfc)はグラフィック系またはc#で実装が大変な部分、c#よりメモリ管理が厳しい環境で使います。javaの場合はネットワークのウェブ系、アンドロイドモバイル系で使うし、c#はネットワークサーバクライアントウィンドウ(cs)系でよく使います。機能として使うところはそのとおりですが、プロジェクトの予算、環境などの影響でウィンドウプログラムをjavaで開発するし、c++とc#を混在して使う時もあります。でもその特徴で必ずjavaはウェブ、c#はウィンドウフォームで開発することではありません。ただ、仕様の状況、環境の設定により影響がたくさんあるので、何がよいか悪いかを決めることではありません。c#というプログラムは.net frameworkの上で動いています。.netframeworkはウィンドウosしかないのでlinuxやウィンドウ以外の環境では開発ができません。(最近はコアー(core)というlinuxライブラリもありますが、一般的な状況じゃありません。)フレームワークとはc言語みたいに開発の環境によりすべてを開発することではなく、基本的なライブラリや基盤に関してはフレームワークにすべて開発しているので、c#にはapiとして取得して使う形で開発します。それをclr(common language runtime)といいます。clr(common language runtime)とは.net系の言語(vb.net、c#.net、c++.netなど)の仮想マシンの構成要素です。仮想マシンとはプログラムのメモリ管理(インスタンス生成及び解除)するし、様々なコ

Study / C#

#C#

作成日付 : 2019/07/01 23:32:22       修正日付 : 2021/07/06 19:24:19

332

こんにちは。明月です。我々が「window」を使う間に「context」メニューをカスタムマイズや編集ができれば「window」運用中でもっと楽になるではないかと思ったことがあります。その前に「window」の「context」メニューが何かと言うと「window」の画面のバックグラウンドにマウスの右クリックすると出るメニューです。上のイメージのメニューが「context」。メニューです。(ここで「context」メニュを知らないなら説明が続けられないので、「window」のバックグラウンドでマウス右クリックしてみて確認してください。)そうするとこれから「context」メニューに命令語を登録して編集してみます。「window」の環境設定は「regedit」というところに「window」の全て設定があります。例えば、拡張名が「.xxx」の場合に何のプログラムを連携することや、「window」が始動する時にバックグラウンドで実行するプログラム設定などの様々な設定があります。(そのため「regedit」を間違って設定すると「window」が可笑しくなる可能性があるので気をつけてください。)※「ファイル名を指定して実行」は「window」マークボタン(左の下のaltキー隣)+「r」キーを押下すると開けられます。上のイメージが「regedit」の「window」です。「regedit」の「window」が開いたら様々な「key」があると思いますが、我々はcontextのmenuの設定だけ編集するなので「hkey_classes_root」の群だけ確認します。参考に「hkey_classes_root」のキーは拡張子別で連携されるプログラムの環境設定です。「hkey_classes_root」のキーを開くと様々なサブキーが見えると思います。そのキーの中で我々は「directory」キーを編集するつもりです。「directory」キーは「explorer」の「directory」と関係があるキーです。ここで我々が「context」-「menu」を編集することができます。下記のイメージは「context」メニューを編集した結果になります。「examplemenu」のメニューをクリックすると我々が「command」キーに設定した命令語が実行させ、コマンドウィンドウが開けられます。ここまで「context」のメニューを編集

Devlopment note / Window

#window

作成日付 : 2019/07/01 01:42:41       修正日付 : 2019/10/18 07:31:58