Метка: Java

  • 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, то естественно настраивать дамп конвертов нужно будет другим способом. В этом плане подход с использованием прокси более универсальный. Тем не менее, изучать способ настройки прокси всё-равно нужно будет под конкретный фреймворк.

  • Android. Диаграмма классов: Context,Activity, Service

    Нарисованная “крупными мазками” UML диаграмма классов для наследников Context-а (из Android API) выглядит следующим образом:


    Важно! На этой диаграмме отображены только некоторые классы, которые являются (is) Context-ом. Методы также приведены в сокращенном количестве, чтобы упростить восприятие картины в целом.

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

  • Впечатление от JavaOne 2012.

    Субъективные заметки после посещения конференции JavaOne 2012.

    Давным-давно…

    Так получилось, что Java-конференции я посещаю с тех времен, когда Java была еще совсем юной. Помню одна из первых конференций, на которую мне удалось попасть, проводилась в холле в кинотеатра (кажется это был Ролан на Чистых Прудах), если я ничего не путаю, это было во второй половине 90-х годов. Я тогда был еще студентом физтеха.
    С тех пор размеры мероприятия постепенно возрастали. С каждым разом на конференцию стало приезжать все больше и больше посетителей, и потом, в какой-то момент, ее вообще перестали проводиться в Москве (переехала в Питер).

    Тем не менее, в прошлом и этом году JavaOne проводится в Москве. Я не мог пропустить это событие.

    (далее…)

  • Java EE Architect

    “Архитектор знает немного обо всем. Инженер знает все об одном.”
    Мэтью Фредерик, из книги “101 полезная идея для архитекторов”.

    Сейчас получить сертификат Java EE Architect (в прошлом SCEA) немного сложнее, чем до покупки Oracle компании Sun Microsystems.
    Необходимо пройти курс обучения от Oracle. Это дополнительное время и самое главное дополнительные немалые деньги.

    Я сдавал когда еще можно было пройти без этой процедуры.

    По моим личным наблюдениям реакция людей на наличие SCEA сертификата (Sun Certified Enterprise Architect for Java EE) может сильно отличаться. (далее…)

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

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

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

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

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

  • Tomcat и jdbc connection pool

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

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

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

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

  • Про интерфейс: Map<K,V>

    Недавно от товарища пришел вопрос на засыпку: “Почему в интерфейсe java.util.Map метод get в качестве ключа принимает Object, а метод put использует женерики?”

     
        V get(Object key);
        V put(K key, V value);
    

    Сходу ответить не смог, пришлось разбираться. (далее…)

  • Android, RTSP и 10 секунд

    Работа с мультимедийными данными в Android-е проработана довольно не плохо, но к сожалению существуют ряд определенных сложностей.
    Например, для проигрывания потокового видео можно использовать VideoView или использовать напрямую низкоуровневый класс MediaPlayer.
    Естественно, VideoView внутри использует тот же MediaPlayer.
    Примеры работы с VideoView и MediaPlayer есть в стандартной поставке: ApiDemos
    Примеры вполне пригодные для самообучения и достаточно подробные. Самое интересное возникает при работе в реальной жизни.

    Например, при начале трансляции по протоколу RTSP может возникнуть более чем ~10 секундная задержка. (далее…)

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

    Баг №4244499

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

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

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