Javaの勉強をしていると最初の方に学習する事ではあるのですが、ふと違いとは?と考えるとjavaの実行環境と開発環境の違い位の認識しかなかったので整理しておこうと思います。
JDK
- 「Java Development Kit」の略称。
- Javaでプログラムを開発する際に必要。
- ソフトウェア開発キット(SDK)を拡張したサブセット。
- フリーソフトウェア。
JRE
- 「Java Runtime Environment」の略称。
- Javaで作成されたプログラムを実行する場合に必要。
Javaの勉強をしていると最初の方に学習する事ではあるのですが、ふと違いとは?と考えるとjavaの実行環境と開発環境の違い位の認識しかなかったので整理しておこうと思います。
Web開発では帳票をExcelで出力する際に「Apache POI」がよく使用されています。
ただ「Apache POI」を使用する場合、システム的な制限やリソースなど事前に注意しておくべき点があるのでメモしておきます。
JUnitでテストする時にprivateメソッドをテストする方法をご紹介します。
privateメソッドをテストするにはリフレクション「java.lang.reflect.Method」を使用することで実行可能となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class SampleClass1{ /** サンプルフィールド */ private String field = "hoge"; /** * <p>[概 要] サンプルメソッド</p> * <p>[詳 細] </p> * <p>[備 考] </p> */ private String sampleMethod(String str){ return str + "test"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
@Test public void testSampleMethod() { // 準備 SampleClass1 sampleClass1 = new SampleClass1(); String result = ""; // 期待値 String expected = "hogetest"; // 実行 try { Method sampleMethod = SampleClass1.class.getDeclaredMethod("sampleMethod", String.class); // privateメソッドにアクセス可能とする sampleMethod.setAccessible(true); result = (String)sampleMethod.invoke(sampleClass1, "hoge"); } catch (SecurityException e) { // 普通のプログラムでは発生しない、ほとんど無視していい fail(e.getMessage()); } catch (NoSuchMethodException e) { // メソッド名・引数の型が一致しない場合に発生 fail(e.getMessage()); } catch (IllegalArgumentException e) { // 実行対象の引数の型/引数の数があってれば発生しない。NoSuchMethodExceptionの場合と同じく、1度でも通れば基本的に例外処理はいらない fail(e.getMessage()); } catch (IllegalAccessException e) { // 対象メソッドのアクセス制限(private/default package/protected)によりアクセス不可の場合に発生 fail(e.getMessage()); } catch (InvocationTargetException e) { // 対象のメソッドの処理中に発生した例外。e.getCause()で実際にメソッド内で発生した例外を取得できる。 fail(e.getMessage()); } // 検証 assertEquals("戻り値が一致していません", expected, result); } |
JUnitでテストする時にprivateなメンバ変数を取得・更新したい場合の方法をご紹介します。
今回はAPI「JMockit」の「Deencapsulation」クラスを使用してカプセル化された変数を参照・更新する方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class SampleClass1{ /** サンプルフィールド */ private String field = "hoge"; /** * <p>[概 要] サンプルメソッド</p> * <p>[詳 細] </p> * <p>[備 考] </p> */ private String sampleMethod(String str){ return "test"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import static org.junit.Assert.*; import mockit.Deencapsulation; import org.junit.Test; public class SampleClass1Test { @Test public void testSampleField1() { // 準備 SampleClass1 sampleClass1 = new SampleClass1(); // 期待値 String result = "hoge"; // 実行(privateインスタンス変数の値を取得) String expected = Deencapsulation.getField(sampleClass1, "field"); // 検証 assertEquals("サンプルフィールドの値が一致していません", expected, result); } @Test public void testSampleField2() { // 準備 SampleClass1 sampleClass1 = new SampleClass1(); // 期待値 String result = "hogehoge"; // 実行(privateインスタンス変数の値を変更) Deencapsulation.setField(sampleClass1, "field", result); // 検証 String expected = Deencapsulation.getField(sampleClass1, "field"); assertEquals("サンプルフィールドの値が一致していません", expected, result); } } |
javaではUtilクラスなどのコンストラクタは無駄なインスタンス化を抑制するためにコンストラクタの修飾子をprivateにする事がよくあります。ただdjUnitで試験する場合にはコンストラクタを呼び出したくても修飾子がprivateになっていてはインスタンス化が出来ずに呼び出せないのでカバレッジを100%に出来ません。そういう場合にプライベートコンストラクタをテストする方法についてメモしておきます。
1 2 3 4 5 6 7 8 9 10 11 |
public class UtilSample1{ /** * <p>[概 要] コンストラクタ</p> * <p>[詳 細] </p> * <p>[備 考] </p> */ private UtilSample1() { // 処理なし } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import org.junit.Test; public class UtilSample1Test { @Test public void testConstructor() { try { // 準備 Class<?> utilSample1 = Class.forName("UtilSample1"); Constructor<?>[] constructor = utilSample1.getDeclaredConstructors(); constructor[0].setAccessible(true); // 実行 Object object = constructor[0].newInstance(); // 検証 assertNotNull("オブジェクトがありません。",object); assertThat(object, instanceOf(UtilSample1.class)); } catch (ClassNotFoundException e) { // 指定されたクラスが存在しない場合 fail(e.getMessage()); } catch (IllegalArgumentException e) { // 不正な引数、または不適切な引数をメソッドに渡した場合 fail(e.getMessage()); } catch (InstantiationException e) { // インスタンスを生成できない場合 fail(e.getMessage()); } catch (IllegalAccessException e) { // 配列以外のインスタンス作成、フィールドの設定または取得、メソッドの呼び出しを試みた場合 fail(e.getMessage()); } catch (InvocationTargetException e) { // 呼び出されるメソッドまたはコンストラクタがスローする例外をラップする、チェック済み例外 fail(e.getMessage()); } } } |
Web開発では必ずアプリケーションサーバ(APサーバ)とかWebサーバなどという言葉が出てきます。
ここでは「アプリケーションサーバ」とは何者なのか、またこの「アプリケーションサーバー」として使用されている「JBoss」と「Tomcat」の機能や違いについて整理しておきます。
その前に「アプリケーションサーバ」って何?という方もいると思いますので、簡単にまとめておきます。
とつらつら書いてみましたが、要はJbossもTomcatも「JavaをWeb(ブラウザ)上で動かすためのプログラム」という感じで理解しておけば最初の内はいいのかなあと思います。ただTomcatでは使用出来る機能が限られる為、Tomcatの機能も包含しているJBossを使用しているケースが最近は多いようです。
インターネットを構成する上で、webサーバを理解することは非常に重要です。
ホームページなどのwebサイトを構築する場合、webサーバーを何にするのかというのは非常に重要になります。
webサーバーとしては、UNIXやLINUXで使われているapacheと、windowsで使われるIISの2種類が一般的に広く使用されています。
これらは機能にも違いがあるため、サーバー移行などをする場合によく理解していないとトラブルになることもあります。
apacheはレンタルサーバーなどを借りると使われていることが多く、ノウハウなどもwebサイトから収集もしやすいというメリットがあります。apacheに精通した技術者も多く、世界中で使われているといった特徴があります。
一方、IISはwindowsサーバーで使われていて、apacheに比べると需要は少なくなります。
基本的にどちらもできることは似ていますが、両者の特徴やメリット・デメリット、記述方法などをしっかりと理解して環境に最適なWebサーバを選択することが重要となります。
HTMLを作成する時に悩む、<b>太字タグと<strong>論理強調タグの違いについてメモしておきます。
この二つは表面上はよく似ていて、どちらも太字になります。
ですが<b>タグは単に太く見えるだけで単なる一般的な太字ですが、<strong>タグは検索エンジンなどにおいて、特別な意味を持ったタグとなります。
検索エンジンなどで注視させたい場合などは<strong>タグを用いると良いでしょう。
逆に<b>タグは単なる太く見えるだけのタグなので、文章の中で読者に対して注視させたい場合に用います。
私の場合は以前よくSEOの観点から<strong>タグを活用していました。
メタタグなどよりは多少の効果はあるようで、特定の検索ワードで上位になることも多かったです。
今は時間的に余裕がなく面倒なので、あまり文章内の特別な編集は殆どしていませんが、多少の効果があるという事は確かなようです。
他にもメタタグなど色々なタグがHTMLにはありますが、<b>タグや<strong>タグは初心者でも簡単に用いる事が出来ると思うので、うまく活用すると良いかもしれません。
ホームページのアドレス部分「http://www.~」を指す場合、「URL」と言ったり「URI」と言ったりしてるのを聞いた事がないでしょうか?一体どちらを使用するのが正しいのか疑問に思う方もいらっしゃると思うので整理しておこうかと思います。
正式名称を見てみると「URI」、「URL」、「URN」どれもリソースを表していますが、リソースを識別する意味で使用するのなら「URI」を使用すべきです。