Gollum's den

ASP.NET (и не только) здесь и сейчас!

View Eugene Agafonov's profile on LinkedIn
Мой доклад про С# 4.0 на .NET User Group

В ближайший вторник (7 сентября 2010 года) я буду выступать на встрече московской .Net User Group, где подробно расскажу про нововведения в языке С# 4.0

Узнать больше об этом мероприятии и зарегистрироваться можно здесь:
http://mdna.ineta.ru/events/eventMultiSessionInfo.aspx?Id=45301f7e-28a3-4626-a84b-afb6d1108fb5

Тем кому интересно, но придти затруднительно, есть возможность посмотреть мой доклад онлайн на сайте techdays.ru. Конечно, для посетителей user group я расскажу несколько больше, но все основные моменты в онлайн-докладе присутствуют.

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

Приходите, будет интересно!

Posted: Sep 02 2010, 04:12 PM by Gollum | with 4 comment(s)
Filed under: , , ,
OpenXML SDK 2.0 RTM.

Делаю очередную попытку вернуться к написанию чего-то полезного в блог. К сожалению, времени катастрофически не хватает, но буду делать все возможное :)

 

Итак, всеобщее внимание приковано к грядущему выходу семейства продуктов для разработки нового поколения, под грифом %Product_Name% 2010. Но я, будучи верным поклонником творчества Monty Python, расскажу про нечто совершенно другое.

 

Вышел (уже довольно давно, так что это не новость) релиз OpenXML SDK 2.0. С помощью этого SDK можно генерировать документы офиса без автоматизации офисных приложений. По сути дела, взяли xml-схему, и сгенерировали по ней объектную модель,  а потом немного причесали. В результате, пока пользоваться не очень удобно, но неплохо поддерживается сценарий с использованием шаблонов. Можно взять заготовку отчета, вставить в нужные места данные с помощью SDK, и – отчет готов.

 

Также в состав SDK входит очень полезная утилита, Productivity Tool. Это по сути дела reflector для офисных документов. В ней можно открыть документ и сгенерировать код, который создает его, или часть документа. Можно посмотреть иерархию, что от чего зависит, сравнить два документа и найти различия.

 

Здесь я уже писал про OpenXML SDK, поэтому особо повторяться не буду и просто приведу еще один code snippet. Здесь мы добавляем метод-расширение к типу из SDK, и у объекта типа TableColumn появляется метод SetColumnName. Проще сделать у меня не получилось, поэтому убедительная просьба – если заметите ошибки, или возможность сделать лучше, пожалуйста напишите об этом.

 

  /// <summary>

  /// Дополнительная функциональность для типа <see cref="TableColumn" /> из OpenXML SDK

  /// </summary>

  public static class TableColumnExtensions

  {

    /// <summary>

    /// Задать имя колонки таблицы

    /// </summary>

    /// <param name="column">колонка таблицы</param>

    /// <param name="name">имя колонки</param>

    public static void SetColumnName(this TableColumn column, string name)

    {

      if (null == column) throw new ArgumentNullException("column");

      if (null == name) throw new ArgumentNullException("name");

 

      column.Name = name;

 

      var table = column.Ancestors<Table>().Single();

      var tablePart = table.TableDefinitionPart;

      var doc = (SpreadsheetDocument)tablePart.OpenXmlPackage;

      var workbookPart = doc.WorkbookPart;

 

      // находим соответствующий таблице worksheetPart

      // для этого выбираем из WorksheetParts ту часть, у которой

      // есть tableDefinitionPart, соответствующая нашей таблице

      var targetPart = workbookPart.WorksheetParts.Where(

          wp => wp.GetPartsOfType<TableDefinitionPart>()

            .Where(tdp => tdp == tablePart).Count() == 1)

        .SingleOrDefault();

 

      // Если worksheetPart не обнаружен, то просто ничего не делаем

      // возможно, здесь лучше использовать Exception

      if (null == targetPart) return;

 

      // В tableReference хранится запись вида A1:B5, где А1 - верхняя левая ячейка таблицы,

      // а B5 - нижняя правая. Нам нужна верхняя левая, как первая ячейка строки заголовка.

      // пустым и без двоеточия это значение не может быть никак

      string firstTableCellName = table.Reference.Value.Split(':')[0];

 

      // Находим верхнюю левую ячейку в объектной модели

      Cell firstHeaderCell = targetPart.Worksheet.Descendants<Cell>()

        .Where(

          c => string.Equals(c.CellReference, firstTableCellName,

                           StringComparison.InvariantCultureIgnoreCase))

        .Single();

 

      // Получаем строку заголовка, и выбираем из нее ячейку, соответствующую нашей колонке

      // не уверен что Id колонки это правильный способ узнать номер ячейки в строке, но

      // пока другого способа нет, а колонки всегда идут последовательно

      var headerRow = firstHeaderCell.Ancestors<Row>().Single();

      var headerCells = headerRow.Descendants<Cell>();

      var headerCell = headerCells.ElementAtOrDefault((int)column.Id.Value - 1);

 

      if (headerCell.DataType != CellValues.SharedString)

      {

        // Если в ячейке данные не из SharedStringPart, то просто устанавливаем ее текст

        headerCell.CellValue.Text = name;

      }

      else

      {

        // Если в ячейке номер ресурса из SharedStringPart, то находим SharedStringPart,

        // находим ресурс по номеру, и изменяем его значение

        var elementNumber = Convert.ToInt32(headerCell.CellValue.Text);

        var sharedStringsPart = workbookPart.GetPartsOfType<SharedStringTablePart>().Single();

        var stringTable = sharedStringsPart.SharedStringTable;

        var items = stringTable.Descendants<SharedStringItem>();

        var ourItem = items.ElementAt(elementNumber);

 

        ourItem.Text.Text = name;

 

        // сохраняем изменения в SharedStringPart

        stringTable.Save(sharedStringsPart);

      }

    }

  }

Дело о пропавшей сессии

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

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

http://weblogs.asp.net/bleroy/archive/2004/08/03/Don_2700_t-redirect-after-setting-a-Session-variable-_2800_or-do-it-right_2900_.aspx

Цитирую феерический абзац:

UPDATE 2: Another thing that can cause similar problems is if your server has a name that contains underscores. Underscores are not allowed in host names by RFC 952 and may interfere with the ability to set cookies and thus to persist sessions.

Подчеркивание из имени сервера убрали :)

P.S. Не используйте сессию в ваших веб-приложениях. Считайте это best practice :)

Posted: Oct 27 2009, 10:06 PM by Gollum | with no comments
Filed under: , ,
C# 4.0: Мультиметоды

С появлением в С# 4 dynamic нам уже рассказали как здорово можно будет работать с COM-объектами, и динамическими языками. Однако, с помощью dynamic можно делать и совершенно другие интересные вещи :)

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

По-хорошему, слова эти надо знать. Хотя есть и другие мнения на этот счет. Недавно вот прочитал на веселом ресурсе habrahabr.ru про то, что “Паттерны – это рутины, для тех, кто не умеет программировать”. Рекомендую к прочтению, хорошее настроение обеспечено.

Самое простое определение мультиметодов, которое мне доводилось видеть, звучало так: Мультиметоды – это виртуальные методы, принадлежащие сразу нескольким классам. А объяснять долго не буду, просто посмотрите на код

    1 using System;

    2 using System.Collections.Generic;

    3 using System.Linq;

    4 

    5 namespace NewC4FeaturesTest

    6 {

    7     class A {}

    8 

    9     class B : A {}

   10 

   11     class C : A {}

   12 

   13     class Program

   14     {

   15         static void Main(string[] args)

   16         {

   17             Program.Dispatch(new B(), new C());

   18             Console.ReadLine();

   19         }

   20 

   21         public static void Dispatch(A a, A b)

   22         {

   23             dynamic x = a;

   24             dynamic y = b;

   25             multiMethod(a, b);

   26             multiMethod(x, y);

   27         }

   28 

   29         private static void multiMethod(A a, A b)

   30         {

   31             Console.WriteLine(string.Format("A and A"));

   32         }

   33 

   34         private static void multiMethod(B a, A b)

   35         {

   36             Console.WriteLine(string.Format("B and A"));

   37         }

   38 

   39         private static void multiMethod(A a, C b)

   40         {

   41             Console.WriteLine(string.Format("A and C"));

   42         }

   43 

   44         private static void multiMethod(B a, C b)

   45         {

   46             Console.WriteLine(string.Format("B and C"));

   47         }

   48     }

   49 }

Если у вас уже установлена Beta 2 Visual Studio 2010, можно скопипастить код, и посмотреть как он работает. Первый вызов всегда приведет к работе метода на строке 29 (“A and A”), по понятным причинам. А вот второй вызов в рантайме разберется, что надо вызвать метод на строке 44 (“B and C”).

Таким образом, можно избежать if’ов и switch’ей. Некоторые даже говорят, что это практически pattern matching light.

Однако, есть и темная сторона :) Если мы закомментируем строки 39 – 47, то второй вызов выведет нам “B and A” (строка 34). Понятно, почему это происходит – этот метод более специфичен, чем “A and A”. Однако, если мы раскомментируем 39 – 42, то второй вызов приведет к выбросу исключения. Потому что непонятно, какое совпадение аргумента важнее – B, или С.

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

Если все это показалось вам интересным, в следующий раз приведу реализацию Visitor с помощью dynamic.

Visual Studio 2010 Beta 2: CopySourceAsHtml

Для вставки в блог листинга кода я еще не встречал ничего лучше, чем аддон для Visual Studio CopySourceAsHtml

Работает он просто здорово, и все было прекрасно. Но после выхода новой беты Visual Studio 2010 возникла проблема – этот аддон не работает в новой студии после установки. К счастью, есть довольно простой способ заставить его работать.

Для начала, нужно скачать и установить аддон. Сделать это можно по ссылке выше, с сайта проекта на codeplex.

Затем откройте директорию “Мои Документы” (My Documents в англоязычной OS). Там должны быть директории Visual Studio 2008 и Visual Studio 2010.

image

Внутри Visual Studio 2010 нужно создать поддиректорию Addins (если ее еще нет), и скопировать туда файл CopySourceAsHtml.AddIn из аналогичной поддиректории Visual Studio 2008.

Затем, откройте его в Visual Studio. Вы увидите следующий xml-код

<?xml version="1.0" encoding="utf-8" standalone="no"?>

<Extensibility xmlns="http://schemas.microsoft.com/AutomationExtensibility">

  <HostApplication>

    <Name>Microsoft Visual Studio Macros</Name>

    <Version>9.0</Version>

  </HostApplication>

  <HostApplication>

    <Name>Microsoft Visual Studio</Name>

    <Version>9.0</Version>

  </HostApplication>

  <Addin>

    <FriendlyName>CopySourceAsHtml</FriendlyName>

    <Description>Adds support to Microsoft Visual Studio 2008 for copying source code, syntax highlighting, and line numbers as HTML.</Description>

    <Assembly>JTLeigh.Tools.Development.CopySourceAsHtml, Version=3.0.3215.1, Culture=neutral, PublicKeyToken=bb2a58bdc03d2e14, processorArchitecture=MSIL</Assembly>

    <FullClassName>JTLeigh.Tools.Development.CopySourceAsHtml.Connect</FullClassName>

    <LoadBehavior>1</LoadBehavior>

    <CommandPreload>0</CommandPreload>

    <CommandLineSafe>0</CommandLineSafe>

  </Addin>

</Extensibility>

Выделенные большим жирным шрифтом 9.0 нужно заменить на 10.0

Сохраняем файл, выходим из студии, и запускаем ее заново. После этой процедуры при выделении куска кода и щелчка правой кнопкой мыши, в контекстном меню появится пункт Copy As Html…

Enjoy!

rsdn.ru держит марку

Проект bltoolkit порвал всех по тестам сайта ormbattle.net

Особенно приятно про это писать, потому что отцом-основателем проекта является Игорь Ткачев, мегамозг и один из создателей сайта rsdn.ru

Поздравляю ребят, и желаю не останавливаться на достигнутом. На очереди провайдер для Linq :)

Posted: Sep 04 2009, 02:35 AM by Gollum | with no comments
Filed under: , ,
ASP.NET MVC V2 Preview 1

Англоязычные блоги пестрят сообщениями о выходе первого превью ASP.NET MVC 2. Подробности как всегда можно посмотреть в блоге Скотта Гатри (Scott Guthrie)

Я сейчас не буду переводить подробности, просто скажу, что много полезного из Dynamic Data перекочевало собственно в ASP.NET MVC Framework. Вместо этого я хотел бы задать вопрос читателям – а что бы вы хотели увидеть в следующем релизе ASP.NET MVC? Со своей стороны обещаю, что самые интересные предложения передам разработчикам MVC фреймворка.

События, делегаты, собеседования

Наткнулся на статью http://habrahabr.ru/blogs/net/65697/ в которой приводили пример вопроса на собеседовании:

public class A

{

  public void OnDoWork()

  {

    if (DoWork != null)

      DoWork(this, EventArgs.Empty);

  }

 

  public event EventHandler DoWork;

}

 

1. Что будет с программой, если класс A видоизменить так: убрать ключевое слово event?
2. Что будет с программой, если вообще во всем коде убрать ключевые слова event?

 
Поэтому ответы на вопросы будут такие:
1. Ничего не изменится
2. Ничего не изменится, если только в программе нет объявленных в интерфейсах событий.

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

Пусть попробуют на досуге:

var test = new A();

test.DoWork = null;

 

UPD: В комментариях нашлись-таки люди, которые привели правильный ответ. Надеюсь до этого комментария хоть кто-нибудь дочитает :)

Posted: Jul 30 2009, 06:50 AM by Gollum | with no comments
Filed under: ,
OpenXML SDK 2.0 Create Worksheet

В очередной раз столкнувшись с необходимостью создать отчет в excel, я вспомнил что Microsoft выпустил для нас SDK, который по идее отменяет необходимость в автоматизации офиса. Я обрадовался, скачал SDK и стал смотреть примеры кода. Первое, что меня удивило – примеров крайне мало. Ладно, подумал я. В состав пакета входит замечательная утилита под названием Document Reflector – она загружает документ и выдает код на C#! Я создал пустой .xlsx файл, открыл его в рефлекторе, взял код, запустил, сохранил сгенерированный файл и…

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

    1       // указываете путь к своему документу excel

    2       using (var doc = SpreadsheetDocument.Open("test.xlsx", true))

    3       {

    4         var newWorksheetPart = doc.AddNewWorksheet("Новый лист");

    5         var sheetData = newWorksheetPart.Worksheet.GetFirstChild<SheetData>();

    6 

    7         var row = new Row { RowIndex = 1 };

    8         row.AddTextCell("A", row.RowIndex, "Привет");

    9         row.AddTextCell("B", row.RowIndex, "Мир");

   10 

   11         sheetData.AppendChild(row);

   12         newWorksheetPart.Worksheet.Save();

   13         doc.WorkbookPart.Workbook.Save();

   14       }

А это – обертка

    8   public static class SpreadsheetDocumentExtensions

    9   {

   10     public static WorksheetPart AddNewWorksheet(

   11       this SpreadsheetDocument doc, string name)

   12     {

   13       if(null == doc) return null;

   14 

   15       var newWp = doc.WorkbookPart.AddNewPart<WorksheetPart>();

   16       var newWs = new Worksheet(new SheetData());

   17       newWs.Save(newWp);

   18 

   19       var newWpId = doc.WorkbookPart.GetIdOfPart(newWp);

   20       var sheets = doc.WorkbookPart.Workbook.GetFirstChild<Sheets>();

   21 

   22       uint sheetId = 1;

   23       if (sheets.Elements<Sheet>().Count() > 0)

   24       {

   25         sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;

   26       }

   27 

   28       var sheet = new Sheet

   29       {

   30         Id = newWpId,

   31         SheetId = sheetId, Name = name

   32       };

   33 

   34       sheets.Append(sheet);

   35       return newWp;

   36     }

   37 

   38 

   39     public static Cell AddTextCell(

   40       this Row row, string column, uint index, string text)

   41     {

   42       if(null == row) return null;

   43 

   44       var cell = new Cell

   45       {

   46         DataType = CellValues.InlineString,

   47         CellReference = column + index

   48       };

   49 

   50       cell.AppendChild(new InlineString(new Text { Text = text }));

   51       row.AppendChild(cell);

   52       return cell;

   53     }

   54   }

Posted: Jul 10 2009, 11:19 PM by Gollum | with no comments
Filed under: ,
ASP.NET MVC 1.0 Release

На сайте Microsoft был замечен релиз ASP.NET MVC 1.0

Не смотря на то, что никто про это еще не написал, это именно релиз :) Может быть его кто-то разместил слишком рано, и может быть его уберут, но я уже скачал :)

Пользуйтесь.

Из интересных вещей - декларативные "контролы" которые сделали в RC2 (он был приватный и нам нельзя было рассказывать про это по NDA, но недавно в публичном блоге про это написал кто-то из MS)

 

Локализация продуктов для разработчиков

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

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

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

Выпуск Visual Studio 2008, .NET Framework 3.5 и MSDN Library на русском языке.

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


ASP.NET MVC Framework Beta
Итак, как вы все уже знаете, вышла бета MVC Framework'а.

Подробности в блоге неподражаемого 'The Gu' - Scott Guthrie :)

Из упомянутых изменений, на мой взгляд, в первую очередь нужно обратить внимание на поддержку сценария Silverlight front-end + ASP.NET MVC backend.

Так же интересно про Model Binders - концепция, про которую рассказывали в Preview 5 приобрела реализацию. Можно уже щупать и ворчать, что "они опять все сделали не так" :)

 

Расширение функциональности ASP.NET MVC Framework. Webcast
3-го июля будет проведен еще один веб-каст, посвященный возможностям расширения функциональности ASP.NET MVC Framework. Может быть будет кусок про AJAX - посмотрим, успею ли подготовить.

http://www.microsoft.com/rus/events/detail.mspx?eventid=1032382439

Если хотите услышать что-то конкретное — пишите в комментарии, рассмотрим :)
ASP.NET MVC Framework Tips And Tricks Webcast

Итак, вебкаст состоится сегодня, 5-го июня в 17:00 по московскому времени. Это мой первый опыт, так что думаю какие-то накладки обязательно произойдут :)

http://www.microsoft.com/rus/events/detail.mspx?eventid=1032380596

ASP.NET MVC preview 3 webcast

Вот и вышла следующая ознакомительная версия ASP.NET MVC Framework. Подробно по этому поводу можно почитать в блогах Scott Guthrie и Scott Hanselman

На сайте http://asp.net/mvc уже доступны обновления. Сразу скажу что из бросающихся в глаза изменений есть только возможность в действиях возвращать объект типа ActionResult, что удобно для unit тестирования. Но речь пойдет немного не об этом.

Дело в том, что в ближайшем будущем я планирую провести веб-каст про ASP.NET MVC Framework. О точной дате и времени сообщу дополнительно. Так как источники информации в общем-то у всех нас одни и те же, то не хотелось бы рассказывать о том, что все уже и так знают. Поэтому, я бы хотел попросить вас в комментариях рассказать, о чем бы вам было интересно услышать в этом веб-касте, и то, о чем рассказывать не стоит. И еще, в какой день недели и в какое время вам было бы удобно его смотреть (пока есть временные рамки от 12 до 18 часов)

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

Герои среди нас :)

 Во вторник, 18-го марта, в Москве состоится мероприятие, посвященное запуску продуктов Microsoft Windows Server 2008, Visual Studio 2008 и SQL Server 2008. Я там буду присутствовать в качестве эксперта. Приходите, буду рад ответить на ваши вопросы!

ASP.NET 3.5 Extensions CTP

Итак, Scott Guthrie анонсировал первый релиз расширений ASP.NET, в котором есть то, что так многие стремились попробовать своими руками. Это ASP.NET MVC.

Для тех, кто предпочитает читать на русском языке, вкратце перечислю то, что вошло в данный пакет:

  • ASP.NET Ajax Improvements - исправления и дополнения к AJAX - фреймворку, улучшенная поддержка history в веб-браузере, ссылки на контент и улучшения в клиентских библиотеках
  • ASP.NET MVC - собственно, MVC фреймворк
  • ASP.NET Dynamic Data Support - облегчает создание веб-страниц, отображающих и работающих с данными из БД
  • ASP.NET Silverlight Support - поддержка Silverlight, в частности элемент управления, который проигрывает видео
  • ADO.NET Data Services - собственно Entity Framework для ADO.NET

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

Платформа 2008

Я иду на платформу 2008. Буду присутствовать там в зоне Ask the Expert на стенде средства разработки. Если хотите задать вопрос - это будет самое правильное время )

 

Платформа 2008
Архитектура веб-приложений

Продолжаем разговор :) Вот еще один опрос, на этот раз на архитектурные темы.

Хотелось бы узнать, какие архитектурные приемы вы используете для разработки веб-приложений на платформе ASP.NET и ASP.NET AJAX. Меня интересует следующее:

1) Паттерн MVC/MVP, фреймворки сторонних производителей типа MonoRail, Spring.NET, различные IoC контейнеры. Используете ли ASP.NET AJAX совместно с данной моделью.

2) Пользуетесь ли стандартной моделью ASP.NET + AJAX

3) Задумывались ли когда-нибудь сделать что-то типа клиентского веб-приложения, на DHTML и Javascript, которое вызывает серверные методы через AJAX и веб-сервисы, например.

4) Аггрегация vs наследование :) Модная нынче тема для обсуждений. Используете ли вы наследование в качестве инструмента повторного использования кода? Считаете ли это вредным, и используете только аггрегацию? Если используете и то и то, то какими критериями руководствуетесь при выборе?

5) Рассматриваете ли возможность заменить клиентскую часть на Silverlight?

6) Может быть используете какие-то совсем другие подходы?

Эти пункты не являются альтернативными, т.е. меня интересуют комментарии на все вышеперечисленные темы. Спасибо!

LiveMeeting, Screencast, Podcast

Всем привет! Хотел бы узнать ваше мнение по поводу следующих вопросов:

  1. Заинтересовала бы вас возможность провести виртуальную встречу на тему какой-либо современной технологии? Скажем в формате LiveMeeting по Ajax ASP.NET или Silverlight, или по вопросам архитектуры веб-приложений?
  2. Интересуют ли вас видеоролики в формате screencast? На какие темы?
  3. Интересуют ли вас аудиозаписи в виде podcast? На какие темы?

Прошу высказываться в комментариях.

Россия-Англия 2:1

Я счастлив :)

Posted: Oct 17 2007, 11:43 PM by Gollum | with no comments
Filed under: ,
Удивительное рядом

А вы знали, что можно сделать так:

Control c;
c = ParseControl("Enter your name: <asp:TextBox id='FirstName' runat='server'/>");

Только честно :)

Кто вы в South Park?

Отличный тест, кем бы вы были в известном мультике South Park :)

http://www.allsouthpark.ru/index.php?option=com_content&task=view&id=65&Itemid=64

Вы - Стен!

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

Картман

85 %

Джимми

45 %

Тимми!

45 %

Твик

35 %

Баттерс

35 %

Кенни

28 %

Кайл

15 %

Кто вы из мультфильма South Park?
All South Park

Posted: Aug 31 2007, 07:08 PM by Gollum | with no comments
Filed under: ,
LINQPad и обработка исключений в ASP.NET AJAX

Привет!

Сегодня Scott Guthrie выложил в своем блоге очередной обзор интересных статей по ASP.NET, LINQ, IIS 7.0 и Silverlight

Хочу отметить чрезвычайно удобный инструмент для разработчиков, использующих LINQ. Это - LINQPad. Подробности можно узнать, перейдя по ссылке, а  вкратце - это инструмент, напоминяющий query analyzer, но работающий для запросов LINQ. Очень удобно - можно получать результаты в удобной визуальной форме, и видеть, какой именно запрос SQL получается из данного запроса LINQ.

Еще хочу отметить статью об обработке исключений в ASP.NET AJAX. Дело в том, что при использовании AJAX очень многие исключения перехватываются, и отправляются клиенту. Изложенная в статье информация поможет понять, как же все-таки сохранять информацию об исключениях на стороне сервера. Тем не менее, я, в отличие от автора статьи, не восхищаюсь архитектурой Enterprise Library, и обработку исключений предпочитаю делать на основе веб-событий. И архитектура приведенного решения с синглтоном мне тоже не очень по душе.

И, в качестве десерта, информация о клиентских функциях ASP.NET AJAX $get и $find.

Код дня

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

var distinctUsers = userList.GroupBy(u => u.Login).Select(
g => new ActiveDirectoryUser{
Login = g.Key,
Email = g.First().Email,
Name = g.First().Name
});

К сожалению, в текущей реализации C# 3.0 не совсем правильно работает метод Distinct (поэтому он здесь и не применен), но при работе с локальными коллекциями это не проблема, как и показывает вышеприведенный код.

More Posts Next page »