Вышел седьмой номер журнала ЦОДы.РФ

Первыми ознакомиться с журналом смогу посетители 26-й международной выставки «Связь-Экспокомм-2014» в рамках, которой будет представлены журнал на стенде компании MEDIA GRUS.

Не поддаваться магии бренда

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

Пример тому — широко распиаренный несколько лет тому назад контейнерный ЦОД Sun BlackBox, от которого российский заказчик потом избавился при первой же возможности — и теперь о контейнерной концепции больше и слышать не хочет. А все потому, что цена стойко-места в контейнере получилась запредельной, время развертывания — сравнимым с длительностью строительства традиционного дата-центра, а широко рекламируемая мобильность заказчику оказалась и вовсе не нужна. Почему же это решение было выбрано? Объяснение — в магии бренда.

А между тем за последние годы на российском рынке появились довольно качественные модели контейнерных ЦОДов отечественного производства. Например, счет поставкам контейнерных решений компании Telecore, которые производятся на заводе в Томске и прекрасно зарекомендовали себя в различных климатических широтах нашей страны и за рубежом, перевалил за сотню.

Еще один пример: модульные решения компании GreenMDC для наружного и внутреннего применения напоминают о том, что в Россия традиционно была сильна проектировщиками, изобретателями. Отечественные таланты заботятся о своем имени и стремятся, чтобы их продукция долго служила заказчикам. (Один из таких модулей, GreenMDC Indoor24, стал основой коммерческого дата-центра компании «МИРАН».)
Осталось лишь помечтать, что наступят такие времена, когда внутренняя начинка отечественных модулей будет базироваться на решениях российских поставщиков оборудования.

Конечно, было бы неразумно, да и невозможно полностью отказаться от плодов передовой мысли мировой индустрии дата-центров. Но российский рынок следует поговорке «Дорога ложка к обеду». До тех пор пока тарифы на электроэнергию оставались низкими, операторы ЦОДов не особенно заботились об инвестициях в энергосберегающие технологии. Важнее было не упустить время, опередить конкурентов, захватить ценные доли рынка.

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

Впрочем, и здесь приходится держать ухо востро: каждая технология имеет свою нишу применения и при неумелом использовании вместо экономии расходов может обернуться разорением. Об этом — статья Михаила Балкарова «Свобода или осознанная необходимость «свободного охлаждения».

Две технологии — контейнерные ЦОДы и фрикулинг — стали темами текущего номера журнала «ЦОДы.РФ». Казалось бы, что общего между ними? Принцип использования: какие бы инновационные технологии ни предлагались заказчику, к их выбору стоит подойти с холодной головой и трезвым расчетом. Попытаться просчитать на несколько шагов вперед, сколько будет стоить содержание такой системы и каковы реальные сроки ее окупаемости.

Специфическая задача разбирается в разделе «Проектируем систему пожаротушения». Три эксперта комментируют подходы к ее решению.
В текущем номере журнала читатель найдет подробные ответы эксперта «АМДтехологии» на сложные вопросы, которые ежедневно встают перед проектировщиком. Благодаря сотрудничеству со специалистами такого уровня журнал «ЦОДы.РФ» превратился в экспертную площадку, своего рода учебник, интересный всем участникам этого рынка.

Наталья Жилкина, главный редактор

С полным содержанием номера Вы можете ознакомиться на сайте ЦОДы.РФ №7

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

Один из подходов к отладке решений для SharePoint

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

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

Стандартный процесс включения отладки и сам процесс следующий:

  1. Включение отладки в web.config
    • CallStack="true"
    • customErrors mode="Off"
    • compilation debug="true"

  2. Процесс отладки
    • Подцепление к процессам w3wp.exe/SPUCWorkerProcess.exe/OWSTimer.exe;
    • Установка требуемых точек останова;
    • Выполнение требуемой операции и пошаговая отладка кода.

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

Стандартный процесс отладки для SharePoint нам, конечно же, тоже пригодится. Без него как без рук, когда необходимо будет отлаживать разработку на более/менее жизненных данных или потребуется опираться на события, происходящие в SharePoint. Но сейчас не об этом.

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

1. Создаем новый проект по шаблону SharePoint 2013 – Empty Project и назовем его SharePointApplication:

2. Укажем тип решения (Farm solution. Вы же знаете в чем отличие Farm от Sandbox Solution? Сейчас не будем вникать в подробности, об этом в другой статье) и укажем адрес нашей сайт-коллекции в SharePoint:

3. Далее создадим для примера простенький и без особого смысла класс DEMO с методом расширения класса SPWeb, который будет отвечать за обновление отфильтрованных списков данного узла в части свойства, отвечающего за открытие форм списка в модальном окне или же нет:

  • Добавим новый класс в проект и назовем его Demo.cs:

  • Внутри класса вставим следующий код:
    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.SharePoint;  namespace SharePointApplication {     static public class Demo     {          public static void UpdateNoDialog(this SPWeb Web, string Filter)         {             var Lists = new List<splist>();              if (!String.IsNullOrEmpty(Filter))             {                 Lists = Web.Lists.Cast<splist>()                           .Where(x => x.Title.ToLower().IndexOf(Filter.ToLower(), System.StringComparison.Ordinal) != -1)                           .ToList();             }              Lists.ForEach(x =>             {                 x.NavigateForFormsPages = true;                 x.Update();             });         }     } }  

  • В результате получится следующая картина:

4. Создадим веб-часть с полем ввода фильтра и кнопкой вызова данного метода:

  • Добавим новую веб-часть в проект и назовем ее DemoWebPart
  • В файле Elements.xml, связанном с данной веб-частью, необходимо указать название группы (DemoGroup), в которой будет отображаться созданная веб-часть:
    <?xml version="1.0" encoding="utf-8"?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/" >   <Module Name="DemoWebPart" List="113" Url="_catalogs/wp">     <File Path="DemoWebPartDemoWebPart.webpart" Url="SharePointApplication_DemoWebPart.webpart" Type="GhostableInLibrary" >       <Property Name="Group" Value="DemoGroup" />     </File>   </Module> </Elements>  

  • В файле DemoWebPart.webpart необходимо указать отображаемый заголовок и описание веб-части:
    <?xml version="1.0" encoding="utf-8"?>  <webParts>    <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">      <metaData>        <type name="SharePointApplication.DemoWebPart.DemoWebPart, $SharePoint.Project.AssemblyFullName$" />        <importErrorMessage>$Resources:core,ImportErrorMessage;</importErrorMessage>      </metaData>      <data>        <properties>          <property name="Title" type="string">Демонстрационная веб-часть</property>          <property name="Description" type="string">Веб-часть для обновления списков по фильтру</property>        </properties>      </data>    </webPart>  </webParts> 
  • В файле DemoWebPart.ascx необходимо прописать следующий код:
    <%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>  <%@ Assembly Name="Microsoft.Web.CommandUI, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>   <%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>   <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>  <%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>  <%@ Import Namespace="Microsoft.SharePoint" %>   <%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>  <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DemoWebPart.ascx.cs" Inherits="SharePointApplication.DemoWebPart.DemoWebPart" %>  <asp:Label ID="ResultLabel" runat="server" Text="Label" Visible="False" ForeColor="Green"></asp:Label><br/>  <asp:TextBox ID="FilterBox" runat="server"></asp:TextBox><br/>  <asp:Button ID="ExecuteButton" runat="server" Text="Запустить" OnClick="ExecuteButton_OnClick"/> 
  • В файле DemoWebPart.ascx.cs необходимо добавить функцию:
    protected void ExecuteButton_OnClick(object sender, EventArgs e) { 	try 	{ 		SPContext.Current.Web.UpdateNoDialog(FilterBox.Text); 		ResultLabel.Text = DateTime.Now.ToString()+" Завершено!"; 		ResultLabel.Visible = true; 		ResultLabel.ForeColor = System.Drawing.Color.Green; 	} 	catch (Exception Error) 	{ 		//Тут мы еще должны записать ошибку в лог.  		ResultLabel.Text = DateTime.Now.ToString() + " Произошла ошибка! " + Error.Message; 		ResultLabel.Visible = true; 		ResultLabel.ForeColor = System.Drawing.Color.Red;                 	} } 

5. Развернем решение на нашем сайте

6. Разместим требуемую веб-часть на странице и проверим работоспособность.

  • Перейти на страницу, где планируем разместить веб-часть
  • В риббоне нажимаем Страница – Изменить:
  • В измененном виде выбираем Вставка – ВебЧасть – DemoGroup – Демонстрационная веб-часть и кнопку Добавить:

     

  • Указываем значение фильтра (MyLists, например) и нажимаем кнопку Запустить:

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

8. Добавляем к нашему решению новое консольное приложение и назовем его ExecuteApplication.

9. Изменяем режим запуска приложения на платформу x64.

  • Заходим в свойства проекта:
  • Переходим на вкладку Build и в поле Perform target укажите x64:

10. Устанавливаем консольное приложение проектом для запуска:

11. Подключаем к проекту библиотеку из соседнего проекта, в котором находятся наши объекты и методы:

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

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.SharePoint; using SharePointApplication;  namespace ExecuteApplication {     class Program     {         static void Main(string[] args)         {             using (var Site = new SPSite("http://cib_dev3/a/snitko/"))             {                 using (var Web = Site.RootWeb)                 {                     Web.UpdateNoDialog("MyLists");                 }             }         }     } } 

13. Запускаем проект и следим за происходящим в режиме реального времени:

14. Если видим следующую ошибку (Microsoft SharePoint не поддерживается в 32-разрядном процессе. Используйте 64-разрядный исполняемый файл.), значит мы, скорее всего, не выполнили пункт номер 9. Иногда ошибка может выглядеть иначе (например, что сайт недоступен), но суть ошибки такая же:

15. Если же после изменений в классе и очередном запуске проекта видим следующую ошибку (Метод не найден: "Void SharePointApplication.Demo.UpdateNoDialogNew(Microsoft.SharePoint.SPWeb, System.String)".),:

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

  • Необходимо найти gacutil.exe (входит в состав Windows SDK. Взять можно, например, тут), создать папку в файловой системе и расположить содержимое архива в этой папке. Например, C:\gacutil.
  • Переходим в проект SharePointApplication (с основной бизнес-логикой), заходим в свойства проекта на вкладку Build Events:
  • В поле Post Build Event прописываем следующий код:
    "C:\gacutil\gacutil.exe" /i "$(TargetPath)  

  • Получилось, что на событие “После построения проекта”, которые вызывается при запуске проекта, добавили инсталляцию итоговой библиотеки текущего проекта (она находится по пути $(TargetPath) – это константа Visual Studio, которая сама формирует требуемый  путь)  в GAC с помощью утилиты gacutil.
  • В результате ошибки больше нет и при запуске консольного приложения.

Поздравляю! Процесс отладки основной бизнес-логики теперь работает на Ура.

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

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

Асинхронный Php extension для работы с бд Cassandra без Thrift

Приветствую, хабрасообщество!
Думаю многие кто работал с базой Cassandra из php знают, что все существующие драйвера используют в себе Thrift интерфейс, который объявлен как deprecated ещё в версии 0.8.
Вместо него разработчики рекомендуют использовать новый интерфейс доступа к базе CQL (Cassandra Query Language), но драйвера под php для нового протокола уже очень длительное время нет. В официальном репозитории Datastax существуют драйвера для C++, Java, C# и Python. Как известно сам Php написан на Си, а значит, закатав рукава мы можем подружить официальный асинхронный драйвер C++ с Php. Кому интересно что из этого получилось — прошу под кат.

Как подружить плюсовый код с Php достаточно подробно описано на девзоне зенда. Вероятно многим эта ссылка уже попадалась, если вы хоть как-то интересовались разработкой расширений под Php. Следует обратить внимание на макрос PHP_REQUIRE_CXX() в config.m4, а также на необходимость ручного добавления библиотеки stdc++, если, конечно, вы её использовали при разработке своего модуля.

Сборка C++ библиотеки Datastax’а достаточно тривиальна и все что вам необходимо это скачать официальный драйвер

git clone https://github.com/datastax/cpp-driver.git 

Установить Boost, Openssl и Cmake для сборки, если они у вас ещё не установлены и скомпилировать драйвер

cd cpp-driver cmake . && make && make install 

Хинт: make install необязательно делать, т. к. все что нам необходимо это библиотека libcql.so.0.7.0 на которую можно сделать симлинк

ln -s libcql.so.0.7.0 /usr/lib/libcql.so.0 ln -s /usr/lib/libcql.so.0 /usr/lib/libcql.so 

После установки официального драйвера мы можем использовать наш wrapper:

git clone https://github.com/aparkhomenko/php-cassandra.git cd php-cassandra phpize && ./configure && make 

Если не возникло ошибок в папке modules можно будет увидеть extension для Php cassandra.so
Можем проверить, что он у нас работает корректно:

php -d="extension=modules/cassandra.so" -m 

В списке модулей должна быть надпись cassandra. Если все получилось — поздравляю; если нет — прошу в комментарии 🙂

Интерфейс модуля повторяет интерфейс оригинального драйвера и содержит в себе классы: CqlBuilder, CqlCluster, CqlError, CqlFutureResult, CqlQuery, CqlSession, CqlResult.

Пример взаимодействия модуля:

// Suppose you have the Cassandra cluster at 127.0.0.1,  // listening at default port (9042). $builder  = new CqlBuilder(); $builder->addContactPoint("127.0.0.1");  // Now build a model of cluster and connect it to DB. $cluster  = $builder->build(); $session  = $cluster->connect();  // Write a query, switch keyspaces. $query    = new CqlQuery('SELECT * FROM system.schema_keyspaces');  // Send the query. $future   = $session->query($query);  // Wait for the query to execute; retrieve the result. $future->wait(); $result   = $future->getResult();  if (null === $future->getError()) {      echo "rowCount: {$result->getRowCount()}\n";      while ($result->next()) {         echo "strategy_options: " . $result->get("strategy_options") . "\n";     }  }  // Boilerplate: close the connection session and perform the cleanup. $session->close(); $cluster->shutdown(); 

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

Решение проблемы с незагружаемыми конфигами в Thinstation 5

Доброго времени суток, Хабр.

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

В этой мини-статье я хочу собрать те нюансы настроек, которые решают эту проблему.

Вводные

Итак, мы рассматриваем случай, когда у нас уже установлен thinstation, тонкий клиент успешно подключается и работает, но с загрузкой именных конфигов — глухо. Вся первичная настройка производится в двух конфигах: build.conf и thinstation.conf.buildtime. Хороший тутор по сборке и настройке есть на Хабре (сам им пользовался), я же остановлюсь на критично важных моментах.

build.conf

включить

  • ts-classic
  • ssh (если будете использовать загрузку образов через scp)

выключить

  • networkmanager
  • udisks-glue

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

thinstation.conf.buildtime

обязательно

  • NET_FILE_ENABLED=On
  • NET_FILE_METHOD=tftp/scp
  • NET_FILE_ALTERNATE=хх.хх.хх.хх

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

Всё готово! Теперь тонкий клиент будет бегать и забирать конфиги с сервера, как и задумывалось.

Удачной работы. 😉

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