Делаем code-background-color persistance в Visual Studio 2010

Сегодня утром пришло письмо с connect.microsoft.com, куда я запостил баг о том, что VS2010 не умеет сохранять настройку цвета фона. И вот что, данный баг пофиксен:

image

Цитирую:

“For now, there is an extension written by a member of the VS Editor team as a patch that will allow custom background colors to persist. You can find it in VS by going to Tools->Extension Manager and searching for the "BackgroundPatchExtension," or download it from a web browser at this link: http://visualstudiogallery.msdn.microsoft.com/en-us/d53e0db3-6c41-4cf5-8ca1-339aeef1ac30. Once you install it, just make sure it is enabled in the Extension Manager, and your background color should be applied correctly.”

Надеюсь для кого-нибудь это будет полезным.

Май 29, 2009. Метки: . .net, visual studio. Оставить комментарий.

На моём HP Mini запустилась Visual Studio 2010

Перед моей поездкой в Индию я купил нетбук HP Mini 2140. Это прекрасная вещь. Он весит всего 1,8 кг. Поддерживает максимальное разрешение 1024 x 576 (нормальный по ширине но укороченный по высоте). Он обладает клавиатурой почти нормального размера. Моей любимой особенностью является то, что он может работать порядка 8 часов – что довольно таки долго.

Он поставляется с предустановленной Windows XP. Но я скачал и установил на него Windows 7RC. В мини нет DVD или компакт-дисков. Я скопировал образ Windows 7 на USB-флешку с помощью Daemon Tools. И установил Windows 7 с USB-флешки.

Далее я установил Windows Live Sync (так же известный как foldershare). Windows Live Sync синхронизирует файлы из папки My Documents\Everywhere между моим лаптопом, десктопом и нетбуком. Я могу изменять документы на моём нетбуке в автобусе Microsoft двигаясь на работу, позже они автоматически синхронизируются с компьютером на моём рабочем месте.

И наконец, я поставил на свой нетбук Visual Studio 2010. Я взял послений билд. Скорее всего мой нетбук не подходит даже под минимальную требуемую конфигурацию, однако Visual Studio 2010 работает прекрасно.

Я не уверен, что при работе Visual Studio на нетбуке процессор Atom моего HP Mini, выжимает из нетбука всё. И, определенно, не стоит запускать несколько приложений при работе Visual Studio. Однако данный пример показывает, что можно довольно-таки продуктивно потратить время, проведенное в самолёте или автобусе, за разработкой.

Во время установки VS2010 был даже такой момент, когда мне показалось, что она закончится неудачей, т.к. инсталлятор сообщил о том, что мой нетбук не подходит под минимальные требования разрешений (высота оказалась на 3 пикселя меньше требуемой), однако, я проигнорировал предупреждение, и установка успешно продолжилась.

image

От меня

Ну что же, радует тот факт, что Visual Studio 2010 запустилась на нетбуке, с нетерпением жду Пн, 18 мая, чтобы слить beta 1.

Данная статья является переводом:

http://stephenwalther.com/blog/archive/2009/05/14/my-hp-mini-runs-visual-studio-2010.aspx

Май 15, 2009. Метки: , , . .net, Windows Live, visual studio. Оставить комментарий.

Рассуждения о производительности объектной модели SharePoint

Введение

img13[1] Основными сущностями, с которыми приходится работать в рамках объектной модели SharePoint являются списки (SPList). Поэтому, считаю, что необходимо, в очередной раз, сделать акцент на способах работы с ними. Поэтому, если вас беспокоят такие вопросы, как:

  • Получение количества строк в списке
  • Получение значений записей в списках
  • Использование запросов (SPQuery) и представлений (SPView)
  • Пейджинг (постраничное разбиение) (довольно-таки не тривиальная реализация, поверьте)
  • Обновление большого числа записей
  • Обнаружение “медленных” списков

прошу прочесть, внимательно, данный текст:

http://www.infoq.com/articles/SharePoint-Andreas-Grabner

img5[1]

Март 12, 2009. Метки: , , , , , , , , , , , , , . .net, sharepoint, visual studio, web. 1 комментарий.

SPVisualDev – инструмент Sharepoint разработчика

Введение

Я, как разработчик под платформу Sharepoint, постоянно сталкиваюсь с такими задачами, как создание большого количества однообразного XML-кода (к примеру для описания Feature, WePart, Content Type, List Template и т.д.) что не совсем удобно. Для облегчения выполнения этих задач есть несколько инструментов:

  • один из них это Visual Studio Extensions for SharePoint (VSeWSS), я так и не смог привыкнуть к работе сним, в связи с непрозрачностью генерируемых на выходе решений, что значительно уменьшало гибкость разрабатываемых решений
  • следующий инструмент STSDev – фактически это набор шаблонов для проектов в Visual Studio, является внешней утилитой, удобен в использовании, но полезен лишь на начальной стадии знакомства с платформой
  • ну и последний, на котором хотелось бы заострить внимание, это SPVisualDev

Подробнее

 

Данный продукт представляет собой расширения для Visual Studio, из чего следует тип проектов и прочие удобства, о которых подробнее:

  • Синхронизация в режиме реального времени локальной копии и папки 12
  • Простой способ добавления новых фич в проект, а так же редактирование их свойств и элементов в графических формах (а не XML-файлах)
  • Легкость в активации/деактивации фич из контекстного меню в проекте VS
  • Автоматическая генерация и синхронизация обработчиков фич
  • Набор стандартных проектов и элементов, включая веб-части, обработчики событий, шаблонные страницы и т.д.
  • Отладка фич для страниц приложения с возможностью присоединения дебагера VS к просмотриваемой странице
  • Интеграция с отличных инструментом для создания WSP-пакетов WSPBuilder

FileDownload[1]Так же приложение имеет исчерпывающее количество сопроводительной документации и даже Visual How-to.

Настоятельно рекомендую поставить и попробовать в деле и почувствовать насколько приятно работать с этим инструментом.

Однако это не панацея, а следовательно всё, что не предусмотрено инструментом, придется делать самостоятельно.

Январь 23, 2009. Метки: , , , . codeplex, development, sharepoint, visual studio. Оставить комментарий.

Головоломки на C# (Ответы)

Введение

Итак, в предыдущем посте мною были приведены 6 вариантов необычного поведения языковых конструкций на C#. В этом посте я постараюсь дать более-менее внятное объяснение данных особенностей происходящего.

Ответы

Далее я продублирую приведенные фрагменты кода, а так же дополню их описанием нюансов

  1. Перегрузка

    Как вы думаете что выведет данный код и почему?

    using System;
    
    class Base
    {
        public virtual void Foo(int x)
        {
            Console.WriteLine ("Base.Foo(int)");
        }
    }
    
    class Derived : Base
    {
        public override void Foo(int x)
        {
            Console.WriteLine ("Derived.Foo(int)");
        }
    
        public void Foo(object o)
        {
            Console.WriteLine ("Derived.Foo(object)");
        }
    }
    
    class Test
    {
        static void Main()
        {
            Derived d = new Derived();
            int i = 10;
            d.Foo(i);
        }
    }

    Результат: Derived.Foo(object).Мы получили его таким, т.к. при выборе подходящего перегруженного метода в наследуемом типе компилятор игнорирует определенный в базовом типе метод, даже если он был переопределен в наследуемом!

  2. Порядок! Порядок!

    В каком порядке напечатаются строки на экране?

    using System;
    
    class Foo
    {
        static Foo()
        {
            Console.WriteLine ("Foo");
        }
    }
    
    class Bar
    {
        static int i = Init();
    
        static int Init()
        {
            Console.WriteLine("Bar");
            return 0;
        }
    }
    
    class Test
    {
        static void Main()
        {
            Foo f = new Foo();
            Bar b = new Bar();
        }
    } 

    Результат: В варианте Джона он получает следующую последовательность: “Bar, Foo”, однако при воспроизведении на своей машине у меня получилось: “Foo, Bar”. Я думаю, что причина различий лежит в разнице версий исполняющей среды (CLR, я исполнял код на версии 2.0.50727.3053). Он объясняет свои результаты тем, что у Foo конструктор статический, следовательно он не будет выполнен до точки первой инициализации этого класса. У Bar же нет статического конструктора, что позволяет CLR инициализировать его раньше. Однако, нет гарантии, что Bar будет напечатан вовсе, так как в нашем примере у CLR в принципе нет надобности инициализировать это статическое поле. Более подробно все эти нюансы описаны здесь!

  3. “Глупая” арифметика

    Компьютеры призваны помочь нам с арифметическими вычислениями, но почему тогда это выражение выводит false?

    double d1 = 1.000001;
    double d2 = 0.000001;
    Console.WriteLine((d1-d2)==1.0); 

    А такой вариант?

    double sum = 0;
    for (int i =0;i<10 ;i++ )
    {
      sum+=0.1;
    }
    Console.WriteLine(sum==1.0); 

    Результат: Все значения в данных примерах хранятся в двоичном виде, хотя 1.0 может хранится как точное значение, 1.000001 будет храниться примерно как 1.0000009999999999177333620536956004798412322998046875, и 0.000001 так же будет сохранено в виде 0.000000999999999999999954748111825886258685613938723690807819366455078125. В связи с этим нельзя утверждать о равенстве в предыдущих примерах. Почитать подробнее о числах с плавающей точкой.

    На заметку: В связи с указанными выше особенностями работы с типами с плавающей точкой, однозначно рекомендуют не использовать их при работе с денежными единицами, в данном случае рекомендуют определять собственные денежные типы (так называемые типы объект-значение [Object-Value]) с собственной логикой округления и прочих арифметических операций, а так же межвалютных операций.

  4. Печать, печать, печать

    Ниже приведен код, использующий анонимные методы, каков будет результат его исполнения?

    using System;
    using System.Collections.Generic;
    
    class Test
    {
        delegate void Printer();
    
        static void Main()
        {
            List<Printer> printers = new List<Printer>();
            for (int i=0; i < 10; i++)
            {
                printers.Add(delegate { Console.WriteLine(i); });
            }
    
            foreach (Printer printer in printers)
            {
                printer();
            }
        }
    } 

    Результат: О эта радость от фиксированных переменных. В данном примере всего одна переменная и её значение изменяется при каждой итерации в цикле. Анонимные методы фиксируют переменную, а не её значение, следовательно в результате мы получим десть раз число 10 на выводе!

  5. Ничего странного с компилятором тут не случилось

    Этот код скомпилится? Как это? Что бы это значило?

    using System;
    
    class Test
    {
        enum Foo { Bar, Baz };
    
        static void Main()
        {
            Foo f = 0.0;
            Console.WriteLine(f);
        }
    }

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

    using System;
    
    class Test
    {
        enum Foo { Bar, Baz };
    
        const int One = 1;
        const int Une = 1;
    
        static void Main()
        {
            Foo f = One-Une;
            Console.WriteLine(f);
        }
    } 

    Результат: Данный пример не будет компилироваться под C#2.0, но прекрасно компилируется под C#3.0. Это известная особенность, объяснить это можно тем, что оптимизированный алгоритм выполняет вычисления значения One-Une раньше, а следовательно перечисление даёт своё значение по-умолчанию 0.

  6. Вывод типа

    Какой же вариант будет выведен на экран?

    using System;
    
    class Test
    {
        static void Main()
        {
            Foo("Hello");
        }
    
        static void Foo(object x)
        {
            Console.WriteLine("object");
        }
    
        static void Foo<T>(params T[] x)
        {
            Console.WriteLine("params T[]");
        }
    } 

    Результат: params T[] будет напечатан. Но почему же компилятор выбирает создание массива, хотя в этом нет надобности? Этому есть две причины. Во-первых при выборе перегруженных методов T будет рассматриваться как System.String. Ничего страшного пока в этом нет.

    Однако при выборе “лучшего” метода среди параметров string x and params string[],x формально будет приоритетнее. Однако с нашей точки зрения эффективности выбор между object x и params string[] x падёт на метод с params string[] x в связи с тем, что он не требует преобразований типов.

Материалы

 

  1. Подготовлено по материалам http://www.yoda.arachsys.com/csharp/teasers-answers.html
  2. А так же http://martinfowler.com/

Январь 11, 2009. Метки: , , , , . .net, C#, Microsoft.NET, architecture, visual studio. Оставить комментарий.

Новая возможность .NET Reflector™

Вступление

Какой же всё-таки отличный этот Codeplex, чего там только нет. Сегодня обнаружил очень полезный плагин для рефлектора – он генерирует проекты для Visual Studio из сборки, загруженной в рефлектор, думаю переоценить насколько это полезно очень сложно.

Демонстрация

Так выглядит этот плагин в рефлекторе

Установка

Для того, чтобы воспользоваться этим замечательным дополнением нужно:

  1. Скачать поселднюю версию плагина по адресу http://www.codeplex.com/FileGenReflector
  2. Извлечь содержимое архива в папку с рефлектором
  3. Добавить FileGenerator.dll в Add-In’ы
  4. Попробовать и удивиться, что это работает ;)

Всем приятного кодинга!

Январь 8, 2009. Метки: , , , , . .net, C#, visual studio. 3 comments.

Головоломки на C#

Вступление

 

Казалось бы, что столько уже написано строк кода на C#, что не может быть уже ничего непредсказуемого, но язык всё равно оставляет за собой приятные неожиданности и сюрпризы, которые заставляют извилины встрепенуться и немножечко поработать в новом направлении.

В данной статье я хочу привести несколько примеров немного неожиданного поведения конструкций на C#.

Примеры

Ниже приведены 6 примеров немного нестандартных ситуаций, но довольно интересные для ознакомления:

  1. Перегрузка

    Как вы думаете что выведет данный код и почему?

    using System;
    class Base
    {
    public virtual void Foo(int x)
        {
            Console.WriteLine ("Base.Foo(int)");
        }
    }
    class Derived : Base
    {
    public override void Foo(int x)
        {
            Console.WriteLine ("Derived.Foo(int)");
        }
    public void Foo(object o)
        {
            Console.WriteLine ("Derived.Foo(object)");
        }
    }
    class Test
    {
    static void Main()
        {
            Derived d = new Derived();
    int i = 10;
            d.Foo(i);
        }
    }
  2. Порядок! Порядок!

    В каком порядке напечатаются строки на экране?

    using System;
    class Foo
    {
    static Foo()
        {
            Console.WriteLine ("Foo");
        }
    }
    class Bar
    {
    static int i = Init();
    static int Init()
        {
            Console.WriteLine("Bar");
    return 0;
        }
    }
    class Test
    {
    static void Main()
        {
            Foo f = new Foo();
            Bar b = new Bar();
        }
    }
  3. “Глупая” арифметика

    Компьютеры призваны помочь нам с арифметическими вычислениями, но почему тогда это выражение выводит false?

    double d1 = 1.000001;
    double d2 = 0.000001;
    Console.WriteLine((d1-d2)==1.0);


    А такой вариант?

    double sum = 0;
    for (int i =0;i<10 ;i++ )
    {
      sum+=0.1;
    }
    Console.WriteLine(sum==1.0);
  4. Печать, печать, печать

    Ниже приведен код, использующий анонимные методы, каков будет результат его исполнения?

    using System;
    using System.Collections.Generic;
    class Test
    {
    delegate void Printer();
    static void Main()
        {
            List<Printer> printers = new List<Printer>();
    for (int i=0; i < 10; i++)
            {
                printers.Add(delegate { Console.WriteLine(i); });
            }
    foreach (Printer printer in printers)
            {
                printer();
            }
        }
    }
  5. Ничего странного с компилятором тут не случилось

    Этот код скомпилится? Как это? Что бы это значило?

    using System;
    class Test
    {
    enum Foo { Bar, Baz };
    static void Main()
        {
            Foo f = 0.0;
            Console.WriteLine(f);
        }
    }


    А как Вам такой вариант?

    using System;
    class Test
    {
    enum Foo { Bar, Baz };
    const int One = 1;
    const int Une = 1;
    static void Main()
        {
            Foo f = One-Une;
            Console.WriteLine(f);
        }
    }
  6. Вывод типа

    Какой же вариант будет выведен на экран?

    using System;
    class Test
    {
    static void Main()
        {
            Foo("Hello");
        }
    static void Foo(object x)
        {
            Console.WriteLine("object");
        }
    static void Foo<T>(params T[] x)
        {
            Console.WriteLine("params T[]");
        }
    }

Материалы

Подготовлено по материалам http://www.yoda.arachsys.com/csharp/teasers.html

Ответы на поставленные задачи будут в следующем посте.

Январь 6, 2009. Метки: , , , , . .net, C#, Microsoft.NET, architecture, visual studio. Оставить комментарий.

Обзор языка Boo! – как средства организации DSL Вашего приложения

boo-logo-128_med

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

В последнее время меня так и тянет насесть на какой-нибудь новенький язык программирования, особенно что-нибудь на типа Ruby или Python, но в связи с моей привязанностью среде разработки (Visual Studio, неверно это не очень хорошо – зависеть от IDE ;) ) и затруднительной ситуацией с разработкой на ней на динамических языках (надеюсь это временное затруднение) от них пока пришлось отказаться. В то же время меня интересуют такие области как метапрограммирование и реализация DSL (Domain-Specific Language == проблемно-ориентированный язык приложения), и в этой связи видится мне, что Boo является весьма интересным языком. К тому же Boo – язык CLR, что очень даже не плохо для изучения.

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

Что такое Boo?

Boo представляет собой open-source объектно-ориентированный статически типизированный язык программирования для CLR с Python’о-подобным синтаксисом, язык увидел свет в 2004 году из-под рук Rodrigo B. de Oliveira. В настоящее время последняя версия 0.8.2, но даже если нет еще версии 1.0, это действительно очень стабильной и зрелый язык, который можно использовать на производстве.

Основные концепции в Boo:

  1. Дать компилятору сделать большую часть работы, для того чтобы помочь языку выглядеть более динамическим с автоматическим объявлением переменных, выводом и приведением типов.
  2. В то же время он предоставляет возможности для выполнения статической компиляции, проверку ошибок во время компиляции.
  3. Boo также предоставляет функциональную составляющую в том, что функции могут использоваться в качестве возвращаемого значения, как аргументы, хранимые в переменных, а так же как объекты.
  4. Boo имеет первоклассные генераторы, это конструкций, способные производить более одного значения при использовании итерации цикла (“return a for a in apples if a.IsRipe”).
  5. Boo также поддерживает утиную типизацию (Duck Typing), которая позволяет отказаться от обеспечения безопасности статических типов и принимать любой объект, который просто имеет соответствующие методы и свойства, определяемые во время выполнения.
  6. Boo также имеет расширения методов и свойств (extension methods and extension properties).

Одним из наиболее интересных функций Boo является расширяемость процесса компиляции, которая позволяет управлять компиляцией и изменять или добавлять функции. Можно добавить подпрограмм для проверки конвенции кода, генерирования отчётов или преобразовывания кода. То, что Вы сможете сделать в C# с помощью тулзы посткомпиляции такой, как PostSharp и только ограниченный набор действий. В Boo Вы могли бы например автоматически преобразовать класс в одноэкземплярный (pattern Singleton), просто добавив атрибут следующим образом:

[singleton]
class MySingleton: pass

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

В Boo пробелы имеют важное значение как в python, но есть возможность включить режим “Whitespace Agnostic”, позволяющий оканчивать выражение с помощью “end”, который избавит Вас от возможных проблем с пробелами.

Что нужно для начала работы с Boo?

Главным образом если Вы хотите узнать Boo, достаточно иметь последнюю версию Boo . В папке bin, Вы найдете файл “Booish.exe”, являющийся интерпретатором командной строки Boo, которая позволяет проиграться с синтаксисом языка.image

Для разработки нам необходима IDE, и следовательно у нас два варианта.

Большинство Boo разработчиков работают с SharpDevelop , и если Вы скачаете последнюю версию, в ней будет Boo полностью готовый к использованию. Эта IDE имеет преимущество, с точки зрения создания DSL, так как в ней легче добавить функции автозавершения кода и подсветки синтаксиса, в Visual Studio же потребуются написать лексер и парсер; в SharpDevelop можно сделать это с помощью XML-файла.

Но с другой стороны Visual Studio является зрелой IDE, и с BooLangStudio вы получите Boo интегрированный в Visual Studio. Люди жалуются, что проект является нестабильным и это лишь альфа выпуск, так же я встретился в нём с проблемами уникода (UTF8), которые пока не смог разрешить, но у меня пока нет весомых замечаний.

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

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

Продолжение следует…

Декабрь 28, 2008. Метки: , , , . .net, Boo, C#, DLR, DSL, Microsoft.NET, Python, Ruby, architecture, coding, visual studio. Оставить комментарий.

Clone Detective for Visual Studio

Clone Detective

Утилита для поиска копипастов в коде.

Доступна на проекте Codeplex.

Декабрь 7, 2008. Метки: , , , . .net, C#, coding, visual studio. Оставить комментарий.

Musthave: NArrange – органайзер кода для .NET

Отличная внешняя утилита (не интегрируется с VS), позволяющая довольно таки быстро и корректно (~90% ;) ) привести код приложения к формализму, описаному в конфигурационном файле, что является полезным приобритением для разработчиков, работающих в команде.

Скачать. (на данный момент последняя версия 0.2.7)

Подробности по установке и настройке.

Декабрь 7, 2008. Метки: , , , , . .net, C#, coding, visual studio. Оставить комментарий.

Следующая страница »