воскресенье, 11 октября 2009 г.

social networks

Коллеги, а у вас тоже есть чувство недоверия к социальным сетям и различным веб проектам?

Например, гугл блокнот был и теперь его нет :-) Или я нашел любимую музыку и составил плейлист вконтакте, но кто знает, как долго там будет пиратская музыка и сайт вообще может закрыться через какое-то время. А ведь есть куча сайтов для ведения своих дел, проектов, заметок... я им очень не доверяю. Кто знает, может сейчас они все просто очень молодые.. и через лет 5 все стабилизируется.. но не доверяю им и всё тут..

четверг, 24 сентября 2009 г.

sql troubles

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

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

Пробовал комментировать чуть ли не каждую строчку - всё равно при больших запросах это не спасает. Как быть?

У вас есть такая проблема? Как ее решаете вы?

вторник, 22 сентября 2009 г.

Молились ли вы на ночь? Deathdemona

Macr0s: SELECT ... {далее следует огромный такой SQL запрос}
Macr0s: где я не прав? :)

Spirit: Втом месте времени когда ты мне написал это(12:10:30) )))

Macr0s: оО
Macr0s: Иов глава 12, стих 10 В Его руке душа всего живущего и дух всякой человеческой плоти.
Macr0s: 30-я буква "о"
Macr0s: точно, как же я сразу не догадался
Macr0s: О селект .... фром...

jamerlan: Теперь всегда буду строки называть "глава" а столбцы "стих" :-))) в SQL запросах)))
jamerlan: если ошибка - значит твоя летопись расзодится с библией, и надо помолиться

Macr0s: компьютер на котором не работают заветы библии - объявляется неверным и подлежит сожжению!

jamerlan: Oracle - буддизм, Mysql - язычество, Microsoft SQL - христианство
jamerlan: Бог как-бы един, но молитвы все равно разные надо произносить

Macr0s: мускул - сатанизм
Macr0s: оракл - расизм :)
Macr0s: мс-скул - нигилизм

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

Разобрал notebook

не программерский пост :-)

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

Вот как выглядит ноут:
Samsung R700
Samsung R700

Первым делом осмотрел нижнюю часть ноутбука. Какого-нибудь легкого способа достать до вентилятора, что на процессоре, не нашел. Стал разбирать. Открутил все болтики на днище, и наткнулся на самую распространенную проблему: все болтики открутил, а ноут не разбирается! :-) Оказывается, надо снять клавиатуру и там еще пару болтиков открутить. Как я это делал - целая история :-) Но закончилась благополучно..

Разобрал, пыли вообще никакой нет. Успокоился, собрал назад. Как обычно, лишние детали - 2 болтика. Но вроде всё работает :-)

Я с ним возился часов 5 с небольшими перерывами. Поэтому устал, но все таки нашел силы сделать на память пару снимков("абы как"):



воскресенье, 19 июля 2009 г.

apache commons io

Мой наивный пост на тему полезности commons.io

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

Все удивлялся, почему в jdk не входит удобный и простой метод для перебора файлов и работы со строками. И вот как-то читая juick наткнулся на запись ~ "я открыл для себя commons.io, рулез!". И тоже для себя ее открыл :-D

Оказалось, что эта библиотека сократила код всех моих утилит раза в 3! Использовать и изучить ее очень просто! Хоть я и не пользуюсь всеми фишками, хочу о двух из них, для примера, рассказать.


Пример:
Задача #1:
Нам требуется найти все файлы, содержащие строку "hello world" и сохранить список этих файлов.

Решение:
Надо просто написать класс, назовем его "HelloWorldWalker" и унаследовать его от абстрактного класса DirectoryWalker. Переопределяем в нем метод handleFile, в котором "принимаем" только файлы, содержащие искомую строку. Все очень просто.
Использовать его еще проще!
List labelInFiles = new HelloWorldWalker(startDir).findLabelInFiles();

Задача #2:
Надо считать все строки из файла

Решение:
List stringsList = FileUtils.readLines(file);
Проще некуда!

P.S. Похоже commons.io не поддерживает дженерики из java 5, очень жаль
P.P.S. пост just for fun

eclipse variables

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

Например, если носишь свои проекты на флешке, и подключаешь их в эклипс, можно ссылаться к ресурсам относительно workspace-а, и не думать, какую же букву windows присвоила флешке на этот раз.

Чтобы сослаться на какой-то ресурс относительно workspace-а, можно использовать такую переменную: ${workspace_loc}/choose-your-destiny/core/templates/tag_list.html или так: ${workspace_loc:/choose-your-destiny/core/templates/tag_list.html} (то есть на конкретный ресурс внутри проекта)

Единственная проблема, с которой я столкнулся - не везде эти переменные поддерживаются. Но, поскольку eclipse - opensource, можно запросто добавить поддержку variables в любое место!

Делается это вот так:
String absolutePath = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(pathWithVariable);


P.S. Вообще, в последнее время мне кажется, что это не eclipse подстраивается под тебя, а ты подстраиваешься под нее. Многие тулзы подстраивают тебя и твой проект под себя, например, мавен.

Bug in eclipse 3.5 java ee

Обнаружил очень неприятный баг в эклипс-е:
не работает "угадывание" параметров, подставляются просто имена параметров
[does_not_work.png]
В eclipse 3.5 classic эта опция работает как и ожидается

четверг, 9 июля 2009 г.

шаманство с установокой java на linux

Сегодня столкнулся с такой прикольной проблемой:

Скопировал установщик java в /usr, запускаю, пишет:
"You will need atleast 72188 kBytes of Disk Free Please free up the required Disk Space and try again"

Смотрю: df -h
в "/" - нет свободного места
в "/usr" - свободного места несколько гигабайт

смотрю в исходники установочного скрипта:
"DiskSpace=`df k. | Tail -1 | awk '{if ($ 4-/%/) (print $ 3)) else (print $ 4)' `"
If [then] $diskSpace -lt $diskSpaceRequired
Printf "You will need atleast %s kbytes of Disk Free\n" $diskSpaceRequired
Printf "Please free up the required Disk Space and try again\n"

Оказалось, что откуда ты запустишь команду на запуск установщика, там и будет проверяться кол-во свободного места!

Проверка: cd /usr; ./jre-6u14-linux-i586.bin
Успешно!!

четверг, 25 июня 2009 г.

swt label в eclipse

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

У меня личто так всегда бывает! Видит око, да глаз не имет!

Ну и решил я в этот раз разобраться, как же от туда взять этот текст. Например, XPath, при редактировании XML-я. Долго копался в коде, потом обнаружил, что все таки это Label (в эклипсе свой CLabel с блекджеком). А у лэйбла текст не копируется!! :-) В инете везде так и пишут: если хочешь лейбл с возможностью копирования текста, юзай виджет Text в режиме ридонли.

Короче, я так и не нашел универсального способа скопировать от туда текст. Досадно :-)

P.S. Вот о каком лейбле я гутарю:


P.P.S. Идея! А засабмичу ка я фич реквест или баг репорт! :-)

пятница, 19 июня 2009 г.

Как настраивать HTTPS в JBoss с нуля:

1. надо выполнить команду "keytool -genkey -alias tc-ssl -keyalg RSA -keystore server.keystore -validity 3650", в результате будет создан ключ server.keystore. В качестве пароля указать "changeit".
2. Переименовать "server.keystore" в ".keystore" и поместить в home folder юзера, от которого запускается JBoss
3. Раскомментировать в файле jboss-4.2.3.GA\server\default\deploy\jboss-web.deployer\server.xml секцию "Define a SSL HTTP/1.1 Connector"
4. Перезапустить JBoss

По сути, мы настраиваем SSL в конфиге веб контейнера, в JBoss-е это tomcat.
Почему пароль 'changeit'? Потому, что томкат использует его по умолчанию, если меняем пароль - прийдется его тоже прописывать в конфиге.
Почему файл ".keystore" кладем в хоум фолдер? Если мы хотим кастомное имя и месторасположение - прийдется прописывать их в конфиге.

Еще заметка в эту тему:
Стандартный порт для HTTPS – 443, стандартный порт для HTTP – 80. Разница между ними: 443 – 80 = 363.
Другими словами, чтобы получить HTTPS порт, надо к HTTP порту прибавить 363. Например, для нашего тестового: 6666 + 363 = 7029

Полезные ссылки:
http://tomcat.apache.org/tomcat-4.0-doc/ssl-howto.html
http://www.jboss.org/community/wiki/SSLSetup

суббота, 13 июня 2009 г.

Немного слов о Jetty (java)

Смотрю этот вебинар: http://live.eclipse.org/node/751
И решил немного его прорекламировать. Как говорится: а пацаны то не знают!
Ниже сильно упрощенный пересказ некоторой части вебинара :-)

Что такое Jetty?
- java HTTP server
- HTTP client (об этом многие не знают!) //Нужен для тестирования, например, чтобы сэмулировать 1000 заходов через браузер :-)
- Servlet container

История Jetty:
1995 разработан на java 0.9 как часть багтрекинг системы
1997 проект переименован в Jetty, реализована альфа спецификация Servlet API
1998 Jetty 2.0, реализована поддержка HTTP/1.1, сменили хостинг на sourceforge
2005 Jetty 6.0, сменили хостинг на codehaus, работыли над расширяемостью Web 2.0 приложений
2009 Jetty 7, переехали под крыло eclipse foundation как часть eclipse runtime (RT), упакован как OSGI бандл (http://www.eclipse.org/jetty/)
2010 Jetty 8, реализация Servlet 3.0 API

Jetty очень легко встраивается в java приложения.
У Jetty очень мало зависимостей, она очень мало "весит". Благодаря этому, Jetty может быть запущен даже на телефоне.
Jetty это не Application Server, но может быть использована как Application Server. Jetty это компонент, который может быть встроен в java приложение.
Многие Application Server-ы используют Jetty Как встроенный сервлет контейнер (JBoss, Geronimo, Jpnas..)

Остальную, самую интересную часть, я описывать не стал! Это надо видеть!!
Я на самом деле ерунду здесь описал)))
P.S. очень понравился пример с чатом в презентации

воскресенье, 7 июня 2009 г.

django - url mapping

Стал разбираться с DJango, нашел интереснейшую идею.

Часто мы ходим по сайтам, и видим такую картину "www.shop.org/catalog?product_id=123". Другими словами какие-то параметры к странице передаются в виде GET запроса. Выглядит это не супер юзер френдли.

Представьте себе, если бы мне пришлось диктовать эту ссылку другому человеку по телефону :-)

А если бы URL-ы выглядели так? "www.shop.org/catalog/product_id/123/"
Смотрите, никаких GET-запросов! никаких непонятных знаков '?' и '='

Намного лучше!

Теперь буду стараться применять такие URL-ы везде где только смогу. Раньше даже в голову не приходило, что часть URL можно обрабатывать как параметр. В DJango это делается очень просто! наверняка и другие фреймворки данную фишку :-)

вторник, 26 мая 2009 г.

total commander: copy file names and copy full file names

Случилось чудо, и на работе я получил лицензионный total commander
Установить разрешили только определенную версию, и там не было моих любимых сочетаний клавиш для быстрого копирования имени файла (F11) и полного имени файла (с путем, Alt+F11). Немного погуглив, я сразу же нашел решение :-)

Чтобы это настроить, надо всего лишь настроить сочетания клавиш для этих команд.
Заходим сюда: Configuration/Option/Misc/Hotkey
И настраиваем комбинации клавиш для этих команд:
cm_CopyNamesToClip (у меня, например, F11)
cm_CopyFullNamesToClip (у меня, Alt+F11)

и радуемся жизни :-)

До этого я пользовался специальными сборками тотала, где всё это уже было настроено. А потом пользовался Unreal Commander-ом, где эти сочетания клавиш тоже работают.

P.S. я знаю, что пост тупой, просто решил проверить, будет ли это кому-то полезно или нет. Может у кого-то настроено, но будет интересно узнать, как это настраивается..

понедельник, 18 мая 2009 г.

воскресенье, 17 мая 2009 г.

Еще раз коротко про слабые стороны систем контроля версий

CVS
- нет атомарных коммитов
- нет переименования файлов и каталогов
- долгие операции с тэгами
- много данных передается по сети
- простая система аутентификации

SVN
- создание тегов не интуитивное
- сложно мерджить ветки в основной "ствол"

Mercurial и Bazaar
- хранят локально не только проект, но и все данные о нем, например, историю изменений
- поддержка разными IDE хуже т.к. системы еще молодые
- вы должны знать, с кем вы бы хотели смерджить изменения, все ли заинтересованные люди получат ваши обновления?

Bazaar, в отличии от Mercurial, позволяет работать через центральный сервер(как CVS или SVN).

P.S. Всего лишь резюмировал эту статью

воскресенье, 22 марта 2009 г.

мой twitter

http://twitter.com/jamerlan

Кстати, сейчас слушал подкаст Scene#15
Там вместо слов "ники, алиасы, псевдонимы" один человек говорил "хэндлы".. я проникся..

пятница, 20 марта 2009 г.

Как можно ускорить свой eclipse на 40%

Сразу говорю, что это лишь частичный перевод этой статьи.

Описанный ниже рецепт поможет сделать эклипс более отзывчивым (у меня он стал в разы отзывчивее при большом количестве файлов!), он будет работать на 40% быстрее и даже быстрее запускаться!

Но выигрыш в скорости будет лишь, если ваша машина(компьютер) удовлетворяет таким условиям:
1) У вас должен быть многоядерный процессор(или многопроцессорный компьютер)
2) Вы должны запускать эклипс под Java 6 (я лично пользую недавно вышедший jdk1.6.0_12)

Что надо сделать:
Дописать в файл eclipse.ini (лежит в директории, куда установлен эклипс) следующие настройки:
-XX:-UseParallelGC -XX:+AggressiveOpts -XX:-UseConcMarkSweepGC

Я еще прибавил памяти на всякий случай. Сейчас мои настройки выглядят так:

-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
512M
-framework
plugins\org.eclipse.osgi_3.4.3.R34x_v20081215-1030.jar
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms256m
-Xmx600m
-XX:-UseParallelGC -XX:+AggressiveOpts -XX:-UseConcMarkSweepGC


Как это работает:
-XX:-UseParallelGC
Этот параметр заставит сборщик мусора работать в параллельном потоке, что сильно разгрузит основной поток (вот тут то и пригодится второе ядро процессора)

XX:-UseConcMarkSweepGC
Эти настройки для сборщика мусора позволят эклипсу быть более отзывчивым.

-XX:+AggressiveOpts
Включает оптимизацию производительности компилятора..

Вобщем, какая разница, что эти настройки делают :-) Главное, что это ДЕЙСТВИТЕЛЬНО РАБОТАЕТ!!!

среда, 18 марта 2009 г.

Оказывается maven - наше все!

Благодаря твиттеру этого замечательного программера, я понял, что мавен действительно КРУТАЯ ШТУКА.

В твиттере у него промелькнули вот такие ссылки (очень реккомендую к прочтению):
http://msk.nestor.minsk.by/kg/2009/08/kg90812.html
http://msk.nestor.minsk.by/kg/2009/10/kg91020.html
http://msk.nestor.minsk.by/kg/2006/31/kg63115.html

которые прояснили всю кашу в голове насчет Maven-а.

Больше всего мне понравилось, что командой
mvn archetype:generate

можно сгенерировать "основу" для очень многих приложений.
Например, web, просто java приложения или Struts 2.
Я очень уважаю Kick Start - и это самое оно!

вторник, 17 марта 2009 г.

Небольшое исследование на тему "Введение в Equinox"

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

Создал свой "бандл", запустил osgi, загрузил свой bundle


и пытаюсь его запустить
Получаю такую картину:

Не может найти класс. Что-то это как-то подозрительно. Потому, что этот класс есть в jar файле самого фреймворка osgi.

Не долго думая, я попробовал сгенерировать такой bundle используя wizard эклипса.
Это оказалось элементарно просто!

Выбираем в меню New->Project->Plug-in Project


Далее надо написать имя проекта и OSGi в качестве платформы


Далее надо нажать два раза "Next" и выбрать, что нам плагин нужен на основе примера (бандл)


Обратите внимание, что в файле MANIFEST.MF есть такая строчка:


Кстати, в этом манифесте можно сделать "экспорт" и получить готовый JAR файл:


Загрузим получившийся плагин и попробуем запустить:



Работает!! Супер!

Вывод: надо прописывать "Import-Package:" в манифест файле, чтобы все было ОК ;-)