たちまち。

即席で役に立つこと。

【IM-Collaboration】スケジュール画面にアクセスすると500エラー

スケジュール画面にアクセスすると以下のような例外が発生する。

jp.co.intra_mart.common.aid.jsdk.javax.servlet.exception.ExtendedServletException: Runtime error: collaboration/schedule/user/calendar
    at jp.co.intra_mart.system.session.web.WebPageBuilder.invoke(WebPageBuilder.java:145)
    at jp.co.intra_mart.system.servlet.jssp.AbstractJSSPServlet.fire(AbstractJSSPServlet.java:76)
    at jp.co.intra_mart.system.servlet.jssp.SecureJSSPServlet.execute(SecureJSSPServlet.java:70)
    at jp.co.intra_mart.system.servlet.jssp.SecureJSSPServlet.doPost(SecureJSSPServlet.java:55)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:159)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:97)
    at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:109)
    at jp.co.intra_mart.foundation.ui.theme.ThemeFilter.doFilter(ThemeFilter.java:397)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.servlet.jssp.JSSPContextFilter.doFilter(JSSPContextFilter.java:63)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.common.aid.jsdk.javax.servlet.filter.impl.HTTPContextHandlingFilterImpl.doFilter(HTTPContextHandlingFilterImpl.java:53)
    at jp.co.intra_mart.common.aid.jsdk.javax.servlet.filter.HTTPContextHandlingFilter.doFilter(HTTPContextHandlingFilter.java:94)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.common.aid.jsdk.javax.servlet.filter.RequestMessageBodyFilter.doFilter(RequestMessageBodyFilter.java:210)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.security.certification.filter.CertificationConfirmFilter.doFilter(CertificationConfirmFilter.java:54)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.secure_token.filter.SecureTokenFilter.doFilter(SecureTokenFilter.java:67)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.servlet.filter.RequestControlFilter$FilterScope.execute(RequestControlFilter.java:36)
    at jp.co.intra_mart.system.servlet.filter.ParallelRequestController.execute(ParallelRequestController.java:122)
    at jp.co.intra_mart.system.servlet.filter.RequestControlFilter.doFilter(RequestControlFilter.java:50)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.servlet.filter.RequestQueryLengthMonitoringFilter$FilterScope.execute(RequestQueryLengthMonitoringFilter.java:39)
    at jp.co.intra_mart.system.servlet.filter.RequestQueryLengthMonitoringController.execute(RequestQueryLengthMonitoringController.java:113)
    at jp.co.intra_mart.system.servlet.filter.RequestQueryLengthMonitoringFilter.doFilter(RequestQueryLengthMonitoringFilter.java:53)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.servlet.filter.RequestScopeLockReleaseFilter.doFilter(RequestScopeLockReleaseFilter.java:44)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.secure.filter.ApplicationPermissionFilter.doFilter(ApplicationPermissionFilter.java:65)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.secure.filter.SystemPermissionFilter.doFilter(SystemPermissionFilter.java:68)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
    at org.seasar.struts.portlet.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:45)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:71)
    at org.seasar.struts.portlet.filter.HotdeployFilter.doFilter(HotdeployFilter.java:45)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at com.caucho.server.webapp.DispatchFilterChain.doFilter(DispatchFilterChain.java:131)
    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:314)
    at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:298)
    at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:116)
    at jp.co.intra_mart.system.log.transition.TransitionLogRequestDispatcher.forward(TransitionLogRequestDispatcher.java:65)
    at jp.co.intra_mart.system.router.jssp.JSSPDispatcher.forward(JSSPDispatcher.java:60)
    at jp.co.intra_mart.system.router.authz.user.jssp.AuthzJSSPAction.executeAuthorized(AuthzJSSPAction.java:34)
    at jp.co.intra_mart.system.router.authz.AuthorizingAction.doExecute(AuthorizingAction.java:52)
    at jp.co.intra_mart.foundation.router.GenericAction.execute(GenericAction.java:73)
    at jp.co.intra_mart.foundation.router.GenericAction.access$000(GenericAction.java:17)
    at jp.co.intra_mart.foundation.router.GenericAction$GenericActionFilterChain.doFilter(GenericAction.java:32)
    at jp.co.intra_mart.foundation.servlet.router.filter.CorsActionFilter$CorsActionFilterScope.execute(CorsActionFilter.java:46)
    at jp.co.intra_mart.system.cors.servlet.filter.StandardCorsController.execute(StandardCorsController.java:111)
    at jp.co.intra_mart.foundation.servlet.router.filter.CorsActionFilter.doFilter(CorsActionFilter.java:59)
    at jp.co.intra_mart.foundation.router.GenericAction.execute(GenericAction.java:66)
    at jp.co.intra_mart.foundation.router.GenericAction.execute(GenericAction.java:71)
    at jp.co.intra_mart.foundation.router.GenericAction.execute(GenericAction.java:62)
    at jp.co.intra_mart.system.router.BasicRouter.route(BasicRouter.java:144)
    at jp.co.intra_mart.system.router.IntramartRouter.route(IntramartRouter.java:145)
    at jp.co.intra_mart.system.router.DebugRouter.route(DebugRouter.java:52)
    at jp.co.intra_mart.system.router.IntramartComplexRouter.route(IntramartComplexRouter.java:74)
    at jp.co.intra_mart.foundation.router.RoutingFilter.doFilter(RoutingFilter.java:38)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.foundation.security.filter.SessionFilter.doFilter(SessionFilter.java:70)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.log.transition.TransitionLogFilter.doFilter(TransitionLogFilter.java:73)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.servlet.filter.RequestLogFilter.doFilter(RequestLogFilter.java:110)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.servlet.filter.ResponseHeaderFilter.doFilter(ResponseHeaderFilter.java:154)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.context.web.impl.ContextFilter.doContextFilter(ContextFilter.java:141)
    at jp.co.intra_mart.system.context.web.impl.PreContextFilterChain.doFilter(PreContextFilterChain.java:47)
    at jp.co.intra_mart.system.context.web.impl.ContextFilter.doFilter(ContextFilter.java:80)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.foundation.security.filter.ResponseCharacterEncodingFilter.doFilter(ResponseCharacterEncodingFilter.java:90)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.foundation.security.filter.RequestCharacterEncodingFilter.doFilter(RequestCharacterEncodingFilter.java:47)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
    at org.seasar.struts.portlet.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:45)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:71)
    at org.seasar.struts.portlet.filter.HotdeployFilter.doFilter(HotdeployFilter.java:45)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at com.caucho.server.webapp.WebAppListenerFilterChain.doFilter(WebAppListenerFilterChain.java:114)
    at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:156)
    at com.caucho.server.webapp.AccessLogFilterChain.doFilter(AccessLogFilterChain.java:95)
    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:314)
    at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:843)
    at com.caucho.network.listen.TcpSocketLink.dispatchRequest(TcpSocketLink.java:1395)
    at com.caucho.network.listen.TcpSocketLink.handleRequest(TcpSocketLink.java:1351)
    at com.caucho.network.listen.TcpSocketLink.handleRequestsImpl(TcpSocketLink.java:1335)
    at com.caucho.network.listen.TcpSocketLink.handleRequests(TcpSocketLink.java:1243)
    at com.caucho.network.listen.TcpSocketLink.handleAcceptTaskImpl(TcpSocketLink.java:1037)
    at com.caucho.network.listen.ConnectionTask.runThread(ConnectionTask.java:117)
    at com.caucho.network.listen.ConnectionTask.run(ConnectionTask.java:93)
    at com.caucho.network.listen.SocketLinkThreadLauncher.handleTasks(SocketLinkThreadLauncher.java:175)
    at com.caucho.network.listen.TcpSocketAcceptThread.run(TcpSocketAcceptThread.java:61)
    at com.caucho.env.thread2.ResinThread2.runTasks(ResinThread2.java:173)
    at com.caucho.env.thread2.ResinThread2.run(ResinThread2.java:118)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class jp.co.intra_mart.product.collaboration.core.internal.validation.ValidationActionExcute
    at jp.co.intra_mart.product.collaboration.core.internal.validation.ValidationUtility.validate(ValidationUtility.java:913)
    at jp.co.intra_mart.product.collaboration.schedule.internal.service.PersonalSettingServiceImpl.findDisplaySetting(PersonalSettingServiceImpl.java:184)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at jp.co.intra_mart.product.collaboration.core.service.Services$LoggingInvocationHandler.invoke(Services.java:59)
    at com.sun.proxy.$Proxy274.findDisplaySetting(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at jp.co.intra_mart.product.collaboration.core.internal.javascript.ServiceResultInvoker.invoke(ServiceResultInvoker.java:38)
    at jp.co.intra_mart.system.javascript.ServiceWrapper$Function.callOrConstruct(ServiceWrapper.java:261)
    at jp.co.intra_mart.system.javascript.VarargsFunction.delegate(VarargsFunction.java:45)
    at sun.reflect.GeneratedMethodAccessor200.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at jp.co.intra_mart.system.javascript.MemberBox.invoke(MemberBox.java:126)
    at jp.co.intra_mart.system.javascript.FunctionObject.call(FunctionObject.java:385)
    at jp.co.intra_mart.system.javascript.VarargsFunction.call(VarargsFunction.java:50)
    at jp.co.intra_mart.system.javascript.Interpreter.interpretLoop(Interpreter.java:1473)
    at jp.co.intra_mart.system.javascript.Interpreter.interpret(Interpreter.java:815)
    at jp.co.intra_mart.system.javascript.InterpretedFunction.call(InterpretedFunction.java:109)
    at jp.co.intra_mart.system.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
    at jp.co.intra_mart.system.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3101)
    at jp.co.intra_mart.system.javascript.InterpretedFunction.call(InterpretedFunction.java:107)
    at jp.co.intra_mart.system.display.ScriptScope.call(ScriptScope.java:156)
    at jp.co.intra_mart.system.session.web.WebPageBuilder.invoke(WebPageBuilder.java:252)
    at jp.co.intra_mart.system.session.web.WebPageBuilder.invoke(WebPageBuilder.java:126)
    ... 100 more

もしくは、以下のような例外。

jp.co.intra_mart.common.aid.jsdk.javax.servlet.exception.ExtendedServletException: Runtime error: collaboration/schedule/user/calendar
    at jp.co.intra_mart.system.session.web.WebPageBuilder.invoke(WebPageBuilder.java:145)
    at jp.co.intra_mart.system.servlet.jssp.AbstractJSSPServlet.fire(AbstractJSSPServlet.java:76)
    at jp.co.intra_mart.system.servlet.jssp.SecureJSSPServlet.execute(SecureJSSPServlet.java:70)
    at jp.co.intra_mart.system.servlet.jssp.SecureJSSPServlet.doPost(SecureJSSPServlet.java:55)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:159)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:97)
    at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:109)
    at jp.co.intra_mart.foundation.ui.theme.ThemeFilter.doFilter(ThemeFilter.java:397)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.servlet.jssp.JSSPContextFilter.doFilter(JSSPContextFilter.java:63)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.common.aid.jsdk.javax.servlet.filter.impl.HTTPContextHandlingFilterImpl.doFilter(HTTPContextHandlingFilterImpl.java:53)
    at jp.co.intra_mart.common.aid.jsdk.javax.servlet.filter.HTTPContextHandlingFilter.doFilter(HTTPContextHandlingFilter.java:94)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.common.aid.jsdk.javax.servlet.filter.RequestMessageBodyFilter.doFilter(RequestMessageBodyFilter.java:210)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.security.certification.filter.CertificationConfirmFilter.doFilter(CertificationConfirmFilter.java:54)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.secure_token.filter.SecureTokenFilter.doFilter(SecureTokenFilter.java:67)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.servlet.filter.RequestControlFilter$FilterScope.execute(RequestControlFilter.java:36)
    at jp.co.intra_mart.system.servlet.filter.ParallelRequestController.execute(ParallelRequestController.java:122)
    at jp.co.intra_mart.system.servlet.filter.RequestControlFilter.doFilter(RequestControlFilter.java:50)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.servlet.filter.RequestQueryLengthMonitoringFilter$FilterScope.execute(RequestQueryLengthMonitoringFilter.java:39)
    at jp.co.intra_mart.system.servlet.filter.RequestQueryLengthMonitoringController.execute(RequestQueryLengthMonitoringController.java:113)
    at jp.co.intra_mart.system.servlet.filter.RequestQueryLengthMonitoringFilter.doFilter(RequestQueryLengthMonitoringFilter.java:53)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.servlet.filter.RequestScopeLockReleaseFilter.doFilter(RequestScopeLockReleaseFilter.java:44)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.secure.filter.ApplicationPermissionFilter.doFilter(ApplicationPermissionFilter.java:65)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.secure.filter.SystemPermissionFilter.doFilter(SystemPermissionFilter.java:68)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
    at org.seasar.struts.portlet.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:45)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:71)
    at org.seasar.struts.portlet.filter.HotdeployFilter.doFilter(HotdeployFilter.java:45)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at com.caucho.server.webapp.DispatchFilterChain.doFilter(DispatchFilterChain.java:131)
    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:314)
    at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:298)
    at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:116)
    at jp.co.intra_mart.system.log.transition.TransitionLogRequestDispatcher.forward(TransitionLogRequestDispatcher.java:65)
    at jp.co.intra_mart.system.router.jssp.JSSPDispatcher.forward(JSSPDispatcher.java:60)
    at jp.co.intra_mart.system.router.authz.user.jssp.AuthzJSSPAction.executeAuthorized(AuthzJSSPAction.java:34)
    at jp.co.intra_mart.system.router.authz.AuthorizingAction.doExecute(AuthorizingAction.java:52)
    at jp.co.intra_mart.foundation.router.GenericAction.execute(GenericAction.java:73)
    at jp.co.intra_mart.foundation.router.GenericAction.access$000(GenericAction.java:17)
    at jp.co.intra_mart.foundation.router.GenericAction$GenericActionFilterChain.doFilter(GenericAction.java:32)
    at jp.co.intra_mart.foundation.servlet.router.filter.CorsActionFilter$CorsActionFilterScope.execute(CorsActionFilter.java:46)
    at jp.co.intra_mart.system.cors.servlet.filter.StandardCorsController.execute(StandardCorsController.java:111)
    at jp.co.intra_mart.foundation.servlet.router.filter.CorsActionFilter.doFilter(CorsActionFilter.java:59)
    at jp.co.intra_mart.foundation.router.GenericAction.execute(GenericAction.java:66)
    at jp.co.intra_mart.foundation.router.GenericAction.execute(GenericAction.java:71)
    at jp.co.intra_mart.foundation.router.GenericAction.execute(GenericAction.java:62)
    at jp.co.intra_mart.system.router.BasicRouter.route(BasicRouter.java:144)
    at jp.co.intra_mart.system.router.IntramartRouter.route(IntramartRouter.java:145)
    at jp.co.intra_mart.system.router.DebugRouter.route(DebugRouter.java:52)
    at jp.co.intra_mart.system.router.IntramartComplexRouter.route(IntramartComplexRouter.java:74)
    at jp.co.intra_mart.foundation.router.RoutingFilter.doFilter(RoutingFilter.java:38)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.foundation.security.filter.SessionFilter.doFilter(SessionFilter.java:70)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.log.transition.TransitionLogFilter.doFilter(TransitionLogFilter.java:73)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.servlet.filter.RequestLogFilter.doFilter(RequestLogFilter.java:110)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.servlet.filter.ResponseHeaderFilter.doFilter(ResponseHeaderFilter.java:154)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.system.context.web.impl.ContextFilter.doContextFilter(ContextFilter.java:141)
    at jp.co.intra_mart.system.context.web.impl.PreContextFilterChain.doFilter(PreContextFilterChain.java:47)
    at jp.co.intra_mart.system.context.web.impl.ContextFilter.doFilter(ContextFilter.java:80)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.foundation.security.filter.ResponseCharacterEncodingFilter.doFilter(ResponseCharacterEncodingFilter.java:90)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at jp.co.intra_mart.foundation.security.filter.RequestCharacterEncodingFilter.doFilter(RequestCharacterEncodingFilter.java:47)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
    at org.seasar.struts.portlet.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:45)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:71)
    at org.seasar.struts.portlet.filter.HotdeployFilter.doFilter(HotdeployFilter.java:45)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
    at com.caucho.server.webapp.WebAppListenerFilterChain.doFilter(WebAppListenerFilterChain.java:114)
    at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:156)
    at com.caucho.server.webapp.AccessLogFilterChain.doFilter(AccessLogFilterChain.java:95)
    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:314)
    at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:843)
    at com.caucho.network.listen.TcpSocketLink.dispatchRequest(TcpSocketLink.java:1395)
    at com.caucho.network.listen.TcpSocketLink.handleRequest(TcpSocketLink.java:1351)
    at com.caucho.network.listen.TcpSocketLink.handleRequestsImpl(TcpSocketLink.java:1335)
    at com.caucho.network.listen.TcpSocketLink.handleRequests(TcpSocketLink.java:1243)
    at com.caucho.network.listen.TcpSocketLink.handleAcceptTaskImpl(TcpSocketLink.java:1037)
    at com.caucho.network.listen.ConnectionTask.runThread(ConnectionTask.java:117)
    at com.caucho.network.listen.ConnectionTask.run(ConnectionTask.java:93)
    at com.caucho.network.listen.SocketLinkThreadLauncher.handleTasks(SocketLinkThreadLauncher.java:175)
    at com.caucho.network.listen.TcpSocketAcceptThread.run(TcpSocketAcceptThread.java:61)
    at com.caucho.env.thread2.ResinThread2.runTasks(ResinThread2.java:173)
    at com.caucho.env.thread2.ResinThread2.run(ResinThread2.java:118)
Caused by: java.lang.NoClassDefFoundError: javax/validation/spi/ConfigurationState
    at jp.co.intra_mart.product.collaboration.core.internal.validation.ValidationActionExcute.<init>(ValidationActionExcute.java:41)
    at jp.co.intra_mart.product.collaboration.core.internal.validation.ValidationActionExcute.<clinit>(ValidationActionExcute.java:36)
    at jp.co.intra_mart.product.collaboration.core.internal.validation.ValidationUtility.validate(ValidationUtility.java:913)
    at jp.co.intra_mart.product.collaboration.schedule.internal.service.PersonalSettingServiceImpl.findDisplaySetting(PersonalSettingServiceImpl.java:184)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at jp.co.intra_mart.product.collaboration.core.service.Services$LoggingInvocationHandler.invoke(Services.java:59)
    at com.sun.proxy.$Proxy255.findDisplaySetting(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at jp.co.intra_mart.product.collaboration.core.internal.javascript.ServiceResultInvoker.invoke(ServiceResultInvoker.java:38)
    at jp.co.intra_mart.system.javascript.ServiceWrapper$Function.callOrConstruct(ServiceWrapper.java:261)
    at jp.co.intra_mart.system.javascript.VarargsFunction.delegate(VarargsFunction.java:45)
    at sun.reflect.GeneratedMethodAccessor198.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at jp.co.intra_mart.system.javascript.MemberBox.invoke(MemberBox.java:126)
    at jp.co.intra_mart.system.javascript.FunctionObject.call(FunctionObject.java:385)
    at jp.co.intra_mart.system.javascript.VarargsFunction.call(VarargsFunction.java:50)
    at jp.co.intra_mart.system.javascript.Interpreter.interpretLoop(Interpreter.java:1473)
    at jp.co.intra_mart.system.javascript.Interpreter.interpret(Interpreter.java:815)
    at jp.co.intra_mart.system.javascript.InterpretedFunction.call(InterpretedFunction.java:109)
    at jp.co.intra_mart.system.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
    at jp.co.intra_mart.system.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3101)
    at jp.co.intra_mart.system.javascript.InterpretedFunction.call(InterpretedFunction.java:107)
    at jp.co.intra_mart.system.display.ScriptScope.call(ScriptScope.java:156)
    at jp.co.intra_mart.system.session.web.WebPageBuilder.invoke(WebPageBuilder.java:252)
    at jp.co.intra_mart.system.session.web.WebPageBuilder.invoke(WebPageBuilder.java:126)
    ... 100 more
Caused by: java.lang.ClassNotFoundException: javax.validation.spi.ConfigurationState (in EnvironmentClassLoader[web-app:production/webapp/default/imart])
    at com.caucho.loader.DynamicClassLoader.loadClass(DynamicClassLoader.java:1560)
    at com.caucho.loader.DynamicClassLoader.loadClass(DynamicClassLoader.java:1530)
    ... 132 more

ClassNotFoundExceptionが出ていることから、クラスが足りていないことが原因。

なおかつ、 javax.validation.spi.ConfigurationStateと言われているので、validation系のクラスが足りないようだ。

対応としては、jugglingのモジュール選択にてサードパーティ製ライブラリの「Hibernate Validater」を追加すること。

f:id:aposke:20200603104453p:plain

このwarを再度デプロイしたところ、エラーが解消された。

今回のケースでは、既にある環境に途中からCollaborationを足したのだが、その場合にこのライブラリが漏れてしまうことがある模様?である。

intra-mart開発の現場でよく使うAPIまとめ

intra-mart開発は、一般的にJava開発の知識があればさほど難しいものではありません。

ただ、intra-mart開発に必要なノウハウとしては以下のようなものが挙げられます。

  • 製品機能の仕組みの理解(JugglingとかResinとかeBuilderとか)
  • 標準機能でできる範囲/できない範囲の判断(TableMaintenanceとかViewCreatorとかLogicDesignerとか)
  • 製品内で可能な設定の範囲の理解
  • どのようなAPIがあるのか

今回は、APIのうち「これは現場で使う。」というものをピックアップしたいと思います。

これからintra-mart開発を始めます、という方も、ファーストステップとして「こんなAPIがあるのか」というのを一通り見て、頭の片隅に置いておくことは大切かと思います。

APIでできるのに、自前で実装しては効率が落ちてしまいますからね。

というわけで入門向けでもあり、経験者は復習を兼ねて。

CSJS

intra-mart Accel Platform Client Side JavaScript API - Index

imuiAjaxSend

Ajaxリクエストを送信することができます。CSJS上でサーバ処理呼びたい時に。

コールバック関数を指定することも可能です。imuiTransitionToErrorPageを使うとエラー時の画面遷移もできます。

→APIページ

imuiValidate

入力チェックを実装できます。入力要素の下にエラーメッセージを表示してくれます。必須、型、範囲などの基本的なチェックであればこれで実行できます。

→APIページ

imuiConfirm

はい、いいえを確認するダイアログを表示します。標準のConfirmでも良いのですが、intra-mart風のUIに統一できます。

→APIページ

imuiShowSuccessMessage

画面の上部にふわーっと浮き出るメッセージを表示します。

Success:成功(緑)、Warning:警告(黄色)、Error:エラー(赤)の3種あり。

→APIページ

CSS

見出し

intra-mart風の見た目に統一する場合、タイトルバー関連はよく使います。

https://www.intra-mart.jp/apidoc/iap/imui-css-doc/html/heading.html

テーブル

こちらもintra-mart風のテーブルレイアウトにする場合は利用します。

https://www.intra-mart.jp/apidoc/iap/imui-css-doc/html/table.html

フォーム

フォームの入力項目をintra-mart風のUIに統一する場合。必須チェックなども付けられます。

https://www.intra-mart.jp/apidoc/iap/imui-css-doc/html/form.html

ボタン

intra-mart風のボタンUIにする場合。

https://www.intra-mart.jp/apidoc/iap/imui-css-doc/html/button.html

html/jspタグ

スクリプト開発 intra-mart Accel Platform Tag Documentation

JavaEE開発 https://www.intra-mart.jp/apidoc/iap/apilist-jsp-tagdoc/doc/index.html

hidden

リクエスト用の隠し項目。

通常のhiddenタグを使っても良いのですが、1タグで複数個の同時指定ができることが特徴です。

スクリプト開発モデルのみ。JavaEEフレームワークに合わせたものを使いましょう。

→APIページ

picture

ストレージ上にある画像を表示する時に使います。画像をWebサーバに配置したくない場合に。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-jssp-tagdoc/doc/imart_tag_api/picture/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/apilist-jsp-tagdoc/doc/pc/imuiPicture/index.html

string

指定した変数を文字列として出力します。データをラベルとして表示する場合などに。

スクリプト開発モデルのみ。JavaEEフレームワークに合わせたものを使いましょう。

→APIページ

condition

条件を満たす場合にタグ内の処理が実行されます。true or falseの指定。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-jssp-tagdoc/doc/imart_tag_api/condition/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/apilist-jsp-tagdoc/doc/standard/condition/index.html

desicion

条件を満たす場合にタグ内の処理が実行されます。任意の値と等しいかどうかの判定。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-jssp-tagdoc/doc/imart_tag_api/decision/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/apilist-jsp-tagdoc/doc/standard/decision/index.html

repeat

タグ内の処理を繰り返します。SELECTした結果を一覧出力する場合などに利用。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-jssp-tagdoc/doc/imart_tag_api/repeat/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/apilist-jsp-tagdoc/doc/standard/repeat/index.html

imACMSearch

ユーザや組織など、IM共通マスタ系の検索画面を表示できます。

これはポップアップ版で、他に画面内ダイアログ版(imACMSearchDialog)があります。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-jssp-tagdoc/doc/imart_tag_im_master_api/imACMSearch/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/apilist-jsp-tagdoc/doc/im_master/imACMSearch/index.html

imuiButton

IM標準の見た目をしたボタンです。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-jssp-tagdoc/doc/pc/imuiButton/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/apilist-jsp-tagdoc/doc/pc/imuiButton/index.html

imuiCalendar

日付入力アイテムに、カレンダーから入力させるためのアイテムです。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-jssp-tagdoc/doc/pc/imuiCalendar/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/apilist-jsp-tagdoc/doc/pc/imuiCalendar/index.html

imuiDialog

画面内のモーダルダイアログを生成できます。確認メッセージや、何かの情報の詳細表示など。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-jssp-tagdoc/doc/pc/imuiDialog/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/apilist-jsp-tagdoc/doc/pc/imuiDialog/index.html

imuiListTable

IM標準のテーブルです。ソート機能やページング機能などが標準でついています。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-jssp-tagdoc/doc/pc/imuiListTable/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/apilist-jsp-tagdoc/doc/pc/imuiListTable/index.html

サーバサイドAPI

isNull

値がNullかどうかを判定できます。スクリプト開発のみ。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/GlobalFunction/index.html#method-isNull_13

isUndefined

値がundefinedかどうかを判定できます。スクリプト開発のみ。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/GlobalFunction/index.html#method-isUndefined_18

Client

セッションに値を格納したい時に使います。スクリプト開発用。JavaEEでは標準のセッションオブジェクトを使いましょう。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/Client/index.html

Contexts

実行ユーザのIDを取得したい、ロールを取得したいなど、主にアカウントコンテキストを取得するために使います。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/Contexts/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/javadoc/all-dev_apidocs/jp/co/intra_mart/foundation/context/Contexts.html

JavaEEでアカウントコンテキストを取得する例

AccountContext accountContext = Contexts.get(AccountContext.class);

Debug

スクリプト開発のみ。開発時に非常にお世話になるであろうAPIです。Debug.browseを使うと引数に入れた変数の中身を画面表示します。

バッチ処理など画面がない場合は、Debug.consoleを使いましょう。

https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/Debug/index.html

Identifier

ユニークなIDを生成したい場合に使います。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/Identifier/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/javadoc/all-dev_apidocs/jp/co/intra_mart/foundation/service/client/information/Identifier.html

Logger

標準ログに出力したいときに使います。warn,errorなどのログレベルを設定できます。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/Logger/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/javadoc/all-dev_apidocs/jp/co/intra_mart/common/platform/log/Logger.html

TenantDatabase

テナントデータベースに接続するときに使います。データベース操作は基本コレ。

シェアードデータベースはテナントをまたがって共通で使えるもので、使うかは用途によります。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/TenantDatabase/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/javadoc/all-dev_apidocs/jp/co/intra_mart/foundation/database/TenantDatabase.html

PublicStorage

ストレージのファイルに読み書きをするときに使います。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/PublicStorage/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/javadoc/all-dev_apidocs/jp/co/intra_mart/foundation/service/client/file/PublicStorage.html

SessionScopeStorage

セッションスコープの一時的なストレージで、セッションと共に消えます。ファイル操作中の一時的な格納などに。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/SessionScopeStorage/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/javadoc/all-dev_apidocs/jp/co/intra_mart/foundation/service/client/file/SessionScopeStorage.html

Module.download

ファイルダウンロードを行うためのAPIです。この処理を走らせると、そこで処理が終了します。

https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/Module.download/index.html

JavaEEの場合は、IMResponseUtilが利用できます。

https://www.intra-mart.jp/apidoc/iap/javadoc/all-dev_apidocs/jp/co/intra_mart/framework/extension/seasar/struts/util/IMResponseUtil.html

AccountInfoManager

アカウント情報を操作するAPI。ロールやパスワードの取得・設定、アカウントの登録・削除など。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/tenant/AccountInfoManager/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/javadoc/all-dev_apidocs/jp/co/intra_mart/foundation/admin/account/AccountInfoManager.html

IMMUserManager

IM-共通マスタのユーザ(ユーザ名など)を操作するためのAPI。この他に組織、パブリックグループなどがあります。

スクリプト開発 https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/im_master/IMMUserManager/index.html

JavaEE https://www.intra-mart.jp/apidoc/iap/javadoc/all-dev_apidocs/jp/co/intra_mart/foundation/master/user/UserManager.html

まとめ

以上、intra-mart開発において有用なAPIのまとめでした。

数ある中の一部のみを抜粋していますので、「こんな処理したいな」というのがあったらまずはAPI見たり、検索してみることをお勧めします。

よりよいintra-mart開発ライフが送れますように。

【はてなブログ独自ドメイン】Google Adsenseのads.txtに対応した話【サーバ追加なし】

以前の記事で、独自ドメインにてGoogle Adsenseに合格したことを書きました。

www.tachi-machi.net

まもなくして、アドセンスの画面に以下のようなads.txtの警告が表示されました。

要注意 – 収益に重大な影響が出ないよう、ads.txt ファイルの問題を修正してください。

調べてみると、はてなブログのルートドメインにもads.txtは配置されていないため特に対応しなくとも問題はない…とのQAがあり。

その他には、Webサーバを追加で設置してads.txtを対応するような解もあり。

対応必須かわからないけど警告は消したいし、かといってads.txtのためだけに追加で1サーバ立てる気はない

そこで今回、AWSを用いてads.txtを設置し、ads.txtを認識させることに成功したので共有します。

構成図

今回構成したのは、以下のような構成です。

f:id:aposke:20200517170023p:plain

www付きは直接はてなブログへ。

wwwなし(apexドメイン)はCloudFront、およびS3を経由してはてなブログへ。

CloudFront経由にする構成の設定については、以下の記事を参照ください。

www.tachi-machi.net

このS3内にads.txtを配置し、リダイレクトルールにて

  • ads.txtだったらS3に配置してあるads.txtを表示
  • それ以外ははてなブログのアドレス(www付き)にリダイレクト

という設定としています。

実際のリダイレクト設定ルールについて、下記に載せておきます。

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>ads.txt</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <HostName>s3.amazonaws.com</HostName>
      <ReplaceKeyWith>tachi-machi.net/ads.txt</ReplaceKeyWith>
    </Redirect>
  </RoutingRule>
  <RoutingRule>
    <Redirect>
      <HostName>www.tachi-machi.net</HostName>
      <ReplaceKeyWith/>
    </Redirect>
  </RoutingRule>
</RoutingRules>

S3を静的Webサイトとして使うことで、追加サーバ構築の手間を省いています。

よほどアクセスの多いサイトでなければCloudFrontの料金はかかりませんし、S3についてもサイズが小さいので金額は微小です。

参考になれば幸いです。

【はてなブログ独自ドメイン】Google Adsense審査合格までの道のり

2ヵ月ほど前に当ブログを独自ドメインに変更しました。

それまで、はてなブログドメインadsenseの審査は合格していたので、新しいドメインで再度申請することに。

しかし、合格しない…

審査側から送られてくるメッセージは以下。

サイトの停止または利用不可

お客様のサイトが停止しているか、利用できないことが判明いたしました。...

もちろん、URLを打ったらブログは出てきます。

ブログの詳細設定にて、headタグ要素にadsense審査用のコードも張り付けてある。はて…

結論

私のケースの場合は、ブログのテーマが問題でした。

現在使っているテーマは、カスタムテーマの「DUDE」。

DUDE - テーマ ストア

独自ドメインにする前は同じくカスタムテーマの「Brooklyn」を使っており、 そちらに戻して申請をしたところ、合格しました。

Brooklyn - テーマ ストア

その他に試したこと、経緯

  • ブログアドレスをapexドメインに設定していたが、www付のドメインでもアクセスできるようURL正規化した →特に効果なし(不合格)
  • adsense申請時のドメインについて、サブドメインにwww付を追加した →特に効果なし(不合格)
  • ブログアドレスをapexドメインからwww付きのドメインに変更した →特に効果なし(不合格)
  • ブログのテーマをDUDEからBrooklynに変更した →合格

参考になれば幸いです。

独自ドメインでのapex(ネイキッド)ドメインへのアクセスを正規化する【AWS利用】

当方の環境

はてなブログ

ドメインはRoute53で取得

ドメイン「tachi-machi.net」を取得し、独自ドメインに設定した。

http://tachi-machi.net

https://tachi-machi.net

これで、上記のURLでアクセスできることは確認できた。

www.tachi-machi.net

続いて、次のURLも同じページに遷移するようにURLを正規化したい。

http://www.tachi-machi.net

https://www.tachi-machi.net

S3の静的Webサイトホスティングでリダイレクト(httpのみの場合)

1. 新規バケットの作成

S3に新しくバケットを作成する。名前は「www.tachi-machi.net」。

バケットは公開設定としておく。

2. 静的Webサイトホスティングを設定

バケットのプロパティの「Static website hosting」を設定。

「リクエストをリダイレクトする」にチェックし、ターゲットバケットまたはドメインに飛ばしたい先「tachi-machi.net」を、プロトコルに「https」を指定

3. Route53のAレコード設定をS3に向ける

Route53のホストゾーンにレコードセットを作成。

www.tachi-machi.netのAレコードを作成し、エイリアスに「はい」を選択、先ほど作成したS3のバケットを指定する。

以上で、「http://www.tachi-machi.net」にアクセスした際に正常にリダイレクトされる。

しかしこれはhttpのみの対応…

この静的Webサイトホスティングはhttpにしか対応していないため、まだ「https://www.tachi-machi.net」にアクセスした際はページが見つからない状態である。

そこで、CloudFrontを経由してhttps対応する方法を取る。

CloudFrontを経由したリダイレクト

1. S3のバケットにindex.htmlを作成

0バイトの空ファイルで良いので、先ほどのS3バケットにindex.htmlを作成する。

アクセス権は公開としておく。

2. Webサイトホスティングの設定を変更

先ほどは「リクエストをリダイレクトする」を選んでいたが、「このバケットを使用してウェブサイトをホスティングする」に変更。

インデックスドキュメントに「index.html」を指定

リダイレクトルールには以下を記述する。

<RoutingRules>
  <RoutingRule>
    <Redirect>
      <HostName>tachi-machi.net</HostName>
      <ReplaceKeyWith/>
    </Redirect>
  </RoutingRule>
</RoutingRules>

また、この画面に書いてあるエンドポイントをコピーしておくこと

3. SSL証明書の取得

AWS Certificate Managerより、SSL証明書を発行する。

申請時のドメインは「*.tachi-machi.net」とした。

検証についてはDNSのCNAMEを確認する方法で、Route53の場合はボタンを押すだけで勝手にCNAMEのレコードが差し込まれる。

数分も立たずに発行済みとなった。

4. CloudFrontのディストリビューション作成

CloudFrontから新規にWebのディストリビューションを作成する。

Originドメイン名には一覧から選択できるS3バケットではなく、先ほどのS3エンドポイントのURLを入力。(S3バケット指定してしまうと、httpsで来た場合にS3にもhttpsアクセスしようとし、アクセス拒否となる。エンドポイントのURLを入力すると、OriginへのHTTP onlyが設定される)

Viewer Protocol Policyは「Redirect HTTP to HTTPS」を選択

Alternateドメイン名(CNAMEs)に「www.tachi-machi.net」を指定

SSL証明書に先ほど作成したACMの証明書を指定。

Default Root Objectに「index.html」を指定。(これがないとCloudFrontがファイル見つかりませんのエラーを返す)

5. Route53のAレコード設定をCloudFrontに向ける

www.tachi-machi.netのAレコードを編集または作成し、エイリアスに「はい」を選択、先ほど作成したCloudFrontを指定する。

終わり!

以上で、「http://www.tachi-machi.net」および「https://www.tachi-machi.net/」にアクセスした際に正常にリダイレクトされた。

まとめ:仕組みの整理

https apexドメインの場合:Route53 DNSのAレコード設定によりはてなブログのアドレスへ。

http apexドメインの場合:上記に同じ。http→httpsはてなブログがよろしくやってくれている。通常はApache等で内部的に301リダイレクトをかける。

https www付きの場合:Route53 DNSのAレコードでCloudFrontへ → (httpに変換され)S3エンドポイントへ → apexドメインへリダイレクト

http www付きの場合:上記に同じ。

追記:www付きをブログのメインドメインに変更した。

Apexドメイン側にファイルを配置したい関係で、www付きを本ブログのURLとした。

はてなブログドメイン名を変更し、www付きを正規とする

DNS側のwww付きをCNAMEでhatenablog.comへ渡すよう変更(はてなブログ公式手順の通り)

・S3側はapexドメインバケットを新しく作成

・CloudFrontからは、apexドメインのS3に遷移するようにし、CNAMEもapexドメインに変更する

PostgreSQLで特定のテーブルが応答しない

PostgreSQL9.4にて。

特定のテーブルに対するクエリが返ってこない。countすら返ってこない。

pgAdminでテーブルを参照しようとすると、テーブル名をクリックした時点で固まるという始末。

今回のケースではテーブルロックが関与していた。

1. テーブルのロック状況を調べる

select * from pg_stat_activity;

上記のSQLで、実行中のクエリ状況がわかる。右端のquery列でどんなクエリか判別できる。

「waiting」列が「t」になっているものは、待たされているクエリ。まずそれが存在していないかチェック。

加えて、その応答しないテーブルにアクセスしているクエリがないかチェック。query_startに開始時間も書いてあるので照らし合わせながら、長時間残っているような怪しいクエリを探す。見つけたらpidを控え、次のSQLでロック解除する。

2. ロック解除(クエリをキャンセル)する

select pg_cancel_backend(pid);

以上で、応答しなかったテーブルに無事アクセスできるようになった。

intra-mart AccelPlatformでwar入れ替えせずにモジュール追加する方法

iAPにおいて、何かのモジュールを追加したい、となったとき。

アプリケーションやエクステンションの追加など、大きな変更の場合は正式作業としてwar入れ替えを行えばいいが、軽微な変更の場合にいちいちwarを入れ替えるのは面倒くさい

例えば認可のExcelインポートエクスポートを追加したいとか、テーマカスタマイズモジュールを追加したいとか、IM-Noticeを追加したいとか…。

warを入れ替えてしまうとログが消えるのと、直接書き換えていた設定ファイルや追加したソースなどが全て元に戻るため、影響調査が大変なのだ。(それも含めてちゃんとjugglingで管理しとくのが筋なのだが…現場はそうではない)

そこで、warを入れ替えずにモジュール追加するにはどうすれば良いか。

結論から言うと、「差分を抽出して適用する」というのが賢いやり方だ。

手順1. 変更前のwarを取得し、解凍する

現行のwarファイルを取得する。

warファイルの拡張子をzipに変更し、解凍しておく。

手順2. 変更後のwarファイルを作成、解凍する

jugglingツールにて、モジュールを追加したwarファイルを作成する。

作成したwarは同じく拡張子をzipに変更し、解凍しておく。

手順3. 比較する

変更前の解凍フォルダと変更後の解凍フォルダをWinMerge等の比較ツールで比較する。

結果、変更された差分が出力される。→これらが適用すれば良い差分となる。

※Webサーバがある場合、静的ファイル(WEB-INFの外)も忘れずにWebサーバに適用すること。

※WEB-INF直下のjuggling.ほにゃららも差分として出るが、必要なので忘れずに適用すること。

手順4. 比較結果を抽出する

この差分をどのように抽出すれば良いか。やり方は様々あると思うが、私が行っているのはWinMergeを使い、以下の通り。

1. WinMergeの結果を比較結果でソート

2. 変更点のある行だけShift+クリック等で選択

3. 右クリック>コピー>左を...(または右を...)

4. 任意のフォルダに出力

手順5. 環境に反映する

Resinを停止し、抽出したファイルを反映して、Resinを起動する。

必要に応じてテナント環境セットアップなどを行うこと。

以上。