Постоянные изменения —основа отрасли ИТ. Новые технологии, оборудование, программное обеспечение и протоколы связи появляются каждый день. Этот наплыв новой технологии создает меняющийся ландшафт, улучшающий способ ведения бизнеса, способ общения и обмена знаниями. Посреди этого водоворота изменений два наиболее значительные преобразования в мире ИТ за последние годы, виртуализация и облачные вычисления.
Виртуализация помогает предприятиям более эффективно использовать аппаратные ресурсы. Она обеспечивает большую степень абстрагирования программной среды от его оборудования. Теперь серверы существуют как один файл. Их можно просто перемещать между компонентами оборудования, дублировать и создавать более масштабируемую и гибкую среду.
Облачные вычисления получают от виртуализации большую эффективность и гибкость и еще больше увеличивают их. Благодаря пулам ресурсов, географической рассредоточенности и возможности подключения к любым ресурсам облачные вычисления упрощают предоставление размещенного программного обеспечения, платформ и инфраструктуры как службы. Это новая технологическая платформа и новая бизнес-модель.
С введением роли виртуальной машины (ВМ) в платформе Windows Azure эти мощные концепции совместно используются для размещения виртуальной инфраструктуры в облаке. В скором времени вы сможете создавать виртуальные машины для Windows Azure и выполнять их развертывание в облаке, в котором можно использовать гибкую и масштабируемую инфраструктуру и соответствующее снижение издержек.
В настоящий момент доступна только бета-версия роли ВМ Windows Azure. Подробные сведения о программе бета-тестирования можно узнать на сайте Windows Azure Compute. Для регистрации в программе бета-тестирования посетите раздел «Beta Programs» (Программы бета-тестирования) на портале управления Windows Azure. Поскольку пока доступна только бета-версия роли ВМ, содержащаяся в данном документе, может быть изменена.
Создание приложений для облака
Роль ВМ для Windows Azure схожа с другими серверными ролями. ВМ в Windows Azure работают под управлением ОС Windows Server. Различие роли ВМ в том, что можно создавать, настраивать и управлять образом сервера в соответствие с вашими требованиями и спецификациями.
Существует ряд операционных различий, которые следует иметь в виду при запуске ВМ в Windows Azure, а не на локальном оборудовании. Прежде всего, некоторые сетевые функции ограничены. Например, для использования протокола UDP (User Datagram Protocol) необходимо также использовать Windows Azure Connect. Кроме того, экземпляр роли ВМ в Windows Azure не имеет постоянного состояния.
Рекомендуется использовать службы Windows Azure в постоянном состоянии, записав их в объект blob или на диск Windows Azure. Подробнее об этом см. в статье «Разработка адаптера для роли ВМ в Windows Azure».
Данные, записанные в локальном каталоге хранения ресурсов, сохраняются при повторном создании экземпляра сервера. Однако эти данные могут быть потеряны в случае кратковременно сбоя в Windows Azure, что потребует переноса экземпляра роли ВМ на другое оборудование.
Учитывая эти условия, процесс создания ВМ для Windows Azure сходен с созданием любой другой ВМ. Начните с создания базового виртуального жесткого диска (VHD), создав пустой VHD с помощью Hyper-V Manager, изменив существующий VHD или преобразовав установку физического сервера в VHD. (Дополнительные сведения см. в статье «Источники новых виртуальных машин».)
Базовый образ содержит ОС (которая должна быть Windows Server 2008 R2), все изменения ОС и необходимые приложения. Необходимо разрешить роль Hyper-V в Server Manager, а также установить Windows Azure SDK (который включает компоненты интеграции Windows Azure). Также не помешает включить установочный Windows Server 2008 R2 (обычно ISO-файл) в базовый образ, на случай, если он потребуется для таких задач, как установка дополнительных компонентов.
Затем установите компоненты интеграции Windows Azure. Они требуются на каждом образе сервера, чтобы они могли быть загружены в Windows Azure. Эти компоненты запускаются при каждом запуске ОС, и они интегрируют ОС роли ВМ с Windows Azure.
Компоненты работают с балансировщиком нагрузки для сообщения состояния экземпляров. Компоненты также инициализируют ВМ путем установки сертификатов и создания каталогов локальных ресурсов на основе параметров определения службы. Подробные этапы установки компонентов описаны в статье «Установка компонентов интеграции Windows Azure».
Разработка «адаптера» — это следующий дополнительный шаг процесса создания образа. При разработке и загрузке специального образа сервера вы устанавливаете и настраиваете программное обеспечение для работы в динамической среде Windows Azure. Может потребоваться указать сведения о конфигурации для приложения, которые могут быть недоступны во время разработки. Их необходимо получить во время выполнения. Рекомендуется настроить приложения для динамической среды, написав адаптер, взаимодействующий с Windows Azure и подготавливающий и выполняющий приложение.
Написать адаптер можно двумя способами:
Можно написать адаптер, выполняющийся на этапе specialization. Это происходит при настройке ОС после первой загрузки образа сервера в Windows Azure или после повторного создания образа экземпляра. Можно создать этот адаптер без написания кода, используя один из двух подходов. Выполнение сценария из файла ответов или поставщика, написанного для инструмента System Preparation (sysprep). Подробные сведения см. в разделе «Создание проекта установки для адаптера» на странице «Разработка адаптера для роли ВМ в Windows Azure» в библиотеке MSDN.Можно написать адаптер как службу Windows, автоматически запускающуюся при каждом запуске ОС. Этот тип адаптера можно написать с помощью управляемого или собственного кода. Он использует API среды выполнения службы Windows Azure для сбора динамических данных из среды Windows Azure. Подробные сведения см. в разделе «Определение действий при запуске адаптера» на странице «Разработка адаптера для роли ВМ в Windows Azure» в библиотеке MSDN.
Последний этап подготовки образа системы для загрузки в Windows Azure — оценка конфигурации брандмауэра Windows. Необходимо открывать все порты, которые требуются приложению, после запуска в экземпляре роли ВМ в Windows Azure. Размещенная служба должна использовать фиксированные локальные порты. Можно указать номера портов для конечных точек, определенных для любой роли Windows Azure — веб-роли, рабочей роли или ВМ.
После завершения процесса установки и настройки, последний этап создания образа — его подготовка к загрузке в Windows Azure. Для этого используется инструмент sysprep. Инструмент sysprep «обобщает» образ, удаляя все уникальные идентификаторы безопасности (SID), чтобы система Windows Azure могла снова установить их для определенных экземпляров при развертывании машины. Для завершения последнего этапа подготовки образа выполните следующее.
Откройте окно командной строки как администратор.Перейдите в каталог %windir%\system32\sysprep и запустите sysprep.exe.В диалоговом окне System Preparation Tool выберите Enter System Out-of-Box Experience (OOBE) (Введите системный OOBE (Out-of-Box Experience)) для System Cleanup Action (Действие очистки системы).Убедитесь, что выбрано Generalize (Обобщение).Выберите Shutdown (Завершение работы) для Shutdown Options (Режимы завершения работы).Нажмите кнопку ОК.
По завершении работы инструмента sysprep работа ВМ будет завершена. Теперь можно приступить к развертыванию.
Развертывание ВМ в Windows Azure
Первый этап развертывания образа системы — настройка сертификатов служб и управления. При загрузке файла .vhd в Windows Azure он использует сертификат x.509, сохраненный как файл .cer, для проверки подлинности (называется сертификатом управления на портале управления Windows Azure). Также необходим сертификат обмена личной информацией, сохраненный как файл .pfx (называется сертификатом службы на портале управления Windows Azure), если планируется удаленный доступ к экземпляру роли ВМ.
Вы можете заверять эти сертификаты самостоятельно. Другими словами, их не требуется приобретать у стороннего поставщика. Их можно создавать с помощью инструмента makecert.exe. Подробные инструкции по созданию сертификатов содержатся в статье «Создание сертификата для роли.»
После создания сертификата его можно добавить на портале управления Windows Azure. Выберите Hosted Services, Storage Accounts & CDN (Размещенные службы, учетные записи хранилищ и CDN), затем выберите Management Certificates (Сертификаты управления) или Hosted Services (Размещенные службы) (для сертификатов служб).
Для загрузки VHD требуется идентификатор подписки. Можно скопировать и вставить информацию с портала управления в командную строку. Чтобы найти идентификатор подписки и отпечаток сертификата, выполните следующее.
Войдите в систему портала управления.Выберите Hosted Services, Storage Accounts & CDN (Размещенные службы, учетные записи хранилищ и CDN), затем Management Certificates (Сертификаты управления).На панели «Properties» (Свойства) можно найти отпечаток сертификата в разделе Thumbprint (Отпечаток). Идентификатор подписки находится в разделе Subscription ID (Идентификатор подписки).
После нахождения отпечатка сертификата и идентификатора подписки можно загрузить VHD.
Чтобы загрузить образ, выполните следующее.
Откройте окно командной строки Windows Azure SDK как администратор.Перейдите в каталог, в котором сохранен образ VHD.Установите строку подключения со следующей команде и замените SubscriptionId и CertThumbprint значениями из подписки:
csupload Set-Connection “SubscriptionId=SubscriptionId; CertificateThumbprint=CertThumbprint”
Загрузите VHD с помощью следующей команды и замените имя файла VHD и отображаемое имя:
csupload Add-VMImage –LiteralPath VHDName.vhd –Location LocationValue –Name DisplayedNameInPortal
Появится диалоговое окно для инструмента Windows Azure VHD Verification Tool. Этот инструмент проверяет, что ОС находится в правильном состоянии и готово к загрузке в Windows Azure. Нажмите «OK», чтобы продолжить процесс загрузки.
Имейте в виду, что –LiteralPath и –Location (или –AffinityGroup), это обязательные параметры. Параметр –Name необязателен. Расположение группы по интересам должно соответствовать расположению или группе по интересам, определенной для соответствующей размещенной службы.
Создание модели служб — последний этап развертывания. Для работы экземпляра роли ВМ в Windows Azure необходимо определить модель служб, создав определение службы и файлы конфигурации службы. Подробные инструкции см. в статье в библиотеке MSDN «Создание и развертывание модели служб роли ВМ».
После того, как ВМ работает в Windows Azure, необходимо сохранить локальную копию исходного VHD в безопасном месте. При необходимости внесения изменений VHD в будущем, например, для применения обновлений или обновления приложений, можно использовать различные диски. Подробные инструкции по использованию различных дисков для обслуживания ВМ доступны в статье: “Приступая к изменению образа сервера для роли ВМ в Windows Azure.”
Одна из первых вещей, которые Тим Кук сделал, войдя в должность нового главы компании Apple, стало заверение сотрудников, что с уходом Стива Джобса ничего не изменится. Это, конечно, верное решение. Но даже если управление в целом не изменится, личность человека, стоящего у рычагов управления, значение имеет. Кто этот человек? Каким лидером он будет для Apple?
Ещё несколько лет назад Тима Кука отметили как наиболее вероятного преемника Джобса. Он неутомимый работник и блестящий стратег. Благодаря Куку с Apple вступили в тесное сотрудничество поставщики из Азии. Заслуга Кука есть во многих значительных изменениях в Apple за последнее десятилетие. Это и выход на мобильный рынок, перевод моделей ноутбуков линейки MacBook с микропроцессоров IBM на Intel. Действия Кука позволили Apple проводить агрессивную ценовую политику с iPad, что положительно сказалось на борьбе с конкурентами.
"Тим Кук это человек, который действительно работает на благо Apple и отличается организованностью", говорит бывший сотрудник компании Apple, который работал в Купертино.
Кук хорошо известен на Уолл-Стрит. Он в течение многих лет сотрудничает в аналитиками рынка, а также выполнял обязанности генерального директора в поледнее время, когда Стив Джобс прибывал на больничном. Аналитики Уолл-Стрит сходятся во мнении, что компания в хороших руках.
"Кажется, сложилось единодушное мнение, что он является выдающимся деятелем, он чрезвычайно эффективный менеджер и прекрасно знает, как управлять бизнесом", говорит Чарльз Голвин, аналитик Forrester Research. "Чего ему не хватает, так же как и всем остальным, так это видения Джобса и фокусировки на продуктах компании".
Тем не менее, на публике Тим Кук знаком не особо. Он не отвечает на интервью, немногословен на заседаниях и вряд ли способен на столь яркие выступления, как харизматичный Стив Джобс. В Кука верят как в профессионального организатора и талантливого менеджера, но многие полагают, что без страсти Джобса, его смелых идей, дара убеждения и удивительной дальновидности (или везения) Apple с Тимом Куком не сможет достичь новых высот.
Конечно, Джобс сказал, что он будет продолжать участвовать в жизни Apple, и это навряд ли просто обещания. У Кука есть время перенять навыки Стива и показать миру, что он может полноценно заменить прежнего лидера компании. До того времени его и его решения неизбежно будут сравнивать с правлением Джобса.
Silverlight — великолепная инфраструктура для создания полнофункциональных веб-приложений (rich Internet applications, RIA), но до сих пор она не обеспечивает надежной поддержки локализации, которая имеется в других компонентах Microsoft .NET Framework. В Silverlight есть файлы .resx, простой класс ResourceManager и один элемент в файле проекта. И это все — дальше вы предоставлены сами себе. Нет ни расширений собственной разметки, ни поддержки класса DynamicResource.
В этой статье я покажу, как решить все эти проблемы. Я представлю решение, которое позволит разработчику загружать наборы ресурсов в период выполнения, использовать любой формат для хранения ресурсов, изменять ресурсы без повторной компиляции и применять отложенную загрузку ресурсов.
Статья поделена на три части. В первой части я разработаю простое приложение, использующее процесс локализации, который детально документирован Microsoft. Затем я покажу другое решение в области локализации, которое дает некоторые преимущества в сравнении со стандартным процессом. Наконец, мы обсудим внутренние компоненты, необходимые для создания законченного решения.
Стандартный процесс локализации
Начну с создания приложения Silverlight, в котором используется процесс локализации, документированный Microsoft. Подробное описание этого процесса см. по ссылке msdn.microsoft.com/library/cc838238(VS.95).
UI состоит из TextBlock и Image, как показано на рис. 1.
Рис. 1. Приложение
В процессе локализации, документированном Microsoft, данные ресурсов хранятся в файлах .resx. Эти файлы встраиваются в основную или в сопутствующую сборку и загружаются только раз, при запуске приложения. Вы можете создавать приложения, рассчитанные на определенные языки, модифицируя элемент SupportedCultures в файле проекта. Мое приложение-пример будет локализовано для двух языков: английского и французского. После добавления двух файлов ресурсов и двух изображений с флагами соответствующих стран структура проекта выглядит, как показано на рис. 2.
Рис. 2. Структура проекта после добавления файлов .resx
Я сменил действие build для изображений на content, поэтому могу ссылаться на изображения, используя менее детальный синтаксис. В каждый файл будут добавлены два элемента управления: TextBlock (на который я ссылаюсь через свойство Welcome) и Image (на который я ссылаюсь через свойство FlagImage).
Когда в приложении Silverlight создаются файлы ресурсов, модификатором по умолчанию для генерируемого класса ресурса является internal. К сожалению, XAML не может читать внутренние (internal) члены, даже если они находятся в той же сборке. Чтобы исправить ситуацию, модификаторы генерируемых классов нужно сменить на public. Это можно сделать в режиме проектирования файла ресурсов. Раскрывающееся меню Access Modifier позволяет указать область видимости генерируемого класса.
После подготовки файлов ресурсов нужно связать ресурсы в XAML. Для этого создается класс-оболочка со статическим полем, которое ссылается на экземпляр класса ресурса. Этот класс очень прост:
public class StringResources { private static readonly strings strings = new strings(); public strings Strings { get { return strings; } }}
Чтобы сделать этот класс доступным из XAML, нужно создать его экземпляр. В данном случае я создам экземпляр в классе App, чтобы он был доступен в рамках всего проекта:
<Application.Resources> <local:StringResources x:Key=”LocalizedStrings”/></Application.Resources>
Теперь связывание с данными в XAML становится возможным. XAML для TextBlock и Image выглядит так:
<StackPanel Grid.ColumnSpan=”2″ Orientation=”Horizontal” HorizontalAlignment=”Center”> <TextBlock Text=”{Binding Strings.Welcome, Source={StaticResource LocalizedStrings}}” FontSize=”24″/></StackPanel><Image Grid.Row=”1″ Grid.ColumnSpan=”2″ HorizontalAlignment=”Center” Source=”{Binding Strings.FlagImage, Source={StaticResource LocalizedStrings}}”/>
Путь — это содержимое свойства String с добавлением ключа для записи ресурса. Источником является экземпляр оболочки StringResources из класса App.
Задание культуры
Для приложения нужно настроить три параметра, чтобы оно получало настройку культуры браузера и отображало ресурс с соответствующей культурой.
Первый параметр — элемент SupportedCultures в файле .csproj. В настоящее время в Visual Studio нет диалогового окна, которое позволяло бы редактировать этот элемент, поэтому вам придется вручную изменять файл проекта. Вы можете сделать это, либо открыв файл проекта вне Visual Studio, либо выгрузив проект и выбрав редактирование из контекстного меню в Visual Studio.
Чтобы включить поддержку английского и французского в этом приложении, значение элемента SupportedCultures должно выглядеть так:
<SupportedCultures>fr</SupportedCultures>
Значения культур разделяются запятыми. Нейтральную культуру указывать не требуется; она автоматически компилируется в основную DLL.
Следующие шаги необходимы для того, чтобы выбирать языковые настройки браузера. В Silverlight-объект, встраиваемый в веб-страницу, нужно добавить параметр — текущую культуру UI, получаемую с серверной стороны. Для этого веб-страница должна содержаться в файле .aspx. Синтаксис параметра таков:
<param name=”uiculture” value=”<%=Thread.CurrentThread.CurrentCulture.Name %>” />
И последний обязательный шаг в этом процессе — изменение файла web.config и добавление элемента globalization в элемент system.web; при этом значения его атрибутов нужно установить в auto:
<globalization culture=”auto” uiCulture=”auto”/>
Как уже упоминалось, приложение Silverlight имеет параметр нейтрального языка. Для доступа к этому параметру откройте вкладку Silverlight в свойствах проекта и щелкните Assembly Information. Свойство нейтрального языка находится в нижней части диалога (рис. 3).
Рис. 3. Настройка нейтрального языка
Советую указывать нейтральный язык без региона. Это параметр используется в случае неудачи и гораздо полезнее, если он охватывает широкий спектр потенциально возможных локализующих идентификаторов. Установка нейтрального языка добавляет атрибут assembly в файл assemblyinfo.cs, например:
[assembly: NeutralResourcesLanguageAttribute("en")]
После всего этого вы получите локализованное приложение, которое при запуске будет считывать язык, установленный в браузере, и загружать соответствующие ресурсы.
Собственный процесс локализации
Ограничения стандартного процесса локализации связаны с использованием ResourceManager и файлов .resx. Класс ResourceManager не меняет наборы ресурсов в период выполнения при изменении культуры в текущей среде. А применение файлов .resx привязывает разработчика к одному набору ресурсов на каждый язык и лишает его гибкости в сопровождении ресурсов.
В ответ на эти ограничения рассмотрим альтернативное решение, где применяются динамические ресурсы.
Чтобы сделать ресурсы динамическими, диспетчер ресурсов должен посылать уведомление о смене активного набора ресурсов. Для отправки таких уведомлений в Silverlight вы реализуете интерфейс INotifyPropertyChanged. На внутреннем уровне каждый набор ресурсов будет словарем с ключом и значимым типом String.
В разработке для Silverlight популярны инфраструктуры Prism и Managed Extensibility Framework (MEF), и при их использовании приложение разбивается на несколько файлов .xap. Для локализации в каждом файле .xap нужен свой экземпляр диспетчера ресурсов. Чтобы посылать уведомления каждому файлу .xap (каждому экземпляру диспетчера ресурсов), вы должны отслеживать каждый создаваемый экземпляр и перебирать список, когда возникает необходимость в отправке уведомлений. На рис. 4 показан код для такой функциональности SmartResourceManager.
Рис. 4. SmartResourceManager
public class SmartResourceManager : INotifyPropertyChanged { private static readonly List<SmartResourceManager> Instances = new List<SmartResourceManager>(); private static Dictionary<string, string> resourceSet; private static readonly Dictionary<string, Dictionary<string, string>> ResourceSets = new Dictionary<string, Dictionary<string, string>>(); public Dictionary<string, string> ResourceSet { get { return resourceSet; } set { resourceSet = value; // Notify all instances foreach (var obj in Instances) { obj.NotifyPropertyChanged(”ResourceSet”); } }}public SmartResourceManager() { Instances.Add(this);}public event PropertyChangedEventHandler PropertyChanged;public void NotifyPropertyChanged(string property) { var evt = PropertyChanged; if (evt != null) { evt(this, new PropertyChangedEventArgs(property)); }}
Как видите, для хранения всех экземпляров диспетчера ресурсов создается статический список. Активный набор ресурсов хранится в поле resourceSet, а каждый загруженный ресурс — в списке ResourceSets. В конструкторе текущий экземпляр помещается в список Instances. Класс реализует INotifyPropertyChanged стандартным образом. Когда меняется активный набор ресурсов, я перебираю список экземпляров и инициирую событие PropertyChanged каждого из экземпляров.
Классу SmartResourceManager нужен какой-либо способ смены культуры в период выполнения, и для этого достаточно метода, который принимает объект CultureInfo:
public void ChangeCulture(CultureInfo culture) { if (!ResourceSets.ContainsKey(culture.Name)) { // Load the resource set } else { ResourceSet = ResourceSets[culture.Name]; Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = culture; }}
Этот метод проверяет, загружена ли запрошенная культура. Если не загружена, он загружает ее, а затем делает активной. Если культура уже загружена, этот метод просто устанавливает соответствующий набор ресурсов как активный. Код загрузки ресурса пока опущен.
Для полноты картины я также покажу два метода загрузки ресурса (рис. 5). Первый метод принимает только ключ ресурса и возвращает ресурс из активной культуры, а второй принимает ресурс и имя культуры и возвращает ресурс для этой культуры.
Рис. 5. Загрузка ресурсов
public string GetString(string key) { if (string.IsNullOrEmpty(key)) return string.Empty; if (resourceSet.ContainsKey(key)) { return resourceSet[key]; } else { return string.Empty; }}public string GetString(string key, string culture) { if (ResourceSets.ContainsKey(culture)) { if (ResourceSets[culture].ContainsKey(key)) { return ResourceSets[culture][key]; } else { return string.Empty; } } else { return string.Empty; }}
Если вы прямо сейчас запустите приложение, все локализованные строки будут пустыми, так как наборы ресурсов еще не загружены. Чтобы загружать начальный набор ресурсов, я создам метод Initialize, который принимает файл с нейтральным языком и идентификатор культуры. Этот метод вызывается лишь раз в ходе выполнения приложения (рис. 6).
Рис. 6. Инициализация нейтрального языка
public SmartResourceManager() { if (Instances.Count == 0) { ChangeCulture(Thread.CurrentThread.CurrentUICulture); } Instances.Add(this);}public void Initialize(string neutralLanguageFile, string neutralLanguage) { lock (lockObject) { if (isInitialized) return; isInitialized = true; } if (string.IsNullOrWhiteSpace(neutralLanguageFile)) { // No neutral resources ChangeCulture(Thread.CurrentThread.CurrentUICulture); } else { LoadNeutralResources(neutralLanguageFile, neutralLanguage); }}Связывание с XAML
Пользовательские расширения разметки могли бы обеспечить самый гибкий синтаксис связывания для локализованных ресурсов. К сожалению, в Silverlight таких расширений нет. В Silverlight 3 и более поздних версиях поддерживается связывание со словарем, и синтаксис выглядит так:
<StackPanel Grid.ColumnSpan=”2″ Orientation=”Horizontal” HorizontalAlignment=”Center”> <TextBlock Text=”{Binding Path=ResourceSet[Welcome], Source={StaticResourceSmartRM}}” FontSize=”24″/></StackPanel><Image Grid.Row=”1″ Grid.ColumnSpan=”2″ HorizontalAlignment=”Center” Source=”{Binding ResourceSet[FlagImage], Source={StaticResource SmartRM}}”/>
Путь содержит имя свойства словаря с ключом в квадратных скобках. Если вы используете Silverlight 2, вам доступны два варианта: создание класса ValueConverter или строго типизированного объекта, используя отражение. Второй вариант выходит за рамки этой статьи. Код ValueConverter мог бы выглядеть, как показано на рис. 7.
Рис. 7. Собственный ValueConverter
public class LocalizeConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null) return string.Empty; Dictionary<string, string> resources = value as Dictionary<string, string>; if (resources == null) return string.Empty; string param = parameter.ToString(); if (!resources.ContainsKey(param)) return string.Empty; return resources[param]; }}
Класс LocalizeConverter принимает словарь и переданный параметр, а возвращает значение ключа в словаря. После создания экземпляра этого конвертера, синтаксис связывания выглядел бы следующим образом:
<StackPanel Grid.ColumnSpan=”2″ Orientation=”Horizontal” HorizontalAlignment=”Center”> <TextBlock Text=”{Binding Path=ResourceSet, Source={StaticResource SmartRM}, Converter={StaticResource LocalizeConverter}, Convert-erParameter=Welcome}” FontSize=”24″/></StackPanel><Image Grid.Row=”1″ Grid.ColumnSpan=”2″ HorizontalAlignment=”Center” Source=”{Binding ResourceSet, Source={StaticResource SmartRM}, Converter={StaticResource LocalizeConverter}, ConverterParameter=FlagImage}”/>
Синтаксис более подробный при использовании конвертера, но и более гибкий. Однако в остальной части статьи я буду обходиться без конвертера и вместо него использовать словарный синтаксис связывания.
Параметры локализации
Чтобы настройки культуры подхватывались приложением Silverlight, нужно сконфигурировать два параметра в этом приложении. Это все те же параметры, что и в стандартном процессе локализации. Значения culture и uiCulture в элементе globalization в файле web.config должны быть равны auto:
<globalization culture=”auto” uiCulture=”auto”></globalization>
Кроме того, Silverlight-объекту в файле .aspx нужно передавать как параметр значение текущей культуры в UI-потоке:
<param name=”uiculture” value=”<%=Thread.CurrentThread.CurrentCulture.Name %>” />
Чтобы продемонстрировать динамическую локализацию приложения, я добавлю пару кнопок для смены текущей культуры, как показано на рис. 8. Событие щелчка для кнопки English выглядит так:
(App.Current.Resources["SmartRM"] as SmartResourceManager).ChangeCulture( new CultureInfo(”en”));
Рис. 8. Кнопки для смены культуры
При наличии подготовленных данных приложение показывало бы UI на соответствующем языке. Это решение обеспечивает динамическую локализацию в период выполнения и достаточно расширяемое для загрузки ресурсов по задаваемой вами логике.
В следующем разделе мы сосредоточимся на заполнении оставшихся пробелов: где хранятся ресурсы и как они извлекаются.
Компоненты на серверной стороне
Теперь создадим базу данных для хранения ресурсов и WCF-сервис (Windows Communication Foundation) для извлечения этих ресурсов. В более крупных приложениях вы предпочтете создать уровни данных и бизнес-логики, но в этом примере я не стану использовать такие абстракции.
Причины, по которым я выбрал WCF-сервис, — простота его создания и надежность, обеспечиваемая WCF. Ресурсы я помещаю в реляционную базу данных; это тоже упрощает их сопровождение и управление ими. Можно было бы создать соответствующее административное приложение, которое позволило бы переводчикам легко модифицировать ресурсы.
Для этого приложения я использую SQL Server 2008 Express. Схема данных показана на рис. 9.
Рис. 9. Схема таблиц локализации в SQL Server 2008 Express
Tag — это именованная группа ресурсов, StringResource — сущность, представляющая ресурс. Столбец LocaleId представляет имя культуры для данного ресурса. Столбец Comment добавлен для совместимости с форматом .resx. Столбцы CreatedDate и ModifiedDate добавлены для поддержки аудита.
StringResource можно сопоставлять с несколькими Tag. Преимущество этого в том, что вы можете создавать специфические группы (например, ресурсы для одного экрана) и загружать только эти ресурсы. А недостаток — вы можете назначить множеству ресурсов одинаковые LocaleId, Key и Tag. В этом случае вы, вероятно, предпочтете написать триггер для управления созданием или обновление ресурсов либо задействовать столбец ModifiedDate, чтобы при извлечении определять, какой из ресурсов самый новый.
Я буду извлекать данные, используя LINQ to SQL. Первая операция сервиса будет принимать имя культуры и возвращать все ресурсы, сопоставленные с этой культурой. Вот интерфейс:
[ServiceContract]public interface ILocaleService { [OperationContract] Dictionary<string, string> GetResources(string cultureName);}
А это реализация:
public class LocaleService : ILocaleService { private acmeDataContext dataContext = new acmeDataContext(); public Dictionary<string, string> GetResources(string cultureName) { return (from r in dataContext.StringResources where r.LocaleId == cultureName select r).ToDictionary(x => x.Key, x => x.Value); }}
Эта операция просто находит все ресурсы, чьи LocaleId равны параметру cultureName. Поле dataContext является экземпляром класса LINQ to SQL, подключенного к базе данных SQL Server. Вот и все! Благодаря LINQ и WCF.
Теперь пора связать WCF-сервис с классом SmartResourceManager. Добавив ссылку на сервис в приложение Silverlight, я регистрируюсь в конструкторе на получение события завершения для операции GetResources:
public SmartResourceManager() { Instances.Add(this); localeClient.GetResourcesCompleted += localeClient_GetResourcesCompleted; if (Instances.Count == 0) { ChangeCulture(Thread.CurrentThread.CurrentUICulture); }}
Метод обратного вызова должен добавлять набор ресурсов в список и делать этот набор активным. Соответствующий код показан на рис. 10.
Рис. 10. Добавление ресурсов
private void localeClient_GetResourcesCompleted(object sender, LocaleService.GetResourcesCompletedEventArgs e) { if (e.Error != null) { var evt = CultureChangeError; if (evt != null) evt(this, new CultureChangeErrorEventArgs( e.UserState as CultureInfo, e.Error)); } else { if (e.Result == null) return; CultureInfo culture = e.UserState as CultureInfo; if (culture == null) return; ResourceSets.Add(culture.Name, e.Result); ResourceSet = e.Result; Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = culture; }}
Метод ChangeCulture нужно модифицировать, чтобы он вызывал операцию WCF-сервиса:
public void ChangeCulture(CultureInfo culture) { if (!ResourceSets.ContainsKey(culture.Name)) { localeClient.GetResourceSetsAsync(culture.Name, culture); } else { ResourceSet = ResourceSets[culture.Name]; Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = culture; }}Загрузка ресурсов, нейтральных к конкретному языку
Приложению нужен некий способ восстановления на случай, если веб-сервисы окажутся недоступными по какой-либо причине. Файл с нейтральными языковыми ресурсами должен храниться вне веб-сервисов и загружаться при запуске приложения. Тогда в случае сбоя приложения сможет переключиться на эти ресурсы.
Я создам еще один конструктор SmartResourceManager с двумя параметрами: URL, указывающим на файл с нейтральными языковыми ресурсами, и кодом культуры, идентифицирующим культуру файла ресурсов (рис. 11).
Рис. 11. Загрузка ресурсов, нейтральных к конкретному языку
public SmartResourceManager(string neutralLanguageFile, string neutralLanguage) { Instances.Add(this); localeClient.GetResourcesCompleted += localeClient_GetResourcesCompleted; if (Instances.Count == 1) { if (string.IsNullOrWhiteSpace(neutralLanguageFile)) { // No neutral resources ChangeCulture(Thread.CurrentThread.CurrentUICulture); } else { LoadNeutralResources(neutralLanguageFile, neutralLanguage); } }}
Если файла с нейтральными ресурсами нет, выполняется обычный процесс вызова WCF-сервиса. Метод LoadNeutralResources с помощью WebClient получает файл ресурса с сервера. Затем разбирает этот файл и преобразует XML-строку в объект Dictionary. Этот код я здесь не показываю, потому что он весьма длинный и тривиальный, но, если он вас интересует, вы найдете его в полном исходном коде, который можно скачать для этой статьи.
Чтобы вызвать параметризованный конструктор SmartResourceManager, мне нужно переместить создание экземпляра SmartResourceManager в отделенный код класса App (поскольку Silverlight не поддерживает XAML 2009). Однако я не хочу «зашивать» в код файл ресурса или код культуры, поэтому мне придется создать собственный класс ConfigurationManager, который вы тоже найдете в исходном коде для этой статьи.
После интеграции ConfigurationManager в класс App метод обратного вызова события Startup выглядит так:
private void Application_Startup(object sender, StartupEventArgs e) { ConfigurationManager.Error += ConfigurationManager_Error; ConfigurationManager.Loaded += ConfigurationManager_Loaded; ConfigurationManager.LoadSettings();}
Этот метод обратного вызова теперь служит для загрузки настроек приложения и регистрации на обратные вызовы. Если же вы решите загружать конфигурационные параметры фоновым вызовом, будьте осторожны, чтобы не создать условия для конкуренции потоков. Вот методы обратного вызова для событий ConfigurationManager:
private void ConfigurationManager_Error(object sender, EventArgs e) { Resources.Add(”SmartRM”, new SmartResourceManager()); this.RootVisual = new MainPage();}private void ConfigurationManager_Loaded(object sender, EventArgs e) { Resources.Add(”SmartRM”, new SmartResourceManager( ConfigurationManager.GetSetting(”neutralLanguageFile”), ConfigurationManager.GetSetting(”neutralLanguage”))); this.RootVisual = new MainPage();}
Метод обратного вызова события Error загружает SmartResourceManager без нейтрального языка, а метод обратного вызова события Loaded осуществляет загрузку с нейтральным языком.
Мне нужно поместить файл ресурсов в такое место, где мне не придется все перекомпилировать при внесении изменений в этот файл. Поэтому я помещу его в каталог ClientBin веб-проекта и после создания файла ресурсов сменю его расширение на .xml, чтобы он был общедоступным и класс WebClient мог обращаться к нему из приложения Silverlight. Поскольку этот файл общедоступный, не храните в нем никаких конфиденциальных данных.
ConfigurationManager тоже читает из каталога ClientBin. Он ищет файл с именем appSettings.xml, содержимое которого выглядит так:
<AppSettings> <Add Key=”neutralLanguageFile” Value=”strings.xml”/> <Add Key=”neutralLanguage” Value=”en-US”/></AppSettings>
Как только appSettings.xml и strings.xml оказываются на месте, ConfigurationManager и SmartResourceManager могут работать совместно для загрузки нейтрального языка. В этом процессе еще много чего надо усовершенствовать.Например, если активная культура потока отличается от нейтрального языка, а веб-сервис недоступен, она будет отличаться и от культуры активного набора ресурсов. Но это упражнение я оставляю читателям.
Заключение
Что я напрочь пропустил в этой статье, так это нормализацию ресурсов на серверной стороне. Допустим, что в ресурсе fr-FR не хватает двух ключей, которые есть в ресурсе fr. При запросе ресурсов fr-FR веб-сервис должен вставить недостающие ключи из более универсального ресурса fr.
Еще один аспект этого решения, о котором я ничего не рассказал, — загрузка ресурсов по культуре и набору ресурсов, а не просто по культуре. Это удобно при загрузке ресурсов индивидуально для каждого экрана или файла .xap.
Тем не менее данное решение позволяет делать ряд полезных вещей, в том числе загружать наборы ресурсов в период выполнения, использовать любой формат для хранения ресурсов, изменять ресурсы без перекомпиляции и выполнять отложенную загрузку ресурсов.
Представленное здесь решение является универсальным, и вы можете подключаться к нему во многих точках и кардинально менять его реализацию. Надеюсь, это поможет сократить вашу ежедневную нагрузку, связанную с программированием.
Для более глубокого изучения интернационализации советую прочитать книгу Гая Смита-Ферье (Guy Smith-Ferrier) «.NET Internationalization: The Developer’s Guide to Building Global Windows and Web Applications» (Addison-Wesley, 2006). Смит-Ферье также выложил на своем веб-сайте великолепный видеоролик по вопросам интернационализации; этот видеоролик называется «Internationalizing Silverlight at SLUGUK» (bit.ly/gJGptU).
До сих пор я дополнял архитектуру различных решений использованием Microsoft Windows Azure или SQL Azure. На этот раз мы обсудим, как скомбинировать несколько облачных сервисов в единое приложение. Мой пример композиции облачных сервисов будет включать Windows Azure, Windows Azure AppFabric Access Control, Bing Maps и Facebook.
Для тех, кто слегка пугается, когда слышит о федеративной идентификации или о практической ценности социальных сетей, я хотел бы представить Маркелуса (Marcelus). Это мой друг, которому принадлежит компания по уборке бытовых и промышленных помещений. Как и мой отец, у которого есть свой бизнес и личные связи, он знает людей, которые могут что-то сделать или достать почти все, что угодно, обычно в той или иной форме бартера. Некоторые могут счесть такое неэтичным, но в реальной жизни я могу положиться на помощь Маркелуса и ему подобных. Я смотрю на него и вижу живой пример тому, как можно было бы скомбинировать сервис AppFabric Access Control (ACS для краткости) в Windows Azure с обширной социальной сетью.
Однако в виртуальном мире, когда используется несколько облачных сервисов, им зачастую нужно знать, кто я такой, прежде чем открывать доступ к своей функциональности. Поскольку я не могу запрограммировать Маркелуса на обслуживание веб-страниц, я задействую облачные сервисы, перечисленные в табл. 1.
Табл. 1. Облачные сервисы и их функциональность
СервисФункциональностьWindows AzureХостинг моего сайта и обслуживание страницAppFabric Access ControlУправление и согласование метода аутентификации между моим сайтом и FacebookFacebookАутентификация пользователей и предоставление сервисов социальной сетиBing MapsВизуализация мест проживания друзей
Сценарий примера таков:при переходе на начальную страницу моего сайта пользователь будет аутентифицироваться Facebook, а заявки будут передаваться обратно моему сайту. После этого сайт будет получать список друзей данного пользователя от Facebook, а затем извлекать информацию для выбранного друга. Если выбранный друг указывал место проживания, его название можно будет щелкнуть, и сервис Bing Maps покажет соответствующую карту.
Настройка аутентификации между сервисами
В номере MSDN Magazine за декабрь 2010 г. была хорошая обзорная статья по ACS, которую можно найти по ссылке msdn.microsoft.com/magazine/gg490345. Я опишу специфические вещи, необходимые для объединения моего сайта в федерацию с Facebook. Чтобы сделать это корректно, я использую AppFabric Labs — предварительную версию Windows Azure AppFabric для разработчиков. Кроме того, я установил Windows Azure SDK 1.3 и Windows Identity Foundation SDK 4.0. Чтобы приступить к работе, я отправился на portal.appfabriclabs.com и зарегистрировался. Получив доступ к ACS, я последовал первой части инструкций на странице CodePlex «ACS Samples and Documentation (Labs)» (bit.ly/fuxkbl) для подготовки пространства имен сервиса. Следующей целью была настройка Facebook в качестве Identity Provider (провайдера идентификации), но для этого мне пришлось сначала создать приложение Facebook (см. инструкции по ссылке bit.ly/e9yE3I).В итоге я получил сводную страницу, показанную на рис. 1.
Рис. 2. Сводка конфигурации приложения Facebook
Эта сводная страница весьма важна, так как информация с нее понадобится мне при настройке Facebook в качестве Identity Provider в ACS. В частности, мне потребуются Application ID и Application Secret, как можно увидеть в конфигурационной информации из ACS на рис. 2.
Рис. 3. Конфигурация провайдера идентификации Facebook для ACS
Заметьте, что в поле Application permissions я добавил friends_hometown. Мне понадобится выводить этот адрес на карте, и, если бы я не указал его здесь, я не смог бы получить его обратно по умолчанию. Если бы я хотел, чтобы вызовы Graph API возвращали какие-то другие данные о пользователе, мне пришлось бы искать их на сайте Facebook Developers (bit.ly/c8UoAA) и включать соответствующий элемент в список Application permissions.
При работе с ACS стоит отметить следующее: вы указываете доверяющие стороны (Relying Parties, RP), которые будут использовать Identity Provider. Мой сайт «прописан» по адресу jofultz.cloudapp.net, и он будет указан как доверяющая сторона в конфигурации Identity Provider. То же самое относится к моему localhost. Если бы я тестировал свою систему не в облаке, мне пришлось бы сконфигурировать localhost в качестве доверяющей стороны и выбрать его, как показано на рис. 3.
Рис. 4. Конфигурация провайдера идентификации Facebook для ACS: доверяющие стороны
Содержимое рис. 2 и 4 находится на одной странице для конфигурирования провайдера идентификации. С одним маркером, если бы я сконфигурировал его только для localhost, а потом попытался бы аутентифицироваться со своего веб-сайта, у меня ничего не вышло бы. Я могу создать собственную страницу входа — соответствующие руководство и пример есть в разделе Application Integration на сайте управления ACS. В данном примере я просто использую страницу по умолчанию, размещаемую в ACS.
До сих пор я настраивал ACS и свое приложение Facebook так, чтобы они «общались» прямо после вызова. Следующий шаг — сконфигурировать этот провайдер идентификации для моего сайта как механизм аутентификации. Самый простой способ сделать это заключается в установке Windows Identity Foundation SDK 4.0 (bit.ly/ew6K5z). После установки в контекстном меню будет доступна команда Add STS Reference, как показано на рис. 4.
Рис. 5. Команда меню Add STS Reference
В примере я использовал сайт ASP.NET по умолчанию, созданный в Visual Studio выбором нового проекта Web Role. После создания я щелкаю сайт правой кнопкой мыши и запускаю мастер. Сайт конфигурируется на использование существующего сервиса Security Token Service (STS); для этого я выбираю в мастере соответствующий вариант и указываю путь к метаданным WS-Federation. Для моего пространства имен управления доступом путь выглядит так:
jofultz.accesscontrol.appfabriclabs.com/ FederationMetadata/2007-06/ FederationMetadata.xml
На основе этой информации мастер добавит в конфигурацию сайта раздел <microsoft.identityModel/>. Потом под элементом <system.web/> разместит <httpRuntime requestValidationMode=”2.0″ />. Если я указываю localhost в качестве RP, я могу запустить приложение и при запуске увидеть размещенную в ACS страницу входа, которая будет представлять Facebook (или Windows Live, Google — все зависит от конфигурации). Элемент microsoft.identityModel полагается на существование сборки Microsoft.Identity, поэтому убедитесь, что ссылка на DLL в сайте установлена как Copy Always. Если это не так, то при переносе в Windows Azure сайт потеряет DLL и не сможет работать. Возвращаясь к моему предыдущему утверждению о необходимости конфигурации для localhost и размещенного сайта Windows Azure, после завершения работы мастера необходимо выполнить дополнительную настройку. Поэтому, если в мастере был задан путь localhost, по окончании его работы нужно вручную добавить в элемент <audienceUris> путь для сайта в Windows Azure:
<microsoft.identityModel> <service> <audienceUris> <add value=”http://jofultz.cloudapp.net/” /> <add value=”http://localhost:81/” /> </audienceUris>
Кроме того, атрибут realm элемента wsFederation в конфигурационном файле должен отражать текущее местонахождение исполняющей среды. Таким образом, в моем случае при развертывании в Windows Azure он выглядит следующим образом:
<federatedAuthentication> <wsFederation passiveRedirectEnabled=”true” issuer= “https://jofultz.accesscontrol.appfabriclabs.com/v2/wsfederation” realm=”http://jofultz.cloudapp.net/” requireHttps=”false” /> <cookieHandler requireSsl=”false” /></federatedAuthentication>
Однако, если требуется отладка и корректная работа в период выполнения на localhost (для локальной отладки), нужно изменить realm так, чтобы он указывал, где локально размещен сайт, например:
<federatedAuthentication> <wsFederation passiveRedirectEnabled=”true” issuer=”https://jofultz.accesscontrol. appfabriclabs.com/v2/wsfederation” realm=”http://localhost:81/” requireHttps=”false” /> <cookieHandler requireSsl=”false” /></federatedAuthentication>
Все правильно настроив, я должен получить возможность выполнять сайт, а при попытке перейти к странице по умолчанию я буду перенаправляться к размещенной в ACS странице входа, где смогу выбрать Facebook в качестве провайдера идентификации. Щелкнув Facebook, я перехожу на страницу входа в Facebook для аутентификации (рис. 6).
Рис. 6. Страница входа в Facebook
Поскольку я еще не использовал свое приложение, Facebook выведет диалог Request for Permission, показанный на рис. 7.
Рис. 7. Request for Permission для приложения
Не желая остаться вне круга тех, кто использует столь фантастично шикарное приложение, я быстро щелкаю Allow, после чего Facebook, ACS и мое приложение обмениваются информацией (через перенаправления браузера), и в конечном счете я попадаю в свое приложение. В этот момент я просто получаю пустую страницу, но ей известно, кто я такой, и поэтому в верхнем правом углу страницы появляется сообщение «Welcome Joseph Fultz».
Facebook Graph API
В приложении нужно получать список друзей, образующих мою социальную сеть, а затем получать информацию об этих друзьях. Facebook предоставляет Graph API, который позволяет разработчикам делать подобные вещи. Он весьма тщательно документирован и, что самое замечательное, имеет линейную и простую реализацию, упрощающую его понимание и применение. Для выдачи запросов мне понадобится маркер доступа (Access Token). К счастью, он возвращается в заявках, и с помощью Windows Identity Foundation SDK заявки помещаются в идентификацию участника системы безопасности (principal identity). Заявки (claims) выглядят примерно так:
http://schemas.xmlsoap.org/ws/2005/05/ identity/claims/nameidentifier http://schemas.microsoft.com/ws/2008/06/ identity/claims/expiration http://schemas.xmlsoap.org/ws/2005/05/ identity/claims/emailaddress http://schemas.xmlsoap.org/ws/2005/05/ identity/claims/name http://www.facebook.com/claims/AccessToken http://schemas.microsoft.com/ accesscontrolservice/2010/07/claims/ identityprovider
Из них мне нужно извлечь последнюю часть полного имени (например, nameidentifier, expiration и т. д.) и соответствующее значение. Поэтому я создаю метод ParseClaims для разбора заявок и размещения этих заявок и их значений в хеш-таблицу для дальнейшего использования, а затем вызываю его в обработчике события загрузки страницы:
protected void ParseClaims(){ string username = default(string); username = Page.User.Identity.Name; IClaimsPrincipal Principal = (IClaimsPrincipal) Thread.CurrentPrincipal; IClaimsIdentity Identity = (IClaimsIdentity) Principal.Identity; foreach (Claim claim in Identity.Claims) { string[] ParsedClaimType = claim.ClaimType.Split('/'); string ClaimKey = ParsedClaimType[ParsedClaimType.Length - 1]; _Claims.Add(ClaimKey, claim.Value); }}
Я также создаю класс FBHelper с методами для доступа к нужной мне информации от Facebook. И первым делом я создаю метод, помогающий выдавать все необходимые запросы. При выдаче каждого запроса используется объект WebClient, а ответ разбирается с помощью JavaScript Serializer:
public static Hashtable MakeFBRequest(string RequestUrl){ Hashtable ResponseValues = default(Hashtable); WebClient WC = new WebClient(); Uri uri = new Uri(String.Format(RequestUrl, fbAccessToken)); string WCResponse = WC.DownloadString(uri); JavaScriptSerializer JSS = new JavaScriptSerializer(); ResponseValues = JSS.Deserialize<Hashtable>(WCResponse); return ResponseValues;}
Как видно в этом фрагменте кода, у каждого запроса должен быть маркер доступа, который был возвращен в заявках. Закончив с методом выдачи запросов, я создаю метод для выборки друзей и разбора их в хеш-таблицу, содержащую каждый из их идентификаторов и имен Facebook:
public static Hashtable GetFBFriends(string AccessToken){ Hashtable FinalListOfFriends = new Hashtable(); Hashtable FriendsResponse = MakeFBRequest(_fbFriendsListQuery, AccessToken); object[] friends = (object[])FriendsResponse["data"]; for (int idx = 0; idx < friends.Length;idx++ ) { Dictionary<string, object> FriendEntry = (Dictionary<string, object>)friends[idx]; FinalListOfFriends.Add(FriendEntry["id"], FriendEntry["name"]); } return FinalListOfFriends;}
Десериализация списка друзей приводит к созданию вложенной структуры Hashtable->Hashtable->Dictionary. Благодаря этому мне остается проделать минимум работы и поместить ее содержимое в свою хеш-таблицу. После этого я переключаюсь на страницу default.aspx, добавляю ListBox, пишу код, получающий список друзей, и связываю результат с новым ListBox:
protected void GetFriends() { _Friends = FBHelper.GetFBFriends((string)_ Claims["AccessToken"]); this.ListBox1.DataSource = _Friends; ListBox1.DataTextField = “value”; ListBox1.DataValueField = “key”; ListBox1.DataBind(); }
Если запустить приложение на этом этапе, то после аутентификации я увижу список всех своих друзей на Facebook. Но постойте-ка, это еще не все! Мне нужно получать доступную информацию о любом выбранном друге, чтобы у меня была возможность показывать место его проживания на карте. Возвращаемся к классу FBHelper и добавляем простой метод, который будет принимать маркер доступа и идентификатор выбранного друга:
public static Hashtable GetFBFriendInfo(string AccessToken, string ID){ Hashtable FriendInfo = MakeFBRequest(String.Format(_fbFriendInfoQuery, ID) + “?access_token={0}”, AccessToken); return FriendInfo;}
Заметьте, что в обоих созданных мной вспомогательных методах для Facebook я ссылаюсь на строку-константу, содержащую необходимый запрос Graph API:
public const string _fbFriendsListQuery = “https://graph.facebook.com/me/friends?access_token={0}”;public const string _fbFriendInfoQuery = “https://graph.facebook.com/{0}/”;
Создав последний метод для Facebook, я добавляю на страницу GridView и настраиваю его на связывание с хеш-таблицей, а затем — в отделенном коде в методе SelectedIndexChanged для ListBox — я связываю его с Hashtable, возвращаемым методом GetFBFriendInfo, как показано на рис. 8.
Рис. 8. Добавление GridView
protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e){ Debug.WriteLine(ListBox1.SelectedValue.ToString()); Hashtable FriendInfo = FBHelper.GetFBFriendInfo((string)_Claims["AccessToken"], ListBox1.SelectedValue.ToString()); GridView1.DataSource = FriendInfo; GridView1.DataBind(); try { Dictionary<string, object> HometownDict = (Dictionary<string, object>) FriendInfo["hometown"]; _Hometown = HometownDict["name"].ToString(); } catch (Exception ex) { _Hometown = “”;//Not Specified”; }}
А теперь, закончив с получением списка друзей и информации о них из Facebook, я перехожу к отображению мест их проживания на карте.
Нет ничего лучше дома
Для тех друзей, которые указали место своего проживания, я хочу иметь возможность щелкать названия их городов и видеть их на карте. Первый шаг — добавление карты к странице. Это довольно простая задача, так как Bing предоставляет отличный интерактивный SDK, который демонстрирует функциональность и позволяет копировать исходный код. Вы найдете этот SDK по ссылке microsoft.com/maps/isdk/ajax/. В страницу default.aspx я добавляю тег div, в котором будет храниться карта:
<div id=”myMap” style=”position:relative; width:400px; height:400px;” ></div>
Однако, чтобы получить карту, я добавляю ссылку в тег script и пишу скриптовый код для страницы SiteMaster:
<script type=”text/javascript” src=”http://ecn.dev.virtualearth.net/ mapcontrol/mapcontrol.ashx?v=6.2″></script> <script type=”text/javascript”> var map = null; function GetMap() { map = new VEMap('myMap'); map.LoadMap(); } </script>
Теперь, когда я получу страницу, я увижу карту в исходной позиции, но мне нужно, чтобы при выборе друга карта смещалась к месту его проживания. При обработке события SelectedIndexChanged (обсуждалось ранее) я также связываю метку в странице с названием и добавляю событие щелчка на клиентской стороне, чтобы карта находила местоположение на основе значения метки:
onclick=”map.Find(null, hometown.innerText, null, null, null, null, true, null, true); map.SetZoomLevel(6);”
Вызывая map.Find, вы можете при желании оставить большую часть концевых параметров выключенными (null). Описание метода Find см. по ссылке msdn.microsoft.com/library/bb429645. Вот и все, что нужно для отображения и взаимодействия с картой в этом простом примере. Теперь я готов запустить сайт во всей его красе.
Если identityModel был сконфигурирован для корректной работы с localhost, как описывалось ранее, то можно нажать клавишу F5 и запустить сайт локально для отладки. И вот я жму F5, вижу всплывающее окно браузера, и появляются варианты входа. Я выбираю Facebook и перехожу на страницу входа, которая была показана на рис. 6. После входа приложение перенаправляет меня на страницу default.aspx, которая теперь отображает список моих друзей и исходную карту, как на рис. 9.
Рис. 9. Демонстрационная начальная страница
Далее я просматриваю список друзей и выбираю одного из них. В результате мне становится доступной информация о нем в зависимости от его настроек защиты и разрешений, запрошенных для моего приложения при настройке провайдера идентификации (рис. 2). Затем я щелкаю название его города, показываемое над картой, и карта смещается к центру его города (рис. 10).
Рис. 10. Карта города в Bing Maps
Заключительные соображения
Надеюсь, мне удалось показать, как связать воедино платформу Windows Azure, Bing Maps и Facebook и насколько это легко. Используя ACS, я сумел создать приложение-пример на основе облачных технологий. Приложив еще немного усилий, так же несложно подключить собственный сервис идентификации, который будет работать так, как вам нужно. Изящество этой федерации идентификаций в том, что применение Windows Azure позволяет вести разработку на различных платформах и включать сервисы от сторонних поставщиков, не ограничивая вас единственным провайдером и его сервисами и не заставляя придумывать собственные способы интеграции. Платформа Microsoft Windows Azure обладает колоссальной мощью и дает возможность легко объединять ваши приложения с облачными сервисами.
Опубликованы новые эскизы необычного офисного здания компании Apple, которое планируется построить в городе Купертино.
Первая информация об амбициозном строительстве в форме фантастического космического корабля появилась в июне прошлого года.
"Это удивительное здание. Оно немного походит на посаженный космический корабль. В центре здания размещён прекрасный внутренний двор… Всё здание выполнено в виде круга. Это не самый дешевый способ создавать что-либо. Прямых линий нет совсем в этом проекте. Все изогнуто. Мы используем весь наш опыт в создании офисных здания во всём мире, и мы знаем, как сделать самые большие конструкции из стекла для архитектурного использования", объявил Стив Джобс в июне.
Проект было решено реализовать в Калифорнии. В здании будут находиться наряду с обычными офисными помещениям ещё и помещения для научных исследований. Здание будет занимать площадь приблизительно в 2,8 миллиона квадратных футов (1 фут равен 0,3048 метра).
Четырехэтажная структура "Университетского городка Apple 2" будет содержать 1 000 мест в Корпоративных Аудиториях, Корпоративный Фитнес-центр, Экспериментальные установки, занимающие приблизительно 300 000 квадратных футов, Центральную Фабрику, и парковку.
Apple создает свою локальную Центральную Фабрику, чтобы уменьшить заисимость компании от электричества, обеспечиваемого городской энергосистемой.
Офис будет рассчитан на 13 000 служащих.
Мэр Купертино Гильберт Вонг сказал, что нет "никакого шанса", что муниципальный совет не одобрит строительство.
Так будущий "университетский городок выглядит в проекте.
Существует множество определений облачных вычислений, но наиболее емкое и широко признанное принаджежит Национальному институту стандартов и технологий США (National Institute of Standards and Technology, NIST). NIST определил пять основных признаков, три модели обслуживания и четыре модели развертывания. В совокупности пять признаков составляют определение, то есть только решение, обладающее следующими признаками, может называться «облаком»:
самообслуживание по требованию;широкий сетевой канал;поддержка пулов ресурсов;ыстрая масштабируемость (эластичность);измеримость потребления сервисов.
Также в NIST определили три модели обслуживания, или, как иногда их называют, уровни архитектуры:
нфраструктура как сервис (Infrastructure as a Service, IaaS);ПО как сервис (Software as a Service, SaaS);латформа как сервис (Platform as a Service, PaaS).
Наконец, в NIST определили четыре модели развертывания:
астное облако (Private Cloud);общее облако (Community Cloud);публичное облако (Public Cloud);гибридное облако (Hybrid Cloud).Знакомство с облаком
В команде Microsoft Services спроектировано, создано и реализовано решение Private Cloud/IaaS на базе Windows Server, Hyper-V и System Center. На протяжении всех статей этой серии мы постараемся показать, как можно интегрировать и развернуть каждый составляющий продукт в качестве решения и при этом обеспечить такие основные атрибуты облака, как эластичность, поддержка пулов ресурсов и самообслуживание.
В этой статье дано определение Private Cloud/IaaS, описаны атрибуты облака и принципы проектирования центра обработки данных (ЦОД), используемые в качестве требований при детализации базовой архитектуры, построенной для их удовлетворения. Во второй и третьей статьях будет описан подробный проект базовой архитектуры, каждый ее уровень и содержащиеся в ней продукты, а также автоматизация технологических процессов. И, наконец, в четвертой части я расскажу о процессе автоматизации развертывания с помощью Microsoft Deployment Toolkit и Hydration Framework для обеспечения последовательности и повторяемости реализации.
В качестве исчерпывающего определения облака мы воспользуемся моделями развертывания NIST. Термин «частное облако» будет использоваться в различных контекстах без указания рассматриваемой модели обслуживания.
Помимо характеристик, описанных в определении NIST, мы установим несколько дополнительных требований к этому проекту:
приоритет устойчивости перед избыточностью;однородность и стандартизация;поддержка пулов ресурсов;виртуализация;управление структурой Fabric;эластичность;секционирование общих ресурсов;прозрачность расчета платы за пользование облаком.
В одной из команд Microsoft собрали и определили эти принципы. Команда оценила работу организации Global Foundation Services (GFS), в чьем ведении находятся наши глобальные ЦОД, отдела MSIT, который управляет инфраструктурой и приложениями Microsoft, а также нескольких крупных клиентов, согласившимися принять участие в исследовании. Вооружившись указанными определениями и принятыми требованиями, мы перешли к этапу проектирования архитектуры. Здесь мы определили требования и создали соответствующую им модель архитектуры.
Базовая архитектура Private Cloud/IaaS
Руководствуясь описанным в одной из моих ранних статей «From Virtualization to Dynamic IT» (От виртуализации к динамической IT) в журнале The Architecture Journal за июнь 2010 года подходом к созданию архитектуры, мы решили принять за основу базовой модели взять ту, что показана на рис. 1.
Рис. 1. Основа базовой архитектуры
Уровень оборудования
Уровень оборудования включает оборудование ЦОД и механические системы, а также подсистему хранения, сеть и вычислительную инфраструктуру. Для взаимодействия с расположенными выше слоями архитектуры каждый из этих элементов должен предоставлять интерфейсы управления. В качестве примеров можно привести серверы, поддерживающие интерфейсы Web Services-Management (WS-Management) и массивы хранилищ, предоставляющие интерфейсы на основе Windows PowerShell или SMI-S (Storage Management Initiative – Specification).
В Microsoft утверждают, что программа Hyper-V Cloud FastTrack создана для объединения ПО Microsoft, единых стандартов, полученных от партнеров OEM проверенных конфигураций для вычислений, сетей и хранилищ, а также дополнительных компонентов ПО с целью создания частных облачных решений. Такие компании, как Hewlett-Packard Co., Dell Inc., IBM Corp., Fujitsu, Hitachi Ltd. и NEC Corp., являются партнерами FastTrack и предоставляют интегрированные и проверенные решения уровня оборудования.
Уровень виртуализации
Этот уровень создается на основе Windows Server 2008 R2 (теперь с Service Pack 1) и Hyper-V. Он дает возможность использовать виртуальные машины и сети, включающие виртуальные сети VLAN, предоставлять ресурсы хранения, составленные из общих дисков кластеров и виртуальных дисков. Уровень виртуализации помогает обеспечить часть обязательных признаков в соответствии с классификацией NSIT, таких как поддержка пулов ресурсов и эластичность. Виртуализация позволяет гораздо быстрее совместно использовать и подготавливать ресурсы к работе.
Уровень автоматизации
За уровнем виртуализации следует уровень автоматизации (рис. 2). Уровни автоматизации, управления и оркестрации строятся от более мелких к более крупным согласно процессу автоматизации ИТ. Самый нижний из них – уровень автоматизации – включает технологии, такие как Windows PowerShell 2.0, Windows Management Instrumentation (WMI) и WS-Management. Эти фундаментальные технологии обеспечивают интерфейс между более высокими уровнями систем управления и физическими и виртуальными ресурсами.
Рис. 2. Модель архитектуры, используемая для построения модели частного облака
Уровень управления
Уровень управления состоит из нескольких продуктов Microsoft System Center, использующих технологии уровня автоматизации для выполнения таких задач управления, как определение совместимости исправлений, их установка и проверка результатов установки. Уровень управления обеспечивает базовую автоматизацию процессов, но обычно ограничивается одним из аспектов жизненного цикла управления сервером (таким как развертывание, внесение исправлений, слежение, резервное копирование и т .п.).
Уровень оркестрации
В явном виде этот уровень обычно в традиционных ИТ-структурах не встречается, но он чрезвычайно важен для обеспечения признаков облака. Он связывает множество продуктов, технологий и процессов, позволяющих полностью автоматизировать ИТ-процессы. System Center Configuration Manager автоматизирует развертывание исправлений, но его интеграция с системой обслуживания и управления или дополнительными сторонними продуктами и решениями требует координации (оркестрации) сквозных процессов, в которых задействовано множество продуктов.
Для реализации этого уровня используется System Center Opalis (его название вскоре заменят на System Center Orchestrator). Opalis интегрирует набор System Center и способствует интеграции с множеством сторонних и партнерских решений. Уровень оркестрации помогает создавать рабочие процессы или задания по автоматизации таких сложных задач, как развертывание кластеров, внесение исправлений на хостах и подготовка виртуальных машин к работе.
Интерфейсы самообслуживания пользователей и администратора
Для многих ИТ-организаций определенный в NIST признак самообслуживания по запросу или пользовательское самообслуживание является совершенной новинкой. Прежде всего, речь идет об устранении барьеров между потребностями пользователей в ИТ-ресурсах и возможностью их доставки. К примеру, в некоторых организациях с момента подачи запроса на установку нового сервера до его непосредственной готовности к работе проходит до полгода. Ограничения процесса и технологии приводят к задержкам.
Функция самообслуживания требует нового интерфейса, дающего пользователям возможность запрашивать ресурсы. Чаще всего это реализуется как ИТ-портал самообслуживания, где пользователям доступен каталог сервисов, из которого они могут выбрать нужный, например установку новой виртуальной машины.
В нашей базовой архитектуре мы определили и интерфейс самообслуживания и централизованный интерфейс администратора ИТ. Для создания интерфейса потребителя Microsoft предлагает использовать System Center Virtual Machine Manager (VMM) Self-Service Portal 2.0, а для нестандартных сценариев и хостинга — Dynamic Datacenter Toolkit for Hosters (DDTK-H). В нашем решении используется индивидуальная версия DDTK-H ввиду необходимости особой настройки и автоматизации. Мы ожидаем, что в будущих продуктах Microsoft будет больше готовых решений.
Интерфейс администратора создан с помощью System Center Service Manager (SCSM) и интерфейсов System Center. SCSM — самый новый продукт Microsoft. Он предоставляет базу данных управления конфигурацией (CMDB), а также надежное решение управления изменениями. В нашем решении все стандартные операции формируются в виде запросов на изменения в SCSM. Они инициируют автоматизированные рабочие процессы в Opalis. Так мы обеспечиваем надлежащее управление изменениями, предоставляя развитые возможности автоматизации.
Логическая модель Private Cloud/IaaS
Одним из ключевых отличий частного облака от традиционных ЦОД и серверных инфраструктур является абстрагирование от таких физических ресурсов, как серверы, сети и дисковые ресурсы. Они объединяются на более высоком уровне в пулы ресурсов, дефектные домены, домены обновления и т. д. Эти логические объединения относятся к физической инфраструктуре и помогают принимать информированные решения по подготовке и управлению ресурсами. Для нашей базовой архитектуры мы выбрали логическую модель, опираясь на результаты работ, проведенных Microsoft Global Foundation Services, Windows Azure и MSIT (рис. 3).
Рис. 3. Логическая модель группировки Private Cloud/IaaS
Определения объектов следующие.
Структура Fabric IaaS Вся инфраструктура и системы в рамках управления базовой архитектуры. Fabric может состоять из множества сайтов и ЦОД.
ЦОД/сайт Физическое расположение или нахождение сайта одного или более пулов ресурсов.
Пул ресурсов Пул ресурсов, включающий сервер, сеть и хранилище, предоставляет в совместное использование общее оборудование и исходные конфигурационные параметры. Они не используют совместно единственную точку отказа с каким-либо другим пулом ресурсов (за исключением собственных нужд). Пул ресурсов можно подразделить на дефектные домены, определив дефектный домен как группу компонентов инфраструктуры с общей для всех конфигурацией, который не использует совместно единственную точку отказа с любым другим дефектным доменом. Для простоты в нашем решении пул ресурсов и дефектный домен эквиваленты.
Единица масштабирования Это набор, состоящий из сервера, сети и устройства хранения и развертываемый как единый модуль. Это наименьший модуль из тех, что развернуты в структуре ЦОД. В зависимости от величины потребителя это может быть четырехузловой кластер Hyper-V или полная стойка 64 блейд-серверов. Размер компонента обычно задается, исходя из усредненной квартальной потребности в новых ресурсах. Вместо того чтобы всякий раз, когда потребуются дополнительные ресурсы, развертывать отдельный сервер, можно развертывать компонент для удовлетворения потребности и сохранения возможности дальнейшего роста.
Кластер хостов Это группа, включающая от двух до шестнадцати серверов Hyper-V в отказоустойчивой кластерной конфигурации, и связанные с ними сети и хранилища.
Домен обновлений Это набор элементов инфраструктуры в пуле ресурсов, который можно поддерживать, отключать или обновлять, не вызывая при этом каких-либо простоев виртуальных машин или рабочих процессов, выполняющихся в пуле ресурсов. В этой архитектуре каждый узел в каждом из кластеров пула ресурсов образует домен обновлений. Поскольку каждый кластер имеет резервный узел (15+1), можно поддерживать по одному узлу в каждом кластере без простоев (виртуальные машины мигрируются за пределы кластера для выполнения операций обслуживания). Так все узлы в одном пуле ресурсов образуют один домен обновления, следующие узлы – во втором домене обновления и т. д. (рис. 4).
Рис. 4. Пул ресурсов с дочерними единицами масштабирования
Необходимость определения и реализации этих контейнеров обусловлена тем, что с их помощью можно автоматизировать интеллектуальную инициацию и управление. Например, при работе с веб-фермой из четырех серверов нужно быть уверенным в высоком уровне доступности как минимум одного из сайтов в случае сбоя. Надо просто позаботиться о том, чтобы запрос на инициацию распределялся на два сайта и два или более пула ресурсов. Это обеспечивается определением пулов ресурсов и их привязкой к физической инфраструктуре. Правильная организация виртуальных машин позволяет добиться гибкости сервиса.
Опытные пользователи System Center заметят, что описанные здесь контейнеры и определения не входят в готовый пакет System Center. Чтобы определить эти контейнеры, атрибуты и отношения, мы воспользовались расширяемостью SCSM CMDB. Эти элементы лежат в основе выходных данных автоматизации рабочих процессов Opalis. В будущем, с помощью VMM 2012 многие из этих контейнеров и отношений будут поставляться в готовом виде, только имена будут другими.
Базовая реализация Private Cloud/IaaS
Логическое и физическое разделение платформы управления от платформы размещения виртуальной машины помогает выполнять масштабирование каждой из них независимо (рис. 5). В центре схемы на рис. 5 показаны пулы ресурсов в рамках системы управления и все решение целиком, которое может быть развернуто в существующем ЦОД.
Рис. 5. Логическая диаграмма реализации архитектуры
Автоматизированное развертывание — один из ключевых элементов базовой реализации, служащий для улучшения и ускорения развертывания и последовательности реализации. Это на самом деле так, так как Microsoft Services работает с широким диапазоном партнеров и потребителей. Для автоматизации развертывания в базовой реализации предусмотрен бесплатный набор инструментов Microsoft Deployment Toolkit (MDT) и Microsoft Services Hydration Framework. MDT расширяет возможности автоматизации развертывания.
Определение обязательных областей подробного проекта – это следующий этап процесса проектирования. Вот эти области:
одробный проект каждого продукта System Center;подробный проект инфраструктуры размещения управления структурой Fabric;инициация управления структурой Fabric;проектирование единиц масштабирования;подготовка единиц масштабирования;проектирование рабочих процессов.
Базовая архитектура обеспечивает наличие всех признаков облака в соответствии с определением NIST и механизм для расширенной автоматизации ИТ. При выборе сценария автоматизации мы сосредоточили внимание на повышенной сложности, более высоких затратах и рисках пользовательских ошибок в сценариях. С этой целью в решении автоматизированы следующие процессы:
установка управления структурой Fabric:
развертывание управления фабрикой Hyper-V Host;развертывание виртуализированного кластера SQL;развертывание VMM;развертывание SCSM;развертывание System Center Operations Manager (SCOM);развертывание System Center Configuration Manager (SCCM);развертывание System Center Opalis ;персонализация и настройка;
подготовка к работе единицы масштабирования (хост-кластера):
установка «чистой» ОС;установка Hyper-V;настройка кластера;
установка исправлений единицы масштабирования (хост-кластера):
оркестрация миграции виртуальных машин с хостов для установки исправлений с помощью режимов поддержки VMM и SCOM для каждого домена обновления;оркестрация SCCM для установки исправлений хостов и проверка успешной установки исправлений;удаление хостов из режима поддержки и переход к следующему домену обновления;
поддержка хоста:
оркестрация живой миграции виртуальных машин с хостов, требующих поддержки, с помощью режимов сопровождения VMM и SCOM;удаление хостов из режима поддержки;
подготовка виртуальной машины:
обеспечение возможности инициации виртуальной машины посредством интерфейса портала;Opalis принимает запросы на подготовку к работе и выполняет оркестрацию подготовки виртуальных машин по заранее настроенным шаблонам;Opalis проверяет, была ли создана виртуальная машина и обеспечена ее видимость во всех продуктах System Center;Opalis выполняет установку агента SCOM на требуемых виртуальных машинах;виртуальные машины становятся доступны и готовы к управлению посредством интерфейса портала;
отмена инициации виртуальной машины:
создание запроса на отмену инициации виртуальной машины посредством интерфейса портала;Opalis принимает запросы на отмену инициации, удаляет виртуальную машину из всех продуктов System Center, после чего удаляет саму виртуальную машину;Opalis удаляет учетную запись Active Directory виртуальной машины и запись А в DNS.
В следующей статье этой серии мы изучим подробный проект архитектуры управления структурой Fabric, включая проект управления структурой Fabric кластера Hyper-V, проект виртуализированного кластера SQL и проект каждого из продуктов System Center. Кроме того, мы расскажем о проекте единицы масштабирования, содержащей кластеры Hyper-V из 16 узлов.
Обилие социальных сетей давно вызывает у пользователей желание найти такой сервис, чтобы всеми своими профилями можно было управлять из одного места. Спрос рождает предложение – и на рынке сейчас представлены несколько веб-сервисов и программных продуктов, в том числе для мобильных устройств, в той или иной степени способных предоставить доступ к профайлам из нескольких сетей в одном интерфейсе.
Новый сервис подобного рода предлагает крупнейшая в России телекоммуникационная компания «Мобильные ТелеСистемы» (МТС). Сервис находится по адресу online.mts.ru и привязан к одноимённой услуге «МТС Онлайн» для мобильного общения.
Сервис вместе с услугой позволяют настроить и получать уведомления о входящих сообщениях через СМС, отвечать на уведомления через СМС, устанавливать статусы через отправку СМС. СМС-уведомления при этом бесплатны, а все исходящие СМС в рамках услуги стоят 50 копеек.
Непосредственно из профиля на сервисе от МТС можно публиковать посты в любую из подключённых сетей или сразу в несколько из них. Сам сервис также представляет из себя социальную сеть: здесь можно настроить профайл и общаться с другими пользователями сервиса.
МТС Онлайн пока поддерживает только три сети: ВКонтакте, Facebook и Одноклассники. Вице-президент по маркетингу МТС Михаил Герчук обещает, что в ближайшее время число доступных интернет-сообществ будет расширено. Однако, получать СМС-уведомления в рамках услуги уже сейчас можно из сервиса дневников LiveJounal и из сервиса блогов «Мой Мир» портала mail.ru. О всех настройках и подключении услуги рассказано на этой странице. Там же есть информация о настройке отправки сообщений через СМС в микроблоги rutwit.ru.
Для многих облака являются очень привлекательным вариантом. Они предлагают практически неограниченные возможности по хранению и экономии затрат компаниям, которые стремятся сократить площади, выделенные под центры обработки данных, и повысить эффективность работы с данными и приложениями, доступ к которым осуществляется через Интернет.
Однако у большинства компаний возникает масса вопросов касательно безопасности и управления доступом в облачных приложениях. Так как же компания может воспользоваться преимуществами этого ресурса, обеспечив при этом безопасность и надежность корпоративных данных?
При посадке в самолет вам предлагают пристегнуться ремнем безопасности и внимательно прослушать инструктаж по безопасности. Примерно то же самое надо сделать перед тем, как взлететь со своими данными в облако. Давайте познакомимся с основными моментами инструктажа по безопасности перед путешествием в облако.
Тщательно упакуйте багаж
Те, кто летал на самолетах, знают, что место в салоне самолета очень ограничено. Большую часть чемоданов придется сдать в багаж, и они поедут отдельно в специальных багажных отделениях. Поэтому при паковке багажа наиболее ценные вещи надо брать с собой. С корпоративными данными ситуация практически такая же.
Перед упаковкой и отправкой данных в облако их надо рассортировать, разбить на категории и классифицировать. Не все корпоративные данные можно сдавать «в багаж». Если это конфиденциальные данные с информацией о клиентах, компрометация которой может серьезно повредить репутации компании, надо серьезно подумать, стоит ли размещать ее в облаке. Скорее всего, нет. Менее важную информацию можно разместить в облаке, а критически важную — в корпоративном центре обработки данных.
«Ваш паспорт, пожалуйста»
Прежде чем разместиться в самолете или сдать чемоданы в багаж, вы должны пройти несколько серьезных процедур безопасности. Пограничники проверят ваш паспорт. Если документы в порядке, вы пройдете проверку. Не прошедших проверку идентифицируют и не позволяют даже приблизиться к самолету, чтобы они не могли причинить никакого вреда.
Если вы решите разместить данные в облаке, вы должны позаботиться о таких же эффективных процедурах паспортного контроля. На языке ИТ это называется «управление доступом». Надо обеспечить, чтобы доступ к данным был только у авторизованных пользователей и только к тем данным, к которым доступ им разрешен.
Если ваши политики безопасности и доступа будут слишком жесткими, легальные пользователи могут не получить доступ к данным. С другой стороны, если они будут слишком слабыми, данные будут доступны всем и вероятность компрометации будет очень высока.
Гибкий доступ может означать для ваших пользователей возможность обращаться к данным с мобильных устройств извне компании. Это открывает массу возможностей нарушений, с точки зрения как управления, так и управления доступом. Внешние устройства могут быть заражены вирусами или другим вредным ПО, которое может угрожать безопасности ваших данных или приложений.
В обычной среде данные защищаются паролями. В виртуальном мире требуются более жесткие меры безопасности. Самый важный вопрос состоит в том, может ли механизм безопасности облака обеспечить удобный и эффективный план безопасности данных. Если не удается гарантировать безопасность данных, нужно пересмотреть планы перехода в облако.
Пристегните ремни и поднимите откидные столики
Ремни жизненно важны для безопасности воздушных путешествий. Верно ли это же в отношении облака? Новое ПО шифрования, в сущности, предназначено для защиты данных, хранящихся в облаке. В реальном мире 256-разрядное AES шифрование считается наиболее безопасным вариантом, поэтому использовать в виртуальном хранилище более слабую технологию не имеет смысла.
Прежде всего, вы должны иметь четкое понимание, насколько безопасен ваш поставщик облачного хранилища. В случае малейших сомнений настоятельно рекомендуем поискать другого поставщика.
По прибытии в точку назначения
В процессе любого отпуска неизбежно возникают накладки, из-за которых он проходит немного не так, как ожидалось. Может произойти нестыковка рейсов или испортиться погода. С миграцией в облако подобная ситуация. Оно не подходит для решения всех проблем всех и каждого. Требуется внимательное изучение и планирование, чтобы обеспечить миграцию только «правильных» приложений и данных и получить ожидаемые преимущества и снижение затрат.
Надо учесть еще один параметр — скорость загрузки. Пропускная способность не главный, но достаточно важный параметр при выборе поставщика облачных услуг. Нужно выбрать оптимальное сочетание качества поддержки, цены, набора функциональности и надежности.
И еще одно соображение: в процессе планирования миграции в облако нужно позаботиться об альтернативном плане на тот случай, если что-то пойдет не так с выбранным поставщиком в технологическом или организационном плане. Как вы собираетесь восстанавливать данные, если все пойдет катастрофически не так? Может, придется какое-то время простаивать? Удастся ли перенести ваши параметры и данные к другому поставщику?
Есть вероятность компрометации облачной среды в каком-то не слишком удаленном будущем. Один ИТ-аналитик из компании Gartner Inc. рекомендует компаниям тесно сотрудничать со своими поставщиками в том, чтобы неполадки с безопасностью вовремя обнаруживались и решались до того, как они станут реальными проблемами.
Не ведитесь на посулы высокой производительности и низкую цену. Нарушение безопасности быстро и с лишком сведет на нет все эти преимущества. Достаточно серьезное нарушение безопасности может оказаться фатальным для вашей организации. Поэтому будьте начеку и тщательно планируйте свою миграцию в облако.
В результате страшных событий, произошедших в Норвегии 22 июля, погибли 93 человека. События классифицируются как двойной теракт. 32-летний норвежец Андрес Брейвик сначала взорвал бомбу в правительственном квартале Осло, а затем устроил расстрел мирных жителей в молодёжном лагере на острове Утейя.
Виновный был арестован, и сейчас над ним ведётся суд, а тем временем продолжаются поиски крайних в этой истории. На роль козла отпущения идеально подошли компьютерные игры. Несмотря на то, что психически больной человек выступал против исламизации Европы, и именно в качестве протеста против этого организовал двойной теракт, именно жестокие игры сейчас повсеместно обвиняют в его действиях. Доказательство нашли в дневнике убийцы, где он называет World of WarCraft и Call of Duty: Modern Warfare 2 своими любимыми играми. Последнюю, согласно выдержкам из дневника, Андрес Брейвик оценивает как прекрасный тренировочный полигон для подготовки подобных операций.
В подобном ключе игры не впервые всплывают в связи с терроризмом. Пилоты самолётов, врезавшихся в башни-близнецы Всемирного Торгового Центра, якобы, также готовились с помощью компьютерной игры, имитирующей управление самолётом.
В Норвегии спешно изымают из продажи любимые игры Брейвика. Особо ярые поборники правопорядка ратуют за запрет на продажу всех игр, основанных на насилии. Отдельные организации, включая представителей христиан, также высказались в поддержку этой идеи, дабы лишний раз засветиться в сводках новостей. Как-то все вдруг забыли про социальные проблемы, приводившие к трагическим развязкам задолго до появления игр и жестокий кинематограф, где сейчас модно показывать пытки и убийства. Тут можно вспомнить киносериал «Пила» или фильм «Ярость» (Rage), в котором моделируется очень похожая на случившуюся ситуация: расстрел мирных жителей в качестве социального высказывания.
Андрес Брейвик написал целый 1500-страничный манифест перед тем, как совершить преступление. Меньше, чем за час до взрыва бомбы в Осло, он отправил манифест вместе со ссылкой на YouYube на 1003 электронных адреса, 250 из которых принадлежат жителям Британии. В тексте своей политической декларации Брейвис особо часто хвалит Лигу английской обороны (British Defense League) и ссылается на свою связь с ней. Представитель Лиги, как впрочем, и многие другие люди из адресатов манифеста, спешно заявили, что Брейвика не знают и никак с ним не связаны. Также по тексту манифеста упоминается и Россия, причём в положительном ключе.
Появляется всё больше и больше информации о грядущей игре Diablo III от компании Blizzard, из чего можно сделать вывод, что релиз уже не за горами.
Среди наиболее интересных сообщений можно назвать необходимость наличия доступа в интернет. По мнению Blizzard, у большинства пользователей имеется постоянное интернет-соединение. Это должно помочь в борьбе с пиратским распространением игры. Помимо этого, плюсами такого решения должны стать сохранение персонажа на стороне сервера, возможность выбора одиночной или командной игры, постоянный список друзей, и система аукционов для приобретения игровых предметов за реальные деньги.
Blizzard не планирует продавать их напрямую. Вместо этого она позволит игрокам составлять списки предметов, за которые будет взиматься фиксированная плата. Также будут присутствовать привычные игровые деньги и торговля вещами. Игрокам будет разрешено участвовать в аукционах в любое время с мгновенным обменом почти всем, включая персонажей.
По последней информации, Diablo III не поддерживает ботов и моды, «по ряду игровых причин и вопросов безопасности». Таким образом, моды будут запрещены, несмотря на их большой успех в первых двух частях. Ожидается, что Diablo III будет доступна для ограниченного бета-тестирования уже в нынешнем квартале, а выход игры запланирован на следующий год.

Рубрики
Облако тегов
Записи RSS
Комментарии RSS
Последние 50 записей
Назад
Пустота « По умолчанию
Жизнь
Земля
Ветер
Вода
Огонь
Свет 