воскресенье, 18 декабря 2011 г.

Отладка сессии ASP.NET

CrashTestDummyНа этот раз, как и обещал в статье “Сессия ASP.NET и проблема с параллельными запросами”, я расскажу, как можно отладить обращения к сессии с помощью нестандартного провайдера.

А в завершение, в качестве бонуса, расскажу забавные подробности про режим ReadOnly, который иногда не совсем ReadOnly…

Для чего может потребоваться логгирование обращений к сессии? На мой взгляд, наиболее подходящими являются два сценария:

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

воскресенье, 27 ноября 2011 г.

Сессия ASP.NET и проблема с параллельными запросами

Эта статья будет интересна прежде всего тем, кто, явно или неявно, использует сессию ASP.NET в своих приложениях. Тем же, кто принципиально не использует сессию, можно почитать для общего развития – вдруг пригодится на будущее.
mcdonalds_queue
И, поверьте мне, она будет невероятно интересна разработчикам таких приложений, которые могут обрабатывать несколько небыстрых одновременных запросов от одного пользователя. Показательный пример – одновременное скачивание нескольких больших файлов. Это реальная проблема, с которой столкнулись мои коллеги и на отладку которой было потрачено неадекватно много времени.

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

В принципе, ситуация с конкурентными запросами в рамках одной сессии описана в статье MSDN ASP.NET Session State Overview. Но есть нюансы. Во-первых, это один неприметный абзац в конце статьи (вместо выделенного блока в начале). Во-вторых, MSDN не раскрывает многих неочевидных моментов. И, что важно, ни один из моих знакомых ASP.NET разработчиков не знал об этой особенности.

Заинтересовались? Тогда продолжаем. Я сформулирую несколько правил работы сессии и покажу на примере, что они верны.

четверг, 13 октября 2011 г.

ASP.NET MVC MiniProfiler

Всем доброго времени суток. Сегодня я хочу рассказать про ASP.NET MVC MiniProfiler. А первое, что я хочу рассказать, это то, что, вопреки распространённому мнению и названию, этот профайлер вполне можно применять для отладки обычных (не MVC) ASP.NET приложений. Дальше я на примере покажу как это сделать. А пока обо всем по порядку.

Что такое MiniProfiler?

Это способ отладить ASP.NET-приложение на production (или, если вам больше нравится, “приложение, находящееся в промышленной эксплуатации”). И, что важно, не сильно влияя на производительность (то, что это работает на сайтах платформы StackExchange как бы намекает).

Вкратце процесс подключения выглядит так:

  1. Добавляется ссылка на dll.
  2. Подключается в “Master Page” или любое другое подходящее место одна строчка по инициализации UI.
  3. В Global.asax.cs прописываются вызовы по старту и остановке профайлера.
  4. Либо добавляются вызовы Step(string) там, где вам интересно, либо “сбоку” добавляются фильтры (вроде ProfilingActionFilter), чтобы не модифицировать код.

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

  • Суммарное время.
  • Время на дочерние действия (пункт 4) и запросы к БД.
  • Показать/скрыть “тривиальные” запросы (с маленькими затратами времени).
  • Переслать ссылку на отчет (данные хранятся в кэше).

Заинтересовались? Тогда продолжим…

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

Удобное и надежное хранение паролей


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

История

Лет 15 назад паролей у меня было немного – интернет тогда еще не проник в мелкую бытовую технику :) Время шло, менялись работодатели, множились проекты, открывались новые нужные и ненужные сервисы… И лет 7 назад я понял, что держать важные пароли в голове мне надоело, даже учитывая их “генерацию” по определенным правилам. Альтернатива же использовать одинаковые пароли для разных сервисов была отметена задолго до этого :)

четверг, 16 июня 2011 г.

Model scaffolding для MVC 3 – идеи и принципы

Эта статья является логическим продолжением статей ASP.NET MVC 3 + Entity Framework 4.1 Code First, MVC 3 + scaffolding и моей презентации на TechDays “Пример разработки сайта на MVC 3”. В ней я расскажу про свой пакет для scaffolding’а Model Scaffolding for ASP.NET MVC.

Как я уже говорил ранее, идея написать этот пакет появилась после знакомства с проектом MvcScaffolding. Если вкратце, это пакет NuGet (минимальную необходимую информацию по NuGet и MvcScaffolding я привел в предыдущей статье), позволяющий быстро генерировать контроллеры и представления. Для первого знакомства с MvcScaffolding достаточно прочитать статьи автора “Scaffold your ASP.NET MVC 3 project with the MvcScaffolding package” и “MvcScaffolding: Standard Usage”, а заинтересовавшимся после первого знакомства, рекомендую читать эту серию статей дальше.

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

Disclaimer

Я не претендую на особую оригинальность и/или полезность своего подхода к scaffolding’у моделей. Я просто знаю, что есть круг задач которые он решает хорошо, а, на момент создания проекта на CodePlex, сходу не нашел аналога в рамках используемых технологий.

К слову о “круге задач” – на мой взгляд, это прототипирование, причем необязательно “чистое прототипирование” (когда прототип гарантированно не будет использован в промышленной разработке). А самая идеальная задача – набор сущностей со стандартными названиями свойств и большим количеством простых справочников. К концу этой статьи вы поймете почему, а пока запаситесь терпением ;)

вторник, 31 мая 2011 г.

MVC 3 + scaffolding

А теперь обещанное продолжение статьи ASP.NET MVC 3 + Entity Framework 4.1 Code First. Сегодня я расскажу про то, как быстро создать основу (или прототип) для приложения на ASP.NET MVC 3, в том числе, с помощью NuGet-пакета MvcScaffolding. Надо сказать, что принципы MvcScaffolding пришлись мне по душе и даже вдохновили меня на написание своего пакета для scaffolding’а - Model Scaffolding for ASP.NET MVC. О нем я расскажу в следующих статьях.

Поскольку в прошлой статье я уже рассказал про основные понятия и библиотеки (ASP.NET MVC, Entity Framework), сейчас я не буду на них подробно останавливаться. Пример будет использовать scaffolding, который я уже упоминал в предыдущий раз.

Disclaimer. Отмечу, что scaffolding – это, вообще говоря, быстрая генерация чего-либо, с целью последующей доработки, а не способ быстро написать законченное сложное приложение.

NuGet

Пожалуй, единственное, на чем я забыл остановиться в прошлый раз, это NuGet. Сама идея его не нова (apt-get, Ruby Gems и т.п.), однако то, что это теперь доступно и в Visual Studio очень радует. Следуя описанию с официального сайта:

NuGet is a Visual Studio extension that makes it easy to install and update open source libraries and tools in Visual Studio.

В принципе, добавить нечего, однако я все-таки немного добавлю :)

среда, 11 мая 2011 г.

ASP.NET MVC 3 + Entity Framework 4.1 Code First

Как вы все знаете, недавно вышло обновление MVC 3 Tools, ключевой особенностью которого является более продвинутый scaffolding. Кстати, scaffolding теперь есть и для движка Razor, что тоже плюс. Об этом, а также о недавнем обновлении Entity Framework я сегодня и расскажу. В этой статье речь пойдет про сами обновления, а в следующей будут примеры использования.

Забегая вперед скажу, что scaffolding (по крайней мере, в случае ASP.NET MVC) это возможность быстро генерировать простую логику и интерфейс, которую можно использовать как прототип или в качестве отправной точки в дальнейшей разработке. Также этот подход может работать почти в чистом виде для простого административного интерфейса.

MVC (Model-View-Controller)

Наверняка, 99% читателей знают что такое MVC, однако, на всякий случай, расскажу очень коротко, а подробнее можно посмотреть в википедии (русскоязычной или англоязычной) и приведенных в ней ссылках.

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

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

SQL – execution plan

Перейдя от рассказа про основы SQL к более сложным вещам, я уже успел упомянуть план выполнения (execution plan). Чтобы не останавливаться на этой теме каждый раз, подробнее расскажу о нем в этой статье. Ведь это то, о чем многие разработчики, знакомые с Microsoft SQL Server не один год, либо не знают, либо не придают особого значения.

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

План выполнения

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

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

Трюки в SQL – используем CASE

После серии статей “Основы SQL” я решил попробовать вспомнить некоторые нестандартные варианты использования Transact-SQL и начать серию статей “Трюки в SQL”.

В этой статье расскажу прежде всего о полезном но неочевидном использовании выражения CASE. Правда, речь пойдет о достаточно простых приемах (когда их знаешь). Основное содержание:

База данных для примеров

Если в прошлой серии я использовал максимально простую БД, которую создал и наполнил скриптами, то теперь я решил использовать стандартные примеры от Microsoft. Причина в том, что потребуются более сложные структуры и данные, да и примеры станут ближе к реальной жизни.

Поэтому для запуска примера потребуется БД AdventureWorks. Я пользовался облегченной версией для Microsoft SQL Server 2005 (там, в зависимости от версии, можно выбрать AdventureWorksLT.msi или AdventureWorksLT_x64.msi). Скорее всего, подойдут и более поздние версии с CodePlex.

План выполнения

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

Основы SQL – DML – SELECT – Часть III

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

Содержание:

DISTINCT

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

SELECT DISTINCT LEFT(Phone,3) FROM Phones

Про использование “DISTINCT”, в силу его простоты, многого не скажешь. Однако, стоит сказать несколько слов про то, когда его использовать нежелательно. Предположим, нам необходимо получить список всех абонентов, у которых есть хотя бы один телефон. Теоретически, можно это сделать с помощью “DISTINCT”:

SELECT DISTINCT a.PersonID, a.LastName
FROM Persons a JOIN Phones t ON a.PersonID = t.PersonID

Однако в данном случае правильнее использовать конструкцию “WHERE EXISTS”:

SELECT a.PersonID, a.LastName
FROM Persons a
WHERE EXISTS(SELECT * FROM Phones t WHERE a.PersonID = t.PersonID)

вторник, 29 марта 2011 г.

Основы SQL – DML – SELECT – Часть II

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

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

Многотабличные запросы без JOIN

Хотя в более ранних версиях Microsoft SQL Server многотабличные запросы без “JOIN” были более распространены, теперь они используются все реже и реже. И это, с моей точки зрения, правильно. Использование “JOIN” приводит, как минимум, к более структурированному и читаемому коду (что мы увидим чуть позже), а на символах в исходном коде я никогда не экономил :)

Самый простой вариант многотабличного запроса – это двухтабличные запрос без условия соединения таблиц или декартово произведение таблиц. И это, пожалуй, единственный вариант, когда от отсутствия “JOIN” не страдает наглядность:

SELECT * FROM Persons, Phones

суббота, 19 марта 2011 г.

Основы SQL – DML – SELECT – Часть I

Продолжаю серию статей “Основы SQL”. В этой статье я расскажу про сравнительно простые варианты применения самого сложного оператора DML – SELECT. Если в начале статьи дать полный синтаксис SELECT – это будет серьезным поводом загрустить и не читать статью дальше, поэтому я буду рассказывать про возможности этого оператора постепенно :)

Простейший случай

Позволю себе немного дополнить статью MSDN о SELECT тем, что данный оператор может использоваться не только для "выборки одной или нескольких строк или столбцов из одной или нескольких таблиц", но и для получения набора данных, не имеющего в своей основе ни одной таблицы:

SELECT 1 AS ID, 'Test 1' AS Name

Разумеется, в итоге результат выглядит как выборка из некоторой таблицы (если мы не будем использовать специальные конструкции для получения результата в виде XML).

Если одной строки недостаточно, можно использовать несколько запросов, объединенных с помощью UNION ALL. Если не использовать “ALL” в этой конструкции, в результате гарантированно не будет дублирующихся строк. Это тоже бывает полезно, но, если вы точно знаете, что дубликатов и так не будет, лучше использовать “UNION ALL”, чтобы уменьшить накладные расходы.

понедельник, 14 марта 2011 г.

Облачные хранилища файлов – личный опыт

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

Лично я использую их для синхронизации своих заметок, паролей (естественно, зашифрованных), полезных SQL-скриптов и т.п. Удобно иметь актуальные версии и дома, и на работе и в смартфоне.

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

пятница, 28 января 2011 г.

Основы SQL – DML – DELETE

Продолжаю серию статей “Основы SQL”. В предыдущих сериях:
В этой статье я завершу рассказ про операторы DML, изменяющие данные - речь пойдет про DELETE – оператор, с помощью которого можно удалить одну или много строк в таблице, или много строк во многих таблицах… главное – не слишком увлекаться :)

Удаление строк

Удаление строк более простая операция чем все остальные в DML, по большому счету, все сказанное относительно UPDATE применимо и к DELETE, с той лишь разницей, что данные удаляются, а не модифицируются, и синтаксис немного другой:
DELETE Phones WHERE PersonID = 1 AND Phone = '100-1'
В этом примере происходит удаление одной строки (если такая есть), потому что, как вы помните, “PersonID” и “Phone” являются составным первичным ключом.

четверг, 27 января 2011 г.

Основы SQL – DML – UPDATE

Продолжаю серию статей “Основы SQL”. В предыдущих сериях:
В прошлый раз я немного рассказал про оператор INSERT (куда же без него – без первоначальных данных применять остальные операторы DML не имеет смысла).
Сейчас речь пойдет про UPDATE – оператор, позволяющий модифицировать существующие данные.

Модификация одной строки

Если для оператора INSERT существует разный синтаксис для вставки одной строки и множества строк, то для UPDATE синтаксис одинаковый и в простейшем случае выглядит так:
UPDATE Persons SET LastName = 'Петров' WHERE PersonID = 1

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

Основы SQL – DML – INSERT и другие

Ранее в этой серии статей мы поговорили об SQL вообще и нормальных формах, в частности. Затем продолжили разговор о DDL и нескольких вариантах рефакторинга, с ним связанных. В этой статье речь пойдет о DML (Data Manipulation Language), то есть о тех базовых возможностях, которые предоставляет SQL (строго говоря, Transact-SQL) для обработки данных.

Когда-то давно, на университетском курсе по “Базам данных”, на котором нам немного рассказывали про FoxPro (я же говорил, что давно :)), преподаватель рассказывал про способы получения данных и их обработки. Как сейчас помню, он сказал фразу “а еще есть мощный язык для обработки данных, он называется SQL” и, после эффектной паузы, добавил – “там есть четыре инструкции – SELECT, INSERT, UPDATE и DELETE, но рассказать что-то еще у меня не хватит времени”.

Честно говоря, только через пару лет, на первой работе, я понял две вещи:
  1. На этом курсе я практически ничего полезного так и не узнал.
  2. Программирование БД может быть не менее увлекательным, чем программирование на высокоуровневых языках.
Зато сейчас у меня немного больше времени, чем у моего преподавателя, и я постараюсь рассказать про DML более подробно и, в то же время, доступно.

суббота, 8 января 2011 г.

Основы SQL - DDL и рефакторинг БД

Это вторая статья в серии статей “Основы SQL”. В ней я продолжу разговор о DDL. Также я покажу, каким образом может выглядеть рефакторинг БД (как с точки зрения нормализации, так и с точки зрения денормализации). Да, лично я считаю, что рефакторинг (можно назвать это модным словом continuous design) вполне применим к БД.

Конечно, в нашем распоряжении (пока) нет инструментов для рефакторинга SQL столь же мощных, как для C# или Java. Однако, в большинстве случаев, рефакторинг БД случается редко. Поэтому часто достаточно скриптов, написанных вручную или немного сгенерированных.
Но сначала немного о том, что делает мои трудовые будни несколько комфортнее, когда речь идет об обновлениях БД (повторюсь, речь, как и ранее, идет о MS SQL Server, хотя принципы могут быть применимы и к другим СУБД).

четверг, 6 января 2011 г.

Основы SQL - первое знакомство

Вступление

Этой статьей я начинаю серию о SQL (Structured Query Language) для разработчиков, которые еще не начали или недавно начали осваивать SQL как средство работы с БД (базой данных). Сразу хочу сказать, что эта статья будет наполнена, в основном, базовыми понятиями, историей и немного философией, а разбор конкретных задач, проблем и решений будет далее.

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

Как вам, например, такой подход – чтобы получить первые 100 записей, сначала несколько сотен тысяч записей считываются в DataSet (или объектную модель), а потом на экран в цикле выводятся первые 100? И речь здесь, к сожалению, не о выдуманной ситуации, а о реальном коде. Причем авторы кода не любимые многими абстрактные “индусы”, а, в том числе, наши соотечественники. Скажу по секрету, приходилось сталкиваться с исходным кодом многих проектов разных контор – проблемы с ним мало зависят от национальности разработчиков, скорее от уровня и ответственности конкретных исполнителей и отношения к качеству внутри компании.