2007/03/31
WebObjectsで直接SQL実行
WebObjectsで、直接SQLを実行したい場合、よく目にするのは「EOUtilities.rawRowsForSQL」です。 今までずっとこいつを使っていたのですが、こいつでINSERTを実行したあとに、「ec.saveChanges()」をやると、以下のエラーが出るようです。
: Exception occurred while handling request:
java.lang.IllegalArgumentException: Array is empty
at com.webobjects.foundation.NSArray.objectAtIndex(NSArray.java:488)
at com.webobjects.jdbcadaptor.JDBCPlugIn.newPrimaryKeys(JDBCPlugIn.java:611)
:
:
なぜだかまったく分からず、色々調べてみると、
Are you expecting rows from your UPDATE statements? If not, why do you use rawRowsForSQL() in preference of evaluateExpression()?どうやら、結果を求める場合はrawRowsForSQL()を使い、実行するだけの場合はevaluateExpression()を使うようです。
というわけで、以下のようにevaluateExpressionを使用するようにしました。
もちろんエラーはなくなりました。
EODatabaseContext dbContext = EOUtilities.databaseContextForModelNamed(ec, "model");
EOAdaptorContext adContext = dbContext.adaptorContext();
EOAdaptorChannel adCannel = (EOAdaptorChannel)adContext.channels().lastObject();
EOSQLExpressionFactory factory = new EOSQLExpressionFactory(adContext.adaptor());
EOSQLExpression expression = factory.expressionForString("sql");
adCannel.evaluateExpression(expression);
ラベル: webobjects
automatically translated by Google Translate Hack!
2007/03/24
logに残されるパスワードをフィルタリングする
Railsアプリを作成していて、動作の確認等で非常に重要なログファイルですが、このログには様々な情報が残されます。
例えばユーザ登録画面等で送信したパラメータもログに残されます。
ユーザ登録の際は、パスワードを入力したりしますので、パスワードがそのまま平文で残されるのはちょいとまずいものです。
Processing UserController#signup (for 192.168.0.25 at 2007-03-24 10:41:08) [POST]
Session ID: 42d8820cd16b8a672b86f737d8d6b4e8
Parameters: {"user"=>{"password_confirmation"=>"testpassword", "lastname"=>"Tarou", "firstname"=>"Test", "login"=>"tester", "password"=>"testpassword", "email"=>"test@test.com"}, "commit"=>"Signup", "action"=>"signup", "controller"=>"admin/user"}
そこで、以下のようにするとログに残されるパスワードをフィルタリングすることができます。
filter_parameter_logging(*filter_words) {|key, value| ...}
class ApplicationController < ActionController::Base
filter_parameter_logging "password"
end
すばらしい!
Processing UserController#signup (for 192.168.0.25 at 2007-03-24 10:43:50) [POST]
Session ID: 42d8820cd16b8a672b86f737d8d6b4e8
Parameters: {"user"=>{"password_confirmation"=>"[FILTERED]", "firstname"=>"Test", "lastname"=>"Tarou", "password"=>"[FILTERED]", "login"=>"tester2", "email"=>"test2@test.com"}, "commit"=>"Signup", "action"=>"signup", "controller"=>"admin/user"}
ラベル: rails
automatically translated by Google Translate Hack!
2007/03/16
JavaMailでAuth認証とOutbound Port25 Blocking(OP25B)対策
JavaからMailを送信するのに、javax.mailを使って送信していたのですが、社内のサーバ構成を変更しているうちに送信できなくなってしまった。
javax.mail.SendFailedException: Sending failed;
nested exception is:
class javax.mail.SendFailedException: Invalid Addresses;
nested exception is:
class javax.mail.SendFailedException: 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)
at javax.mail.Transport.send0(Transport.java:218)
at javax.mail.Transport.send(Transport.java:80)
at SendMail.sendMail(SendMail.java:42)
...
どうやら認証が必要なようです。
今までは同じホストでアプリケーションが稼動していたので問題なかったようです。
というわけで、Auth認証、そしてOutbound Port25 Blocking(OP25B)対策をして対処しました。
import java.util.Properties;
import java.util.Date;
import javax.mail.Session;
import javax.mail.Message;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
public class SendMail {
public void sendMail(
String sourceAdd,
String sourceName,
String descAdd,
String subject, String message,
String type) {
try {
Properties props = System.getProperties();
props.put("mail.smtp.host","mail.hoge.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
Authenticator auth = new MyAuthenticator();
Session session=Session.getDefaultInstance(props, auth);
MimeMessage mimeMessage=new MimeMessage(session);
mimeMessage.setFrom(new InternetAddress(sourceAdd, sourceName, "iso-2022-jp"));
mimeMessage.setRecipients(Message.RecipientType.TO, descAdd);
mimeMessage.setSubject(subject, "iso-2022-jp");
mimeMessage.setText(message, "iso-2022-jp");
mimeMessage.setHeader("Content-Type", type);
mimeMessage.setSentDate(new Date());
Transport.send(mimeMessage);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class MyAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user" , "password");
}
}
ラベル: java
automatically translated by Google Translate Hack!
2007/03/13
J-PHONE/3.0で、postがうまくいかない
携帯向けアプリを構築していて、特定の端末(おそらく)の場合だけ、post送信時、sessionが維持されない現象を確認。
post送信されるパラメータで、「"_session_id"=>"901cbb6b5a6d515a99a06373d20ba2f4?page=1"」というように、セッションIDのなかになぜか他のパラメータが混入する。
これでは当然、「そんなセッションありません」、ということになってsessionが維持できなくなります。
で、あれこれ試行錯誤した結果、どうやら、formのアクションで、自動でURLパラメータとしてsession_idを付与しているところが問題のよう。
formのアクションを直打ちして解決しました。
ちなみに自動でsession_idを付与してくれるのは、ActiveHeartのTransSidのお陰です。
参考:
RubyOnRails を使ってみる 【第 5 回】 ActiveHeart
ラベル: rails
automatically translated by Google Translate Hack!
