Спасибо за статью! Было интересно прочитать про софт для просмотра 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) Там пишут, что китайская реализация не очень — большая погрешность измерения, насколько я понял.
, где s — типа String.
И суть ошибки — вызывается метод с примитивом (int) и если s == null, то будет вызван m(((Integer)null).intValue()); что приведёт к NPE.
Если не кастить null к Integer, или вместо Integer.parseInt(s) использовать Integer.valueOf(s) то будет вызываться метод m(Integer). Но из за стечения обстоятельств , говнокода и кривых рук будет вызываться метод m(int) и в случае s == null будет NPE
Спасибо за предложение! Но боюсь от меня фидбек не очень будет — мне нужен софт, чтобы просто стоял на компе и при случае можно было посмотреть снимки. Не на постоянной основе :)
Про PACS сервер читал в Вашей прошлой статье. Вы же о нём сейчас говорите?
А про «проект по инвазивному картированию сердца для лечения всякого рода аритмий» интересно было бы почитать! Хотя бы в общем виде — как писали, как тестировали. Всё таки разработка очень отличается от большинства софта — цена ошибки очень высока. На Хабре как то статья была про разработку для Боинга — интересно было читать, как разрабатывают такие проекты, когда нельзя просто на компе запустить и проверить, как оно работает.
В статье не нашёл, на мой взгляд, самого интересного — названия первой стоматологии и фирмы ДМС. А то Вы на них столько времени потратили и денег. Нужно же сделать им «рекламу»! :)
И я пробовал с помощью аспектов получить {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{} скомпилируется.
И ещё, можно ли делать шаблон и пластилина? Не развалится ли он в силиконе?
Есть два метода:
Есть код, который вызывает один из этих методов:
, где s — типа String.
И суть ошибки — вызывается метод с примитивом (int) и если s == null, то будет вызван m(((Integer)null).intValue()); что приведёт к NPE.
Если не кастить null к Integer, или вместо Integer.parseInt(s) использовать Integer.valueOf(s) то будет вызываться метод m(Integer). Но из за стечения обстоятельств
, говнокода и кривых рукбудет вызываться метод m(int) и в случае s == null будет NPEПро PACS сервер читал в Вашей прошлой статье. Вы же о нём сейчас говорите?
А про «проект по инвазивному картированию сердца для лечения всякого рода аритмий» интересно было бы почитать! Хотя бы в общем виде — как писали, как тестировали. Всё таки разработка очень отличается от большинства софта — цена ошибки очень высока. На Хабре как то статья была про разработку для Боинга — интересно было читать, как разрабатывают такие проекты, когда нельзя просто на компе запустить и проверить, как оно работает.