ksino's diary

覚えたことを忘れないように、小さなことでも書いていく。

gogで買ったBloodRayneの画面アスペクト比を修正する

gog.comのセールでBloodRayneを買ったのですが、起動してみると画面アスペクト比がおかしい。。
ワイドスクリーンで適切な解像度が選択できませんでした。
調べてみると、定義ファイルを直接いじれば直せるようです。
C:\GOG Games\BloodRayne\system\rayne.iniを開き、gamePIXYとgamePIXXの値を自分の環境に合わせて修正しましょう。

JavaScriptをきちんと勉強しようと思ったのでメモ(随時更新)

なんとなく読み書きしてきたJavaScriptですが、最近はフロント側の仕事に携わることが多くなってきたので、きちんと勉強しておこうと思いました。勉強したことをメモっておきます。

勉強したこと

  • varを使わずに宣言した変数はグローバル変数になる
    • 変数宣言はとりあえずvarをつけておかないと危険
  • 等価比較(==)と同値比較(===)。等価比較は型が一致しなくても、同じ値とみなせればOK。同値比較は型も一致しないとNG。
  • return文が定義されていない関数はundefinedを返す。
  • newで呼び出された関数は、returnの有無に関わらず、Objectのインスタンスを返す。
  • オブジェクトは {key1:value1, key2:value2, method1:function() {〜}}のように生成できる。
  • 関数呼び出し時に引数チェックは実施されない。
  • for (var v in 配列、オブジェクト) {〜} とした場合、vには配列のインデックス番号やオブジェクトのキー名が入る。Javaの拡張for文とは異なるので注意。
  • for (var v of 配列) {〜} とした場合、vには値が入る。(for-inとは異なり、オブジェクトは使用不可)
  • オブジェクトはprototypeへの参照を持っている。よって、prototypeを使ってオブジェクトにメソッドを追加することができる。
  • 関数内でのthisはglobalオブジェクトを参照する。メソッド内でのthisはメソッドが属するオブジェクトを参照する。コンストラクタ内でのthisは生成したインスタンスを参照する。
  • call, applyメソッドは、引数で指定されたオブジェクトをthisとして関数を実行する。callとapplyの違いは引数の書き方のみ。(callは可変長引数、applyは配列)
  • [...iterable(配列や文字列), ...iterable]で、iterableなオブジェクトを連結できる。
  • (function(p1, p2) { 〜 })('foo', 'bar');のような書き方を即時関数という。
  • コンストラクタの実体は関数。
  • classブロックの中にconsructorという名前の関数を書くと、クラスのコンストラクタとなる。

UI Bootstrapで開閉パネルを実装する

index.html

<!doctype html>
<html ng-app="myApp">
<head>
<script src="angular.min.js"></script>
<script src="ui-bootstrap-tpls-1.3.3.min.js"></script>
<script src="scripts/collapse.js"></script>
<link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
	<div ng-controller="testctl">
		<input type="button" value="開閉パネル" ng-click="isCollapsed = !isCollapsed"></input>
		<div uib-collapse="isCollapsed">
			<p>こんにちは</p>
		</div>
	</div>
</body>
</html>

collapse.js

angular.module('myApp', ['ui.bootstrap']);
angular.module('myApp').controller('testctl', function($scope) {
  $scope.isCollapsed = false;
});

CDIビーンを動的に取得するコードの単体テスト

やりたいこと

CDIビーンを動的に取得するコードについて書きました。
ksino.hatenablog.com
で、Weldなどを使わずに当該コードの単体テストをやりたいです。

実装

CDI関連クラスのモックを作る

CDIProviderクラスのモック
package jp.gr.java_conf.ksino.weldtest.logic.mock;

import javax.enterprise.inject.spi.CDI;
import javax.enterprise.inject.spi.CDIProvider;

public class CDIProviderMock implements CDIProvider {
    @Override
    public CDI<Object> getCDI() {
        return new CDIMock();
    }
}
CDIクラスのモック
package jp.gr.java_conf.ksino.weldtest.logic.mock;

import java.lang.annotation.Annotation;
import java.util.Iterator;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.CDI;
import javax.enterprise.util.TypeLiteral;

public class CDIMock extends CDI<Object>{
    @Override
    public Instance select(Class type, Annotation... antns) {
        return new InstanceMock();
    }
// その他のメソッドは省略
Instanceクラスのモック
package jp.gr.java_conf.ksino.weldtest.logic.mock;

import java.lang.annotation.Annotation;
import java.util.Iterator;
import javax.enterprise.inject.Instance;
import javax.enterprise.util.TypeLiteral;
import jp.gr.java_conf.ksino.weldtest.cdibeans.Hero;
import jp.gr.java_conf.ksino.weldtest.cdibeans.Superman;

public class InstanceMock implements Instance<Hero> {
    @Override
    public Hero get() {
        return new Superman();
    }
// その他のメソッドは省略

テストコード

package jp.gr.java_conf.ksino.weldtest.logic;

import javax.enterprise.inject.spi.CDI;
import javax.enterprise.inject.spi.CDIProvider;
import jp.gr.java_conf.ksino.weldtest.logic.mock.CDIProviderMock;

public class LogicTest {
    @org.junit.Test
    public void testCall() {
        // CDIクラスにモックをセットする
        CDIProvider cdiProvider = new CDIProviderMock();
        CDI.setCDIProvider(cdiProvider);
        
        Logic logic = new Logic();
        logic.call();
    }
}

CDIビーンを動的に取得する

やりたいこと

CDIビーンを動的に取得したい。
動的という表現も微妙ですが、要は@Injectでなくプログラム的に取得したいということです。

実装コード

CDIビーン

インタフェース
package jp.gr.java_conf.ksino.weldtest.cdibeans;

public interface Hero {
    public void showName();
}
実装クラス
package jp.gr.java_conf.ksino.weldtest.cdibeans;

import jp.gr.java_conf.ksino.weldtest.annotation.SupermanQualifier;

@SupermanQualifier
public class Superman implements Hero {
    @Override
    public void showName() {
        System.out.println("スーパーマン");
    }
}

CDI限定子

package jp.gr.java_conf.ksino.weldtest.annotation;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Target;
import javax.inject.Qualifier;

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface SupermanQualifier {
    
}

CDI限定子(アノテーション)のインスタンスを取得するための実装クラス

これを作るのがミソです。後述するAPIを利用するために必要になります。

package jp.gr.java_conf.ksino.weldtest.annotation;

import javax.enterprise.util.AnnotationLiteral;

public class SupermanQualifierImpl 
    extends AnnotationLiteral<SupermanQualifier> {
}

CDIビーンを動的に取得

package jp.gr.java_conf.ksino.weldtest.logic;

import javax.enterprise.inject.Instance;
import javax.enterprise.inject.spi.CDI;
import jp.gr.java_conf.ksino.weldtest.annotation.SupermanQualifierImpl;
import jp.gr.java_conf.ksino.weldtest.cdibeans.Hero;

public class Logic {
    public void call() {
        CDI<Object> current = CDI.current();
        // ここでアノテーションのインスタンスが必要になる
        Instance<Hero> select =
            current.select(Hero.class, new SupermanQualifierImpl());
        Hero hero = select.get();
        hero.showName();
    }
}

実行コード

以下の記事と同じです。
ksino.hatenablog.com

Mockitoの使い方

やること

Mockitoの使い方を覚えたい。
ちょっとずつ書いていく。

テスト対象のコード

Car.java

package jp.gr.java_conf.ksino.mockito;

public class Car {

	private String team;
	
	private Engine engine;

	public Car() {
		super();
		engine = new Engine();
		engine.setManufacturer("ホンダ");
	}

	public String getTeam() {
		return team;
	}

	public void setTeam(String team) {
		this.team = team;
	}

	public Engine getEngine() {
		return engine;
	}

	public void setEngine(Engine engine) {
		this.engine = engine;
	}
}

Engine.java

package jp.gr.java_conf.ksino.mockito;

public class Engine {
	
	private String manufacturer;

	public String getManufacturer() {
		return manufacturer;
	}

	public void setManufacturer(String manufacturer) {
		this.manufacturer = manufacturer;
	}
}

テストコード

任意の値を返すようにする

package jp.gr.java_conf.ksino.mockito;

import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

public class CarTest {

	@Test
	public void test_01() {
		final String honda = "ホンダ";
		final String mercedes = "メルセデス";

		Car car = new Car();
		// 単にgetEngineするとホンダが返ってくる
		Assert.assertEquals(honda, car.getEngine().getManufacturer());
		
		car = Mockito.mock(Car.class);
		Engine engine = new Engine();
		engine.setManufacturer(mercedes);
		// getEngineしたとき、メルセデスが返るようにする
		Mockito.when(car.getEngine()).thenReturn(engine);
		Assert.assertEquals(mercedes, car.getEngine().getManufacturer());
	}
}