Потребовалось отправить в Jetbrains screen-cast бага (что он существует ;-).
Провел небольшое исследование: чем быстро и просто записать короткий screen-cast (изображение части экрана, курсор, звук с микрофона).
Нашел несколько вариантов, в итоге выбрал jing
Просто (ничего не надо настраивать), удобно.
Делает помимо видео, фотки куска экрана (PrtScn и последующее вырезание в редакторе достало).
Думаю о дальнейшем использовании.
PS: для скриншотов есть OpenSource sf.net/projects/greenshot - сегодня рассылка SF-ная принесла
UPD2: http://camstudio.org/ OpenSource утилита для записи скринкастов
2011-05-15
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, как мы уже выяснили не работает.
Чтобы сменить на постоянной основе требуется:
После чего потребуется перезапуск.
Найдено здесь.
Пора избавляться от старого барахла.
Если очень захочется запустить что-то старое DOS-овское "chcp 866" в помощь.
Замеченые минусы:
давно надо было у архиваторов выставить кодировку файлов UTF-8, пришлось некоторые архивы пережать.
На дворе 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 можно. Для анализа, что менялось или "почему всё сломалось". Но менять нельзя!
Если в сгенерированные исходники надо внести изменения - советуют от них наследоваться, либо использовать композицию, тогда сгенерированный код может следовать за обновлениями, а не останется на века в той версии где подправили.
Читая раздел для 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/
Относительно коммитов решил, что буду коммитить часто. Как ограничение "вечером не должно оставаться незакоммиченной работы".
Чтобы не зафлудить репозитарий сырым кодом буду применять следующее соглашение:
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/
Про бранчи 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:
можно использовать "облегченную" версию -Xlint:all -Xlint:-serial
Javac сообщает гораздо больше интересного (хинты) о коде.
Вообще у JVM просто огромное количество настроек...
А resource patterns у меня
* Jdbc batches действительно ускоряют массовые операции
How To Use JDBC addBatch Method with MySQL for Improved Performance
Правда у большинства JDBC Drivers (MySQL единственное известное мне исключение) нельзя в batch получить autoinc PK, т.е. они не подойдут, либо использовать ручную генерацию PK.
-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$.
Чуть не заболели глаза, стал разбираться - оказывается это шрифты под ClearType (в настройках дисплея), который у меня был выключен, т.к. он превращал Tahoma и Courier New в пытку, а тут видишь наоборот.
После включения сглаживания ClearType Consolas стал выглядеть очень мило и прилично. Из приятных бонусов: 1 не похожа на l(L малое), а у 0 (нуля) есть черточка, как в старые добрые времена.
Для остального долго мучился (вроде и так не так и это не так), выбрал Constantia serif и Corbel sans serif (основной) в Chrome и Constantia/Calibri в FF.
Потратил полдня, пока привыкаю, но в целом вроде мило.
Посмотрев на календарь, увидел, что там 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.Для разработки в IDE и редакторах (notepad++) поставил Consolas.
* 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
Чуть не заболели глаза, стал разбираться - оказывается это шрифты под 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
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. чистка организма
Антибиотики назначает только врач! Не занимайтесь самолечением!
Нижеследующие советы представляют собой опыт моей семьи для информации, если врач постоянно пичкает вас антибиотиками.
Коллеги просто напугали своими обширными познаниями в медицине на уровне "солнце вращается вокруг земли".
Решил изложить, что я знаю о креветках и отправлять всех читать этот пост.
Итак, горькая правда состоит в том, что современная медицина не умеет лечить большинство вирусных инфекций (перечитайте ещё раз).
Организм заболевшего человека через некоторое время САМ обучается бороться с проникнувшим вирусом и побеждает его.
Очень важно, что температура, которая бывает при этом – это помощник организма (она в т.ч. убивает вирусы), показатель того, что организм борется.
Всё "лечение", которое даёт в данном случае медицина сводится к тому, чтобы снять интоксикацию, симптомы или осложнения = ПОСЛЕДСТВИЯ.
Так любимые многими антибиотики НЕ воздействуют на вирусы!
Они убивают бактерии, в том числе полезные, нанося при этом серьезный удар по организму.
Их назначают в том случае, если, например, после гриппа у вас развилась бактериальная ангина.
Пить их нужно, в крайнем случае, если осложнение таки появилось и оно серьезное.
Назначает прием антибиотиков и их конкретный тип - только врач! (Внимательно изучите назначение, если оно из книжек времен Брежнева - обсудите с врачем более современные и щадащие средства!)
Существенным прорывом науки в борьбе в вирусами являются прививки: это (всё сложнее, но для простоты) убитые или ослабленные вирусы. Организм учится определять и убивать их в тренировочном режиме, после чего в боевом это происходит быстрее.
При этом они не дают 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
2010-12-19
My Spring config style
Не понимаю фанатов Guice. Голый DI без классов удобной интеграции и XML ;-)
Если очень хочется обойтись вообще без XML в Spring:
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
Кстати, в javadoc к нему: "Note: In case of multiple @Configuration classes, later @Bean definitions will override ones defined in earlier loaded files. This can be leveraged to deliberately override certain bean definitions via an extra Configuration class"
То же самое в org.springframework.context.support.ClassPathXmlApplicationContext: In case of multiple config locations, later bean definitions will override ones defined in earlier loaded files. This can be leveraged to deliberately override certain bean definitions via an extra XML file…
Я конфигурирую Spring так:
- org.springframework.web.context.support.XmlWebApplicationContext
- конфигурируется в web.xml
org.springframework.web.context.ContextLoaderListener
- всё что требует гибкой настройки находится в Spring XML.
- всё что окружение-зависимо в .conf файлах читаемых org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
- включены аннотации, наиболее активно используются @Autowired, @Required
- очевидные, однозначные вещи конфигурируются через @Component, @Service, @Repositary (т.е. в XML не присутствуют) через:
IDEA проверяет правильность конфига и соотвествие его Java коду. Получаем замену скриптовым языкам с проверкой на этапе написания/компиляции.
PS: интересная презентация о следующих версиях Spring 3.1, 3.2
http://www.infoq.com/presentations/Spring-3.0-3.1-3.2
PPS: с оказией прошу поддежать включение поддержки JavaScript (rhino) в поставку Spring
https://jira.springframework.org/browse/SPR-1933
свежая версия https://jira.springframework.org/secure/attachment/16144/org.springframework.scripting.rhino_100205.zip
в комментариях есть примеры работы: многопоточной, с передачей объектов из приложения и тд - сказка!
Сейчас со Spring поставляются bsh, JRuby, Groovy - кому первые два нужны неясно.
Если очень хочется обойтись вообще без XML в Spring:
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
Кстати, в javadoc к нему: "Note: In case of multiple @Configuration classes, later @Bean definitions will override ones defined in earlier loaded files. This can be leveraged to deliberately override certain bean definitions via an extra Configuration class"
То же самое в org.springframework.context.support.ClassPathXmlApplicationContext: In case of multiple config locations, later bean definitions will override ones defined in earlier loaded files. This can be leveraged to deliberately override certain bean definitions via an extra XML file…
Я конфигурирую Spring так:
- org.springframework.web.context.support.XmlWebApplicationContext
- конфигурируется в web.xml
- всё что требует гибкой настройки находится в Spring XML.
- всё что окружение-зависимо в .conf файлах читаемых org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
- включены аннотации
- очевидные, однозначные вещи конфигурируются через @Component, @Service, @Repositary (т.е. в XML не присутствуют) через:
IDEA проверяет правильность конфига и соотвествие его Java коду. Получаем замену скриптовым языкам с проверкой на этапе написания/компиляции.
PS: интересная презентация о следующих версиях Spring 3.1, 3.2
http://www.infoq.com/presentations/Spring-3.0-3.1-3.2
PPS: с оказией прошу поддежать включение поддержки JavaScript (rhino) в поставку Spring
https://jira.springframework.org/browse/SPR-1933
свежая версия https://jira.springframework.org/secure/attachment/16144/org.springframework.scripting.rhino_100205.zip
в комментариях есть примеры работы: многопоточной, с передачей объектов из приложения и тд - сказка!
Сейчас со Spring поставляются bsh, JRuby, Groovy - кому первые два нужны неясно.
2010-12-03
Java NG
В продолжение "хотелок" в Java.
Я считаю, что язык надо упрощать, а не усложнять (как это делает Scala).
Список пожеланий, что хотелось бы улучшить, добавить:
(в тексте [] используются для простого html == меньше больше)
1. добавить всё что есть в Project Coin: small language changes
много мелких синтаксических сахарков, делающих код более простым и наглядным.
В частности 'array getter/setter': v = myList[i]; mymap["key1"] = value == компилятор подставляет вызов get и put соответственно.
Если методов get/put/set не находится, то можно использовать любые другие проаннотированные @ArrayProperty
2. всё что есть в проекте Google Guava http://code.google.com/p/guava-libraries/
плюс статические и fallback методы у интерфейсов т.е. "перенос" максимум кода из статических методов в instance методы (mySet.filter(..), map1.transform, etc).
Пояснение про fallback: это статические методы в интерфейсе вида T filter (Set this, Filter _) - если у instance метода filter(Filter) нет,
то используется fallback метод из интерфейса.
myset.filter(myfilter).transform(myfunc) выглядит нагляднее и лучше работает с автокомплитом в отличии от transform(filter(myset, myfilter), myfunc)
3. возможность не писать ";" там где IDE и компилятор справятся без ; т.е. сделать точку с запятой более опциональной
Например: после и перед } , после )
4. простые замыкания (а не предлагаемый ужас), например: #{тело метода } или #(аргумент1, арг2, ){ тело } + именование параметров по умолчанию _ / _0, _1, _2, etc.
Последнее выражение в теле замыкания == return это выражение.
Также простое указание метода реализующего тело замыкания #this.имяМетода или #имяМетода или #другойОбъект.имяМетода (примеры ниже).
Примеры использования:
new Thread(#{log.info("hello!")}).start() == new Thread(new Runnable(){@Override public void run () { log.info("hello!"); }}).start()
mySet.filter(#{_ != null}) == mySet.filter(new Predicate[SomeType](){ @Override public void boolean apply (@Nullable SomeType _) { return _ != null; }});
vs текущее Iterables.filter(mySet, ....многобукв);
list.sort(#(a,b){a-b}) задание читателю ;-)
"ссылка на метод"
new Button("Нажми меня", #myThisButtonClickListener) где в том же объекте объявлен реализующий тело интерфейса listener-а метод
public void myThisButtonClickListener (Button.ClickEvent event) {
final Window subw = new Window("суб-окошечко");
getMainWindow().addWindow(subw);
...
}
== new Button("Нажми меня", #{myThisButtonClickListener(_)})
Многие уже сейчас реализуют это через reflection т.е. можно указать объект (this в данном случае) и имя метода в виде строки "myThisButtonClickListener"
5. конструкцию let[def/val/var], для тел методов, которая бы сама выводила тип переменной _в левую сторону_ vs текущая тенденция
выводить в правую (diamond operator и все эти Джошуа Блоковские static list, newMap и тд).
Пример использования.
let myvar = new ConcurrentHashMap[ТУТ БОЛЬШОЙ СПИСОК С Generics]()
final let s = "hello"
далее по коду работать с этими переменными как с обычными типизированными
for (let i : mybiggenericmap.entrySet()) {
let k = i.key;
for (let j = k; j<MAX; j++) {
6. авто свойства: если у класса есть getter getFoo(), то можно обращаться a = obj.foo, а если есть setter setFoo(T value), то obj.foo = v1. Внутри самого класса обращение к foo должно работать с переменной T foo, а this.foo - с getters/setter.
Автобилдеры? myedit.width = 80, hight = 16, styleName = "sexy, main", value = 42;
7. массивы implements Iterable (можно будет применять filter, transform) и for работающий по Iterable/Iterator/Enumeration т.е. всеядный for, а не только массив и Iterable как сейчас.
Кроме того станут возможными унифицированные API: public double sum(Iterable collectionOrArray) .
8. полезные идеи из JavaFX (полный отказ от чистого JavaFX - это хорошо)
У JavaFX 2.0 очень трезвый и разумный roadmap http://javafx.com/roadmap/
Очень рекомендую на него поглядеть, много вкусного.
9. JRebel встроенный в JVM. JRebel хорошо, а out-of-box он бы imho дал такой синергетический эффект, что здорово бы улучшил индустрию.
Самый сильный козырь скриптовых языков быстрый цикл редактирование-тестирование в web, с JRebel этот козырь получили бы все языки JVM.
10. /regexp Pattern/ прямая поддержка в Java коде т.е. данная конструкция должна выглядеть как скомпилированный Pattern.
11. === безопасный вызов equals т.е.: a = b - присваивание, a == b - сравнение ссылок и простых типов, left === b - сравнение объектов (и простых типов): if (left == b) { return true; } if (left == null || b == null) { return false; } return left.equals(b);
Это сделало бы язык проще и уменьшило бы количество действительно ненужного кода, не превращая язык в Perl.
Я считаю, что язык надо упрощать, а не усложнять (как это делает Scala).
Список пожеланий, что хотелось бы улучшить, добавить:
(в тексте [] используются для простого html == меньше больше)
1. добавить всё что есть в Project Coin: small language changes
много мелких синтаксических сахарков, делающих код более простым и наглядным.
В частности 'array getter/setter': v = myList[i]; mymap["key1"] = value == компилятор подставляет вызов get и put соответственно.
Если методов get/put/set не находится, то можно использовать любые другие проаннотированные @ArrayProperty
2. всё что есть в проекте Google Guava http://code.google.com/p/guava-libraries/
плюс статические и fallback методы у интерфейсов т.е. "перенос" максимум кода из статических методов в instance методы (mySet.filter(..), map1.transform, etc).
Пояснение про fallback: это статические методы в интерфейсе вида T filter (Set this, Filter _) - если у instance метода filter(Filter) нет,
то используется fallback метод из интерфейса.
myset.filter(myfilter).transform(myfunc) выглядит нагляднее и лучше работает с автокомплитом в отличии от transform(filter(myset, myfilter), myfunc)
3. возможность не писать ";" там где IDE и компилятор справятся без ; т.е. сделать точку с запятой более опциональной
Например: после и перед } , после )
4. простые замыкания (а не предлагаемый ужас), например: #{тело метода } или #(аргумент1, арг2, ){ тело } + именование параметров по умолчанию _ / _0, _1, _2, etc.
Последнее выражение в теле замыкания == return это выражение.
Также простое указание метода реализующего тело замыкания #this.имяМетода или #имяМетода или #другойОбъект.имяМетода (примеры ниже).
Примеры использования:
new Thread(#{log.info("hello!")}).start() == new Thread(new Runnable(){@Override public void run () { log.info("hello!"); }}).start()
mySet.filter(#{_ != null}) == mySet.filter(new Predicate[SomeType](){ @Override public void boolean apply (@Nullable SomeType _) { return _ != null; }});
vs текущее Iterables.filter(mySet, ....многобукв);
list.sort(#(a,b){a-b}) задание читателю ;-)
"ссылка на метод"
new Button("Нажми меня", #myThisButtonClickListener) где в том же объекте объявлен реализующий тело интерфейса listener-а метод
public void myThisButtonClickListener (Button.ClickEvent event) {
final Window subw = new Window("суб-окошечко");
getMainWindow().addWindow(subw);
...
}
== new Button("Нажми меня", #{myThisButtonClickListener(_)})
Многие уже сейчас реализуют это через reflection т.е. можно указать объект (this в данном случае) и имя метода в виде строки "myThisButtonClickListener"
5. конструкцию let[def/val/var], для тел методов, которая бы сама выводила тип переменной _в левую сторону_ vs текущая тенденция
выводить в правую (diamond operator и все эти Джошуа Блоковские static list, newMap и тд).
Пример использования.
let myvar = new ConcurrentHashMap[ТУТ БОЛЬШОЙ СПИСОК С Generics]()
final let s = "hello"
далее по коду работать с этими переменными как с обычными типизированными
for (let i : mybiggenericmap.entrySet()) {
let k = i.key;
for (let j = k; j
6. авто свойства: если у класса есть getter getFoo(), то можно обращаться a = obj.foo, а если есть setter setFoo(T value), то obj.foo = v1. Внутри самого класса обращение к foo должно работать с переменной T foo, а this.foo - с getters/setter.
Автобилдеры? myedit.width = 80, hight = 16, styleName = "sexy, main", value = 42;
7. массивы implements Iterable (можно будет применять filter, transform) и for работающий по Iterable/Iterator/Enumeration т.е. всеядный for, а не только массив и Iterable как сейчас.
Кроме того станут возможными унифицированные API: public double sum(Iterable
8. полезные идеи из JavaFX (полный отказ от чистого JavaFX - это хорошо)
У JavaFX 2.0 очень трезвый и разумный roadmap http://javafx.com/roadmap/
Очень рекомендую на него поглядеть, много вкусного.
9. JRebel встроенный в JVM. JRebel хорошо, а out-of-box он бы imho дал такой синергетический эффект, что здорово бы улучшил индустрию.
Самый сильный козырь скриптовых языков быстрый цикл редактирование-тестирование в web, с JRebel этот козырь получили бы все языки JVM.
10. /regexp Pattern/ прямая поддержка в Java коде т.е. данная конструкция должна выглядеть как скомпилированный Pattern.
11. === безопасный вызов equals т.е.: a = b - присваивание, a == b - сравнение ссылок и простых типов, left === b - сравнение объектов (и простых типов): if (left == b) { return true; } if (left == null || b == null) { return false; } return left.equals(b);
Это сделало бы язык проще и уменьшило бы количество действительно ненужного кода, не превращая язык в Perl.
Подписаться на:
Сообщения (Atom)