C#でのHelloWorld(コンソールアプリ)

C#のコンソールアプリ(コンソール上で動くアプリケーション)をビルド(実行ファイルを作成)して実行手順をまとめてみました。IDEである Visual Studio Community を使う方法と、Windows OS に標準でついてくるコンパイラ csc.exe を使う方法を紹介します。

前者の方法については既にMicrosoftの公式ドキュメント等で公開されているのですが、環境次第では指示通り動かしても上手く動かないことがあるので、私の環境(Windows8.1、Visual Studio Community 2017、元々別件作業で入れたものなのでビルドに関する設定を弄ってしまったかもしれない)で試した手順を参考のため載せます。
(Visual Studio Community のインストール手順は省略します)

後者の方法については、Visual Studio Community が入っていない環境でビルドする際に便利です。

【Visual Studio Community を使う方法】

1.Visual Studio Community を開く。

2.「ファイル > スタートページ」でスタートページを表示させ、スタートページ上の「新しいプロジェクトを作成」をクリック。

3.「コンソールアプリ」を選択する。名前は任意で良い。これで「OK」を押下すると、「場所」で指定した場所にプロジェクト(作業フォルダ)が生成される。

4.ビルド設定を確認する。「プロジェクト > (プロジェクト名)のプロパティ」の「ビルド」リボンでは、どのフォルダに実行ファイルが出力されるのかを確認できる(画面左上)。また、「ツール > オプション」の「プロジェクトおよびソリューション > ビルド/実行」にて、「実行時に、プロジェクトが最新の状態ではないとき」が「常にビルドする」を設定すると、ソースコード等を更新してから実行する際に自動的にビルドされるようになる(画面右下)。

5.「Program.cs」を下記のように書き換え、「ファイル > Program.cs の保存」を押下するか Ctrl+S で保存する。「Console.WriteLine(“Hello World!”);」は画面上に「Hello World!」と出力する命令である。また、「Console.ReadKey(true);」はキーの入力待ちをする命令である(この命令がないと、設定次第では画面上に「Hello World!」と出力されてから一瞬でコンソールが閉じられてしまい、動作を確認できなくなることがある)。

6.「開始」ボタンを押下するかF5キーを押下して実行する。実行すると、4の手順で確認したフォルダに実行ファイル(~.exe)が生成され、コンソール上でプログラムが実行される。以降、実行ファイルをダブルクリックすることで、Visual Studio Community 上でなくてもプログラムを実行することができるようになる(実行ファイルの配布等が可能になる)。

【csc.exe を使う方法】

1.任意のフォルダ(今回は C:\tmp\)で「Program.cs」というファイル名でファイルを作成し、任意のテキストエディタで以下の内容を入力する。

2.「C:\Windows\Microsoft.NET\Framework\v4.0.30319」に「csc.exe」が存在することを確認する。環境次第では「v4.0.30319」というフォルダがないかもしれないので、その場合は別のバージョンのフォルダを使用する。

3.コマンドプロンプトを立ち上げ、1の手順で使用したフォルダへcdコマンドで移動した後、2の手順で確認したcsc.exeを使用してビルドを行う。コマンドとしては下記のように打ち込む。

4.実行ファイル(Program.exe)が1のフォルダ上に生成されるので、下記のようなコマンドを入力して実行する。なお、実行ファイルを直接ダブルクリックすることでも実行できる。


いかがでしたでしょうか?

今回、初めてC#の記事を上げてみました。
文法はjavaに近いので、javaに慣れている方ならC#にも馴染みやすいのではないかと思います。
また、Microsoft社が開発した言語だけあって、Windowsとの相性は抜群で、今回の記事で紹介したようにコンパイラや実行環境もOS標準で入っています。
Windows用のアプリを作りたい時や、Windows向けにちょっとしたツールを作りたい時に適しているのではないかと思います。

今後もC#の記事を上げていきたいと思いますので、よろしくお願いします!

java:並行開発を行うためのテクニック

何も考えずにクラス分割を行いクラス毎に開発者を割り当てると、未完成のクラスを取り込むことができず、他のクラスが完成するのを待つ必要が出てきてしまいます。
今回は、他のクラスが完成するのを待たずに並行開発するテクニックを、javaの例を用いて説明します。


下記は何も考えずにクラス分割した場合の例です。
HelloProductクラスを取り込みたいのですが、HelloProductクラスが完成していないため、コンパイルができず、HelloProductクラスが完成するまで実行確認を行うことができません。

【サンプルコード】

・HelloMain.java(新規)

【実行結果】


そこで、Interfaceを用いる手があります。
Interfaceの下に、最終的に取り込みたいクラス(HelloProductクラス)と、実行確認時に暫定的に取り込むクラス(HelloTestクラス)を定義することで、最終的に取り込みたいクラスの完成を待たずに、実行確認時に暫定的に取り込むクラスを用いてテストが可能になります。
下記は、暫定的にクラスを取りこんで実行確認を行う例です。

【サンプルコード】

・HelloMain.java(修正)

・HelloInterface.java(新規)

・HelloTest.java(新規)

【実行結果】


そして、最終的に取り込みたいクラスが完成したら、newの箇所を変更することでそのクラスの取り込みが可能になります。

【サンプルコード】

・HelloMain.java(修正)

・HelloProduct.java(新規)

【実行結果】


以上のようにInterfaceの機能を用いて並行開発を行うのは、実際の開発でもよく使われる手段です。

補足すると、この手段は若干古典的な手段となります。
より発展的な手段としては、DI(Dependecy Injection)という手段があり、SpringFramework等のフレームワークの機能を用いることで容易に実現することが可能になります。
DIは、newの箇所(上記のサンプルコードで「 = new HelloTest();」や「 = new HelloProduct();」としていた箇所)の定義を何かしらの方法で不要とすることで、ソースコードを変更することなく取り込むクラスを変更できるようにする、という手段です。
SpringFrameworkでは、特定のアノテーションをソースコードに付与することで、取り込むクラスをxmlファイルで指定することが可能になります。上記のサンプルコードの例で言うと、HelloTestクラスを取り込むのかHelloProductクラスを取り込むのかをxmlファイルに定義することが可能になります。

DIについてはこの記事では詳しく触れませんが、現在の開発ではDIが使われることも多く、書籍やWebの文献も豊富です。
実際に使おうと思った時に実装方法がわからずに困る、ということは少ないでしょう。


いかがでしたでしょうか?

実際に多人数で開発していると、全てのソースコードが完成しないとコンパイルできないというのはかなり不便で、スケジュールにも影響してきます。
多人数で開発する場合は、今回の記事のようにInterface、フレームワークを使用しているならDIの機能を使用すると良いでしょう。

javaの記事が続いてきましたが、今後はC#の記事も書いていきたいと思っています。
ではまた次回!

java:WEBからHTMLファイルを取得するサンプルプログラム

HTML形式のログを定期的に取得しているのですが、その時に使用しているサンプルプログラムを公開します。
Javaの実行環境が整っているWindowsOSで、LogGet.java と LogGet.bat を同じディレクトリに置き、LogGet.bat を実行すると、「html」フォルダが出来上がりそこにHTMLファイルが格納されます。
取得するHTMLファイルのURL、及びHTMLファイルのローカルでのファイル名は、LogGet.java を修正して変更します。
HTMLファイルの文字コードは「EUC-JP」を前提としていますので、他の文字コードが使用されている場合は LogGet.java の「EUC-JP」の箇所を適宜修正してください。

【サンプルコード】

・LogGet.java

・LogGet.bat


いかがでしたでしょうか。

定期的にHTMLファイルを取得する機会があったので、javaでプログラムを作ってみました。
複雑なWebページを取得するには不向きですが、単純なHTMLで書かれたページを定期的に取得する時に便利だと思います。

便利な機能を見つけたら、また紹介したいと思います!

javaでのCommandパターン

Commandパターンとはデザインパターンの一種で、1つ1つのコマンド(命令)をそのままオブジェクトとして表現するパターンです。
コマンドをオブジェクトとして表現することで、コマンドの管理(追加・削除・実行)が可能になるというメリットがあります。

今回は、ファイルやフォルダを作成するコマンドを管理するサンプルコードを作成してみました。
Commandクラスが1つ1つのコマンドを表し、コマンドの管理はInvokerクラスで行い、コマンドの実際の処理はReceiverクラスで記述します。

【サンプルコード】

・Command.java

・ConcreteCommandForOperation.java

・ConcreteCommandForTemporary.java

・Receiver.java

・ConcreteReceiverMkfil.java

・ConcreteReceiverMkdir.java

・Invoker.java

・CommandMain.java

【実行結果】

・コンソール出力

・ファイルやフォルダの生成確認


いかがでしたでしょうか。

デザインパターンに出てくる設計は、自力ではなかなか思いつかない勉強しがいがあるものが少なくないと思います。
「コマンドをオブジェクトとして表現することで、管理(追加・削除・実行)を可能とする」というCommandパターンの発想も、その一つなのではないかと思います。

ここしばらくの間はデザインパターンの紹介を行ってきましたが、一旦一区切りつけたいと思います。
次週からはまた別の観点で役に立つ記事を発信して行きたいと思いますので、今後もよろしくお願いします!

javaでのStateパターン

Stateパターンとはデザインパターンの一種で、1つ1つの状態をそのままクラスとして表現するパターンです。
通常のコーディングだとIF文で状態毎の処理を記述させるためそれぞれの状態でどのような処理が行われるのか読み取りにくいのですが、このパターンを適用すれば状態遷移図上の状態とクラスが1対1で結びつくようになるので、処理が単純明快になります。

今回は、朝・昼・夜の各状態で出現モンスターが変わるサンプルコードを作成してみました。
このパターンは記述内容としては決して難しくないので、サンプルコードを見た方が理解が早いと思います。

【サンプルコード】

・StateEnum.java

・State.java

・UnknownState.java

・MorningState.java

・DayState.java

・NightState.java

・Context.java

・StateMain.java

【実行結果】


いかがでしたでしょうか。

設計を行う際に、状態遷移図を書くことがあると思います。
その状態遷移図をコードとして表したものが、Stateパターンです。
コードの可読性が上がるだけでなく、状態を追加するような時にも影響を局所化できるので、覚えておいて損は無いパターンだと思います。

次回は、Commandパターンについて取り扱いたいと思います!