2008年5月29日木曜日

お客様の端末からはご利用になれません

JSPファイル内でコンテンツタイプをXHTML(”text/xhtml”)として指定したところ、SoftBank端末で下記エラーが出てページを表示できなくなってしまった。
----------------------------------------------------------------
お客様の端末からはご利用になれません。(WJ46042E)
----------------------------------------------------------------

DrawArea の値が不正です

iアプリエミュレータの端末設定で、画面サイズを240x240から240x260に設定し、ADFにもDrawArea属性を追加して、eclipseからエミュレータを実行したが、"DrawArea の値が不正です"というエラーが出てアプリを起動できない。

原因は、eclipseの実行ダイアログで端末を選択していないことだった。

2008年5月28日水曜日

AuthenticationFailedException

JavaMailでGmailを使ってメール送信を行っていたところ、ある日突然下記例外が発生するようになった。(Transport#connect()で発生した模様)

----------------------------------------------------------------
javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:319)
at javax.mail.Service.connect(Service.java:169)
----------------------------------------------------------------

詳細は不明だが、原因は使用していたGmailアカウントが無効になっていたことだった。

PCから使用していたGamilアカウントでログインしようとしたところ、"アカウントが無効になりした"と表示された。
この画面のヘルプリンクのようなものをたどっていきそのアカウントで再ログインしたところログインできた(メールの送受信もできた)!
この後はJavaMailプログラムでも例外が発生しなくなった!
結局原因は不明…

Gmail側の不具合なのだろうか?下記のように同様の現象にあった方もいるようだ。
http://groups.google.co.jp/group/gmail-troubleshooting-ja/browse_thread/thread/6654969f20012244

2008年5月23日金曜日

midi再生

MEXAエミュレーターで自作midiを再生したところPlayer.realize()で例外が発生した。
----------------------------------------------------------------
javax.microedition.media.MediaException: realize failed.
at com.jblend.media.AbstractHandler.doRealize(+100)
at com.jblend.media.AbstractHandler.realize(+26)
----------------------------------------------------------------
--->コンテンツタイプを間違えていた("application/x-smaf-phrase"を指定していた)。


コンテンツタイプを"audio/mid"にしたがManager.createPlayer()で例外が発生した。
----------------------------------------------------------------
javax.microedition.media.MediaException: createPlayer() failed.
at com.jblend.media.MediaManager.createPlayer(+166)
at javax.microedition.media.Manager.createPlayer(+5)
----------------------------------------------------------------
--->コンテンツタイプを"audio/midi"にしたら鳴った!!!

2008年5月21日水曜日

MEXAエミュレータメモ

[通信許可設定の変更]
1.MEXAエミュレータを起動する
2.プロジェクト(*.vjpファイル)を開く
3.電源ボタンを押しスタンバイにする
4.決定ボタンを押し管理画面に移行する
5.Settingを選択する
6.アプリを選択する
7."Change Permission ?"でYesを選択
8.Use Networkを選択し通信許可設定を変更する

2008年5月19日月曜日

JSPコードの解析エラー?

下記の例外が発生した。
----------------------------------------------------------------
org.apache.jasper.JasperException: /message.jsp(19,2) The content of elements must consist of well-formed character data or markup.
----------------------------------------------------------------

これはXML形式で記述したJSPファイル内で、タグの整合性が取れていなかったために発生した模様。
XML形式で記述する場合は、<% ... %>のようなスクリプトレットは記述できない。
JSPタグの<jsp:scriptlet>...</jsp:scriptlet>を使用しなければならない。

2008年5月18日日曜日

JavaMailメモ

管理ビーンの初期化部分でコケタ。
------------------------------------------------------------------------------
HTTPステータス 500 -

type 例外レポート

メッセージ

説明 The server encountered an internal error () that prevented it from fulfilling this request.

例外

javax.servlet.ServletException: An exception occurred processing JSP page /preregi.jsp at line 23
------------------------------------------------------------------------------

tomcatログにも
java.lang.ClassNotFoundException: javax.mail.Message
が出ていた。

eclipseのプロジェクト設定で、ライブラリを追加し、WARファイル内にも配置されるように設定したら、例外は出なくなった。

==============================================================================

メール送信で例外が発生した模様。peerからリセットされた?
------------------------------------------------------------------------------
javax.mail.MessagingException: Can't send command to SMTP host;
nested exception is:
java.net.SocketException: Connection reset by peer: socket write error
at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1564)
at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1551)
at com.sun.mail.smtp.SMTPTransport.close(SMTPTransport.java:696)
at javax.mail.Transport.send0(Transport.java:191)
at javax.mail.Transport.send(Transport.java:118)
at srpgweb.Preregistration.preregister(Preregistration.java:314)
------------------------------------------------------------------------------

原因はFromヘッダを付けていなかったため。送信元を明記してないメールははじかれる模様。

JavaMail(+Gmail)でメール送信

Javaプログラムからメール送信を行うためのライブラリJavaMailを使用する。
下記のライブラリファイルが必要になるので、ダウンロードしてプロジェクトに追加する。

JavaMail(mail.jar)
http://java.sun.com/products/javamail/downloads/index.html
JAF(activation.jar)
http://java.sun.com/javase/technologies/desktop/javabeans/jaf/downloads/index.html


実際のプログラムでは下記のように使用すれば良いらしい。
-----------------------------------------------------------------------------

/**
* SMTPメール送信
*
* @param serverUrl サーバーURL
* @param name メールアカウント名
* @param password メールパスワード
* @param smtpProps SMTPプロパティ
* @param toAddr 宛先アドレス
* @param fromAddr 送信元アドレス
* @param fromName 送信元表示名
* @param subject メールタイトル
* @param bodyText メール本文
* @throws Exception
*/
private void sendSmtpMail(
String serverUrl,
String name,
String password,
Properties smtpProps,
String toAddr,
String fromAddr,
String fromName,
String subject,
String bodyText )
throws Exception
{
// セッション
Session session = Session.getDefaultInstance(smtpProps, null);

// 送信メッセージ
MimeMessage mimeMsg = new MimeMessage(session);
mimeMsg.setRecipients(
Message.RecipientType.TO, toAddr);
mimeMsg.setFrom(
new InternetAddress(fromAddr, fromName));
mimeMsg.setSubject(subject, "ISO-2022-JP");
mimeMsg.setText(bodyText, "ISO-2022-JP");

// メール送信
Transport transport = null;
try
{
transport = session.getTransport("smtp");
transport.connect(serverUrl, name, password);
transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());
}
catch(Exception e)
{
throw e;
}
finally
{
if(transport != null)
{
transport.close();
}
}
}

-----------------------------------------------------------------------------

上記メソッドの呼び出し方(Gmailの場合)
-----------------------------------------------------------------------------

String smtpServer = "smtp.gmail.com";
String gmailAddr = "????@gmail.com";
Properties props = new Properties();
props.put("mail.smtp.host", smtpServer);
props.put("mail.smtp.auth", "true" );
props.put("mail.smtp.port", "587");
props.put("mail.smtp.starttls.enable", "true");

sendSmtpMail(
smtpServer,
gmailAddr,
"パスワード",
props,
"宛先アドレス",
gmailAddr,
"送信者名",
"タイトル",
"コンニチハ" );

-----------------------------------------------------------------------------
Gmail設定仕様のためこのようなプロパティ設定が必要になる。

2008年5月16日金曜日

JavaScriptをオフにしたら画面遷移しなくなった!?

JavaScriptを出力しないようにしたところ、画面遷移が行われなくなってしまった。

試しに<h:commandLink>の代わりに<h:commandButton>を使ったら画面遷移した!
<h:commandLink>はJavaScriptを使わないと機能しないのか!?

スクリプトレスにする

Apache MyFacesでJavaScriptを出力させないようにするには、web.xmlファイルの内に下記定義を追記する。
----------------------------------------------------------------
<context-param>
<param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name>
<param-value>false</param-value>
</context-param>

2008年5月15日木曜日

コンポーネントアクションで例外発生?

作成したJSFアプリでコンポーネントアクション(この時はのaction属性で指定したBeanのメソッド)を実行したときに、下記例外が発生した。
----------------------------------------------------------------
HTTPステータス 500 -

type 例外レポート

メッセージ

説明 The server encountered an internal error () that prevented it from fulfilling this request.

例外

javax.servlet.ServletException: Error calling action method of component with id _idJsp0:_idJsp10
javax.faces.webapp.FacesServlet.service(FacesServlet.java:154)

原因

javax.faces.FacesException: Error calling action method of component with id _idJsp0:_idJsp10
org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:425)
org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)
----------------------------------------------------------------

原因はBeanクラス内のコンポーネントクラスメンバにインスタンスをセットしていなかったことだった。(アクションメソッド内でインスタンスがセットされていないメンバを参照したためnull例外状態になっていた模様。)
NullPointerExceptionで示してくれればわかりやすいのだが…。

iモードシミュレータでローカルアクセス

iモードHTMLシミュレータⅡでローカルホストへアクセスする際は、"localhost"ではなく"127.0.0.1"を使う。("localhost"だと"接続できません"と表示される。)

×:http://localhost/test.html
○:http://127.0.0.1/test.html

JSFアプリが動作しない

JSF11TestというJSFアプリをつくりその中のtest.jspにアクセス(http://localhost:8080/JSF11Test/faces/test.jsp)したが、"HTTPステータス 404 - サーブレット Faces Servlet が利用できません"と表示され、動作しない。
環境は下記のとおり。
eclipse 3.3
Tomcat6
Apache MyFaces 1.1.5

原因は、動的Webプロジェクト(JSF使用)のウィザードのJSF機能のところで、ライブラリーの配置にチェックを入れていなかったことが原因だった。このためWARファイル内にJSFライブラリーが配置されていなかったため起動できなかった模様。

デフォルトでチェックしてくれればいいと思うのだが…

プロジェクト作成後でも、eclipseメニューのプロジェクトの設定のJ2EEモジュール依存関係のところでJSFライブラリーにチェックを入れれば配置されるようになる。

========================================================
2008-05-15
この症状のときは、
C:\Program Files\Apache Software Foundation\Tomcat 6.0\logs\localhost.2008-xx-xx.log
に下記のようなログが出ることもある模様。
----------------------------------------------------------------
2008/05/15 1:08:10 org.apache.catalina.core.ApplicationContext log
致命的: Error loading WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1113708
javax.faces.webapp.FacesServlet
java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1360)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1206)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1083)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4058)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4364)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:829)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:718)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:490)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1215)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:293)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1337)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
at java.lang.Thread.run(Unknown Source)
----------------------------------------------------------------

2008年5月12日月曜日

文字入力の強制終了

アプリ中で文字入力機能(IME)を使用した際に、バックグラウンドスレッドから強制的に終了できるか調査した。

[Sアプリ環境(MEXAエミュレータ)]
可能(Display.setCurrent()で強制切替可能)。

[iアプリ環境(DoJaエミュレータ)]
不可能。
Canvas.imeOn()中にDisplay.setCurrent()を行ったが切り替わらなかった(例外は発生せずsetCurrent()で処理が中断されている様子)。DoJaの開発ガイドPDFには、imeOn()中にsetCurrent()を行った場合の挙動は機種依存であると記載されている。Panel+TextBoxを使用した場合もsetCurrent()で切り替えられなかった。

したがってiアプリ環境では文字入力の強制終了は使用できない模様。

※ちなみに文字入力起動中において、バックグラウンドスレッドのHTTP通信等は両環境で可能だった。

2008年5月10日土曜日

midi再生

MEXAエミュレーターで拾ってきた野良midiを再生したところ、再生はできたが別の効果音(smaf)との同時再生ができなかった。
("javax.microedition.media.MediaException: start failed."が発生した)

ちなみにmidi同士の同時再生はできた。
midiとsmafの同時再生は不可能ということ?

2008年5月3日土曜日

localhostとの通信

PC上のエミュレーターでiアプリを実行中に、localhostとHTTP通信したい場合は、ADFのPackageURLを下記例のように設定することで通信できる。

PackageURL = http://localhost/test.jar

※設定しないと"SecurityException: Illegal host"が発生して通信できない。