пятница, 31 декабря 2010 г.

31 декабря - Работаем!

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

понедельник, 13 декабря 2010 г.

Немножко о холиварах

Предыстория

Решил попробовать Google Chrome (GC) на работе . Основной причиной было:
  • более удобная строка ввода адреса (совмещенная с поисковиком)
  • бОльшее пространство под страницы. У FF это Заголовок окна + строка ввода + верхняя панель + закладки + нижняя панель, у GC Закладки + верхняя панель
  • ну и конечноже 'восторженные вопли очевидцев': да он супер!, да он реактивный!, да он кульный/гламурный и т.д.

Проблемы с памятью

После запуска насторожил объем использованного ОЗУ. Решил провести 'следственный эксперимент':
  • Открыто порядка 20 закладок. Немного JS, и очень чуть-чуть Flash (несколько банеров)
  • Google Chrome 8.0.552.215, FireFox 3.6.12. Оба портабельные версии, установлены все необходимые плагины/дополнения
  • Оба браузера стартуют с USB-HDD (дабы ограничит скорость чтения + протестировать работу в боевых условиях)

По очереди запускаем браузеры и смотрим на использование ОЗУ (Windows Task Manager).
Результат меня поразил: FF: 260MB, GC: 1210MB.
В принципе на этом этапе уже все стало ясно: это абсолютно не допустимо тратить 1,5ГБ памяти на 20 страниц (тем более в свете того, что для программистов память это довольно ценный ресурс).
Но, решил проверить "скорость работы".

Оценка быстродействия

Этап 1. От "Клик на иконку" до "Видим готовое к использованию окно (страницы еще не недогруженные)" FF: 6 сек., GC: 1-3 сек.
Этап 2. От "Видим окно" до "Полное восстановление сессии (все страницы загрузились)". FF: 20 сек., GC: 58 сек!!! (30 сек на определении proxy и 28сек. на загрузку всех страниц)
Этап 3. Открытие новой страницы и повторное открытие той же страницы. FF: 5сек/2сек, GC: 5сек./4сек. В качестве примера взята демка icefaces: удивило более быстрое повторное открытие в FF (кеширование или работа JS интерпретатора??).

Выводы

  1. Если вы думайте, что ваш FireFox кушает много памяти, запустите Chrome. Для меня 1200МБ для 20 страниц это непозволительная роскошь!
  2. Похоже, что хваленный быстрый старт Chrome это очередной лохотрон от великого и ужасного. Вспомнился 'более быстрый' старт WinXP по сравнению с Win2000
  3. В работе оба браузера примерно одинаковы. Какой-то супер скорости одного перед вторым замечено не было
  4. В хроме ужасно неудобно работать с закладками
  5. В хроме не нашел некоторых очень полезных плагинов, например WebDeveloper, ScrapBook и FlashGot
Похоже что Chrome пока 'не катит' на роль рабочего инструмент программиста.

среда, 8 декабря 2010 г.

Знакомство Runtime.exec()

Недавно захотелось запустить 'нечто' из Java приложения. В роли 'нечто' был 7Zip, в роли приложение было обычный SE класс с методом main().
Так вот, наткнулся на несколько интересный моментов.

Консольный ввод/вывод нового процесса

Итак, у java.lang.Process есть методы позволяющие работать с stdin, stdout и stderr потоками. Но выяснилось, что не все, что выводится на консоль, попадает в потоки stdout/stderr. Для примера можно запустить 7z.exe b. Есть предположение, что подобным образом ведут себя почти все Java приложения. Также есть предположение, что виной этому работа с буфером консоли 'напрямую' (насколько я понял из объяснений, например это вывод символа в заданную позицию консоли).

Скользкие моменты java.lang.Process

Очень понравилась статья When Runtime.exec() won't

среда, 1 декабря 2010 г.

Знакомство с принципами SOLID проектирования

Знакомство начал вот с этого:
- Хороший дизайн должен быть SOLID: TOP-5 архитектурных принципов - коротко и ясно (на русском и с картинками :) )
- вот где то здесь - серия очерков по каждому из принципов. Но на данный момент, сайт автора 'спит' и на внешние раздражители не реагирует

О декомпозиции методов

Часто приходится встречаться с длинными методами. Реакция на 'это' может сильно зависеть от сложности и времени суток: от "ничего сложного, щас разберемся!" (утром), до "дайте я кого нибудь пристрелю!" (под вечер, когда натыкаешься на 'это' под конец рабочего дня).
Попытки разбить длинный метод на 'много маленьких' не всегда заканчиваются успешно... и регулярно возникают вопросы: 'почему так?' и 'что с этим делать?'

среда, 24 ноября 2010 г.

Быстрое преобразование элемента в коллекцию

Часто встречаются методы, которые принимают коллекции в качестве параметра. Например:
public void print(Collection<string> strings){
  System.out.println("strings: "+ strings);
}

И часто необходимо вызвать эти методы имея всего один элемент. Обычно делают так:
List<string> strings = new ArrayList<string>();
strings.add(str);

print(strings);

но можно сделать и более короткую запись:
print(Collections.singletonList(str));

Из потенциальных неудобств можно отметить то, что Collections.singletonList() возвращает не модифицируемую коллекцию (Добавит элементы в нее уже не получится).

Первые впечатления о PostgreeSQL

Если коротко – это просто капец!
Вот есть ряд нареканий:

О CPU и x64 гостевых ОС

Для работы x64 версий ОС на виртуальных машинах, нужна поддержка технологии VT-x (для процессоров Intel). Наличие этой фенички можно проверить вот здесь.

PS: сейчас жалею, что в свое время поскупился на 10 лишних е.у. при покупке проца, и взял самый дешевый :)

пятница, 29 октября 2010 г.

portable soft

Есть такое замечательное явление как "портабельные программки". Недавно после очередной порции общения с поделками "интернет умников" решил разобраться что, как и зачем. Результаты получились довольно интересными и неожиданными.

Тестировщики, хватит заниматься обеспечением качества (перепост)

Недавно вот познакомился с интересной статьей.

пятница, 22 октября 2010 г.

XML Parser Benchmarks

Когда я увидел название статей, то первой мыслю было: 'Забавно, но нафига это нужно (сравнивать производительность)?'. Первый же абзац заставил вспомнить про великую тучу XML-я, которую приходится пережевывать при работе с веб сервисами.

Ссылки: XML Parser Benchmarks: Part 1 и XML Parser Benchmarks: Part 2.

воскресенье, 10 октября 2010 г.

Тестер враг разработчику

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

Подобные заявления я обычно воспринимал как специфический миф-поверия из мира IT:)

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

Напрашиваются следующие выводы:
  1. Похоже что миф-поверие имеет весьма тики реальную основу (даже не смотря на всю иррациональность подобного поведения)
  2. Есть подозрение, что чем крупнее масштабы конторы компании, тем такое поведении более ярко выражено. Кому-то выгодно подстегивать соревновательный дух таким способом?!
  3. Есть такое наблюдение: большинство трудов об автоматизированном тестировании для разработчиков (TDD, JUnit и т.п.) имеют целые разделы о том, что программисты не любят заниматься тестированием, потому как а) это неинтересное и бесполезное занятие б) это занятие для низших форм жизни. Возможно, значение последнего де мотивирующего фактора (занятие для низших форм жизни) значительно недооценивается

суббота, 9 октября 2010 г.

Трюки с оберточными типами

Недавно коллеги заставили меня немножечко удивиться офигеть. Началось с того, что прислали вот такой код, и спросили каким же будет результат:
Integer a1 = 123;
Integer a2 = 123;
boolean result = a1 == a2;

Наивно полагая, что я неплохо знаю основы языка, я конечно же ответил false.
Оказалось что во первых: "а вот и нифига не правильно (т.е. result == true)", a во вторых: "такой ответ не всегда такой".

четверг, 7 октября 2010 г.

Проблемы валидации XML c XInclude.

Eсть вот такое расширение для XML . Первое знакомство можно начать с этого ресурса.
Вкратце: есть возможность с помощью директивы <xi:include href="..." /> в произвольное место XML вставлять содержимое из другого файла.

Штуковина вроде бы прикольная, но при работе с ней возникают некоторые трудности:
  • XML редакторы не обрабатывают эту конструкцию должным образом.
  • Java SAX парсеры без специальной настройки тоже не обрабатывают эту директиву.

понедельник, 13 сентября 2010 г.

Вопрос по Луркоморью графам

Вместо вступления

Как показывает практика, вот это безобразие на самом деле никого особо не волнует, и контора готова платить за плевание в потолок потери 2-3 и более часов в день. Ну и ладно - пытливый ум способен найти себе занятие (и 'освоить' офисный канал:) ).
Так вот, наткнулся я вот на этот замечательный сайт, и оказалось, что осознать всю глубину написанного мне мешает недостаточное знание русского-матерного и всяких там сленговых словечек. Благо, существует довольно подробные разъяснения практически всех непонятных слов и выражений (интересно, познавательно и с картинками).
После того, как количество закладок в браузере превысило отметку 30, родился резонный вопрос: 'А сколько же это может продолжаться?'

Более форматизированная постановка вопроса

На сколько я понимаю, ближайшая мат. модель - 'граф с однонаправленными связями'. Статья это вершина, связь это гиперссылка с одной статьи на др.
Интересует 3 вопроса:
1. Сколько переходов надо совершить, чтобы посетить все узлы этого графа? Или какой порядок этой цифры?
2. Есть ли несвязанные вершины (без входящих, и исходящий связей)?
3. Есть ли вершины, у которых есть только исходящие связи (т.е. нет входящих)?

вторник, 31 августа 2010 г.

Linux для разработчика

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

Итак, хочется настроить рабочее окружение для java разработки, а именно:
  • JDK 6
  • Ant + Maven
  • Eclipse
  • Увязать это все вместе и интегрировать в системму

Шаги для Windows
  1. Зайти на сайт Sun Oracle, найти и скачать нужную JDK
  2. Установить JDK
  3. Зайти на сайт Apache, найти и скачать Ant
  4. Установить Ant
  5. Зайти на сайт Apache, найти и скачать Maven
  6. Установить Maven
  7. Пробить переменные среды (OS env)
  8. Перезагрузится или закрыть все приложения и перестартовать explorer
  9. Зайти на сайт eclipse.org, найти и скачать eclipse
  10. Установить eclipse
  11. Запустить eclipse и указать установленные JDK
  12. Вытянуть нужные ярлычки

Шаги для Linux (Ubuntu)
  1. Запустить synaptic
  2. Найти пакеты eclipse, sun-java, ant, maven тыцнуть 'Установить' и подождать
  3. Запустить eclipse и наслаждаться ?жизнью? (переменные окружения, ярлыки... вообщем все уже настроено)

Красота!

вторник, 18 мая 2010 г.

Тестирование: 3 этапа

3 этаппа:
1. Интерес
2. Пробы и понимание того, зачем это нужно
3. Уверенное владение инструментом

1. Интерес

Прочитать что такое assert() AssertionError и что такое -ea -de (параметры JVM).

2. Пробы и понимание того, зачем это нужно

Почитать книгу о рефакторинге Мартина Фаулера (и обратить внимание на главу 4). Почитать основы Test Driven Development (например вот здесь). И самое главное - побольше практики.
На этом этапе многое не понятно и практически ничего толком не получается. Самое главное 'не забросить это занятие', а продолжать и перейти на следующий этап.
Также на этом этапе придется столкнутся по крайней мере с 2 framework-ам (JUnit и JMock) и очень желательно разобраться что такое модульное/интеграционного/нагрузочное/стресс и другие виды тестирование (что это такое, зачем это нужно и характерные особенности).

3. Уверенное владение инструментом

3. Уверенное владение инструментом
В начале этого этапа приходит некая ясность в вопросах 'зачем нам это нужно', 'чего мы хотим получить' и есть 'некий практический опыт' (как правило он, этот опыт, не очень удачный и довольно карявенький :)). Так вот, на этом этапе главная цель делать все правильно и эффективно (для себя и для проекта).
Тут очень поможет мега книга - Шаблоны тестирования xUnit. Рефакторинг кода тестов. Толстая и вумная книженция, но есть подозрения, что она принесет очень не много пользы, если не пройти первый и второй этапы.

Мысль о Research Reports

Мысль навеяна воспоминаем одного друга о прошлой работе и кое какими событиями на текущей...

Вопрос

Насколько эффективно выполняются research задачи?

Небольшое пояснение

Оставим случаи 'пойди туда, не знаю куда', а рассмотрим какую нибудь простенькую задачку, с внятной целью.
Ну например: 'научится маппить связь один-многие в Hibernate'.
Под эффективностью я имею ввиду не численный показатель, а меня интересует вот что:
Допустим задание было дано человеку, который не знает что такое 'связь один-многие'. Этот самый человек скорее всего сделает следующее:
  • сначала почитает что такое one-to-many, заодно и все остальные виды связей;
  • потом он найдет документацию, и прочитает какую аннотацию поставить или что прописать в файл маппинга;
  • затем (если по хорошему) он попробует сделать небольной примерчик, а может даже найдет какой нить hibernate tutorial.
В итоге мы получаем 3 момента:
  • человек потратил примерно день на исследование;
  • формально, результатом этого исследования является всего лишь одна строка кода (аннотация)
  • все остальные добытые знания, в лучшем случае останутся в голове у исследователя
Есть еще неявный четвертый пункт - если этого человека не будет 'под рукой', а понадобится, ну скажем замаппить many-to-many, в этом случае второй 'исследователь №2' проделает почти такой же путь.

Что не нравится

вторник, 4 мая 2010 г.

CXF: Шаг 1 - Описание интерфейса средствами Java

Шаг 1. Описание интерфейса средствами Java.
На мой взгляд, работая с CXF лучше использовать именно 'Java first' схему объявления интерфейса. В основном потому, что манипулируя аннотациями легче получить желаемый WSDL.
Итак, процесс описания интерфейса веб сервиса предельно прост и довольно подробно описан на сайте CXF. Но встречаются мелкие моменты, которые не описаны толком, но при этом не дают спать спокойно.

о том, что 'должен делать разработчик'

Совсем недавно пришлось 'немного' побеседовать с манагерами разных мастей на тему 'что у нас плохо, а что хорошо и что с этим делать'. Я услышал довольно много разных 'разработчик должен делать' и некоторые пункты меня удивили. Вот некоторые из них:
  • разработчик должен знать какого уровня железо требуется для проекта (CPU, память и т.д.). Если вдруг, рабочий ПК тормозит, то разработчик должен (ну просто таки обязан) разобраться в чем дело
  • разработчик должен принимать самое активное участие в усовершенствовании процессов на уровне проекта и на уровне организации
  • разработчик должен заниматься тестированием
  • разработчик должен в совершенстве владеть всеми технологиями, применяемыми в проекте, и по другому просто не может быть

Отличия 'get X' от 'find X'

Наблюдение из разряда 'мелочи, которые облегчают жизнь' (и способствуют взаимопониманию).
Есть методы для поиска/получения 'нечто' и есть 2 основных разновидности поведения в случае, если результат не найден (или не может быть получен):
  • вернуть null или пустую коллекцию
  • толкнуть исключение (например ItemNotFoud)

Впервые на эту разницу обратил внимание в ORM framework-ах. Ка правило, если это метод getXXX, то он либо возвращает результат либо толкает исключение, а если это findXXX, то он возвращает результат либо пустое значение (null или пустую коллекцию).

среда, 28 апреля 2010 г.

Unit тестирование и Jackrabbit (JCR)

Вот есть такая замечательная поделка как Jackrabbit - кладязь сюрпризов и неожиданностей. И захотелось как то пописать тесты на классы, которые работают с этим Jackrabbit-ом.

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

понедельник, 26 апреля 2010 г.

Тестирование: начало (ч.2)

Размышления на тему: "что надо сделать, чтобы превратить загадочное слово 'тестирование' в нечто реально полезное для разработчиков?"
Ответить на ряд вопросов:
1. Чего мы хотим добиться?
2. Нужно ли нам это?
3. Можем ли мы это себе позволить?
4. Заниматься этим систематически, т.е. постоянно (это не вопрос, а утверждение).

вторник, 20 апреля 2010 г.

Мысля о качестве ... и не только

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

четверг, 15 апреля 2010 г.

CXF: Шаг 0 - XSD to Java

Почему шаг 0?

Почему шаг нулевой: на мой взгляд этот шаг имеет нулевую пользу и если это возможно, нужно его пропустить. Почему?
  • Мы в этот файл вкладываем информацию о типах данных, которыми будем оперировать в интерфейсах. При преобразовании XSD to Java эта информация изменится (возможно довольно сильно), при преобразовании Java to WSDL получившаяся измененная информация еще больше исказится.
  • Все комментарии, разметка и прочая вспомогательная информация, заложенная в XSD, уйдет "в никуда".
  • Ну и куча "мелочей", от лишних 10 сек при компиляции до необходимости хранить знания об интерфейсе в двух раздельным местах на двух разных языках.
Если вышенаписанное не убедило отказаться от написания XSD или по другому не получается, то вот несколько рецептов "от головной боли":

вторник, 13 апреля 2010 г.

Экономия или скупость?

Лирическое вступление

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

Вот работал я в организациях где к вопросу железа подходили ну довольно просто, в 3 этапа:
1.Со старта дают нормальный (достаточно мощный ПК)
2.В случае надобности, делают апгрейд в довольно короткие сроки (1-10 дней).
3.И сервера, как правило, работают на действительно серверных железках (а не хламе, который остался от прошлого апгрейда).

А вот бывают случаи противоположные. На проекте хронических дефицит ресурсов(железных) - ПК программистов слабенькие, билд серверу не хватает памяти для своего нормального функционирования и т.д. Запросы на добавление памяти(ну супер дорогой ресурс!) либо обрабатываются месяцами, либо на них забивают. И аргументы как всегда железные: «это дорого» и «сейчас нету средств».

Причем, то что я видел, это либо первый случай, либо второй. Так что бы сегодня так, а через месяц по другому практически не видел.

Появилась мысль, что нехватка оперативки и "черепаший" винчестер должны воровать не только нервы у разработчиков, но и деньги у организации. И появилась идея, прикинуть сколько это стоит? И стоит ли...? :)


Задача

Итак, условие задачи:

понедельник, 29 марта 2010 г.

Тестирование: начало

Итак, тестирование в жизни программиста.

Все знают что такое тестирование... или, по крайней мере, так думают :) Написано довольно много книг и статей об этом, выдуманы методологии и практики (ну например TDD) и даже заложены базовые механизмы в "недра Java". И во всех книгах\статьях\презентациях наперебой утверждают что это круто (в смысле unit тестирование), что это жизненно необходимо, и вооще - JUnit спасет мир.

Во как!
И что?!

воскресенье, 28 марта 2010 г.

Подсветка синтаксиса

Вот захотелось получить 2 вещи:
1. Автоматическое экранирование угловых скобок
2. Красивое отображение кода

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

Итак, есть вот такая библиотека.
В двух словах о том, как это работает: с помощью JavaScript в коде страницы ищутся теги с определенными признаками (например <pre> с определенным классом), текст в этих тегах рассматривается как фрагмент исходника, со всеми вытекающими. Т.е. этот текст можно раскрасить и добавить всяких рюшичек (номера строк, выделенные нечетные строки и т.д.). Получается довольно симпатишно:)

Почитать как "это" подключить можно здесь, почитать про дополнительные настройки и стили здесь и здесь. Тем, кому не нравится тег <pre> будет интересно прочитать вот это.

Ну и если очень хочется, можно почитать про подобные "плагины" ( например здесь).

понедельник, 15 марта 2010 г.

Что поправить в свежем Eclipse-е

Каждый раз при настройке Eclipse требуются определенные шаги, для приведения его в "рабочее состояние". Причем эти шаги всегда почти одинаковые. Так что решил перенести свой файлик eclipse.txt в более доступное место.

Шаг 1. Плагины

JD-Eclipse - декомпиляторб замена jadclipse
http://java.decompiler.free.fr/jd-eclipse/update
http://mchr3k-eclipse.appspot.com

regex-util - отладка regex
http://regex-util.sourceforge.net/update/

Spring IDE - работа со Spring
http://dist.springframework.org/release/IDE

Subclipse - SVN клиент

http://subclipse.tigris.org/update_1.6.x - для SVN v1.5 или 1.6
http://subclipse.tigris.org/update_1.8.x - для SVN v1.7
http://subclipse.tigris.org/update_1.10.x - для SVN v1.7 - 1.8
Для Linux и Winx64 также смотри Wiki: JavaHL

EGit - Git клиент
http://download.eclipse.org/egit/updates

p4-wsad (Eclipse 3.6) - Perforce клиент
http://www.perforce.com/downloads/http/p4-eclipse/install/3.6 - для Eclipse 3.6
http://www.perforce.com/downloads/http/p4-eclipse/install/3.7 - для Eclipse 3.7

m2eclipse Core Update Site - работа с Maven проектами
Похоже что проект переместили на:
http://download.eclipse.org/technology/m2e/releases
Старое: http://m2eclipse.sonatype.org/sites/m2e
Возможно еще http://m2eclipse.sonatype.org/sites/m2e-extras

Eeclipse Color Theme - Для любителей нестандартных цветовых схем
http://eclipse-color-theme.github.com/update

CheckStyle - CheckStyle плагин
http://eclipse-cs.sf.net/update/

eCobertura - Cobertura плагин
http://ecobertura.johoop.de/update/

FindBugs - FindBugs плагин
http://findbugs.cs.umd.edu/eclipse

PMD - PMD плагин
http://pmd.sf.net/eclipse

JDepend4Eclipse - JDepend плагин
http://andrei.gmxhome.de/eclipse/


Шаг 2. Базовая настройка

JRE для запуска

Указание пути к java.exe, с помощью которого будет запущен Eclipse (может пригодится для запуска на JDK отличной от дефолтной в системме)
Файл eclipse.ini в начало добавить 2 строчки:
-vm
ПУТЬ_К_JAVA.EXE
Например:
-vm
d:/dev/java/jdk1.6.0_21/bin/javaw.exe 

Побольше памяти

-Xms400M
-Xmx1524M
-XX:+CMSClassUnloadingEnabled
-XX:+UseCompressedOops
-XX:+UseConcMarkSweepGC

суббота, 13 марта 2010 г.

Как мы “бадались” с CXF

Недавно на проекте попробовали перевести веб сервисы с XFire на CXF.
Нь дя... впечатлений получилось много:) Сейчас попробую вкратце описать их.

воскресенье, 7 марта 2010 г.

Как быстро просмотреть используемые порты?

Иногда возникает необходимость узнать кто (какие процессы) и что (какие порты) используют для «общения с внешним миром».

Подготовка состояния объекта после десериализауции

Не часто, но всетаки бывают, случаи, когда требуется сериализовать объект с несериализуемыми полями (ну например, у нас есть log4j логгер). В таких случаях возникают 2 проблемы: