середа, 16 грудня 2009 р.

Liferay::Basics

Liferay - Введение

Преамбула

С портальными контейнерами спецификации JSR-168 я столкнулся в 2006 году. Все было достаточно тривиально, клиент хотел портальное решение на Java и я был назначен найти наиболее подходящее. После рассмотрения JBoss Portal, Exo, Apache Jetspeed2, Apache Pluto я понял, что в мире порталов пока все еще довольно не просто и не тривиально. И когда я уже готовился с кровью отстаивать очень не быстрые сроки, мне попался Liferay тогда еще версии 3.6.5.
Этот портал, в отличие от братьев по спецификации, бодренько зашуршал из коробки и показал мне много всякого. Его и выбрали в качестве платформы.

вівторок, 24 листопада 2009 р.

Coffee'n'Code Kharkiv

Сформированна программа мероприятия, подробности на сайте.
Приходите, будет интересно

jQuery && WebKit based browsers

хозяйке на заметку, события document.ready и window.load в браузерах основанных на WebKit срабатывают раньше, чем будут загружены основные ресурсы. таким образом никак невозможно критически важные JavaScript функции, срабатывание которых запланированно на момент загрузки окна или DOM Document'а, помещать во внешние файлы.

господа Google-разработчики -- это таки баг

Spring Portlet MVC

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

четвер, 8 жовтня 2009 р.

Maven2::Part #5

Assembly plugin


несколько слов об assembly plugin. Maven предоставляет возможность формировать delivery package с помощью assembly plugin. стандартная документация описывает процесс создания конечного пакета в формате bin и src, как это обычно выглядит для всех продуктов Apache Software Foundation. однако, с помощью этого плагина можно формировать пакеты абсолютно произвольного формата. для этого понадобиться дескриптор assembly.xml, в котором с помощью тэгов включаются и исключаются необходимые артефакты и исходники, а с помощью тэгов -- артефакты зависимостей, необходимые в delivery package. все остальные тэги assembly.xml можно не использовать. с другой стороны, если delivery package соотвествует формату, принятому в Apache Software Foundation, можно использовать стандартные конфигурации assembly.xml, которые представлены на сайте Maven

неділя, 27 вересня 2009 р.

Maven2::Part #4

Управление зависимостями (Dependency Management)


в первую очередь следует обратить внимание на стандратную документацию Maven. она довольпо подробно объясняет, как использовать механизм управления зависимостями. я хочу оставновится на некоторых моментах, которые могут быть не ясны из стандартной документации

понеділок, 14 вересня 2009 р.

Maven::Part #3

Multimodule projects

каждый pom.xml файл описывает build workflow для одного проекта, в конечной фазе которого мы имеем один артефакт установленный в локальный и удаленный репозитарий. однако Maven позволяет легко и удобно работать с многомодульными проектами. при этом задача управления зависимостями между внешними библиотеками и между модулями внтури проекта полностью решается самим Maven.

неділя, 13 вересня 2009 р.

Maven2::Part #1

Maven build workflow


полный список фаз Maven build workflow можно найти в документации. за каждую фазу отвечает какой-нибудь плагин из группы org.apache.maven. каждый из плагинов, кроме цели по-умолчанию, как правило умеет еще много полезных вещей. поэтому даже для стандартных плагинов нужно и важно читать документацию. встраиваться в ту или иную фазу довольно просто

...
 <plugin>
   <groupId>com.mycompany.example</groupId>
   <artifactId>maven-touch-plugin</artifactId>
   <version>1.0</version>
   <executions>
     <execution>
       <phase>process-test-resources</phase>
       <goals>
         <goal>timestamp</goal>
       </goals>
     </execution>
   </executions>
 </plugin>
...


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


отдельно следует отметить фазы цикла package, install и deploy.
package -- фаза, когда происходит сборка артефакта. стандартные плагины, для сборки артефактов, входящие в поставку Maven, умеют собирать jar, war, ear, ejb, rar, shade. каждый из сборщиков умеет класть внутрь архива необходимые ресурсы и раскладывать их по необходимым местам автоматически.
install -- фаза, когда собранные на этапе package артефакты проекта устанавливаются в локальный репозитарий. плагин создает каталоги группы и версии, копирует в созданную структуру артефакт и генерирует необходимую метаинформацию
deploy -- фаза, когда проинсталлированные в локальный репозитарий артефакты, переносятся в удаленный репозитарий. тут важно отметить, что Maven следит за обновлениями удаленных репозитариев автоматически. так что для того, чтобы обновить какой-то модуль для удаленной команды, необходимо только задеплоить его в общий удаленные репозитарий.

Maven2::Part #0

Общая информация


дисклэймер: широкая айтишная общественность собирается обсуждать всякое. разумеется собраться в то время, когда я буду в Украине у широкой общественности никак не вышло :) посему посильным вкладом в первую встречу будут заметки. я так решил, да.

систем автоматической сборки проектов на Java сущетсвует наверняка очень много. но самыми популярными и используемыми являются Ant и Maven2 (актуальным проектом является Maven2, Maven is dead и это было предрешено). собственно обе системы являются Java-приложениями и обе системы разработаны Apache Sotware Foundation. более того, Maven2 умеет вызывать изнутри себя Ant.

вівторок, 1 вересня 2009 р.

Spring MVC: не очевидное

Есть ряд совершенно не очевидных вещей внутри Spring MVC, например
1) чтобы форма работала и обрабатывалась нормально нужно, чтобы у нее обязательно были прописаны id и name. и то, и другое, одновременно. иначе возможны сбои
2) чтобы механизм автоматического binding'а элементов формы работал, нужно, чтобы имена полей формы совпадали с именами полей класса, в который они байндятся. Т.е.

Java class:
public class BackingBean {
private long id;
private String name;

public void setId(long id) {
this.id = id;
}

public long getId() {
return id;
}

public void setName(String name) {
this.name = name;
}

public long get() {
return name;
}
}

JSP:
<form id="foo" name"foo" method="post" action="/somewhere-on-server">
<spring:bind path="backingBean.id">
<input type="text" name="id"/>
</spring:bind>
<spring:bind path="backingBean.name">
<input type="text" name="name"/>
</spring:bind>
</form>

5) метод formBackingObject всегда создает новый экземпляр объекта, если его перегрузить таким образом, чтобы он делал проверку наличия уже созданного объекта в аттрибутах запроса, это позволит уменьшить количество объектов в памяти и сократить время, необходимое для создания этого объекта
4) в Spring Portlet MVC метод onSubmitRender вызывается только в том случае, когда состояние формы было изменено. поэтому в этом методе нельзя реализовывать обработку RenderRequest's, общих для всего контроллера. для обработки общих запросов можно использовать методы showForm, handleRenderRequestInternal, handleRenderRequest
p.s. а в многом остальном Spring MVC прекрасен, как и весь Spring пожалуй

четвер, 20 серпня 2009 р.

конфигурация Java Service Wrapper для старта Tomcat6

есть в этом мире такая прекрасная библиотека, как Java Service Wrapper. она позволяет любую Java программу запустить как системную службу (особенно это важно для Windows, потому что иного способа часто нет). но беда этой прекрасной библиотеки в том, что разработчики не обновляют документацию на сайте. поэтому ниже файл конфигурации этой библиотеки для запуска tomcat-6.x.x как сервиса

субота, 6 червня 2009 р.

о целях и спорах

иногда бывает познавательно наблюдать, как люди пытаются давать советы. очень часто советы одного человека встречают просто шквал критики со стороны другого. потом появляется группа поддержки у первого и второго спорщика. потом подтягиваются старые опоненты первого, второго, группы поддержки номер раз, группы поддержки номер два. страсти накаляются, трещат копья, летит шерсть клочками. между тем тема, вокруг которой разгорелись совершенно не связанные с ней дискуссии, часто остается не раскрытой.
я думаю, что так случается потому, что у разных людей разные цели. давая совет, мы подспудно ставим себя на место автора вопроса и стоветуем ему то, чего хотели бы сами. чего не сделали, недоучили, не успели или собираемся сделать, выучить, успеть. это вполне естественно, но не правильно. потому что люди разные и цели, опять-таки разные. всегда нужно делать поправку на это маленький, но очень существенный факт.
а еще мечты какие-то мелкие, местечковые. современному украинскому программисту пределом мечтаний видится работа в IBM, Google, Microsoft. это должно стать решением всех проблем и ответом на все вопросы. по-моему это ошибочное мнение. человек должен уметь самостоятельно решать свои проблемы, самостоятельно удовлетворять собственные амбиции. иначе Энцо Феррари до конца жизни работал бы в Alfa Romeo, Билл Гейтс был бы топ-менеджером IBM, а Сергей Брин преподавателем Стэнфорда.

"Слабого судьба тащит на веревке, того, кто сильнее, - за руку ведет, а самый сильный сам судьбой становится..."
(с) Андрей Валентинов "Диомед, сын Тидея"

p.s. наши околопрофессиональные споры часто выглядят очень смешно. человек спрашивает "как выбирать яблоки?", советчики пускаются в длинные споры относительно достоинств тех или иных сортов яблок, способов выращивания яблоневого сада, способах хранения и утилизации яблок. а часто предлагают вместо яблок купить груши или сливы. и ни слова о том, как же все-таки выбирать яблоки.

пʼятниця, 22 травня 2009 р.

по следам 7го ITtalk

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

четвер, 21 травня 2009 р.

Шахтар ЧЕМПІОН

Шахтар виграв Кубок УЄФА! Слава Україні!

середа, 20 травня 2009 р.

Graph framework for Java web UI

а не посоветуют ли благородные доны какую-нибудь готовую Open Source реализацию Java framework для построения графов? мне нужен самый простой функционал -- возможность формирования модели и отображение этой модели в web UI. желательно, каким-нибудь более современным способом, чем Applet. поиска путей, опитимизации путей и прочей математики не требуется. про yWorks и ILOG я знаю, но во-первый, денег на коммерческие компоненты у проекта нет, во-вторых, компоненты содержат слишком много излишнего функционала, за который никто платить не захоче.
вот такие дела.

четвер, 8 січня 2009 р.

Java & Active Directory

кратенькая заметка о том, как легко и непринужденно сделать single sign on в Java web приложении для серверов, включенных в домен Windows (Samba) Active Directory.
минимально необходимая библиотека jCIFS. настройки по интеграции достаточно просты и для самого простого случая достаточно минимальных, описанных на сайте. логин и пароль для Samba можно не указывать. в этом случае приложение напишет в логи сообщение, что Samba может работать не корретно, но в целом процедура авторизации работает.
также понадобится настройка браузера
Internet Explorer
достаточно включить опцию Internet Options -> Advanced -> Security -> Enable Integrated Windows Authentication
Firefox
1. откройте Firefox
2. загрузите url about:config
3. перечислите через запятую адреса серверов для следующих параметров
network.automatic-ntlm-auth.trusted-uris
network.negotiate-auth.delegation-uris
network.negotiate-auth.trusted-uris
Opera
википедия говорит, что с 9 версии прозрачная аутентификация поддерживается. никаких дополнительных настроек никто не предлагает. я не проверял, поэтому прийдется принять этот факт на веру и проверить на практике.
Safari
опять таки, доподлинно не известно, работает ли аутентификация в Safari on Windows, кое-где есть ссылки, что не рабоает. иначе говоря, как и для Оперы нужно проверять.
Google Chrome и прочие
да простят меня фанаты Chrome, но на текущий момент это еще бОльшая экзотика, чем Опера или Сафари, так что здесь я предлагаю фанатам проверить совместимость самим :)