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という名前の関数を書くと、クラスのコンストラクタとなる。
参考文献
何となくJavaScriptを書いていた人が一歩先に進むための本
- 作者: 五十嵐肇,多良間斎
- 発売日: 2016/04/30
- メディア: Kindle版
- この商品を含むブログを見る
JavaScriptの理解を深めた人がさらにもう一歩先に進むための本
- 作者: 五十嵐肇,多良間斎
- 発売日: 2016/07/01
- メディア: Kindle版
- この商品を含むブログを見る
簡易HTTPサーバ
概要
ちょっとしたお試し用に使える簡易HTTPサーバがあります。
github.com
導入
$ sudo npm install -g http-server
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()); } }