Автор: vit

  • В коворкинге. 9 месяцев спустя.

    Итак, 31 октября, накануне Хеллоуина я уехал из коворкинга.
    В сумме провел в нем около 9 месяцев.

    Причины отъезда

    Во-первых, стало шумно. Появилось несколько новых соседей, которые много общаются по телефону (больше 50-70% моего времени пребывания).
    Одного-двух говорливых соседей терпеть еще можно, можно было одеть наушники, сделать перерыв и пройти прогуляться и т.д.
    Когда “говорунов” становится больше трех, коворкинг превращается в call-центр.

    Коммерческим и бизнес-задачам (вроде “холодных” звонков, назначение встреч, раздача задач сотрудникам и т.д.) это особо не мешает, а вот творить становится сложнее. Поэтому если вернусь в коворкинг – буду искать стол с менее шумным окружением.

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

    В итоге мы решили, что в ноябре-декабре наша “команда программистов” вернётся к старому формату – работаем дома и встречаемся в кафешках. Как в старые добрые времена.

    Впечатления

    …I’m enjoying the casino business. You meet a lot of colorful characters…
    Donbot. Futurama (S07E11) Viva Mars Vegas!

    В коворкинге можно встретить множество различных колоритных людей.
    Наверное, если сделать такой прибор, который бы измерял плотность стартаперов (количество ген. директоров, деленное на квадратный метр), то именно в коворкинге он бы зашкаливал. Забавно, но когда постоянно находишься в окружении начинающих предпринимателей, кажется что вся Москва населена стартаперами.

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

    Восточный базар. 27 апреля.

    День Испании. 28 Июля
    http://www.youtube.com/watch?v=FYbSq1CSt1Y

    День Кении. 7–9 Сентября
    http://www.youtube.com/watch?v=rTIr1EGbqvw

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

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

    Некоторые хинты

    Парковка

    Идеально приезжать в 7-8 утра. Ближе к обеду парковку найти сложнее, можно попытать счастья у АЗС-ки в тупике Новодмитровской у железнодорожного перехода.

    Еда

    Рядом есть хлебзавод. Утром продают неплохие пирожные. После обеда заходить нет смысла – ничего не остается.
    Через Дмитровку – магазин с белорусскими товарами. Неплохие печенье и конфеты.
    Обедал я , как правило, бизнес-ланчем в кафе Брокард на территории Флакона. Если много народу, лучше сразу уходить – обслуживание может сильно затянуться.

    Интернет

    Подключаться по шнурку. WiFi в час-пик тормозит.

    Фитнес

    В 15-20 минутах ходьбы находятся:
    1. Бассейн с тренажерным залом (через Дмитровку).
    2. Тренажерный зал, сауна (через железную дорогу).

    P.S.: У администратора коворкинга попросил фоты помещения, как пришлет – выложу.

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

    Для разработчиков 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. То есть тех, кто пишет исходники Андроида.

  • Отрисовка SVG внутри HTML5 Canvas.

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

    Здесь я хотел обозначить совсем другую задачу – отобразить картинку в SVG-формате с помощью API Canvas-a. Другими словами, тема статьи не “SVG против Canvas”, а как рисовать SVG картинки внутри Canvas. Подобного рода задача возникнет, например, в случае, если у вас уже есть небольшой набор не слишком сложных SVG-файлов, и вы хотели бы их использовать, при этом ваш графический javascript-овый движок базируется на Canvas-e.

    Можно выделить два основных похода:
    1. Первый подход.
    Парсить SVG файл JavaScript-ом и руками рисовать его в канву.
    Один из самых популярных движков, которые реализуют подобный функционал это: http://code.google.com/p/canvg/

    2. Второй подход.
    На самом деле, многие браузеры умеют рисовать SVG файлы непосредственно в канву методом drawImage. Точно также как обычные растровые изображения (PNG, JPG и т.д.) – https://developer.mozilla.org/en-US/docs/Canvas_tutorial/Using_images.
    Проблемы заключаются как всегда в том, что разные браузеры могут делать это по-разному.
    В итоге пришлось провести небольшую работу для проверки отображение SVG внутри Canvas-a для различных браузеров. На момент публикации этой статьи получилась следующая картинка: (далее…)

  • Тренды программистских вакансий на 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-е после других языков, возникает путанное понимание некоторых фундаментальных понятий этого языка.
    (далее…)