jar с винтом
25 ноября 2008
Java, как язык – ничего особо выдающегося. Да даже тот же C# внешне выглядит приятней, что уж говорить о многих динамических языках. Хотя, если насчет самого синтаксиса Java, то тут тоже наметилась тенденция, уже есть вполне неплохие JRuby, Groovy, Scala и Clojure, выбирай по вкусу.
Так вот, хоть как язык Java и проигрывает, но она имеет за плечами огромный набор библиотек, для решения почти всех востребованных задач. Я бы даже выразился так:
На каждую хитрую задачу найдется свой jar с винтом.
ну может не всегда именно jar, а скорее технология, протокол, спецификация, но суть в общем такая.
У всех остальных все хуже. Там или узкая заточенность под одни нужды (RoR), или единая линия партии (.Net), или просто полный хаос.
Главное – это все таки сколько у тебя за спиной готовых, зарекомендовавших себя и переиспользуемых решений. А что до производительности и требования к ресурсам, так с этим уже давно все хорошо, все работает достаточно быстро, если написать конечно как положено, а не как обычно. Да и в последнее время это уже неактуальная проблема, сейчас в цене не производительность, а масштабируемость.
Поэтому нравится java или нет, но… но чаще всего выбирать и не из чего.
P.S.: Хотя, если честно, есть тут один минус: это то что привыкнув к этому все стараются делать «через жаву», что не всегда верно, но это уже издержки производства.
Лаконичность кода или Java vs K или зачем нам JRuby и Groovy
24 апреля 2008
Кто там говорит что perl-код не читабелен? Вот вам реализация soundex на языке K:
sdx:"bfpvcgjkqsxzdtlmnr"!(4#1),(8#2),(3 3 4 5 5 6)
nn:{d2:x where x > 0;r:d2 where d1:0w<>':d2}
soundex:{(x[0],(nn (sdx@1 _ x)),l:4#0)[til 4]}
угу, именно так… Похоже что клавиатуру протирали.
Теперь запускаем: Читать далее »»
Миграция БД
6 марта 2008
Бывает что при обновлении версии работающего приложения тратится иногда по нескольку часов на приведение структуры БД к новому виду. Ну т.е. добавление колонок, переименовывание, смена связей и пр. При этом DBA сидит и по diff двух инициализационных sql (для текущего приложения и для нового) пытается понять что менялось и как нужно прописать все эти ALTER TABLE ..., или того хуже UPDATE по хитрым условиям. Когда то, по неопытности, и мы так делали, при этом приложение клиента ждало (т.е. не работало) иногда по нескольку часов. Слава богу у них в это время была ночь и заказчик сладко спал, иначе бы много чего могли бы наслушаться.
Читать далее »»
Указываем редактируемые поля
21 февраля 2008
При редактировании объекта через форму есть потенциальная уязвимость в системе, т.е. даже если мы в самой форме не указали внутренние поля (id, role, и пр) то хакер всегда может передать их в запросе сам. Конечно ему нужно знать какие поля есть в объекте, что бы передать для них значения, но это отнюдь нас не защищает. Некоторые интересные поля можно найти перебором по словарю.
Так вот, я к тому что Spring предоставляет возможность указать какие поля позволено менять извне. И при формировании объекта, из переданных в POST значений, будут заполненны лишь определенные поля.
Указывается все очень просто:
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
super.initBinder(request, binder);
binder.setAllowedFields(new String[] {"title", "content"});
}
По хорошему, в зависимости от ролей пользователя, нужно менять список доступных для редактирования полей. Админу разрешить менять вообще все (это по умолчанию), а остальным указать что можно.
Обработка данных, подход «MapReduce»
21 февраля 2008
В 2004 году Google рассказал о модели обработки данных которую они использую. Основана она на том что данные обрабатывает пара простых функций Map и Reduce. Первая их которых выделяет множество пар Ключ/Значений из входящих данных (тоже являющихся парами Ключ/Значение), а вторая производит объединение/группировку этих пар, и, опять же, выдает наружу таки пары, чаще всего в меньшем количестве чем пришло на вход. Дополнительным элементом является распределенная файловая система GoogleFS, благодаря которой обрабатываемый файл, и вся промежуточная информация, становится легко доступной с любого компьютера в кластере.
Т.к. вся архитектура обработки состоит из небольших функций, то обработку можно легко распараллелить на кластере. К тому же облегчает разбивка на отдельные куски и восстановление после сбоя. Используя распределенную ФС мы разбиваем данные на небольшие кусочки, с каждым из которых и работает отдельный элемент кластера.
Так же эту идею можно встретить под названием Split/Aggregate. Т.е. суть в том что входные данные (неважно какого размера) разбиваются на отдельные элементы (этап split), к примеру построчно, каждая строка как отдельное значение для обработки. Эти блоки строк раcпределяются по кластеру для обработки, где для каждой строки вызывается функция обработки (map). Результат выполнения опять объединяется (reduce/aggregate) в выходной файл. Если нужно, то данные сохраняются отсортироваными в определенном порядке, к примеру по внешнему ключу.
Читать далее »»
Использование Struts Tiles + Spring Framework
18 июня 2007
Одной из фич Struts Framework, помимо MVC для веба, была библиотека тегов Tiles, идущая с ним. Тайлы много что могут, но главное что они помогают сделать наследования страниц. Да, так же как объекты, в корневом определяем базовые методы, а в предках что то переопределяем и добавляем новое.
При этом эта библиотека может использоваться и отдельно от Struts, она прекрасно интегрируется в Spring Framework.
Вот без тайлов как может выглядеть структура JSP страницы?
[инклюд хидера]
[тело страницы]
[инклюд футера]
Ну вроде так ничего сложного, типичный PHP стиль. А теперь допустим в хидере у нас что то меняется, например картинка раздела, подключается дополнительный css, JavaScript или еще что то. Вот тут все и начинается: в хидере пишется страшная логика охватывающая весь проект, которая, в зависимости от адреса, начинает что то включать/выключать, при инклюде передаются различные параметры, чтобы все это работало и т.д. Немного неудобно получается.
Читать далее »»
JYaml в качестве DSL
13 апреля 2007
Есть вот такая вот интересная задачка: приложение должно выполнять серию команд, внешне даже однотипных и настраиваемых через разные параметры. При этом описание очереди команд должно быть не в коде, а во внешнем файле, который можно отредактировать, и, без перекомпиляции приложения, запустить очередь заново. Да и вообще файл со списком команд указывать каким то параметром приложению, т.к. будут различные файлы с разными очередностями команд.
Читать далее »»
Введение в Log4J
6 апреля 2007
Для ведения лога, как я вижу, чаще используют Log4j, как минимум в тех проектах где я участвовал это стандарт. Но при первом знакомстве с ним у многих возникают проблемы с пониманием того как это работает и как его использовать. Я на самом деле ни разу не понимаю почему log4j вызывает такие трудности… потому попробую объяснить.
Читать далее »»
HandlerInterceptor в Spring
27 марта 2006
Иногда нужно чтобы на каждый запрос происходила одна и также определенная операция, как например выдернуть количество записей в базе для размещения на странице, или проверка прав доступа, или еще куча вариантов.
Я видел приложение написанное на Spring, в котором для всех контроллеров был один базовый класс, который и выполнял такую функциональность. Но на самом деле в Spring для этого есть такая вещь как HandlerInterceptor.
Читать далее »»
Простое приложение на Spring
15 марта 2006
Теперь попробую показать на простейшем примере Web-приложения что такое Spring. Для простоты сделаем калькулятор, который лишь умеет складывать два числа
Под катом всякий код и коментарии, лишь для тех кто не видел спринга.
