Entry tags:
Special Olympics - артурег
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
скриншот без js
скриншот с js
скриншот отчета
работает!
Значит, что по поводу решения на java:
1) Вчера коллективом из N человек разбирались "как поставить нужную жабу на убунту 10.04"
вот результат: https://operden.googlecode.com/svn/trunk/howtoinstall.txt
2) Первая же команда не работает - нужно сначала выполнить sudo apt-get install python-software-properties . Если бы не вчерашний деплоймент айседовской опердени и наличие в нем nodejs требующего этой же команды для инсталляции, или же гугла - в жизнь бы не нашли, т.к. add-apt-repository и python-software-properties в здравом уме между собой увязать сложно.
3) В итоге, деплоймент (по уже проверенной инструкции, которую вчера составлял коллектив из нескольких гуру) занял гораздо меньше времени, заодно без отсылок на сторонние сайты. Впрочем, инструкция все равно рассчитана на гуру, не подробная. Отзыв
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
"у артурега ИМХО инструкция проще, но пары команд не хватает
и телодвижений меньше"
4) факап номер раз:
>ps aux | grep java root 4038 0.4 16.7 293380 85276 pts/0 Sl+ 10:27 0:09 /usr/lib/jvm/java-6-sun/bin/java -classpath /usr/share/maven2/boot/classworlds.jar -Dclassworld s.conf=/usr/share/maven2/bin/m2.conf -Dmaven.home=/usr/share/maven2 org.codehaus.classworlds.Launcher "jetty:run"
web-приложение запущено от root. Впрочем, для одноразового демо-приложения может и пойдет, но паранойя визжит.
Далее: что у артурега, что у айседа корни веб-приложений отдают всякую тяжелую неведомую ебаную хуйню, кто со стек-трейсами, кто еще с чем. Ну стек-трейсы отключаются само собой, переводом в продакшен режим(приложения оба запущены в development моде). Но в корень я бы все таки положил index.html со ссылкой на приложение, потому что пользователи(в т.ч. и я) инструкций где указано открыть конкретный url - не читают.
5) ошибки xml конфига с отчетами: у айседа показывает что "отчетов не найдено" с выводом в лог, у артурега - "ParseError at [row,col]:[46,5] Message: Element type "re" must be followed by either attribute specifications, ">" or "/>"."
6) формально валидный xml, но без атрибута name:
Unable to satisfy @org.simpleframework.xml.Attribute(name=, empty=, required=true) on field 'name' private java.lang.String by.artureg.so.conf.Report.name for class by.artureg.so.conf.Report at line 45
7) Формально валидный но не до конца заполненный xml, окно с фразой "null" и трейс в логе:
<report name="test1"> <sql>select * from test where id<:id</SQL> <Parameters> <parameter name="id" type="integer" /> </Parameters> </report> 2012-02-07 11:55:15,075 ERROR org.apache.struts2.json.rpc.RPCError.error:38 - java.lang.NullPointerException at by.artureg.so.conf.Report.getFieldByName(Report.java:78) at by.artureg.so.dl.SoDao$1.mapRow(SoDao.java:80) at by.artureg.so.dl.SoDao$1.mapRow(SoDao.java:71) at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:92) at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:1) at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:649) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:662) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:702) at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:166) at by.artureg.so.dl.SoDao.request(SoDao.java:68) at by.artureg.so.dl.SoService.runReport(SoService.java:22) at by.artureg.so.smd.SmdService.runReport(SmdService.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.struts2.json.JSONInterceptor.invoke(JSONInterceptor.java:246) at org.apache.struts2.json.JSONInterceptor.intercept(JSONInterceptor.java:133) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:510) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) 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:726) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206) at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:324) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:648) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
8) ошибочно введенный параметр фильтра: строка в числе:
скриншот
валится в parseInt на стороне сервера.
Если ввести 1234.1 в строку для integer, то выводит сообщение "For input string: "1234.1""
9) Дефолтные значения даты-времени: скриншот. Это типа "начало и конец предыдущего месяца".
Первая ошибка здесь моя: надо было поставить формат времени HH:mm:ss.
Но даже после исправления все равно получается 01:00:00 и 00:59:59.
10) Еще баг даты времени: даже если исправить предыдущий и сделать запрос "включительно", т.е. <=, то параметр 23:59:59 не покажет событие, которое произойдет в 23:59:59.5 т.е. за полсекунды до конца месяца.
11) Айседное приложение из wget работает от входа.
wget --post-file=query.json "--header=Content-Type: application/json-rpc; charset=UTF-8" http://localhost:9090/so/smd/so.action
содержимое query.json:
"{"params":["datetime1",[{"name":"datetimevalb","value":1328047200000},{"name":"datetimevale","value":1330552799999}]],"method":"runReport","id":4}"
12) Если попросить у айседного сервиса json/xml/чорта лысого с помощью "header=Accept: text/xml" как завещает RESTful - оно или отдаст результат или скажет что не умеет такого.
У артурега - отдаст json в любом случае. Но! Если спросить ошибочно - ответит вместо json - html с ошибкой и стектрейсом.
Если же спросить "по другому" ошибочно: т.е. json валидный, а смысл его неправильный - то отдаст json с ошибкой). При этом все равно можно добится разного поведения (правильный ответ, ошибка в html, ошибка в json)) манипулируя параметрами.
13) неправильно введенный параметр даты времени вызывает невидимое исключение "undefined" в JavaScript, запрос не уходит, отчет остается открытым старый и единственное, где это видно - восклицательный знак возле поля ввода.
14) обновление по пункту 8:
оставливаем jetty
svn up
mvn install
mvn jetty:run
выводится сообщение "Invalid number format". Если глянуть на запрос в Firebug - внутри json-ответа еще и стек трейс от сервера есть.
no subject
1. у ортруро кэйссенсетив конфиг. ну то есть совсем. <parameter /> мы не умеем. <Parameter name="хуй"/> не будет матчить параметр Хуй итд. как обычно в жабомире - не софт для человека, а человек для софта. если что - в руби это делалось специально. иначе можно было бы убрать половину кода и заиспользовать аля-жабо-с-аннотациями классы вида (псевдокод, не помню какие там есть либы и какой у них синтаксис):
нахуй.
2. путь к конфигу жёстко задан. не понял пегеружается ли он при изменениях.
3. 10 хымыыль конфигов. миллиарды директорий с 10тью уровнями вложенности. я реально спрашивал у ортуро где там найти какой код. как его поправить - мне совсем страшно, я пытался и нихуя не понял. в рубях - config/database.yml, config/reports/*xml, app/controllers/reports_controller.rb, app/view/reports/*html.erb, app/assets/stylesheets/reports.css.cscc, app/assets/javascripts/reports.js.coffee, lib/reports. это щемто всё что надо, любой метакласс разберётся. рубиговнокод был написан расширяемым и всё такое (система плагинов для параметров ;]) ибо вот жопой сразу чувствовал что я его куда нить в реальный проект утащу.
4. ортурово поделие (как и любое жабо поделие) срёт стэктрейсы везде. на консоль, в логи, хтмл со стэктрейсом в ответ, жсон со стэктрейсом в ответ, жсон который на самом деле не жсон а хтмл со стэктрейсом в ответ. не удивлюсь если оно ещё стектрейсы рассылает смсками.
5. метакласс вон нашёл - апи понимает только json-rpc как post. тестировать из консольки очень приятно.
6. никаких проверок типов и прочей хуеты (из которой на 80% состоит руби код). тупо стэктрейсы (см. п.4).
no subject
2. опционально
3. хуита, конфиг один
4. так и должно быть
5. json-rpc да, это ок и крутяк
6. проверки и на клиенте и на сервере
no subject
2. но нету.
3. я там насчитал штук 7-8 хымыылей.
4. да. в индожабе так должно быть и есть.
5. ок, для индусов ок.
6. угу. тока там метакласс ввёл строку в интовое поле и оно выплюнуло клиенту стектрейс.
no subject
[3:17:09 PM FET] Metaclass: содомиты)
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject