Bubble effect

Рубрика: Java | 24 September 2008, 15:56 | juriy

Когда пишешь приложение, хочется чтобы пользователь получал удовольствие от работы с ним. Пользователь любит, когда приложение ведет себя предсказуемо и естественно. Недавно, в одном из моих хобби-проектов возникла задача сменить в форме один компонент на другой. В Swing это делается совсем просто, главное не забыть вызвать revalidate, а то эффекты, порой, весьма забавные. Решение “в лоб” выйдет визуально не очень приятным. Один компонент резко уходит вникуда, второй так же резко появляется из неоткуда. Никакой визуальной связи между ними нет. Это поведение неестественно, и таких эффектов в Rich приложениях лучше избегать.

Вот относительно несложное, но более интересное решение той же задачи.

web-start
[Далее...]

Прочел отзыв Петра Диденко о “РИТ: Высокие нагрузки” и очень меня его выводы “зацепили”.

Основная идея тезиса, с которым не могу не согласиться, в том, что на просторах xUSSR-оного ИТ люди очень зациклены на том, что им приятно делать и что у них вроде как получается.
К тому же их мало интересует то, что они изобретают очередной велосипед, потому что так увлечены своим делом настолько, что некогда оглянуться вокруг.

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

У менеджмента же часто не хватает смелости “выбросить” свои наработки в угоду инновационности.
Да и технари со всех сторон расхваливают свое детище и хают возможные более современные альтернативы.
Как раз та ситуация, о которой мой прошлый директор говаривал “балласт старых знаний тормозит наше движение”. (По правде говоря на практике от подобного балласта он сам избавлялся весьма неохотно:).

И после этого мы рассказываем, что наш “ИТ на 5 лет позади США и даже Индии”, что “у нас нет культуры стартапов”, что “новые технологии приходят к нам позже всех”, что “аутсорсинг нас тормозит” и тд.
А как же может быть иначе если мы все-ещё пытаемся сделать Ferrari из поношенного BMW, купленного 8-9 лет назад.

Вот только не надо мне рассказывать про защиту инвестиций, бизнес- и техно- риски и другую лабуду, которую пугливые и ленивые ИТ-менеджеры (а порой и сами разработчики) несут дабы оставить все как есть. Умные дяди уже все это продумали за нас и успешно продемонстрировали.
Нам осталось только осознать, что наши инновации в мировом масштабе уже устарели, взять и повторить успешный опыт заграничных товарищей, и тем самым сократить наше “ИТ-отставание” с 5 лет до 2х.

Хороший пример – это Cloud Computing.

Опять же процитирую Петра Диденко:

но народ думает, что это [could computing] какая-то далёкая наука, которая скорее всего никогда не будет иметь к ним отношения. Ну-ну.

Где-то года так 2 назад мне предлагали участие в проекте, построенном на Amazon EC2/S3.
В то время я сказал “ну вы ребята романтики-надуватели мыльных пузырей” и в проект этот не пошел.
Через пол-года прийшло прозрение, и я попробовал “скормить” идею руководству – безуспешно.
С таким же результатам попробовал ещё через год.
И несмотря на то, что уже сотни успешных web-стартапов продемонстрировали успешное использование тех же Amazon-овских сервисов, в ответ я слышу “А если вдруг что…”, “Это конечно интересно, но представляет только академический интерес…”, “Пусть оно поработает пару лет, а там поглядим”,  “Это все веянья новой моды – не обращай внимания, скоро пройдет” и тд.
А после этого успешно возвращаемся к “хаку очередного opensource-а ради 10% производительности”.

Грустно, господа, грустно…

P.S. Все выше сказанное прошу расценивать в контексте проблемы высоких нагрузок web-систем.

Что же все-таки такое этот Map-Reduce?

Рубрика: Ссылки | 18 September 2008, 23:56 | Vadim Voituk

Отличное описание теоретичекой составляющей трендового понятия MapReduce можно прочесть в блоге Игоря Артамонова.

Особое спасибо за ссылку на закон Амдала.

Прошивка и настройка DLink DWL-G700AP

Рубрика: Development | 16 September 2008, 00:05 | Vadim Voituk

Не так давно прийшел к выводу, что среди современного разнообразия активного беспроводного оборудования, найти что-либо приличное для дома/мини-офиса весьма проблематично.
Потому будем делать “из *** конфетку” своими руками.

DLink DWL-G700AP – это Wifi-точка доступа для домашнего (или около того) пользования, поддержвающая стандарты 802.11b/g.

В первую очередь это устройство интересно своей стоимостью – всего-то $40-50.
Минусом является то, что в базовом варианте, несмотря на наличие 2х сетевых интерфейсов, оно умеет быть только мостом (bridge).
Но это дело достаточно легко поправимо.

Исходим из таких начальных условий:

  • Точка доступа устанавливается дома (мини-офисе), где уже есть кабельное (Ethernet, RJ45) подключение от домашнего провайдера с авторизацией по MAC-адресу.
  • Наша задача состоит в том, чтоб посредством DWL G700AP предоставить нескольким ПК доступ в интернет, и друг-к-другу.
  • К тому же неплохо бы построить за точкой доступа свою мини-сеть, с автоматическим назачением IP нужным ПК.

Очевидно, что фабричная прошивка подобных “фокусов” нам провернуть не даст. Потому в первую очередь необходимо будет выполнить перепрошивку девайса, прошивкой от “народных умельцев”. [Далее...]

GPL and Open Source

Рубрика: Development | 11 September 2008, 14:20 | juriy

Недавно, общаясь на одном из форумов на около-OpenSource’ную тему, обнаружил один интереснейший факт. Лицензия GPL нарушает Open Source Definition. Точнее, всего один его пункт:

9. License Must Not Restrict Other Software
The license must not place restrictions on other software that is distributed along with the licensed software. For example, the license must not insist that all other programs distributed on the same medium must be open-source software.

Выходит, софт выпущенный по GPL формально не является Open Source. Или я что-то упустил в юридических тонкостях?

[UPDATED] По результатам дискуссии в комментариях, выянсилось, что GPL использует термин based-on и считает такой софт частью оригинального. А в OSD речь идет об “along with”.

GPL
Open Source Definition

Костыли для апплетов

Рубрика: Java, JavaScript/Ajax | 9 September 2008, 09:54 | juriy

Вам приходилось слышать в адрес апплетов выражение: “dead man walking”? Апплеты – часть Java платформы, задуманная, как мощнейшее средство, позволяющее проинтегрировать Java прямо в web страницу, практически полностью теряющее свои достоинства из-за тонн ограничений, которые на них возложены.
Последние несколько дней я бился над вопросом: как заставить апплет “выглянуть в мир”, за параноидальным прокси моего офиса.
[Далее...]

Nice class names

Рубрика: Development | 5 September 2008, 10:11 | juriy

Пока читаешь исходники OS библиотек, да и Core Java классов, бывает натыкаешься на очень забавные имена.

Вот несколько “хитов”:

Класс SharedSecrets – это у Sun. Мы не жадные, вот, секреты шарим.

Log4J во время выполнения сам пишет логи. Как вы думаете, какой класс использован для этого (сам себя log4j не использует по вполне понятным причинам)?
Класс – LogLog.

В JUnit 4.4. нашел замечательный метод, он называется _dont_implement_Matcher___instead_extend_BaseMatcher_().

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

Sendfile on Tomcat, Apache, Nginx

Рубрика: Development, Java | 4 September 2008, 14:53 | Vadim Voituk

Наверное все, кто хоть когда-либо использовал web-сервер nginx, знают о такой его возможности как “X-Accel-Redirect”.
Для тех кто не знает / не помнит – напомню. 

Суть состоит в том, что при необходимости отдать клиенту файл посредством своего скрипта, можно не писать код, который будет читать байтики из файла и писать их в сокет, а отправить специальный response header, получив который nginx сам начнет отправку файла.
Например на PHP это выглядит так:

header("X-Accel-Redirect: /protected/iso.img");

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

Собсно как подобное реализуется на nginx – написано парой строчек выше.
Если что не очень ясно – Google в помощь.

Не так давно узнал даже как реализовать описанное и в старом-добром Apache.
Для этого нужно установить дополнительный модуль mod_xsendfile, активировать, ну а дальше все аналогично nginx, только c отличным именем response header:

X-Sendfile: /path/to/file

Есть только одно НО в этом способе – я его ещё не пробовал :)
Если кто имеет опыт работы с этим модулем – дайте знать, хочется услышать отзывы и мнения :)

А недавно пришлось реализовать отдачу достаточно тяжеловесного контента на Tomcat, и захотелось чего-то подобного.

Путем недолгого гугления было найдено такое решение:

В первую очередь необходимо активировать NIO connector в настройках сервера
(документация говорит что можно и APR, но я не пробовал)

Для этого в conf/server.xml вместо стандартного

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
    redirectPort="8443" />

Пишем

<Connector port="8180" protocol="org.apache.coyote.http11.Http11NioProtocol"
redirectPort="8443" />

После этого проверяем поддержку sendfile наличием аттрибута
org.apache.tomcat.sendfile.support в request-е сервлета

Если значение установлено в false – то в Connector-е дописываем useSendfile="true"

Код отправки файла клиенту выглядит так:


if (request.getAttribute("org.apache.tomcat.sendfile.support")==Boolean.TRUE){
  File f = new File(cont.getRealPath("/3499.3gp"));

  long start = 0L;
  long end = f.length();

  request.setAttribute("org.apache.tomcat.sendfile.filename", f.getCanonicalPath());
  request.setAttribute("org.apache.tomcat.sendfile.start", start);
  request.setAttribute("org.apache.tomcat.sendfile.end", end);
  request.setAttribute("org.apache.tomcat.sendfile.token", this);

  response.setContentLength(new Long(end).intValue());
}

Немного отличается от того, как это выглядит в nginx и apache, но ничто не мешает вынести эту логику в фильтр, который будет срабатывать при наличии соответствующего HTTP заголовка в response-e