Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

Архив блога

понедельник, 28 декабря 2009 г.

Удаление элемента из массива JavaScript

Как не надо удалять элемент из массива в JavaScript:

var list = [4,5,6];
delete list[1];
print(list); // [4, undefined, 6]
 


Как правильно:

var list = [4,5,6];
list.splice(1, 1); // Remove one element, returns the removed ones.
print(list); // [4, 6]


И еще правильно:

var visibleIds = [4,5,6];
visibleIds.splice(visibleIds.indexOf(5), 1);
print(visibleIds); // [4, 6]


См. также JavaScript: Remove element from Array.

пятница, 27 ноября 2009 г.

10 навыков, которые потребуются девелоперам в ближайшие пять лет

По мотивам 10 skills developers will need in the next five years.

1) Знать что-то из "большой тройки" (.NET, Java, PHP)

2) Rich Internet Applications (RIAs)

Flash - это уже не просто анимация на страничках - взгляните в сторону Flex и AIR. Его конкуренты: JavaFx, Silverlight. Добавляйте сюда также HTML5 и AJAX.

3) Веб разработка

4) Веб-сервисы

REST или SOAP? JSON или XML? Сеть - это компьютер.

5) Иметь не только навыки разработки ПО

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

6) Знать еще один динамический и/или функциональный язык

Ruby, Python, F#, и Groovy - не помешает.

7) Знать гибкие методологии разработки

8) Знания предметной области

9) Гигиена разработки

Использовать систему контроля версий, баг-трекинг, документировать код, проводить тестирование.

10) Разработка под мобильные устройства

10 вещей, которые каждый Java-разработчик должен знать о Unix

По мотивам Ten Things Every Java Developer Should Know About Unix.

Предназначено для разработчиков на Java, сидящих под Windows.


  1. Для использования некоторых портов нужны права.
    В Unix программы, запускаемые простыми смертными ;-), не могут использовать сетевые порты с номером меньше чем 1024. Только пользователь с правами root может это сделать.

  2. Нет магического лока файлов.

  3. Иногда нет GUI, и это нормально.








10 вещей, который каждый Java-разработчик должен знать

Данная статья является вольным пересказом статьи в блоге Armel Nene - 10 things all JAVA developers should know.

  1. Знать и помнить основы Java, а также объектно-ориентированного подхода.
    Необходимо знать основы языка, а также основные пакеты стандартной библиотеки. Особое внимание обратить на пакеты java.lang, java.util, java.io.

  2. Знать используемый технологический стэк.
    Java - это платформа разработки. В рамках этой платформы существует набор фреймворков, которые принято использовать вместе. Например, open-source J2EE стэк включает в себя Spring Framework + Hibernate + MySQL/PostgreSQL. Или, стэк Oracle включает в себя: JSF + TopLink + Oracle СУБД.

  3. Иметь опыт использования нескольких Java EE фреймворков.
    Как минимум, необходимо знать Spring. Дополнительно, не помешает иметь представление о EJB, Struts 1.3/2.0, Tapestry, Wicket. Опыт с Hibernate также highly desirable, хотя сейчас идет переход на JPA. Hibernate, кстати, совместима с JPA.

  4. Знать еще один скриптовый (динамический) язык.
    Для некоторых вещей Java слишком тяжеловесна. Поэтому необходимо знать еще как минимум один скриптовый, или, может, динамический язык. Хорошо подойдет Python. Также неплохо знать язык скриптов используемой ОС. Для Unix flavors, например, знание shell scripting очень помогает ;-)

  5. Знать, как разрабатывать веб-сервисы.
    Сеть - это компьютер. Необходимо иметь представление о различных фреймворках для разработки веб-сервисов. Понимать разницу между стандартизированным SOAP и нестандартизированным ReST, и знать, что где лучше использовать.

  6. Многопоточное программирование.
    Необходимо знать, когда следует сделать приложение многопоточным. Каждый Java-разработчик должен уметь написать многопоточное приложение на Java.

  7. Работа с СУБД - SQL, JDBC.
    Необходимо уметь написать SQL-запрос. Знать основы обращение с СУБД из Java - через JDBC.

  8. Знать скриптовые клиентские языки и что такое AJAX.
    AJAX позволяет снять нагрузку с сервера. Поэтому необходимо его знать, а также и различные фреймворки для рабоыт с ним. Со стороны Java это - DWR и GWT. GWT компилирует код на Java в эффективный JavaScript.

  9. Знать конкурентов.
    Отличие Java от .NET, Ruby, Python.

  10. Знать Ant (Maven), Tomcat или GlassFish/JBoss.
    Ant - скрипты сборки, стандарт де-факто при разработке на Java. Maven - имеет заданную структуру построения проекта, менеджмент библиотек. Tomcat - базовый сервлет-контейнер, который каждый разработчик на Java EE обязан знать. А также еще хотя бы один сервер приложений на Java (GlassFish или JBoss AS).

четверг, 26 ноября 2009 г.

Как узнать версию Python

Через командную строку:

python --version


Программно:
import sys
print sys.version_info


П.С. Многострочные комментарии в Питоне создаются с помощью тройных апострофов:
'''
This is
multiline comment
in Python
'
''

среда, 25 ноября 2009 г.

Node.JS - JavaScript-фреймворк для обработки ввода-вывода

Node.JS - JavaScript-фреймворк для обработки ввода-вывода. В качестве движка JavaScript используется V8 - движок от Google Chrome. Сайт проекта: http://nodejs.org/.

Несмотря на то, что большинство разработчиков использует JavaScript в качестве клиентского языка в браузере, появление встраиваемых движков, таких как Rhino от Mozilla (Rhino написан на Java) или V8 от Google (V8 написан на С++) сделало возможным выполнение JavaScript-сценариев на сервере. Одним из примеров таких систем и является Node.JS. JavaScript здесь выступает лишь как язык сценария, он связан с библиотеками на Python или С/С++, которые и выполняют основную работу (через функции epoll, kqueue, /dev/poll, or select).

О преимуществах Node.JS подробнее рассказано здесь.

А вот статья на InfoQ, по которой я и нашел Node.JS:
Evented I/O for Javascript with Google V8-based Node.js

Reactor pattern

Reactor - шаблон проектирования, используемый в параллельном программировании. Шаблон используется при обработке запросов к сервису, которые доставляются параллельно. Сервисный обработчик затем разбирает прибывшие запросы и синхронно перенаправляет их на соответствующие обработчики запросов.

Паттерн позволяет отделить код приложения от кода обработки запросов, что позволяет приложению быть написанным модульно, в виде повторно используемых компонентов.

Ссылки:

Reactor pattern - Википедия

Patterns for Concurrent, Parallel, and Distributed Systems

Comparing Two High-Performance I/O Design Patterns

Merlin brings nonblocking I/O to the Java platform

Java Performance Tuning - тюнинг производительности Джавы.

Schmidt - Reactor_An_Object_Behavioral_Pattern_for_Demultiplexing_and_Dispatching_Handles_for_Synchronous_Events

V8 JavaScript Engine

V8 - это опен-соурсный JavaScript-движок, который используется в браузере Google Chrome. V8 написан на С++.

V8 реализуетECMAScript, согласно третьему изданию стандарта ECMA-262, и работает под Windows XP и Vista, Mac OS X 10.5 (Leopard), и Linux-системами на IA-32 или ARM процессорах.

V8 может запускаться отдельно, а также быть встроенным в любое C++ приложение.

Сайт проекта: http://code.google.com/p/v8/.

Одним из преимуществ V8 является его сборщик мусора, т.е. garbage collector. Он придает производительность этому движку.

Одним из наиболее широких применений JavaScript, как клиентского языка, является манипуляция с DOM. Однако, DOM предоставляет браузер (например, Google Chrome), а не движок. V8 предоставляет все типы данных, операторы, объекты и функции, определенные в стандарте ECMA.

понедельник, 9 ноября 2009 г.

Sun Java Application Store поддерживает оплату через систему PayPal

Sun Java Application Store теперь поддерживает оплату через систему PayPal.

На конференции PayPal X Innovate 2009 компания Sun анонсировала интеграцию магазина приложений Sun Java App Store c платежной системой PayPal.

Разработчики могут назначать цены за приложения, распространяемые через Java App Store в диапазоне от $1.99 до $200.00 (USD) и выбирать тип лицензии. Разработчики получают 70% с каждой продажи приложения, проданного через Java Store Beta. Java App Store использует Adaptive Payment API от PayPal, потребители могут авторизоваться в Java Store Beta и просто нажимать кнопку "Buy", таким образом, совершая покупки не покидая магазина. Дополнительно, когда совершается платеж, разработчик получает оплату моментально, в момент перечисления денег клиентом. Девелоперы могут моментально получать платежи и в каждый момент точно знать, как идут продажи, и сколько людей купило их приложение.

Ссылки:
Sun Enhances Java Application Store with PayPal Payment Capability

Sun Enhances Java Application Store with PayPal Payment Capability

Yahoo Traffic Server now is Open-Source

Компания Yahoo передала код проекта Yahoo Traffic Server в Apache Incubator.

Traffic Server - это высокопроизводительный HTTP/1.1 кэширующий и прокси сервер, используемый Yahoo во внутренних проектах начиная с 2002 года (с тех пор, как они приобрели его разработчика - компанию Inktomi). Traffic Server обрабатывает в Yahoo около 400TB данных ежедневно. По сообщениям от разработчиков, Traffic Server обрабатывает свыше 30,000 запросов в секунду на одном сервере.

Traffic Server предоставляет управление сессиями и конфигурациями, балансировку нагрузки, аутентификацию и роутинг, и спроектирован для высоконагруженных сайтов, в которых администраторы могут создавать сложные, комплексные настройки для обработки запросов на файлы, изображения и иные объекты. Модульная (plugin) архитектура позволяет разработчикам расширять Traffic Server для выполнения различных задач.

Traffic Server помещен в Apache Incubator, где он будет приведен в соответствие со стандартами кода Apache Software Foundation. Traffic Server состоит из более чем 300,000 строк кода на C/C++. Долговременные цели включают перенос на все Unix-системы, переделку под 64-битовость, и добавление фич, таких как, наприимер, нативная поддержка IPV6.

Shelton Shugar, VP of Yahoo, говорит, что это ПО будет полезно для использования в облаке. Также Yahoo надеется, что вокруг Traffic Server появится сообщество пользователей, которые привнесут новый end customer experience.

См. ссылки:

Yahoo donates Traffic Server to Apache

Yahoo! Traffic Server donated to Apache

Traffic Server Project Incubation Status

суббота, 7 ноября 2009 г.

Google открывает ключевые инструменты разработки

В посте от 5 Ноября 2009 года Introducing Closure Tools компания Google объявила об открытии нескольких своих ключевых инструментов разработки на JavaScript (Closure Compiler, Closure Library, Closure Templates, Closure Inspector), надеясь, что они позволят программистам создавать веб-приложения быстрее.

При помощи этих инструментов созданы популярные веб-приложения (Gmail, Google Docs и Google Maps).

Closure Compiler
Closure Compiler - JavaScript-оптимизатор, который сжимает код JavaScript, а также выполняет оптимизацию кода (это опционально). Существует три уровня сжатия и оптимизации:

  • WHITESPACE_ONLY - удаление пробелов в комментариев из кода

  • SIMPLE_OPTIMIZATIONS - локальная оптимизация частей скрипта, которые не взаимодействуют с внешним кодом. Обычно, это переименование локальных переменных

  • ADVANCED_OPTIMIZATIONS - агрессивная оптимизация


Closure Compiler имеет REST-интерфейс. Помимо этого можно скачать JAR-файл, который содержит Closure Compiler, и пользоваться им локально.

Closure Compiler для работы требует Java 6.

Closure Library
Кросс-браузерная JavaScript-библиотека, которая содержит утилиты для обращения к DOM, модель событий, коммуникацию с сервером, структуры данных, большое количество виджетов и другое.

Closure Templates
Шаблонизатор, работающий и на клиенте, и на сервере.

Closure Inspector
Расширения для FireBug for FireFox. Добавляет следующие фичи в файербаг:

  • мэппинг исходного кода - при выполнении жатого кода мэппит его на несжатый оригинал

  • улучшенное отображение stack trace

  • интеграцию с юнит-тестированием

понедельник, 2 ноября 2009 г.

Python, Django, and Google App Engine

Выступление Гвидо Ван Россума на Google I/O 2008. См. видео-трансляцию.

четверг, 29 октября 2009 г.

Использование nginx

Nginx (произносится как Энжин Икс - Engine X)- эффективный веб-сервер (а также прокси-сервер), созданный Игорем Сысоевым для Рамблера. Используется на 3% самых загруженных серверов в мире (См. Википедию).

Ссылки по Nginx:

1) http://sysoev.ru/nginx/ - cтраничка проекта
2) Nginx: the High-Performance Web Server and Reverse Proxy - статья в LinuxJournal
3) Nginx Internals by Joshua Zhu - презентация на SlideShare
4) Разработка модулей для nginx - статья Валерия Холодков для конференции HighLoad++ 2008
5) Введение в nginx - введние от Зеленой Мыши, также есть другие материалы по nginx.
6) Установка и настройка Nginx. Nginx frontend + Apache backend. Установка mod_rpaf - руководство на сайте Server Help - установка и настройка выделенного сервера.


Раздел будет дополняться по мере нахождения новых материалов.

The Joel Test: 12 Steps to Better Code

Тест от Joel Spolsky: 12 шагов к лучшему коду (правда, пост довольно давний - аж от 9 Августа 2000 года).

Ответьте на 12 вопросов:
1) Используете ли вы систему контроля версий?
2) Сборка происходит в одно действие?
3) Проводятся ли ежедневные сборки?
4) Ведется ли баг трекинг (bug database)?
5) Перед написание нового кода происходит фикс багов?new code?
6) Имеется ли расписание разработки, которое к тому же и up-to-date?
7) Есть ли спецификация (спек)?
8) Программисты имеют спокойные условия для работы?conditions?
9) Используются ли лучший инструментарий?
10) Есть ли тестеры?
11) Новые кандидаты пишут код на интервью?interview?
112) Есть и юзабилити-тестирование?

Полная версия находится здесь - The Joel Test: 12 Steps to Better Code
by Joel Spolsky

Прикольное описание вакансии на StackOverflow

Software Developer (Python/Django)
at Playfire.com (Gaming social networking startup!)
London, United Kingdom

Hi! We are an exciting, well-funded web startup looking for an ambitious software engineer who is hungry to build awesome software that millions of people use. Based in Soho, London, we are building the next big thing for millions of gamers around the world, and are looking for an exceptional technical mind to join the team and attack some hard problems in creative ways.

....

Are you the one? You are, if you:

* Love agile development, working independently on your own challenges, and together in a team on the bigger vision
* Are completely fluent in a scripting language such as Python, Perl, PHP or Ruby and have experience with web frameworks and the MVC concept
* Have used MySQL or PostgreSQL extensively and you know your way around Apache, nginx or other server
* It's a bonus if you have good JavaScript skills (we use jQuery)
* Get excited by the idea of scaling web apps to millions of users
* Are the best developer in your peer group, and want to be at a place where you are constantly challenged and pushed to become better
* Get obsessed about the problem you're solving and don't stop until you've cracked it
* Have a thirst to learn new skills and technologies, and can pick things up easily
* Want to have fun building lots of new features and get stuff done
* Are full of positive energy, relish the thought of being part of a small, fast-moving team and enjoy brainstorming about new ideas

Benefits

* Opportunity to become recognised as one of the best in your field, through being a core developer for a high-profile startup
* Relaxed, sociable work environment with lots of freedom and independence
* Building an exciting app that millions of real life people will use and appreciate everyday
* First hand experience of how to start, grow, market and raise funding for startups (perhaps useful for your own company one day)
* Working with awesome technologies (Python/Django/jQuery/Debian/Git)
* As part of one of the top technical teams in the UK, along side super smart people who have a lot of fun, devoid of any politics
* With dual-widescreen monitors, a new computer and a Herman Miller Aeron chair
* In a fun office, with free drinks, in the heart of Soho (there are so many options for lunch it's crazy!)
* A competitive salary and a generous equity stake in the company (you're working hard to make the company successful, so you should share generously in the reward!)

A little more about us

* Backed by some of the most prestigious investors in the world with specific experience in social networks and games (including the founder of Bebo, the former CEO of PlayStation, the founders of Skpe, etc - who you'll likely get to meet)
* Founded by entrepreneurs with a track record for success with internet and video games companies
* 200,000 gamers already using the service!
* We'll be messing around with Facebook Apps, OpenSocial and will be integrating with Xbox Live and other multiplayer services.
* And unlikely many other web businesses, we know exactly how to make money, and steps needed to get us there :)

So, all in all, exciting stuff! We want to hear from you! Details on how to do that are below :-)


По-моему, это просто CRAZY & AWESOME, не так ли?

XMPP - как протокол для клауд-сервисов

Matt Tucker в статье XMPP (a.k.a. Jabber) is the future for cloud services описывает возможное применение XMPP-протокола в качестве протокола для связи между клауд-сервисами.

Для организации двусторонней связи клиент-сервер протокол HTTP подходит плохо, т.к. он спроектирован для случаев, когда инициатива по открытию соединения с севером лежит на клиенте. В случаях, когда инициатива по установке соединения исходит от сервера (примеры: messaging applications, stock qoutes online, онлайновые аукционы и др.), HTTP весьма сложно использовать (в этом случае применяются технологии Comet, Bayeux).

Один из вариантов - отдавать данные от сервера клиенту бесконечно долго ("в час по чайной ложке"), оставляя таким образом соединение открытым. Другой вариант - клиент постоянно опрашивает сервер (так называемый поллинг - polling), запросы происходят с некоторым временным интервалом (5-10 секунд) - если на сервере появляются новые данные, то по AJAX они передаются на клиент. Но при этом на сервер сыпятся сотни тысяч, миллионы запросов, абсолютное большинство из которых абсолютно не нужны (т.е. не несут в себе данных), что является издержкой однонаправленности протокола HTTP.

XMPP же лишен этого недостатка, это двунаправленый протокол, построенный на основе XML, легко расширяемый и доказавший работу при больших нагрузках (сотни тысяч, миллионы пользователей) - например, в GTalk. При его использовании происходит ровно столько запросов, сколько надо для передачи данных.

среда, 28 октября 2009 г.

What is Web 3.0 - by Eric Schmidt

Видео с ответом Эрика Шмидта (CEO Google) на вопрос - что такое Web 3.0?

Веб-два-ноль - это AJAX. Веб-три-ноль:

  • это небольшие приложения, которые работают везде - на серверах, десктопах, мобильных устройствах

  • данные находятся в облаке

  • приложения очень быстрые и настраиваемые

  • приложения распространяются "вирусным" путем - т.е. через социальные сети, виджеты, e-mail и т.д.

Про программирование (с другой стороны Луны)

Еще один пост по мотивам блога Эльдара Мусаева - Как стать хорошим программистом? (часть 3 из 3). Обратная сторона Луны. Точнее, меня заинтересовала только одна часть поста - про социальный статус. Далее приведу некоторые выдержки из поста Эльдара.

В целом программисты – это «синие воротнички» с высокой зарплатой. И обращаются с вами соответственно. Если в России вы работали в науке или преподавании, в университетской среде, то получали вы может и очень немного, но ваша свобода как в распоряжении своим временем, так и в направлении исследований была несравненно выше. Даже если вы подрабатывали консалтингом и проектами на стороне. А свобода – это один из важнейших показателей социального статуса.

Уйдя в программисты, особенно программисты в Америке, все это меняется. Это работа по найму. Это рабочий день с 9 до 5 (а то и с 9 до 9). Это подчинение менеджменту. Это партсобрания, пардон, team meetings, на которых вам втюхивают, как вам повезло и какая классная группа, команда, фирма, на которую вы работаете. Причем делают это так фальшиво и неубедительно, что даже если вы в это и верили, то начнете сомневаться.

В общем, не все так плохо. В конце концов, доходы программистов сравнимы с доходами многих врачей и юристов. Просто надо понимать, что программирование – это не социальный лифт, и стать миллионером (или просто достичь финансовой независимости) в этой профессии ничуть не легче чем в любой другой. И «стекляный потолок» может и выше, чем в многих других областях, но все равно вполне реален и весьма прочен.

Такие дела...

Сколько стоит плохой начальник?

Сообщение по мотивам поста в блоге Эльдара Мусаева. Интересны цифры стоимости плохих начальников, то есть начальников, которых не любят и которым не доверяют их подчиненные.

Ну, отрицательных факторов несколько. Во-первых, это turnover - текучка кадров. Далее, проблемы со здоровьем подчиненных такого начальника. Удивительно, но работа на скотину повышает шансы сердечно-сосудистых заболеваний на одну шестую, и шансы инфаркта на одну треть.

Следующий интересный факт уже касается экономики в целом. Согласно той самой Gallup Inc. - далеко не последний авторитет в подобных вопросах - негативное или отстраненное отношение к работе стоит одной только только американской экономике от $250 до $300 _миллиардов_ в год только в потерянной производительности труда, а если начать считать происходящие из-за этого несчастные случаи, болезни, текучку, пропуски работы и просто воровство, то стоимость легко уходит за триллион долларов в год.

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

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

JIRA live tour использует jQuery

Как недавно написал Ajaxian, Atlassian создала live tour по Жире. При создании использовалась jQuery. Скринкасты хорошо, но когда имеется ассистант, который показывает использование живого приложения, это круто вдвойне.

понедельник, 19 октября 2009 г.

Как получить заданное количество фидов из блогспота

Чтобы получить заданное количество фидов из блогспота, нужно использовать параметр max-results.

Пример: следующая ссылка выдает три последних фида этого блога:
http://jdevnotes.blogspot.com/feeds/posts/default?max-results=3.

П.С.
Increase Your Recent Posts and Comments to 10 – Blogger Hack - неплохая подборочка хаков блогспота.

четверг, 15 октября 2009 г.

Scaling websites - a bunch of presentations

Презентации про архитектуру нагруженных сайтов, взято из блога Peter Van Dijck, см. его пост A bunch of presentations on scaling websites: twitter, Flickr, Bloglines, Vox and more.


  • Scaling Twitter by Blain Cook

  • Scaling Flickr by Cal Henderson

  • Scalable Web Architectures by Cal Henderson

  • Hardware Layouts for LAMP Installations by John Allspaw

  • LiveJournal's Backend, a History of Scaling by Brad Fitzpatrick

  • How we build Vox by SixApart

  • Scaling Last.fm

  • Scalable Web Architectures with Ruby and Amazon S3 or what we learned building SlideShare

  • YouTube Scalability

  • FrontEnd scaling in Yahoo


и много чего еще. Полезный и очень познавательный пост.

среда, 14 октября 2009 г.

JavaScript Videos

Ролики по JavaScript.

Классное видео - Speed Up Your JavaScript.

The JavaScript programming language by Douglas Crockford:
Part 1, Part 2, Part 3, Part 4.

Advanced JavaScript by Douglas Crockford:
Part 1, Part 2, Part 3.

An Inconvenient API: The Theory of the DOM by Douglas Crockford:
Part 1, Part 2, Part 3.

Douglas Crockford: "JavaScript - The Good Parts"

Douglas Crockford: "Web Forward"

Douglas Crockford: "Ajax Performance"

Nicholas Zakas: "Maintainable JavaScript"

John Resig: "Advancing JavaScript with Libraries": Part 1 and Part 2.

Gopal Venkatesan: "Writing Efficient JavaScript"

вторник, 13 октября 2009 г.

Elevator pitch

Elevator pitch - короткий рассказ о продукте, услуге, или об идее. Фишка заключается в том, чтобы этот рассказ можно было нормально, не торопясь проговорить полностью во время поездке на лифте (лифт по-английски - elevator) и "зацепить" своего собеседника. Т.е. во время рассказа должны быть рассказаны ключевые преимущества, выгоды от пользования продуктом или услугой и.т.д. Длина рассказа должна составлять 150-200 слов, длительность - 30-40 секунд.

Правильно составленный элевейтор питч отвечает на вопросы:
- Какой продукт мы предлагаем.
- Какие преимущества имеет наш продукт.
- Кто мы такие.

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

Элевейтор питч - ключевой эпизод в фильме "Деловая девушка"

Элевейтор питч должен отвечать на 6 вопросов, по версии Business Know-How:

  1. Что такое ваш продукт или услуга - кратко опишите, что вы продаете. Не углубляйтесь в детали.

  2. Каков ваш рынок - кому вы продаете, что это за отрасль, насколько рынок большой.

  3. На чем зарабатываете - опишите наиболее просто, как вы зарабатываете деньги на продукте.

  4. Ваша команда - опишите команду, которая работает с вами. Если у вас есть хорошие советники, которые вам сильно помогли, или административный ресурс - также опишите это.

  5. Ваши конкуренты - опишите конкурентов. У вас их нет? Подумайте снова, и все-таки опишите их. Успешная конкуренция доказывает, что ваш продукт/услуга работает хорошо.

  6. Ваши конкурентные преимущества - просто существовать в отрасли с сильными конкурентами недостаточно. Чем ваша компания отличается, в чем ее преимущество над конкурентами - вы должны это донести. Лучшие каналы продаж? Ключевые партнеры? Продвинутые технологии?


Ваш элевейтор питч должен содержать:

  1. Зацепку. Он должен начинаться с зацепки для инвестора - это может быть вопрос, который привлечет его внимание, и он захочет услышать больше.

  2. 150-225 слов. Длительность питча - не более 60 секунд.

  3. Страсть. Инвестор ожидает энергию и увлеченность от вас.

  4. Вопрос. В конце питча вы должны попросить о чем-то - может быть, провести полную презентацию компании у инвестора, или попросить его взять вашу визитку, или попросить его контактные данные. Придумайте это сами.



9 C's для эффективного элевейтор питч, взято отсюда:

  1. Concise (Краткость). Эффективный э.п. содержит так мало слов, как только возможно, но не меньше.

  2. Clear (Ясность). Никаких акронимов, MBA-словечек и десятидолларовых выражений =) Эффективный э.п. могут понять сразу и без проблем ваши бабушка и дедушка, ваша половинка и ваши дети.

  3. Compelling (Неотразимость). Эффективный э.п. сразу объясняет проблему, которую решает ваш продукт или услуга.

  4. Credible (Достоверность). Эффективный э.п. объясняет, почему вы квалифицированы, чтобы увидеть проблему и построить решение.

  5. Conceptual(Концептуальность). Эффективный э.п. проводится на достаточно высоком понятийном уровне, и не углубляется в ненужные детали.

  6. Concrete (Конкретность). Эффективный э.п. конкретен настолько, насколько это возможно, он практически осязаем.

  7. Consistent (Целостность). Любая версия эффективного э.п. передает одно и то же базовое послание.

  8. Customized (Настройка на аудиторию). Эффективный э.п. учитывает интересы и проблемы конкретной аудитории.

  9. Conversational (Начало диалога). Эффективный э.п. проводится не для того, чтобы закрыть сделку. Он нужен, чтобы "зацепить" инвестора, и продолжить диалог.


Еще ссылки:
The Perfect (Elevator) Pitch от BusinessWeek.

How to Craft a Killer Elevator Pitch That Will Land You Big Business - один из "типсов для жизни" от Dumb Little Man.

Learn how to deliver a masterful Elevator Pitch от StartUp Nation.

Маршрутное обучение - презентация на SlideShare от Алексея Черняка.

И самая классная ссылка в заключении - видео-примеры питчей от TechCrunch - one startup, 60 seconds. Go!

Update, see videos:

Elevator Pitch

How To Craft Your Elevator Speech

понедельник, 12 октября 2009 г.

Change your password day

Австралийское правительство призвало менять пароли как минимум дважды в год. Рекомендации:
- минимум 8 символов;
- применять строчные и прописные символы;
- как минимум одна цифра;
- как минимум одна буква.

Они даже учредили Change Your Password Day =)

Ссылки:

E-security Awareness Week Launch

Обсуждение в группе comp.lang.java.programmer

POX over HTTP

POX - Plain Old XML - обозначает XML документы без различных наворотов, которые добавляет в него, например, SOAP. POX часто используется совместно с REST-сервисами, см например Twitter API, Flickr API. Название POX созвучно с POJO- Plain Old Java Object. POJO тоже появился в ответ на чрезмерную сложность EJB.

POX + REST проще, чем SOAP. Но области применения у них несколько разные. SOAP используется при интеграции enterprise applications, POX + REST используется, чтобы хоть как-то достичь интеграции. Есть сторонники как POX+REST, так и сторонники SOAP.

По-моему мнению, количество клиентов Twitter, Flickr так велико именно потому, что их API очень простой, с ним можно прямо сейчас начать работать, не затрачивая времени на освоение вещей, т.к. осваивать там просто нечего. С SOAP так не получится.

В Сети есть интересные обсуждения этой темы - POX & SOAP & REST.

The War is Over (WS-* vs. POX/HTTP)

SOAP vs. POX vs. REST by Stephan Tilkov

A Brief Introduction to REST at InfoQ

POX-and-SOAP at InterWingly, Sam Ruby

Lessons learned launching a web service by Nelson Minar, опыт, полученный при создании AdWords API.

Больше ссылок по REST:

A RESTful Web service, an example

Digg API

Netlog OpenSocial REST API

Amazon Simple Storage, using the REST API

пятница, 9 октября 2009 г.

Syntax HighLighter

Теперь для блога буду использовать вот этот подсветчик синтаксиса.

При отсылке JSON нужно ставить mime-тип application/json

При отсылке JSON нужно ставить mime-тип application/json, а не text/plain.

Уязвимости, которые возникают при использовании text/plain, описаны здесь и здесь.

Пример кода сервлета, устанавливающего mime и кодировку:

request.setContentType("application/json; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("{any complex JSON piece of data}");
....
 

четверг, 8 октября 2009 г.

36 советов стартапам - от разработки до пиара

Решил перевести статью Алекса Искольда "36 Startup Tips: From Software Engineering to PR and More!". Она уже была переведена на Хабре, но там перевели только первые 8 (с нулевого до седьмого) советов. Остальное решил доделать я сам.

РАЗРАБОТКА (перевод взят с Хабра)

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

Совет 0: У вас должен быть код
Наличие работающего кода доказывает, что создание всей системы возможно, и что ваша команда способна её создать. Работающий код — это стартовая площадка для запуска вашего бизнеса. Когда код готов, бизнес возможен. В старые добрые времена технологические стартапы получали венчурное финансирование просто под идею, записанную на бумажке, но те времена давно прошли. Сегодня стартапу нужен не только работающий код, но ещё и собранная система, и база активных пользователей, чтобы привлечь венчурный капитал. Разработка софта раньше начиналась после получения денег, а теперь является необходимым условием для их получения.

Совет 1: У вас должен быть сооснователь-технарь
Любой стартап начинается с идеи и нескольких человек. Многие сооснователи стартапов — технари, которые искренне влюблены в технологии и жизнь. Раньше не всегда было так. Всего несколько лет назад команда технических специалистов испытала бы большие проблемы в поисках денег. Была распространена мысль, что только магистр со степенью MBA способен управлять компанией. Сейчас, наоборот, наличие технического сооснователя является достоинством.

Совет 2: Наберите программистов класса A+, которые любят кодировать
До недавних пор создание больших систем напоминало чёрную магию. Разработка софтверных проектов затягивалась на годы и велась большими группами разработчиков, которые с трудом находили общий язык насчёт того, что нужно делать и как именно. В результате получались нестабильные, глючные системы, которые было трудно поддерживать и расширять. Проблема была в том, что в процессе участвовало слишком много людей, не слишком хорошо разбирающихся в программировании. Стартапы не могут позволить себе нанимать программистов классом ниже А+.

Совет 3: Сохраняйте маленькую команду разработчиков и не отдавайте задачи на аутсорсинг
Команда из двух-трёх великолепных программистов может создать практически любую систему, потому что они хорошо делают своё дело, любят создавать программы, фокусируются на цели и не шатаются в стороны. Команда из 20 посредственных программистов далеко не зайдёт. Разработка отнюдь не ускоряется пропорционально количеству программистов. Наоборот, самые лучшие программы сегодня создаются маленькими группами хороших программистов. Чем меньше — тем лучше, этот принцип в равной степени относится и к коду, и к количеству людей, работающих над ним.

Совет 4: Задавай трудные вопросы на интервью
Нет ничего хуже, чем проявить мягкость на интервью с перспективным работником и, как результат, нанять неправильного человека. Это плохо для вас, но, что ещё более важно, это плохо для того человека. В конце концов вы просто разойдётесь. Но лучше всего не делать эту ошибку с самого начала. Так что задавайте побольше технических вопросов на интервью.

Совет 5: Не берите менеджера-нетехнаря
Вам не нужны такие люди в маленькой команде. Если каждый в команде хорошо мыслит, знает что делать и как выполнять задачу, то зачем вам нужен менеджер? Люди, которые пытаются завернуть ваши цели в бумажку из неких сложных процессов, только затормозят и разочаруют вас.

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

Совет 7: Не изобретайте заново велосипед
Многие стартапы тонут из-за излишней инфраструктуры. Здесь имеются в виду две вещи: создание своих собственных библиотек или построение собственной масштабируемой системы мирового класса. По первому вопросу: в интернете огромное множество великолепных билиотек с исходными кодами, так что нет смысла создавать свои собственные. Используете вы JavaScript, PHP, .NET, Python или Ruby, скорее всего, уже существуют подходящие вам библиотеки. Повторное написание библиотек — это пустая трата времени, тем более что вряд ли вы напишете их лучше.

ИНФРАСТРУКТУРА - 5 советов(отсюда идет мой перевод)

Сегодня гораздо легче построить масштабируемый веб-стартап благодаря такому хостинг-провайдеру как Rackspace, веб-сервис провайдеру как Amazon, системе аналитики Google Analytics. В этом разделе мы рассмотрим возможные решения с точки зрения стартапа.

Совет 1: Используйте лучшего хостинг-провайдера, какого только можете себе позволить
Как стартап, вы всегда ищите способы снижения издержек. И одной из первых крупных статей сокращения расходов, как кажется, является веб-хостинг. Но экономия на хостинге - ошибка, которая будет стоить вам много времени, которое более ценно, чем деньги, которые вы потратите. Никаких проблем, если вы используете дешевого провайдера во время разработки кода. Но ваша продакшн-версия должна хоститься у мощного и надежного хостера.

Совет 2: Используйте Amazon Web Services
Хотя вам все еще нужен постоянный и надежный хостинг-провайдер, вы должны рассмотреть другую альтернативу, чье значение все более возрастает - веб-сервисы Amazon.com. Это предложение гиганта электронной коммерции должно быть внимательно рассмотрено каждым стартапом при построении инфраструктуры. Четыре сервиса могут особенно упростить построение масштабируемого веб-приложения: Simple Storage Service, Elastic Compute Cloud, Simple DB, and Simple Queue Service.

Совет 3: Используйте Google Analytics - и стандартно, и креативно
Прежде всего, стартапам нужно ИЗМЕРЯТЬ. Результаты измерений полезны для оценок роста и успеха компании. Без измерений трудно понять, что происходит на самом деле. В Google Analytics полно фич, но, самое важное, он имеет API. Это важно потому, что вы можете построить свои инструменты, которые помогут по-разному взглянуть на одну и ту же информацию.

Совет 4: Начните со стандарта, а потом тюнингуйте систему
В 99.9% случаев лучше, если начнете со стандарта, и в 99.9% вы все равно не доходите до конца. Хитрость в том, чтобы идти от стандарта до кастомайза правильным путем. Возможно, наихудшее, что можно сделать, это заранее тюнинговать. Как и преждевременная оптимизация исходного кода, это ведет к уродствам. Зачем гадать заранее, когда вы даже не знаете, что происходит с системой на самом деле?

Совет 5: Наймите или законтрактуйте хорошего системного администратора
Это самое простой совет из этих пяти. Как программирование, развитие бизнеса (привлечение клиентов) и бухгалтерию лучше оставить профессионалам. Я знаю мой путь в Юниксе, я был системным админом 15 лет назад, но все равно мне есть чему поучиться в Юникс. Когда вы вырастите до определенного размера, вам понадобится отдельный сотрудник на администрирование железа и софта.

ПИАР - 11 советов
Пиар - жесткая игра. Когда рынок разогрет, сложно быть замеченным, поскольку сразу много компаний соревнуются за внимание пользователя. Когда рынок остыл, сложно быть замеченным, поскольку люди устали после разогретого рынка. Для стартапов еще сложнее иметь хороший пиар, поскольку они не могут потратить на него много денег. В этом разделе мы рассмотрим, что стартапы должны делать для пиара.

Совет 1: Наймите пиар-фирму
Это может показаться сюрпризом, но вам нужна пиар-фирма. На ранней стадии стартап не всегда может позволить нанять пиар-фирму, но это не значит, что это не нужно. Причина номер один, почему вам нужна пиар-фирма - это из-за ее связей. Они знают людей, потому что это их работа - связи.

Совет 2: Не ожидайте, что пиарщики подробно изучат ваш продукт
Это не их работа. Они - коннекторы, они являются мостом между вами и СМИ. Они отвечают за то, чтобы вы были на первых полосах нужных СМИ. Это их работа. А ваша работа - рассказать про ваш продукт, обяъснить, почему он хорош и почему каждый должен его использовать ;-).

Совет 3: Наймите пиарщиков, которые в теме
Пиар-фирму специализируются на разных отраслях, и не все из них вам подходят. Например, если ваша область - потребительские товары в Интернете, не нанимайте пиарщиков, которые занимаются мобильными технологиями - они не то, что вам нужно. Если вы - интернет-компания, специализирующаяся на потребительских товарах, вам нужна фирма, которая знает блогосферу изнутри, потому что это ваши самые первые потребители.

Совет 4: Анонсируйте ваш продукт на конференции
Причина этого - вы получите гораздо больше внимания от СМИ, если вы анонсируете ваш продукт на конференции, чем в какое-либо другое время. Но конференция должна быть подходящей. Для анонса вы должны сделать две вещи: анонсироватьна специализированной конференции, такой как DEMO или анонсировать на не-стартаперской конференции, которая имеет секцию для объявления новых проектов. Например, на Веб-два-ноль концеренциях (таких как Supernova) обычно анонсируют 10-15 стартапов. Не имеет смысла анонсировать на конференции, в которой нет стартаперского участия, так как не будет подходящего контекста для вашего анонса.

пятница, 2 октября 2009 г.

Список xtypes для ExtJS

Выкладываю список xtypes для контролов ExtJS:



xtype Class
------------- ------------------
box Ext.BoxComponent
button Ext.Button
buttongroup Ext.ButtonGroup
colorpalette Ext.ColorPalette
component Ext.Component
container Ext.Container
cycle Ext.CycleButton
dataview Ext.DataView
datepicker Ext.DatePicker
editor Ext.Editor
editorgrid Ext.grid.EditorGridPanel
flash Ext.FlashComponent
grid Ext.grid.GridPanel
listview Ext.ListView
panel Ext.Panel
progress Ext.ProgressBar
propertygrid Ext.grid.PropertyGrid
slider Ext.Slider
spacer Ext.Spacer
splitbutton Ext.SplitButton
tabpanel Ext.TabPanel
treepanel Ext.tree.TreePanel
viewport Ext.ViewPort
window Ext.Window

Toolbar components
---------------------------------------
paging Ext.PagingToolbar
toolbar Ext.Toolbar
tbbutton Ext.Toolbar.Button (deprecated; use button)
tbfill Ext.Toolbar.Fill
tbitem Ext.Toolbar.Item
tbseparator Ext.Toolbar.Separator
tbspacer Ext.Toolbar.Spacer
tbsplit Ext.Toolbar.SplitButton (deprecated; use splitbutton)
tbtext Ext.Toolbar.TextItem

Menu components
---------------------------------------
menu Ext.menu.Menu
colormenu Ext.menu.ColorMenu
datemenu Ext.menu.DateMenu
menubaseitem Ext.menu.BaseItem
menucheckitem Ext.menu.CheckItem
menuitem Ext.menu.Item
menuseparator Ext.menu.Separator
menutextitem Ext.menu.TextItem

Form components
---------------------------------------
form Ext.FormPanel
checkbox Ext.form.Checkbox
checkboxgroup Ext.form.CheckboxGroup
combo Ext.form.ComboBox
datefield Ext.form.DateField
displayfield Ext.form.DisplayField
field Ext.form.Field
fieldset Ext.form.FieldSet
hidden Ext.form.Hidden
htmleditor Ext.form.HtmlEditor
label Ext.form.Label
numberfield Ext.form.NumberField
radio Ext.form.Radio
radiogroup Ext.form.RadioGroup
textarea Ext.form.TextArea
textfield Ext.form.TextField
timefield Ext.form.TimeField
trigger Ext.form.TriggerField

Chart components
---------------------------------------
chart Ext.chart.Chart
barchart Ext.chart.BarChart
cartesianchart Ext.chart.CartesianChart
columnchart Ext.chart.ColumnChart
linechart Ext.chart.LineChart
piechart Ext.chart.PieChart

Store xtypes
---------------------------------------
arraystore Ext.data.ArrayStore
directstore Ext.data.DirectStore
groupingstore Ext.data.GroupingStore
jsonstore Ext.data.JsonStore
simplestore Ext.data.SimpleStore (deprecated; use arraystore)
store Ext.data.Store
xmlstore Ext.data.XmlStore



Этот список лежит в документации к классу Ext.Component.

четверг, 1 октября 2009 г.

ExtJS - Добавление сабмита по Enter для FormPanel

Для формы регистрации нового юзера на сайте требуется производить сабмит формы по нажатию Enter в любом поле ввода формы. Сама форма появляется в новом окне (т.е. Ext.Window). Требуется добавить обработчик Enter для FormPanel.

Решение: для окна добавляем слушателя на событие show. В слушателе добавляем Ext.KeyMap с обработкой нужной клавиши. Вот что у меня получилось:

 
listeners: {
show: function() {
new Ext.KeyMap(Ext.getCmp('reg-form').body, [{
key: Ext.EventObject.ENTER,
fn: function() {
Ext.getCmp('regform-submit-button').fireEvent('click');
},
scope: this
}]);
}
}


Дополнительно можно почитать пост How to add a keymap to an existing FormPanel in ExtJS, где Jeffrey Phillips рассказывает, как добавить обработчик нажатия клавиши на FormPanel.

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

Кеширование новостей - запись данных в файл, кодировки, локи на файл

Итак, есть задача - сделать кеширование новостей на сервере. Сейчас у нас новости тянутся с блогпота - читается фид блога (формат Atom), и затем они транслируются на сайте.

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

Можно было конечно не заморачиваться с этим, и сделать попроще: используя cron раз в сутки запускать программку, которая пишет фиды с блогспота в файл. Соответственно, в java-программке не надо ничего писать, а просто лишь читать файл с сервера.

Итак, код чтения файла:

ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
 
String filename = "newsfeed.xml";
String realPath = getServletContext().getRealPath(filename);
updateNewsFile(realPath);
 
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(realPath)));
 
String s;
StringBuilder result = new StringBuilder();
while ((s = in.readLine()) != null) {
result.append(s);
}
in.close();
ModelAndView mv = new ModelAndView(this.view);
mv.addObject("feed", result.toString());
return mv;
}

Раз мы в коде видим ModelAndView - то ясно, что используется Spring MVC. Функция updateNewsFile(realPath) проверяет файл с фидами, и если его дата не равно сегодняшней, или файл вообще отсутствует, тащит фиды с блогспота, и пишет их в файл. Вот и ее код:

 
private static void updateNewsFile(String realPath) throws Exception {
Calendar today = Calendar.getInstance();
Calendar fileTime = Calendar.getInstance();
File file = new File(realPath);
boolean fileExists = true;
 
try {
fileTime.setTimeInMillis(file.lastModified());
} catch (Exception e) {
fileExists = false;
}
 
// if file doesn't exist or isn't up-to-date, refresh it
if (
!fileExists ||
(
today.get(Calendar.YEAR) != fileTime.get(Calendar.YEAR) ||
today.get(Calendar.MONTH) != fileTime.get(Calendar.MONTH) ||
today.get(Calendar.DATE) != fileTime.get(Calendar.DATE))
)
{
URL feed = new URL("http://jdevnotes.blogspot.com/feeds/posts/default");
BufferedReader in = new BufferedReader(new InputStreamReader(feed.openStream(), "utf-8"));
StringBuilder sb = new StringBuilder();
String s;
while ((s = in.readLine()) != null) Х
sb.append(s);
}
in.close();
writeContentToFile(realPath, sb.toString());
}
}


Функция writeContentToFile лочит файл и записывает в него содержимое фиды. Используется Java NIO. Пример использования я посмотрел вот по этой ссылке. Вот код функции:

private static void writeContentToFile(String path, String content) throws Exception {
FileOutputStream fos = null;
FileLock lock = null;
try {
fos = new FileOutputStream(path);
FileChannel fileChannel = fos.getChannel();
lock = fileChannel.tryLock();
if (lock != null) {
fos.write(content.getBytes());
}
} finally {
if (lock != null) {
lock.release();
}
fos.close();
}
}


Код простой и сам-себя-объясняет, т.е. self-explanatory =). Но есть одно "но". В примере используется RandomAccessFile. Сначала и я его использовал.

Это такой класс, который записывает строку как String, а не как байты. С этого я получил расход времени на задачу плюс 2.5 часа сверх обычного ;-) Уж как только я не "трахался" с этим - указывал явно кодировки при записи, явно при чтении, при записи и при чтении, и т.д., и т.п. Пока наконец не догадался заменить RandomAccessFile на FileOutputStream - после этого все заработало с первого раза.

Такие дела =)

суббота, 26 сентября 2009 г.

ExtJS - confirm window не показывается поверх остальных окон на десктопе

Проблема с ExtJS - на десктопе расположено несколько окон. Одно окно содержит панель со списком контактов. При удалении контакта надо выводить confirm window, т.е. подтверждать удаление. При этом, когда открыто одно окно, confirm window выводится нормально, т.е. поверх окна, блокируя все остальное. Если же на десктопе открыто несколько окон, то confirm window выводится позади них. Используется Firefox 3.0.14.

Причина:
Windowsmanager z-index равен по умолчанию 9000. Z-index остальных окон, которые добавляются к document.body, равен 9003.

Решение:
Уменьшить z-index группы окон, сделать его меньше, чем 9000.

var windows = new Ext.WindowGroup();
windows.zseed = 7000;


Пример:
Рассмотрим приложение, использующее десктоп, из комплекта примеров ExtJS. У меня на машине оно находится в папке D:\ext-3.0.0\examples\desktop. В GridWindow навесим обработчик на конпку "Add something":

Файл D:\ext-3.0.0\examples\desktop\sample.js:




tbar:[{
text:'Add Something',
tooltip:'Add a new row',
iconCls:'add',
handler: oops // this is OUR handler
}, '-', {
text:'Options',
tooltip:'Blah blah blah blaht',
iconCls:'option'
},'-',{
text:'Remove Something',
tooltip:'Remove the selected item',
iconCls:'remove'
}]

....

function oops() {
Ext.MessageBox.confirm('Add something', 'Do you really want add something?', function(btn) {
if (btn == 'yes') {
console.info('add smth');
} else {
console.info('do not add');
}
});
}


Если открыть только одно окно - GridWindow, то confirm ,удет показываться нормально - поверх него. Но если открыть еще дополнительное окно, то confirm показывается позади этих окон.

Теперь надо отредактировать файл D:\ext-3.0.0\examples\desktop\js\Desktop.js:



Ext.Desktop = function(app){
this.taskbar = new Ext.ux.TaskBar(app);
var taskbar = this.taskbar;

var desktopEl = Ext.get('x-desktop');
var taskbarEl = Ext.get('ux-taskbar');
var shortcuts = Ext.get('x-shortcuts');

var windows = new Ext.WindowGroup();
windows.zseed = 7000; // this is the KEY!!!!



Строкой

windows.zseed = 7000;

мы задаем стартовое значение z-index для всех окон группы (т.е. для всех окон десктопа). Т.к. задано значение меньше 9000, то это решает проблему.

См. также эту ссылку на форуме ExtJS.

пятница, 25 сентября 2009 г.

Перешел на новую работу

Перешел на новую работу, теперь работаю в компании EvaPhone. Очень доволен - классный коллектив, потрясающая атмосфера стартапа, интересные задачи. Ближайшее время буду заниматься JavaScript, так что, думаю, в блоге появятся посты на тему ДжаваСкрипта.

Smoke test

Smoke test - быстрое и грубое тестирование кода сразу после внесения в него правок. П поводу происхождения термина Википедия говорит следующее:

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

Повторное «рождение» термина произошло в радиоэлектронике. Подключив в первый раз собранное устройство к источнику питания, радиолюбитель, пристально разглядывая каждый участок печатной платы, проводит так называемый «Smoke Test» — наблюдает, задымится или нет, потому что очень часто из-за досадных ошибок, допущенных при монтаже схемы, она оказывалась неработоспособна и отдельные её части выходили из строя из-за перегрева (часто с выделением дыма).

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

четверг, 6 августа 2009 г.

WebSphere: JSPG0091E Syntax error, parameterized types are only available if source level is 5.0

После деплоя приложения на WebSphere, при заходе на несколько JSP-страничек в задеплоенном приложении стало выбрасываться исключение:

JSPG0091E Syntax error, parameterized types are only available if source level is 5.0

Код в JSP использует возможности Java 1.5, в частности, дженерики и ассерты. Именно это и не нравится вебсфере, судя по тому, что она пишет в exception messages. В чем же дело, ведь в коде приложения также используются фичи из Java 1.5?

Дело в том, что для JSP Engine, который и производит компиляцию JSP-страниц в сервлеты, ВебСфера использует отдельные настройки. В частности, через эти настройки можно задать версию Java, для которой написан исходный код. По умолчанию, эта версия установлена 1.3!!!
Соответственно, если задать ее 1.5, то исключения исчезнут.

Есть два пути, как задать версию: через веб-интерфейс (как это сделать, описано здесь) и через файл ibm-web-ext.xmi, который надо добавить в каталог WEB-INF приложения. Я опишу подробно второй способ.

В файле ibm-web-ext.xmi задаются настройки JSP Engine для WebSphere. Через этот файл можно задать множество параметров, которые описаны вот здесь. Нас интересует параметр, который называется jdkSourceLevel - он задает минимальную версию Java, на которой написан код. Для Java 1.5 следует задать значения параметра 15, для Java 1.4 - значение этого параметра должно быть 14.

Файл ibm-web-ext.xmi:



<?xml version="1.0" encoding="UTF-8"?>
<!--
This is configuration file for JSP Engine on WebSphere.
-->

<com.ibm.ejs.models.base.extensions.webappext:WebAppExtension xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI"
xmlns:com.ibm.ejs.models.base.extensions.webappext="webappext.xmi"
xmi:id="WebAppExtension_1185836603523">
<webApp href="WEB-INF/web.xml#WebApp_1185836603521"/>
<!--
The following attribute determines the source level of code inside JSP.
In WAS source level 1.3 is used by default.
Since we use Java 1.5 we should point out explicitly to use 1.5
-->
<jspAttributes xmi:id="JSPAttribute_1" name="jdkSourceLevel" value="15"/>
</com.ibm.ejs.models.base.extensions.webappext:WebAppExtension>


Также об этой ошибке написано в блоге DocTeger'а.
Есть также раздел Configuring JSP Parameters в руководстве по ВебСфере.

среда, 8 июля 2009 г.

Использование callback в Java

Callback (обратный вызов) - код, который вызывается при наступлении какого-либо события. В таких языках, как С/С++ колбэк обычно реализуется с помощью указателей на функции (или методы). В Java, где нет указателей, колбэк чаще всего реализуется с помощью интерфейсов.

Рассмотрим пример: несколько потоков выполняют одинаковую работу. Когда один из потоков завершит (первым) свою работу, ему надо уведомить программу об этом. При получении уведомления о завершении потоком работы, программа останавливает другие потоки. Получение уведомления как раз сделано при помощи колбэка.

вторник, 7 июля 2009 г.

Удаление сессий в Oracle

Время от времени нам требуется создавать заново схему БД - это делается во время ночных билдов (nightly builds) в КруизКонтроле. Это, однако, невозможно, если остаются пользователи, подключенные в БД. Поэтому для создания схемы надо убить все сессии.

Приведенная ниже процедура убивает все сессии в Oracle:

CREATE OR REPLACE PROCEDURE Kill_User_Sessions(Usernames IN VARCHAR2)
AUTHID CURRENT_USER
IS
Stmt_Str VARCHAR2(200);
Sid_V VARCHAR2(30);
SerialNum_V VARCHAR2(30);
CURSOR pri IS
SELECT Sid, Serial#, Username
FROM v$session
WHERE Username IS NOT NULL
AND Username IN (Usernames)
AND Status NOT IN ('KILLED','SNIPED');
BEGIN
FOR usr IN pri
LOOP
Sid_V := usr.Sid;
SerialNum_V := Usr.Serial#;
Stmt_Str := 'ALTER SYSTEM KILL SESSION ''' || Sid_V || ',' || SerialNum_V || '''';
EXECUTE IMMEDIATE(stmt_str);
END LOOP;
END;

Она используется следующим образом:

CALL Kill_User_Sessions('username');

- где username - имя пользователя, сессии которого следует удалить.

Обратите внимание также на строчку AUTHID CURRENT_USER. Если задана опция AUTHID CURRENT_USER, то учитываются привилегии, данные через роль. Если не задана - т.е. по умолчанию DEFINER, то роли не учитываются.

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

Правка CruiseControl

CruiseControl - утилита для непрерывной интеграции (continouos integration) приложений. У нас в настоящее время в КруизКонтроле (КК) крутится около десятка проектов. Схема использования такова: девелоперы вносят правки в код, тестируют его на локальных машинах, затем коммитят свои изменения в SVN. На каждом проекте в КК настроен слушатель (listener) SVN, который отслеживает изменения в репозитории. После внесения изменений, делается автоматический чек-аут кода в свою область в workspace КруизКонтроля, он собирается, а собранные артефакты (JAR, WAR файлы, возможно, SQL-скрипты) публикуются в назначенном каталоге. Ход сборки можно затем посмотреть через веб-приложение Dashboard, которое поставляется в составе КК.

Все бы было хорошо, но в КК версии 2.8.2 есть одна досадная бага, осложняющая просмотр лога сборки - лог сборки показывается в браузере одной сплошной строкой, без символов новой строки (которые в HTML должны заменяться тегами <br>). Теги br в этой строке есть, но у них угловые скобки земенены на &lt; и &gt;? поэтому они не отрабатывают. В этом сообщении показано, как поправить этот баг.

Я скачал исходники КК, и провел поиск файлов, содержащих строку errors_and_warnings_element - это id div-элемента, который содержит лог ошибок. Оказалось, что эта строка содержится в классе net.sourceforge.cruisecontrol.dashboard.widgets.ErrorsAndWarningsMessagesWidget,
код которого находится в файле CC_SRC_HOME\reporting\dashboard\src\net\sourceforge\cruisecontrol\dashboard\widgets\ErrorsAndWarningsMessagesWidget.java (где каталог CC_SRC_HOME - это каталог, который содержит исходники КК). В этом файле имеется метод errorsAndWarnings(List, String), код которого приведен ниже:



private String errorsAndWarnings(List messages, String currentHtml) {
StringBuffer sb = new StringBuffer();
for (Iterator iter = messages.iterator(); iter.hasNext();) {
BuildMessage message = (BuildMessage) iter.next();
MessageLevel level = message.getLevel();
if (MessageLevel.WARN.equals(level) || MessageLevel.ERROR.equals(level)) {
sb.append(message.getMessage()).append("<br/>");
}
}
String error = StringUtils.defaultIfEmpty(sb.toString(), "No errors or warnings");
String errorsAndWarningsHtml = StringUtils.replace(ERRORS_AND_WARNINGS_HTML, "$errors",StringEscapeUtils.escapeHtml(error));
boolean hasErrorsOrWarnings = !StringUtils.isEmpty(sb.toString());
return currentHtml + makeToggleable(errorsAndWarningsHtml, "errors_and_warnings_element", hasErrorsOrWarnings);
}


Проблема заключается в вызове StringEscapeUtils.escapeHtml(error). Нетрудно догадаться по названию, что метод StringEscapeUtils.escapeHtml(String str) - заменяет специальные символы (угловые скобки, амперсанды и т.п.) в строке str на escape-последовательности. Поэтому у тегов <br> были заменены угловые скобки! Если соответствующую строчку переписать как

String errorsAndWarningsHtml = StringUtils.replace(ERRORS_AND_WARNINGS_HTML, "$errors",error);

то проблема исчезнет, и лог ошибок будет отображаться в браузере в удобочитаемом виде. После исправления, данный класс можно перекомпилировать, и положить в каталог CC_HOME\webapps\dashboard\WEB-INF\classes\net\sourceforge\cruisecontrol\dashboard\widgets - где и находятся остальные class-файлы. При компиляции к качестве classpath следует использовать JAR-файлы из каталога CC_HOME\webapps\dashboard\WEB-INF\lib.

Можно также сделать и по другому: создать класс net.sourceforge.cruisecontrol.dashboard.widgets.ErrorsAndWarningsMessagesWidgetUpdated (его содержимое - полная копия класса ErrorsAndWarningsMessagesWidget),
заменить в нем строку в методе errorsAndWarnings(List, String), как показано выше. Скомпилировать его, и сделать либо JAR-файл, который положить в CC_HOME\webapps\dashboard\WEB-INF\lib, либо class-файл выложить в каталог CC_HOME\webapps\dashboard\WEB-INF\classes\net\sourceforge\cruisecontrol\dashboard\widgets. Затем в файле dashboard-config.xml (который находится в каталоге CC_HOME), который имеет следующее содержимое:


<dashboard>
<buildloop logsdir="" artifactsdir="" />
<features allowforcebuild=""/>
<trackingtool projectname="" baseurl="" keywords=""/>
<subtabs>
<subtab class="net.sourceforge.cruisecontrol.dashboard.widgets.ErrorsAndWarningsMessagesWidget" />
</subtabs>
</dashboard>


заменить имя класса на net.sourceforge.cruisecontrol.dashboard.widgets.ErrorsAndWarningsMessagesWidgetUpdated.

И в этом случае также все будет работать - т.е. лог ошибок показываться в dashboard в удобочитаемом виде.

Пример build.xml для сборки:


<project name="ccfix" default="compile">
<path id="ccpath">
<fileset dir="d:/cc/webapps/dashboard/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="d:/cc/webapps/dashboard/WEB-INF/classes"/>
</path>
<target name="compile">
<javac srcdir="src" destdir="build" classpathref="ccpath"/>
</target>
</project>

вторник, 16 июня 2009 г.

FindBugs

FindBugs - утилита-анализатор исходного кода на Java на наличие потенциально опасных конструкций в нем. Тулза сделана в Университете Мэриленда, распространяется под лицензией LGPL.

FindBugs отлавливает так называемые bug patterns - т.e. конструкции в коде, которые, скорее всего, являются ошибкой. Причем, для ее работы не обязательно иметь исходный код приложения - на самом деле она выполняет анализ байт-кода, используя для этих целей библиотечку Apache BCEL (ByteCode Engineering Library), которая уже упоминалась в этом сообщении. Таким образом, можно даже сторонние JARы проанализировать на наличие ошибок - FindBugs может обрабатывать JAR-, ZIP-файлы, и, конечно, class-файлы.

Установка сей тулзы подробно описана здесь. Я устанавливал FindBugs таким образом: скачал findbugs-1.3.8.zip c SourceForge.net, разархивировал его в каталог D:\tools\findbugs-1.3.8, установил переменную среды FINDBUGS_HOME=D:\tools\findbugs-1.3.8.

Далее мы разберем работу с FindBugs c использованием Ant. Кстати, у FindBugs есть также плагин к Eclipse. Но поскольку я являюсь сторонником использования командной строки (и особенно люблю Ant =) ), то именно совместное использование Ant & FindBugs - предмет данного поста.

FindBugs довольно требователен к памяти - в руководстве на сайте программы еще в первой главе отмечают, что для работы FindBugs потребуется минимум полгигабайта оператиной памяти, а лучше больше, конечно. При первых запусках на моей машине FindBugs выбрасывал исключение java.lang.OutOfMemoryError до тех пор, пока я не увеличил объем памяти, доступной JVM до 512Mb. В команде <findbugs> (о ней речь пойдет ниже) есть параметр jvmargs, который, как понятно из названия, содержит параметры, передаваемые JVM. Установив jvmargs="-Xmx512M" я избавился от java.lang.OutOfMemoryError.

Далее предполагается, что Ant установлен в каталог ANT_HOME, а FindBugs установлен в каталог FINDBUGS_HOME. Как я уже говорил, у меня на компьютере установлена переменная среды FINDBUGS_HOME=D:\tools\findbugs-1.3.8. Первым делом самолеты надо скопировать два файла FINDBUGS_HOME/lib/bcel.jar и FINDBUGS_HOME/lib/findbugs-ant.jar в каталог ANT_HOME/lib. Затем в файле сборки (build.xml) декларируется новая команда - <findbugs>:


<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"/>

Рассмотрим параметры команды <findbugs> (в таблице ниже перечислены не все параметры, а только самые важные, на мой взгляд):

















ПараметрОписаниеОбязательный
classДочерний элемент, указывающий, что именно анализировать. Должен содержать атрибут location, в котором указывается путь к анализируемому объекту. Это может быть директория, JAR или ZIP файл, class-файл. Тэг <findbugs> может содержать несколько дочерних элементов <class>. Пример:

<class location="${build.dir}"/>
<class location="resulted.jar"/>
<class location="Test.class"/>


Да
auxClasspathДочерний элемент, содержащий библиотеки, которые используются в анализируемом коде, но которые пользователь не будет анализировать. Этот элемент объявляется так же, как и classpath в команде <java>. Пример:
<auxClasspath refid="main.classpath"/>
- здесь идет ссылка на main.classpath, который ранее объявлен в файле сборки. Например, он может быть объявлен следующим образом:

<path id="main.classpath">
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>

Нет
homeЭтот атрибут должен содержать имя каталога, где находится FindBugs. Пример:
<findbugs home="${findbugs.home.dir}">
Да
reportLevelЭтот атрибут определяет уровень ошибок, которые выводятся в файл результатов. Есть три уровня:
  • low - рапортуются все ошибки

  • medium - (значение по умолчанию) рапортуются только ошибки уровня medium, high

  • high - рапортуются только ошибки уровня high
Пример:
<findbugs reportLevel="low">
Нет
outputЭтот атрибут определяет формат файла отчета. Принимает следующие значения:
  • xml - (значение по умолчанию) формат XML. Файл отчета в этом формате можно затем открыть с помощью GUI-интерфейса

  • xml:withMessages - вывод в формате XML дополнен поясняющими сообщениями. Файл отчета в этом формате также можно затем открыть с помощью GUI-интерфейса. Этот файл с сообщениями можно затем обработать XSLT-процессором, чтобы получить, допустим, расширенный отчет в HTML.

  • html - вывод в формате HTML

  • text - вывод в текстовом формате

  • emacs - вывод в формате сообщений об ошибках, принятых в Emacs

  • xdocs - вывод в формате sdocs для дальнейшей обработки в Maven

Пример:
<findbugs output="xml:withMessages">

Нет
outputFileЭтот атрибут определяет имя файла отчета.

Пример:
<findbugs outputFile="${reports.file}">

Нет
jvmargsЭтот атрибут определяет параметры, передаваемые JVM. Чаще всего для анализа проектов следует увеличить память, доступную JVM. Делается это с помощью параметра -Xmx, пример:
<findbugs jvmargs="-Xmx512M">

Нет
failOnErrorЭтот логический атрибут определяет, следует ли останавливать процесс сборки, если в при проверке обнаружены ошибки. Принимает значения true/false, по умолчанию false
Нет
errorPropertyЭтот атрибут определяет имя свойства, которое будет установлено в true, если при проверке будут обнаружены ошибки. Пример:

<findbugs errorProperty="errors.present">

Нет
warningsPropertyЭтот атрибут определяет имя свойства, которое будет установлено в true, если при проверке будут сгенерированы предупреждения. Пример:

<findbugs warningsProperty="warnings.present">

Нет


Остальные параметры можно посмотреть здесь.

Теперь напишем цель для файла сборки, которая будет проверять наш (а может быть, и не наш) код на наличие ошибок.


<target name="findbugs" depends="compile">
<findbugs home="${findbugs.home.dir}" output="xml:withMessages" outputFile="${home.dir}/findbugs.xml" jvmargs="-Xmx512M">
<sourcePath path="${src.dir}" />
<class location="${build.dir}"/>
<auxClasspath refid="main.classpath"/>
</findbugs>
</target>


После прогона FindBugs по коду одного из проектов (который писал не я =))) ) командой

> ant findbugs

были получены, например, следующие сообщения (всего получено сообщений 261):

Class defines clone() but doesn't implement Cloneable
May expose internal representation by returning reference to mutable object
Comparison of String objects using == or !=
Class defines compareTo(...) and uses Object.equals()
int division result cast to double or float
clone method does not call super.clone()
Method concatenates strings using + in a loop
Unread field

+ куча сообщений по поводу неосовобождения ресурсов после их использования (незакрытые java.sql.PreparedStatement, java.sql.ResultSet и т.п.).

FindBugs имеет удобный графический интерфейс для просмотра файла отчета. На Windows для запуска GUI можно запустить файл FINDBUGS_HOME\bin\findbugs.bat, или выполнить команду

java [JVM arguments] -jar $FINDBUGS_HOME/lib/findbugs.jar options...


Просмотр ошибок в GUI выглядит следующим образом:



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

Постоянные читатели