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

Кратко о MapReduce

Среди всех параллельных алгоритмов, реализации которых легко масштабируются на произвольное количество ядер, MapReduce можно назвать одним из самым свежих. Компания Google представила его в 2004 году. Давайте попробуем разобраться: что это такое и зачем оно нужно.

понедельник, 14 ноября 2011 г.

Параллельный зоопарк

Рассказывая про методы многопоточного программирования в предыдущих заметках, я регулярно обращался за помощью к библиотеке Concurrency Runtime. Эта прекрасная библиотека имеет 2 недостатка: во-первых, она доступна только в составе Microsoft Visual Studio 2010 и выше; во-вторых, она работает только в ОС Windows начиная с версии XP с 3-им сервис-паком. В данной заметке я хочу рассмотреть некоторые альтернативные библиотеки, для многопоточного программирования, лишённые таких ограничений.

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

Data Flow, или Данные управляют командами. Практика

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

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

Data Flow, или Данные управляют командами. Теория

Заметку про асинхронных агентов я начал с описания недостатка модели рабочих элементов. Поэтому, чтобы сохранить традицию, заметку о Data Flow я начну с критики агентов. А что, вы серьёзно ожидали, что таковой не будет?

среда, 14 сентября 2011 г.

Агент Асинхронность, ваш выход!

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

четверг, 1 сентября 2011 г.

Сделайте мне параллельно

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

понедельник, 8 августа 2011 г.

Подводный камни Active Directory: версионность объектов, как она есть

Если вы решаете задачу синхронизации объектов в Active Directory или просто следите за их изменениями для иных нужд, то в какой-то момент времени вам непременно придёт в голову "гениальная" идея: постойте, AD просто обязана содержать встроенный механизм версионности объектов, почему бы не воспользоваться им для оптимизации поиска изменившихся объектов?

воскресенье, 31 июля 2011 г.

Windows: теория и практика синхронизации паролей

28 июня этого года компания Microsoft запустила новый облачный сервис Office 365. Ожидается, что его основными потребителями станут предприятия, желающие сэкономить время и средства на поддержании собственной инфраструктуры офисного ПО. Поэтому, одной из важнейших задач, возникающей в подобном контексте использования, является синхронизация с облаком службы каталогов Active Directory предприятия. Для её решения подписчикам предоставляется специальное приложение, автоматизирующее данный процесс. Но оно имеет очень смешное ограничение, а именно: оно не умеет синхронизировать пароли пользователей. Компания Parallels, в которой я имею честь работать, имеет аналогичное решение в составе продукта Parallels Operations Automation уже более полутора лет. Вот только наше приложение Customer Directory Integration, в отличие от Microsoft Directory Sync, достаточно легко справляется с задачей синхронизации паролей. В этой заметке я хочу приоткрыть завесу тайны над тем, как оно это делает.

суббота, 16 июля 2011 г.

Виды информационных угроз и методы борьбы

Вчера я читал студентам Летней школы Parallels лекцию: "Виды информационных угроз и методы борьбы". Скорее всего, суровым гикам с богатым жизненным опытом материал покажется не особо интересным (он ориентирован на студентов 2-ого – 5-ого курса), но вот начинающим будет весьма полезно посмотреть.

пятница, 1 июля 2011 г.

Зачем нужен Apache Thrift?…

В одной из прошлых заметок я рассказывал о Google Protocol Buffers. В качестве альтернативы последнему иногда упоминают Apache Thrift. Я проанализировал его возможности и в этой заметке хочу высказать свои мысли по поводу данной технологии.

среда, 22 июня 2011 г.

Странный DirectoryServices. Совет третий: помните - данных может быть больше, чем дозволено

Горе тому серверу, который на просьбу клиента вернуть всё, действительно возвращает все данные. Это прямой путь к атаке типа Deny of Service. Любой разработчик должен позаботиться об устойчивости своего сервиса и не допускать передачи неограниченного объёма данных. Не является исключением и Active Directory Domain Service. По умолчанию любая операция поиска возвращает не более чем 1000 элементов. Давайте рассмотрим, как правильно обойти это ограничение и получить действительно все объекты, не нарушив производительности контроллера доменов.

понедельник, 6 июня 2011 г.

Странный DirectoryServices. Совет второй: прогревайте кэш атрибутов руками

Продолжим начатую тему. Вы знаете, что происходит, когда запрашиваешь тот или иной атрибут Active Directory у объекта типа DirectoryEntry, и почему большая часть программ делает это неоптимальным образом? А как сделать правильно? Поговорим об этом.

понедельник, 30 мая 2011 г.

Странный DirectoryServices. Совет первый: выражайтесь яснее, где искать

В прошлый раз я вскользь упомянул про подводные камни, встречающиеся на пути программиста, решившего использоваться классы пространства имён System.DirectoryServices или DCOM объекты ADSI, что, по сути, то же самое. Данная тема заслуживает отдельного рассмотрения. Поэтому эту и несколько следующих заметок я посвящу ей.
Сегодня я хочу рассмотреть весьма распространённую ошибку, связанную с особенностью выбора контроллера домена, на котором будет осуществляться поиск. В большинстве случаев программист полагается на настройки по умолчанию и может получить существенное падение производительности при определённых конфигурациях. Самое неприятное то, что отследить такую ошибку на этапе тестирования очень сложно.

понедельник, 23 мая 2011 г.

DirectoryServices.Protocols – малоизвестная альтернатива

Все знают о существовании пространства имён System.DirectoryServices. Оно содержит набор классов, являющихся тонкой обёрткой над ADSIDCOM-ориентированном API для работы с Active Directory. Но ADSI не единственный интерфейс, который можно использовать для общения с контроллерами домена. Помимо него в состав WinSDK входит библиотека LDAP API, реализующая 3-ю версию LDAP API в соответствии с RFC 2251. С её помощью приложение на C++ может получить доступ к любому LDAP серверу под управлением любой операционной системы. Но что делать, если платформа приложения – .NET, а язык разработки – C#? Ответ на этот вопрос находится в пространстве имён System.DirectoryServices.Protocols.

воскресенье, 15 мая 2011 г.

Google Protobuf - замена вашему велосипеду

Как часто приходится сталкивать с проблемой сериализации / десериализации данных? И если в .NET подобная проблема решена более-менее стандартно, то, как быть, если вы пишите код на C++? Или ещё хуже: вам необходимо обмениваться сообщениями между сервером, написанным на C++ и клиентом, написанным на C#. Некоторое время назад я открыл для себя такую вещь, как Google Protocol Buffers. В этой заметке я постараюсь рассказать, что это такое и зачем оно может быть полезно.

понедельник, 9 мая 2011 г.

Чудеса аутентификации. Чудо второе: доступ запрещён

Допустим, вы пишете клиент-серверное приложение, причём серверная часть состоит из нескольких компонентов. После получения запроса, сервис, реализующий внешний интерфейс, выполняет олицетворение (impersonation) клиента и отправляет запросы к остальным частям сервера по мере необходимости. Рассмотрим типичную ситуацию: всё прекрасно работало, пока серверные компоненты были развёрнуты на одной машине в вашем тестовом окружении, но как только сервер попал в отдел контроля качества, и его части оказались на разных машинах (он стал действительно распределённым), клиент начал получать ошибку "Access denied". Даже программисты с хорошим опытом зачастую попадают в подобную ловушку и не могут сразу ответить, что же идёт не так.

воскресенье, 1 мая 2011 г.

Чудеса аутентификации. Чудо первое: доступ разрешён

Как-то раз я поспорил с одним коллегой о том, каким образом ОС Windows хэширует пароли, а именно: солит она их или нет. Коллега, будучи весьма опытным человеком, с абсолютной уверенностью утверждал, что хэш пароля просто обязан быть солёным. Его уверенность базировалась на теории о том, что без применения соли данные по хэшу легко вскрываются атакой со словарём. Вот только эта теория никак не могла объяснить такую странность: 
  • есть 2 хоста, не включённых в домен, – AliceHost и BobHost;
  • на обоих хостах есть одноимённые пользователи с одинаковыми паролями: AliceHost\user и BobHost\user;
  • на хосте AliceHost есть сетевая папка \\AliceHost\Folder, доступ к которой предоставлен только пользователю AliceHost\user;
  • если на хосте BobHost осуществить вход пользователем BobHost\user, то вы легко получите доступ к папке \\AliceHost\Folder.

воскресенье, 24 апреля 2011 г.

UAC и CreateProcessAsUser – добавим привилегий

В прошлой заметке речь шла о том, что представляет собой токен учётной записи с административными привилегиями при включенной службе Контроля Учётной записи Пользователя (UAC). Как после авторизации получить доступ к неограниченному токену и почему его нельзя использовать для запуска приложения, если у вас нет привилегии "Act as a part of operation system" (SeTcbPrivilege). Пришла пора рассмотреть альтернативный путь.

понедельник, 18 апреля 2011 г.

UAC и CreateProcessAsUser - кто кого?

Кто знает, как запустить процесс от имени другого пользователя? А если это Windows 7 с включенным UAC, а ваш пользователь имеет административные привилегии, потерять которые в запущенном процессе вы не хотите? Итак, дано: Windows 7, UAC, логин и пароль учётной записи с административными привилегиями, WinAPI и полная свобода действий. Требуется: программным путём запустить процесс от имени этого пользователя. Давайте разбираться.

среда, 13 апреля 2011 г.

Играем в SOAP клиента CURL`ём и игнорируем SSL сертификат

Сегодня я тестировал один очень удалённый Web Service, и мне понадобилось сделать странные вещи. Во-первых, отменить проверку SSL сертификата в клиенте, написанном на C#. Во-вторых, отправить вручную сформированный SOAP запрос.

понедельник, 11 апреля 2011 г.

Проблемы сертификации: Эпизод III - Такой маленький ключ

Проблема, о которой я рассказывал в прошлый раз, возникает исключительно при попытке расшифровать сообщение. На этот раз речь пойдёт об ошибке шифрования алгоритмом RSA, а именно: "Key not valid for use in specified state".

четверг, 7 апреля 2011 г.

Проблемы сертификации: Эпизод II - Правила использования

В прошлой заметке я рассказывал о не очевидных причинах возникновения ошибки "Keyset does not exist" и о методах борьбы с ней. А именно: речь шла о правах доступа к файлу приватного ключа сертификата. Продолжая начатую тему странных сообщений CryptoAPI, я хочу рассказать о не менее загадочной ошибке - "Bad key".

воскресенье, 3 апреля 2011 г.

Проблемы сертификации: Эпизод I - Потеряный ключ

Вы когда-нибудь пытались разобраться, что от вас хочет CryptoAPI, когда сообщает невразумительное "Bad key"? Иногда бывает проще ответить на вопрос о смысле жизни, чем понять странные желания этой библиотеки. Не является исключением и .NET Framework, криптографическая часть которого более чем полностью, является всего лишь обёрткой над CryptoAPI. Поэтому, предоставляя пользователю весьма удобные интерфейсы, он наследует от своей старшей сестры ужасные сообщения об ошибках. Наиболее неприятным в моей практике был небольшой набор ошибок, связанных с криптованием и декриптованием данных, которые с завидной регулярностью возникали после начала эксплуатации программы клиентом или в лучшем случае вводили в ступор отдел контроля качества.

суббота, 2 апреля 2011 г.

Hello, world!

Чтобы не быть банальным, я не стал в первом сообщении описывать, зачем мне это нужно. Я просто завёл для этого отдельную страницу: Зачем и для кого.


Итак
Hello, world!