GoogleAppEngineでBlazeDS環境を構築してみた
Posted by hikaruworld : 2009 5月 17
基本的には、下記に書いてある参考サイト通り作業した。
特にAppEngine & Adobe BlazeDS (fix)のそのまんまに近い
参考になったサイトは以下。多謝!!
以下は、GAEでアップデートした実際のサンプルサイト
flexblazeds.appspot.com
はじめに
まず、参考サイトにもあるようにmessagingは動かないらしい。
動くのはremotingのみ(自分では未確認)。
また、GAE及びBlazeDSのバグでそのまま利用するだけでは正常に動作しないとのこと。
ライブラリの置き換えと、BlazeDSのソースを修正してjar化する必要がある。
また、これらの構築作業はすべてのパラメータを理解してやっている訳ではない。
BlazeDSのソースの修正なども同様。
後で詳細を確認して検証したいと思っているが、基本的にはやっぱり自己責任でー。
構築環境
OS | MacOSX 10.5.6 |
---|---|
IDE | Eclipse 3.4.0(GooglePluginForEclipse v1.0.1) |
ライブラリ | Blazeds3.2.0.3978 |
SDK | GAE SDK1.2.0 (実装中にGAE1.2.1にupdateしたが、基本的には1.2.0で作業) Java1.6.0(Java1.5ではエラーになる。詳細は後述。) FlexBuilder 3.2.0 |
ブラウザ | Firefox3.0.10 |
作業内容
以下、実際の作業手順。
※前提として、GooglePluginのEclipseへのインストール、及びBlazeDS+Flexプロジェクトの設定周りなどは省略。
BlazeDSの最小構成に関しては、この辺りを参考に適当に構築した。
概要
ざっと手順を書くと以下の通り
1. Javaのコンパイラを1.6に切り替え
2. appengine-web.xmlにtrueを設定
3. xalanをlibに配置
4. service-config.xmlをfalse に設定
5. BlazeDSのソースを修正(AbstractAmfInput.java, BaseHTTPEndpoint.java)し、再ビルド後に再配置。
プロジェクト構成及びソース
# tree ./preproegg ./preproegg/ |-- src | |-- META-INF | | `-- jdoconfig.xml | |-- com ---- 実際のソースディレクトリ | | `-- wordpress | | `-- prepro | | `-- remote | | `-- HelloWorld.java --- RemoteObjectで利用されるクラス | `-- log4j.properties `-- war |-- WEB-INF | |-- appengine-web.xml | |-- classes | | |-- META-INF | | | `-- jdoconfig.xml | | |-- com | | | `-- wordpress | | | `-- prepro | | | `-- remote | | | `-- HelloWorld.class | | `-- log4j.properties | |-- flex | | `-- services-config.xml | |-- lib | | |-- appengine-api-1.0-sdk-1.2.0.jar | | |-- backport-util-concurrent.jar | | |-- datanucleus-appengine-1.0.0.final.jar | | |-- datanucleus-core-1.1.0.jar | | |-- datanucleus-jpa-1.1.0.jar | | |-- flex-messaging-common.jar | | |-- flex-messaging-core.jar | | |-- flex-messaging-remoting.jar | | |-- geronimo-jpa_3.0_spec-1.1.1.jar | | |-- geronimo-jta_1.1_spec-1.1.1.jar | | |-- jdo2-api-2.3-SNAPSHOT.jar | | `-- xalan.jar | |-- logging.properties | `-- web.xml |-- hello-debug ---- Flexの出力ディレクトリ | |-- AC_OETags.js | |-- hello.html | |-- hello.swf | |-- history | | |-- history.css | | |-- history.js | | `-- historyFrame.html | `-- playerProductInstall.swf `-- index.html
構築手順
以下が、実際の手順。試行錯誤の結果も混じっていますので無駄な事もしている。備忘録的に記述。
基本的には、参考サイトの手順にのっとって行えば問題ない。
1. Javaのコンパイラを1.6に切り替え
とりあえず、作成したサンプルをローカルで動作確認(Runで起動)。
画面に遷移すると以下のようなエラーが出た。
HTTP ERROR: 500 INTERNAL_SERVER_ERROR RequestURI=/hello-debug/hello.html Caused by: java.lang.NullPointerException at com.google.appengine.tools.development.LocalResourceFileServlet.doGet(LocalResourceFileServlet.java:139) at javax.servlet.http.HttpServlet.service(HttpServlet.java:693) at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at org.mortbay.jetty.Server.handle(Server.java:313) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396) at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
この辺Issue 1218と同件?
Javaのバージョンが旧かったようなので、最新版の1.6系にコンパイラを変更して再度確認を行う。
(そういえばMacOSXのデフォルト設定ではJavaは1.5系だったけか。)
再確認して問題ない事を確認。
というわけで、早速サーバにUPLOADして起動確認。ちなみにendpointの設定は修正済み。
2. appengine-web.xmlにtrueを設定
アップロードした内容の動作確認したが反応がない。GAE側のログを確認。
WARNING: /messagebroker/amf java.lang.RuntimeException: Session support is not enabled in appengine-web.xml. To enable sessions, put <sessions-enabled>true</sessions-enabled> in that file. Without it, getSession() is allowed, but manipulation of sessionattributes is not. at com.google.apphosting.utils.jetty.StubSessionManager$StubSession.throwException(StubSessionManager.java:67) at com.google.apphosting.utils.jetty.StubSessionManager$StubSession.setAttribute(StubSessionManager.java:63) at flex.messaging.HttpFlexSession.getFlexSession(HttpFlexSession.java:236) at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:257) at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at org.mortbay.jetty.Server.handle(Server.java:313) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:844) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396) at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
セッション設定が有効になっていないと言われているので、仰せのままに従って、appengine-web.xmlに以下を追記した。
(注:*2参照)
<sessions-enabled>true</sessions-enabled>
3. xalanをlibに配置
再チャレンジ。
今度はこんなエラーが出た。
[preproegg/1.333457851422744807].<stderr>: **** MessageBrokerServlet failed to initialize due to runtime exception: Exception: java.lang.RuntimeException: XPathFactory#newInstance() failed to create an XPathFactory for the default object model: http://java.sun.com/jaxp/xpath/dom with the XPathFactoryConfigurationException: javax.xml.xpath.XPathFactoryConfigurationException: No XPathFactory implementation found for the object model: http://java.sun.com/jaxp/xpath/dom at javax.xml.xpath.XPathFactory.newInstance(Unknown Source) at flex.messaging.config.XPathServerConfigurationParser.initializeExpressionQuery(XPathServerConfigurationParser.java:46) at flex.messaging.config.AbstractConfigurationParser.parse(AbstractConfigurationParser.java:68) at flex.messaging.config.FlexConfigurationManager.getMessagingConfiguration(FlexConfigurationManager.java:79) at flex.messaging.MessageBrokerServlet.init(MessageBrokerServlet.java:106) at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:433) at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:256) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40) at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:612) at org.mortbay.jetty.servlet.Context.startContext(Context.java:139) at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218) at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:500) at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:190) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:167) at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:113) at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:235) at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4755) at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4753) at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24) at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:359) at com.google.net.rpc.impl.Server$2.run(Server.java:800) at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56) at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:510) at com.google.net.rpc.impl.Server.startRpc(Server.java:756) at com.google.net.rpc.impl.Server.processRequest(Server.java:348) at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:459) at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319) at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290) at com.google.net.async.Connection.handleReadEvent(Connection.java:419) at com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:762) at com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:207) at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:101) at com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:251) at com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:373) at java.lang.Thread.run(Unknown Source)
検索してみると、先ほど提示したサイトなどにもissues 1255 のバグみたいな事を言っているっぽい。
xalnaを置き換えればよいとの事なのでやってみる。
とりあえず、BlazeDSからxalnaを引っ張ってきてlib以下に配備した。
4. service-config.xmlをfalse に設定
再度チャレンジ。
.
..
…
[flexblazeds/1.333508560435318247].<stderr>: **** MessageBrokerServlet failed to initialize due to runtime exception: Error: java.lang.NoClassDefFoundError: java.lang.management.ManagementFactory is a restricted class. Please see the Google App Engine developer's guide for more details. at com.google.apphosting.runtime.security.shared.stub.java.lang.management.ManagementFactory.<clinit>(ManagementFactory.java) at flex.management.PlatformMBeanServerLocator.getMBeanServer(PlatformMBeanServerLocator.java:38) at flex.management.BaseControl.register(BaseControl.java:186) at flex.management.runtime.AdminConsoleDisplayRegistrar.<init>(AdminConsoleDisplayRegistrar.java:40) at flex.management.runtime.messaging.MessageBrokerControl.<init>(MessageBrokerControl.java:85) at flex.messaging.MessageBroker.<init>(MessageBroker.java:269) at flex.messaging.config.MessagingConfiguration.createBroker(MessagingConfiguration.java:105) at flex.messaging.MessageBrokerServlet.init(MessageBrokerServlet.java:112) at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:433) at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:256) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40) at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:612) at org.mortbay.jetty.servlet.Context.startContext(Context.java:139) at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218) at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:500) at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:190) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:167) at
こんなんでた(;
issues 1302 や、
上記サイトを参考にservice-config.xmlを編集する(注:2参照)
<manageable>false</manageable>
エラーは出なくなったけど、応答がない。
5. BlazeDSのソースを修正(AbstractAmfInput.java, BaseHTTPEndpoint.java)し、再ビルド後に再配置。
ソースをダウンロードしてきて、
modules/core/src/java/flex/messaging/io/amf/AbstractAmfInput.java
を以下のように修正(58行目あたり)
/** * Internal use * @exclude */ public void setInputStream(InputStream in) { //this.in = new DataInputStream(in); → 以下のように修正。 this.in = new DataInputStream(new BufferedInputStream(in)); }
それから、修正したソースを再ビルドする。
# cd blazeds-src-3.2.0.3978
# ant clean sdk common core
Buildfile: build.xml [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found. clean: [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found. clean: [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found. clean: [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found. clean: [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found. clean: [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found. clean: [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found. clean: clean: clean: clean: [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found. BUILD FAILED /Users/hoge/Downloads/blazeds-src-3.2.0.3978/build.xml:447: The following error occurred while executing this line: /Users/hoge/Downloads/blazeds-src-3.2.0.3978/resources/fds-ajax-bridge/build.xml:52: Problem: failed to create task or type if Cause: The name is undefined. Action: Check the spelling. Action: Check that any custom tasks/types have been declared. Action: Check that any <presetdef>/<macrodef> declarations have taken place. Total time: 0 seconds
antcontrib.propertiesが見つからないと怒られたので、ダウンロードしてくるか sudo port install ant-contrib辺りでインストールする。
今回は面倒なのでportでインストールしたら、ant1.7.1もインストールされた。
再ビルド。
文字コードの変換や、不正確な引数の警告がcompile時に表示されるが問題なしとみなし、
作成された、lib/flex-messaging-core.jarをコピーする。
[RPC Fault faultString="Detected duplicate HTTP-based FlexSessions, generally due to the remote host disabling session cookies. Session cookies must be enabled to manage the client connection correctly." faultCode="Server.Processing.DuplicateSessionDetected" faultDetail="null"] at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::faultHandler()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:220] at mx.rpc::Responder/fault()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\rpc\Responder.as:53] at mx.rpc::AsyncRequest/fault()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:103] at NetConnectionMessageResponder/statusHandler()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as:569] at mx.messaging::MessageResponder/status()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\messaging\MessageResponder.as:222]
とりあえずググる。これか?BLZ-268
クラスタリングとか書いてありますね。
しかも、異種サーバの混合クラスタリングはベンダーによってseessionIdを独自処理するからサポートされていないとかかいてあるように見えるが気のせいかなぁ。
困ったなぁと思って、参考ページを読んでいると最後の方にUPDATEが書いてあり、
flex.messaging.endpoints.BaseHTTPEndpointのduplicateSessionDetectedのチェック消したwと記述されている。
というわけで、
flex.messaging.endpoints.BaseHTTPEndpoint.java
の405行目辺りのduplicateSessionDetectedのif文をコメントアウトする。
// If more than one was found, remote host isn't using session cookies. Kill all duplicate sessions and return an error. // Simplest to just re-scan the list given that it will be very short, but use an iterator for concurrent modification. /* if (duplicateSessionDetected) { List sessions = flexClient.getFlexSessions(); for (Iterator iter = sessions.iterator(); iter.hasNext();) { FlexSession session = (FlexSession)iter.next(); if (session instanceof HttpFlexSession) session.invalidate(); } // Return an error to the client. DuplicateSessionException e = new DuplicateSessionException(); e.setMessage(ERR_MSG_DUPLICATE_SESSIONS_DETECTED); throw e; }*/ return flexClient;
再ビルド。再配備。
# おそらく、flex-messaging-core.javaだけでよいと思うが
# 自分の環境ではうまく行かなかったので、backport-util-concurrent.jar, flex-*.jar,xalan.jarを置き換えている。
# またGAEの影響で反映されなかった可能性もあるのでUPLOAD時のデプロイメントバージョンを変更してみるとよいかも。
実行する。
やたー、うまくいった。
完成したサンプルソースは以下の通り
– Java
■HelloWorld.java
package com.wordpress.prepro.remote; public class HelloWorld { public String sayHello(String name) { return "Hello, " + name; } }
– mxml
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:RemoteObject id="ro" destination="HelloWorld" endpoint="http://localhost:8080/messagebroker/amf" /> <mx:Script> <![CDATA[ public function textChange():void { trace(n.text); ro.sayHello(n.text); } ]]> </mx:Script> <mx:TextInput id="n" change="textChange()"/> <mx:Label text="{ro.sayHello.lastResult}"/> </mx:Application>
– 設定ファイル
■services-config.xml
<?xml version="1.0" encoding="UTF-8"?> <services-config> <services> <service id="remoting-service" class="flex.messaging.services.RemotingService"> <adapters> <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true" /> </adapters> <default-channels> <channel ref="my-amf" /> </default-channels> <destination id="HelloWorld"> <properties> <source>com.wordpress.prepro.remote.HelloWorld</source> </properties> </destination> </service> </services> <channels> <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel"> <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint" /> </channel-definition> </channels> <!-- 注:*1 --> <system> <manageable>false</manageable> <redeploy> <enabled>false</enabled> </redeploy> </system> </services-config>
■web.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> <!-- Http Flex Session attribute and binding listener support --> <listener> <listener-class>flex.messaging.HttpFlexSession</listener-class> </listener> <!-- MessageBroker Servlet --> <servlet> <servlet-name>MessageBrokerServlet</servlet-name> <display-name>MessageBrokerServlet</display-name> <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class> <init-param> <param-name>services.configuration.file</param-name> <param-value>/WEB-INF/flex/services-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MessageBrokerServlet</servlet-name> <url-pattern>/messagebroker/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
■appengine-web.xml
<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <application>preproegg</application> <version>1</version> <!-- 注:*2 --> <sessions-enabled>true</sessions-enabled> <!-- Configure java.util.logging --> <system-properties> <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/> </system-properties> </appengine-web-app>
TODO
以下、とりあえずやったので要調査の内容。
– BlazeDSのソース修正による影響範囲。
– 各種設定ファイルへの意味
– セッションが使えるかどうか。。。BLZ-268を確認しても無理っぽい気がするが自信なし。
コメントを残す