Блог о программировании

Февраль 17, 2012

 

Другой способ защиты

На этой неделе друг со старой работы написал про свой способ защиты java проектов.
Около полугода назад я писал про то, как прятать строки в properties-файлах с помощью jasypt (EncryptableProperties и защита от дурака).
На самом деле, все понимают, что это всего-лишь защита от самого простого случая. Например, чтобы любопытный админ заглянув в файлик, не увидел там то, что не должен знать.
Тем не менее, если есть доступ к классам, то можно jad-ом отдекомпилировать исходники и получить доступ к "запретной" информации (например оригинальный пароль, которым шифруются properties разработчиком-оптимистом).

Для более серьезной защиты используют обфускаторы. Он усложняет работу по реверсу, но по большому счету распутывание логики это вопрос времени.

Так вот, российскими программистами сделан специальный продукт для защиты java-проектов.
Ключевое в нем - AES-шифровка строк. Кроме этого он делает динамические инъекции и использует специальные механизмы, которые мешают поломать приложение через рефлекшн.
Данное решение является коммерческим продуктом.

Подробнее здесь.

Java на habrahabr

Февраль 14, 2012

 

JAVA / Kotlin теперь OpenSource

Сегодня компания JetBrains объявила о доступности исходных текстов языка программирования Kotlin, который предназначен для разработки на платформах Java и JavaScript. В дополнение был предоставлен доступ к сборкам компилятора, стандартным библиотекам Kotlin, инструментам сборки (интеграция с Ant, Gradle, Maven), и плагину для Intellij Idea. Ранее стала доступна Веб-демо версия Kotlin.


Полезные ресурсы:

Java на habrahabr

Февраль 11, 2012

 

JAVA / Итоги Java Day SPB 2012

Всем привет!

Как вы все наверняка знаете, вчера в замечательном городе Санкт-Петербург прошёл очередной ивент под названием Java Day.

JavaDay SPB 2012 прошла в конференц зале гостиницы Холидей Инн Московские Ворота. После открытия регистрации всех поили кофе и кормили печеньками заманивая на тёмную сторону.

Java на habrahabr

Февраль 10, 2012

 

JAVA / Непрерывный мониторинг JVM с помощью Zabbix

Предположим, у вас есть большое приложение написанное на Java. Это может быть web-сервлет размещенный в контейнере или standalone-сервис. В процессе разработки (да и во время эксплуатации) возникает необходимость отслеживать процессы, протекающие в JVM: работу garbage collector, использование памяти, жизненный цикл потоков, а так же иные специфичные для вашего проекта показатели по средствам MBean. Самый простой вариант — использовать профилировщик. Но увы, проблемы не случаются по расписанию, и невозможно заранее знать, когда нужно подключить профилировщик, а держать его постоянно включенным тоже не вариант. В таких случаях идеальное решение — непрерывный мониторинг. О нем и пойдет речь. Но для начала пара слов о классической профилировке.

Java на habrahabr

Февраль 8, 2012

 

JAVA / Java Day SPB 2012 — последние новости

Уже совсем скоро, в эту пятницу, в Санкт-Петербурге пройдет конференция Java Day SPB 2012. Со времени первого поста произошло много интересных, на мой взгляд изменений, поэтому я решил рассказать о них всем.

У нас появилось несколько новых докладчиков.

Из Праги приедет Мартин Гребач (Martin Grebac), который расскажет о веб-сервисах. Мартин входит в команду проекта Metro и Glassfish и руководит разработкой JAXB (jaxb.java.net), начиная с версии 2.2, а с недавних пор еще и JAX-WS RI и Metro (metro.java.net). Мартин — автор плагинов Metro для NetBeans и Eclipse, а также JSP дебагера, функции JavaEE рефакторинга. Он участвует в разработке модуля поддержки веб-сервисов в NetBeans. В дополнение к вышесказанному, Мартин работает над несколькими Open Sourсе проектами (www.ohloh.net/accounts/snajper). Читайте блог Мартина: blogs.oracle.com/mgrebac/

Java на habrahabr

Февраль 8, 2012

 

JAVA / Размер Java объектов. Используем полученные знания

В предыдущей статье много комментаторов были не согласны в необходимости наличия знаний о размере объектов в java. Я категорически не согласен с этим мнением и поэтому подготовил несколько практических приемов, которые потенциально могут пригодится для оптимизации в Вашем приложении. Хочу сразу отметить, что не все из данных приемов могут применяться сразу во время разработки. Для придания большего драматизма, все расчеты и цифры будут приводится для 64-х разрядной HotSpot JVM.

Денормализация модели

Итак, давайте рассмотрим следующий код:
class Cursor { String icon; Position pos; Cursor(String icon, int x, int y) { this.icon = icon; this.pos = new Position(x, y); } } class Position { int x; int y; Position(int x, int y) { this.x = x; this.y = y; } }
А теперь проведем денормализацию:
class Cursor2 { String icon; int x; int y; Cursor2(String icon, int x, int y) { this.icon = icon; this.x = x; this.y = y; } }
Казалось бы — избавились от композиции и все. Но нет. Объект класса Cursor2 потребляет приблизительно на 20% меньше памяти чем объект класса Cursor (по сути Cursor + Position). Такое вот не очевидное следствие декомпозиции. За счет ссылки и заголовка лишнего объекта. Возможно это кажется не важным и смешным, но только до тех пор, пока объектов у Вас мало, а когда счет идет на миллионы ситуация кардинально меняется. Это не призыв к созданию огромных классов по 100 полей. Ни в коем случаем. Это может пригодится исключительно в случае, когда Вы вплотную подошли к верхней границе Вашей оперативной памяти и в памяти у Вас много однотипных объектов.

Блог о программировании

Февраль 7, 2012

 

Tomcat и jdbc connection pool

В общих чертах что такое пул.

Пул (pool) - это такой "бассейн" иди "резервуар" из которого можно брать "живые" объекты для дальнейшего их использования.
В данной статье будут рассматриваться только пулы подключений к БД, но в жизни программиста могут повстречаться пулы разных объектов, например многим знаком Thread Pool.
В общем случае, пул "каких-то объектов" - это шаблонный способ решения проблемы хранения и раздачи объектов (и самое главное поддержания их в нормально рабочем состоянии).

По аналогии с бассейном, в нормальных пулах постоянно протекают некоторые процессы. Например осуществляется проверка не "протухли" ли объекты. Нужно ли создать новые? Сколько времени объекты находятся в пуле? Во многих пулах есть своя "ватерлиния" (high water mark), которая указывает на максимальный "объем" пула.

В этой статье будет кратко описан JDBC Connection Pool.

Использование такого пула оправдано тем, что каждое подключение к БД это ресурсоёмкая операция. Поэтому более экономная стратегия это установить несколько подключений и следить за их состояниям, по мере необходимости добавлять новые.

Существует несколько реализаций пулов подключений к БД.

Можно даже сделать свою имплементацию. Это не сверхзадача. Опасность заключается в том, что если сделать чуть-чуть не аккуратно, то ваш бассейн начнет протекать или объекты будут "тухнуть".
Для серверного ПО это особо не приятно.
Тем не менее, в 90-ые годы многие java программисты писали свои connection pool.

Сейчас конечно можно взять готовый.

Сразу хотел сказать про тех, кого проблемы выбора пула не должны сильно волновать.

  • У вас нормальный Application Server. В этом случае у вас готовый, надежный промышленный пул "из коробки".
  • Вы используете СУБД Oracle. У вас реализация пула "из коробки" - в jar-ике с драйверами.

В обоих случаях, самое главное научиться всё правильно настраивать.

Если вы не можете себе позволить нормальный сервер (или оракл), то можно попробовать разобраться с решениям "для бедных".

Итак варианты:

DBCP

DataBase Connection Pool - этот пул очень долгое время приводится в примерах на сайте Apache Tomcat.
Это не самый лучший пул, т.к. может создать deadlock-и. На данный момент я бы не стал его рекомендовать для применения в реальных (продакшн) версиях.

C3P0


Название этого пула созвучно с именем робота золотистого цвета из звездных войн (в фильме этого робота создал молодой Дарт Вейдер, он же Анакин Скайоукер).
Краткое объяснение этому названию следующее: Connection Pool 3.0 -> СP30 -> C3P0. Подробности можно прочитать по ссылке.

Это действительно неплохой пул. Например, в какой-то момент создатели одного известного ORM-фреймворка стали приводить в своих примерах именно работу с с3p0 (и ругаться на dpcp).

Данный пул я использую в нескольких своих проектах. Иногда он выкидывает неприятное исключение при переразвертывании веб-приложения, но в штатном режиме работает вполне устойчиво.

Можно скачать с сайта (ссылка) или установить из maven-репозитория (groupId:c3p0, artifactId:c3p0).

Принцип настройки JNDI ресурсов в томкате думаю объяснять не нужно. Всё просто. Можно указать как глобальные ресурсы, а в веб-приложении указать ссылку, либо можно указать непосредственно в context.xml. Все зависит от того, где у вас хранятся библиотеки и какая у вас конфигурация сервера.

Пример настройки (MySQL):

<Resource auth="Container" description="DB Connection" driverClass="com.mysql.jdbc.Driver" user="user" password="password" jdbcUrl="jdbc:mysql://localhost:3306/databasename?useUnicode=yes&amp;characterEncoding=UTF-8" factory="org.apache.naming.factory.BeanFactory" type="com.mchange.v2.c3p0.ComboPooledDataSource" name="jdbc/db" maxPoolSize="10" minPoolSize="0" maxConnectionAge="100" acquireRetryAttempts="60" acquireIncrement="1" preferredTestQuery="SELECT 1" testConnectionOnCheckout="true" />

Важно! Установить пул особого ума не требует. Основная задача настроить так, чтобы он стабильно работал и выдерживал нагрузку.
Значение каждого параметры нужно прочитать в документации.

Некоторые важные детали:

  • Может оказаться, что JDBC URL есть амперсанд (&). Если настройка осуществляется через XML-файл, то & надо заквотить (вместо param1=value1&param2=value2, пишем param1=value1&amp;param2=value2).
  • preferredTestQuery - запрос который проверяет подключение к БД. Зависит от конкретной СУБД.
  • testConnectionOnCheckout - прожорлив, если можно то лучше не использовать.
  • maxPoolSize и minPoolSize - возможные максимальное и минимальное количество подключений в пуле.
  • acquireRetryAttempts - если СУБД не доступна, сколько раз пытаться подключится. Ставим в 0 если хотим, чтобы долбились до бесконечности.

Tomcat 7 JDBC Pool


В 7-ом Tomcat выпустили свой собственный пул. Подробнее можно прочитать на сайте.

<Resource name="jdbc/db" auth="Container" description="DB Connection" username="username" password="password" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/databasename?useUnicode=yes&amp;characterEncoding=UTF-8" maxActive="10" maxIdle="3" maxWait="100" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" type="javax.sql.DataSource" />

Некоторые важные детали:

  • Нужно быть внимательным с атрибутами. Например в с3p0 был атрибут user, здесь - username (driverClass - driverClassName, jdbcUrl - url). Поскольку реализация разная, поэтому и настройки отличаются!
  • Можно использовать и не в семерке. Из дополнительных зависимостей - tomcat-juli.jar.

Про Oracle


C Oracle все не просто. Как правило, Oracle используют серьезные организации, у которых должен быть штатный ДБА-шник. Самый правильное и разумное решение, чтобы тюнинг подключения к СУБД осуществлял как раз администратор баз данных.
Если у вас Oracle XE (бесплатная), то у вас может быть целый букет разного рода ошибок и сложностей связанных с локалью и настройкой.
Поскольку эта статья не про то, как настроить Oracle XE, а про пулы подключений, поэтому приведу примерную конфигурацию, которую использую для девелоперских целей.

<Resource auth="Container" factory="oracle.jdbc.pool.OracleDataSourceFactory" type="oracle.jdbc.pool.OracleDataSource" name="jdbc/db" user="scott" password="tiger" connectionCachingEnabled="true" url="jdbc:oracle:thin:@localhost:1521:XE" />
  • Важно! Это только для разработки. В продакшн такую настройку использовать не стоит. Проконсультируйтесь с вашим DBA! Это не шутка.
  • Еще раз внимательно с атрибутами. Отличаются от с3p0 и tomcat 7 jdbc pool
  • Это пример для Oracle 10-ка XE. Для других версий нужно читать документацию, но принцип тот же. Если собираетесь использовать нагугленные из интернета примеры, то обратите внимание на аттрибут factory. В интернете очень много ложных примеров.

Java на habrahabr

Февраль 6, 2012

 

JAVA / [Из песочницы] Java DNS API, Wikipedia и twitter-марафон в одном флаконе

Некоторое время назад я решал задачу автоматической покупки домена. Нужно было оформить в виде библиотеки (jar и файл настроек), которая использовалась бы в корпоративном приложении на Java. Я начал поиски DNS провайдеров с public API. Желательно, чтобы API были попроще, и домены подешевле — такой баланс оказалось не просто найти.

Java на habrahabr

Февраль 6, 2012

 

JAVA / [PODCAST] «Разбор полетов» — episode 9 — Индусоустойчивость

Творческий коллектив редакции подкаста «Разбор полетов» представляет вашему вниманию очередной девятый выпуск разговорно-болтологического IT-тематического подкаста;.
В этом выпуске:

Java на habrahabr

Февраль 5, 2012

 

JAVA / Тестирование в Java. Spock Framework


В предыдущих статьях на примерах JUnit и TestNG я упоминал о test-driven development(TDD) и data-driven testing(DDT). Но есть еще один активно набирающий популярность подход, behaviour-driven development(BDD). Это такое развитие TDD техники, при котором на тест смотрят не как на тестирование каких-то компонентов системы, а как на требования к функционалу. Если TDD оперирует такими понятиями, как тест или метод, то для BDD это спецификация и требования. Про эту технику уже говорили на хабре ранее:


Этот подход применим используя и JUnit, и TestNG. Но есть и другие инструменты заточенные именно под BDD. В этой статье я расскажу про такой фреймворк. Называется он Spock Framework и сочетает в себе не только принципы BDD, но и достоинства Groovy. Да-да, именно Groovy. И хотя используется Groovy, используется он и для тестирования Java кода. Примерами использования могут служить Spring, Grails, Tapestry5. Интересно? Тогда читаем дальше.

 
<< < 1 из 31 > >>