Рубрики
Java

Распараллеливание задач в Java через InvokeAll

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

Сразу хочу заметить, что мне не очень хочется углубляться в описание всей мощи java concurrent API, а просто расставить некоторые акценты при работе над небольшой простой задачей. Она может возникнуть в жизни каждого программиста, он замечает некоторые независимые операции и у него появляется нестерпимое желание их распределить по нескольким потокам. Грубо говоря, у вас есть какой-то метод, который можно было бы безболезненно запихнуть в Runnable-ы, стартануть и подождать когда все закончат свою работу.

Понятно, что для этого может подойти invokeAll т.к. в описании про него явно сказано: «Executes the given tasks, returning a list of Futures holding their status and results when all complete

Так вот, некоторые программисты не дочитывают последние слова и думают, что нужно самому контролировать процесс, ждать и «жать на тормоз», проверять все ли потоки завершились, периодически дергать в цикле future.get(), join-ить или делать другие различные телодвижения. Конечно так поступают не все, но тем не менее такое бывает. Для того, чтобы разобраться в том, что происходит на самом деле, достаточно взглянуть в базовую реализацию этого метода (AbstractExecutorService.java). Надо же пользоваться тем, что src.zip в JDK все еще продолжают подкладывать:

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

DCE VM + HotSwap

Горячая замена.

Исходной предпосылкой было как-то упростить процесс разработки/отладки. В некоторых ситуациях, например когда запуск-перезапуск приложения или теста занимает продолжительное время, очень удобно пользоваться возможностью подправить логику работы уже запущенной программы.
В поисках решения наткнулся на довольно занятное решение — Dynamic Code Evolution VM. Данная виртуальная машина является результатом работ проведенных в рамках исследовательского проекта Институтом системного программного обеспечения им. Иоганна Кеплера в г. Линце (Австрия).

Если грубо описать полученный результат — это специальная «пропатченная» Java VM, которая позволяет на лету править классы в работающей машине. Главная плюшка — если обычно при дебаге вы можете «на горячую» менять содержимое метода, то в DCE VM можно еще и добавлять/удалять методы и поля в классе.

К сожалению с установкой DCE VM у меня не заладилось с самого начала. Инсталлятор не сработал, в итоге пришлось просидеть полночи в попытках заполучить эту чудную VM. К решению этой задачи пробовал подступиться с разных сторон. Пытался собрать исходники. Собирать пришлось из под cygwin-а (в очередной раз пожалел, что сейчас у меня рабочая операционка не Linux). Потом возникли сложности с установкой «Microsoft SDKs Windows v7.1», который почему-то не хотел устанавливаться. В итоге, правдам и неправдами, перед самым рассветом, перерыв кучу ссылок в интернете различными кривыми путями мне удалось стать счастливым обладателям этой машинки. Конечно сейчас, оглядываясь назад, у меня создается впечатление, что на самом деле я сделал кучу лишних шагов и про установку DCE VM информации более чем достаточно, главное внимательно читать инструкцию.

Мои эксперименты.

После того как всё настроил Hot Swap заработал сразу на:

  • Простых Java SE проектах.
  • Java Web проектах под Apache Tomcat.

Схема работы простая. Запускаем под дебагом → Делаем изменения → Жмем Apply Changes.

apply_code_changes

Если речь идёт о более экзотических случаях, например разработка Rich приложений на Netbeans Platform — то горячая замена у меня не заработала. Чуть позже у меня появилась гипотеза, что возможно это связано с тем, что у Netbeans Platform свой ClassLoader. Возможно гипотеза неверна и дело в настройках, думаю в свободное время посмотреть более внимательно исходники проекта и утилит, которые идут вместе с ним.

Рубрики
Java

Про новые публикации на блоге и планы на ближайшее будущее

Ближе к концу марта запускаю крупный проект на Java SE/EE. Сейчас по нему ведутся предварительные работы (проработка архитектуры, подготовка проектной документации, переговоры с клиентом и т.д.).
В связи с этим буду не сильно задействован непосредственно в разработке и думаю появится чуть больше свободного времени. Поэтому хотел в блоге сделать пару объявлений.

1. Планирую разобрать скопившиеся на блоге черновики. Их скопилось довольно много и все они в разной степени готовности и хочется как-то выставить приоритеты.
Вопрос, который меня терзает: «по какой тематике интересней было бы прочитать статьи?».
Варианты:

  • Про Android
  • Обычная Java (Scala)
  • О программирование в целом (UML, архитектуры, шаблоны и т.д.)

Если есть какие-то пожелания и предпочтения – буду рад узнать о них в комментариях.

2. В связи с менее загруженным графиком работы у меня (и в большей степени у моей коллеги) появилась возможность сделать небольшую заказную мобильную разработку под Android (и не только).
Если будут конкретные предложения — буду рад пообщаться.

Исходные данные.

Рубрики
4. Полезняшки

Умножаем на пи (π = 3,14159265…)

Около месяца назад мне попался на глаза шедевральный пост, в котором приводится гениальное по простоте, остроумное и изящное математическое доказательство теории: «при оценки сроков и объема работы над проектом желательно умножать исходную оценку на Пи». Оригинальный труд находится по следующей ссылке: http://www.altdevblogaday.com/2013/11/15/always-multiply-estimates-by-pi/. В этой статье хотел изложить краткий пересказ доказательства.

Допустим у вас есть какой-то исходный план действий.
Обозначим его вектором направленным из точки A в предполагаемую точку B0.
blog-1

Времена меняются. Цель из точки B0 отодвигается под фактором различных обстоятельств в точку B.
blog-2

Естественно не бывает так, что всё идет гладко, возникают трудности, которые приводят к отклонению от прямой. В итоге путь, по которому вы прибываете к цели является кривой.
blog-3

Рубрики
Java

Duke, Coworking, Widget.

За последнее время прошло несколько важных событий, о которых давно хотел написать.
Про одну новость я уже просто не имею права писать с ещё большей задержкой и опозданием…
Итак, во-первых, самое главное событие о котором я узнал в сентябре — команда российских программистов получила Duke Award 2013 в Сан-Франциско!
DukeAward2013
Ребята занимаются разработкой симулятора для Java Card Runtime Environment (jCardSim), пишут обфускатор и ПО для защиты Андроид приложений от реверса, а также ведут различные, по-настоящему сложные, Java-разработки. Другими словами занимаются не какими-то поделками вроде корпоративного веб-софта, клепание порталов и другими типовыми B2B/E-Commerce/Banking/Enterprise проектами, а работают над фундаментальными разработками и действительно непростыми вещами, в отличие от многих-многих Java программистов Москвы.

Друзья, еще раз мои поздравления!

Во-вторых, мы пытаемся возобновить наши встречи программистов или как сейчас модно говорить MeetUp-ы. Конечно сейчас уже будет не Scala, основы языка мы разобрали давным давно, у некоторых из нас использование Scala стало вполне будничным и хочется чего-то нового. Следующие встречи предполагаем посвятить процессингу, Arduino, малинке (raspberry pi). Всей нашей небольшой группе захотелось двинуться в сторону железок и интерактив арт. Думаю как всегда половина времени уйдет на общение с железками/компьютерами, а половина на распитие кофе и общение на общие темы.
Место встречи — на территории дизайн-завода Флакон или в кофейнях (как старые добрые времена).

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

Наконец последняя новость. Мы недавно с друзьями решили вместе сделать Halloween Widget для Android. Как всегда всё в последний момент, но мне кажется получилось намного круче чем я ожидал.
По сути это тот же робот, только сильно доработанный. Из функциональных вещей добавился фонарик (Бека — спасибо, за пример кода!). Включается нажатием на центральную кнопку. Поскольку фонарик по-сути использует вспышку от встроенной фотокамеры, то для работы потребуется разрешение для работы с камерой: android.permission.CAMERA.

Огромный респект нашему дизайнеру Грише за проделанную работу и Тане, за львиную доли работы по переделке-улучшению UI/UX!
Выкладываю пару картинок, сам виджет можно скачать с маркета и при желании по тестировать.


unnamed unnamed2

Рубрики
0. Мироощущение и бытие

Сколько стоит?

Так получилось, что я знаком со многими программистами, которые работают в крупных (и не очень) софтверных компаниях в качестве наемных сотрудников, т.е. на окладе. На сегодняшний день Москве можно наблюдать два явления:
1. Дефицит квалифицированных кадров.
2. Кризис самореализации. Много ИТ специалистов в прошлом учились в лучших высших учебных заведениях России, но текущая их работы не в полной мере позволяет им реализовать свой потенциал. Одни мирятся с таким положением дел, у других возникает желание «изменить судьбу», открыть свое дело, начать стартап, освободиться от «офисного рабства».

Как следствие они начинают карьеру молодого предпринимателя, пытаясь начать самостоятельные проекты, искать заказы на разработку ПО. При этом у многих сохраняются наивные представления о том, как продавать свои услуги, на каких условиях работать с клиентом и самый главный вопрос возникающий у начинающего московского программиста-предприниматели — сколько стоят его услуги по созданию программного обеспечения. Для многих технически подкованных специалистов моего возраста в школьные годы не составляла особого труда решить примера вида:
blog_primer

Пример из сборника задач Сканави М.И. для поступающих ВТУЗы. В прошлом, те кто хотел поступить в ВУЗ могли решить такой пример не особо себя утруждаю, как мы шутили «спинным мозгом». Наверное сейчас с появлением ЕГЭ эпоха задач из Сканави уходит в прошлое.

С другой стороны, когда нужно сделать не намного более сложные арифметические и алгебраические операции, но вместо конкретных чисел будут стоять налоги, накладные расходы, человеко-часы, риски, объемы, сроки, скидки и другие составляющие, то это вызывает панику. Человек с высшим техническим образованием может потратить несколько дней или даже недель, чтобы найти грубые ошибок в своих вычислениях.
Другими словами, если речь идёт о готовом математическом выражении — всё просто, но если это якобы «бизнес» ситуация и нужно ответить на вопрос «за 100 000 сделаешь программу?» или «сколько будет стоит сделать мобильное приложение?», то начинается тупёж. Например постоянно сталкиваюсь с людьми, которые путаются с процентами и не могут посчитать какую цену они должны указать заказчику, чтобы у них осталось 100 000 рублей после оплаты налога в 6% с дохода?
Казалось бы ответ очевиден — приблизительно 106 383 рубля, но даже в таком простом примере многие делают ошибки (считают 106 000) или вообще не учитывают налог в конечной стоимости («да ладно, пусть, чего мелочится, всего 6%»). Когда же нужно проделать более «сложные» вычисления, т.е. учесть в цене все затраты (часы на согласование проекта, тестирование, внедрение, отчисления в фонды, обслуживание счета в банке, расходы на аренду, обрудывание и другие расходы), то в итоге некоторые делают множество существенных арифметических, алгебраических и алгоритмических ошибок. Хотя на самом деле, здесь нет ничего сложного.

Ошибка 1.

Допустим существует некий абстрактный московский java-программист. Его зарплата 120 000 в месяц. Он решил, что начинает работать на себя. Какую стоимость человеко-часа выставлять заказчику? Берем зарплату и делим на среднее количество рабочих часов в месяц (допустим 164,17 часов). Получаем стоимость часа около 731 рубля.

Давайте приведем аналогию из сферы услуг. Я знаю фитнес-центр в котором годовой абонемент стоит 16 000 рублей. Это недорого для Москвы (даже скажем средний, бюджетный вариант). Фитнес открыт ежедневно, работает по 12 часов в день. Разделим 16 000 на количество часов в году (365 дней * 12 часов = 4 380 часов) и получим стоимость часа равную 3 рубля 65 копеек. Посчитав это, я решаю пойти и позаниматься 2 часа, т.к. по моим расчетам должен заплатить 7 руб 30 копеек. Вопрос, почему администрации фитнес-центра требует с меня за разовое посещение 500 руб?! Что за наглость?

  2 * (16 000 / (365 * 12)) = 7.30 != 500

Устраиваясь на работу, программист предоставляет свои услуги работодателю не на один месяц, а как правило по бессрочному договору, т.е. работать будет годами (хотя на обычно специалист меняет работодателя через 2-5 лет). Вы как бы «продаете» годовой абонемент своему работодателю — будут для вас задачи или нет, это уже не ваши проблемы. Фитнес-центр же не виноват, что кому-то лень тащить свое тело в зал и кто-то не приходит заниматься уже вторую неделю. Так и здесь, работодатель сам должен обеспечить вам фронт работы, а вы качественно программировать и получать каждый месяц зарплату. Если задач нет, то можно плевать в потолок или гонять танки, вашей вины в простое нет.
Другими словами, если вам предлагают проект на условиях: 2 миллиона рублей на 12 человеко-месяцев, деньги поступают каждый месяц, заказчик покупает вам необходимую для работы компьютерную технику, оплачивает интернет и аренду рабочего места, то можно говорить о том, что стоимость часа равна 731 рублей. Если это подработка на 60-100 часов, то о каких 731 рублей за час может идти речь? Вас же за 7 рублей в фитнес-клуб никто не пустит, хотя стоимость часа рассчитана по схожему принципу. Думаю для любого торговца на улице очевидна причина в разнице цены за килограмм картошки между покупкой ее вагонами и трех килограммов в розницу, но почему-то у программистов-предпринимателей работает «линейное» мышление в расчете цены.

Ошибка 2.


Есть такой бородатый анекдот:
Новый русский открыл фотосалон и дал объявление: «Приглашаю фотомодель для съемки. Оплата наличкой на месте. За час работы 20 тысяч баксов».
Набежала куча моделей, отобрали одну, снимали с вечера и до ночи.
Приходит новый русский:
— Ну что, фотограф, сколько наснимал?
— Четыреста кадров.
— А выдержку ставил какую?
— 1/200 секунды.
— Ну ты, девка, в натуре, на две секунды всего лишь наработала, держи 12 баксов.

К чему я вспомнил этот старый анекдот из прошедшей эпохи?

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

Apples and oranges. Сравнение веб-фреймворков.

Этим летом ко мне обратился старый знакомый, который хотел начать разработку нового веб-проекта. Он хотел пообщаться/посоветоваться на тему современных инструментов (фреймворков) для разработки веб-приложений. Дело в том, что у него скорее планировалась не разработка нового, а переделка старого проекта, сделанного на JSP и сервлетах, базовая архитектура которого ваялась еще в начале 2000-ных. В прошлом я немного участвовал в жизни этого программного продукта (доработки по Hibernate, прикручивал apache fop и т.д.), поэтому был немного в курсе внутренних особенностей системы.

В целом это было добротное веб-приложение на Spring-e и оракловой СУБД. Думаю многие из нас в былые времена делали подобные вещи. С тех пор многое поменялось, одни инструменты сильно развились, появились абсолютно новые, а некоторые безнадежно устарели и канули в Лету. В итоге мы решили встретиться, пообщаться, попить кофе и обсудить, кто с чем столкнулся на профессиональном поприще за последние несколько лет, а также поделиться впечатлениями об использовании тех или иных инструментов.
На мой взгляд к 2013 году человечество создало такое огромное количество библиотек, утилит, платформ и других полезных и бесполезных вещей для создания веб-приложения, что разобраться в них становится все сложнее и сложнее. Суть проблемы заключается в том, что обилие различных модных слов создают кашу в голове программистов.

Чтобы хоть в чем-то упростить себе (и другим программистам) жизнь, я решил после нашей беседы написать этот небольшой обзор различных веб инструментов (в контексте Java и JavaScript). Возможно многие вещи покажутся слишком простыми и очевидными, рассчитанные на совсем юных программистов, тем не менее думаю ошибочно считать, что «каша» возникает только у новичка. Наоборот, умудренные опытом программисты, опираясь на сформировавшиеся у себя в мозгу концепции, проецируют свои старые понятия на новые фреймворки, в итоге сложнее впитывают суть, смысл и назначение новых.

Ведь на самом деле, многие инструменты качественно отличаются друг от друга и сравнивать их порой не представляется возможным. Apple_and_Orange_-_they_do_not_compareВ английском языке существует выражение «сравнивать яблоки и апельсины«, в русском языке ближайшим аналогом этого высказывания «путать теплое с мягким«. Сравнивать разные по сути вещи. Например, все равно что сравнивать JSF и jQuery.

Поэтому, чтобы внести ясность, я решил раскидать «яблоки к яблокам, а апельсины к апельсинам». В итоге получился следующий текст.

Рубрики
0. Мироощущение и бытие

Let’s rock, everybody!

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

Статья про рок-банды, новое время и программирование.

rock-and-roll-xs

 

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

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

Если мы посмотрим на разработку программных продуктов по классической водопадной схеме, то состав участников также будет довольно обширным: архитектор, тим лид, ведущие программисты, несколько программистов разной специализации (java, c/с++, javascript и тд) и группа дизайнеров с верстальщиками. Естественно далеко не все компании могут себе позволить идеально укомплектованный состав. Наиболее успешные организации могут заинтересовать в профессиональном и материальном плане более сильных специалистов, остальные конторы довольствуются тем, кто соответствует их уровню.

Тем не менее, на мой взгляд, существуют предпосылки для все большей популяризации нового формата коллективов. Во-первых это связано с большей доступностью компьютерной техники и развитием сервисов для разработчиков, во-вторых с ростом среднего уровня компьютерной грамотности, в-третьих формирование более позитивного отношения к техногикам у молодежи и общества в целом (сериал Теория Большого Взрыва, истории успеха и биографии Билла Гейтса, Марка Цукерберга, Стива Джобса и тд).

Под новым форматом я имею в виду небольшой творческий коллективов состоящий из 3-5 человек. Это еще не «оркестр», но уже и не соло-программист. Естественно масштаб создаваемых произведений не сопоставим с творением Классики. Другими словами, если проводить аналогии, речь идет о коллективах создающие программы «по духу» более близкие к Yesterday Битлз, чем к Хорошо темперированному клавиру И.С. Баха.
Все идет к тому, что в программировании наступит время аналогичное музыкальной эпохи 60-70гг прошлого века.

У кого-то может возникнуть такая ассоциация:
blog_beatles
у других такая:

Рубрики
4. Полезняшки

Комиксы

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

1. CommitStrip

Французские авторы. Про жизнь небольшой команды занимающейся веб-разработкой.

Рубрики
Java

Java и лямбда-выражения.

Lambda

Ни для кого не секрет, что во второй половине 2013 года планируется выпуск Java 8 (UPD: на JavaOne 2013 в Москве сообщили, что выход восьмерки перенесут на 2014). Мне наконец-то надоело быть пассивным читателем всех этих многочисленных восторженных отзывов о нововведениях языка и я решил скачать предварительную версию JDK (благо она уже давно выложена) и начать свои экзерсисы.

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

JDK с «Lambda Project» можно скачать c официальной страницы.
Также в текущей сборке JDK 8 (на момент написания статьи) лямбды уже тоже есть, но API с коллекциями еще не полностью завершены.

Целью данной статьи не написание учебного пособия по новым функциям Java, думаю этой работой должны заниматься ребята из Oracle. Здесь я хотел сделать небольшие заметки для себя на будущее вместе с небольшими примерами кода, к которым хотелось бы вернуться после официального выпуска JDK 8.

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

Мои опыты

Один из самых часто встречаемых примеров в интернете, демонстрирующих пользу от использования лямбды — замена старых добрых анонимных классов.
Сравните. Это новый вариант:

   // Вот она, анонимная функция!
   Runnable r = () -> System.out.println("hello");
   Thread th = new Thread(r);
   th.start();

Вот так по-старинке:

   Runnable r = new Runnable() {
        public void run() {
            System.out.println("hello");
        }
   };
   Thread th = new Thread(r);
   th.start();

Естественно и логично применить такой подход для слушателей.
Вот небольшой сниппет с формочкой и кнопкой.

public class Main {
    public static void foo(ActionEvent e) {
        System.out.println("hello:" + e);        
    }
 
    public static void main(String arg[]) throws Exception {
        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton button = new JButton("Hello");
        // магия происходит здесь
        button.addActionListener((ActionEvent e)-> { foo(e); });
 
        frame.getContentPane().add(button, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }
}

Если у вас аллергия на вложенные скобки, то можно упростить следующим образом:

    // Можно присвоить listener-у
    ActionListener listener = (ActionEvent e)->{ foo(e); };
    // а вот так не скомпилируется ;)
    //Object o = (ActionEvent e) -> { foo(e); };
    button.addActionListener(listener);

Или даже можно сделать так:

   button.addActionListener(Main::foo);

Главное никаких отражений, используется invokedynamic.

Естественно возникает желание посмотреть на API коллекций.

Можно использовать в качестве Comparator-а функцию сортировщик:

   String arr[] = {"a","b","c"};
   Arrays.sort(arr, (x, y) -> x.compareToIgnoreCase(y));

Также в Java 8 будет реализация многопоточной сортировки:

  String arr[] = {"a","b","c"};
  Arrays.parallelSort(arr, (x, y) -> x.compareToIgnoreCase(y));

Функциональщики как раз любят такие многопоточные методы. К сожалению, на моих тестах в используемой версии JDK 8 от использования parallelSort польза была только на примитивных данных (например при сортировки массивов int-ов). На массивах с объектами никакой пользы не было, но ведь и релиз только через несколько месяцев, так что сейчас никаких серьезных тестов скорости проводить некорректно.

Итог

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