2011-12-04

Памятка по установке JRebel

Прежде всего хочу сказать, что настраивать-то особо нечего ;-)
Можно посмотреть презентацию "для вдохновения" zeroturnaround.com/jrebel/presentations.

Я использую IntelliJ IDEA, для других IDE инструкция может слегка отличаться, см zeroturnaround.com/resources .

1. Идем в IDE settings | plugins и находим среди доступных JRebel Plugin, Download and Install, Apply (restart).

С сайта zeroturnaround.com/jrebel/current ничего качать не нужно, все включено в плагин.


2. В IDE settings появится пункт JRebel, там нажимаем Launch JRebel Configuration Wiazard...
Первый пункт активация - проще и дешевле начать с evolution.
Второй пункт license пропускаем -  evolution сам сгенерирует и активизирует лицензию на 30 дней.


3. пункт Choose settings выбираем какая IDE используется, тогда следующие пункты будут показывать инструкции по мелкой оптимальной подстройке этой IDE.

Следует выставить три 'галочки' в IDE по инструкциям в последующих пунктах.

Закончили с установкой и конфигурированием.


4. В Project view проекта в pop-up menu выбираем Generate rebel.xml

Далее как сделал я и как удобно мне, возможно вам тоже понравится :-)



5. Сохраняем rebel.xml в [webroot]/WEB-INF/classess
Это единственный, довольно простой конфигурационный файл JRebel.

Основные настройки описаны в zeroturnaround.com/jrebel/how-to-configure-rebel-xml
На всякий случай ссылка на полное описание (скорее всего не понадобится): zeroturnaround.com/jrebel/configuration

Настройки по умолчанию мне не подошли т.к.
a. я использую Apache Click, который при старте достает некоторые ресурсы в [webroot], а так как по умолчанию используется [webroot] в исходниках, то система контроля версий обнаруживает кучу новых файлов.

b. в проекте много модулей, которые компилируются в jar-ы и кладутся в [webroot]/WEB-INF/lib

Поэтому пришлось прописать папку target/название_web_app - как [webroot],
и несколько target/production/название_модуля - как путь для поиска классов, где:
* target стандартное maven-название папки куда все компилируется,
* production - папка принудительно создаваемая IDEA,
* название_web_app - путь который вы прописали в Web Application exploded artifact, e.g. voip, smsrouter, etc,
* название_модуля - IDEA создает для каждого модуля свои подпапки в production.

Итоговый файл:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd">

 <classpath>
  <dir name="C:/j/voip.dev/bh/target/production/core"/>
  <dir name="C:/j/voip.dev/bh/target/production/demo"/>
  <dir name="C:/j/voip.dev/bh/target/production/mca"/>
  <dir name="C:/j/voip.dev/bh/target/production/tts"/>
 </classpath>

 <web>
  <link target="/"><!-- если эту папку zip-ануть, получится .war -->
   <dir name="C:/j/voip.dev/bh/target/voip" />
  </link>
 </web>
 
</application>

Готово!

Далее просто запускаем Tomcat не обычной зеленой стрелочкой, а стрелочкой с "jr".
Вносим изменения в код, компилируем (IDEA перед этим сохраняет) Ctrl+Shift-F9 или Ctrl-F9, F5 в браузере и видим обновление.

PS: если хочется ускорить первый старт Tomcat, то мой предыдущий совет "скопировать папку VAADIN из vaadin.jar в [webroot]" по прежнему применим.


Кроме того, возможно вам захочется избавиться от сериализации HTTP сессии между рестартами Tomcat (пользы от этой сериализации в случае Vaadin не очень много), для этого в [webroot]/META-INF нужно поместить файл context.xml вида:
<?xml version='1.0' encoding='utf-8'?>
<Context antiJARLocking="true" >
  <!-- Default set of monitored resources -->
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
 
  <!-- disable session persistence across Tomcat restarts -->
  <Manager pathname="" />
</Context>

Аттрибут antiJARLocking="true" опционален (можно убрать). Он нужен если web приложение не освобождает какие-то классы и не выгружается Tomcat (свой код лучше от такого чистить, но бывают такие библиотеки третьих сторон).

2011-12-02

Робот полотер

Читаю Робот-полотер Mint - обзор @ exler.ru/expromt/10-11-2011.htm и нахожусь в задумчивости.
Дома у меня нет ковров, везде ламинат т.е. пылесос не нужен, а вот полотер...

2011-12-01

Разное про Java, Web и Vaadin

1. Для качественного ускорения web разработки на Java можно использовать замечательный продукт JRebel zeroturnaround.com/jrebel (кратко, что это). Он позволяет практически полностью отказаться от длительного re-deploy процесса.
Внес исправление в код, перекомпилировал - web приложение уже обновилось (вроде PHP,Python,Ruby). Продукт платный, но есть интересный способ использовать бесплатно: social.jrebel.com.

Кроме того они сделали вкусную zip java lib: новость repo.


2. Если не использовать JRebel и разрабатывать используя Vaadin, то можно обнаружить, что при первом запуске vaadin приложения после старта Tomcat, оно висит несколько секунд (примерно 10 на моём ПК). Исследование показало, что "висит" не сам Vaadin, а вызванный в com.vaadin.terminal.gwt.server.AbstractApplicationServlet#serveStaticResourcesInVAADIN Tomcat.
vaadin.jar довольно большой и чтение ресурсов из него длительная операция.
Чтобы избавится от этой задержки достаточно скопировать папку VAADIN из vaadin.jar в web app root (там где WEB-INF, META-INF, etc).
Если Вам помог этот совет проголосуйте за мой совет на stackoverflow.com/questions/3904735.


3. JavaScript is assembly language for the web ИЛИ кто ещё не написал свой веб-Си?
GWT (Google Web Toolkit) - золотой стандарт компиляции в JS, все знают, многим хочется повторить.

Ладно Google начал страдать NIH синдромом и решил изобрести JavaScript (его придумали/сделали не они) dartlang.org

Но так, чтобы ВСЕ бросились компилировать в JS (включая больных и убогих)...
На 20ом языке начинает пробивать смех:
github.com/jashkenas/coffee-script/wiki/List-of-languages-that-compile-to-JS

Даже QBASIC не забыт!


4. Унифицированный способ запускать различные контейнеры e.g. Tomcat из своего кода
cargo.codehaus.org


5. Для копирования DTO между разными уровнями в web приложении пригодится
dozer.sf.net

2011-07-07

Интересное про память и Java

javaspecialists.eu/archive/Issue193.html

Вообще имеет смысл прочитать все его выпуски.

В частности же:

на 64-bit серверах с 64-bit java полезно попробовать опцию
-XX:+UseCompressedOops
64bit архитектура == 64bit указатели (vs 32bit = в 2 раза больше).
С этой опцией JVM указатели (не все) оптимизирует ==
- жрет меньше памяти
- меньше байт прокачивать по шинам.

В Java7 будет сексуально выглядящий Javadoc

http://download.java.net/jdk7/docs/api/


Хотя лично мне нравится chm версия: упакованная, быстрая, со сквозным индексом и поиском.

Работа территориально распределенных коллективов

Для удаленной работы одного GMail/GTalk бывает недостаточно.
Skype ~ GTalk только без архива на сервере и более распространненый.

JIRA (и другие аналогичные продукты), Wiki, Jing - уже почти всё что нужно.

Недавно наткнулся на интересный продукт:
Team Viewer
совместная работа, презентации, удаленное управление, тех поддержка и тд
Изучаю...

fun

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

В blogger просто зашел и разместил!
В блог добавляется preview, при клике на картинке открывается полная версия.


Манул IKEA по сборке Стоунхенджа и говнотвиттер:





PS: ну и немного о технике...
Эта гребля с ЖЖ напомнила мне о книге, которую я рекомендую прочитать всем.
Жизнь внутри пузыря.
Она как бы историческая и про интернет, но работая в большой "реальной" корпорации "я плакалъ".

2011-07-04

Сравнение схем БД

Я работаю с MSSQL и MySQL и часто приходится сравнивать изменения в БД.

* Делаю так: скриптую БД с разбивкой всех объектов на индивидуальные файлы, после чего сравниваю, используя diff tool с возможностью сравнения директорий.
Очень просто и удобно.
Сама папка находится под DVCS Mercurial/HG т.е. можно смотреть историю изменений.


* Знаю про другой способ (работает в т.ч. между серверами разных версий т.к., например, скрипты MSSQL 2008 и 2000 довольно сильно отличаются).
Для MySQL: devart.com/ru/dbforge/mysql/studio
Для MSSQL: devart.com/ru/dbforge/sql/datacompare
Сам активно не пользовал, но один знакомый активно использует и очень хвалит.

* Есть что-то ещё?...

2011-05-15

Скриншоты и скринкасты - просто и удобно

Потребовалось отправить в Jetbrains screen-cast бага (что он существует ;-).

Провел небольшое исследование: чем быстро и просто записать короткий screen-cast (изображение части экрана, курсор, звук с микрофона).
Нашел несколько вариантов, в итоге выбрал jing

Просто (ничего не надо настраивать), удобно.
Делает помимо видео, фотки куска экрана (PrtScn и последующее вырезание в редакторе достало).

Думаю о дальнейшем использовании.

PS: для скриншотов есть OpenSource sf.net/projects/greenshot - сегодня рассылка SF-ная принесла

UPD2: http://camstudio.org/ OpenSource утилита для записи скринкастов

2011-04-05

2011: Сменил default кодировку консоли cmd.exe на cp1251

Как известно default  кодировка/codepage windows консоли cmd.exe DOS 866.
На дворе 2011 и я решился сменить её на кодировку остальной системы cp1251.
Узнать какая кодировка выставлена, можно набрав в cmd.exe команду chcp.
Сменить "на лету" можно chcp 1251.
С UTF-8 chcp 65001, как мы уже выяснили не работает.

Чтобы сменить на постоянной основе требуется:

Start->Run->regedit
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
сменить кодировку в OEMCP с 866 на 1251

После чего потребуется перезапуск.

Найдено здесь.


Пора избавляться от старого барахла.
Если очень захочется запустить что-то старое DOS-овское "chcp 866" в помощь.

Замеченые минусы:
давно надо было у архиваторов выставить кодировку файлов UTF-8, пришлось некоторые архивы пережать.

2011-03-22

Mercurial - Hg

Начал читать http://hginit.com
Читая раздел для SVNщиков утер слезу - до чего верно пишет.

После этого полезно mercurial.selenic.com/guide


В UTF-8 не работает (глюк windows). Поэтому не chcp 65001 (меняет кодировку консоли на UTF-8), а chcp 1251 - ваш друг.
Для работы удобнее всего оказался cmd.exe /X /K chcp 1251 && cd "путь"

Отличная утилита HgWin, вызывается из командной строки (hgwin cmd) и открывает GUI окошко. Если сразу в GUI, то TortoiseHG вполне.

Отличная короткая статья об организации процесса подходящего и для моих проектов: http://stevelosh.com/blog/2010/05/mercurial-workflows-stable-default/

Относительно коммитов решил, что буду коммитить часто. Как ограничение "вечером не должно оставаться незакоммиченной работы".
Чтобы не зафлудить репозитарий сырым кодом буду применять следующее соглашение:

1. закомичиваемый код должен компилироваться (этого можно достичь даже вечером, пустые методы с todo написать и тд)
2. если тесты не прошли или нет времени на все тесты, то commit message должен начинаться с "?": ?Обзвон нескольких телефонов в списке
3. если тесты проходят и по ощущениям код хороший, то commit message не начинается с ? и ! т.е. любые другие символы
4. если код отлично прошел тесты на DEV SERVER и его можно пытаться выкладывать на PRODUCTION, то commit message начинается с !
5. на бой выкладываются только ревизии с commit message начинающиеся на !
6. после выкладки на бой (вроде полетело, чуток поглядели - летит) тегируем версию "YYYY-MM-DD major.minor примечания"
7. после некого интервала (ничего не вылезло, клиенты не звонят с воплями) мержим default в stable

x. если вдруг потом обнаружен баг, переключаемся на "YYYY-MM-DD
major.minor примечания" в stable, правим / build, test, func/sys test, deploy / tag "ymd major.minor примечания"2, merge это исправление в default

y. если хочется надолго всё сломать - локальный feature clone. Из которого потом pull, merge в local#default и rm -rf feature clone


PS1:
Мучился вопросом: как бранчи случайно названные одинаково разными программистами не пересекаются?
Ответ: пересекаются! Рекомендуют именовать приватные бранчи "программист-название бранча".
http://nubyonrails.com/articles/five-features-from-mercurial-that-would-make-git-suck-less

Про бранчи vs клоны общий совет такой:
для собственных нужно лучше делать локально клоны.
Именованые бранчи для длительных линий разработки, типа есть три версии программы 1.0, 2.0, 3.0. Переход на новую версию стоит денег и не все пользователи переходят, сидят на 1.0 и 2.0, однако баги, возможно какие-то вкусняшки им давать необходимо (они купили). Дескать это хорошее применение для бранчей.


PS2:
Разумеется все теоретики запада против хранения генерируемых файлов в репозитарии - их можно моментально создать, любой версии, когда понадобятся (class, jar, war, ear, javadoc).
Сгенерированные исходники (Google Protobuf, из WSDL) - нельзя менять, но хранить в VCS можно. Для анализа, что менялось или "почему всё сломалось". Но менять нельзя!
Если в сгенерированные исходники надо внести изменения - советуют от них наследоваться, либо использовать композицию, тогда сгенерированный код может следовать за обновлениями, а не  останется на века в той версии где подправили.

2011-02-27

Java tips #1

* Использую следующие дополнительные параметры запуска javac в IDE:
-J -ea -Xlint:all -Xlint:-serial -J -XX:+AggressiveOpts -J -XX:+UseFastAccessorMethods

можно использовать "облегченную" версию -Xlint:all -Xlint:-serial
Javac сообщает гораздо больше интересного (хинты) о  коде.

Вообще у JVM просто огромное количество настроек...

А  resource patterns у меня
?*.properties;?*.xml;?*.gif;?*.png;?*.jpeg;?*.jpg;?*.html;?*.htm;?*.dtd;?*.tld;?*.conf;?*.mp3;?*.wav;?*.mid;?*.midi;?*.ftl;?*.css;?*.js;?*.ico

* Jdbc batches действительно ускоряют массовые операции
How To Use JDBC addBatch Method with MySQL for Improved Performance

Правда у большинства JDBC Drivers (MySQL единственное известное мне исключение) нельзя в batch получить autoinc PK, т.е. они не подойдут, либо использовать ручную генерацию PK.

2011-02-18

Шрифты

Читая один блог, наткнулся на рассуждения о шрифтах, какие лучше для чтения и программирования.
Посмотрев на календарь, увидел, что там 2011 год.
Решил, что, наверное, надо тоже сменить Tahoma и Courier New, на более современные разработки, тем более, что у меня с оказией Vista, а там идут новые секретные шрифты разработки M$.
Calibri, Cambria, Candara, Consolas, Constantia and Corbel - according to Poynter Online, the new ClearType Font Collection incorporates improved Clear Type and OpenType technologies, and a boatload of research, to improve the structure and the clarity of the letter forms. Basically, that means a story will be easier to read because the letters and words won't be as soft and mushy looking.

* Calibri - sans serif, suitable for documents, e-mail, Web design, and magazines
* Cambria - serif, a formal type for business documents, e-mail, and Web design
* Candara - sans serif, with vertical strokes not as reader-friendly perhaps
* Consolas - monospaced, suitable for displaying programming code
* Constantina - serif, very clean and readable, created for use in print or on the screen
* Corbel - sans serif, clean and works as an alternative to Arial, Trebuchet or Verdana
Для разработки в IDE и редакторах (notepad++) поставил Consolas.
Чуть не заболели глаза, стал разбираться - оказывается это шрифты под ClearType (в настройках дисплея), который у меня был выключен, т.к. он превращал Tahoma и Courier New в пытку, а тут видишь наоборот.
После включения сглаживания ClearType Consolas стал выглядеть очень мило и прилично. Из приятных бонусов: 1 не похожа на l(L малое), а у 0 (нуля) есть черточка, как в старые добрые времена.

Для остального долго мучился (вроде и так не так и это не так), выбрал Constantia serif и Corbel sans serif (основной) в Chrome и Constantia/Calibri в FF.
Потратил полдня, пока привыкаю, но в целом вроде мило.

2011-02-11

MySQL links and tips

Links
1. Сам MySQL и документацию (жаль в chm перестали делать) брать здесь:
http://dev.mysql.com/downloads/mysql/


2. Java JDBC Driver:
http://dev.mysql.com/downloads/connector/j/


3. Простая, легкая консоль (я пользуюсь ею для повседневных нужд - это free OS урезная редакция):
http://code.google.com/p/sqlyog/


4. Очень навороченная, крутейшая консоль+enterprise manager+отчеты
(можно в некоторых случаях отчеты делать не в web UI, а используя эту студию):
http://www.devart.com/ru/dbforge/mysql/studio/

Вот список возможностей:
http://www.devart.com/ru/dbforge/mysql/studio/features.html
в частности:
# Генерация отчетов данных
# Построение сводных таблиц

У них, кстати, много ещё вкусного free4personal для cp1251 users:
http://www.devart.com/ru/dbforge/


5. Советую подписаться на MySQL newsletter (на сайте MySQL легко найти)
бывают интересные статьи, советы, новости, интервью с экспертами.


6. Блог о тюнинге MySQL
mysqlperformanceblog.com
Лучше читать записи постарее (в новых много слишком заумного и про их порт).



Performance super mini faq
В my.ini/my.cnf файле конфигурации есть опция innodb_flush_log_at_trx_commit, внимательно почитайте про неё.
innodb_flush_log_at_trx_commit=0  - вполне разумный выбор IMHO


Vars
К сожалению, в запросе MySQL трудно написать сложную программу с if, while и тд, как это можно сделать в t-sql. В MySQL всё должно представлять из себя выражение см на примере if.
Но переменные это что-то! Их не надо муторно объявлять с типом и можно использовать в самых удивительных местах.
Пример (чтобы в Java работало несколько statement; в запросе не забудьте allowMultiQueries=true в JDBC Connection String/URL):

set @a = null; set @b = null; set @c = null;

select @a, @b, @c;-- null, null, null - всё чисто и готово к эксперименту

select 'boo!', @a+@b+@c
FROM (SELECT @a := 1, @b := 2, @c := 3) t; -- boo!, 6 т.е. from отработал раньше

select @a, @b, @c;-- 1,2,3 значения сохранились

select @a, @b, @c from (select @a := @a*10, @b:=@b*20, @c:=@c*30) t;-- 10,40,90 опять from отработал раньше

select @a, @b, @c;-- 10,40,90 и значения сохранились


SqlWatch
Отличная утилита code.google.com/p/sqlwatch !
Ставится как "JDBC proxy", предоставляет широкие возможности для профилирования sql запросов приложения.

JDBC Connection String
Сейчас использую следующий набор опций: jdbc:mysql:///название_БД?connectTimeout=180000&allowMultiQueries=true&cacheServerConfiguration=true&useLocalSessionState=true&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true
 

2011-02-09

Займемся самолечением

Важно! Предупреждение! Я не доктор и от медицины далек. Если вы заболели, лучше обратиться к врачу. Диагноз ставит врач. Лечение назначает врач (внимательно изучите, что он вам назначил).
Антибиотики назначает только врач! Не занимайтесь самолечением!

Нижеследующие советы представляют собой опыт моей семьи для информации, если врач постоянно пичкает вас антибиотиками.

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

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

Организм заболевшего человека через некоторое время САМ обучается бороться с проникнувшим вирусом и побеждает его.
Очень важно, что температура, которая бывает при этом – это помощник организма
(она в т.ч. убивает вирусы), показатель того, что организм борется.


Всё "лечение", которое даёт в данном случае медицина сводится к тому, чтобы снять интоксикацию, симптомы или осложнения = ПОСЛЕДСТВИЯ.

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

Существенным прорывом науки в борьбе в вирусами являются прививки: это (всё сложнее, но для простоты) убитые или ослабленные вирусы. Организм учится определять и убивать их в тренировочном режиме, после чего в боевом это происходит быстрее.
При этом они не дают 100% гарантии и сами могут приводить к осложнениям ;-)

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

Что делать, если заболели?
1.    заболев лежать, много пить (вода, чай с травами, шиповником), есть много витамина С, много спать.
2.    по возможности (до 38-39 градусов) не сбивать температуру
3.    не жрать без необходимости антибиотики
4.    чистить нос Coclean
5.    капать в нос Гриппферон
6.    пить Ремантадин (римантадин)
7.    пить настойку Эхиноцеии Пурпурной и Арбидол



Что делать, чтобы минимизировать риск заболевания?
Тренировать собственные защитные функции организма.
1.    прививка
2.    закаливание, например, контрастный душ (и кожа подтянется)
3.    зарядка / физические нагрузки
4.    прогулки на свежем воздухе
5.    чистить нос Coclean
6.    капать в нос Гриппферон (профилактические дозы)
7.    пить настойку Эхиноцеии и Арбидол  (профилактические дозы)
8.    чистка организма

2011-01-19

Технологические планы на 2011

  • Изучить и начать использовать mercurial.selenic.com (Hg)
  • Изучить и начать использовать maven.apache.org
  • Перейти с Log4j на давно изученный logback.qos.ch
  • Хорошенько сравнить mybatis со Spring JDBC + мои доработки - использовать победителя
  • Улучшить знание CSS
  • Улучшить знание JavaScript
  • IDEA 10 и только ручки
  • StAX (и углублять JAXB)
  • Активнее использовать  JBoss HornetQ (может есть MQ лучше? RabbitMQ и ActiveMQ не впечатлили)
  • Активнее использовать Ehcache (вкусное в 2.4, попробовать распределенный) + Spring 3.1 cache abstraction