21 Dec 2008

Wild things

Есть мнение, что времена дикого капитализма прошли в начале XX века. Ну это когда нехорошие буржуи всячески угнетали и эксплуатировали пролетариат. Когда пошли революции, буржуи были вынуждены поумерить свои аппетиты и капитализм в итоге, чтобы выжить, стал более социальным, чем любой социализм.

Есть мнение, что времена дикого капитализма в нашей стране закончились в конце XX века. Ну это когда редкий месяц проходил без сообщений о том, что в центре Донецка (или в аэропорту) кого-то расстреляли из автоматов. Когда раздел оставшегося после СССР имущества завершился, завершились и криминальные разборки на высоком уровне.

И то, и другое является заблуждением. Капитализм никогда не был более диким, чем сейчас. Потому что если раньше в дикости был замешан сравнительно небольшой класс буржуев или бандитов, то сейчас в этом принимает участие большинство народонаселения Земли.

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

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

Пример 1. Условный владелец отечественного металлургического комбината (или иностранного производителя бытовой техники) получает 300% прибыль, когда спрос на их продукцию высок. При этом он проявляет довольство, хорошо ест и спокойно спит. Как только спрос на продукцию падает и предприятие начинает нести колоссальные 10% убытки, пара десятков тысяч сотрудников тут же выгоняется на улицу. Для минимизации убытков. Разве это не дикость? Ведь заработанных за прошлые прибыльные годы денег с лихвой хватит на содержание персонала в период кризиса. Конечно, придется отказаться от постройки пятой виллы на Лазурном берегу, но, может быть, и предыдущих четырех хватит для пристойной жизни? А ведь эти сотрудники помогали получать пресловытуе 300%, сами при этом имея куда меньший бонус.

Пример 2. Продавец (или арендодатель) квартиры выставляет цену на свою хибару не исходя из ее реальной ценности, и даже не исходя из своих потребностей, а исходя из той максимальной цены, которую сегодня готовы платить покупатели. Сегодня это будет 40 тысяч, завтра 80 (потому что спрос вырос), а послезавтра 10 (потому что кризис). Как следует относиться к человеку, который еще вчера требовал от вас платить больше, а сегодня согласен на многократное уменьшение платы (лишь бы платили)? Разве не как к мошеннику, желающему всучить вам товар по стократно завышенной цене просто потому, что вам некуда деваться? Еще можно понять тех, кто сам произвел нечто такое, чего не производил еще никто, и хочет за свой труд, за свое гениальное изобретение получить соответствующую гениальности (а не только себестоимости) оплату. Но вымогательство диких денег за полученную в былые времена от щедрого государства халявную хрущобу - это ли не дикость? Или средняя цена за квадратный метр в Москве, составляющая $7500. Пять метров бетонного пола стоят столько же, сколько VW Passat - разве это не дико?
Вот государство вводит максимальный размер наценки на лекарства. Вероятно государство считает, что наживаться на здравоохранении не очень хорошо. А вот наживаться на предоставлении людям нормальных условий проживания, по мнению государства, является вполне цивилизованным способом ведения бизнеса. Хотя здоровье зависит от того, где и как ты живешь.

Пример 3. Как только случается кризис и следующие за ним увольнения, на улицы выходит масса людей, рассказывающая ужасные истории о том, что денег нет, зарплату не платят и детей, как следствие, кормить нечем. Во всех этих историях деньги почему-то заканчиваются сразу в момент потери их источника. Хотя все знают, что в мире вообще, и в нашей стране, в частности, время от времени случаются всякие кризисы, инфляции и прочие непонятные девальвации. Никто ведь не мешает отложить кусочек на черный день (а лучше - на черный год) за годы спокойного зарабатывания денег. Но вместо этого постоянно в кредит покупаются машины (и те, кторые ездят, и те, которые стирают), потом вся зарплата уходит на выплату процентов (кроме той ее части,которая уходит на выпивку, на которую денег хватает всегда), потом случается кризис, и тут же миллионы детей остаются голодными. А виновато в этом, естественно, государство (не то чтобы оно тут совсем ни при чем, но выставлять его единственной причиной своих бед, по меньше мере... дико).
Опять же, по всем опросам процент людей, считающих себя бедными, неуклонно растет. С другой стороны, в одном только Донецке ежедневно продается несколько десятков автомобилей. Вероятно, это группа местных богачей каждый день, для разнообразия, покупает себе по новой тачке. Другими словами, если ты такой бедный, может, не стоит покупать Lanos в пятилетний кредит под 15% годовых? Если уж так нужна машина, может, стоит на нее накопить (а если по пути случится кризис, то на накопленные деньги можно спокойно прожить от нескольких месяцев до нескольких лет)?
Если же посмотреть на это дело с другой стороны, то и автопроизводители тоже не ангелы. Вот вступила Украина в ВТО, таможенные пошлины резко упали, а цены на ввезенные автомобили почему-то остались на месте. На все вопросы импортеры отвечают нечто вроде "ну, цена на машины на рынке формируется с учетом многих факторов.. вот мы посмотрим, какая будет ценовая политика у конкурентов.. если они цену снизят, то и мы, может быть, об этом подумаем". По-моему, это как-то дико.
Я уж не говорю о банках с их совершенно дикими процентами по кредитам.

Пример 4. Некоторые личности из JBoss не упускают случая пнуть компанию Sun по поводу и без. Видите ли, бизнес-модель у них какая-то неправильная. Эти люди явно забывают о том, что именно благодаря Sun они вообще имеют свою работу и какой-никакой доход. И вместо того, чтобы давно причислить создателя и хранителя Java к лику святых и молиться, чтобы с ним ничего не случилось, они усердно пилят сук, на котором сами давно сидят.

Дикари, что с них взять.

20 Nov 2008

I don't need your build.xml

Обновив недавно свою IntelliJ IDEA до 8-й версии, а также услышав о выходе долгожданной NetBeans 6.5, я естественным образом решил посмотреть, что же представляет из себя последняя, не стало ли ей возможно пользоваться и не напрасно ли я потратил очередные $149 на обновление лицензии для IDEA. Скачав и установив (и даже зарегистрировав) NetBeans, я бодро ее запустил.

Запуск прошел на удивление быстро. Настройки самой IDE и ее интеграции с JDK, базами данных и серверами приложений никаких проблем не вызвали (хотя нет, вру, одна проблема нашлась: из всех конфигураций моего JBoss'a NetBeans почему-то признала только "all", хотя ее я как раз не использую. Впрочем, расстроиться по этому поводу я не успел, потому что до момента, где мне эта интеграция могла бы понадобиться, я все равно не дошел). Покончив с настройками я, затаив дыхание, попробовал открыть один из моих текущих проектов.

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

Действительно, при создании нового проекта типа "Enterprise Application" в IDE вы указываете путь к папке с существущим проектом - и немедленно (еще раз отметим быстродействие) получаете сообщение "Project folder already exists and is not empty" с невозможностью дальнейших шагов. Впрочем, на этапе выбора мы среди типов проектов видели "Enterprise application with existing sources", может быть, это то, что нам нужно?

Возвращаемся на шаг назад, выбираем этот тип и повторяем попытку (попутно отметив в описании  этого типа проекта нечто вроде "The enterprise application must conform to the J2EE BluePrints Project Conventions...", но решив для себя ознакомиться этими конвенциями позже... если понадобится). Снова указываем путь к нашему проекту и тут путь нам преграждает другое сообщение: "Project Folder already contains "build.xml" file". Все. Пути дальше нет. Нет и никакой подсказки, как бы нам обойти эту маленькую проблемку. Но разве это остановит нас в нашем стойком желании оценить крутизну новой IDE?

С маниакальным упорством мы возвращаемся назад и, побродив среди различных типов проектов, находим "Java Free-Form Project", описание которого обещает нам мирно сожительствовать с существующим build.xml. И, о чудо, наш проект готов и можно, наконец, воспользоваться множеством обещанных ранее фич!

К сожалению, тут нас ждет очередной облом. Так как упомянутый "free-form" начисто лишен какой бы то ни было поддержки Java EE - это просто возможность редактировать классы исходного кода в редакторе и запускать сборку Ant'ом. Но ведь и это немало, не так ли?

Увы, даже и этой малости я оказался лишен. То есть, все было хорошо, пока не пришло время указать, что одна пачка исходников (в реальной жизни относящаяся к EJB-модулю) зависит от другой (в мире - JPA-модуль). По неосторожности (или в тайной надежде, что IDE будет отслеживать изменения исходников до их компиляции) я указал путь к исходникам, а не к скомпилированным классам, что почему-то вызвало длительную задумчивость системы при стабильной 50% загрузке процессора. На 4 минуте ожидания я оборвал эти мучения путем безжалостного убийства процесса и перезапустил NetBeans. В этот раз я был умнее и указал путь к классам, что, через несколько долгих секунд (в этом месте упомянутая ранее скорость почему-то не включалась) привело к ожидаемому результату - указания об ошибках типа "Cannot resolve symbol" исчезли. Воодушевленный этим успехом я проделал ту же операцию для исходников веб-модуля, которые зависят от обоих ранее упомянутых модулей... но в этот раз система опять впала в необъяснимую задумчивость. Убив через 5 минут процесс, я не стал перезапускать IDE, а посидел и подумал.

В конце-концов, почему бы не поступиться своим собственным build.xml, и не принять то, что мне навязывает NetBeans? А свой, например, переименовать? Или перенести куда-нибудь, а потом встроить в автоматически созданный скрипт?

Например, потому что мне нравится свой build.xml. В конце-концов, это результат многолетней оптимизации, улучшения и вылизывания, он делает то, что я хочу, так, как я хочу, и самым оптимальным, на мой взгляд, способом. И для того, чтобы собрать проект, всего-то нужно его скачать и запустить команду ant в корневом каталоге. Все необходимые условия - установленные JDK и Ant. И я совершенно не хочу поступаться этой простотой (даже если в итоге всего лишь придется запускать что-то вроде "ant -f build-mine.xml" - я не хочу это объяснять всем тем, кому придется работать над созданным мной проектом в будущем). Короче я не хочу отказываться от содержимого моего скрипта сборки и не хочу, чтобы он назывался как-то иначе.

В конце-концов, почему скрипт сборки должен одновременно служить файлом конфигурации проекта?

И почему бы разрабочикам такой навороченной IDE (а я не сомневаюсь, что она содержит множество полезных свойств и возможностей) не вспомнить, что их IDE - не первая в мире, да и Ant существует довольно-таки давно, и множество проектов использует его для сборки самым что ни на есть по умолчанию образом? Почему хотя бы не предоставить при создании проекта дополнительные опции (например, возможность переименования своего или чужого файла), раз уж случилась такая неприятность и build.xml уже существует?  Почему бы не продемонстрировать своим потенциальным пользователям, что вас хоть немного интересует, насколько удобно нам будет пользоваться вашим замечательным приложением (ради которого, по идее, мы должны отказаться от какого-то другого приложения)?

В чем же тут позитив, спросят те, кто недавно выражал мне неудовольствие в связи с перекосом в сторону негатива в моем блоге? А вот в чем: $249 на покупку 7-й версии Intellij IDEA и $149 на апгрейд до 8-й потрачены не зря! Ура, товарищи!

С нежностью тыкает мышкой в зелененький треугольничек. С умилением наблюдает, как Idea сначала собирает проект с помощью моего (моего!) build.xml, потом запускает JBoss (конфигурацию "default"), разворачивает в нем только что собранное приложение и в завершение процесса открывает окно браузера точно по адресу начальной страницы развернутого приложения...

12 Oct 2008

Скажи мне, какой у тебя стиль кода, и я скажу, кто ты

Стиль кода (Code style) - настолько важная вещь, что многие IDE имеют встроенную поддержку создания, редактирования, использования, проверки и обмена различными стилями. Особенно важным придерживание определенного стиля становится при совместной работе над кодом. Поэтому многие организации стандартизировали свой стиль, придерживаться которого обязаны все участники кодирования, а на всякий случай существуют еще и специальные плагины, позволяющие приводить стиль к стандартному перед коммитом.

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

Например, вот как выглядит типичный метод, написанный в соответствии со стилем кода, принятым в Apache:

 private Map getNavigationCases(FacesContext facesContext)
    {
        ExternalContext externalContext = facesContext.getExternalContext();
        RuntimeConfig runtimeConfig = RuntimeConfig.getCurrentInstance(externalContext);

        if (_navigationCases == null || runtimeConfig.isNavigationRulesChanged())
        {
            synchronized(this)
            {
                if (_navigationCases == null || runtimeConfig.isNavigationRulesChanged())
                {
                    Collection rules = runtimeConfig.getNavigationRules();
                    int rulesSize = rules.size();
                    Map cases = new HashMap(HashMapUtils.calcCapacity(rulesSize));
                    List wildcardKeys = new ArrayList();

                    for (Iterator iterator = rules.iterator(); iterator.hasNext();)
                    {
                        NavigationRule rule = (NavigationRule) iterator.next();
                        String fromViewId = rule.getFromViewId();

                        //specification 7.4.2 footnote 4 - missing fromViewId is allowed:
                        if (fromViewId == null)
                        {
                            fromViewId = ASTERISK;
                        }
                        else
                        {
                            fromViewId = fromViewId.trim();
                        }

                        List list = (List) cases.get(fromViewId);
                        if (list == null)
                        {
                            list = new ArrayList(rule.getNavigationCases());
                            cases.put(fromViewId, list);
                            if (fromViewId.endsWith(ASTERISK))
                            {
                                wildcardKeys.add(fromViewId);
                            }
                        } else {
                            list.addAll(rule.getNavigationCases());
                        }

                    }
                    Collections.sort(wildcardKeys, new KeyComparator());

                    synchronized (cases)
                    {
                        // We do not really need this sychronization at all, but this
                        // gives us the peace of mind that some good optimizing compiler
                        // will not rearrange the execution of the assignment to an
                        // earlier time, before all init code completes
                        _navigationCases = cases;
                        _wildcardKeys = wildcardKeys;

                        runtimeConfig.setNavigationRulesChanged(false);
                    }
                }
            }
        }
        return _navigationCases;
    }


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

Как бы назвать организацию, стиль кода которой ориентирован на кубических идиотов?

8 Oct 2008

Их лица

Пролог. Исходные данные.

По историческим причинам работа моя связана с сервером приложений JBoss, конкретнее - с 4.0.х его версией (впрочем, другой приличной версии все равно нет). В частности, имеем JSF 1.1 и, в качестве реализации, Apache MyFaces. Увидев некоторое время назад сообщение о том, что в версии 1.1.6 этой чудесной библиотеки была исправлена одна проблема, которая меня несколько беспокоила, я решил испытать эту самую новую версию, для начала - на своем домашнем компе. Никаких особых отличий я обнаружить не ожидал, так как, являясь исключительно реализацией спецификации, релизы MyFaces серии 1.1.х содержат в основном только исправления найденных ошибок. Так что предполагаемой последовательностью моих дествий было проверить корректность исправления интересовавшей меня проблемы, проверить, что все остальное работает в штатном режиме, и распространить новую версию на все наши сервера.

Часть 1. Их лица.

Этому плану не суждено было осуществиться.

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

No context init parameter 'org.apache.myfaces.CONFIG_REFRESH_PERIOD' found, using default value 2

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

Таким образом, отложив на время исходный план и вооружившись браузером, я принялся за выяснение вышеназванных вопросов. Поиск в гугле по названию контекстного параметра никакой полезной информации не принес. Тогда, изучив changelog этой версии, я нашел запись, которая, по идее, описывает введение этой новой функции отслеживания изменений конфигурации. Здесь, однако, кроме указания на то, что период вычисляется в секундах, ничего полезного так же не нашлось. Последней надеждой на цивилизованное решние проблемы была возможность того, что, с момента моего последнего исследования, авторы MyFaces резко превратились в приличных людей и выложили описание всех контекстных переменных, которые они ввели (а их что-то около десятка) в какое-нибудь подходящее место типа их официального сайта или Вики. Увы. Ничего подобного там и близко нет. Официальный сайт MyFaces вообще не содержит никакой документации по MyFaces, а их Вики если и содержало когда-то актуальную информацию, то было это года три назад. Убидившись в отсутствии улучшений в данном вопросе и помянув незлым тихим словом ответственных за этот чудо-проект, я прибегнул к нецивилизованному способу - а именно, к просмотру исходного кода. В котором и обнаружилось указание, что для отключения этой функции указывать нужно '-1'.

С горем пополам разобравшись с этим вопросом, я вернулся к первоначальному плану. Открыл в браузере первую JSF-страничку и опять, на всякий случай, заглянул в лог. И увидел там нечто совершенно неожиданное, а именно, около 15 одинаковых записей вида

No context init parameter 'javax.faces.PARTIAL_STATE_SAVING_METHOD' found; no partial state saving method defined, assuming default partial state saving method off.

Это было уже хамством. Мало того, что кто-то додумался использовать в своих личных целях префикс "javax.faces", который любой вменяемый разработчик оставляет за теми параметрами, которые определены в спецификации JSF; так еще и , вместо того, чтобы один раз прочитать значение параметра и вывести соответствующее сообщение при инициализации, эта штука гадит в лог при обработке каждого компонента на странице!

В раздраженном состоянии я опять обратился к гуглу. Обнаружился прелюбопытнейший mail thread в девелоперском списке рассылки MyFaces. В котором было сказано буквально следующее:

"partial state saving" is a performance-enhancement feature that was added in myfaces. But it is entirely optional; it defaults to off (as the message says). And actually, as it was never properly documented (sigh) almost no-one (including me) knows what it really does or how to really use it.

So in short, just ignore this message. Probably myfaces should not log anything here, as no-one ever has this enabled (except maybe the author of the code) due to the lack of info about it.


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

Часть 2. Альтернативы.

Тут самое время меня оборвать и гневно указать на то обстоятельство, что в мире Open Source нельзя ругать авторов проектов, а нужно, если что-то не нравится, самому это исправить и выложить в проект для блага всего сообщества. А то критиковать, мол, каждый умеет, а ты попробуй сам сделать что-нибудь полезное.

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

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

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

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

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

Но мне не нужно ее искать. Я ее уже нашел. Собственно, я жду только перехода на другой сервер приложений, чтобы одновременно перейти и на другую реализацию JSF. Она тоже, кстати, open source. Более того, это вообще Reference Implementation (что еще несколько лет назад звучало, скорее, как ругательство). Тем не менее, во всех мало-мальски приличных серверах приложений, поддерживающих Java EE 5, она стоит по умолчанию (даже в JBoss'e, исключение составляет разве что Geronimo, но его приличным назвать можно только с очень большого перепояпугу).

Для того, чтобы оценить разницу между MyFaces и JSF RI достаточно взглянуть на changelog версии JSF RI 1.2_05. Особый интерес представляют эти сообщения:

This release includes a major rewrite of the configuration and managed bean sub systems.
...
A positive side effect of this rewrite is that the RI no longer has any dependencies on Jakarta Commons libraries. This makes the RI very lightweight and easy to integrate.


Что-то из внутренней реализации было переписано. В частности, была убрана зависимость от некоторых левых библиотек. Изменилось ли что-то внешне для конечного пользователя? Нет. Повысилось ли качество проекта? Конечно!

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

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

Как-то раз я и сам написал запрос в Jira одного из родственных проектов. Запрос был принят, обсужден, назначен ответственный за исправление ошибки. И все. За последующие два года ничего для исправления сделано не было (и явно уже не будет сделано никогда). Человек, который в основном занимался данным конкретным компонентом, по всей видимости, более не является активным участником проекта. А всех остальных этот компонент не интересует, равно как и исправление ошибок в нем.

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

Часть 3. Поиски.

Как все уже догадались, речь не о MyFaces. Подавляющее большинство OSS, как минимум, не лучше. И причина фантастической убогости всех этих проектов одинакова - отсутствие внутреннего стержня, которым может быть или компания (как в случае с проектами Sun), или человек (как Gavin King в случае Hibernate). То есть лидера, которого волновало бы в первую очередь качество конечного продукта, а не количество фич, каждая из которых нужна только ее создателю (ну, может быть, еще его друзьям и близким родственникам).

Возьмем то же Apache Software Foundation, содержащее десятки, если не сотни, проектов, и попытаемся найти там хоть что-нибудь стоящее (ну, не считая http-сервера, конечно). Вот, что припоминается лично мне:
  1. Ant. Ant был всегда и до сих пор используется всеми (кроме горстки подозрительных любителей Maven). Возможно, он появился еще раньше Apache. В любом случае, он родился за пределами Apache и был позже подарен. К настоящему времени это уже давно государство в государстве, живущее по своим законам, редко выдающее релизы и отшлифовывающее свой продукт до степени абсолютной незапятнанности.
  2. Log4J - также используется повсеместно, но особой активности в последние годы не наблюдается. К тому же, постепенно сдает позиции в пользу стандартного API для логгирования, введенного в JDK 1.4.
  3. HTTP Components, вероятно. Вероятно - потому что их использование можно было бы сделать более простым.
  4. CXF - неплохо, хотя Metro все равно лучше :). В любом случае CXF появилось в результате слияния двух проектов, рожденных за пределами Apache.
  5. .. хмм... есть идеи?
Все остальное - более или менее прогнивший хлам. Некоторые проекты (вроде Avalon) осознали собственную бесполезность и закрылись. К сожалению, это единичные случаи.

Наиболее одаренные парни из Apache решили сделать свою реализацию Java SE. Правда, за несколько лет они так и не смогли доделать реализацию Java 5. При этом они регулярно что-то тявкают в общем направлении Sun по поводу каких-то проблем с лицензированием. В Sun в это время заняты созданием Java SE 7, поэтому времени на удовлетворение странных желаний этих странных людей у них нет (да и не больно-то хотелось). Что приводит в еще большее возмущение господ из Apache, которые бойкотируют принятие решений в JCP и пытаются как-то возмутить общественность. "Та подивиться на себе, кому ви нужнi!".

В целом, конечно, неудивительно, что кучка восторженных фанатиков, собравшись вместе, не смогла произвести на свет ничего путного. Удивительно другое: во-первых, гордость этой кучки за то, что они сотворили; а во-вторых - наличие большого числа программистов, готовых без малейших угрызений совести засунуть в свое приложение любую 0.0001-prebeta-alfa-unstable-snapshot-nightly-dontusethisshit версию первой выданной гуглом хрени только потому, что оно вроде бы делает то, что нужно сделать в этом месте моего кода, а мне лень написать самому метод в 5 строчек, поэтому я присобачу пару мегабайт сторонней библиотеки потому что там есть похожая функция. Врочем, это тема для отдельного исследования.

Эпилог. Нужна ли жизнь на Марсе?

И все-таки некоторая польза от всего этого бывает. Случается, что в том или ином проекте возникают некоторые полезные идеи, которые могут быть использованы на общее благо людьми, которые могут их эффективно реализовать. Классический пример - Tapestry. Использовать невозможно, но некоторые идеи очень привлекательны и будут учтены при разработке JSF 2.0.

P.S. К чему это я все? Собственно, к тому, что если вы хотите создать качественный продукт, нужно очень ответственно подходить к выбору его зависимостей.

19 Sept 2008

The Great Gig in the Sky

"Sometimes, I'd sit down at rehearsal or sound check and play something, improvise a little, and David would come over and say, 'What was that? It's really good!', and I'd say, 'I have no idea, I can't repeat it.' Sometimes I play something, and I haven't recorded it, and I don't know where it came from, why my hands did what they did, what key it was in, anything. For me, playing music is like meditating – I just play and don't really think about what I'm doing, I just let it happen. And those moments can be really, really precious." - Richard Wright

11 Sept 2008

1900 километров спустя

Стоило на 10 дней отлучиться, как Google объявил о запуске своего собственного браузера. До сих пор я проверял работоспособность и корректное отображение веб-интерфейсов в Мозилле, в Опере, в Сафари и в ИЕ (6 и 7). И вот я уже отчетливо себе представляю слегка раздраженный вопрос пользователя "А почему в моем самом новом и модном Хроме Ваш сайт выглядит как-то странно?". Спасибо тебе, Google, блин, большое.

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

Гугель должен быть разрушен!

Крымские заметки

  • Ханский дворец в Бахчисарае - довольно убогое заведение по сравнению с любым дворцом европейского типа.
  • Севастополь - город победивших маршруток. Их здесь великое множество (до 7 часов вечера), причем водители всячески намекают, что стоя в них ездить нельзя. Так что проблема общественного траспорта стоит во весь рост. Немногочисленные троллейбусы по вечерам народ берет штурмом - примерно так, как это было в Донецке в советские времена. При всем при этом пробок в городе замечено не было, так что на своем авто передвигаться можно относительно спокойно, при условии знания маршрута передвижения. С этим тоже проблема, так как все карты, выпущенные до 2008 года, нагло врут, а местные жители, зачастую, тоже, отправляя незнакомых с городом приезжих в тупики. К тому же, часть существовавших дорог уничтожена или перекрыта стройками.
  • В Севастополе любое пиво в любой посуде дает замечательную густую пену. Ближе к Ялте такого эффекта уже не наблюдается.
  • Южный берег Крыма - место по отбору денег у туристов. За парковку возле любой достопримечательности с Вас возьмут от 20 грн ("Парковочка у нас без ограничения времени, на целый день" - ну конечно, мы ведь ночевать собрались в этом дворце, а не погулять час с экскурсией). У прохода куда угодно (в ущелье, в пещеру, к водопаду и т. д.) вас встретит приветливый человек и попросит от 5 до 30 грн. Естественно, все разрешения на ведение соответствующей экономической деятельности у него есть, но, к сожалению, не с собой, а в офисе, который находится "где-то в Крыму". Билетов, само собой, он не выдает, равно как и не ведет никакого другого учета полученного дохода. В дополнение к этим персонажам везде стоят очень разговорчивые персонажи (преимущественно татары), которые навязчиво предлагают сфотографироваться с орлом, с соколом, с косулей, со львенком и с другими несчастными животными, попавшими в плен к этим уродам. Наиболее отвратительное место в этом плане - Ай-Петри. Единожды там побывав, чтобы поставить галочку ("на Ай-Петри - был"), более там делать нечего. В целом курорты Крыма и связанный с ними бизнес очень негативно отражается на его прекрасной природе.
  • Воронцовский дворец прекрасен, как и прилегающий парк, нужно только выгнать татар с павлинами и обезьянами. Ливадийский дворец поражает (особенно срок его постройки - 17 месяцев), но нужно убрать магазины сувениров из помещений 1-го этажа и облагородить парк, который сейчас находится практически в диком состоянии. Массандровский дворей наменее интересен, потому что, во-первых, хозяева его в свое время не обжили, а во-вторых, проводимые в нем свадьбы местных олигархов не способствуют его привлекательности, равно как и дача Ющенко по соседству, из-за которой верхний парк закрыт.
  • Вина в фирменных магазинах винзаводов в 1,5-2 раза дешевле, чем в обычных винных магазинах.
  • Плотность ментов на дорогах наменьшая по сравнению с другими областями.
  • Хуже дороги, чем от села Генеральского к водопаду Джур-Джур, я не видел (но местные всегда готовы доставить вас туда и обратно на уазиках всего лишь за 150 грн (а если проехать дальше еще метров 500, то уже за 25, правда, только в одну сторону)).
  • В Феодосии обитают очень наглые бабочки :).

14 Aug 2008

Заявление МИД РФ

МОСКВА, 14 августа. /ПРАЙМ-ТАСС/. Динамо Киев не имеет никакого морального права претендовать на свое участие в Лиге Чемпионов. Об этом заявили в четверг в МИД РФ в связи с произошедшим накануне деклассированием поражением команды Спартак Москва, передает ИТАР-ТАСС.

"В России крайне удивлены выступлением Динамо Киев от 13 августа относительно прохождения квалификации ЛЧ - отметили в министерстве. - Не высказав ни слова сожаления в связи с потерей многолетнего капитана и лидера мясных Спартака Егора Титова, украинская сторона стала забивать необоснованные голы в ворота вице-чемпиона Российской Федерации".

"Динамо Киев, которое все последнее время азартно пропускало на своем поле по два мяча, тем самым прямо поощряя соперников к собственной недооценке, не имеет никакого морального права выигрывать у других команд и, тем более, претендовать на свое участие в групповом раунде Лиги Чемпионов", - заявили в МИД РФ.

27 Jul 2008

Языковому вопросу посвящается

Собственно, в чем проблема правильно изъясняться на великом и могучем? Нет никакой проблемы. Можно даже правил не учить. Прочитай десяток-другой классических произведений - и правильное написание до конца жизни обеспечено. Хотя на чтение классики сейчас ни у кого времени нет, и вообще это не модно.

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

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

Почему?

Вот причины:

  1. Безграмотность
  2. Лень
  3. Страх
  4. Отсутствие элементарного вкуса
С первым пунктом все настолько ясно, что его даже комментировать не нужно.Со вторым интереснее. Наш речевой аппарат с некоторых пор не позволяет нам выговарить слова длиннее 7 букв. А те, кому позволяет, так сильно куда-то спешат, что на длинные слова у них все равно времени нет. Поэтому вместо "пожалуйста" мы скажем "плиз". Ведь все поняли, что мы имели ввиду? А за сэкономленные 0,3 секунды мы успеем... успеем... ну я не знаю что... но если взять за год, то сумма наверняка наберется приличная, и уж что-то полезное за это время мы точно успеем!Теперь о страхе. Казалось бы, при чем он тут? Да и где он вообще? Слышишь слово "плиз", страх видишь? Нет? А он есть.

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

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

Грамотные люди также в курсе, что вообще постоянное повторение одного и того же выглядит не слишком круто. Поэтому любителям "респекта и уважухи" стоило бы поискать другие формы выражения своего одобрения (но они этого не сделают, потому что мозгов не хватит). Кстати, заметили, что уважуха никогда не ходит одна? Только в паре с респектом и всегда на втором месте. Так что ее можно уже считать не более чем частицей усиления. Осталось только выяснить, что круче - "респект и уважуха" или "респектище". Хотя намного интереснее узнать, в чем вообще прикол употребления архаизмов? Так вот. Они употребляются неправильно. Если сравнивать способ употребления "респекта" в то время, когда он еще был частью живого языка, и то, как это делается сейчас, то сразу становится видна нынешняя обезличенность употребления. Ведь раньше всегда указывалось, кто, кому, и насколько полон выражаемый респект. А сейчас - это просто факт наличия абстрактного уважения. Типа знаменитого сталинского "есть мнение...". Мнение, которое существует отдельно от человека, его выражающего, и даже вообще без этого самого человека. Оно просто есть. Если же и можно заподозрить произносителя "респекта", что это именно он хвалит именно Вас, то все равно это выглядит этаким начальственным похлопыванием по плечу.

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

Или вот еще. Редкий анонс концерта какой-нибудь доморощенной звезды обходится без обещания "драйва". Точнее, простой драйв уже вымер. Не выдержал конкуренции. Сейчас драйв может быть либо бешеным, либо сумасшедшим. Казалось бы, зачем нужен этот бред? А для денег. Ведь не скажешь же, что какая-нибудь условная уматурман создала замечательные композиции, наполненные глубоким и неожиданным смыслом и прекрасной музыкой, да еще и с потрясающим живым исполнением? Не скажешь, ибо будешь выглядеть полным идиотом. С другой стороны, людей чем-то завлекать надо. Остается обещать всякую непонятную туфту типа того же "драйва". Так что драйв, в переводе на общепонятный - это "ни петь, ни играть, ни сочинять не умеем, но все равно мы круты, а почему, мы вам не скажем".

Так вот. Хороший вкус - это большая редкость. И это и есть основная причина всех проблем на Земле.

17 Jul 2008

PHP-thing

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

14 Jul 2008

Software

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

OS - Windows XP Pro SP3.

Firewall - Comodo 3.0. Бесплатная и к тому же чуть ли не самая навороченная в плане защиты вещь. Не скажу, что я в полном от нее восторге, но коммерческие аналоги не настолько лучше, чтобы заставить меня раскошелиться.

Antivirus - Avira AntiVir Premium 8.1. К сожалению, все приличные бесплатные антивирусы бесплатны только если комп не используется в коммерческих целях, а я на своем официально работаю... После непродолжительных поисков выбрал вариант с самой большой базой вирусов за небольшую ($19) цену, и пока что полностью удовлетворен.

Web - по умолчанию Opera 9.51. На случай, когда она не справляется, под рукой Firefox 3.0 и Safari 3.1.2. IE 7 используется там, где необходим IE :). Все четыре браузера используются при разработке, при этом основную роль играет уже Firefox. Safari - основной браузер для производства скриншотов :). 

E-Mail - Microsoft Office Outlook для работы (потому что это требование работы, и, к тому же, в версии 2007 это действительно мощная и удобная вещь). Если бы мне приходилось писать письма вне работы, я бы тоже ее использовал, но, поскольку делать это мне приходится пару раз в год, для остальной почты я использую (сюрприз)... Opera! Я ежедневно получаю тонны писем в различных девелоперских рассылках, и Опера отлично умеет их фильтровать и находить нужное. Кроме того, очень удобно иметь в одном окне браузер, почту и RSS. Что Опера не умеет делать хорошо, так это писать письма (только plain text), но тут см. начало абзаца ;).

Office - Microsoft Office Standard 2007 SP1. Его наличие обусловлено необходимостью в Outlook :). Если бы ее не было, я бы рассмотрел вариант с Open Office, который, по некоторым данным, не так уж плох. Ну а так можно обойтись без рассмотрения других вариантов, потому что 2007 офис работает и работает хорошо (особенно рулит плагин для экспорта в PDF). Standard взял, потому что в более крутых версиях нет ничего такого, что мне было бы нужно, а денег жалко :).

Java IDE - IntelliJ IDEA 7. Купил практически одновременно с офисом. NetBeans, в принципе, сейчас тоже неплох, но меня совершенно не устраивает наркоманская зависимость от build.xml, и, как следствие, невозможность использовать свой билд-скрипт. Ну и к тому же IDEA просто лучше :). Хотя раньше была еще лучше, пока не стала ориентироваться на запросы пользователей.

Audio player - foobar2000.

Video player - Media Player Classic. Умеет все, что надо, и ничего, чего не надо.

DVD Player - Cyberlink PowerDVD 5. Довольно старая и, к тому же, урезанная версия (она даже не умеет декодировать DTS), которая поставлялась вместе с видеокартой Gigabyte от моего прошлого компа (а гадский Asus нифига полезного со своей картой не дал). Но она умеет нормально играть DVD и умеет пускать звук через SPDIF - а мне, собственно, больше ничего и не нужно :). Я бы, может быть, купил версию поновее (8.0), но они используют какую-то хитрую систему биллинга, которая не хочет работать с бесплатной почтой.

CD/DVD recording - Nero Express 6 Plextor. Как нетрудно догадаться, поставлялась вместе с моим приводом Plextor. Ничего ультрасовременного, но работает без  ошибок, и на том спасибо.

Image works - FastStone, Picasa, GIMP. Когда я увидел цену на Adobe Photoshop, я быстро смирился с не самым удобным интерфейсом ГИМПа :). Есть еще ACDSee, пришедшая вместе с Pentax, но после установки FastStone случаев ее использования больше не было.

IM - Miranda 0.7.5. В последнее время она стала мне надоедать, но искать что-то другое мне просто влом :).

Commander - FreeCommander. Не намного хуже Total Commander, и при этом бесплатный.

А также куча серверов баз данных, серверов приложений, утилит для принтера, для тв-тюнера, для iPod и других слишком специфичных или слишком тривиальных для упоминания программ. Все бесплатные :).

JSF 1.3

Не так давно вышел Early Draft спецификации JSF 2.0. По высказанным мной недавно соображениям (а также без их учета) это вещь, которая заслуживает внимания, которое я ей и уделил. Напомню, что представители экспертной группы обещали нам, помимо прочих вкусностей, конфигурацию с помощью аннотаций, новый удобный язык разработки страниц и простое создание компонентов a-la Tapestry 5 (но по-умному).

Чем же нас порадовали в первом материальном результате работы экспертной группы? 

  • Появилась возможность указывать параметр ProjectStage ("Production", "Development" etc.), в зависимости от значения которого JSF будет слегка менять свое поведение.
  • Появился стандартный способ упаковывать ресурсы вместе с библиотеками компонентов, версионировать их и локализовывать.
  • Появилась возможность ссылаться на ресурсы с помощью EL.
  • Появилась новая система публикации/подписки на события.
  • Появился механизм релокации ресурсов (можно в компоненте указать, что он зависит от такого-то ресурса, и ссылка на этот ресурс будет автоматически встроена в head итогового кода страницы).
  • Появилась практически пустая глава "Integration with Facelets", в тексте которой амбициозно заявлено нечто вроде "Здесь потом будет спецификация Facelets, а пока что мы сюда сваливаем всякую фигню, чтобы не забыть".
  • Плюс некоторые телодвижения в общем направлении упрощения интеграции с Ajax.

Это все.

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

Точнее, одну из фундаментальных проблем призвано решить внедрение Facelets. Но, как было отмечено, пока что готово только название главы. Более того, я лично (и в этом я не одинок) категорически против использования указанного термина в официальной спецификации вообще. Facelets - это посторонний проект, проект очень удачный и могущий послужить основой для спецификации нового языка описания страниц. Но тем не менее это проект посторонний, не являющийся частью Java EE, не имеющий спецификации, и потому ссылки на него выглядят очень странно и ненадежно. Никто же не ссылался на Hibernate или TopLink в спецификации JPA? 

Выходом может быть объявление, что в этом документе под Facelets понимается не всем известный проект, а новый язык описания страниц, являющийся неотъемлемой частью спецификации JSF. Но об этом нужно громко и внятно сказать, дабы не вводить народ в смущение. А еще лучше придумать новое подходящее название, слово Facelets выбросить из спецификации, зато на основе этого проекта первую официальную реализацию нового языка (собственно, в отдельных частях документа это название даже встречается - "Faces PDL").

Наконец, про использование аннотациq для конфигурации (типа @ManagedBean) в документе вообще не слова. То есть нам по-прежнему предлагают писать XML-файлы размером в тысячи строк. И это в то время, когда подавляющее большинство остальных Java EE - технологий избавились от XML hell еще в версии 5.0 (JSF 2.0 должна войти в Java EE 6.0).

Все это тянет максимум на версию 1.3, но никак не на 2.0.

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

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

Несмотря ни на что, продолжаю ждать и надеяться :).

25 Jun 2008

88 лет

Как и следовало ожидать, матч Италии-Испания был воспринят широкими кругами общественности как "невыносимо скучный". Раздавались даже отдельные призывы дисквалифицировать обе команды. Ну и, как обычно, множество удивительно сходных оценок (причем всегда с физиологическим подтекстом) типа "Меня тошнит от игры итальяшек".

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

Собственно, чего стоило ждать от Италии? Потеряв Пирло, рассчитывать на превосходство в контроле мяча в противостоянии с испанцами у которых средняя линия как раз самая сильная, особо не приходилось. Как не приходилось и ждать чудесного воскрешения Луки Тони в атаке. Так что единственно возможный план на игру, который позволял рассчитывать на успех, заключался в упорной обороне и пулянии мяча вперед при каждом удобном случае в расчете на то, что должна же палка когда-то выстрелить, либо ждать серии пенальти и надеяться на Буффона.

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

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

Так вот: игра итальянцев в обороне была почти идеальной. За весь матч ни один испанец не получил ни единой возможности нанести опасный удар, и все, что им отсталось, так это стрельба из-за пределов штрафной, которой Буффона испугать трудно. Наблюдать за подстраховкой и прессингом в исполнении Кьеллини и компании было высшим удовольствием. Почти как в лучших играх сборных образца 2006 и 2000 годов.

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

P.S. Почему я так болею за Италию, начиная с 94 года, когда впервые увидел ее в проигранном финале чемпионата мира. Потому что даже когда эта команда играет плохо, и когда она проигрывает, от нее исходит какое-то величие. Впрочем, это, конечно же, совершенно предвзятое мнение :).

19 Jun 2008

Итоги и прогнозы

  1. Португалия - единственная из всех команд, причислявшихся к главным фаворитам накануне Евро, которая показала чемпионскую игру. Главный претендент на общую победу.
  2. Турция - удивила всех, дважды спасшись с не самыми слабыми командами. Но победы были одержаны в основном за счет духа, а не какой-то особо изысканной командной игры. У хорватов с настроем тоже все в порядке, так что чудес в четвертьфинале не предвидится.
  3. Чехия. Очень хорошо обученная команда, но потерявшая всех своих звезд. Этого должно было хватить для выходы из группы, если бы не янычарская ярость.
  4. Швейцария, в первом же матче оставшись без своего лидера, была обречена, но сделала все, что могла.
  5. Хорваты, конечно, молодцы, но шансов против Португалии у них нет никаких. Полуфинал будет пределом для этой команды. У Турции выиграют со счетом 1:0.
  6. Немцы не показали ничего интересного. В четвертьфинале могут португальцам не просто попасть, а попасть крупно. Например, 1:4 (кто-то из немецких поляков один гол все-таки должен забить).
  7. Австрия показала больше, чем от нее ожидали, но вся ее интересная игра уложилась в первые 15 минут матча с поляками.
  8. Польша - просто отстой.
  9. Голландия играла лучше всех на групповом этапе и именно поэтому у них нет шансов на выигрыш кубка. Вопрос только в том, на каком этапе они сдохнут - для классической истории это, конечно, должен быть полуфинал с Италией.
  10. Италия, несмотря на выход из группы, имеет проблемы во всех линиях, кроме вратарской, к тому же Донадони - это тренер из серии "как бы чего не вышло". Имеет шансы на выигрыш Евро, но не из-за продемонстрированной игры, а просто потому, что это - Италия. Эти шансы будут расти с каждым пройденным этапом, в паре с Испанией - 50:50.
  11. Румыны играли хорошо до тех пока не понадобилось побеждать.
  12. Франция - главный провал турнира. Хотя в этой сборной уже мало что осталось от сборной собственно Франции.
  13. Испания - довольно спокойно вышли из группы, если не сдуются, как это с ними обычно бывает после групповой стадии, то могут дойти до финала. Правда, путь у них намечается не самый легкий, а как испанцы играют с командами своего уровня, мы на этом турнире пока не видели.
  14. Россия - прибавляла от матча к матчу и заслуженно вышла из группы. При определенной доле везения может сильно попортить жизнь голландцам, а то и вовсе преподнести самую громкую сенсацию турнира.
  15. Швеция - очень скучная команда. Разрыв, которые ей учинил экспериментальный состав сб. Украины перед Евро оказался неслучайным.
  16. Греция - самая отстойная команда турнира.

18 Jun 2008

Examples of what?

Наткнувшись недавно на статью New Features in EJB 3.1 - Part 4, которая обещала рассказать об интеграции с EJB с Web Beans, я немедленно заинтересовался. Дело в том, что спецификация JSR 299: Web Beans, находящаяся в стадии разработки, многими преподносится едва ли не как "the most exciting JSR being developed in the Java EE 6 timeframe", не говоря уже о том, что она основана на идеях активно рекламируемых JBoss Seam и Google Guice. Таким образом, Web Beans естественным образом попадает в поле зрение любого разработчика, имеющего дело с Java EE. Вкратце, это штука унифицирует компонентые модели EJB и JSF (да и все остальные компонентные модели, в принципе, тоже), позволяя использовать EJB в качестве JSF managed beans и предоставляя мощный механизм dependency injection, позволяющий при помощи аннотаций всунуть что угодно куда угодно. В общем, это первая кандидатура на звание главной блестящей и мигающей игрушки в мире Java, которая в короткие сроки должна окончательно добить и отправить на свалку истории .NET и прочую туфту типа PHP и Ruby.

Я, однако, до последнего времени не спешил присоединятся к всеобщему восторгу в отношении Web Beans, так как, прочитав несколько статей от авторов спецификации и отдавая должное прикольным штукам, которые можно будет проделать с ее помощью, я никак не мог придумать, где бы я стал эти штуки использовать в своих собственных проектах.  К тому же, я вообще как-то не очень хорошо понимаю, чем хороша идея использовать EJB, которые всегда представлялись мне компонентами инкапсулированной бизнес-логики, для построения веб-интерфейса. И вот, встретив статью, написанную с точки зрения EJB 3.1 (а уж относительно этой технологии я абсолютно точно знаю, где мне хочется ее применить), я надеялся, что уж теперь-то меня убедят и я тоже смогу порадоваться близкой победе сил добра над силами зла.

Не тут-то было.

Прежде всего, статья вообще ничего не говорит о том, что нас ждет в плане EJB 3.1. Она просто содержит выдержки из того, что все и так уже знали о Web Beans, дополненные парой примеров.  Первый пример стандартный (он как раз иллюстрирует использование stateless EJB в качестве JSF managed bean, причем без каких-либо попыток объяснить, почему от применения такой архитектуры наша жизнь станет лучше), зато второй - просто убийственный. Он настолько удивителен, что я его приведу полностью.

Итак, второй пример демонстрирует возможность инжекции произвольного объекта (в отличие от Java EE 5, где инжекцию можно делать только для стандартных типов компонент типа EJB или Datasource). Теперь же, благодаря мощи Web Beans, нам предлагается с помощью механизма DI использовать... классы-утилиты! Выглядит это так:

@Component
public class
MathUtil {
    ...
    public static double
round(double value, int decimalPlaces) {
        BigDecimal converter = new BigDecimal(Double.toString(value));
        converter = converter.setScale(decimalPlaces, BigDecimal.
ROUND_HALF_UP);
        return converter.doubleValue();

    }
    ...
}

@Component
@Stateless
@Named("placeBid")

public class
PlaceBidBean {
    @PersistenceContext
    private
EntityManager entityManager;

    @In
    private
Bid bid;

    @In
    private
MathUtil mathUtil;

    public void
addBid() {
        bid.setBidPrice(mathUtil.round(bid.getBidPrice(), 2));
        entityManager.persist(bid);

    }
}

Я, наверное, очень примитивный человек, так как совершенно не в состоянии понять, в чем польза от вызова статического метода класса через ссылку на экземпляр этого класса, еще и полученную с помощью Dependency Injection, равно как выше моего понимания, как возможность такого извращения служит примером гениальности новой технологии.

Я понимаю, что примеры в статьях должны быть по возможности простыми. Я не понимаю, почему примеры не могут иллюстрировать нечто вроде "Вот смотрите, раньше, чтобы сделать эту нужную операцию, вам приходилось напрягаться и писать много некрасивого и опасного кода. А теперь, благодаря нашей чудо-технологии, вы пишете пару аннотаций - и опаньки, все уже работает, причем лучше, быстрее и надежнее, чем было раньше ". И почему вместо этого так много примеров выполнены в стиле "Зацените, как клево можно теперь извратиться! Раньше вы такие извращения и представить себе не могли!".

P.S. Я по-прежнему считаю идею о смешивании в одну кашу уровней интеграции с БД, бизнес-логики и построения интерфейса по меньшей мере сомнительной. Может быть, в определенном ограниченном классе приложений это и имеет смысл; но вряд ли этого достаточно для того, чтобы преподносить эту новую игрушку в качестве "the most exciting JSR". Вообще, в Java EE 5 уже все хорошо в плане двух первых из упомянутых уровней; здесь нужна уже не революция, а эволюция, которой и являются EJB 3.1 и JPA 2.0. А вот на уровне веб-интерфейса нужно серьезно поработать, чтобы превратить JSF в технологию, которой приятно пользоваться. В начале работы над JSF 2.0 говорилось о многих очень правильных вещах; а недавно экспертная группа опубликовала Early Draft Review, изучением которого я, по мере воможности, сейчас и занимаюсь.

15 Jun 2008

Номинации по итогам второго круга

  • Лучшие фавориты - португальцы
  • Лучшие ватерполисты - швейцарцы
  • Лучшие швейцарцы - турки
  • Лучшие немцы - поляки
  • Лучшие поляки - бразильцы
  • Лучшие "Вот это мы уже начали играть в футбол. Прикиньте, что будет, когда мы начнем в него играть хорошо" - хорваты
  • Лучшая жертва судейского произвола - Донадони
  • Лучшие "Срочно требуется тренер для чемпионов!" - итальянцы
  • Лучшие мегамонстры и т. д. и т. п. - голландцы
  • Лучшие "Мы голландцам хотя бы гол престижа забили!" - французы
  • Лучшие "Влетать голландцам с разницей в три мяча и мы умеем!" - украинцы
  • Лучшие "Кто там следующий на очереди? Голландцы? Мы их щас... Мы щас с ними вничью сыграем!" - румыны
  • Лучшее средство испоганить любой матч - комментарий Дерепы
  • Лучшие "А если б мы еще по воротам попадали, мы б тем грекам ваще полную авоську накидали!" - россияне
  • Лучшие "Ну и что, что всем сливаем, зато мы прошлый ЧЕ выиграли!" - греки

11 Jun 2008

Номинации по итогам первого круга

  • Лучшие фавориты - португальцы
  • Лучшие мегамонстры кожаного мяча, укротители пятнистого, уничтожители традиций, кумиры глорихантеров и фетиши фетишистов - голландцы
  • Лучшие неудачники - итальянцы
  • Лучшие "мы прям как итальянцы!" - украинцы
  • Лучшие немцы - поляки
  • Лучшие поляки - немцы
  • Лучшие французы - негры
  • Лучшие "и это мы еще не начинали в футбол играть!" - хорваты
  • Лучшие "мы испанцам хотя бы гол престижа забили!" - россияне
  • Лучшие "на их месте могли бы быть мы!" - англичане
  • Лучшее снотворное - матч Швеция-Греция с комментарием Дерепы

10 Jun 2008

3003

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

И это, на самом деле, главная проблема. Конечно, Ван дер Сар был великолепен, но в некоторых моментах вовсе необязательно было лупить прямо во вратаря. Но в сегодняшней сборной Италии некому забивать. Тони к концу сезона сдох. Мертвым он был уже в матче с Зенитом. Учитывая, что это был его первый сезон в топ-клубе за всю карьеру, можно предположить, что организм просто не успел приспособиться к новому уровню нагрузок. Дель Пьеро не то чтобы сдох, просто сейчас это не тот игрок, который должен играть в нападении сборной Италии. Взяли его исключительно по многочисленным просьбам болельщиков, и это еще один минус Донадони. Ди Натале, может, и неплох, но в этом матче ничем не отметился. Кассано - а он на поле вышел вообще? Оставшиеся двое - игроки глубокого резерва. Стоило брать Пиппо, он хотя бы фартовый.

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

А вот средняя линия порадовала. И особенно, конечно, Пирло. После невнятного сезона (как для себя, так и для всего Милана), Пирло перезагрузился и выдал отличный матч. Остальные, в принципе, тоже не подкачали. Будь дер Сар чуть менее удачлив, а нападающие чуть более точны, счет был бы совсем другим.

Оборона, несмотря на три пропущенных мяча, тоже не оставила ощущения какой-то безнадежности. Хотя отсутствие игрока, способного погасить быстрый прорыв какого-нибудь Кюйта (Кайта, Койта, Кяута, нужное подчеркнуть) чуствовалось. Два года назад таким игроком был Каннаваро плюс отлично сыграл Матерацци, да и в целом защитная линия выглядела намного надежнее. Но... иных уж нет (Неста, Липпи), а те далече (тот же Каннаваро). Однако, повторюсь, жить с такой обороной можно. Особенно, если позади нее находится Буффон.

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

P.S. Что касается голландцев, то они очень быстро бежали, очень точно били по чужим воротам, у своих не лажали, а в крайнем случае воротник все фиксировал. Отличная заявка на чемпионство, но болельщикам оранжевых пока радоваться рано, так как все мы помним, как быстро Голландия запрягает и едет на групповом этапе, и как быстро она сдувается, когда дело доходит до плей-офф.

6 Jun 2008

Euro2008 Tournament Browser

Мои предпочтения:

  1. Италия (потому что как всегда)
  2. Хорватия (потому что там Дарио Срна, да и Стёпа нам не совсем чужой)
  3. Румыния (потому что там Разван Рац, да и Чип нам не совсем чужой)
  4. Польша (потому что там Мариуш Левандовски, да и Войцех нам не совсем чужой)

2 Jun 2008

Invalid validation

Обзаведясь Pentax Optio A30, я решил обзавестись местом, куда можно было бы складывать отснятый материал.  Это место мне нужно потому что:
  1. Хочется показывать фотографии людям, которые не имеют доступа к моему монитору.
  2. Хочется показывать фотографии в достаточно приличном качестве (а не в том мраке и ужасе, который остается от хороших фотографий если их выложить в контакт).
  3. Я очень ленивый человек и мне, в частности, лень самому сжимать фотографии для отправки кому-либо, поэтому было бы здорово если бы эту работу делал кто-то другой.
  4. При этом в идеале оригинал фотографии в ее исходном качестве тоже можно было бы сохранить и в будущем, при необходимости скачать.
И вот я стал искать подходящий сервис.
Первым кандидатом был Flickr (потому что о нем положительно отзывались некоторые хорошие парни из среды java-программистов).  При попытке в нем зарегистрироваться тут же вылез первый облом: оказалось, что это не свой собственный маленький сервис, который хорошо делает свою работу и не делает ничего другого (на что я надеялся), а часть большой дуры под названием Yahoo!, поэтому пришлось создавать аккаунт в последней. Ну да ладно, в конце-концов, у меня уже накопилось столько учетных записей в самых неожиданных местах (даже на амазоне), что аккаунт в Yahoo! сильно повредить не должен.
Далее, при регистрации им зачем-то дико понадобился мой почтовый индекс. Настолько дико, что без него зарегистрироваться нельзя никак. Напомню, что конечная цель регистрации -  выкладывать фотки в инет. Может, они будут их печатать и по почте мне присылать? Так и быть, мне не жалко указать свой индекс. Заполняю соответствующее поле, перехожу к следующему (а их регистрационная форма юзает новомодную валидацию, которая выполняет проверку сразу после завершения заполнения каждого поля, а не после окончательной отсылки всей формы), и получаю следующую картину:


WTF? Нафига требовать вводить почтовый код и пытаться проверить его корректность если вы не в курсе какие где почтовые коды? Немного погуглив на эту тему, выяснил, что:
  1. Проблема не только у меня одного и касается не только Украины. Например, у ирландцев вообще нет почтовых кодов, и они тоже не могут зарегистрироваться в этой чудо-системе.
  2. О существовании проблемы известно уже очень давно, но парни из Yahoo!, похоже, даже не чешутся по этому поводу.
  3. В качестве решения проблемы предлагается указать в качестве страны Россию и выбрать какой-то известной код оттуда.
Рассудив, что система, которая заставляет меня нагло врать уже при первом знакомстве не заслуживает доверия, я решил, что Yahoo! идет лесом, а я иду искать другой сервис. Вторым в списке был Гугл со своей Пикасой. Не то чтобы я очень любил гугл... но просто третьего варианта в списке не было, а искать мне было лень.  На удивление, Пикаса сразу заработала, и вот теперь я здесь. В принципе, она делает все, что мне нужно: хранит фотографии в исходном виде, сама их сжимает, чтобы можно было нормально смотреть в браузере (но при этом сжатые версии остаются вполне смотрибельными), генерирует нормальные ссылки на альбомы... Так что в целом я пока доволен. А теперь список того, что мне не нравится:
  • То, что это Google
  • То, что хранилище ограничено 1Gb
  • То, что моему второму альбому нельзя указать обложку (она тупо не сохраняется, как обложка)
  • То, что оно не полностью поддерживает Оперу
  • То, что оно иногда выдает сюрпризы типа такого:

Не такой уж маленький списочек, если подумать. Вероятно, я еще некоторое время подожду (авось пофиксят баги и места добавят). Если ничего не изменится, попробую поискать альтернативу. Кстати, ни у кого нет списка альтернатив? :)

P.S. Полное отсутствие валидации лучше, чем навороченная валидация, которая не дает пользователю ввести корректные данные. Я и сам пару раз так лажал (установил нижнюю границу длины названия оператора в 3 символа. А потом оказалось, что есть оператор О2...). Но, когда проблема всплыла, мне стало стыдно и я все пофиксил. Но господам из Yahoo!, видимо, чуство стыда незнакомо :). Кто бы их самих пофиксил.

30 May 2008

Город славы

Вдохновлено очередными кавалерийскими наскоками кепки в общем направлении "Наш Севастополь, верните взад!". Правда, в этот раз он слегка видоизменил стандартную аргументацию и рассказывает удивительные истории о том, как в 1948 г. город вывели из состава Крымской области, а когда в 1954 г. злюка-Хрущев передал Крым в состав УССР (совершенно незаконно, конечно же), про Севастополь никто ничего не говорил, а раз так, он остается в составе РСФСР. Но это отдельная смешная история, а я хочу вернуться к одному более привычному аргументу, который я лично считаю совершенно блистательным.

Итак, Севастополь нужно "вернуть" России, потому что это город русской славы.

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

Для начала предлагаю осмотреться: а не осталось ли за пределами России других городов русской славы?. Вот, например, Люйшунь (бывший Порт-Артур). В время русско-японской войны русские солдаты и матросы обороняли его не менее героически, чем Севастополь во время Крымской войны. Не лишать же их заслуженной славы только из-за того, что слава эта добывалась в Китае? Поэтому первым делом нужно потребовать у Китая вернуть Порт-Артур.

Но зачем ходить так далеко? В Европе полно дивных мест. Вся северная Италия и кусок Швейцарии после известных похождений Суворова просто-таки усеяны городами и городками русской славы. Вот их бы вернуть - курорты там круче, чем в Крыму. А Швеция? Разве уже забыли, как в 1809 году впервые в истории русские войска пересекли по льду залив? Стокгольм нужно срочно вернуть как неотъемлемую часть РФ.

В Берлине русские войска покрывали себя славой неоднократно.

Да и вообще, вся Европа до Парижа включительно сплошь покрыта местами русской славы. Так что давайте не мелочиться - зачем нужен порт в Черном море, которое все равно закупорено Босфорским проливом, если можно получить выход сразу к Атлантическому океану?

В этот момент, прежде чем наступит головокружение от успехов, стоит вспомнить, что, помимо русской славы, встречается слава и другой этнической принадлежности. Взять тот же Севастополь. Все помнят, при каких обстоятельствах русские войска в нем покрыли себя неувядаемой славой? Правильно, сначала при осаде города объединенной англо-франко-турецкой армией, а потом, через сто лет - немецкой. А чем закончились эти осады? В первом случае город был сдан, во втором - захвачен. Так если внутри крепости сидели такие герои, а осаждавшие все равно победили, то они славы добыли никак не меньше! Поэтому, как ни печально, но возвращенный России город придется тут же отнять и по-братски поделить между Турцией, Англией, Францией и Германией. И еще не забыть Грецию - греки тоже в этих местах отличились в свое время. Как и скифы. Как и многие другие.

Дальше все должно быть очевидно. Как Европа усеяна местами русской (и не только) славы, так и Россия покрыта местами славы разных бусурманских армий. Взять хотя бы то же Бородино. Или Смоленск. Но опять же, давайте не будем мелочиться. Москва. Там себя славой покрыли все, кому не лень, а не лень было многим. Те же немцы, те же французы. А еще поляки. А еще татары (странно, что крымские татары до сих пор не заявили претензий на Кремль). И наконец (ирония судьбы) - украинцы! Все же помнят, как казаки брали Москву? Не все? Ах да, российская история деликатно умалчивает об этих событиях...

Согласен обменять Севастополь на Москву. Обмен, конечно, неравноценный, потому что в Севастополе хорошо, а в Москве ничего хорошего нет. Но на что не пойдешь ради восстановления исторической справедливости!


29 May 2008

Классная аватарка

крутая ава! )) прям ваще ))
да, аватар супер просто!
зачЁтная авка!
прикольная ава!!!!!!!!!!

Тонны подобного бреда ежеминутно обрушиваются на головы бедных пользователей так называемых "социальных сетей" и не только. Впрочем, сами пользователи и генерируют этот хлам. Половина юзеров того же ВКонтакте, очевидно, только тем и занимается, что перелопачивает свои дилетантские фотографии с целью сменять свой аватар не реже одного раза в три дня; а другая половина в это же самое время без устали просматривает страницы своих "друзей" чтобы в случае малейшего изменения тут же запостить свое всегда восторженное и неизменно оригинально высказанное мнение. У первых очевидная мания величия, у вторых не менее очевидные комплексы, а отсутствие элементарного вкуса и чуства меры свойственно и тем, и другим. Хорошо что эти половины пересекаются, так что шанс, что нормальные люди еще остались, все еще существует.

P.S. Лучше бы фотографировать хоть немного научились.
P.P.S Я вас всех ненавижу.

9 May 2008

Бхактиведанта Свами

Боб: Прабхупада, некоторые, встающие на путь религии, например, "Дети Бога" и другие провозглашают, что их ведет Христос. Возможно ли это?
Шрила Прабхупада: Да, но они не идут за ним, впрочем, как и другие христиане. Иисус говорит им: "Не убий", — но они убивают. Разве это следование указаниям Иисуса? Просто сказать: "Мной руководит Христос", - достаточно ли этого? "А что он там говорил, меня не интересует!" Можно ли при этом считаться последователем Иисуса Христа? Никто не следует его наставлениям. Их заявления не соответствуют истине. Очень трудно найти человека, которым действительно бы руководил Иисус Христос. Иисус Христос готов вести их за собой, беда в том, что никто не хочет идти за ним. Они считают, что Иисус Христос подписал контракт на все их грехи. Такова их философия. Они грешат как угодно, а отвечать должен бедный Иисус Христос. Вот их религия. Поэтому они говорят: "У нас очень хорошая религия. За все наши грехи умрет Иисус Христос". Хороша ли такая религия? У них нет ни капли жалости к Иисусу Христу. Он умер за наши грехи. Так почему мы должны совершать их вновь? Такая великая жизнь была отдана в жертву за наши грехи — мы просто обязаны следовать указаниям Иисуса Христа. Но если вы относитесь к этому иначе: "Мы будем продолжать грешить как только можем, а Иисус Христос позаботится о том, чтобы снять с нас все эти грехи. Мне достаточно ходить в церковь и исповедоваться, а вернувшись домой, я снова буду делать разные глупости",—свидетельствует ли такой подход о большом уме?