четверг, 26 июня 2008 г.

Сравнение дат в XPath

Недавно я столкнулся с задачей фильтрации xml-форм с помощью xpath-запросов. Задача вобщем-то простая, если в форме лежат только текстовые строки.

Если в форме есть даты, приходится изголяться - Xpath в System.Xml.XPath.XPathNavigator не умеет сравнивать даты в формате "YYYY-MM-DDT00:00:00.0000000+05:00". Решение этой проблемы найти в поисковике непросто, поэтому пусть оно лежит здесь :)

Фильтрация в моём случае выглядит примерно так: //FormDate[translate(substring-before(., 'T'), '-', '')>'20071231'] возвращает все элементы FormDate с датой в 2008 году и позже.

'20071231' представляет собой результат действия translate(substring-before('2007-12-31T00:00:00.0000000+05:00', 'T'), '-', '')

среда, 18 июня 2008 г.

Map/reduce/filter на С# 3.0

Dare Obasanjo пишет о своём опыте работы с фичами нового C# - Enumerable.Select, Enumerable.Aggregate, Enumerable.Where, понять суть которых без опыта использования функций высшего порядка(high-order functions) сложно.

Каждый объект, реализующий IEnumerable, в C# 3.0 позволяет принимать новые типы вызовов, оперирующих лямбда-функциями.
Некоторые их применения очевидны - IEnumerable.Max(person=> person.Salary) вернет максимальный оклад для списка работников.

Некоторые менее очевидны, особенно если их названия наводят на ложные аналогии с LINQ:
IEnumerable.Select - применяет функцию к списку элементов, возвращает список результатов работы функции. Python для этого имеет более понятное название - map.
IEnumerable.Aggregate - применяет функцию от двух аргументов ко всем элементам списка по очереди, возвращает результат последнего вычисления функции. В Python - reduce.
IEnumerable.Where - возвращает элементы списка, удовлетворяющие условию, задаваемому лямбда-функцией. В Python - filter.

Определенно, сделав синтаксис LINQ "читаемым" и sql-подобным, разработчики C# потеряли выразительность языка в других применениях.

Новые языки

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

Читаю Programming Ruby: The Pragmatic Programmer's Guide, первое издание которой доступно по ссылке. Интерес к этому у меня вызвало огромное количество блогпостов о преимуществах динамических языков, всплывающих теперь буквально повсюду. Steve Yegge со своим Rhino - пример программиста, совершенно фанатичного во всем, что касается языков программирования.

Два утверждения, которые он обосновывает в каждом втором посте -
  • используемый язык имеет значение
  • изучение новых языков может сущеcтвенно увеличить настроение и производительность труда

Показательным мне кажется пример C#, который в версии 3.0 явно пытается угнаться за выразительностью динамических языков. Не совсем это ему удается из-за унаследованного от Java синтаксиса, кажущегося после знакомства с Ruby издевательски пресным и длинным.

Кроме дополнения C#, Microsoft портирует на .net популярные "тру-динамические" языки - Python и Ruby. .Net-порт Ruby, IronRuby, разрабатывается командой John Lam'а. Компилятор IronRuby, доступный в исходниках на RubyForge, работоспособен и вполне себе демонстрирует возможности Dynamic Languages Runtime.

Многое говорит и направление развития технологий web-разработки от Microsoft: ASP.Net MVC Framework продвигают как лучшую альтернативу традиционным WebForms, её же усиленно скрещивают с IronRuby-кодом. Ещё на IronRuby поднимают порт Rails. Так что на IronRuby можно будет писать приложения как на традиционных Rails, так и на "Rails от Microsoft" :)

P.S. нормальный редактор для Ruby-кода с подсветкой синтаксиса и интеграцией с RubyDocs я нашел только у JetBrains - IntelliJ IDEA 7.0 даёт поиграться с языком бесплатно в течении 30 дней. Компьютеров мне доступно 3, поэтому я смогу пользоваться им 90 дней :).