Не могли бы Вы подробнее рассказать о процессе написания скриптов? Как проходил debug, например. Насколько удобно было их загружать. Можно ли выполнять скрипты без загрузки на устройство? Т.к. это lua, то может удастся запустить без устройства. Например, при разработке или тестировании. И написать unit test.
Интересно было почитать — я подобное сам писал, когда нужно было POJO объект заполнить для проверки сериализации/десериализации. Заняло несколько десятков строк кода. А тут прямо серьёзная вещь, даже с поддержкой стратегий генерирования :)
оффтоп: В комментариях уже несколько раз упоминалось неблагозвучное название. А как вообще правильно произносить название Вашей компании? Не могли бы Вы по русски его написать?
Это «открытый хват». Очень опасный, т.к. гриф может соскользнуть, но часто видел что его используют опытные спортсмены. Вот тут не знаю почему — особых преимуществ и отличий от «закрытого хвата» он не даёт (по крайней мере, так пишут). Может потому что могу? :)
P.S. Не обновил комментарии.
Спасибо за статью! Было интересно прочитать про софт для просмотра DICOM — сам сталкивался с этой проблемой когда мне КТ делали (не касательно стоматологии).
В статье не нашёл, на мой взгляд, самого интересного — названия первой стоматологии и фирмы ДМС. А то Вы на них столько времени потратили и денег. Нужно же сделать им «рекламу»! :)
Проблема, с который мы недавно столкнулись и которую пробовал решить с помощью аспектов — логгирование CallableStatement. Т.е. стандартный код:
CallableStatement c = con.createCallableStatement("{call package.procedure(?,?,?,?)}");
c.setString(1,"a");
c.setInteger(2,2);
c.setStruct(3,struct);
c.execute();
И я пробовал с помощью аспектов получить {call package.procedure(?,?,?,?)} и потом отследить вызов set методов с логгированием переданных параметров и при вызове execute() записывать эти параметры в лог.
В итоге не осилил — при включении аспектов на нашем проекте компиляция стала занимать какое-то нереальное время. И пошёл по другому пути — сделал wrapper вокруг connection, а он возвращает wrapper вокруг CallableStatement который уже производит логгирование. Кода получилось очень мало — большая часть кода wrapper была сгенерирована IDEA, а я в итоге написал сохранение параметров в set методах и вывод их в лог при выполнении execute().
Но мне бы было интересно, если бы Вы показали на этом примере, как можно применить аспекты.
Успешный пример их применения у меня был на гораздо меньшем проекте — там нужно было логировать просто время выполнения определённых методов (проект был по нагрузочному тестированию). И там было всё гораздо проще — написал pointcut для поиска этих методов, сохранял текущее время, вызывал метод, писал разницу между текущим временем и сохранённым.
Но в примере с CallableStatement по другому — нужно не просто подменить вызов метода своим, а ещё и отследить что вызывались set методы у объекта и отследить вызов exceute().
Я делал что-то подобное — только у меня Arduino преобразовывал сигналы от одного пульта в сигналы в другого. Нужно было, когда пульт от колонок потерялся, а ручка управления громкость находится сзади, неудобно. Так же использовал эту библиотеку. А Вы не заменяли энерго потребление? Можно ли на батарейки перевести конструкцию? А то у меня сейчас от USB компа питается (т.к. возле компа находится), но хотелось бы отвязаться от него.
Хм. В IDEA проверяются. Я когда аспектами пользовался в нескольких приложениях, там удобно всё подсвечивалось. Но от них пришлось отказаться — тормозило ужасно при разработке и компиляции!!! (именно три восклицательных знака, т.к. всё было очень плохо :) )
P.S. Или может я Вас не понял? Я имел ввиду, что есть подсветка синтаксиса и поиск совпадения по PointCut.
Кстати, у меня на этом коде FindBugs не нашёл ошибку. В консоль выводилось, что Вы указали (т.е.фактически ошибка была), но FindBugs не показал её.
P.S. Проверял в IDEA с плагином FindBugs. При проверке другого кода ошибки находятся, т.е. FindBugs работает.
На счёт generic в блоке throws странно. Почему вообще это разрашили делать? Ведь generic в Exception нельзя применять, а в throws почему то можно?!
P.S. Нельзя, означает, что class MyException extends Exception{} не скомпилируется, а, например, class MyException extends Date{} скомпилируется.
Как бы банально не звучало, но — Спасибо за статью! У нас как раз в пятницу WebLogic падал с OOM. Так что статья вовремя — завтра будем её использовать. Кстати, по повду jmap, для дампа целевое приложение не нужно запускать с какими то параметрами? Т.е. вот работает приложение в проде без опций heap dump и можно ли с помощью jmap сделать дамп памяти это приложения?
А если нужна всего одна деталь, можно ли обойтись вообще без формы из силикона? Нет ли такого «пластилина» что бы при застывании был твёрдый как пластик и его можно было бы долго использовать? Или может есть какие-нибудь другие способы быстрого прототипирование, например, корпуса устройства?
И ещё, можно ли делать шаблон и пластилина? Не развалится ли он в силиконе?
А кто нибудь читал доку, которая в статье упоминалась? (Детальная техническая документация на русском языке доступна здесь. В каталоге нужно выбрать файл ttester.pdf) Там пишут, что китайская реализация не очень — большая погрешность измерения, насколько я понял.
P.S. Не обновил комментарии.
В статье не нашёл, на мой взгляд, самого интересного — названия первой стоматологии и фирмы ДМС. А то Вы на них столько времени потратили и денег. Нужно же сделать им «рекламу»! :)
И я пробовал с помощью аспектов получить {call package.procedure(?,?,?,?)} и потом отследить вызов set методов с логгированием переданных параметров и при вызове execute() записывать эти параметры в лог.
В итоге не осилил — при включении аспектов на нашем проекте компиляция стала занимать какое-то нереальное время. И пошёл по другому пути — сделал wrapper вокруг connection, а он возвращает wrapper вокруг CallableStatement который уже производит логгирование. Кода получилось очень мало — большая часть кода wrapper была сгенерирована IDEA, а я в итоге написал сохранение параметров в set методах и вывод их в лог при выполнении execute().
Но мне бы было интересно, если бы Вы показали на этом примере, как можно применить аспекты.
Успешный пример их применения у меня был на гораздо меньшем проекте — там нужно было логировать просто время выполнения определённых методов (проект был по нагрузочному тестированию). И там было всё гораздо проще — написал pointcut для поиска этих методов, сохранял текущее время, вызывал метод, писал разницу между текущим временем и сохранённым.
Но в примере с CallableStatement по другому — нужно не просто подменить вызов метода своим, а ещё и отследить что вызывались set методы у объекта и отследить вызов exceute().
P.S. Спасибо за статьи по аспектам!
P.S. Или может я Вас не понял? Я имел ввиду, что есть подсветка синтаксиса и поиск совпадения по PointCut.
P.S. Проверял в IDEA с плагином FindBugs. При проверке другого кода ошибки находятся, т.е. FindBugs работает.
P.S. Нельзя, означает, что class MyException extends Exception{} не скомпилируется, а, например, class MyException extends Date{} скомпилируется.
И ещё, можно ли делать шаблон и пластилина? Не развалится ли он в силиконе?