Blog head img
ODFToolkit (dude 2017-09-13 21:27:17 Программирование)

Вот интересно:

У org.odftoolkit.simple.style.Font  не работает метод setSize у уже существующх стилей.
При добавлении строк в таблицу , криво отрабатывают методы  appendRows и insertRows


Было  бы здорово как то это поправить и закинуть в апач репозиторий.

сайт с рецептами (dude 2017-09-08 21:45:31 Еда)

http://andychef.ru/recipes/cheese-mango/

Отображение запросов Hibernate к СУБД (dude 2017-09-02 18:24:09 Программирование)
На днях в очередной раз достали огромные запросы с параметрами
select * from person where type in(?, ?, ?)

гугление показало следующие варианты лечения

1) Логирование через Log4j
это самый правильный и нативный способ отображения значений в очереди
https://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-log4j/
 результат
Hibernate: INSERT INTO mkyong.stock_transaction (CHANGE, CLOSE, DATE, OPEN, STOCK_ID, VOLUME)
VALUES (?, ?, ?, ?, ?, ?)
13:33:07,253 DEBUG FloatType:133 - binding '10.0' to parameter: 1
13:33:07,253 DEBUG FloatType:133 - binding '1.1' to parameter: 2
13:33:07,253 DEBUG DateType:133 - binding '30 December 2009' to parameter: 3
13:33:07,269 DEBUG FloatType:133 - binding '1.2' to parameter: 4
13:33:07,269 DEBUG IntegerType:133 - binding '11' to parameter: 5
13:33:07,269 DEBUG LongType:133 - binding '1000000' to parameter: 6
Очевидные недостатки: огромные логи и очередь не собрана.
2) через перехватчик p6spy
популярное решение, перехватывать обращения к бд и логировать их
https://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/

результат - собранный sql запрос. удобен для отладки jpa очередей
insert into mkyong.stock_transaction (CHANGE, CLOSE, DATE, OPEN, STOCK_ID, VOLUME)
values (10.0, 1.1, '2009-12-30', 1.2, 11, 1000000)

недостатки: Сложность настройки (установка на вэбсервер).
Потратив пару часов времени я выяснил что для Wildfly p6spy не поддерживает xa-datasource (который используется менеджером транзакций в JTA). В glassfish такая поддержка есть. Предложенные варианты проксирования через обычный datasource, полагаю, не заработают в рамках JTA.

3) писать логи запросов средствами СУБД.
В моём случае это PostgreSQL. Лог выходит в виде:

LOG:  execute <unnamed>: select referenceb11_.label as col_0_0_, referenceb8_.label as col_1_0_, person3_.gender as col_2_0_, count(distinct assignment1_.person_id) as col_3_0_ from orgstruct.staff_unit staffunit0_ left outer join orgstruct.assignment assignment1_ on staffunit0_.id=assignment1_.staff_unit_id and ( assignment1_.removed is null or assignment1_.removed = 'false') left outer join orgstruct.assignment_to_operation assignment2_ on assignment1_.id=assignment2_.assignment_id and ( assignment2_.removed is null or assignment2_.removed = 'false') inner join person.person person3_ on assignment1_.person_id=person3_.id left outer join person.specialty_diplom specialtyd4_ on person3_.id=specialtyd4_.person_id and ( specialtyd4_.removed is null or specialtyd4_.removed = 'false') inner join orgstruct.departament_actual departamen5_ on staffunit0_.department_id=departamen5_.id inner join orgstruct.departament departamen6_ on departamen5_.id=departamen6_.departament_actual_id and ( departamen6_.removed is null or departamen6_.removed = 'false') left outer join classifier_other.post post7_ on staffunit0_.post_id=post7_.id left outer join classifier.reference_book referenceb8_ on post7_.post_level_id=referenceb8_.id left outer join classifier.reference_book referenceb9_ on post7_.post_category_id=referenceb9_.id inner join classifier.reference_book_set_reference_books referenceb10_ on referenceb9_.id=referenceb10_.reference_book_id inner join classifier.reference_book_set referenceb11_ on referenceb10_.set_id=referenceb11_.id where post7_.civil_sign=true and (staffunit0_.removed is null or staffunit0_.removed=false) and (assignment1_.removed is null or assignment1_.removed=false) and staffunit0_.start_date<=$1 and (staffunit0_.end_date>=$2 or staffunit0_.end_date is null) and  not (exists (select staffunitc13_.id from orgstruct.staff_unit_closed staffunitc13_ where (staffunitc13_.reason_id=$3 and staffunitc13_.close_date<=$4 or staffunitc13_.reason_id=$5 and staffunitc13_.close_date<=$6 or staffunitc13_.reason_id=$7 and staffunitc13_.close_date<=$8 or staffunitc13_.reason_id=$9 and staffunitc13_.close_date<=$10 and staffunitc13_.open_date>$11) and staffunitc13_.staff_unit_id=staffunit0_.id)) and (assignment2_.operation_id in ($12 , $13)) and assignment2_.assignment_date<=$14 and (assignment2_.assignment_date is null or assignment2_.vacation_date>$15) and specialtyd4_.learning_year_end=2016 and (specialtyd4_.retraining_sign=true or specialtyd4_.upgrading_sign=true) group by referenceb11_.id , referenceb8_.id , person3_.gender
DETAIL: parameters: $1 = '2016-12-31', $2 = '2016-12-31', $3 = '8214', $4 = '2016-12-31', $5 = '1080', $6 = '2016-12-31', $7 = '1081', $8 = '2016-12-31', $9 = '1079', $10 = '2016-12-31', $11 = '2016-12-31', $12 = '1084', $13 = '1085', $14 = '2016-12-31', $15 = '2016-12-31'

Что тоже не является склеенной очередью.

В качестве решения : взял лог из субд (пункт 3) и написал программку которая посдтавляет значения в очередь с ?
Тоже самое можно сделать и с логом из log4j (пункт 1)

как-то так.
PS: надо посомтреть на внутренности jdbc драйвера. Может есть возможность заставить его как-то скидывать собранные запросы, не в буферизированные логи (log4j) на сразу в какйнибудь слушающий поток....
Концепт алгоритма авторизации (dude 2017-08-12 04:53:38 Общее)
1) берём sessionId
2)  делаем password+sessionid
3) md5 от этого отправляем на сервер
4) сервер делает тоже самое но с паролем в базе. если результаты совпадают - авторизация пройдена. пароль можно хранить в базе в md5

плюсы:  передача пароля в закрытом виде. нет возможности перехвата пароля
минусы: не защищает от перехвата sessionId и подстановки его в браузер

следующий этап - авторизация по открытым и закрытым ключам. так-же не спасает от подмены sessionId.

От подмены может спасти постоянно обновляющийся авторизационный ключ:

клиент хранит в яваскрипте/в куки/в кэше (в браузере) md5 от пароля.
при каждом запросе, или раз в минуту, клиент запрашивает на сервере рандомный открытый ключ, цепляет его к своей md5, делает ещё раз md5 и отправляет на сервер. при неуспешной авторизации - сессия закрывается.
подменённая сессия проживёт не больше минуты....


Проблемы с Wildfly 10 (dude 2017-08-11 05:59:50 Программирование)
Инструкиця по устнавке PostgreSQL JDBC в Wildfly
http://ralph.soika.com/wildfly-install-postgresql-jdbc-driver-as-a-module/

но как обычно - не всё так гладко.
Итоговая срока добавления подсистемы драйвера в wildfly:
/subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql,driver-module-name=org.postgresql,driver-class-name=org.postgresql.Driver,driver-datasource-class-name=org.postgresql.ds.PGSimpleDataSource,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)


Выпил старых сообщений (dude 2017-08-07 06:46:19 Общее)
Проведена серьёзная редакционная работа: выпилил кучу трэша про оладьи, книги, ещё какую-то херню.
Макет проекта для ЕЕ сервера servak-minima (dude 2017-08-07 06:18:15 Программирование)
Пользуясь случаем собрал небольшой maven проект, для ЕЕ 7 сервера.
Планирую его ещё расширять до своей небольшой платформы вэб-приложения.
На текущий момент в заготовке проброшен следующий технологический стэк:
  • maven
  • Java 8
  • Servlet
  • EJB
  • JPA - Hibernate 5

Готовый проект можно взять на гитхабе https://github.com/vladimir-x/servak-minima

Про настройку maven ear плагина хорошо написано здесь: http://lukdiman-developer.blogspot.ru/2015/04/maven-ear-plugin.html

В шаблоне планирую реализовать/протестировать:
  • В выводе запросов гибернейта значения вместо "?" (подмена psql драйвера)
  • +Сервер wildfly (в отдельные ветки или метки glassfish/wildfly)
  • CDI компоненты
  • Scope компонентов
  • Transaction функции
  • +Rest сервлет
  • Кеш второго уровня (Infinispan ?)

В платформе планирую реализовать/протестировать:
  • Ревизии и версионность данных в таблицах БД
  • Масштабируемый механизм CRUD сущностей
  • Валидация бинов
  • Файловое хранилище
  • Печать/Печатные формы
(может что-то ещё)
Идея SharedPaint (dude 2017-03-04 07:38:21 Общее)

Идея концепт: пэинт, к которому могут подключаться монго пользователей и рисовать простые картинки одноврменно.
Типа как чат, только вместо сообщений - рисовать. Браузерное исполнение - желательно.

Год работы блога. (dude 2017-02-24 22:16:10 Общее)

За год работы в почту пришло аж 3 письма, которые мэйл расценил как не-спам. Все три с предложением о продвижении моего замечательного ресурса. Считаю успех достигнут.

Бага в HOMM3 (dude 2017-02-24 21:59:24 Общее)
Проявление бага в HOMM3:
При попытке зайти в сетевую игру по протоколу TCP/IP вываливается сообщение об ошибке.
______________________________________________
DirectPlay Error:

'Unknown error?'

File 'C:DevHeroes 3 Exp 2GameRemote.cpp'
Line#1867
______________________________________________

Так-же баг проявляется в других сетевых играх/приложениях использующих  DirectPlay из DirectX 7.
(При этом DirectPlay из DirectX 8 может работать корректно, так как могут использоваться другие классы)

Баг связан с невозможностью инициализации COM объекта
DirectPlayLobby ( CLSID: {2FE8F810-B2A5-11d0-A787-0000F803ABFC}, реализация COM-сервера в dplayx.dll ), используемого в DirectX 7 (DirectPlay) приложениях, работающих с сетью.

Вызов CoCreateInstance( CLSID_DirectPlayLobby, NULL, CLSCTX_INPROC_SERVER, IID_IDirectPlayLobby3A, (VOID**)&pDPLobby )
возвращает -1, что является признаком ошибки. Работа с DirectPlayLobby прекращается - программа выдаёт ошибку и завершает работу.

Проверить правильность диагноза можно на Samples из DirectxSDK7 - они все не работают.

COM объект регистрируется при установке DirectX, однако, (по невыясненным причинам) регистрация этого компонента может не произойти. Повторные установки и переустановки DirectX не исправляют ситуацию (возможно есть решение с полным удалением DirectX но в рамках Windows7 я не уверен в успешности данного решения).

описание для Windows7 x64

1) удалить dplayx.dll из windowssystem32
2) закинуть в C:WindowsSysWOW64  dplayx.dll(если нету) и dplay.inf
3) произвести установку из dplay.inf (контекстное меню -> установить)
4) зарегистрировать библиотеку dplayx.dll
(cmd от администратора -> C:WindowsSysWOW64 egsvr32.exe dplayx.dll)
!! библиотека x86 регистрируется из C:WindowsSysWOW64 egsvr32.exe !!
!! C:Windowssystem32 egsvr32.exe  регистрирует x64 библиотеки!!