Рубрика: 1. Языки программирования

  • Андроидная венгерско-верблюжья нотация

    Для разработчиков OC Android, как и для других серьёзных программистов, существует соглашение по оформлению кода.
    В целом оно совпадает с соглашением в обычной Java. Как именно нужно оформлять, можно прочитать на официальной странице для Android разработчиков.

    Привожу краткую справку по наименованию полей класса:

    • НЕ паблики и НЕ статики должны начинаться с “m” (анг: Non-public, non-static field names start with m).
    • Статики с “s” (Static field names start with s).
    • Все остальные – со строчной буквы (Other fields start with a lower case letter).
    • Константы – БОЛЬШИМИ_БУКВАМИ (Public static final fields (constants) are ALL_CAPS_WITH_UNDERSCORES).

    Активно используется верблюжий регистр (Camel Case).

    Пример с официального сайта:

    public class MyClass {
        public static final int SOME_CONSTANT = 42;
        public int publicField;
        private static MyClass sSingleton;
        int mPackagePrivate;
        private int mPrivate;
        protected int mProtected;
    }

    Наверное, гугл не был бы гуглом, если бы не внёс изменения в стандартные соглашения Java. Очень активно используются префиксы.
    Для обычных полей “m” (возможно от англ. member), а для статических полей – “s” (static).
    Это очень похоже на венгерскую нотацию.

    Занятный факт, если пройтись grep-ом по исходникам Android-a, можно найти места, где эти конвенции не соблюдаются. Например статические поля имеют префикс “m”:


    sources/adndroid-16

    ./android/app/ActivityThread.java: static ContextImpl mSystemContext = null;
    ./android/app/SearchManager.java: private static ISearchManager mService;
    ./android/bluetooth/BluetoothTetheringDataTracker.java: private static String mIface;
    ./android/content/res/Resources.java: /*package*/ static Resources mSystem = null;
    ./android/content/res/Resources.java: private static boolean mPreloaded;
    ./android/database/DatabaseUtils.java: private static Collator mColl = null;
    и т.д.

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

    UPD! Нужно уточнить, правила действительны для контрибуторов AOSP. То есть тех, кто пишет исходники Андроида.

  • Тренды программистских вакансий на indeed.com

    Пару дней назад прочитал интересную статью на dzone.com с занятными графиками, которые показывали количество вакансий для программистов.

    В статье были опубликованы данные с сайтов: indeed.com и simplyhired.com

    Оба сайта имеют русскоязычный интерфейс, поэтому надеюсь, что приведенные графики отображали не только данные по США (как часто бывает), а мировые тренды.
    Хотя может быть это и не так. К сожалению, не нашел способа получить картинки локализованные под Россию (или Москву).

    Меня в первую очередь конечно интересовала java, а также близкие или “конкурирующие” языки программирования.
    Поэтому в отличие от оригинальной статье на dzone я оставил в графике от indeed.com только такие языки как: java, C++, C#, objective c (убрал Perl и Visual Basic).

    Получилась такая картинка: (далее…)

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

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

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


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

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

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

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

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

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

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

    (далее…)

  • Про JavaScript (не для JavaScript программистов).

    Последние полтора месяца пишу для одного своего заказчика графический движок на JavaScript (HTML5/Canvas), который будет рисовать в браузере некоторые их инженерные схемы. Параллельно консультирую штатных программистов, у которых не очень большой опыт работы с JavaScript-ом.

    При кажущейся простоте JavaScript не создан для легкого написания надежного кода. Для самопроверки пользуюсь jsLint-ом и периодически запускаю google closure compiler. Тем не менее, это не решает всех проблем. Даже если вы пишете правильный и аккуратный код, указываете комментарии в исходником коде для проверки типов и т.д., все равно приходится время от времени сталкиваться с работами других программистов.

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

  • Java EE Architect

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

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

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

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

  • Встречи Scala программистов в Москве

    Для меня Scala не “абстрактный сферический конь в вакууме”, а язык, который я использовал в нескольких реальных проектах в течение последних трех лет. Хочу сразу отметить, что мы не использовали никаких скала-фреймворков – лифт, скалаторы и прочее. Во-первых не было необходимости, во-вторых можно без особых усилий писать на scala и использовать только обычные java-фреймворки.

    Кроме программирования на Scala в 2010-2011 я вел курс по выбору в МФТИ “Практикум по программированию на Java и Scala”. В результате у меня наработался некоторый объём дидактического материала.

    В итоге летом 2011 года мы с друзьями решили организовать в Москве независимые регулярные встречи Scala программистов.
    Под “независимыми” имеется в виду – без патронажа каких либо коммерческих организаций жадных до денег или мозгов программистов.
    Регулярные – старались встречаться каждую неделю, но естественно были перерывы.
    Формат встреч самый простой – собираемся и решаем небольшие задачки на Scala.

    Место встречи – различные кофейни и другие либеральные заведения общественного питания, в которых есть wi-fi.
    Как правило встречи проводились после рабочего дня, поэтому кто-то в процессе обучения пил кофе и ел пирожные, кому-то было интересней пиво или сытный ужин.

    Один человек притаскивал ноутбук (как правило это был я со своим 17” HP).
    Выбирали одну задачку на всех, она разбивалась на несколько кусочков.
    Главное условие – каждый должен был написать хотя бы несколько строк кода.
    Если не успеваем решить – переносим на следующую встречу.

    Также кто-то на встречах рассказывал про свой опыт использования Scala у себя на работе или какие-то интересные аспекты языка.
    В качестве источника информации использовали в основном стандартную документацию по API, мои презентации к физтеховским семинарам,
    и книжку Мартина Одерского “Programming in Scala”, которую мне подарил Коля Матюшев (книжка на английском, он ее купил когда работал в Лондоне).

    Некоторые задачки которые мы решали на наших “семинарах”:

    • Рисовалка Мандельброта
    • Разные фракталы на L-System-е
    • Игра жизнь
    • Решалка судоку

    Места в которых проводил занятия (в хронологическом порядке):

    • КофеИн
    • Шоколадница
    • Кофе-Хаус
    • Му-Му

    Думаю станет чуть потеплее и мы продолжим (а может и раньше).
    Кто был на встречах: Валерия Ива Виннер, Серж, Артур, Ник, Миха, Вит.
    Прошу прощения если кого-то забыл. Буду рад новым встречам!