13 ноября 2008

Switcher - Аналог Expose под Windows Vista

В скором будущем, когда позволит финансовая ситуация, я стану свитчером - перейду на Mac OS X. Сейчас же денег нет и я пытаюсь сформировать макоподобный интерфейс в Windows Vista. 

И вроде почти ни с чем проблем не было - кроме так называемого Expose. Но после некоторого времени, проведенного в гугле и отбрасыванием бесполезных/умерших утилит я наткунлся на программу под приятным мне названием - Switcher. 

По функционалу - тот же Expose но еще более настраиваемый. Что не менее отрадно - полностью бесплатно. Позволяет активировать функцию из угла экрана либо по сочетанию клавиш(можно даже оверрайдить Win+Tab). Единственное требование Windows Vista с работающим Aero.

04 ноября 2008

Новые возможности C# 4.0. Часть 3: Ковариантность обобщений

Когда обобщения(generic) пришли к нам вместе с C# 2.0, они стали одной из лучших возможностей в этом языке. Те, кто когда-либо создавал классы строготипизированных коллекций в C# 1.0 знает, насколько они упростили нам жизнь и уменьшили количество кода. Единственная проблема заключалась в том, что обобщенные типы не следовали тем же правилам наследования, которые были в силе для обычных типов. Начнем, пожалуй с определения двух простых классов, которые мы будем использовать в этой статье:

   1:  public class Shape
   2:  {
   3:  }
   4:   
   5:  public class Circle : Shape
   6:  {
   7:  }

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

   1:  public interface IContainer<T>
   2:  {
   3:      T GetItem();
   4:  }
   5:   
   6:  public class Container<T>: IContainer<T> 
   7:  {
   8:      private T item;
   9:   
  10:      public Container(T item)
  11:      {
  12:          this.item = item;
  13:      }
  14:   
  15:      public T GetItem()
  16:      {
  17:          return item;
  18:      }
  19:  }

У нас есть иерархия и контейнер. Теперь посмотрим на то, что мы сейчас не можем делать в текущей версии C# - 3.0.

   1:  static void Main(string[] args)
   2:  {            
   3:      IContainer<Shape> list = GetList();
   4:  }
   5:   
   6:  public static IContainer<Shape> GetList()
   7:  {
   8:      return new Container<Circle>(new Circle());
   9:  }

У нас есть метод GetList, у которого тип возращаемого значения определен как IContainer<Shape>, а возвращает он Container<Circle>. Так как Circle наследуется от Shape, а Container реализует интерфейс IContainer может показаться, что это сработает. Но, как вы догадались, C# 3.0 на это не способен.

В C# 4.0 у нас есть путь заставить это работать - нам нужно просто добавить ключевое слово out к параметру-типу в нашем определении интерфейса IContainer (замечу, что ковариантность в C# 4.0 ограничена интерфейсами и делегатам).

   1:  public interface IContainer<out T>
   2:  {
   3:      T GetItem();
   4:  }

Данная конструкция говорит компилятору, что тип T ковариантен, что означет то, что любой IContainer<T> будет принимать любой тип эквивалентный или более конкретный, чем T. Как мы видели выше, типом возвращаемого значения был IContainer<Shape>, но если мы поставим параметр out к нашему интерфейсу, то мы легко сможем вернуть и IContainer<Circle>.

Так почему же решено использовать ключевое слово out? Все потому, что когда вы определяете параметр-тип как ковариантный вы сможете только вернуть этот тип из интерфейса. Например такая контрукция недопустима:

   1:  public interface IContainer<out T>
   2:  {
   3:      void SetItem(T item);
   4:      T GetItem();
   5:  }

Но почему это не будет работать? Ответ на самом деле очень прост - безопасность типов. Давайте посмотрим на последствия того, что мы сделали:

   1:  static void Main(string[] args)
   2:  {
   3:      IContainer<Shape> container = new Container<Circle>();
   4:      SetItem(container);
   5:  }
   6:   
   7:  public static void SetItem(IContainer<Shape> container)
   8:  {
   9:      container.SetItem(new Square()); // BOOM!!!
  10:  }

Так как T ковариантен и, поэтому, мы можем присвоить Container<Circle> к переменной типа IContainer<Shape>, передав его дальше в наш статический метод SetItem, который принимает параметр типа IContainer<Shape> и, затем мы берем этот парметр и пытаемся добавить переменную типа Square в него. Кажется, что все верно - тип параметра IContainer<Shape> и это дает нам право добавить в него Square. Неверно. Это выражение "взорвется", так как мы пытаемся добавить Square в контейнер, который держит Circle. Поэтому, ключевым словом out, они ограничили ковариантность только одним направлением.

Вам, наверное, интересно как это все реализовано в CLR 4.0? В реализации нет нужды. Обобщенные типы работали в CLR 2.0 и они уже позволяли подобное поведение. Так как C# пытался сохранить безопасность типов - нам такое не дозволялось, но CLR справляется с этим на раз. И, небольшая ремарка - массивы в C# позволяют такое поведение, так что попробуйте. Я надеюсь, что вам понравилась эта статья и новая в этой серии не за горами!

Перевод статьи C# 4.0 New Features Part 3 - Generic Covariance

03 ноября 2008

Xbox 360 NXE: Второе рождение Xbox 360

19 ноября Microsoft выпустит обновление для интерфейса игровой приставки Xbox 360 - NXE. Это действительно крупное обновление, которое будет включать в себя следующие изменения:

Обновленный интерфейс

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

Визуальное представление также улучшено - интерфейс теперь несколько напоминает CoverFlow из iTunes. И, естественно, он стал более красивым.

Установка игр на жесткий диск

Благодаря этому изменению происходит существенное ускорение загрузки игр. Многие игры, например GTA IV, избавляются от лагов при загрузке текстур в тяжелых местах. Уменьшается шум DVD-привода - чтение идет не с него, а с жесткого диска. Однако диск в приводе держать все же придется - еще одна защита от пиратов.

Аватар пользователя

Это человечек, которого будут видеть ваши друзья в своем в списке людей - идеологически полный аналог аватаров Wii Mii. Полностью кастомизируемый внешний вид - габариты, сложение, лицо, одежда - этакий Sims.

И, напоследок, несколько видео.

Сравнение загрузки GTA IV с жесткого диска и с DVD-диска

Приветствие

Аватары