metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-02-07 12:01 pm

Special Olympics - артурег

[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-ответа еще и стек трейс от сервера есть.

[identity profile] denisioru.livejournal.com 2012-02-07 11:41 am (UTC)(link)
select * from test where id
[Error: Irreparable invalid markup ('<:id</sql>') in entry. Owner must fix manually. Raw contents below.]

<lj-raw><sql>select * from test where id<:id</SQL></lj-raw>

поправьте если я не прав - но:
1) теги регистрозависимые
2) < невалидно. надо использовать &lt;

ЗЫ ебаная разметка
Edited 2012-02-07 11:43 (UTC)

[identity profile] metaclass.livejournal.com 2012-02-07 11:44 am (UTC)(link)
У артурега регистрозависимые, у айседа нет. Как более правильно - ну хз, абы сообщение об ошибке верно показывали (айсед показывает чуть лучше).
< там есть - это его ЖЖ заменил)

[identity profile] permea-kra.livejournal.com 2012-02-07 11:44 am (UTC)(link)
Он был абсолютно прав.

[identity profile] denisioru.livejournal.com 2012-02-07 11:45 am (UTC)(link)
в стандарте теги регистрозависимы. Так что XML невалидный.

[identity profile] artureg.livejournal.com 2012-02-07 11:46 am (UTC)(link)
да

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

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

[identity profile] theiced.livejournal.com 2012-02-07 11:49 am (UTC)(link)
утруждал. у меня там красивый хтмл на который красиво наложаться цсски. если будет нужно.

[identity profile] theiced.livejournal.com 2012-02-07 11:50 am (UTC)(link)
не не ребе - у меня тут тоже упадёт. хымыылька не распрасится - в лог уйдёт "can't parse xml".

у меня зато <parameter> <Parameter> итд в любых комбинациях работают.

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

[identity profile] theiced.livejournal.com 2012-02-07 11:53 am (UTC)(link)
http://metaclass.livejournal.com/661745.html?thread=11190769&style=mine#t11190769

не об этом. назовите мне ОДНУ причину не распарсить вот такое:

<report>
  <parameters>
    <PARAMETER NaMe="хуй" />
    <parameter name="ещё хуй" />
  </parameters>
</report>


опционально можно сказать в лог "ай яй яй" но это МОЖНО распарсить и НУЖНО распрасить. отмазки жабодрочеров-говноедов что их кривые говносериализаторы для пидорасов этого не умеют а руками писать они ничего не научились не канают.

[identity profile] denisioru.livejournal.com 2012-02-07 11:55 am (UTC)(link)
ну если твой XML парсер регистронезависимый то он замечательно это распарсит. Но большинство парсеров - как раз сделаны по стандарту.

[identity profile] denisioru.livejournal.com 2012-02-07 11:55 am (UTC)(link)


это вобщемто то же самое. Ну похоже ведь блеать! Чо он не догадается распарсить.
Edited 2012-02-07 11:56 (UTC)

[identity profile] artureg.livejournal.com 2012-02-07 11:56 am (UTC)(link)
на конкурсе по основам html наверняка займёт какое либо почётное место

[identity profile] artureg.livejournal.com 2012-02-07 12:02 pm (UTC)(link)
13: фиксед)

[identity profile] theiced.livejournal.com 2012-02-07 12:10 pm (UTC)(link)
у ортуро ЭТО не парсится. у меня парсится. парсер у мен регистрозависимый, как любой хымыыль парсер, других нет. но вот то что парсер выплюнул можно обработать.

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

[identity profile] theiced.livejournal.com 2012-02-07 12:18 pm (UTC)(link)
[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: содомиты)

[identity profile] theiced.livejournal.com 2012-02-07 12:19 pm (UTC)(link)
жабософт, ожидаемо, работает по разному на разных платформах.

[identity profile] artureg.livejournal.com 2012-02-07 12:28 pm (UTC)(link)
это жабаскрипт

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

[identity profile] theiced.livejournal.com 2012-02-07 12:39 pm (UTC)(link)
у меня жабоскрипт работает одинаково. и у меня его раз в 5 меньше.

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

[identity profile] artureg.livejournal.com 2012-02-07 12:40 pm (UTC)(link)
у меня 164 строчки жабоскрипта, они у меня интерфейс делают

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

[identity profile] theiced.livejournal.com 2012-02-07 12:48 pm (UTC)(link)
потому что ты индус.

40 строк, получают данные и плюют их в нужный див. и календарики ещё.

Page 2 of 3