Рубрика: 3. Инструментарий

  • Примеры работы с JMeter в картинках

    Приблизительно раз в год у меня возникает необходимость проводить пробное нагрузочное тестирование очередного проекта. Раньше приходилось сталкиваться с этой задачей чаще, но сейчас больше времени уходит на разработку под мобильные платформы (Android и т.д.) или создание программного обеспечения для решения внутренних инфраструктурных задач клиентов.


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

    Сразу оговорюсь, я не профессиональный тестировщик и проверка работы веб-приложений под нагрузкой не входит в мои прямые обязанности.
    Поэтому фраза “возникает необходимость” скорее нужно понимать не как приказ начальника, а “мне очень любопытно посмотреть, что случиться если…” (особенно если учесть, что начальника у меня нет, но про это в другой раз).

    Лет 10-15 назад на одной из своих первых работ для задач нагрузочного тестирования мы использовали утилиту, которая кажется так и называлась стресс-тул (вроде даже микрософтовская). Она была простая и интуитивно понятная. Только я ее уже 10 лет не видел и не знаю, использует ее кто-нибудь еще сейчас.

    Последние несколько лет пользуюсь JMeter-ом (или облачными сервисами). Пользовательский интерфейс JMeter-а (если с ним не работать регулярно) совсем не интуитивно понятный. Без прочтения документации или просмотра обучающего фильма очень сложно сделать даже самый простой тест (скажем 1000 запросов к одному URL-у).

    Поэтому, чтобы каждый раз не зависать по полдня над этой задачей, я решил написать себе простую шпаргалку-напоминалку по работе с этим jmeter-ом. Понятное дело, что все возможности этой чудесной утилиты не описать в одной статье, тем не менее пошаговую инструкцию в картинках для примитивного случая, думаю, сделать можно.
    Очень надеюсь, что пользовательский интерфейс этой утилиты в ближайшее время не изменится кардинально.

    Итак. (далее…)

  • Density independent pixel (dp) в Android

    Вопрос про единицу измерения длины “dp” постоянно появляется на различных форумах и сайтах посвященных разработке приложений под ОС Android.
    В большинстве случаев, в качестве ответа более опытные программисты приводят цитату с официального сайта:

    Density-independent pixel (dp)
    A virtual pixel unit that you should use when defining UI layout, to express layout dimensions or position in a density-independent way.
    The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen, which is the baseline density assumed by the system for a “medium” density screen. At runtime, the system transparently handles any scaling of the dp units, as necessary, based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. You should always use dp units when defining your application’s UI, to ensure proper display of your UI on screens with different densities.

    В целом, мотивы создания dp-единицы описаны довольно ясно. Никому не хочется делать множество различных версток для экранов с разным разрешением и плотностью точек.
    Тем не менее, давайте посмотрим более подробно на указанную выше формулу:

    px = dp * (dpi / 160)

    Здесь главное не запутаться. Если px – это длина в пикселях, а dp – длина в д-пикселях, то для dpi = 240 получится:

    px = (dpi/160) * dp = 1.5 * dp

    По указанной выше формуле получим, что если dp = 1, то px = 1.5.

    Попробуем разобрать ситуацию по существу. Ввод единицы измерения длины dp, нужен был для того, чтобы на экранах с разным количество точек на дюйм размеры графических элементов были одинаковыми.
    Например, если взять экран с 160dpi (160 точек на линейный дюйм) и с 240dpi, то для того, чтобы физический размер кнопки был одинаковый, нужно на экране с 240dpi размер кнопки в пикселях делать в 1.5 раз больше.

    Здесь важно определиться в понятиях размер, разрешение и плотность:

    • Размеры (3”, 10” и т.д.) – физические размеры экрана. В Android-е это разные группы ресурсов: small, normal, large, and extra large. Измеряются в dp.
    • Разрешение (QWGA, HVGA и т.д.) – количество точек на экране (например: 1024×720).
    • Плотность (DPI) – количество точек на линейный дюйм. В Android-е это разные группы: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high).

    Итак понятно, что единица dp – это такой виртуальный пиксель, который на плотных экранах занимает большее количество пикселей, а на разреженных меньше.
    Цель – сохранить единообразие в пользовательском интерфейсе.

    Дальше самое интересное. Чтобы лучше понять, как происходит преобразование dp в px на самом деле, думаю имеет смысл посмотреть в исходный код:
    (далее…)

  • SOAP. Посмотреть конверты.

    Пару простых хинтов для тех, кто начинает изучать работу с SOAP.

    Java 6

    С тех пор как вышел JDK 6 (декабрь 2006г) веб-сервисы стали доступны из “коробки”. В итоге начинать изучение работы с ними стало намного легче, без томкатов, жбоссов, глассфишей и других больших серверов.

    Учебных материалов по работе с веб-сервисами существует огромное количество. В этой статье я хотел только привести два популярных и полезных JVM ключа.

    Дампим отсылку SOAP-сообщения на консоль со стороны клиента:

    -Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true
    

    Дампим отсылку SOAP-сообщения на консоль со стороны сервера:

    -Dcom.sun.xml.ws.transport.http.HttpAdapter.dump=true
    

    Прокси

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

    Например, если вы работает по SOAP из standalone-приложении (Java 6), то, настроив системные свойства для прокси, можно через Fiddler просматривать что отправляется на самом деле:

    // или -Dhttp.proxyHost= и т.д.
    System.setProperty("http.proxyHost", "localhost");
    System.setProperty("http.proxyPort", "8888");
    // ВАЖНО! Чтобы локалхост не исключил.
    System.setProperty("http.nonProxyHosts", "");
    

    Замечания

    Если вы используете Аxis или какую-то другую библиотеку для работы с SOAP, то естественно настраивать дамп конвертов нужно будет другим способом. В этом плане подход с использованием прокси более универсальный. Тем не менее, изучать способ настройки прокси всё-равно нужно будет под конкретный фреймворк.

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

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

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

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

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

  • Tomcat и jdbc connection pool

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

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

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

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

  • Java Zip + русские буквы в названиях файлов

    Баг №4244499

    Этот баг был зарегистрирован еще в 1999г.
    Проблема была не только с русскими файлами, а например с французскими (как в примере).
    Корни довольно глубокие и существовали серьезные (надеюсь) причины, по которым эту ошибку долгое время не исправляли. В итоге, много-много лет в Java нельзя было сделать простыми штатными средствами zip-архив, который бы содержал файлы с именами не на латинице.

    К сожалению, жизнь такова, что все это время некоторых java-программистов заставляли делать такие zip-архивы. Приходилось использовать например apache-вский commons-compress.

    Использовать очень просто. Алгоритм буквально в два шага: (далее…)

  • Работа с Maven + Tomcat

    Maven и Tomcat


    Ни для кого не секрет, что maven-ом можно деплоить проекты в Apache Tomcat.
    Правда многие разработчики все-таки используют функции, встроенные в среду разработки (в Netbeans – из коробки, в Eclipse – ставим плагин).
    Это удобно и просто, но к сожалению, мне приходится часто “перескакивать” с разных IDE и поэтому в некоторых своих проектах я предпочитаю сразу настроить tomcat:deploy.
    (далее…)

  • UML в Javadoc через maven+umlgraph

    UPD из 2025. Сайт UMLGraph похоже перестал поддерживаться, попробуйте PlantUML

     

    Где-то год назад писал про различные UML-редакторы.

    К сожалению, ситуация толком не изменилась, пока действительно удобного на 100% для себя инструмента для создания UML-диаграмм не нашел.
    UMLet – хорошо спасает в 80% случаев для быстрого прототипирования, но иногда его не хватает.

    Сейчас речь пойдет не о нем, а о UMLGraph.
    Это инструмент, который позволяет осуществлять декларативный способ рисования uml-диаграмм. Другими словами UML диаграммы создаются в текстовом виде, а не рисуется мышкой. Некоторым программистам (в частности мне) работать с текстом несколько удобней, чем с мышкой и со множеством графических объектов.

    Возможностей у UMLGraph довольно много, но лично меня интересовали только следующие его возможности:

    1. Рисование только диаграмм классов. Использование umlgraph для создания диаграмм последовательности, развертывания и т.д. мне не интересно.
    2. Встраивание полученных диаграмм в JavaDoc.
    3. Связка с maven-ом.

    В результате некоторых манипуляций, можно получить следующий результат:
    (далее…)

  • Firefox и localhost

    Недавно помогал ребятам из одной конторы (нужно было сделать на HTML5 Canvas графический редактор для их легаси-системы). Среди прочих задачек, была интересная проблемка с Firefox-ом – медленно обрабатывались запросы (1 запрос > 1 секунды).
    Так как веб-сервер – самописный (полностью!), то были подозрения на все-что угодно (ошибки в реализации протокола, проблемы в клиентском коде на javascript и т.д.).

    В итоге все-таки я проблему решил, оказалось очень забавно. Пишу здесь, может кому пригодится.
    Сервер тестировался на localhost-е, а в Firefox-е есть проблема http://goo.gl/jJc7g
    В общем проблема заключалась в медленном DNS-ресолве для localhost в Firefox-e (например 127.0.0.1 – не глючил)

    Самое просто решение (но не самое правильно):
    about:config -> network.dns.disableIPv6=true

    Подробнее о причинах и правильных решениях: http://kb.mozillazine.org/Network.dns.disableIPv6

  • Мои хинты для Netbeans 7

    Недавно нужно было заново установить Netbeans 7.
    Вот некоторые действия, которые всегда приходится делать после установки “коробочной” версии,
    а именно: поддержка Scala, интерфейс на английском и quick file chooser.

    Установка

    Заходим на официальный сайт: netbeans.org
    Нажимаем на [Download FREE] и переходим на ссылку http://netbeans.org/downloads/index.html
    Скачиваем, устанавливаем и запускаем.

    Итак, что приходится делать:

    0. Обновления.

    На всякий случай проверить наличие обновлений:
    Меню → Help → Check for Updates

    1. Русский → English

    Чтобы вернуть обратно английский нужно:
    – Найти файл “netbeans.conf” (для Windows-пользователей: он должен находится где-то здесь – “C:\Program Files\NetBeans 7.0\etc\” )
    – Указать в настройках –locale en:US

    netbeans_default_options="МНОГО_БУКВ   --locale en:US"
    

    UPD: Почистить домашнюю папку “.netbeans/7.x” перед сменой локали, а то “Службы” и некоторые другие сообщения могут остаться на русском. Предварительно сделайте бэкап.

    2. File Chooser

    Сразу же установить плагин Quick File Chooser:
    Меню → Тools → Plugins → Available Plugins
    Это намного более шустрый и удобный (на мой взгляд) диалог для выбора файлов.

    3. Scala

    Ставим plugin для работы со Scala.
    Для версии 2.8.x: http://plugins.netbeans.org/plugin/36598/nbscala-2-8-x
    Подробнее можно прочитать на вики нетбинсов:
    http://wiki.netbeans.org/Scala
    или на портале с плагинами:
    http://plugins.netbeans.org/