Проект самоорганизующейся компании

image

Вступление

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

Суть

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

Определение

Самоорганизующееся общество – это общество, которое упорядочивает себя изнутри. Направление развития в таком обществе определяют его члены исходя из собственных интересов.

Самоорг – это портал, который создают, управляют и владеют им его пользователи, а так же получают плоды его деятельности. Участником сервиса может стать любой человек, полномочия и привилегии среди участников распределяются в зависимости от рейтинга присвоенного другими участниками за активность направленную во благо всего проекта и каждого его участника.

Принцип действия

Каждый участник предлагает идею, способ реализации и ресурсы, в зависимости от того, что посчитает нужным сам и будет оценивать идеи и действия других участников. В результате должна сложиться база знаний и наработок, а так же капитал, которые в свою очередь должны на выходе дать некий коммерческий продукт.
Но сначала, для того чтобы проект не заглох на самом старте, ввиду сложности самоорганизации пользователей, классическим путём (фиксированной командой разработчиков) будет создаваться свой продукт, а именно портал товаров, услуг и организаций. Так как он видится наиболее перспективным из расчёта — коммерческая перспективность/простота реализации. Это решение ещё может быть оспорено большинством участников, если все решат, что лучше делать соц. Сеть или баллистические ракеты, то так тому и быть. На мой взгляд, очевидна необходимость начинать с готового продукта, который создан обычным путём, нежели пытаться с 0 что-то сделать одной только самоорганизацией, на эту тему ещё можно будет подискутировать, но пока так.

Этапы реализации

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

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

Минимум задач, которые необходимо реализовать, для того чтобы портал мог работать и развиваться:

  1. форум для создания и обсуждения идей.
  2. система рейтинга для подсчета полезности.
  3. Выбор стартовой ниши предпринимательства, самой адекватной на данный момент видится портал товаров, услуг и организаций.
  4. механизм распределения прибыли между участниками, в зависимости от полезности.

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

Заключение

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

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

В ближайшее время планируется конференция на тему «Самоорганизация общества — проблемы и способы их решений». О ней ещё будет объявлено, а так же будет выложен отчет мероприятия.

Контакты

Если кто хочет присоединиться, пишите на почту wasilewaleksandr@yandex.ru
А так же обсуждайте и следите за новостями в вконтакте

ссылка на оригинал статьи http://habrahabr.ru/post/200332/

Изучение английских слов

Изучение английских слов.

Как известно, для успешного изучения английских слов их нужно периодически повторять с увеличивающимися интервалами.

Например, выученное слово нужно повторить через 2 часа, затем через 16 часов, через 4 суток, через месяц и т. д.

Можно составлять списки слов для изучения и повторения (на бумаге или на компьютере), но я решил сделать по-другому. Я написал программу, которая имеет 2 режима:

— обучение.
— повторение.

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

Если слово введено правильно с первого раза, оно помечается как выученное и больше никогда не выводится. Если слово введено неправильно, оно будет выведено как минимум 4 раза в процессе изучения, после успешного 4-кратного ввода слово считается выученным с 2-часовым барьером (в режиме повторения через 2 часа будет выводиться). Вместо него в текущую тридцатку изучаемых слов загружается новое слово.

Таким образом можно выучить 100-200 слов за день. Теоретически за 15 дней можно выучить все основные 2500 английских слов, но следует помнить, что слова нужно ещё повторять, и некоторые слова изучать снова в случае неудачного повторения. Поэтому скорость изучения несколько ниже. Сам я с помощью этой программы изучил 10000 слов за 1,5 года (первые 2500 были выучены за полтора месяца, но половину слов среди первых 2500 наиболее важных я и так знал).

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

По моему опыту если слова успешно выучены и 2-часовой барьер успешно пройден (в режиме потворения через 2 часа я правильно вводил обычно 70-80% слов), на 16-часовом барьере ошибок практически нет. Если слово было потворено через 1 месяц, оно выучено почти навсегда.

ссылка на оригинал статьи http://habrahabr.ru/post/200380/

Мобильный интернет в России и мире: платформы, потребление, тенденции

Предлагаем вашему вниманию тезисное изложение трёх докладов, представленных на пресс-конференции, организованной Mail.Ru Group совместно с компанией Nielsen.

Выступление Мэтью Хестера, директора по потребительским исследованиям телеком-группы Nielsen в Европе

Сегодня я хотел бы представить вам результаты наших исследований по использованию мобильного интернета и развития смартфонов в целом.

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

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

Сегодня для активных пользователей мобильных технологий характерны следующие особенности:

  • Рассеянное внимание. В США около 80% потребителей пользуются планшетом во время просмотра телевизора.
  • Жизнь в социальных сетях. В Великобритании 35% владельцев смартфонов заходили на Facebook в последние 30 дней.
  • Эффективность использования. В США около 25% владельцев смартфонов сканируют штрих-коды для экономии времени.
  • Разобщенность. Современные потребители зачастую владеют несколькими устройствами. Мы получаем информацию из разных источников, например 20% просмотров Youtube осуществляется через смартфон.
  • Использование СМАРТ технологий. Около 20% владельцев смартфонов в Китае хотя бы раз в течение месяца используют мобильные кошельки и другие подобные услуги.
  • Использование геолокации. В Германии около 33% владельцев смартфонов в течение месяца хотя бы раз пользуются геолокационными сервисами.

Также я хочу проиллюстрировать ещё ряд характерных тенденций на примере владельцев Android-смартфонов из Великобритании:

  • В среднем смартфон используется в течение 83,5 минут в день (из них порядка 24,3 минут уходит на общение в социальных сетях).
  • На телефонные звонки тратится менее 7 минут в день. Смс + звонки – это лишь 14% от общего времени.
  • 73% времени занимает работа с различными приложениями, 11% — использование браузера.

Общение в социальных сетях, развитие всевозможных мобильных сервисов и рост возможностей смартфонов требуют всё большего увеличения мобильного трафика:


Текущая динамика и прогноз роста трафика на ближайшие годы требуют от мобильных операторов существенных инвестиций в развитие инфраструктуры и расширение мощностей. Важное уточнение — львиная доля мобильного трафика проходит через Wi-Fi. Ещё одна иллюстрация на примере пользователей из Великобритании (Android-смартфоны):

Как видите, пик использования 3G-трафика приходится на вечер, когда люди возвращаются с работы. Однако пик Wi-Fi-трафика приходится на полночь, когда англичане добираются до своих домашних роутеров.

Несмотря на победное шествие смартфонов по миру, их распределение по странам сильно разнится.

Общее население трёх выделенных стран, в которых доля смартфонов ещё невелика, составляет 2 млрд человек, так что потенциальный объём рынка очень велик.

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

Несмотря на то, что ноутбуки в целом являются всё ещё доминирующим классом мобильных устройств в Италии, однако уже 25% владельцев планшетов используют свое устройство для онлайн-шоппинга (в сравнении с 8% для ноутбуков).

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

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

Теперь на потребителя влияет огромное количество медиа каналов. Огромное значение в процессе принятия решений играют социальные сети, в которых мы можем найти отзывы о товарах и больше узнать об их характеристиках. Уже придя в магазин, потенциальный покупатель может получить новую информацию или отзывы с помощью мобильного телефона, что также может стать решающим моментом в принятии окончательного решения. Например, в Германии 24% пользователей смартфонов сканируют штрих коды в магазине, а в Великобритании 18% сравнивают онлайн-цены.

Раз потребители всё больше используют смартфоны для получения дополнительной информации, то это можно использовать для привлечения покупателей, то есть как на дополнительный маркетинговый канал. В США из общего времени, которое пользователи тратят на различные медиа, 12% приходится на телефоны, в то время как мобильная реклама составляет лишь небольшой процент от общего рекламного бюджета. На телевидение приходится 42% времени, на интернет — 26%. Таким образом, рынок мобильной рекламы имеет большой потенциал роста. Для этого мобильные операторы должны формировать и поддерживать базу лояльных потребителей.

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

Чтобы удержать потребителей, операторам необходимо подстраиваться под меняющийся спрос и перераспределять свои усилия на растущие области.

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

Выступление Александра Горного, директора по информационным технологиям Mail.Ru Group

Своё выступления я хотел бы посвятить мобильному интернету в России. В первой части я расскажу о рядовых пользователях, а во второй части представлю точку зрения веб-специалистов о мобильном интернете.

Часть 1

Своё видение пользователей мобильного интернета мы строим на основе данных сервиса Рейтинг Mail.Ru. Это система сбора статистики, которая собирает информацию о поведении посетителей ресурса. Рейтинг Mail.Ru — это более 850 тысяч счётчиков на сайтах (более 1% всех сервисов в мире), более 80 млн посетителей в день и более 2 млрд просмотров в день.

На сегодняшний день уже почти 30% посетителей рунета — это мобильные пользователи. Давайте посмотрим, как между собой различаются «традиционные» (стационарные) пользователи и мобильные.

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

В течение суток активность мобильных и стационарных пользователей различается:

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

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

Также наблюдаются изменения активности обоих сегментов пользователей в зависимости от дня недели, но эти колебания незначительны.

Ниже представлено деление пользователей в зависимости от региона России.

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

Чем, в основном, люди занимаются в мобильном интернете? Безусловно, наивысшая активность приходится на работу с различными приложениями. Если же говорить о самых посещаемых сайтах, то первые места занимают социальные сети, почта, новостные ресурсы и онлайн-издания.

Самой популярной мобильной платформой в России является Android. Приятная новость для веб-мастеров: доля старых устройств существенно снизилась. Наиболее популярным разрешением экрана стало разрешение iPad.

Итак, немного подытожим. Портрет современного типичного пользователя мобильного интернета в России таков: это молодой мужчина, в интернете больше времени проводит вечером и в выходные. Пользуется устройством на Android, но с разрешением экрана, типичным для iPad.

Часть 2

Мы провели опрос среди обычных веб-мастеров, пользователей сервиса Рейтинг Mail.Ru. Это не элитные специалисты, а представители наиболее массового сегмента, так сказать «соль земли». Целью опроса было выяснить мнение веб-мастеров о российском мобильном интернете. Выяснилось, что большинство сайтов не имеют мобильной версии. Более того, многие и не планируют её создавать.

Получается не слишком приятный разрыв: около 30% пользователей уже используют для выхода в интернет мобильные устройства, однако 28% веб-мастеров это совершенно не волнует. На то есть и объективные причины. Одной из них является отсутствие на конкретном сайте мобильного трафика, в результате у веб-мастера нет стимула к созданию мобильной версии. Однако такой подход имеет обратную сторону: мобильный трафик может отсутствовать как раз по причине отсутствия мобильной версии сайта, то есть посетители просто заходят на более дружелюбные к ним ресурсы.

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

В этом списке пока отсутствуют онлайн-магазины, но это дело времени.

Среди тех сайтов, что уже обзавелись мобильной версией, есть своеобразные передовики, у которых функционал обычной версии даже хуже.

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

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

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

Выступление Екатерины Петровой, руководителя телеком-практики Nielsen в Северо-Восточной Европе

Я хотела бы рассказать вам об исследовании, проведённом нами совместно с компанией OMI (Online Market Intelligence). Мы опросили 500 пользователей смартфонов, которые приобрели свои устройства в течение последнего года. Нас интересовало, как россияне используют смартфоны. И вот что нам удалось выяснить.

В среднем, наши респонденты владеют ещё 4 устройствами, и собираются купить ещё 2. Это могут быть ноутбуки, настольные компьютеры, mp3-плееры, коммуникаторы, игровые приставки.

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

Итак, для чего же пользователи смартфонов используют свои устройства? Оказалось, что 90% из опрошенных как минимум раз в неделю отправляют sms. Причём женщины делают это гораздо чаще мужчин. Таким образом, отправка sms на сегодня является наиболее популярным видом использования смартфона.

Далее по популярности следуют электронная почта и различные мессенджеры. Здесь уже лидируют мужчины, 18% женщин вообще не пользуются почтой через смартфоны и 28% не используют мессенджеры.

На веб-серфинг пользователи смартфонов тратят не так уж много времени, хотя 91% из опрошенных хотя бы раз в неделю заходит в интернет через браузер. В среднем же частота использования браузера — 1 раз в день.

Мэтью Хестер уже упоминал о том, что Wi-Fi доминирует в качестве средства доставки мобильного интернета, и наше исследование подтверждает это. Однако у мобильного интернета есть большой потенциал. Операторам необходимо развивать доступность мобильного интернета и его скорость. После домашнего использования наиболее популярными местами использования мобильного интернета являются общественный и личный транспорт, а также общественные места, такие как кафе, рестораны, торговые центры. Это полезная информация для мобильных операторов, которые могут использовать её для продвижения тарифных планов, которые могли бы привлечь пользователей к использованию мобильного трафика вместо Wi-Fi.

На главном рабочем столе смартфона в среднем находится около 18 приложений: игры, развлечения, социальные сети, геолокационные сервисы, погода и ряд других. В месяц пользователи смартфонов загружают в среднем 4 новых приложения, что достаточно много.

Количество загруженных приложений распределяется следующим образом: примерно по 30% приложений относятся к развлекательным и функциональным, 11% приходится на социальные сети. Однако важно также обращать внимание и на частоту, и тут значение социальных сетей возрастает.

Несмотря на гораздо меньшее количество загруженных приложений для социальных сетей, длительность и частота их использования существенно выше. В среднем, владельцы смартфонов запускают приложения для социальных сетей два раза в сутки, а в возрастной группе 16-24 года около 60% пользователей пользуются соцсетями 3 и больше раз в день. Как видите, это весьма мощный канал влияния для бизнеса и формирования мнения различными заинтересованными участниками. Например, большинство наших респондентов указали, что принимать решения о покупке высокотехнологичных товаров, о проведение досуга и отпусков они будут на основе мнений, размещённых в социальных сетях. Также 47% опрошенных отметили, что стали меньше использовать голосовую связь.

В среднем владельцы смартфонов оценили удовлетворённость своими устройствами в 8 баллов из 10. Среди тех, кто купил смартфон в течение последних трёх месяцев, эта оценка оказалась ещё выше — 9 баллов. Четырьмя самыми привлекательными функциями смартфонов оказались дизайн, большой выбор приложений, простота отправки сообщений и навигации.

Однако несмотря на такую высокую степень удовлетворённости своими устройствами, 29% опрошенных выразили готовность приобрести новый смартфон в течение ближайших трёх месяцев. Причём среди мужчин этот показатель составил 33%. Наиболее важными источниками информации при выборе нового смартфона стали обзоры и отзывы в интернете, сайты производителей, информация в интернет-магазинах и отзывы родственников и друзей.

Пример того, как современный потребитель ищет в интернете информацию для выбора смартфона был предоставлен нашим партнёром OMI:

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

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

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

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

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

ссылка на оригинал статьи http://habrahabr.ru/company/mailru/blog/200358/

На саммите G20 Россия дарила дипломатам флешки с «закладками»

Такими заголовками пестрили на днях крупнейшие Итальянские СМИ, в числе которых Corriere della Sera и La Stampa.

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

Устройства проверялись немецкими спецслужбами по просьбе президента Евросовета Хермана Ван Ромпея, причем, как утверждается, устройства были переданы на экспертизу через несколько дней после окончания саммита, а результаты стали известны только сейчас.

Российская сторона опровергла все обвинения, пресс-секретарь президента Российской Федерации Дмитрий Песков прокомментировал ситуацию, сообщив, что, по его мнению, эти статьи являются заказными и написаны с целью отвлечь внимание общественности от проблемы шпионажа США за Европейскими странами.

ссылка на оригинал статьи http://habrahabr.ru/post/200378/

Публикуем веб приложения Ruby, Python, Node.js, Perl и Java в Azure Cloud Services

image В этой статье мы рассмотрим способ разворачивания веб приложений, написанных с использованием различных технологий, в облаке Azure Cloud Services. А именно это будет Ruby, Python, Node.js, Perl и с некоторыми оговорками также Java и Railo (ColdFusion). В качестве примера Ruby приложения будем использовать Redmine, работающий на Ruby on Rails, в Python пойдет Lightning Fast Shop, работающий на Django, в Node.js будем использовать небольшой проект с использованием express.js, на Perl будем ставить пустой проект Mojolicious. Целью данной статьи не является экскурс по всем этим веб технологиям, а лишь показать удобный и универсальный способ публикации в облаке Azure. Так что кода на Ruby, Python или Perl в ней не будет. Зато будет много скриншотов, shell-скриптов и инструкций по упаковке и развертыванию приложений.

Итак, что же такое Azure Cloud Services и с чем его едят:

К сожалению, обилие маркетинговых материалов в сети плохо раскрывает эту тему и создает много шума. А мы попробуем обсудить этот вопрос человеческим языком, понятным для простых веб разработчиков. Во первых, что важно понимать разработчику, который хочет узнать как пользоваться Azure Cloud Services, это то что данная услуга фактически представляет собой фабрику виртуальных машин. Как это реализовано технически не так важно, главное, что нам интересно это то, что инфраструктура Azure может достаточно быстро и автоматически предоставить нам некоторое количество идентичных виртуальных машин с некоторым количеством ресурсов, на которых может работать наш веб сайт или другое приложение.

В системе Azure все эти виртуальные машины примерно одинаковые и могут быть Windows Server 2008, 2008 R2 и 2012. Видимо, это сделано потому что создание таких виртуальных машин обходится системе достаточно дешево и сами эти машины потребляют не много ресурсов плюс одинаковыми виртуалками легко управлять. Хотя лично мне не известно внутреннее устройство Azure Cloud Services и это лишь предположение. Главное отличие от VPS-хостинга в том что нам не нужно настраивать эти виртуальные машины. Система Azure сама развернет виртуальную машину и сама установит на нее наше приложение, когда это будет нужно. Это позволяет динамически создавать и удалять виртуальные машины по мере необходимости, автоматически и без нашего участия. Для того чтобы реализовать эту технологию наше приложение должно быть особым образом написано и упаковано, чтобы система знала как его устанавливать.

Зачем это выгодно нам: В первую очередь это экономия ресурсов, а значит и наших денег (зависит, конечно, от цены услуги). Сайтам не все время нужно максимальное количество ресурсов. Если покупая VPS или Dedicated хостинг мы вынуждены брать максимальную конфигурацию, которая нам может потребоваться, то в случае с Azure Cloud Services мы можем платить только за те виртуальные машины, которые нам нужны в данный момент. Когда нагрузка на ресурс будет возрастать, система Azure будет автоматически выделять новые виртуальные машины для обслуживания нашего сайта. Когда нагрузка упадет, виртуальные машины вернуться системе и мы не будем за них платить.

Зачем это нужно хостеру (в данном случае Microsoft): Причина та же – экономия ресурсов. Обычно разным сайтам и сервисам максимальное количество ресурсов нужно не одновременно. Значит, это позволяет провайдеру захостить больше веб сайтов на меньшем количестве физических ресурсов. Та же экономия, как и в случае с shared hosting – не всем нужна пиковая нагрузка одновременно. Поэтому shared hosting обычно и стоит дешевле.

А теперь неприятный момент – это усложняет разработку приложения и привязывает нас к платформе. Вернее не усложняет, а немного меняет подход, делает его не столь привычным. Ведь обычно разработчики привыкли, что есть некоторый сервер, к которому можно открыть SSH сессию или RDP, где выполнить различные команды по конфигурации нужной им среды. Несмотря на то, что теоретически в системе Azure Cloud Services тоже можно открыть RDP к виртуальной машине, толку от этого чуть, разьве что в отладочных целях. Ведь через 5 минут система может наплодить еще десяток таких «серверов» которые не будут сконфигурированы вами вручную. А потом и вовсе удалить ваш настроенный сервер без предупреждения.

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

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

Ruby

Начнем с Ruby и рассмотрим на ее примере все основные положения, так что эта глава будет самой длинной. Если вы с Ruby не работали – ничего страшного. Мы практически не будем использовать специфических команд, а действия по настройке всех платформ однотипны. Во первых нам понадобится рабочая станция Windows. Мы будем использовать Helicon Zoo для запуска Ruby приложений на IIS как на рабочей станции, так и в системе Azure. Мало того что так будет легче конфигурировать среду выполнения для нашего приложения, такая конфигурация в Azure создаст значительно лучшее и более надежное с точки зрения производительности решение, чем запуск Ruby процесса с встроенным сервером на 80-м порту, как это часто делают в других инструкциях. Плюс запуск приложения в IIS еще и позволит нам включить в приложение другие технологии и возможности самого IIS, добавить к сайту секции на ASP.NET и других языках перечисленных в этой статье, сконфигурировать SSL и URL Rewriting, полноценно использовать многоядерные машины, отгружать статические данные средствами самого IIS что также значительно сэкономит ресурсы, и многое другое.

Если вы уже работали с Ruby, то возможно на вашей рабочей станции уже есть установленная и сконфигурированная версия Ruby, с установленными gem-ами и т.д. Это все хорошо, но как ее перенести в Azure Cloud Services? Используя же пакеты Helicon Zoo, мы сможем упаковать все зависимости приложения в один архив, что позволит нам легко переносить его на другие сервера и в Azure Cloud Services в том числе. Так что для верности мы будем устанавливать свежую версию Ruby из репозитория Helicon Zoo, независимо от наличия другого Ruby на вашей машине.

Итак, пройдем по ссылке и установим Microsoft Web Platform Installer. Запустим его и нажмем Options и в открывшемся окне добавим Helicon Zoo feed: http://www.helicontech.com/zoo/feed.xml

На рабочей станции советую также выбирать IIS Express в качестве сервера, т.к. с ним будет проще работать для тестов и потребуется меньше настроек.

Далее нужно установить Windows Azure SDK и легче всего это сделать, воспользовавшись все тем же Web Platform Installer. Введите в поиске «Azure SDK 2.1» или просто нажмите на эту ссылку. Если на момент прочтения статьи версия SDK устареет и ссылка не будет работать, просто найдите более новую в списке:

В Azure SDK входит набор утилит по созданию и тестированию пакетов для Windows Azure Cloud Services, который нам и понадобится. Мы будем использовать утилиты командной строки и не будем использовать Visual Studio и другие инструменты по автоматической публикации сайтов, так как я старался минимизировать количество «магии» в статье. Тем более раз мы публикуем приложение на Ruby, то сомнительно, что именно Visual Studio будет вашим инструментом разработки. Поэтому я предлагаю ставить именно базовый Azure SDK, а не Azure SDK for Ruby. В последний уже входит некоторый дистрибутив Ruby и набор конфигураций, которые возможно и не плохи, но определенно не те, которые будут использованы в этой статье. Если вы все же привыкли использовать Visual Studio для создания пакетов Azure, то для вас не составит труда создать нужный пакет вручную, пользуясь этой статьей.

Теперь давайте создадим Ruby приложение на нашей рабочей станции. Если у вас уже есть готовое Ruby Rack приложение, то вам нужно запустить Web Platform Installer, и установить «Ruby project» из секции Zoo -> Templates. Далее следуйте инструкциям на пригласительной странице получившегося шаблонного сайта.

Однако всем уже, похоже, надоела установка «Hello World» приложений, а написание более продвинутого кода выходит за рамки этой статьи, поэтому мы просто будем ставить Redmine, как достаточно сложное и известное Ruby on Rails приложение с открытым кодом. Для этого откройте все тот же Web Platform Installer, зайдите в Zoo -> Applications и установите Redmine. По завершении установки запустится процесс развертывания приложения, который просто автоматически выполняет шаги, описанные в этой статье(англ.) в разделе Manual installation.

При этом никакой предварительной установки Ruby, Dev Kit, gem-ов и даже самого IIS Express не требуется – обо всем позаботится Web Platform Installer и Helicon Zoo. Все требуемые пакеты будут загружены из интернет и установлены на вашу рабочую станцию. После окончания установки всех компонентов вы должны увидеть первую страницу Redmine. Конечно, по-хорошему еще нужно сконфигурировать правильную базу данных, но для нашего теста уже вполне достаточно используемой по умолчанию SQLite.

Обратите внимание на структуру файлов получившегося сайта (может понадобится нажать F5 в WebMatrix чтобы обновить вид папок):

В папке GEM_HOME собраны все gem-ы, от которых зависит наше приложение. Именно оттуда они и будут загружаться во время работы. Файл deploy_done.rb – это скрипт deploy.rb, выполнение которого мы наблюдали на предыдущем шаге, на странице с сообщением «Application deployment in progress». По завершении его выполнения Helicon Zoo переименовал этот файл в deploy_done.rb, чтобы исключить повторный запуск без надобности. Если вам понадобится запустить процесс по-новой, просто переименуйте этот файл обратно в deploy.rb и со следующего запроса к серверу скрипт будет запущен снова. В этом скрипте содержатся стандартные команды нахождения и установки недостающих зависимостей, создания при необходимости и миграций базы данных и т.п. Это один из способов как выполнять команды в контексте приложения подробнее о котором можно прочитать в документации Helicon Zoo(англ.). Другой способ – это запустить Helicon Zoo Manager (for IIS Express) из Start -> Programs -> Helicon –> Zoo, а там, выбрав наше приложение, можно нажать на Start Web console или Start IDE.

Web console позволяет выполнять команды в контексте приложения и от лица пользователя этого приложения (Application pool user в случае IIS и интерактивного пользователя в случае IIS Express), как на локальной машине, так и на удаленном сервере. Кнопка Start IDE позволяет запустить программу (по умолчанию это будет командная строка cmd.exe) в предварительно сконфигурированной среде из переменных и путей для выбранного веб приложения. Это также позволит выполнять команды, которые будут применены к нашему приложению, а не глобально к системе. Большинство современных IDE, таких как Aptana или PyCharm, имеют встроенную командную строку, корректно распознают эти переменные и позволяют работать с локальными папками приложения более-менее изолированно и выполнять команды прямо из среды. Так что я рекомендую сконфигурировать запуск вашего любимого IDE по кнопке Start IDE и выполнять все команды оттуда. Еще можно экспортировать переменные окружения в .cmd-файл нажав на Tools -> Export application environment. Этот файл затем можно вызывать перед выполнением других скриптовых команд предназначенных для приложения и он установит требуемые пути и переменные среды. Это удобно если например вам нужно применить команды к приложению по таймеру из Windows Scheduler.

Почему так важно использовать именно эти инструменты? Потому что они позволяют упаковать все зависимости внутрь приложения. Ведь наше приложение будет отправлено для работы на Azure Cloud Services и нам нужно иметь при себе все необходимые зависимости. Разумеется, мы могли бы выполнять Ruby команду ‘bundle install’ чтобы скачать из интернета и установить все зависимости каждый раз, когда новый узел Cloud Services входит в строй. Однако тогда наше приложение будет зависеть еще и от работы сервиса rubygems.org и других интернет ресурсов, 100% доступность которых под вопросом. К тому же всегда есть вероятность, что мы забудем указать точную версию какого ни будь gem-а из вторичных зависимостей и наше приложение вдруг перестанет работать с выходом новой, несовместимой версии gem-а, хотя мы вроде бы ничего и не меняли. Помножите все эти вероятности, и вы получите не такой уж и привлекательный аптайм. Значит, нам нужно минимизировать число внешних зависимостей, чтобы по возможности при установке из интернета не качалось ничего – тогда все новые виртуальные машины будут точными копиями друг друга.

И тут есть один тонкий момент – привычка. Если например программисты на Java привыкли что все зависимости должны быть упакованы с приложением как само собой разумеющееся, то программисты на Ruby больше привыкли конфигурировать сервер руками и на свое усмотрение. Так что работа с Helicon Zoo потребует некоторой дисциплины, а именно: нельзя запускать консоль или IDE для работы с приложением, даже на вашей рабочей станции, предварительно не сконфигурировав пути к приложению. Сделать это можно либо запустив консоль и IDE из Helicon Zoo Manager, либо выполнив экспортированный из приложения environment.cmd файл перед запуском других команд. Отсюда также следует, что нельзя устанавливать gem-ы и другие модули глобально. Пользуясь этими правилами можно получить легко портируемое приложение, которое удобно переносить с одного сервера на другой.

Так как мы устанавливали Redmine прямо из репозитория Helicon Zoo, то все зависимости были установлены в приложение автоматически. Теперь, чтобы перенести наш Redmine на другой сервер, нам понадобится лишь установить Helicon Zoo -> Ruby Hosting Package на этом сервере и перенести саму папку с сайтом. В пакет Ruby Hosting Package уже входит Ruby разных версий, Dev kit, Helicon Zoo Module и все другие зависимости что могут пригодится на сервере. Вместо установки Ruby Hosting Package можно в принципе установить только требуемые пакеты из репозитория Helicon Zoo отдельно, чтобы сэкономить место. Однако тут повышается вероятность что-то пропустить, да и места дистрибутивы Ruby занимают не так много чтобы экономить.

На сервере мы не будем качать пакеты Ruby и Helicon Zoo из интернета чтобы не зависить от доступности дистрибутивов и серверов. Для этого также существует способ упаковать все один раз, чтобы потом устанавливать из архива. Мы используем Web Platform Installer и утилиту командной строки WebpiCMD.exe. Найти ее можно обычно в папке установки Web Platform Installer: C:\Program Files\Microsoft\Web Platform Installer. Эта утилита может упаковывать продукты из Web Platform Installer для их последующей установки без подключения к интернет.

Для начала запустите консоль с административными правами, кликнув на ней правой кнопкой и выбрав пункт ‘Run as administrator’:

Это нужно чтобы не открывалось новое окно консоли при запуске WebpiCMD.exe, иначе читать вывод команды будет затруднительно. Сохранять установочные пакеты будем в самой директории сайта с Redmine в папку ‘offline-package’. Т.к. я устанавливал Redmine под IIS Express, то мой сайт находится в папке ‘C:\Users\Slov\Documents\My Web Sites\redmine222‘. В вашем случае имя папки будет другим, так что исправьте это в следующей команде и выполните в консоли:

mkdir "C:\Users\Slov\Documents\My Web Sites\redmine222\offline-package"  WebpiCmd.exe /offline /Products:<b>RubyHostingPackage</b> /Path:"C:\Users\Slov\Documents\My Web Sites\redmine222\offline-package" /Feeds:http://www.helicontech.com/zoo/feed.xml

Как видно из команды мы указываем продукт, который должен быть сохранен для offline-установки. При этом WebpiCmd.exe сохранит все его возможные зависимости, битности и т.п. В команду пеердается путь к папке куда сохранять пакеты и URL репозитория Helicon Zoo, откуда все эти пакеты и берутся. Весь процесс может занять некоторое время. Помните, что многие shell-команды не любят пробелы в пути, так что не забываем кавычки. Эта команда сохранит продукт RubyHostingPackage и все его возможные зависимости в папку ‘offline-package’ внутри нашего веб сайта. Затем содержимое этой папки можно будет использовать, чтобы установить пакет Ruby Hosting Package на другой машине. На момент написания статьи в Helicon Zoo входит семь хостинг пакетов и имена у них следующие:

CFMLHostingPackage    CFML Hosting Package JavaHostingPackage    Java Hosting Package RubyHostingPackage    Ruby Hosting Package NodejsHostingPackage  Node.js Hosting Package PerlHostingPackage    Perl Hosting Package PHPHostingPackage     PHP Hosting Package PythonHostingPackage  Python Hosting Package

Более подробно про оффлайн установку можно почитать на английском по этой ссылке. Посмотреть внутренние имена всех доступных продуктов можно воспользовавшись ключем /List команды WebpiCmd.exe. Оригинальная английская документация к утилите WebpiCMD.exe находится здесь.

Если вы посмотрите на структуру получившейся папки ‘offline-package’, то в папке bin увидите что WebpiCMD.exe очень кстати уже включил рабочую копию самого себя в пакет. Именно его мы будем вызывать на виртуальной машине Azure Cloud Services, чтобы установить нужные зависимости обратно из пакета.

Прежде чем упаковать наш сайт для Azure, нужно добавить к нему скрипт, который будет устанавливать все зависимости на виртуальной машине. По правилам Azure этот скрипт должен находиться в директории bin под корнем самого сайта. Назовем этот файл startup.cmd. Вот его содержимое:

[bin\startup.cmd]

echo Starting installation...  rem Дать права на чтение и запись папке куда распаковано приложение icacls "%RoleRoot%\approot" /grant "Everyone":F /T  rem Локальная папка AppData с правами на запись нужна для работы Web Platform Installer rem Создадим эту папку и ключ реестра на нее указывающий md "%RoleRoot%\appdata" reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" ^     /v "Local AppData" /t REG_EXPAND_SZ /d "%RoleRoot%\appdata" /f  rem Перейдем в папку с WebpiCmd.exe pushd "%RoleRoot%\approot\offline-package\bin"  rem Вызов команды WebpiCmd.exe для установки продукта из папки offline-package rem Обратите внимание на имя продукта - RubyHostingPackage, а также логи в install.txt и install-error.txt WebpiCmd.exe /install /Products:RubyHostingPackage /XML:%RoleRoot%\approot\offline-package\feeds\latest\webproductlist.xml ^              /Feeds:%RoleRoot%\approot\offline-package\feeds\latest\supplementalfeeds\feed.xml ^ 			 /AcceptEula >%RoleRoot%\approot\public\install.txt 2>%RoleRoot%\approot\public\install-error.txt  popd  rem Вернуть старое значение ключу реестра с AppData reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" ^     /v "Local AppData" /t REG_EXPAND_SZ /d %%USERPROFILE%%\AppData\Local /f   rem Тут можно выполнить другие действия, например удалить временные файлы.  echo Completed installation. 

Переменная %RoleRoot% будет указывать куда устанавливается наша роль, а папка %RoleRoot%\approot соответственно будет корневой папкой сайта. Главной строкой в этом файле является вызов WebpiCmd.exe. Обратите внимание на перенаправление вывода логов установки в файл install.txt, а вывод STDERR будет в файле install-error.txt – оба в папку public корня получившегося сайта. Можно будет потом запросить эти файлы по URL чтобы прочитать возможные ошибки установки, если опыт не удастся с первого раза. Первой строкой устанавливаются права на запись в папку с сайтом – эти права нужны самому Redmine для работы, т.к. Ruby приложения часто пишут в папку с приложением.

Теперь настало время упаковать сайт для Azure Cloud Services. Сайт у меня находится в папке «C:\Users\Slov\Documents\My Web Sites\redmine222». Перейдем консолью в папку выше нашего сайта – у меня это будет папка «C:\Users\Slov\Documents\My Web Sites\». Здесь нам понадобится создать три файла: файл конфигурации сервиса *.cscfg, файл с параметрами для создания пакета *.csdef и файл cmd скрипта которым будет удобно все это упаковать. Вот эти файлы с некоторыми комментариями:

[remine222.csdef]

<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="WindowsAzure2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2013-03.2.0">   <WebRole name="redmine222" vmsize="Small">     <Sites>       <Site name="Web"  physicalDirectory="./redmine222">         <Bindings>           <Binding name="Endpoint1" endpointName="Endpoint1" />         </Bindings>       </Site>     </Sites>     <Endpoints>       <InputEndpoint name="Endpoint1" protocol="http" port="80" />     </Endpoints>     <Startup>       <Task commandLine="startup.cmd" executionContext="elevated" taskType="simple" >       </Task>     </Startup>   </WebRole> </ServiceDefinition> 

Имя роли и имя папки, где она находится, почему-то должны совпадать.

[redmine222.cloud.cscfg]

<?xml version="1.0" encoding="utf-8"?> <ServiceConfiguration serviceName="WindowsAzure2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="2" osVersion="*" schemaVersion="2013-03.2.0">   <Role name="redmine222">     <Instances count="1" />     <ConfigurationSettings>     </ConfigurationSettings>   </Role> </ServiceConfiguration>

Описания и форматы этих файлов можно найти в интернете и в самой документации к Windows Azure, так что опустим подробности.

[redmine222.pack.cmd]

@echo off  set WINDOWS_AZURE_SDK_PATH="C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.1"  call %WINDOWS_AZURE_SDK_PATH%\bin\setenv.cmd  pushd %~dp0  if "%ServiceHostingSDKInstallPath%" == "" (     echo Can't see the ServiceHostingSDKInstallPath environment variable. Please run from a Windows Azure SDK command-line (run Program Files\Windows Azure SDK\^<version^>\bin\setenv.cmd^).     GOTO :eof )  rem Тут можно удалить временные файлы, остановить IIS и т.п. rem iisreset /stop  rem Переименовать deploy_done.rb в deploy.rb чтобы запустить процесс деплоя по новой ren redmine222\deploy_done.rb deploy.rb  rem Эта команда создает пакет для Windows Azure cspack redmine222.csdef /out:redmine222.cspkg  popd

Обратите внимание на строчку

ren redmine222\deploy_done.rb deploy.rb

Эта команда переименовывает файл deploy_done.rb в deploy.rb, что приведет к повторному запуску деплой-скрипта в Helicon Zoo при первом запросе к развернувшемуся приложению. Если мы правильно упаковали все модули и нам не нужно мигрировать базу данных, то этот шаг не обязателен и может сэкономить время. Однако вероятность того что с первого раза все будет правильно упаковано не очень высока, поэтому для первых попыток я рекомендую оставить эту строчку.

Еще одной рекомендацией будет отредактировать файл web.config корня сайта и добавить такую строчку в секцию <system.webServer>:

<httpErrors existingResponse="PassThrough" />

Эта строчка включает выдачу подробных сообщений о 500-й ошибке при внешних запросах к IIS. Без этой строчки если что-то сломается в приложении, то текста ошибки вы не увидите, а только сухое сообщение ‘Server error’. Для работы в production режиме эту строку лучше убрать, но для первого запуска она может пригодиться.

По этой ссылке вы можете найти примеры описанных выше файлов в соответствии со структурой папок проекта – чтобы было понятнее что куда ложить.

Все, файлы готовы. Теперь перед вызовом redmine222.pack.cmd нужно остановить IIS или IIS Express на рабочей станции, чтобы разблокировать файлы приложения. Затем вызвать redmine222.pack.cmd из нашей консоли с административными правами. Процесс упаковки займет какое-то время и в результате у нас получится файл redmine222.cspkg, который фактически представляет собой ZIP архив со всеми необходимыми пакетами. Размер этого файла у меня получился 138 мегабайт, что немало, т.к. в него включены версии Ruby 1.8, 1.9, две версии Ruby DevKit, Helicon Zoo Module, Microsoft URL Rewrite, сам Redmine и все требуемые для его работы gem-ы. Зато этот архив включает в себя все зависимости и нам не придется ничего качать из интернета, а сам же архив будет передан внутри сети Azure, что, смею надеяться, значительно быстрее.

Теперь перейдем в портал управления Windows Azure. Нужно создать новый Cloud Service и выбрать ему URL:

Затем нужно выбрать «New staging deployment»:

Выбрать наши файлы с Redmine из локальной папки. Нужно указать флаг «Deploy even if role contain a single instance», потому что в файле redmine222.csdef мы указали использовать один экземпляр роли, чего достаточно для тестов, хотя в реальных условиях вам, скорее всего, понадобится увеличить это число.

После чего начнется процесс загрузки пакета в Azure, создания новой виртуальной машины, разворачивания нашего пакета с приложением на этой виртуальной машине и выполнение установочных скриптов. Процесс довольно длительный, у меня он занимает минут 20 – не меньше. Когда все процессы установки будут завершены, нажмите на ссылку Site URL.

Вы должны увидеть страницу Applcation deployment из Helicon Zoo, которая затем обновится на домашнюю страницу Redmine:

Чтобы затем ваш веб сайт стал виден пользователям под более приемлемым доменным именем, вам нужно в настройках вашего домена у регистратора указать либо CNAME запись на доменное имя внутри .cloudapp.net (предпочтительно) или указать ‘A’-record вашего домена на публичный IP адрес вашего Azure-приложения. Сам же Microsoft не занимается предоставлением услуг по регистрации доменов.

Python

В этой главе мы рассмотрим, как установить вручную приложение, которое не входит в репозиторий Helicon Zoo. Для этого мы будем использовать приложение Lightning Fast Shop (LFS) с открытым исходным кодом, написанное на Python с использование Django. Шаги по публикации приложения в Azure Cloud Service будут практически идентичны с прошлой главой, а вот шаги по развертыванию приложения на рабочей станции будут другими.

Итак, ставим Microsoft Web Platform Installer, Helicon Zoo feed и Windows Azure SDK, как в прошлой главе, если еще что-то из этого не установлено. Запускаем Web Platform Installer и устанавливаем Zoo -> Templates -> Python project на IIS Express.

Запустится WebMatrix и откроется новый сайт:

Мы только что установили шаблонный проект для Python. В этом проекте уже сконфигурирован virtualenv, который и будет использован для установки всех модулей и зависимостей внутрь сайта. Для запуска своего проекта на Python можно идти дальше по инструкции на пригласительной странице Python project. Только не забывайте запускать консоль или IDE (например PyCharm ) используя Helicon Zoo Manager, чтобы консоль запускалась с предварительно сконфигурированным virtualenv, иначе команды не найдут путей к нашему приложению.

Lightning Fast Shop достаточно большая и капризная в установке программа, поэтому я прошу вас шаг за шагом повторить следующую инструкцию по его ручной установке на IIS и Helicon Zoo. Я не буду давать слишком подробных объяснений, что происходит, потому что происходящее имеет отношение к особенностям проекта LFS, а не к Helicon Zoo или Azure. Настройка другого проекта может идти по другому сценарию. В случае неудачи попробуйте начать с более мелких и простых проектов, следуя инструкциям из Python project. Проект LFS я выбрал просто для того чтобы показать что не только «Hello World» можно запускать на Azure Cloud Services.

  1. Скачайте диструбутив LFS с официального сайта. Я выбрал версию 0.7.7. Нужно скачать обязательно installer-версию, у которой имя файла вроде django-lfs-installer-0.7.7.tar.gz.
    В архиве будет папка ‘lfs-installer’ – распакуйте её содержимое в корень сайта с нашим Python project (в моем случае это папка C:\Users\Slov\Documents\My Web Sites\ZooPythonProject2).
    Запустите Helicon Zoo Manager, выберете нужный сайт с проектом и нажмите на Start IDE, чтобы запустить сконфигурированную консоль.
    В консоли введите:
    python bootstrap.py

    Затем

    bin\buildout –v

    Затем отредактируйте файл lfs_project\settings.py и замените секцию DATABASES следующим текстом, для использования в проекте SQLite:

    DATABASES = {     'default': {         'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.         'NAME': os.path.join(DIRNAME, 'sqlite3.bd'),                      # Or path to database file if using sqlite3.         'USER': '',                      # Not used with sqlite3.         'PASSWORD': '',                  # Not used with sqlite3.         'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.         'PORT': '',                      # Set to empty string for default. Not used with sqlite3.     } }

    Затем введите в консоли последовательно такие команды:

    bin\django syncdb bin\django lfs_init bin\django collectstatic

    Если все выполнилось без ошибок, то теперь можно запустить тестовый сервер Django, чтобы проверить работу проекта LFS отдельно от веб сервера IIS. Выполните в консоли:

    bin/django runserver

    И затем откройте в браузере http://localhost:8080/

    Теперь, чтобы запустить проект на IIS через Helicon Zoo, нужно задать PYTHONPATH в файле web.config. У LFS он длинный и включает в себя множество egg-пакетов. Найти его можно в файле bin\django_script.py:

    #!"C:\Users\Slov\Documents\My Web Sites\ZooPythonProject2\venv\Scripts\python.exe"  import sys sys.path[0:0] = [   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django_lfs-0.7.6-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\gunicorn-18.0-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\djangorecipe-1.1.2-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django-1.3.1-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\zc.recipe.egg-2.0.1-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\zc.buildout-2.2.1-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\south-0.7.3-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\pillow-1.7.5-py2.7-win32.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\lfs_order_numbers-1.0b1-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\lfs_contact-1.0-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django_tagging-0.3.1-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django_reviews-0.2.1-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django_postal-0.9-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django_portlets-1.1.1-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django_paypal-0.1.2-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django_pagination-1.0.7-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django_lfstheme-0.7.3-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django_compressor-1.1.1-py2.7.egg',   'c:\\users\\slov\\documents\\my web sites\\zoopythonproject2\\venv\\lib\\site-packages',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django_piston-0.2.3-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django_countries-1.5-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\django_appconf-0.6-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\eggs\\six-1.4.1-py2.7.egg',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\parts\\django',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\parts',   'c:\\users\\slov\\docume~1\\mywebs~1\\zoopyt~1\\lfs_project',   ]  import djangorecipe.manage  if __name__ == '__main__':     sys.exit(djangorecipe.manage.main('lfs_project.settings'))

    Как видно там абсолютные пути, что нам не подходит, ведь проект будет переносится в Azure. Для задания PYTHONPATH через web.config эти пути нужно переделать в такой, немного странный формат. Вот фрагмент моего web.config:

    <?xml version="1.0" encoding="UTF-8"?>  <configuration>   <system.webServer>   <heliconZoo>    <application name="python.project">     <environmentVariables>         <add name="VIRTUAL_ENV" value="%APPL_PHYSICAL_PATH%\venv" />         <add name="PATH" value="%APPL_PHYSICAL_PATH%\venv\Scripts;%PATH%" />         <add name="PYTHONPATH" value=".\eggs\django_lfs-0.7.6-py2.7.egg         ;.\eggs\gunicorn-18.0-py2.7.egg         ;.\eggs\djangorecipe-1.1.2-py2.7.egg         ;.\eggs\django-1.3.1-py2.7.egg         ;.\eggs\zc.recipe.egg-2.0.1-py2.7.egg         ;.\eggs\zc.buildout-2.2.1-py2.7.egg         ;.\eggs\south-0.7.3-py2.7.egg         ;.\eggs\pillow-1.7.5-py2.7-win32.egg         ;.\eggs\lfs_order_numbers-1.0b1-py2.7.egg         ;.\eggs\lfs_contact-1.0-py2.7.egg         ;.\eggs\django_tagging-0.3.1-py2.7.egg         ;.\eggs\django_reviews-0.2.1-py2.7.egg         ;.\eggs\django_postal-0.9-py2.7.egg         ;.\eggs\django_portlets-1.1.1-py2.7.egg         ;.\eggs\django_paypal-0.1.2-py2.7.egg         ;.\eggs\django_pagination-1.0.7-py2.7.egg         ;.\eggs\django_lfstheme-0.7.3-py2.7.egg         ;.\eggs\django_compressor-1.1.1-py2.7.egg         ;.\venv\lib\site-packages         ;.\eggs\django_piston-0.2.3-py2.7.egg         ;.\eggs\django_countries-1.5-py2.7.egg         ;.\eggs\django_appconf-0.6-py2.7.egg         ;.\eggs\six-1.4.1-py2.7.egg         ;.\parts\django         ;%APPL_PHYSICAL_PATH%         ;.\parts         ;.\lfs_project" />         <add name="WSGI_APP" value="welcome.application" />         <add name="CONSOLE_URL" value="console" />         <add name="DEPLOY_FILE" value="deploy.py" />         <add name="ERROR_LOG_DIR" value="log" />         <add name="IDE" value="C:\Windows\system32\cmd.exe" />

    Можете скопировать к себе в web.config, однако если вы настраиваете версию отличную от 0.7.7, то ваш PYTHONPATH может отличаться.

    Также установим переменную DJANGO_SETTINGS_MODULE в web.config:

    <!-- django project --> <add name="DJANGO_SETTINGS_MODULE" value="lfs_project.settings" />

    Теперь содержимое папки ‘\lfs_project\sitestatic’ нужно перенести в папку ‘\static’ в корне сайта.

    Все, проект готов к запуску на IIS. Нажмите на ссылку в WebMatrix и вы должны увидеть домашнюю страницу LFS.

    Структура папок в результате вышла следующая:

    Дальше подготовим пакет для Azure Cloud Services. Запустите Helicon Zoo Manager, выберете нужный сайт и нажмите Start IDE для запуска консоли. Web console тут не подойдет, т.к. у нее будет недостаточно прав. Выполните там следующие команды:

    mkdir offline-package  WebpiCmd.exe /offline /Products:PythonHostingPackage /Path:"offline-package" /Feeds:http://www.helicontech.com/zoo/feed.xml

    Это сохранит Python Hosting Package в директории offline-package внутри сайта.

    Затем создайте три файла для Azure Cloud Services в папке ‘My Documents\My Web Sites’, как в предыдущей главе. Я выделил жирным те строчки, которые в этих файлах отличаются от предыдущих:

    [LFS.Cloud.cscfg]

    <?xml version="1.0" encoding="utf-8"?> <ServiceConfiguration serviceName="WindowsAzure2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="2" osVersion="*" schemaVersion="2013-03.2.0">   <Role name="ZooPythonProject2">     <Instances count="1" />     <ConfigurationSettings>     </ConfigurationSettings>   </Role> </ServiceConfiguration>

    [LFS.csdef]

    <?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="WindowsAzure2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2013-03.2.0">   <WebRole name="ZooPythonProject2" vmsize="Small">     <Sites>       <Site name="Web"  physicalDirectory="./ZooPythonProject2">         <Bindings>           <Binding name="Endpoint1" endpointName="Endpoint1" />         </Bindings>       </Site>     </Sites>     <Endpoints>       <InputEndpoint name="Endpoint1" protocol="http" port="80" />     </Endpoints>     <Startup>       <Task commandLine="startup.cmd" executionContext="elevated" taskType="simple" >       </Task>     </Startup>   </WebRole> </ServiceDefinition>

    [LFS.pack.cmd]

    @echo off  set WINDOWS_AZURE_SDK_PATH="C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.1"  call %WINDOWS_AZURE_SDK_PATH%\bin\setenv.cmd  pushd %~dp0  if "%ServiceHostingSDKInstallPath%" == "" (     echo Can't see the ServiceHostingSDKInstallPath environment variable. Please run from a Windows Azure SDK command-line (run Program Files\Windows Azure SDK\^<version^>\bin\setenv.cmd^).     GOTO :eof )  rem Тут можно удалить временные файлы, остановить IIS и т.п. rem iisreset /stop <b>del /s /q *.log *.pyc *.pyo</b>   rem Эта команда создает пакет для Windows Azure cspack lfs.csdef /out:lfs.cspkg  popd

    И осталось создать файл \bin\startup.cmd в корне сайта:

    echo Starting installation...  rem Дать права на чтение и запись папке куда распаковано приложение icacls "%RoleRoot%\approot" /grant "Everyone":F /T  rem Локальная папка AppData с правами на запись нужна для работы Web Platform Installer rem Создадим эту папку и ключ реестра на нее указывающий md "%RoleRoot%\appdata" reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" ^     /v "Local AppData" /t REG_EXPAND_SZ /d "%RoleRoot%\appdata" /f  rem Перейдем в папку с WebpiCmd.exe pushd "%RoleRoot%\approot\offline-package\bin"  rem Вызов команды WebpiCmd.exe для установки продукта из папки offline-package rem Обратите внимание на имя продукта - <b>PythonHostingPackage</b>, а также логи в install.txt и install-error.txt WebpiCmd.exe /install /Products:PythonHostingPackage /XML:%RoleRoot%\approot\offline-package\feeds\latest\webproductlist.xml ^              /Feeds:%RoleRoot%\approot\offline-package\feeds\latest\supplementalfeeds\feed.xml /AcceptEula  ^              >%RoleRoot%\approot\static\install.txt 2>%RoleRoot%\approot\static\install-error.txt  popd  rem Вернуть старое значение ключу реестра с AppData reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" ^     /v "Local AppData" /t REG_EXPAND_SZ /d %%USERPROFILE%%\AppData\Local /f   rem Тут можно выполнить другие действия, например удалить временные файлы.  echo Completed installation. 

    В этом архиве вы найдете пример описанных выше файлов.

    Выполните LFS.pack.cmd. Получившийся файл LFS.cspkg у меня занимает 70мб.

    Удалим старый Staging Environment из Azure Portal и создадим новый. Передадим файлы как в предыдущей главе и ожидаем запуска.

    Когда строчка «Not all instances are ready» пропадет, можно открывать ссылку, где мы должны увидеть работающий Lightning Fast Shop в Azure Cloud Services.

    Node.js

    Теперь на очереди Node.js. Итак, запускаем Microsoft Web Platform Installer и устанавливаем Zoo -> Templates -> Node.js project. Все зависимости будут установлены автоматически.

    После запуска проект развернется во вполне готовое Model-View-Route приложение, построенное на базе express.js, sqlite3, persist.js и Twitter Bootstrap. В этом шаблоне для примера уже будет простенький блог и административная панель к нему. Такое приложение может быть хорошей отправной точкой для создания собственного сайта. Если же у вас уже есть готовый Node.js веб сайт, то вы, очевидно, знаете назначение всех прописанных в шаблонном проекте файлов. Просто перезапишите свои файлы поверх, оставляя web.config нетронутым, и ваше приложение должно заработать.

    Этот простенький блог мы и будем устанавливать на Azure Cloud Services. Как и в предыдущих главах – запустим Helicon Zoo Manager и нажмем Start IDE или Start web console. В консоли наберем:

    mkdir offline-package  WebpiCmd.exe /offline /Products:NodejsHostingPackage /Path:"offline-package" /Feeds:http://www.helicontech.com/zoo/feed.xml

    Дальше создадим файл bin\startup.cmd:

    [bin\startup.cmd]

    echo Starting installation...  rem Дать права на чтение и запись папке куда распаковано приложение icacls "%RoleRoot%\approot" /grant "Everyone":F /T  rem Локальная папка AppData с правами на запись нужна для работы Web Platform Installer rem Создадим эту папку и ключ реестра на нее указывающий md "%RoleRoot%\appdata" reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" ^     /v "Local AppData" /t REG_EXPAND_SZ /d "%RoleRoot%\appdata" /f  rem Перейдем в папку с WebpiCmd.exe pushd "%RoleRoot%\approot\offline-package\bin"  rem Вызов команды WebpiCmd.exe для установки продукта из папки offline-package rem Обратите внимание на имя продукта – NodejsHostingPackage, а также логи в install.txt и install-error.txt WebpiCmd.exe /install /Products:NodejsHostingPackage /XML:%RoleRoot%\approot\offline-package\feeds\latest\webproductlist.xml ^              /Feeds:%RoleRoot%\approot\offline-package\feeds\latest\supplementalfeeds\feed.xml ^              /AcceptEula  >%RoleRoot%\approot\public\install.txt 2>%RoleRoot%\approot\public\install-error.txt  popd  rem Вернуть старое значение ключу реестра с AppData reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" ^     /v "Local AppData" /t REG_EXPAND_SZ /d %%USERPROFILE%%\AppData\Local /f   rem Тут можно выполнить другие действия, например удалить временные файлы.  echo Completed installation.

    И затем три файла в директории «My Web Sites»:

    [Node.js.Cloud.cscfg]

    <?xml version="1.0" encoding="utf-8"?> <ServiceConfiguration serviceName="WindowsAzure2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="2" osVersion="*" schemaVersion="2013-03.2.0">   <Role name="Node.js project">     <Instances count="1" />     <ConfigurationSettings>     </ConfigurationSettings>   </Role> </ServiceConfiguration>

    [Node.js.csdef]

    <?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="WindowsAzure2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2013-03.2.0">   <WebRole name="Node.js project" vmsize="Small">     <Sites>       <Site name="Web"  physicalDirectory="./Node.js project">         <Bindings>           <Binding name="Endpoint1" endpointName="Endpoint1" />         </Bindings>       </Site>     </Sites>     <Endpoints>       <InputEndpoint name="Endpoint1" protocol="http" port="80" />     </Endpoints>     <Startup>       <Task commandLine="startup.cmd" executionContext="elevated" taskType="simple" >       </Task>     </Startup>   </WebRole> </ServiceDefinition>

    [Node.js.pack.cmd]

    @echo off  set WINDOWS_AZURE_SDK_PATH="C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.1"  call %WINDOWS_AZURE_SDK_PATH%\bin\setenv.cmd  pushd %~dp0  if "%ServiceHostingSDKInstallPath%" == "" (     echo Can't see the ServiceHostingSDKInstallPath environment variable. Please run from a Windows Azure SDK command-line (run Program Files\Windows Azure SDK\^<version^>\bin\setenv.cmd^).     GOTO :eof )  rem Тут можно удалить временные файлы, остановить IIS и т.п. rem iisreset /stop  rem Эта команда создает пакет для Windows Azure cspack Node.js.csdef /out:Node.js.cspkg  popd

    Как и раньше различия выделены жирным.

    Выполним Node.js.pack.cmd, в результате получим файл Node.js.cspkg размером примерно 41мб. Вот ссылка на архив с примерами файлов выше: https://dl.dropboxusercontent.com/u/7840290/habrahabr/Node.js.zip

    Теперь опубликуем пакеты в Azure Cloud Services как и в предыдущих главах. Весь процесс занимает минут 5-10, что значительно быстрее, чем, например, в случае с Ruby.

    Perl

    На этот раз все же будем ставить «Hello World» проект на Mojolitious. К сожалению ничего более зрелищного для Perl у меня под рукой не нашлось. Запустим Microsoft Web Platform Installer и установим Zoo -> Templates -> Perl project.

    После установки откроется страница «Welcome to universal Perl template powered by Helicon Zoo», нажмите на этой странице на ссылку «open web console» и наберите там следующую команду:

    cpanm Mojolicious

    Теперь создайте файл app.pl такого содержания:

    [app.pl]

    use Mojolicious::Lite; get '/' => sub { shift->render(text => 'Hello from Mojolicious!') }; app->start;

    Нажав «обновить» в браузере увидим сообщение «Hello from Mojolicious!». Не ахти как красиво, но концепцию доказывает.

    Теперь, как и в предыдущих главах выполняем из консоли:

    mkdir offline-package  WebpiCmd.exe /offline /Products:PerlHostingPackage /Path:"offline-package" /Feeds:http://www.helicontech.com/zoo/feed.xml

    Добавим скрипт bin\startup.cmd:

    [bin\startup.cmd]

    echo Starting installation...  rem Дать права на чтение и запись папке куда распаковано приложение icacls "%RoleRoot%\approot" /grant "Everyone":F /T  rem Локальная папка AppData с правами на запись нужна для работы Web Platform Installer rem Создадим эту папку и ключ реестра на нее указывающий md "%RoleRoot%\appdata" reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" ^     /v "Local AppData" /t REG_EXPAND_SZ /d "%RoleRoot%\appdata" /f  rem Перейдем в папку с WebpiCmd.exe pushd "%RoleRoot%\approot\offline-package\bin"  rem Вызов команды WebpiCmd.exe для установки продукта из папки offline-package rem Обратите внимание на имя продукта – PerlHostingPackage, а также логи в install.txt и install-error.txt WebpiCmd.exe /install /Products:PerlHostingPackage /XML:%RoleRoot%\approot\offline-package\feeds\latest\webproductlist.xml ^              /Feeds:%RoleRoot%\approot\offline-package\feeds\latest\supplementalfeeds\feed.xml ^              /AcceptEula  >%RoleRoot%\approot\public\install.txt 2>%RoleRoot%\approot\public\install-error.txt  popd  rem Вернуть старое значение ключу реестра с AppData reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" ^     /v "Local AppData" /t REG_EXPAND_SZ /d %%USERPROFILE%%\AppData\Local /f   rem Тут можно выполнить другие действия, например удалить временные файлы.  echo Completed installation.

    И создадим файлы в папке «My Web Sites» (предполагается что сайт находится в папке «My Web Sites\Perl project»):

    [Perl.Cloud.cscfg]

    <?xml version="1.0" encoding="utf-8"?> <ServiceConfiguration serviceName="WindowsAzure2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="2" osVersion="*" schemaVersion="2013-03.2.0">   <Role name="Perl project">     <Instances count="1" />     <ConfigurationSettings>     </ConfigurationSettings>   </Role> </ServiceConfiguration>

    [Perl.csdef]

    <?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="WindowsAzure2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2013-03.2.0">   <WebRole name="Perl project" vmsize="Small">     <Sites>       <Site name="Web"  physicalDirectory="./Perl project">         <Bindings>           <Binding name="Endpoint1" endpointName="Endpoint1" />         </Bindings>       </Site>     </Sites>     <Endpoints>       <InputEndpoint name="Endpoint1" protocol="http" port="80" />     </Endpoints>     <Startup>       <Task commandLine="startup.cmd" executionContext="elevated" taskType="simple" >       </Task>     </Startup>   </WebRole> </ServiceDefinition>

    [Perl.pack.cmd]

    @echo off  set WINDOWS_AZURE_SDK_PATH="C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.1"  call %WINDOWS_AZURE_SDK_PATH%\bin\setenv.cmd  pushd %~dp0  if "%ServiceHostingSDKInstallPath%" == "" (     echo Can't see the ServiceHostingSDKInstallPath environment variable. Please run from a Windows Azure SDK command-line (run Program Files\Windows Azure SDK\^<version^>\bin\setenv.cmd^).     GOTO :eof )  rem Тут можно удалить временные файлы, остановить IIS и т.п. rem iisreset /stop  rem Эта команда создает пакет для Windows Azure cspack Perl.csdef /out:Perl.cspkg  popd

    Ссылка на архив с примерами файлов: https://dl.dropboxusercontent.com/u/7840290/habrahabr/Perl.zip

    Запустим Perl.pack.cmd. Получится файл Perl.cspkg размером 92мб. Выложим файлы на Azure Cloud Services и убедимся что программа на Mojolicious работает корректно, открыв ссылку по завершении всей установки.

    Java и ColdFusion (Railo)

    На последок остались Java и ColdFusion. В качестве альтернативы ColdFusion в Helicon Zoo на данный момент используется бесплатный Railo с открытым исходным кодом. Сразу же оговорюсь – установить Java или Railo на Azure Cloud Services мне не удалось, и причина тому весьма тривиальна – ограничение на размер пакетов Azure. По крайней мере в моем аккаунте нельзя выкладывать пакеты более 200 мб размером. При этом для работы Railo и большинства других серверных технологий на Java требуется Oracle JDK, размер дистрибутива которого 125 мб, что вместе с другими компонентами легко переваливает за 200. Однако я все же опишу, как должны были бы запускаться Java программы, если бы не это ограничение. Возможно, ограничение будет снято в будущем и глава станет актуальна. Тем более что в целом запуск Java программ достаточно прост и удобен. Java разработчикам не нужно приучаться упаковывать компоненты внутрь программ – для них это стандартное поведение. Сайты, программы и сервисы на Java, как правило, имеют минимум внешних зависимостей и не нуждаются в сложной настройке среды.

    Главной внешней зависимостью для Java-программ является Oracle JDK, и, к сожалению, его нельзя установить из репозитория Helicon Zoo. Oracle запрещает встраивание своего JDK в другие продукты и репозитории и любые поставки их дистрибутивов в обход самого сайта Oracle. Поэтому вам нужно скачать JDK-7 самостоятельно, воспользовавшись этой ссылкой: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html Для Azure Cloud Services вам понадобится версия Windows-64 bit. На вашу рабочую станцию ставьте версию в соответствии с битностью машины. После того как JDK-7 установлен, можно устанавливать Java-программы из репозитория Helicon Zoo. Для примера вы можете установить Zoo -> Applications -> SCM Manager – небольшой менеджер и сервис репозиториев Git, Mercurial и SVN написанный на Java. Или поставить Zoo -> Applications -> Mura CMS – красивая CMS написанная на ColdFusion. Обе программы устанавливаются прямо из репозитория без дополнительных действий.

    В моем случае я установил Mura CMS в папку «My Web Sites\Mura CMS1». Дальше как и раньше – создаем папку offline-package куда пакуем Java Hosting Package или CFML Hosting Package из репозитория Helicon Zoo, в зависимости от того какая технология используется:

    mkdir offline-package  WebpiCmd.exe /offline /Products:CFMLHostingPackage /Path:"offline-package" /Feeds:http://www.helicontech.com/zoo/feed.xml

    Добавим в директорию offline-package\bin еще и скачанный ранее дистрибутив с JDK-7. 
    Скрипт bin\startup.cmd будет отличатся дополнительным вызовом установщика JDK-7:

    [bin\startup.cmd]

    echo Starting installation...  rem Дать права на чтение и запись папке куда распаковано приложение icacls "%RoleRoot%\approot" /grant "Everyone":F /T  rem Локальная папка AppData с правами на запись нужна для работы Web Platform Installer rem Создадим эту папку и ключ реестра на нее указывающий md "%RoleRoot%\appdata" reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" ^     /v "Local AppData" /t REG_EXPAND_SZ /d "%RoleRoot%\appdata" /f  rem Перейдем в папку с WebpiCmd.exe pushd "%RoleRoot%\approot\offline-package\bin"  rem Устанавливаем JDK-7 jdk-7u45-windows-x64.exe /s  rem Вызов команды WebpiCmd.exe для установки продукта из папки offline-package rem Обратите внимание на имя продукта – PerlHostingPackage, а также логи в install.txt и install-error.txt WebpiCmd.exe /install /Products:CFMLHostingPackage /XML:%RoleRoot%\approot\offline-package\feeds\latest\webproductlist.xml ^              /Feeds:%RoleRoot%\approot\offline-package\feeds\latest\supplementalfeeds\feed.xml ^              /AcceptEula  >%RoleRoot%\approot\install.txt 2>%RoleRoot%\approot\install-error.txt  popd  rem Вернуть старое значение ключу реестра с AppData reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" ^     /v "Local AppData" /t REG_EXPAND_SZ /d %%USERPROFILE%%\AppData\Local /f   rem Тут можно выполнить другие действия, например удалить временные файлы.  echo Completed installation.

    Создадим файлы пакета:

    [Mura.Cloud.cscfg]

    <?xml version="1.0" encoding="utf-8"?> <ServiceConfiguration serviceName="WindowsAzure2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="2" osVersion="*" schemaVersion="2013-03.2.0">   <Role name="Mura CMS1">     <Instances count="1" />     <ConfigurationSettings>     </ConfigurationSettings>   </Role> </ServiceConfiguration>

    [Mura.csdef]

    <?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="WindowsAzure2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2013-03.2.0">   <WebRole name="Mura CMS1" vmsize="Small">     <Sites>       <Site name="Web"  physicalDirectory="./Mura CMS1">         <Bindings>           <Binding name="Endpoint1" endpointName="Endpoint1" />         </Bindings>       </Site>     </Sites>     <Endpoints>       <InputEndpoint name="Endpoint1" protocol="http" port="80" />     </Endpoints>     <Startup>       <Task commandLine="startup.cmd" executionContext="elevated" taskType="simple" >       </Task>     </Startup>   </WebRole> </ServiceDefinition>

    [Mura.pack.cmd]

    @echo off  set WINDOWS_AZURE_SDK_PATH="C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.1"  call %WINDOWS_AZURE_SDK_PATH%\bin\setenv.cmd  pushd %~dp0  if "%ServiceHostingSDKInstallPath%" == "" (     echo Can't see the ServiceHostingSDKInstallPath environment variable. Please run from a Windows Azure SDK command-line (run Program Files\Windows Azure SDK\^<version^>\bin\setenv.cmd^).     GOTO :eof )  rem Тут можно удалить временные файлы, остановить IIS и т.п. rem iisreset /stop  rem Эта команда создает пакет для Windows Azure cspack Mura.csdef /out:Mura.cspkg  popd

    И запустим Mura.pack.cmd. Получится файл Mura.cspkg размером 275 мб. Что можно сказать: Java требует много ресурсов. Хотя и 300 мб для передачи по локальной сети по современным меркам не так уж и много.

    Ну и теперь, если бы Azure Cloud Services принимал пакеты такого размера, нам нужно было бы просто загрузить ему эти файлы. Пока же наш эксперимент чисто теоретический.

    Заключение

    Несмотря на кажущуюся сложность показанного решения, не все так страшно. За одну статью мы управились сразу с большинством популярных технологий веб разработки. Разумеется, остались еще PHP и ASP.NET, которые и так неплохо описаны в инструкциях к Windows Azure. В репозитории Helicon Zoo есть еще PHP Hosting Package, которым удобно воспользоваться вместо стандартного решения от Microsoft в том случае если вы собираетесь смешивать несколько версий PHP или другие веб технологии в рамках одного сайта, так как в Zoo неплохо реализована изоляция технологий.

    Главное достоинство представленного решения, помимо относительной простоты и хорошей производительности – это достаточно легкая миграция приложений между серверами и сервисами. Пользуясь таким решением, вы оставляете для себя теоретическую возможность в будущем «спрыгнуть» с сервисов Azure, если условия не будут вас удовлетворять. Все приложения, приведенные в данной статье, могут быть аналогично запущены практически на любом сервере Windows и Linux. Разумеется, инфраструктура Azure предоставляет еще массу других, полезных, сервисов, таких как Media Services, Mobile Services, SQL Databases или очереди сообщений. Если ваше приложение будет активно использовать эти сервисы, то привязка к платформе будет более жесткой.

ссылка на оригинал статьи http://habrahabr.ru/post/200376/