metaclass: (Default)
[personal profile] metaclass
[livejournal.com profile] artureg
скриншот без 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] kometa_zxc которая все это деплоит:
"у артурега ИМХО инструкция проще, но пары команд не хватает
и телодвижений меньше"

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

у айседа то же самое: молча пропускает, в логах нет информации никакой, отчета не видно. пропустил - в логе сообщение "Report must have name"

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 работает от входа. Артуреговое я пока не запустил, т.к. он использует для передачи параметров POST и в нем json с параметрами.
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-ответа еще и стек трейс от сервера есть.

Date: 2012-02-07 11:48 am (UTC)
From: [identity profile] theiced.livejournal.com
ну что мы видим.

1. у ортруро кэйссенсетив конфиг. ну то есть совсем. <parameter /> мы не умеем. <Parameter name="хуй"/> не будет матчить параметр Хуй итд. как обычно в жабомире - не софт для человека, а человек для софта. если что - в руби это делалось специально. иначе можно было бы убрать половину кода и заиспользовать аля-жабо-с-аннотациями классы вида (псевдокод, не помню какие там есть либы и какой у них синтаксис):

class Report
  include XML::Serializeable

  xml_attribute :name
  xml_attribute :label
end


нахуй.

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).

Date: 2012-02-07 11:51 am (UTC)
From: [identity profile] artureg.livejournal.com
1. а ты в очередной раз закатил солнце руками, и написал свой парсер - молодца
2. опционально
3. хуита, конфиг один
4. так и должно быть
5. json-rpc да, это ок и крутяк
6. проверки и на клиенте и на сервере

Date: 2012-02-07 12:17 pm (UTC)
From: [identity profile] theiced.livejournal.com
1. не писал. используется rexml и xml_simple сверху. а вот потом уже распаршенное обрабатывается.
2. но нету.
3. я там насчитал штук 7-8 хымыылей.
4. да. в индожабе так должно быть и есть.
5. ок, для индусов ок.
6. угу. тока там метакласс ввёл строку в интовое поле и оно выплюнуло клиенту стектрейс.

Date: 2012-02-07 12:18 pm (UTC)
From: [identity profile] theiced.livejournal.com
[3:17:01 PM FET] Metaclass: {"debug":null,"error":{"code":103,"message":"Incorrect number format","name":"by.artureg.so.ex.SoException","stack":"by.artureg.so.ex.SoException: Incorrect number format\n\tat by.artureg.so.dl.SoDao.request(SoDao.java:68)\n\tat by.artureg.so.dl.SoService.runReport(SoService.java:22)\n\tat by.artureg.so.smd.SmdService.runReport(SmdService.java:28)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)\n\tat java.lang.reflect.Method.invoke(Method.java:597)\n\tat org.apache.struts2.json.JSONInterceptor.invoke(JSONInterceptor.java:246)\n\tat org.apache.struts2.json.JSONInterceptor.intercept(JSONInterceptor.java:133)\n\tat com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)\n\tat org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)\n\tat org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:510)\n\tat org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)\n\tat org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)\n\tat org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)\n\tat org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)\n\tat org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)\n\tat org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)\n\tat org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)\n\tat org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)\n\tat org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)\n\tat org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)\n\tat org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)\n\tat org.mortbay.jetty.Server.handle(Server.java:324)\n\tat org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)\n\tat org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)\n\tat org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:648)\n\tat org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)\n\tat org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)\n\tat org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)\n\tat org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)\n"},"id":"5","result":null}
[3:17:09 PM FET] Metaclass: содомиты)

Date: 2012-02-07 12:29 pm (UTC)
From: [identity profile] artureg.livejournal.com
жсон со стек трейсом

Date: 2012-02-07 12:40 pm (UTC)
From: [identity profile] theiced.livejournal.com
отлично. взломщики радостно потирают руки.

Date: 2012-02-07 12:40 pm (UTC)
From: [identity profile] artureg.livejournal.com
ну взломай :)

Date: 2012-02-07 12:49 pm (UTC)
From: [identity profile] theiced.livejournal.com
мне тошно на это смотреть.

Date: 2012-02-07 12:49 pm (UTC)
From: [identity profile] artureg.livejournal.com
пиши дальше поделки на рубискрипте из трёх строчек

Date: 2012-02-07 12:51 pm (UTC)
From: [identity profile] theiced.livejournal.com
за которые платят в разы больше чем за пионерскую говножабу.

Date: 2012-02-07 12:53 pm (UTC)
From: [identity profile] artureg.livejournal.com
в среднем - нет :)

Date: 2012-02-07 01:00 pm (UTC)
From: [identity profile] permea-kra.livejournal.com
Средняя температура по больнице кого-то волнует?

Date: 2012-02-07 01:00 pm (UTC)
From: [identity profile] artureg.livejournal.com
всех

Date: 2012-02-07 01:27 pm (UTC)
From: [identity profile] theiced.livejournal.com
индусиков типа ортура. он же получает как раз среднюю.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 21st, 2025 03:39 pm
Powered by Dreamwidth Studios