daybreaksnow's diary

私を私と呼びたい

[GWT]Seleniumを同一プロジェクトで動かそうとして諦めた調査ログ

結論としては諦めてGWTSeleniumを別プロジェクトにしてテストを書いた。
[GWT]Seleniumで非同期処理のテストを行う - daybreaksnow's diary


GWT(2.4)のプロジェクトに最新のSelenium(selenium-java-2.35.0.jar、selenium-server-standalone-2.35.0.jar)のビルドパスを通し、FireFoxDriverをnewした際のエラー

java.lang.NoSuchMethodError: org.apache.http.conn.scheme.Scheme.(Ljava/lang/String;ILorg/apache/http/conn/scheme/SchemeSocketFactory;)V
	at org.openqa.selenium.remote.internal.HttpClientFactory.getClientConnectionManager(HttpClientFactory.java:59)
	at org.openqa.selenium.remote.internal.HttpClientFactory.(HttpClientFactory.java:48)
	at org.openqa.selenium.remote.HttpCommandExecutor.(HttpCommandExecutor.java:100)
	at org.openqa.selenium.remote.HttpCommandExecutor.(HttpCommandExecutor.java:81)
	at org.openqa.selenium.firefox.internal.NewProfileExtensionConnection.start(NewProfileExtensionConnection.java:81)
	at org.openqa.selenium.firefox.FirefoxDriver.startClient(FirefoxDriver.java:251)
	at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:110)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:197)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:190)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:186)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:99)
	at com.google.gwt.sample.stockwatcher.client.SeleniumTest.setUp(fSeleniumTest.java:44)
	at junit.framework.TestCase.runBare(TestCase.java:128)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:120)
	at junit.framework.TestSuite.runTest(TestSuite.java:230)
	at junit.framework.TestSuite.run(TestSuite.java:225)
	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

これはgwt-dev.jarとSelenium-serverでSchemeクラスが競合していることが原因。
参考URL:java - NoSuchMethodError: org.apache.http.conn.scheme.Scheme.<init>(Ljava/lang/String;ILorg/apache/http/conn/scheme/SchemeSocketFactory;)V - Stack Overflow

それぞれのjar内のhttpclientのversion.propertiesを見ると、以下のように異なっている。

gwt-dev(GWT2.4) : 4.0.1
selenium-server-2.35.0 : 4.2.1

対策としては、mavenを使ってpomでバージョンを指定すればよいらしい(直感的にはできなそうだが…)。
参考URL:java - gwt-dev includes httpclient 4.0 how do I get around that in a maven env? - Stack Overflow

しかし、今のプロジェクトはantを使ってビルド管理をしているので、ここでテストのためだけにmavenを使うと面倒。
GWT2.4と同じhttpclientのバージョンのselenium-serverがないか探した。


seleniumリポジトリをgit cloneで落としてきて、以下のディレクトリでログを確認

cd selenium\third_party\java\apache-httpclient
git log .


以下のコミットログが見つかった。

commit 0a2e1e24c81946bca51e13314409eaa2bcbab31f
Author: Paul Hammant 
Date:   Thu Sep 30 22:17:05 2010 +0000

    upgrade to 4.0.2 HttpClient from Apache, throughout this time

    r9779

diffを確認

 git diff  "0a2e1e24c81"^^...0a2e1e24c81 .

このリビジョンより前なら4.0.1であることを確認

 -"httpclient-4.0.1.jar",
 +"httpclient-4.0.2.jar",

以下から2010/9/30以前のリリースを探した

https://code.google.com/p/selenium/downloads/list?can=4&q=selenium-server&colspec=Filename%20Summary%20Uploaded%20ReleaseDate%20Size%20DownloadCount&num=100&start=100

結果、2010/Julリリースのselenium-server-2.0a5.zipがあった。
しかし、これはさすがに古すぎるように思えるので、このSeleniumを使うのはあきらめた。

次に、Selenium-clientだけ入れて、httpclient.jarだけ差し替えてみた。
→RedirectStrategyというHttpClient4.1以降のクラスが使われているためダメだった。

java.lang.NoClassDefFoundError: org/apache/http/client/RedirectStrategy
	at org.openqa.selenium.remote.HttpCommandExecutor.(HttpCommandExecutor.java:100)
	at org.openqa.selenium.remote.HttpCommandExecutor.(HttpCommandExecutor.java:81)
	at org.openqa.selenium.firefox.internal.NewProfileExtensionConnection.start(NewProfileExtensionConnection.java:81)
	at org.openqa.selenium.firefox.FirefoxDriver.startClient(FirefoxDriver.java:251)
	at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:110)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:197)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:190)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:186)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:99)
	at com.google.gwt.sample.stockwatcher.client.SeleniumTest3.setUp(SeleniumTest3.java:37)
	at junit.framework.TestCase.runBare(TestCase.java:128)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:120)
	at junit.framework.TestSuite.runTest(TestSuite.java:230)
	at junit.framework.TestSuite.run(TestSuite.java:225)
	at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.RedirectStrategy
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 23 more

ここで知人にどうにからない?と尋ねたところGWTSeleniumを別VMで動かすしかないんじゃ?と言われたので、同じプロジェクトに入れるのを断念した。

[GWT]RPCの自動テスト

公式
基本:http://www.gwtproject.org/doc/latest/tutorial/JUnit.html
非同期:http://www.gwtproject.org/doc/latest/DevGuideTesting.html#DevGuideAsynchronousTesting

シンプルなテスト

testパッケージにクラスを作って、GWTTestCaseを継承してgetModuleNameでgwt.xmlのパスを指定すればOK。

サンプルコード

public class StockWatcherTest extends GWTTestCase {

	@Override
	public String getModuleName() {
		//gwt.xmlの名前と合わせる
		return "com.google.gwt.sample.stockwatcher.StockWatcher";
	}

	public void testSimple(){
		assertTrue(true);
	}
}

典型的なエラー

モジュール名のタイプミス

getModuleNameで返す名前がgwt.xmlの配置、名前と一致していない場合。

Development Modeの出力

com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries)
	at com.google.gwt.dev.cfg.ModuleDefLoader.nestedLoad(ModuleDefLoader.java:278)
	...
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

コンソールへの出力

   [ERROR] Unable to find 'com/google/gwt/sample/stockwatcher/StockWather.gwt.xml' on your classpath; could be a typo, or maybe you forgot to include a classpath entry for source?
Exception in thread "UnitCacheLoader" java.lang.RuntimeException: Unable to read from byte cache

パッケージの誤り

gwt.xmlでsource指定されていないパッケージにテストクラスがある場合に発生
デフォルトではclient,shareが指定されていたので、テストクラスをclientパッケージに入れた。

Development Modeの出力

com.google.gwt.junit.JUnitFatalLaunchException: The test class 'com.google.gwt.sample.stockwatcher.StockWatcherTest' was not found in module 'com.google.gwt.sample.stockwatcher.StockWatcher'; no compilation unit for that type was seen
	at com.google.gwt.junit.JUnitShell.checkTestClassInCurrentModule(JUnitShell.java:743)
	...
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

JUnit4を指定した場合。

クラスパスにJUnit3を指定したら動作した。
GWTTestCaseはJUnit4に対応していない?

Development Modeの出力

com.google.gwt.junit.JUnitFatalLaunchException: The test class 'com.google.gwt.sample.stockwatcher.client.StockWatcherTest' had compile errors; check log for details
	at com.google.gwt.junit.JUnitShell.checkTestClassInCurrentModule(JUnitShell.java:743)
	...
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

RPCのテスト

非同期実行の戻りを待つために、GWTTestCaseのdelayTestFinish、finishTestを使う。

サンプルコード

public void testServlet(){
	final GreetingServiceAsync greetingService = GWT
			.create(GreetingService.class);
	//60秒まではレスポンスを待つ(ブレークを張ってもよいように)
	delayTestFinish(60 * 1000);
	//NOTE:RequestURI=/com.google.gwt.sample.stockwatcher.StockWatcher.JUnit/greet
	greetingService.greetServer("hoge",
			new AsyncCallback<String>() {
		public void onFailure(Throwable caught) {
			fail();
		}
		public void onSuccess(String result) {
			//テスト終了を通知。本来はここでassertしてから呼ぶ
			finishTest();
		}
	});
}

また、RPCのテストを行う場合は、gwt.xmlに以下のようにマッピングを書く必要がある。
(ここがめちゃくちゃはまった)

<servlet path="/greet" class="com.google.gwt.sample.stockwatcher.server.GreetingServiceImpl" />

参考:対応するweb.xml(デフォルトで作成されたもの)

<servlet>
    <servlet-name>greetServlet</servlet-name>
    <servlet-class>com.google.gwt.sample.stockwatcher.server.GreetingServiceImpl</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>greetServlet</servlet-name>
    <url-pattern>/stockwatcher/greet</url-pattern>
  </servlet-mapping>

マッピングが書かれていないと、RPCコール時に以下のレスポンスがonFailureに渡ってくる。

[WARN] 404 - POST /com.google.gwt.sample.stockwatcher.StockWatcher.JUnit/greet (xxx.yy.zzz.fff) 1445 bytes

[GWT]環境構築とサンプル

1.Eclispeのダウンロード

GWTプラグインが3.7までしかサポートしていないので、3.7.2を落とした。
http://archive.eclipse.org/eclipse/downloads/drops/R-3.7.2-201202080800/index.php#EclipseSDK

ついでにEGitプラグインもインストール。
なお、デフォルトで設定されているEGgitの更新サイトだと、3.7にインストールできなかったため、
3.7用のサイトを設定した。
http://wiki.eclipse.org/EGit/FAQ#Where_can_I_find_older_releases_of_EGit.3Fhttp://download.eclipse.org/egit/updates-1.3/

2.GWT SDKをダウンロード

最新は2.5.1だが、既存のアプリで2.4.0を使っていたのでgwt-2.4.0.zipを落とした。
http://www.gwtproject.org/versions.html

なお、Eclipseプラグインと一緒にインストールもできる。

3.GWTプラグインのインストール

http://dl.google.com/eclipse/plugin/3.7

GAEへのデプロイはまだ考えてないので、ローカルで動かすための最小構成で。
f:id:daybreaksnow:20131015181606p:plain

GWT SDKのインストールを選択しなくても、すでに入れてあったSDKのパスを自動的に設定してくれていた。

4.サンプルプロジェクトの作成

新規→Google→Web Application Project

サンプルコード生成のチェックをONにして作成。

5.開発モードでの実行

Run as→Web Application
Develop Modeタブが開くので、そのアドレスにアクセスすればOK.
例:http://127.0.0.1:8888/StockWatcher.html?gwt.codesvr=127.0.0.1:9997

開発モードではデバッガでJavaコードを終えるが、本番モード(JavaScript)と挙動が若干異なる場合がある。

6.本番モードでの実行

プロジェクトを右クリック→GoogleGWT Compile→Compile
コンパイルが成功したら、アプリを起動し、開発モードのクエリ文字列以下を削ったアドレスにアクセスすればOK。
例:http://127.0.0.1:8888/StockWatcher.html

なお、本番モードかどうかについては、GWT.isProdMode()メソッドを利用することで判定できる。

7.Eclipse外のサーブレットコンテナでの実行

コンパイル後はプロジェクト内にwarディレクトリが作成されている。
これをtomcatのwebappに入れるなどすれば、そのまま動作する。

8.コンパイル時の設定

コンパイル時のoutputLevelは出力されるJavaScriptの難読化レベルの指定。
Obfuscatedが一番難読化されており、本番環境ではこれを使うべき。

ObfuscatedにしたJavaScriptJavaコードの対応を知るためには、マッピングファイルを見る。
以下のディレクトリに各ブラウザ毎にメソッド名のマッピングが載っている。
war\WEB-INF\deploy\gwtsample\symbolMaps

TODO コンパイル時のLogLevelの設定がどこに影響するか、Log4j等と組み合わせた場合どうなるかは後で調べる。

非同期更新を行うアプリを作成するチュートリアル。

公式:http://www.gwtproject.org/doc/latest/tutorial/gettingstarted.html
日本語訳を行っているブログ:http://blog.kcg.ne.jp/blog/leeway/10143

マチアソビvol.11 二日目

あんまりまとめてない。

朝食に徳島バーガーを食べたあと、10時前にロープウェーへ。
ロープウェーは一時間待ち。バスは10時発で80人くらい待ちでだったので、バスの方が若干早いかも、という状態。

ポストカードが一日目とは違うのがもらえたので、ロープウェーを選択。
一緒に乗ってたJCがやばいたかいこわい、超大型巨人よりも高いわーなどど終始騒いでいて結果的に正解だった。


・マジェスティックプリンス
昨日食べた阿波尾鶏の店にあさぽんにそっくりの店員さんが居た。
中村さんに見せたらそっくりーって言ってた。
あさぽんにもメールで送ったら喜んでいた。

激しい直射日光。ジーンズが暑い。マフラータオルがなければやられていた。

・らっきょ。
アイドルマスター黒桐幹也役の鈴村健一です。

しいたけざむらいがオススメ。嫌いな食べ物も美味しいものを食べると好きになる。

鈴村さんの世界観、コクトーの大事なところは中庸。
演じるにあたり、例えばオカマ役だったら外しちゃいけない共通点がある。中庸は…
他の異常な人な多い中で、その人達と付き合っていけるのがミキヤ。
色んなことに首突っ込むけど、自分なりに対応していく。
キャラクターを再現するために、経験を使って体の全ての筋肉をその状況に合わせる? #あんまり覚えてないがプロっぽかった

アニメは小説をそぎ落としてく作業だけど、未来福音は無駄がなかった。1章とほんとに同じひとが書いてるのかと。
1章は本当に読みづらい。奈須さんにそう話したらそう書いてあるから正解と言われた。

最終話から見るのでも行けます。先に結末がわかってると、例えば誰かスピンオフで死ぬってわかってたりすると、1話の一言一言が重かったりするじゃないですか。そんな感じ。らっきょはそういう話じゃないですけど。
最終話はミキヤがお茶飲んでるだけ。お茶飲んでるだけでたらせるようになった。そんな能力が身についた。
最終話のヒロインは鈴村さんの嫁だが、家で一緒に練習したりはしない。役者としてスタジオに入ってる。


アイマスイベ前。
らっきょ終わって半分くらい進んだ。鈴村さん目当ての女性が多かったのではと思われる。
緑のフェンスは弱いので体重をかけないように、アイドルを扱うようにしてください、とのアナウンス

詳細:http://www.famitsu.com/news/201310/14041644.html
ぬーが司会

えりこ:一人だけ紙持ってる初徳島のぬーが司会で。

ぬー:はいこれ、って渡されたけどそういうことだったんですか…

司会が決まった後途端に水飲みにステージから消えるえりこ、神のところに寄っていくミンゴス
ぬー:ちょっとー!

徳島の楽しい思い出を作ろうと思ったのに…と進行をするぬー。

#どこで言ってたか忘れた
ミンゴス:秋は皆勤賞だけど、今まで2回大雨で…
えりこなにか言う
ミンゴス:私は天候を操れるようになったの
神:何厨二病な話してるの?

3つのテーマ、マチアソビについて、8thについて、劇場版についてでトーク

徳島の食べ物。
えりこ:屋台の徳島ラーメンがほしい。ぬー買いにってよ。
ぬー:え、ほんとにいいんですか?
ぬーが本当に買いにいこうとして、神に止められる。
えりこ:後でブンケイさんが買ってくれるよ


えりこ:なんとかうどんが有名だって聞いた。
神:やくにたたねー
観客に聞く。たらいうどん。

えりこ:銀色のたらいなのかな
神:えりこの頭の上にたらいがあるかもね。→上を見る三人

8thについて
愛ライクハンバーガー改、シンクロシニティー、LLサイズとレベルアップしていった。
まやこのジャンプのところはみんなガン見してた。
えりこはディレ1に話しかけられて見れなかかった。
神はそこ撮るな、って感じで、完全に動いてなかった。当時の振り付きでその止まってるところを再現

劇場版のPVは幕張の直前にできて、みんなで見てた。
劇場版のいおりんのすけすけはみんなキャーって歓声をあげた
ミ:次の真が出た時は約二名、黄緑の人と、ミリオンのセンターの人ですね 。

ダズリングワールドについてはオーディオコメンタリーで。
ミ:え、コメンタリーつくの?
神:今私が言ったので付きます。

えりこ?:出なかったらまやこに飛んでもらおうぜー
神:あんたら職権乱用しすぎ!

ぬーの福岡のライブでは一時間半空いてた
ミンゴス:ぬーはるるといちゃいちゃしてた
ぬー:るるはそんなんじゃない、るるとの関係は…ペット。今着てる服みたいにかぶさってくる感じ。
ミンゴス:毛皮か!

ライブパート
START、ビジョナリー、青い鳥、魔法をかけて。
魔法をかけてに合わせて、神はVo衣装っぽいピンクの服と三つ編みだった。振りはゲーム版コピ。


地上へのロープウェーは50分待ち。
あわおどり会館5階のグルメハント対象の店でうずしおそば食べる。

TODO 写真、ポストカード

15時前に東公園着。
マウスブースでゆきんこが出てるDVDを買う。パラソルショップが五時にしまると認識していたので念のため。

TODO 写真。DVDは特典んが2種類、コント風のと食べるのと選べた。食べるのを選択。


15時ちょいすぎにバサライベが終わり。半分くらい入れ替わったので座れた。

15:00~15:30 再びm.s.c
今回はボーカルなし。
2曲目がフライ・ミー・トゥ・ザ・ムーンのカバー。
3曲目で鍵盤ハーモニカを取り出し、高速道路のイメージで。



15:30~16:30 神ないラジオ(飯屋)。
まさかのミンゴスキタエリゲスト。
↓にだいたい全部載ってる。
http://www.famitsu.com/news/201310/14041646.html

めちゃくちゃ番宣が多かった。詳しくはブースのBDを!
飯屋:これ言っとけばいいって番長(ラジオスタッフ。おしゃれ番長の略。)が言ってた。

飯屋が台本読んでる途中ミンゴスとキタエリがこそこそ話してるのが眼福。

飯屋:今回は神ないラジオのステージですが、公録でありません
ミンゴス:えっ!?私完全に外向けの挨拶だった。

キタエリ:OPの人キタエリでーす。
事あるごとにOPサビのところを歌ってた。4,5回くらい。
ミンゴス:(キタエリに対し)撮ってたらいきなり歌い出さなかったでしょ。


ミンゴスは弓道をやっていたので左手の握力が58くらいある。右手は28くらい。

ミンゴスキタエリは何度もご飯を要求。
即座に立ち上がりスタッフに買ってきて!と要求する飯屋はなかなか切れ者な感じ。

はらはらー、さゆさゆーとミンゴスに振られてもすぐに乗っていた。


飯屋:とくしまにきてとくしたねー→拍手→徳島あったかい!
その後も何度かダジャレを。

加隈さんが略すとミンゴスになるような文章を。みんなですごすみたいな。
ミンゴス:台本見ずにいえて、すごいねー

飯屋、加隈さん、ミンゴスの三人で盛り上がってることについて
キタエリ:あたしどこではいればいいのかわかんなくなっちゃった


アニメ注目シーンについて
ミンゴス:おっふろー、おっふろー
シリアスなのに急に肌色が多くなってびっくりした。

好きな男性キャラについて。
キタエリ:やっぱりアリスかな。
ミンゴス:最初は内山くん?で釣ってるところはあったけど私もアリス
詳しくはBDで。





夕飯はマジェプリのイベントで言っていたあさぽん似の店員の店に入ったが、当人は居ないようだった。
名前出すと迷惑だと思うので、場所だけメモ。
徳島駅の東側、徳島バーガーがあった店の通り。

次回の抱負
・たらいうどんとフィッシュカツ食べる
・前日入りして整理券ゲットする
・写真とる用のみにっちゅ持ってく
・石畳座る用のクッションが欲しい。
・日焼け止めがあるといい
・夕飯は予約しといたほうがいい

マチアソビvol.11 一日目

始発で8:40徳島空港着の飛行機へ。

アイマスの垂れ幕があるとの情報があったが見つからず。
駅前行きのバスが9時発で時間に余裕はあったが、万が一と乗り遅れたらヤバい早々にバスに乗り込んでしまった。
空港内のコンビニ前にスタンプシートがあったのだがスルーしてた。

徳島駅には予定通り30分ほどで到着。開会式が行われる眉山山頂へ向かう。
駅から山頂へのロープウェーがある阿波おどり会館へは10分弱程度、ロープウェーは50分待ち。
駅着が9:30、開会式が10:00~11:00なので後半しか見れなくなっていたが、他に見るものもないためのりこめー。

ロープウェーの往復券を買うと、つきねこのサイン色紙をゲットできた。

TODO 写真

開会式は終わりの方だけ。参加者同士でグループを作って、一緒に見て回ってもらおう、という主旨のコーナーをやっているようだった。
徳島出身、10月生まれ、などと条件をつけて絞り込んでいったようで、ミンゴスが女の子いるじゃん!と黄色い声を上げてるのが聞こえた。

開会式後、屋台の徳島ラーメン食べて再びロープウェーに下山。

TODO 写真

ロープウェーのアナウンス。
TODO リンク。

イベントが行われる東公園ステージへ向かい、パラソルショップをざっと眺めたあと、12時ちょうどくらいから東公園ステージでシンデレラガールズ待機。

12:00~12:30 アルペジオのトークショー

印象に残ってる話。

・スケジュールに余裕があって、1話の時にはアニメが出来てる状態でアフレコしてて、逆にコンテの指示がなくて大変だった。喋ってる口が見えないところとか。

・イオナはクールなイメージだったが、渕上さんの「きゅーそくせんこー」という台詞がかわいくて、制作陣全員がざわついた。これによってその後のキャラ付けが少し変わることになった。

・単語の切れ目がむずかしい。ナノマテリアルをナノマテ、リアルで言っちゃって直らないなど。なんとか連想砲とか何個あるのかよくわからない。

・戦車で指揮を出す役(ガルパン西住みほ)をやっていたので、自分で発射ーとか言えないのが…

・ニコ生やったらトライデント不仲説が。戦艦を書いたらオカリナに見える、めっちゃ下手くそじゃんって言われた

12:30~13:00チャリティーオークション

ufotableの偉い人?とご当地ヒーロー。ufotableの人は去年見てたからわかりますよね?っとざっくり頼まれたとのこと。

JALのCAさんや、ディスガイアプリニーきぐるみとフーカ?コスの人などをゲストに迎え、終始のどかな感じ。


ご当地ヒーローの人が僕(商品)全然見えないんで!とか入ったり、JALの人に説明を頼んでおしとやかだ!とディスガイア風でお願いします!とかいいノリだった。軽いけど不快じゃない感じ。

出品されたもの。
・セイバーのポスター
サモンナイトのマット2種類サイン付き
・サザエさんのドロップ他3点セット(900円くらい。ディスガイア勢が魔界的な値段を!とやっていた)
・デュラララのコスプレ衣装(定価9000円くらいだが数千円で落札)
アルペジオのサイン入りポスター
・はいたい七葉のキャスト12人のサイン入り台本4冊(5万か6万で落札。もうこれ以上煽れないです…と司会が言うほど。)

はいたい七葉はゆきんことれいちゃまが出てるので欲しかったがさすがにそこまでは出せない…

13:00~13:30 BASARA&ガイストクラッシャー

BASARAの監督っぽい人とガイストの声優。

ガイストは味方が若手声優で、敵が大物声優で、現場では若手が緊張してた。
オペレーターに雨宮天さんが居るのでアイマス好きはどうぞとのこと。

13:30~14:00 ACRYLICSTAB ライブ

アイマス冬フェスでキーボードをやってたはらみー似の人のバンド。

14:00~15:00 シンデレラステージ

http://www.famitsu.com/news/201310/13041631.html

はっしーとるるきゃんから登場。るるきゃんはいつも通りのふんわりした服装。

はっしーにマチアソビ先輩の五十嵐さん、と振られるも
ゆきんこ 何の話だか全然わかんなかった。はっしーの先輩が来てるのかな、ホリプロすごいなって思ってた

マジカルリプライ
Jewelries収録の思い出を

パッションでゆきんこ:かわいく、ってディレ1に何度も言われて、それ杏じゃなくないって。
はっしー、るるきゃんもかわいくってよく言われる。
ルルのくしゃみの所は自分でも制御できなくて何度も取った。これ違う、ってなって恥ずかしかった。CDに入ってるのはオーディションを勝ち抜いたくしゃみ。

れいちゃま:CDは一番最初に収録した。トロトロトロピカルーのところを遊びを入れたら採用された。
飯屋:きらりが先にOrange Sapphireをとって、あいらぶゆーのところがきらり長くて何度もリテイクした。でもそのあとのともよちゃんは何も言われなかったって。もうこれだめだって諦めたんだと思う。

るるきゃん:ハモリ…ハモリってなに?早見沙織さんのカバー曲を一番先に聞いた

はっしー:収録中にノイズが入ってて、お化けがいる!と怖かった。


ススメオトメバッションパージョンを流す。パッション組は各自が歌ってる箇所をアピール。れいちゃまは実際に歌ってたかも?

マジカルレッスン
モノマネオーディション。ゲストでディレ1登場。
飯屋がフェイフェイダヨーを連呼。それ以外ないの?と言われ、プロデューサーに料理作るヨーも。
勝った人はディレ1のポケットマネーでなにかくれる→ゆきんこ?:イタリアツアー。あのツアーをリアルで。→ディレ1:イタリア的なもので。
負けた人はメイドで。
飯屋:安倍か。

・きらり
飯屋→めっちゃにてる
るる→きらりではない。れいちゃまが冷たい目をしてたようだ。
ディレ1:アクセントは分かるんだけど声が出ないですね。→ゆきんこ:かわいく!
ディレ1:おにゃーしゃー、無理ですね

拍手の数で競った結果勝者はディレ1に。

・島村さん
ゆきんこ→かわいい。しかし島村さんでは確実にない
れいちゃま→声は似てる、しかし台詞が神宮球場に行きたいです! ディレ1から苦言を呈されるも、台詞は自由に考えていいっていいましたよね?と反論
るる→誰だこれ。

・杏
はっしー→ただのはっしーだ
ゆきんこ:収録してるときのはっしーみたい。ぶりっこしてる感じ
はっしー:それじゃわたし仕事してないみたいじゃないですかー

飯屋:めっちゃ似てる
ゆきんこ:新しいカエダマだー。お給料はマウスプロモーションに振り込んでおいてね。

ゆきんこ:未央ちゃんはさー、いろんなアイドルのモノマネしてるけどなにをやりたいの?私ときらりはアイデンティティーがあるけどさー。(ここでれいちゃまとくっつく。キマシタワー)
そんなんじゃ、茜ちゃんに取られちゃうよ?
飯屋:茜ちゃんトの対決はバッションアンソロのドラマCDで!

ディレ1がやらなかった役の分のイラストを全部持ってるので僕がイタリア的なものということで。
れいちゃま:やっぱり弄ばれてた…!

罰ゲーム:メイドで
飯屋:ウサミンの真似。ウサウサウサミン♪
はっしーとるるきゃんは二人で。せーので台詞をいうが合わない。

お願いシンデレラライブ。
クールがいないのでクールパートはれいちゃま。

おねシンを聞くのは3度目なので、コールより主に振りを見てた。
指を右回り、左回りとするとこ好きなので早く8thBDが見たい。

各自のコメント。
れいちゃまはクールパートなのでカラフルじゃない服にした。
もうすぐ二周年でいろいろ企画があります、ということをディレ1、はっしー、ゆきんこと何回も言っていたので、これはシンデレラオンリーイベント期待できるのでは。

15:00~15:30 うもれてたまるか公録

早口言葉とクイズ。
会場のみなさんはどんな服で寝てますか→全裸、全裸、紳士スタイル、という公録なのにそれでいいのかという回答。
紳士スタイル、なにそれ全然伝わってこない!と言われてた。

15:30~16:00 はっしーころあず

http://www.famitsu.com/news/201310/14041648.html
DJっぽい司会の人、はっしー、ころあずの三人。
ころあず→はっしーの呼称がちきちゃんというのを初めて聞いた。
はっしー→ころあずの呼称はあずささん、あずさちゃん。

・好きなアニメ
二人ともあんまり合わない。最近のだと進撃、黒子、freeが両方見てる
司会者:あっ、察し

・やりたい仕事
ころあず:男の子
司会 ずっとやりたいって言ってたもんね。男の子?男の人?
ころあず えっ?…男の子です

はっしー あずさちゃんのショタ聞きたい
台詞?えーと、時間がない
お姉ちゃん、ホントにダメなんだから

はっしー 剣士をやりたい
司会者 どんな剣?
はっしー、両手を広げるポーズ
司会者 双剣! (よくこれで双剣と分かったなという印象)
はっしーはモンハンでも双剣使い。

ころあず はっしーにさげずんでもらいたい。一番蔑んだような言葉ってなんですか?→会場:ひざまづいて

はっしー そこのお前、私にひざまづきなさい! ♯もうちょい長かった

・ブログタイトルについて
は 高校の友達に付けてもらって。声が大きくてすみませんって謝っとけばいいんじゃない?て

こ 不安でしょうがない。事務所の先輩とかにも言われて。
は 今日飛行機が飛ぶときもうるさかった。手をぎゅっと握ってきた。到着の時は寝たフリしてた。
こ なんでー!?寝てる人の手握るなんて変態ぽい、って思ってたのに。

ミニライブ
ころあずのかっこいい系の曲。星霜のアマゾネス(聖槍かと思ってた)
はっしーの新曲
アイカツの曲を二人で。

17:30~18:30 ミンゴスはらみーライブ

山頂のミンゴスはらみーライブへ。
つきねこのトークを聞きたかったのでバスを利用。
バスは待ちなしだった。ミン族はシンデレラ後にはすでに登ってたのではないかと思われる。

バスの行きは眉山の由来について。つきねこの曲(リフレイン)とREADY、キタエリの偽物語の曲?ともう一種類が流れていた。

直前のイベントではピングドラムの話をしていた。
監督?がおっぱいマウスパッドを作りたいから胸の大きいキャラが欲しかった
イラストの人:そういうふうに入ってなかった。作劇的に一人か二人欲しいって高尚な言い方してきて、そんな理由でりんごちゃんの胸を大きくするのか、と強く反論した。


・トーク
ミンゴスiPhoneを飛行機に忘れた。電源消したよ、ってアピールしたあと荷物に入れたつもりがかごだった
はらみーはお金の入ったメインバッグを空港に忘れた。
水を入れたサブバッグは持ってた。

山頂は午後六時でかなり真っ暗。
一曲ごとに水をのむはらみー。お水は大切ですから。みなさんも飲んでください。

左スピーカーのあたりでスクリーンを見る。

キタエリライブはスルーして、帰りのバスへ。十数分程度の待ち。
トークは疲れて覚えてない。

[Z/X]ルクスリア杯

5勝1敗で負けが5戦目だったので多分3位くらい。

レシピ
プレイヤー
綾瀬

スタート
魂のアム1

IG
空のシエル4
星のエトワール4
放浪のエレ2
力のピュイサンス1
純粋のピュール4
運命のデスティネ3
渇望2

掟のレーグル4
創造のクレアシオン4
四足の勝利者ズィーガー1

機知のエスプリ4
勇壮なクラージュ1

閃光のエクレール3
函の魔人フェレス2

デスティニーベイン3

パニッシュメントクロス4
戸惑いの少女アリス3
1戦目

アサギ&花蘇芳デュエル。
こちら先攻。相手初期リソがデュエル2枚という事故かつ相手が5コス以上を全然引けず、こちらがエクレールとベインを引きまくったので、地力で勝ち。

2戦目

アサギ。4ターンで終わったのでよくわからん。
こちら後攻。
1ターン目 相手:ドローゴー 此方:バニラでPSアサギ殴って通る
2ターン目 相手:PSロザリー 此方:デスティネでアサギ消費させつつPS割る
3ターン目 相手:IG恩返しから7000アサギで此方PS横からパンチ、スタート割られる 此方:自分PS空けたまま3+2でPS2パン
4ターン目 相手:IG1湧きと恩返しで中央バウンス、残ってたアサギとIGで2ダメくらい、2ダメ目でシエル捲れる。中央に置くと相手はPSに置いて割ってくるだろと思い、強気に相手PS横に置く。相手9000ロザリーでパンチ後PS移動 此方:中央エクレールでパンチ、残ってた2パンでIGめくれなかったので勝ち。

結果的に勝ったが2ダメ食らった時のシエルはPSか中央に置くべきだった。相手のライフにIGが一枚でもあれば負けだった。

3戦目

トーチャーズ。
こちら先攻、手札が3バニラ、アリス、エクレール、ベイン。
ベイン置けばどうにか殴れるかなと思ったら相手の返しがチクチクするキュートで割れない。
運良く2ターン目にIG成功してキュート割れて、その後も相手IGが成功せず6ターン目くらいに殴り勝ち。

4戦目

仮面罵倒会。此方のIGとライフが強かったので勝てたが、デッキパワーでは負けてた。
入ってたカードはサエウムとメモリアセット、ルリジッサとルリジッサ互換アサギが合計7枚、エクスターミネーションフロウ、ドゥームブラスト、天上楼閣、デッドエンドダーツなど。
先攻でかつ毎ターンIG成功してたので7ターン目くらいには相手のライフを1にできたが、その後2連続で仮面罵倒会を決められハンドが枯渇。ハンデスが怖いので自分PS捨ててバルバトス殴り続け、最後通ったらリフレッシュペナルティで死ぬというところでライフリカバリーして返して勝てた。

5戦目

赤青バーンロック。プレイヤーカードはあずみ。
ドラゴニックキャノン、ドラゴニックフレアなどで耐え、1コス2000バーンの孫尚香、エメラルドスタッグをPSに置いて守った後、アテナ、アクターレ、石田三成を出して相手をロックするデッキ。
大型はソードリベレイターしか入っていないような感じだった。
公式のレシピ:http://www.hbst.net/shop/minamikosigaya/blog.html

相手先攻で赤なので日和ってベイン握ってアリスをリソに埋めた結果、2ターン目何も出せなかったというプレイングの弱さが痛かった。
PS孫尚香に立ってからまったく手も足もでなく、Z/Xでこんなロックされるとは思ってもいなく、貴重な体験だった。

6戦目

ベイン、フロン、IG百騎兵16枚。
IG百騎兵2湧きからの8000パンチが強かった。
お互いベインで殴り合い、最後はライフ1山札1から2パンで相手PSベインを落とし、渇望で自分3コス除去して止め。今日初めて渇望が役に立った。

所感

結果的にはベインが必要となる場面がほとんどなく、フロンだったら殴り勝てるのに、という画面が多く、メタゲームに失敗した感じ。(ベインに強いフロンに対抗する為速攻が増えるかなと思っていた)
オロチに一回も当たらなかったのでフェレスもそこまで活躍しなかった。

ドローゴーする相手だと考える余地が多く楽しいので、4,5戦目のように遅めのデッキが環境に増えるといいと思う。

[Scala]入門 カリー化他

以下の連載の10回目読んだ。9回目のスレッドは浅く見てもよく分からなかったのであとで。
http://www.atmarkit.co.jp/ait/kw/scala.html

名前付き引数

その名の通り、引数指定時に変数名を表記できる。引数の順番も変えられる。
かゆいところに手が届く機能だと感じる。

def div(x:Int,y:Int) = x/y
val d = div(y = 5,x = 10)

エンティティのコピー

case classにするとディープコピーを行うcopyメソッドを定義してくれる
copyの引数にはコンストラクタ引数を指定できる。何も指定しなければコピー元の値がそのまま使われる
ここで名前付き引数を使うと便利?

case class X(name:String){
  var y:Y = new Y(name + "Y")
}
class Y(var name:String)

val x = X("hoge")
val x2 = x.copy()
x.y.name = "fuga"
println(x.y.name)
println(x2.y.name) //ディープコピーされているのでhogeY

引数リスト

(a:Int,b:Int)をdef (a:Int)(b:Int)と書ける。
呼び出しもhoge(1)(2)と別々の括弧になる。
関数を渡す時は引数リストを使うとみやすくなる?
使いどころは後述するカリー化の時?

//関数定義
 def myLoop(c:Int, func : => Unit) = {
  for (i <- 1 to c){
   func
  }
 }
//関数呼び出し
 myLoop(3){println("hoge")}


引数有の関数を受け取る場合の例。あまり見栄えがよくないか。

//関数定義
def functest(c:Int)(func : (Int) =>Unit ) = {
 func(c)
}
//関数呼び出し
functest(1){
  (c:Int) => println(c+1)
}

引数リストの部分適用

引数リスト1つの場合と同じように部分適用できる。

def sum(a:Int)(b:Int) = a+b

val partSum = sum(_:Int)(2)
val fSum = sum _
val partSum2 = fSum(_:Int)(2)

カリー化

複数の引数を取る関数を、一つの引数を取る関数のチェインに分割すること

カリー化前

def sum(a:Int,b:Int,c:Int) = a + b + c

カリー化後(冗長に書いたもの)

def sumCurrey(a:Int) : (Int) => ((Int)=>Int) = {
  def innerB(b:Int) : (Int)=>Int = {
    def innerC(c:Int) : Int = {
      return a + b + c
    }
    return innerC _
  }
  return innerB _ 
}

型指定を省略

def sumCurrey(a:Int)  = {
  def innerB(b:Int)  = {
    def innerC(c:Int)  = {
      a + b + c
    }
    innerC _
  }
  innerB _
}

innerCを無名関数に

def sumCurrey(a:Int)  = {
  def innerB(b:Int)  = {
    (c:Int) => a + b + c
  }
  innerB _
}

innerBを無名関数に

def sumCurrey(a:Int)  = {
  (b:Int) => (c:Int) => a + b + c
}

最終的にここまでシンプルになる

def sumCurrey(a:Int) = (b:Int) => (c:Int) => a + b + c

カリー化のうれしいこと

後でまとめる。参考
http://qiita.com/KDKTN/items/6a27c0e8efa66b1f7799

なお、カリーとは数理論理学者のHaskell Curryに由来する。