Вышла бета Service Pack 1 к .NET 3.5 и Visual Studio 2008

Вышла бета .NET 3.5 Service Pack 1 и Visual Studio 2008, скачать можно тут.

О нововведениях можно почитать тут. Обещаться большой прирост скорости холодной загрузки приложений, а также общей скорости работы WPF, рендеринга текста и битмап-эффектов. Также интересна прямая поддержка DirectX и шейдерных эффектов под WPF. Причём воспользоваться этими эффектами будет легко. Например, код

добавит под кнопку аппаратную тень:

Еще одна новая возможность заслуживает особого внимания – New .NET Framework Client Profile Setup Package. Это возможность создать компактный дистрибутив для машин, на которых не установлен .Net Framework, в котором будут содержаться только нужные части фреймворка:

Также много чего нового для удобства разработки веб приложений и работы с данными (ADO.NEТ Entity framework и ADO.NET Data Services).

Обещано, что это последняя бета и релиз совсем скоро.

Новая CUDA и конкурс разработчиков

Оказалось, что совсем недавно вышла новая версия (Beta 2.0) технологии CUDA от NVIDIA. Эта технология позволяет использовать мощности графического ядра видеокарт серии geforce 8×00 и выше для математических расчётов. При этом алгоритмы, которые допускают распараллеливание, могут показать огромный выигрышь в производительности.

Cuda

До недавнего релиза эта технология проходила мимо меня, так как просто не работала под 64-х битной Вистой. Но вот наконец она заработала и я поставил себе новые дровишки, cuda sdk и cuda toolkit. Я хотел прикрутить ее к своему проекту по обработке фото PerfectPhotos. Но, к сожалению, оказалось, что драйвера еще сыроваты и начали спонтанно перезапускаться в один прекрасный момент (когда я даже не работал с cuda), а потом дело дошло и до синего экрана, что под вистой является большой редкостью (лично у меня).

А тем временем NVIDIA и iXBT проводят конкурс для разработчиков (об этом я узнал тут).

Сериализация объектов в ручную – легко!

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

перед описанием объекта, и его уже можно легко сохранить используя класс BinaryFormatter из System.Runtime.Serialization. Казалось бы все просто и чего еще можно хотеть… Рассмотрим ситуацию когда ваш объект изменяется в процессе написания новых версий программы. Вы добавите новое свойство и обнаружите, что чтение (десериализация) старых данных перестало работать, так как объект изменился. Можно управлять десериализацией вручную, однако это накладно.

Так вот, чтобы избавиться от этих проблем можно написать свой [де]сериализатор используя Reflection:

private static void WriteObject(object obj, StreamWriter writer)

{

Type t = obj.GetType();

PropertyInfo[] pi = t.GetProperties();

 

writer.WriteLine(Begin(t.Name));

//Store all props

foreach (PropertyInfo p in pi)

writer.WriteLine(FormXmlLine(p.Name, p.GetValue(obj, null).ToString()));

writer.WriteLine(End(t.Name));

}

private static string Begin(string name)

{

return “<“ + name + “>”;

}

 

private static string End(string name)

{

return “</” + name + “>”;

}

 

private static string FormXmlLine(string name, string value)

{

return ”  <“ + name + “>” + value + “</” + name + “>”;

}

 

Метод просто записывает значения всех свойств объекта в формате XML. Его можно легко расширить для сохранения вложенных объектов и коллекций, добавив проверку типа свойства и видоизменив к рекуррентному виду. Хотя это не всегда нужно.

Прочитать сохраненный объект можно так:

    //Lets read

    public static void ReadObject(string filename, object Obj)

    {

      Type ObjType = Obj.GetType();

 

      using (XmlReader reader = XmlReader.Create(filename))

      {        

        while (reader.Read())

        {

          if (reader.IsStartElement())

          {

 

            if (reader.Name == ObjType.Name)

            {

              //Do nothing!

            }

            else

            {

              PropertyInfo[] pi = ObjType.GetProperties();

              foreach (PropertyInfo p in pi)

                if (p.Name == reader.Name)

                {

                  reader.Read();

 

                  //Read the text content of the element.

                  if (p.PropertyType.Name == “String”)

                    p.SetValue(Obj, reader.ReadString(), null);

                  if (p.PropertyType.Name == “Int32”)

                    p.SetValue(Obj, reader.ReadContentAsInt(), null);

                  if (p.PropertyType.Name == “Int64”)

                    p.SetValue(Obj, reader.ReadContentAsInt(), null);                  

                  if (p.PropertyType.Name == “Long”)

                    p.SetValue(Obj, reader.ReadContentAsLong(), null);

                }

            }

 

          }

        }

      }

    }

 

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

Работа с Flickr из C# – механизм авторизации

Flickr

Кто не в курсе, Flickr – это очень популярный хостинг фото и видео. Википедия утверждает, что в нем более 2 биллионов изображений. Ко всему этому богатству можно получить доступ из вашего .net приложения.

Самая сложная часть – это авторизация.

  1. Сначала Вам нужно зарегистрироваться на сервере. (как не странно 🙂 )
  2. Затем нужно получить ключи тут. Это две строчки – ApiKey и Secret, которые будут использоваться в вашем коде для получения доступа к сервису фликр (но не к вашему акаунту).
  3. Нужно скачать библиотечку Flickr.Net
  4. Подключив скачанную библиотеку (using FlickrNet;), Вы уже можете получить доступ к публичному контенту фликра, который доступен без авторизации.

     

    flickr = new Flickr(ApiKey, SharedSecret);

     

  5. Но чтоб получить доступ к аккаунту нужно проделать еще одну операцию – получить Token.

     

    tempFrob = flickr.AuthGetFrob();

    string flickrUrl = flickr.AuthCalcUrl(tempFrob, AuthLevel.Write);

    System.Diagnostics.Process.Start(flickrUrl);

    Этот код запустит браузер, в котором пользователь должен подтвердить, что дает доступ вашему софту.

  6. Только теперь можно получить полный доступ:

     

    Auth auth = flickr.AuthGetToken(tempFrob);

    flickr.AuthToken = auth.Token;

     

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

     

    flickr = new Flickr(ApiKey, SharedSecret, Token);

     

  8. Теперь можно загрузить парочку фотографий:

     

    string photoId = flickr.UploadPicture(file, title, descripton, tags);

     

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

Что касается самого сервиса – обнаружил, что есть серьезное ограничение на размер фото, что меня лично, как любителя лучшего качества, не устраивает.

Напоследок – моя страница на фликре

Новый хостинг

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

 Добавление: переезд завершен. Благодаря Unicode UTF8 почти никто не пострадал.

Возможности биндинга в XAMLе

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

<Border.Background>

<Binding Path=Background>

<Binding.RelativeSource>

<RelativeSource Mode=FindAncestor AncestorType={x:Type ListBoxItem} AncestorLevel=1/>

</Binding.RelativeSource>

</Binding>

</Border.Background>

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

Хорошая книжка по WPF

Хочу порекомендовать хорошую книжку по WPF, Pro WPF in C# 2008, которую можно скачать с pdfchm.com. Достаточно сказать, что книжка объемом более тысячи страниц и освещает много аспектов, опущенных в аналогичных изданиях.

Хорошая книжка по WPF

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

Перевод XAML в HTML и как это можно использовать

Если ввести в гугле XAML to HTML то выпадет ссылка на програмку конвертации с исходниками. Конечно возможности этой конвертации ограничены, и не потому что утилита предназначена лишь для описания самого подхода к подобной конвертации, а потому что возможности XAML сильно шире возможностей HTML.

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

Например:

  /// <summary>

  /// Interaction logic for Window1.xaml

  /// </summary>

 

  public partial class Window1 : System.Windows.Window

  {

 

    public Window1()

    {

      InitializeComponent();

    }

Для реализации этого я всего лишь слегка доработал утилитку, добавив RichTextBox, содержимое которого переводится в XAML :

 string os = XamlWriter.Save(InputText.Document);

 

Об классах XamlReader/XamlWriter я писал немного тут, а таже на сайте готдотнет есть моя статейка на эту тему.

Итого получаем конвертацию содержимого RichTextBox прямо в HTML:

Xaml2Html

А еще можно обратно ковертировать HTML в XAML, и использовать в своих программах.

Работа с FTP из C# – легко!

Нашел на одном из западных блогов очень удобную библиотеку для работы с фтп.

Чтоб загрузить файл на свой сервер достаточно написать пару строк:

using BytesRoad.Net.Ftp;

… 

string FtpServer = “my.server.ru”;

string Username = “username”;

string Password = “password”;

string RemotePath = “\\folderonserver/”;

 

public void UploadFile(string LocalFile)

{

 // get instance of the FtpClient

 FtpClient client = new FtpClient();

 

 // use passive mode

 client.PassiveMode = true;

 

 client.Connect(Timeout, FtpServer, 21);

 client.Login(Timeout, Username, Password);

 

 // build the target file path

 string target = System.IO.Path.Combine(RemotePath,

 System.IO.Path.GetFileName(LocalFile)).Replace(“\\”, “/”);

 

 // synchronously upload the file

 client.PutFile(Timeout, target, LocalFile);

 

 //Disconnect

 client.Disconnect(Timeout);

}

Обратите внимание, что используется passive mode

Библиотека распространяется по лицензии GPL, то есть бесплатно. Скачать можно отсюда.

PerfectPhotos – обработка фотографий на WPF

Хочу представить Вам один из моих последних проектов – программу для обработки фотографий PerfectPhotos. Программа содержит большое количество средств для комплексного улучшения изображений и призвана избавить фотографа от необходимости муторной работы с фотошопом там где это возможно. Более подробное описание возможностей можно найти на сайте.

 

Отмечу лишь, что вся обработка ведется с 16-битным цветом (16 бит на канал).

С версии 1.0.1.96 программа поддерживает напрямую формат цифровых зеркальных камер Canon (.cr2), и с успехом может быть использована в качестве raw-конвертора.

Программа написана на WPF (.Net 3.0) и потому ее интерфейс отличается в лучшую сторону от конкурентов.