воскресенье, 3 мая 2009 г.

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

Louder!

Ползунок регулировки громкости в Windows 7 также является простеньким эквалайзером (или как оно называется, которое частотную/амплитудную характеристику показывает).
Простенько и элегантно.

пятница, 30 января 2009 г.

Яндекс.Фотки для Picasa » Яндекс.Фотки на карте

В Picase 3.1 можно удобно привязывать фотографии к различным точкам планеты (с помощью программы Google Earth). Эта информация без проблем экспортируется на Яндекс.Фотки и можно посмотреть места, где вы сделали фотографии, на карте прямо в онлайне.

вторник, 13 января 2009 г.

Windows 7

Обновил Vista Ultimate x64 до Windows 7 Ultimate x64. Полет нормальный.

суббота, 20 декабря 2008 г.

Типизированный путь к действию контроллера в ASP.NET MVC

В ASP.NET MVC для генерации путей (url) для действий (action) контроллеров (controller) можно использовать методы-расширения объекта UrlHelper, такой как Url.Action(string actionName, string controllerName). Но этот метод использует нетипизированные параметры, просто имена action и controller, где легко можно ошибиться. А главный недостаток – нет поддержки рефакторинга, и если вы захотите переименовать действие контроллера – вам придется нудно и без гарантий от ошибки переименовывать их вручную.

Но если внимательно посмотреть – то можно найти замечательный класс – ExpressionHelper и его метод GetRouteValuesFromExpression, который по лямбде-выражению (expression) получит необходимые параметры роутинга. Потом, уже на основе этих параметров можно получить и путь. И конечно, с лямбда-выраженями полная поддержка рефакторинга (спасибо ReSharper за наше счастливое настоящее).

Все бы хорошо – но этот метод не принимает во внимание атрибут ActionName, с помощью которого можно изменить имя действия. Встроенная функция всегда возвращает имя метода, которое в 99% совпадает с именем действия, но не всегда.

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

   1: using System;


   2: using System.Linq;


   3: using System.Linq.Expressions;


   4: using System.Web.Mvc;


   5: using System.Web.Routing;


   6:  


   7: using Microsoft.Web.Mvc.Internal;


   8:  


   9: namespace MediaOnline.Web.Helpers


  10: {


  11:     public static class UrlExtensions


  12:     {


  13:         public static string Action<T>(this UrlHelper url, Expression<Action<T>> action) where T : Controller


  14:         {


  15:             return Action(url, null, action);


  16:         }


  17:  


  18:         public static string Action<T>(this UrlHelper url, string name, Expression<Action<T>> action) where T : Controller


  19:         {


  20:             return RouteTable.Routes.GetVirtualPath(url.RequestContext, name,


  21:                 GetRouteValuesFromExpression(action)).VirtualPath;


  22:         }


  23:  


  24:         public static RouteValueDictionary GetRouteValuesFromExpression<TController>(Expression<Action<TController>> action) where TController : Controller


  25:         {


  26:             var route = ExpressionHelper.GetRouteValuesFromExpression(action);


  27:  


  28:             var body = (MethodCallExpression)action.Body;


  29:             var customName = (body.Method.GetCustomAttributes(typeof (ActionNameAttribute), false))


  30:                 .Cast<ActionNameAttribute>().FirstOrDefault();


  31:  


  32:             if (customName != null)


  33:             {


  34:                 route["Action"] = customName.Name;


  35:             }


  36:             return route;


  37:         }


  38:     }


  39: }


среда, 17 декабря 2008 г.

Яндекс.Фотки для Picasa » Picasa 3.1


Вышел релиз Picasa 3 на русском языке. Наш плагин всё также прекрасно работает. :)

суббота, 1 ноября 2008 г.

Удаленный импорт в Trac

Даже для маленькой компании (или одного разрботчика) необходимы инструменты для организации работы на проектами. Кроме системы контроля версий исходного кода, необходимость которой сегодня не отрицает никто, очень полезны системы учета ошибок (баг-тракинга) и базы знаний (часто на основе Wiki). Очень удачным воплощением всего этого набора инструментов в одном флаконе является Trac.

В интернете можно найти много сервисов предлагающих хостинг этого набора для вас за деньги или даже бесплатно. Одним из иэтих сервисов я и воспользовался около года назад, http://www.assembla.com. Но тут, совсем недеавно, они взяли и поменяли свои условия предоставления услуг – и теперь бесплатно ими можно воспользоваться только для OpenSource проектов. Я не буду акцентировать внимание на таком поведении (но надеюсь, вы все поняли и не будете пользоваться  их услугами ;) ). Я стал искать альтернативы – и нашел похожий сервис, предлагающий бесплатный Trac для закрытых частных проектов – DevjaVu.

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

Если копнуть глубже – Trac хранит свои данные в локальной базе данных SqLite. Так что я имею к ним доступ на свой локальной машине. Если копнуть еще дальше, то у Trac есть огромное число плагинов и расширений, среди который есть XmlRpcPlugin, который позволяет управлять и изменять данные Trac через протокол XML-RPC.

Теперь дело за малым :) Берем .NET в руки, в виде библиотеки XML-RPC.NET, замечательный ORM инструмент Business Logic Toolkit for .NET скомпилированный с дополнительными библиотеками для доступа к SqLite, и вуаля. Читаем из таблиц локальной БД нужную информацию и заливаем её на Trac через XML-RPC. Если кому интересны детали – могу выложит исходники TracImporter (так я его назвал :) ) в открытый доступ.

P.S. Также, во время реализации, я воспользоваля ещё одной фичей библиотеки BLToolkit – Duck Typing (утиная типизация). Очень удобно.