変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

未分類

JUnit4 使ってみた

とりあえずサンプルを書いてみた。
まずはテストする対象のソース。

/**
 *
 */
package sample4;
/**
 * @author ssiscirine
 *
 */
public class Sample4 {
	public String method0() {
		return "method0";
	}
	public String method1(String param1) {
		return "method1";
	}
	public String method2(String param1, int param2) {
		return "method2(String param1:\"" + param1 + "\", int param2:" + param2 + ")";
	}
	public String method2(int param1, String param2) {
		return "method2(int param1:" + param1 + ", String param2:\"" + param2 + "\")";
	}
}

そしてJUnit用のソース。
ベースはテスト用のフォルダで右クリック⇒新規⇒その他…⇒Java⇒JUnit⇒Junitテスト・ケースで、作成するスタブのチェックを入れ、テスト元クラスを指定するとザクっと作ってくれる。
ビルドパスのJunit4が無かったら、確認した上で追加してくれる。※Eclipse 4.7.2の場合
ま、テスト内容は
fail(“まだ実装されていません”); // TODO
しか入らないけどね。

/**
 *
 */
package sample4;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.hamcrest.CoreMatchers;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.junit.runners.MethodSorters;
/**
 * @author ssiscirine
 *
 */
// テストケースの名前順に実行する指定
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class Sample4Test {
	@Rule
	//テストケースのメソッド名を知りたくて追加。
	public TestName name = new TestName();
	/**
	 * JUnitの実行で最初に実行する処理
	 * @throws java.lang.Exception
	 */
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		//
		System.out.println("setUpBeforeClass() JUnitを開始します。");
	}
	/**
	 * JUnitの実行で最後に実行する処理
	 * @throws java.lang.Exception
	 */
	@AfterClass
	public static void tearDownAfterClass() throws Exception {
		//
		System.out.println("tearDownAfterClass() JUnitを終了します");
	}
	/**
	 * 各テストケースの事前に実行する処理
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		//
		System.out.println(name.getMethodName() + "のための setUp() テストケースの事前処理を行います。");
	}
	/**
	 * 各テストケースの事後に実行する処理
	 * @throws java.lang.Exception
	 */
	@After
	public void tearDown() throws Exception {
		//
		System.out.println(name.getMethodName() + "のための" + " tearDown() テストケースの事後処理を行います。");
	}
	/**
	 * {@link sample4.Sample4#method0()} のためのテスト・メソッド。
	 */
	@Test
	public final void testMethod0() {
		System.out.println(name.getMethodName() + "() テストケース・その1");
		fail("まだ実装されていません"); // TODO
	}
	@Test
	public final void testMethod0_01() {
		System.out.println(name.getMethodName() + "() テストケース・その2");
		Sample4 sample4 = new Sample4();
		// Assert : 予想と違ったらNGに(JUnitの実行結果をX表記)する
		Assert.assertTrue(true);
		//
		Assert.assertNull(null);
		Assert.assertNotNull("Not null");
		//
		Assert.assertEquals(sample4.method0(), "method0");
		Assert.assertNotEquals(sample4.method0(), "method0_01");
		//
		Assert.assertThat(sample4.method0(), CoreMatchers.is(equalTo("method0")));
		Assert.assertThat(sample4.method0(), CoreMatchers.is(not(equalTo("method0_01"))));
		//予想と違ったら見なかったことに(JUnitの実行結果をIgnore表記)する
		Assume.assumeTrue(true);
		Assume.assumeFalse(false);
	}
	/**
	 * {@link sample4.Sample4#method1(java.lang.String)} のためのテスト・メソッド。
	 */
	@Ignore
	public final void testMethod1() {
		fail(name.getMethodName() + "() まだ実装されていません"); // TODO
	}
	/**
	 * {@link sample4.Sample4#method2(java.lang.String, int)} のためのテスト・メソッド。
	 */
	@Ignore
	public final void testMethod2StringInt() {
		fail(name.getMethodName() + "() まだ実装されていません"); // TODO
	}
	/**
	 * {@link sample4.Sample4#method2(int, java.lang.String)} のためのテスト・メソッド。
	 */
	@Ignore
	public final void testMethod2IntString() {
		fail(name.getMethodName() + "() まだ実装されていません"); // TODO
	}
}

Assert.assertTrue(true); 等はassertTrueがどこのクラスのメソッドか判りやすくするための書き方で、assertTrueがpublicでstaticなメソッドなのだから import org.junit.Assert;してあれば、assertTrue(true);で十分推測可能でしょうけど、いつでもどの環境でもメソッドの上にツールチップが出る訳ではないので、faileとか、isがCoreMatchers.isなのは覚えるしかないかもしれない。
実行してみると

setUpBeforeClass() JUnitを開始します。
testMethod0のための setUp() テストケースの事前処理を行います。
testMethod0() テストケース・その1
testMethod0のための tearDown() テストケースの事後処理を行います。
testMethod0_01のための setUp() テストケースの事前処理を行います。
testMethod0_01() テストケース・その2
testMethod0_01のための tearDown() テストケースの事後処理を行います。
tearDownAfterClass() JUnitを終了します

一度、作り込んでしまえば、System.out.printlnのログをコンソールに出す必要はほとんど無い。しかし、Junitの実行時間がとても長い場合は、setUpBeforeClassやtearDownAfterClassに短いログを出した方が安心だし、時折挫折することもあるテストでは、setUpやtearDownでも何か出して欲しい。データベースの初期データを投入します。とか、データベースを初期状態にロールバックします。とかね。
また、JTestの様なツールで使うテストケースではJTest実行中は大量に出てしまい邪魔になりそうなので、System.out.printlnよりはvoid log(String msg)などを作ってソコからSystem.out.printlnに出すようにした方がいいだろう。勿論、EclipseでJUnitを使うならログを標準出力に出さないのが本道だが、環境が悪いと途中で止まってしまったかのようにも見えてしまうので用意した方がいいだろう。
JUnitのビューは
sample4.Sample4Test
 [X]testMethod0
 [O]testMethod0_01
となっていて、[x]のメソッドをクリックする、障害トレースにassertXXXやasumeXXXのログが出てくる。ドキュメントはここ
勿論、privateなメソッドだったり、相手がMVCのクラスだったり、直接テスト対象にアクセスできない場合はそれなりの機能がある様だが、それは次回に続く。



キーボード・ショートカット と EXCEL と GeForce Experience

EXCELでALTとF11を同時押しすると普通はVBAの画面が表示される。
ところが・・・家のパソコンではEXCELの画面でALTとF11を同時押ししても反応が無い。
1.MS-OFFICEのグループポリシーが書き換わったのか?
参考url : https://getadmx.com/?Category=Office2016&Policy=word16.Office.Microsoft.Policies.Windows::L_Disableshortcutkeys&Language=ja-jp
だがリポジトリにそんな設定は無かった。
2.変なアドインが入ってしまったのか?
Office xxxx Editions Resource Kit Tools を入れた覚えは無いが・・・
C:\Users\{ユーザ名}\AppData\Roaming\Microsoft\Excel\XLSTART の下に  EXCELxx.ADM は無かった。そこには・・・何も無かったので、変な起動マクロでALTとF11の同時押しを封じ込められた訳ではない。
3.セキュリティーソフトか?
一時的に無効化してみたが、変化無し。
4.他のALTとFキーの同時押しはどうか?
ALT+F1

あ、GeForce Experience がスクリーンショットを撮ろうとしている。

そうだ!GeForce Experienceに登録したショートカットはいつでもドコでも有効なのだ!

あれ?NVIDIAの通知アイコンを右クリックしてもGeForce Experienceが無い。
メニューからNVIDIA Corporation ⇒ GeForce Experienceを起動し、歯車アイコンで設定を開き、全般の「ゲーム内のオーバーレイ」の【設定】ボタンを押してみる。すると「キーボードショートカット」が観える。
いっぱい登録されている  orz
ALT+F1、ALT+F5、ALT+F6、ALT+F7、ALT+F8、ALT+F9、ALT+F10、ALT+F11、ALT+F12 などなど・・・
時分で・・・時分?時分?滅多に使わない単語だな・・・
自分で設定を変更したのかもしれないけどね・・・(完全に忘れてたのかな・・・
仕方が無いので、ALT+F11表記をクリックしてALT+Shift+F11 に変更。
これで、ALT+Shift+F11を同時押しすると、Facebookで配信中にコメントのオン/オフを切り替える様になる。(ハズ
改めてEXCELを起動。ALT+F11同時押し。
無事VBAの画面が表示された。
GeForce Experienceは自動常駐なキャプチャーソフトなので、ついその存在を忘れがち、勿論設定したショートカットも忘れがち、これは辛いかもしれない。
EXCELでALT+F11が効かなくなったら・・・GeForce Experienceも候補にあげた方がいいかもしれない。
GeForceの新しいドライバーがあったのでインストして再起動。
あれ?NVIDIAの通知アイコンを右クリックするとGeForce Experienceが出てきた。
設定変えたせいかな?



Java ObjectMapper

よく、お世話になっているObjectMapper、しかし、アゴで使うだけで、自分でこのパッケージをインストールすらしていなかったので、改めてサンプルを書いてみた。
まず、JDKにObjectMapperは入っていないので、pom.xmlで依存関係を設定する。
サンプルをMavenプロジェクトにすると、様々なjarファイルが.m2フォルダにダウンロードされる仕組みなので、外部へアクセスできない閉鎖的な開発環境では使えない。
しかし、職場に情報収集用のパソコンが用意されていれば、そこにEclipse(JDK付)を入れておけば、サンプルの動作を確認した後に、.m2フォルダからゴッソリとJarファイルをコピるだけで済むので、
様々なjarファイルの様々な依存関係を調査しながら様々なサイトから必死になってかき集める面倒さも無い。

  <dependencies>
  	<dependency>
  		<groupId>com.fasterxml.jackson.dataformat</groupId>
  		<artifactId>jackson-dataformat-xml</artifactId>
  		<version>2.9.3</version>
  	</dependency>
  </dependencies>

そして、マッピングするサンプルのデータ・クラス。

package sample3;
import java.text.SimpleDateFormat;
public class SampleData1 {
	public int id;
	public String name;
	public java.sql.Timestamp timeStamp;
	final static public String TIMESTAMP_FORMAT = "#yyyy/MM/dd HH:m:s.S(z)#"; // JSONで表記するタイムスタンプ型の書式
	public String toString() {
		SimpleDateFormat sdf = new SimpleDateFormat(TIMESTAMP_FORMAT);
		return "SampleData1 [id=" + id + ", name=\"" + name + "\", timeStamp=" + sdf.format(timeStamp) + "]";
	}
}

サンプルのデータ・クラスを使ったJSONとのデータ変換のサンプル。

package sample3;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Sample3a {
	public static void main(String[] args) throws IOException {
		ObjectMapper om = new ObjectMapper();
		om.setDateFormat(new SimpleDateFormat(SampleData1.TIMESTAMP_FORMAT));
		//
		String title = "Object⇒JSON";
		String json = "";
		{
			SampleData1 sd1 = new SampleData1();
			sd1.id = 100;
			sd1.name = "aaaaa";
			sd1.timeStamp = new Timestamp(System.currentTimeMillis());
			json = om.writeValueAsString(sd1);
			System.out.println("【" + title + "】\n " + json);
		}
		//
		/*String*/ title = "JSON⇒Object";
		{
			SampleData1 sd1 = om.readValue(json, SampleData1.class);
			System.out.println("【" + title + "】\n " + sd1);
		}
		//
		/*String*/ title = "String⇒JSON";
		{
			String str = new String();
			str = "s t r i n g";
			json = om.writeValueAsString(str);
			System.out.println("【" + title + "】\n " + json);
		}
		//
		/*String*/ title = "JSON⇒String";
		{
			String str = om.readValue(json, String.class);
			System.out.println("【" + title + "】\n " + str);
		}
		//
		/*String*/ title = "Map<String,String>⇒JSON";
		{
			Map<String, String> map = new HashMap<String, String>();
			map.put("id", "ID00001");
			json = om.writeValueAsString(map);
			System.out.println("【" + title + "】\n " + json);
		}
		//
		/*String*/ title = "JSON⇒Map<String,String>";
		{
			Map<String, String> map = om.readValue(json, new TypeReference<Map<String, String>>() {
			});
			System.out.println("【" + title + "】\n " + map);
		}
	}
}

その実行結果がこちら。

【Object⇒JSON】
 {"id":100,"name":"aaaaa","timeStamp":"#2018/01/12 22:59:11.808(JST)#"}
【JSON⇒Object】
 SampleData1 [id=100, name="aaaaa", timeStamp=#2018/01/12 22:59:11.808(JST)#]
【String⇒JSON】
 "s t r i n g"
【JSON⇒String】
 s t r i n g
【Map<String,String>⇒JSON】
 {"id":"ID00001"}
【JSON⇒Map<String,String>】
 {id=ID00001}

ちょっと面倒なのがreadValueで
出力するデータ・クラスを指定するパラメータで・・・
データ・クラスがコレクション系クラスの場合、

new TypeReference<Map<String, String>>() {
}

と妙な書き方をしなければいけないことだ。
勿論、

new TypeReference<List<Map<String, String>>>() {
}

の様にネストしてもいいので、JSONっぽいラフなデータ構造にも対応している。
それから、タイムスタンプ型データの書式は、ObjectMapperのsetDateFormatを使って、SimpleDateFormat のインスタンスを与えることで好きな様に変えられるが、いくつかの書式が混在する場合は厄介かもしれない。



JAVA8 Streamで文字列をJoin

JavaのStreamクラスを使って、文字列のリストをJoin(デルミタを挟んで1つの文字列に)する方法を試してみた。

/**
 *
 */
package sample2;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author ssiscirine
 *
 */
public class Sample1 {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		{
			System.out.println("☆文字の配列をJOIN☆");
			List<String> lst = new ArrayList<String>();
			lst.add("aaa");
			lst.add("bbb");
			lst.add("ccc");
			String[] ar = lst.toArray(new String[0]);
			System.out.println(String.join(", ", ar));
		}
		{
			System.out.println("☆nullを含む文字の配列をJOIN☆");
			List<String> lst = new ArrayList<String>();
			lst.add("aaa");
			lst.add(null);
			lst.add("ccc");
			String[] ar = lst.toArray(new String[0]);
			System.out.println(String.join(", ", ar));
		}
		{
			System.out.println("☆nullを含む文字の配列からnullを取り除いてJOINING☆");
			List<String> lst = new ArrayList<String>();
			lst.add("aaa");
			lst.add(null);
			lst.add("ccc");
			String str = lst.stream()
					.filter(i -> (i != null))
					.collect(Collectors.joining(", "));
			System.out.println(str);
		}
		{
			System.out.println("☆nullを含む文字の配列からnullを取り除いてJOIN☆");
			List<String> lst = new ArrayList<String>();
			lst.add("aaa");
			lst.add(null);
			lst.add("ccc");
			String[] ar = lst.stream()
					.filter(i -> (i != null))
					.toArray(String[]::new);
			System.out.println(String.join(", ", ar));
		}
	}
}
☆文字の配列をJOIN☆
aaa, bbb, ccc
☆nullを含む文字の配列をJOIN☆
aaa, null, ccc
☆nullを含む文字の配列からnullを取り除いてJOINING☆
aaa, ccc
☆nullを含む文字の配列からnullを取り除いてJOIN☆
aaa, ccc
    普通の文字列なら特に問題は無い。
    しかし、文字列にnullが混ざっていると、普通に null と表示してしまう。
    なので、StreamのFilterで取り除いてみる。
    最後は出力の仕方を他と合わせてみた。

StreamのtoArrayをパラメータ無しで使うとObject[]が戻ってくるがそれでは使いようが無いからString[]を返して貰いたい。
しかし、そのためにはListのtoArrayのようにnew String[0]ではなく、String[]::newと書かなければいけない特殊なルールが適用される。
ま、new String[0]だって、かなりマイ・ルール的であるけどね。(大笑
なぜこんなことを書いたかと云えば、古への勘違いの伝承で、文字列の結合にはStringBuiderを用いよ。というのがある。
※servletでapplication/octet-stream形式でファイルをダウンロードさせるなら、Stringで返すよりも、StringBuiderからOutputStreamを作ってwriteに渡した方が速そう?な・・あたりから落ちてきたっぽい。⇒+++と何度も文字列の結合を繰り返すとメモリを捨てまくる⇒だがしかし、toStringの結果が巨大なテキストの場合、その直後にStringの中身を1文字づつコード変換(知らない文字を?に変える簡単なお仕事=getByte(“UTF-8”)等)がかかるのは明らかで、いくら苦労してもメモリ云々以前に処理が遅すぎるんだよね。というオチ。
それでも、単に文字列を結合するならStringBuiderでも構わないけど、後になって<BR>や¥n(改行コード)をデリミタとして差し込むとか言い出されることは多い。
そうなると、if(StringBuider.IsNotEmpty()) { StringBuider.append(デリミタ); } を全般に挿入することになる
さらに始末が悪いのが・・・
最初はサンプルHTMLのJavaScriptのInnerHTMLで差し込むのでバリバリに<BR>であったが、
後になってJSPタグで差し込むことになると、<BR>を¥n(改行コード)に一斉置換しなければいけない。
しかし、全ソースの<BR>を対象にする訳にはいかない。しかも<BR>とか¥nなんてソースに直書きしないのがお約束だから、猶更始末に負えない。
これはかなりの重労働になりそう。
そんな優柔不断な相手にはListに詰め込み最後にJoinすれば安心だろう。
と思ったので書いてみた。
そして、StringBuiderに joinがあったらとは云わない、でも、せめてtoArrayダケでもあったら良かったのに・・・とも思った。(かなり真剣に



間違ったMS-EXCELの使い方

間違ったMS-EXCELの使い方

  1. EXCELで書類を書く。
  2. EXCELで書いた書類を1つのブック(ファイル)にまとめる。
  3. ブック(ファイル)にまとめたEXCELファイルを配布する。
  4. ブック(ファイル)にまとめたEXCELファイルを多人数で同時に使う。
  5. ブック(ファイル)にまとめたEXCELファイルを共有モードにして多人数で同時に使う。

一見、何も間違っていない様に思える。
しかし、EXCELには様々な制約があり、特に書式の数の制限がとても痛い。64000個(大凡1シートで使うセル範囲程度)までと大目な数ではあるので、上の1.であればマズ問題は無い。
しかし、2.で沢山のシートをまとめると書式の数の上限に近くなったり、あっさり越えたりする。多くの場合、似たり寄ったりのレイアウトにまとめたシートであればいいが、シートごとに若干異なる書式を使うケースではあっさり超えてしまう。
例:1シート目の行にシリアル番号を付ける1.2.3・・・、しかし他のシートと区別するために、書式でAAA001、AAA002、AAA003・・・としてみると・・・
2シート目の行にシリアル番号を付ける1.2.3・・・、しかし1シート目と同様に、書式でBBB001、BBB002、BBB003・・・としてみると・・・
・・・
となり1シートごとに1個づつ書式が増えていく。
これが1シートごとに10個づつ書式が増え、更に100シートぐらいをまとめると、先のシリアル番号だけで1000個も使ってしまう。
EXCELの書式は色々使い道があるので、1シートごとに10個というのは少ない方だろう。そう考えると、自分が作ったシートをひとまとめにするまでは上限数的に大丈夫だろう。
しかし、10人のシートをひとまとめにするのはヒヤヒヤもの。
当然、100人のシートをひとまとめにするのは絶望的である。
故に、過去には、多人数にEXCELシートでアンケートに記入してもらい返事をメールで貰う場合は、書式の無いテキストファイルを添付してもらっていた。理由はメールの添付ファイルの容量×人数 > 当時のメール容量の上限の懸念であったが、実際にはEXCELシートをマージすると先の書式の数の上限に引っかかること間違いなかったからであった。
・・・
時には、他のシートの多いEXCELブックからどれかのシートを転記しようとすると、書式の分量の多い転記元+書式の分量の多い転記先の合計になり、これだけで書式の上限近くなってしまう場合には、シートのコピーができなくなってしまう。もちろん、1セルのコピーすら不能になってしまう。
この場合は、転記元のみ開き、新規にEXCELブックを作って、シートをコピーし、転記元を閉じてから、転記先を開くと、運の良いあなたなら、シートをコピーすることができる。
※但し、次の人が同じ方法で対処できる保証は全く無い。
という訳で上記の1.~5.のような使い方をしていると、書式の数の上限でヒドイ目に合うことは避けられないのだ。
長々と書いてしまったが・・・これらは書式の数の制約がもっときつかった1990年代ごろに既に(上限が低かっただけにスグに)判明していたことである。もうすでに21世紀になってもう20年近くになっているものの、MSがやってくれたことは、書式の上限を数百個から64000個まで段階的に増やしてくれたことだけだ。
・・・
早い話、「要らない!使っていない!書式を消してしまえばいいのだ。」と云う馬鹿者は多いだろう。
しかし、自分で作ったEXCELブックですら自動的に生成される書式もあるから難しいし、他人からもらったモノであれは猶更である。
・・・
困ったことに、WEBブラウザのページからEXCELシートにコピペすると
綺麗なWEBページが多いのでEXCELブックの書式の数が一気に増えてしまう
あちこちのサイトで参考資料としてEXCELブックに貼ると
あっという間に書式の数が凄いことになってしまうので、
その後に何かの拍子に「書式が多すぎます」のメッセージを見ることは決して少なくないハズ。
※そのせいか?最近のEXCEL君が無理にセルデータの押し込もうとするが、失敗(文字欠けやレイアウト崩壊等)することが多い。
・・・
これについて、根本的に解決策は今のところ見つかっていない。
正解に近い方法としては・・・

  1. 自分で作ったEXCELブックファイルを他人に渡さない。
  2. 他人の作ったEXCELブックファイルを貰わない。
  3. EXCELブックファイルの中身はPDFにして配布する。

である。
しかし、この方法は一時的に流行ったものの以下の事項により、スグに廃れた。

4.使い続ける限りEXCELブックファイルのメンテナンスが必要でPDF出力後に即廃棄はできない。

そんな訳で書式の数の問題は・・・
この先も同じこと(上限を上げて先伸ばしする)が続くのだろう。
 
 
 
 
 
 



3次元空間

CGで何かの物体の座標を表現する時はXYZの3座標軸で表現するのも、空間は3次元で表現することが多いからだ。
平面の地図は緯度・経度を使うけど、これに高度(高度1000mでも地上5階でもいい)を足せばちゃんと3次元になる。
ところが、太陽から見れば地球は自転している上に太陽の周りを回ってもいるので、地上の緯度・経度・高度で表現するだけでは不十分で、地球の公転や自転の状態も追加しないと正確ではない。
しかし、太陽系の外から見れば太陽も自転しているし上にどこかに向かって移動してるので、太陽の自転や移動の状態も追加しないと正確ではない。
さらに、銀河系の外から見れば銀河も自転しているし上にどこかに向かって移動していので、銀河の公転や移動の状態も追加しないと正確ではない。
その上、銀河集団の外から見れば銀河集団も自転しているし上にどこかに向かって移動していので、銀河集団の公転や移動の状態も追加しないと正確ではない。
・・・と、もっとこの先もあるのかもしれない。
これらを纏めると、宇宙の構造は複雑で、地球上の何かの位置を特定する次元(地上の緯度・経度・高度+地球の公転や自転の状態+銀河の公転や移動の状態+銀河集団の公転や移動の状態)の数はとても多い。
宇宙の構造に新たな発見が増えていくなら、次元(地上の緯度・経度・高度+地球の公転や自転の状態+銀河の公転や移動の状態+銀河集団の公転や移動の状態+・・・)となって切りがない。
有体に表現するなら、宇宙の中の地球だけでも、次元数はとんでもなく多い。
しかし、時間を使い
地上の緯度・経度・高度+地球の公転や自転の状態(時刻)+銀河の公転や移動の状態(時刻)+銀河集団の公転や移動の状態(時刻)+・・・(時刻)
=地上の緯度・経度・高度+地球の状態(時刻)
と纏めることは可能な気がするし、CGも動画なら次元にタイムスケールが必要なので、ほぼ一致する。
ここから、時間の概念の無い3次元空間とは時間が固定された一瞬または時間を一般に自動的に進むのでノーカンする考えであることが判る。
さらにとっても微視的な状況を考えると、地上という概念は無意味であり、空間上の何かの2つの関係だけになってしまうので、空間上の何かの2つの距離+空間上の何かの2つの進行方向の差(角度)の2次元で表現できてしまう。
巨視的な状況では空間上の何かの3つ以上の関係となるため、空間上の何かの2つと他の関係を表す次元が加わり3次元に落ち着く。
しかし、それも高エネルギー状態では、空間上の何かの2つと他の関係はキニナラナイくらいどうでもいいことなので、再び2次元にたどり着いてしまう。
以上から、宇宙は複雑な次元で表現されるものの、それは比較的低エネルギーで安定している状態を巨視的に俯瞰する状況つまり人間が普通に生活する場面であり、人間が普通に生活できる場所がかなり限られている宇宙はおおむね2次元で十分ということが言える。
 



起動する度にWindos10のタスクバーに登録したアイコンが表示されない

最近の大型のWindowsUpdateの後、パソコンを起動すると画面下のタスクバーにアプリのアイコンが1つも表示しなくなってしまった。
何かアプリを起動すると、タスクバーにアイコンが1つ表示されるので、それを右クリックして「タスクバーからピン留めを外す」か「タスクバーにピン留めする」を選択すると、登録済みのアイコンが一斉に表示される。
最後に、「タスクバーからピン留めを外す」したアイコンをもう一度右クリックして「タスクバーにピン留めする」することを忘れずに・・・
ググってみた結果では、タクスバーの初期表示に関わる部分で「タスクバーにピン留めする」したアイコンを初期表示するための情報が欠落したせいのようだ。
しかし、そんな目に合っていない人もいるので、何がきっかけでタスクバーにアイコンが表示されなくなるのかは全く不明なので、闇雲に高速起動をON・OFFしてみたり、クリーンブートしようが解決できるものではない。
※よく使うアプリなので「タスクバーにアプリを登録している」のに、その「アイコンを表示しないWindows10の評価は★☆☆☆☆☆」と、させていただきます。
 
 



Web SQLデータベースの今

ブラウザにSQLデータベースエンジンが載っている。
と聞いた。
月報とかを月末にまとめてWEBで送信するのに便利そうだし、WEB化せずに放置してたMDBでデータを操作してサーバーにアップするVB6アプリの安易なWEB化に使えそうなので探してみた。
サンプルを見つけたがブラウザで開くもピクリともせず、デバッガのコンソールには
ReferenceError: openDatabase is not defined
と表示されるだけだった。
とあるサイトによれば、
実装がSQLiteに余りにも寄り過ぎていて、皆からソッポを向かれてしまったらしい。
今は触らない方がよさそうだが、とりあえず実装チェッカーを作ってみた。
手元のブラウザで動くのはChromeだけだったが、

  • Opera 10.6
  • Safari 5

でも、動くらしい。
SQLiteを載せている(載せていた)FireFoxで使えないのは謎。
と云うか、ブラウザがSQLiteのデータベースとして管理しているデータを
勝手に書き換えられては困るのは容易く想像できる様な気もする。
今は Indexed Database API が推奨されているようだ。
とりあえず実装してみた程度の範囲らしいけど・・・

  • Firefox 4.0
  • Google Chrome 11

で動くそうなのでコッチの方が使えそう。
そのサンプルを見つけるも何故か動かない。
ToDOアプリのサンプルと見比べて、手を加えてみました
さて、SQLデータベースがNO SQLデータベースなキー・バリュー形式になってしまうと、ほとんどLocalStrageのキーがテーブル名でバリューがレコード一式のJSONに例えてしまえば、これを使っても若干コードを書く手間が減る程度であり、見つけたサンプルが動作しないくらい仕様がブレているなら、これを直接使う意味があるのかどうかは微妙な気がした。
 



EclipseでNode.jsを使ってみる

EclipseでNode.jsを使うには、ココにも書いてある通り
1.メニューの「ヘルプ」から 「新規ソフトウェアのインストール」を選択。
2.「作業対象」に http://www.nodeclipse.org/updates/ を入力する。
3.「1st Nodeclipse Core」と「Enide Tool Collection」にチェックを入れ、次へをクリックする。
という方法だったと思ってたけど、今は「見つかりません」と出るだけ。
あらためてhttp://www.nodeclipse.org/updates/を覗いてみると、
今風のインスト方法が書いてあった。
ページの中の    をEclipseのメニューバーへドロップしてみるといいらしい。
ただ、そのまま「実行」ボタンを押すと・・・
コマンド行の実行中に例外が発生しました。
Cannot run program “node” (in directory “C:\pleiades”): CreateProcess error=2, 指定されたファイルが見つかりません。
と出て終了してしまうダケ。(笑
Eclipse マーケットプレスで nodeclipse を検索すると・・・

  • Nodeclipse PhantonJS 0.12+
  • Nodeclipse CoffeeScript Viewer (Editor before Eclipse 4.3.1) 0.3.0
  • Nodeclipse Java 8 Nashorn JJS 0.12+
  • NodeclipseCLI Installer 0.17
  • Nodeclipse Git Addon 最終
  • Nodeclipse 1.0.2
  • Nodeclipse Vert.x 0.15.1
  • Nodeclipse EditBox – background colors themes to highlight code blocks for C++,Java,JavaScript,Python,Ruby and others 0.70.0
  • Nodeclipse/Enide Gradle for Eclipse 0.17
  • Nodeclipse/Enide Maven for Eclipse 0.17

・・・な感じにいっぱい出てきた。(大笑
インストール記事を見つけたNodeclipse 1.0.2をインストして「ノード」プロジェクトを作るとサンプルのJSファイル付きだった。「実行」させてみると、ポート3000を使ったサンプルをすぐ動かせる。ただ、期待していた「デバッグ」は、やり方が悪かったのかな???
コンソールに
(node:9736) [DEP0062] DeprecationWarning: `node –debug` and `node –debug-brk` are invalid. Please use `node –inspect` or `node –inspect-brk` instead.
暫くすると・・・
Failed to connect to Standalone V8 VM
connect timed out
で終了。
JDK9とnode-v9.3.0-x64.msiを入れたせいかもしれない。
JDK8とnode-v8.9.3-x64.msiの組み合わせにかえてみようか・・・



ややこしいインヘリタンス

プログラムを書くときに使う変数はざっくりとインスタンス変数とクラス変数に分かれるらしい。
安易なネーミングではあるが、インスタンス変数はクラスから作ったインスタンスにくっ付いているのでインスタンスが異なれば違う内容になるが、クラス変数はクラスにベッタリな変数で同じクラスならどのインスタンスでも同じ内容になるので、判りやすいネーミングである。
しかし、これで雰囲気をつかむと厄介なことが起こる。
(インスタンスに似ている)インヘリタンス(継承関係)にあるクラスのクラス変数だ。親のクラスでAを1としても派生したクラスでAを2にすれば、いつまでも親のクラスのAは1で派生したクラスのAは2とインスタンス変数の様な振る舞いをする。いやいや、それぞれのクラスにベッタリな変数だからクラス変数じゃないか!やっぱりしっくりくるネーミングだと思うかもしれない。しかし親のクラスのみに宣言されているBについては派生したクラスのBは親のクラスのBを参照することになり全面的にクラスにベッタリな変数ではないのだ。だから、うっかり派生したクラスでAを宣言しわすれた場合も親のクラスのAも2になってしまうのだ。それは「うっかりした奴が悪いダケ」と思うかもしれないが、自分がうっかりしたら「仕様が悪い」と怒り出す奴の思考形態でしかないのだ。現実で「知らない他人が後付けした派生したクラスがクラス変数Aを2と変更していた」場合はまず気が付かないので、public static final String などと書かないと安心できない。

  • たった一種類のクラスとたくさんのインスタンス(あるいはオブジェクト)。
  • たった一種類の親クラスとたくさんのインスタンスされたクラス。

現実のコードは、上記2行の組み合わせで出来ているので、非常に煩雑だ。
だから、インスタンス変数とクラス変数なんてことは、たった1つのインスタンスされたクラスの中の記述の事柄でしかなく、これによってどんな違いが起きるのかは予想できない。
無用な混乱を避けるため、インヘリタンス(継承)するクラスではクラス変数を宣言しなかったり親クラスと同じ変数名を使わないようにすると思うが、そんなことは一切キニシナイ人間は相当数居るよう(ソースの中にstatic int MAX=10などと・・・)で、1行でも短くしたいWEB上のサンプルのソースコーソを除けば、クラス変数専用のクラスを作ることが多い様だ。
この様に、とりあえずイメージをつかんでもらうには便利なインスタンス変数とクラス変数も、クラスの変数の色々な宣言の仕方を使い込んでくるとインヘリタンス(継承)の仕組みのごく一面を表現したジャーゴン( 仲間うちにだけ通じる特殊用語。 専門用語。)であることに気が付くだろう。
インヘリタンスを使い込むには、画面系のエディタを作るのが一番。ちょっとでも指定を誤れば画面に変な動きとしてミスにすぐ気が付くからだ。しかもお手軽にブラウザ上でJavaScriptのIDEIDE(開発環境)を使うよりも、Eclipseの様なを使う方がデバッグはしやすかったりする。
うまくいったら、ついでにUNDOやREDOも実装してみよう。2~3種類の機能を作り込むだけで、ガンガンとググってコピペしてコードをスクラッチするだけでは解決できないことがあるのだと気が付くはずだから。(笑
 
 
それにしても堅実的なソースコードは、うっかりミスなどの被害に堅牢に作ってある。それだけトラブルが絶えないという現実の傍証なのである。




top