Общее·количество·просмотров·страницы
Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи
воскресенье, 25 октября 2009 г.
JIRA live tour использует jQuery
Как недавно написал Ajaxian, Atlassian создала live tour по Жире. При создании использовалась jQuery. Скринкасты хорошо, но когда имеется ассистант, который показывает использование живого приложения, это круто вдвойне.
Ярлыки:
misc
понедельник, 19 октября 2009 г.
Как получить заданное количество фидов из блогспота
Чтобы получить заданное количество фидов из блогспота, нужно использовать параметр max-results.
Пример: следующая ссылка выдает три последних фида этого блога:
http://jdevnotes.blogspot.com/feeds/posts/default?max-results=3.
П.С.
Increase Your Recent Posts and Comments to 10 – Blogger Hack - неплохая подборочка хаков блогспота.
Пример: следующая ссылка выдает три последних фида этого блога:
http://jdevnotes.blogspot.com/feeds/posts/default?max-results=3.
П.С.
Increase Your Recent Posts and Comments to 10 – Blogger Hack - неплохая подборочка хаков блогспота.
Ярлыки:
misc
четверг, 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"
Классное видео - 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:
Ваш элевейтор питч должен содержать:
9 C's для эффективного элевейтор питч, взято отсюда:
Еще ссылки:
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
Правильно составленный элевейтор питч отвечает на вопросы:
- Какой продукт мы предлагаем.
- Какие преимущества имеет наш продукт.
- Кто мы такие.
Термин обычно используется в контексте презентации предпринимателем концепции нового бизнеса партнеру венчурного фонда для получения инвестиций. Поскольку представители венчурных фондов стремятся как можно скорее принимать решение о перспективности или бесперспективности того или иного проекта или команды, первичным критерием отбора становится качество элевейтор питч. Соответственно, качество этой речи и уровень ее преподнесения имеет главенствующее значение и для руководителей стартапа, стремящегося найти финансирование.
Элевейтор питч - ключевой эпизод в фильме "Деловая девушка"
Элевейтор питч должен отвечать на 6 вопросов, по версии Business Know-How:
- Что такое ваш продукт или услуга - кратко опишите, что вы продаете. Не углубляйтесь в детали.
- Каков ваш рынок - кому вы продаете, что это за отрасль, насколько рынок большой.
- На чем зарабатываете - опишите наиболее просто, как вы зарабатываете деньги на продукте.
- Ваша команда - опишите команду, которая работает с вами. Если у вас есть хорошие советники, которые вам сильно помогли, или административный ресурс - также опишите это.
- Ваши конкуренты - опишите конкурентов. У вас их нет? Подумайте снова, и все-таки опишите их. Успешная конкуренция доказывает, что ваш продукт/услуга работает хорошо.
- Ваши конкурентные преимущества - просто существовать в отрасли с сильными конкурентами недостаточно. Чем ваша компания отличается, в чем ее преимущество над конкурентами - вы должны это донести. Лучшие каналы продаж? Ключевые партнеры? Продвинутые технологии?
Ваш элевейтор питч должен содержать:
- Зацепку. Он должен начинаться с зацепки для инвестора - это может быть вопрос, который привлечет его внимание, и он захочет услышать больше.
- 150-225 слов. Длительность питча - не более 60 секунд.
- Страсть. Инвестор ожидает энергию и увлеченность от вас.
- Вопрос. В конце питча вы должны попросить о чем-то - может быть, провести полную презентацию компании у инвестора, или попросить его взять вашу визитку, или попросить его контактные данные. Придумайте это сами.
9 C's для эффективного элевейтор питч, взято отсюда:
- Concise (Краткость). Эффективный э.п. содержит так мало слов, как только возможно, но не меньше.
- Clear (Ясность). Никаких акронимов, MBA-словечек и десятидолларовых выражений =) Эффективный э.п. могут понять сразу и без проблем ваши бабушка и дедушка, ваша половинка и ваши дети.
- Compelling (Неотразимость). Эффективный э.п. сразу объясняет проблему, которую решает ваш продукт или услуга.
- Credible (Достоверность). Эффективный э.п. объясняет, почему вы квалифицированы, чтобы увидеть проблему и построить решение.
- Conceptual(Концептуальность). Эффективный э.п. проводится на достаточно высоком понятийном уровне, и не углубляется в ненужные детали.
- Concrete (Конкретность). Эффективный э.п. конкретен настолько, насколько это возможно, он практически осязаем.
- Consistent (Целостность). Любая версия эффективного э.п. передает одно и то же базовое послание.
- Customized (Настройка на аудиторию). Эффективный э.п. учитывает интересы и проблемы конкретной аудитории.
- 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
Ярлыки:
startup
понедельник, 12 октября 2009 г.
Change your password day
Австралийское правительство призвало менять пароли как минимум дважды в год. Рекомендации:
- минимум 8 символов;
- применять строчные и прописные символы;
- как минимум одна цифра;
- как минимум одна буква.
Они даже учредили Change Your Password Day =)
Ссылки:
E-security Awareness Week Launch
Обсуждение в группе comp.lang.java.programmer
- минимум 8 символов;
- применять строчные и прописные символы;
- как минимум одна цифра;
- как минимум одна буква.
Они даже учредили Change Your Password Day =)
Ссылки:
E-security Awareness Week Launch
Обсуждение в группе comp.lang.java.programmer
Ярлыки:
misc
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
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
Ярлыки:
misc
пятница, 9 октября 2009 г.
При отсылке JSON нужно ставить mime-тип application/json
При отсылке JSON нужно ставить mime-тип application/json, а не text/plain.
Уязвимости, которые возникают при использовании text/plain, описаны здесь и здесь.
Пример кода сервлета, устанавливающего mime и кодировку:
Уязвимости, которые возникают при использовании 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 стартапов. Не имеет смысла анонсировать на конференции, в которой нет стартаперского участия, так как не будет подходящего контекста для вашего анонса.
РАЗРАБОТКА (перевод взят с Хабра)
Поскольку программное обеспечение является базисом для любого современного веб-стартапа, то оно должно быть элегантным, простым и шустрым. Вместо того, чтобы нанимать армию кодеров, лучше иметь несколько умных, исполненных энтузиазма программистов, которые любят то, что они делают. Маленькая и влюблённая в своё дело команда может сделать больше, чем целая армия. Даже если компания растёт, всё равно вы можете осилить многие задачи с небольшой командой.
Совет 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 стартапов. Не имеет смысла анонсировать на конференции, в которой нет стартаперского участия, так как не будет подходящего контекста для вашего анонса.
Ярлыки:
startup
пятница, 2 октября 2009 г.
Список xtypes для ExtJS
Выкладываю список xtypes для контролов ExtJS:
Этот список лежит в документации к классу Ext.Component.
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.
Ярлыки:
ExtJS
четверг, 1 октября 2009 г.
ExtJS - Добавление сабмита по Enter для FormPanel
Для формы регистрации нового юзера на сайте требуется производить сабмит формы по нажатию Enter в любом поле ввода формы. Сама форма появляется в новом окне (т.е. Ext.Window). Требуется добавить обработчик Enter для FormPanel.
Решение: для окна добавляем слушателя на событие show. В слушателе добавляем Ext.KeyMap с обработкой нужной клавиши. Вот что у меня получилось:
Дополнительно можно почитать пост How to add a keymap to an existing FormPanel in ExtJS, где Jeffrey Phillips рассказывает, как добавить обработчик нажатия клавиши на 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.
Ярлыки:
ExtJS
вторник, 29 сентября 2009 г.
Кеширование новостей - запись данных в файл, кодировки, локи на файл
Итак, есть задача - сделать кеширование новостей на сервере. Сейчас у нас новости тянутся с блогпота - читается фид блога (формат Atom), и затем они транслируются на сайте.
Кешируем следующим образом: сохраняем XML контент в файл на сервере. Стратегия обновления файла: если дата создания файл отличается от сегодняшней, то тащим новости с блогспота. Если же дата такая же, то не трогаем файл. Т.е. если у нас нет запросов к сайту, то файл с фидами не обновляется. Если запросы есть, то он обновляется раз в сутки.
Можно было конечно не заморачиваться с этим, и сделать попроще: используя cron раз в сутки запускать программку, которая пишет фиды с блогспота в файл. Соответственно, в java-программке не надо ничего писать, а просто лишь читать файл с сервера.
Итак, код чтения файла:
Раз мы в коде видим ModelAndView - то ясно, что используется Spring MVC. Функция updateNewsFile(realPath) проверяет файл с фидами, и если его дата не равно сегодняшней, или файл вообще отсутствует, тащит фиды с блогспота, и пишет их в файл. Вот и ее код:
Функция writeContentToFile лочит файл и записывает в него содержимое фиды. Используется Java NIO. Пример использования я посмотрел вот по этой ссылке. Вот код функции:
Код простой и сам-себя-объясняет, т.е. self-explanatory =). Но есть одно "но". В примере используется RandomAccessFile. Сначала и я его использовал.
Это такой класс, который записывает строку как String, а не как байты. С этого я получил расход времени на задачу плюс 2.5 часа сверх обычного ;-) Уж как только я не "трахался" с этим - указывал явно кодировки при записи, явно при чтении, при записи и при чтении, и т.д., и т.п. Пока наконец не догадался заменить RandomAccessFile на FileOutputStream - после этого все заработало с первого раза.
Такие дела =)
Кешируем следующим образом: сохраняем 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 - после этого все заработало с первого раза.
Такие дела =)
Ярлыки:
Java
суббота, 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:
Если открыть только одно окно - GridWindow, то confirm ,удет показываться нормально - поверх него. Но если открыть еще дополнительное окно, то confirm показывается позади этих окон.
Теперь надо отредактировать файл D:\ext-3.0.0\examples\desktop\js\Desktop.js:
Строкой
windows.zseed = 7000;
мы задаем стартовое значение z-index для всех окон группы (т.е. для всех окон десктопа). Т.к. задано значение меньше 9000, то это решает проблему.
См. также эту ссылку на форуме ExtJS.
Причина:
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:
|
Если открыть только одно окно - GridWindow, то confirm ,удет показываться нормально - поверх него. Но если открыть еще дополнительное окно, то confirm показывается позади этих окон.
Теперь надо отредактировать файл D:\ext-3.0.0\examples\desktop\js\Desktop.js:
|
Строкой
windows.zseed = 7000;
мы задаем стартовое значение z-index для всех окон группы (т.е. для всех окон десктопа). Т.к. задано значение меньше 9000, то это решает проблему.
См. также эту ссылку на форуме ExtJS.
Ярлыки:
ExtJS
пятница, 25 сентября 2009 г.
Перешел на новую работу
Перешел на новую работу, теперь работаю в компании EvaPhone. Очень доволен - классный коллектив, потрясающая атмосфера стартапа, интересные задачи. Ближайшее время буду заниматься JavaScript, так что, думаю, в блоге появятся посты на тему ДжаваСкрипта.
Smoke test
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:
Также об этой ошибке написано в блоге DocTeger'а.
Есть также раздел Configuring JSP Parameters в руководстве по ВебСфере.
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:
|
Также об этой ошибке написано в блоге DocTeger'а.
Есть также раздел Configuring JSP Parameters в руководстве по ВебСфере.
среда, 8 июля 2009 г.
Использование callback в Java
Callback (обратный вызов) - код, который вызывается при наступлении какого-либо события. В таких языках, как С/С++ колбэк обычно реализуется с помощью указателей на функции (или методы). В Java, где нет указателей, колбэк чаще всего реализуется с помощью интерфейсов.
Рассмотрим пример: несколько потоков выполняют одинаковую работу. Когда один из потоков завершит (первым) свою работу, ему надо уведомить программу об этом. При получении уведомления о завершении потоком работы, программа останавливает другие потоки. Получение уведомления как раз сделано при помощи колбэка.
Рассмотрим пример: несколько потоков выполняют одинаковую работу. Когда один из потоков завершит (первым) свою работу, ему надо уведомить программу об этом. При получении уведомления о завершении потоком работы, программа останавливает другие потоки. Получение уведомления как раз сделано при помощи колбэка.
Ярлыки:
Java
вторник, 7 июля 2009 г.
Удаление сессий в Oracle
Время от времени нам требуется создавать заново схему БД - это делается во время ночных билдов (nightly builds) в КруизКонтроле. Это, однако, невозможно, если остаются пользователи, подключенные в БД. Поэтому для создания схемы надо убить все сессии.
Приведенная ниже процедура убивает все сессии в Oracle:
Она используется следующим образом:
- где username - имя пользователя, сессии которого следует удалить.
Обратите внимание также на строчку AUTHID CURRENT_USER. Если задана опция AUTHID CURRENT_USER, то учитываются привилегии, данные через роль. Если не задана - т.е. по умолчанию DEFINER, то роли не учитываются.
Приведенная ниже процедура убивает все сессии в 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 в этой строке есть, но у них угловые скобки земенены на < и >? поэтому они не отрабатывают. В этом сообщении показано, как поправить этот баг.
Я скачал исходники КК, и провел поиск файлов, содержащих строку 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), код которого приведен ниже:
Проблема заключается в вызове 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), который имеет следующее содержимое:
заменить имя класса на net.sourceforge.cruisecontrol.dashboard.widgets.ErrorsAndWarningsMessagesWidgetUpdated.
И в этом случае также все будет работать - т.е. лог ошибок показываться в dashboard в удобочитаемом виде.
Пример build.xml для сборки:
Все бы было хорошо, но в КК версии 2.8.2 есть одна досадная бага, осложняющая просмотр лога сборки - лог сборки показывается в браузере одной сплошной строкой, без символов новой строки (которые в HTML должны заменяться тегами <br>). Теги br в этой строке есть, но у них угловые скобки земенены на < и >? поэтому они не отрабатывают. В этом сообщении показано, как поправить этот баг.
Я скачал исходники КК, и провел поиск файлов, содержащих строку 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), код которого приведен ниже:
|
Проблема заключается в вызове 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), который имеет следующее содержимое:
|
заменить имя класса на net.sourceforge.cruisecontrol.dashboard.widgets.ErrorsAndWarningsMessagesWidgetUpdated.
И в этом случае также все будет работать - т.е. лог ошибок показываться в dashboard в удобочитаемом виде.
Пример build.xml для сборки:
|
Ярлыки:
CruiseControl,
development,
misc
Подписаться на:
Сообщения (Atom)