DynamicObject, JSON и ближайшее будущее

Введение

В данной статье хочу ознакомить вас с небольшим приложением для работы с JSON данными, демонстрирующим возможности, доступные нам в .NET 4.0. Поверхностно будут рассмотрены вопросы JSON-формата, а так же работы с динамическими типами данных.

JSON

Есть такая классная шутка, известная широким массам:

3763158824_e2f57810c4[1] JSON (JavaScript Object Notation) — простой формат обмена данными, удобный для чтения и написания как человеком, так и компьютером. Он основан на подмножестве языка программирования JavaScript, определенного в стандарте ECMA-262 3rd Edition — December 1999. JSON — текстовый формат, полностью независимый от языка реализации, но он использует соглашения, знакомые программистам C-подобных языков, таких как C, C++, C#, Java, JavaScript, Perl, Python и многих других. Эти свойства делают JSON идеальным языком обмена данными. далее…

JSON и ваше приложение

Ну так вот, обычно, получая объекты по JSON в наших приложениях мы должны подготовить инфраструктуру для их поддержки (к примеру с помощью DataContractJsonSerializer и решения на типа этого). Однако это занимает значительное время у разработчика. В связи с этим у меня появилось страстное желание поставить JSON механизмы на рельсы динамических возможностей .NET 4.0 и получать от работы с ним одно удовольствие 😉

DynamicObject

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

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

К разработке

Для того, чтобы не испытывать неудобств при работе с JSON, я предлагаю воспользоваться (слить и зареференсить) решением от James Newton под названием JSON.NET, данный проект свободен и удовлетворяет всем основным требованиям работы с JSON в рамках .NET-стека (в том числе и LINQ).

Да, к тому же нам понадобится IDE, умеющая работать с .NET 4.0b1, к примеру Visual Studio 2010 Beta 1 (кстати #develop не отстает).

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

string input = @»{CPU: ’Intel’, Drives: [‘DVD read/writer’, 
«»500 gigabyte hard drive»»  ]}»
;

dynamic computer = new DynamicJSON(input);

И пробуем посмотреть, какие же свойства обнаружатся у нашего компьютера:

>> computer.CPU
«Intel»

>> computer.Drives
[
  »DVD read/writer»,
  »500 gigabyte hard drive»
]

>> computer.Drives[0]
«DVD read/writer»

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

  using Newtonsoft.Json.Linq;

  public class DynamicJSON : DynamicObject
  {
    private JObject _data;

    public DynamicJSON(string data)
    {
      _data = JObject.Parse(data);
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
      result = _data[binder.Name];
      return true;
    }
  }

И это всё, что потребуется от нас для работы данного примера, меня подобные вещи радуют чрезмерно, в связи с чем рекомендую и вам использовать подобную практику в своих решениях.


Как забыть про ярлыки на рабочем столе?

Введение

image Раньше у меня довольно часто возникала проблема захламления рабочего стола огромным количеством ярлыков, и я начинал теряться в них, соответственно терять время при поиске необходимых мне приложений. В дальнейшем я научился пользоваться сочетанием клавиш win+r, создавая ярлыки с короткими именами в system32. С приходом Windows Vista (7) теперь только кнопки win, однако гибкость и настройка данных методов весьма ограниченна. Имеется так же огромное количество hotkey-менеджеров, однако не с одним из них я так и не сдружился.

Лаунчеры

Недавно (по-моему после прочтения книги «Продуктивный программист. Как сделать сложное простым, а невозможное – возможным» Нила Форда) мой интерес пал на launcher’ы. Для windows-платформы я нашёл несколько:

Ну и герой этого поста:

Немного истории

enso_321[1]

Изложу настолько, насколько я сумел разобраться в ней. Первоначально Enso был строго коммерческим проектом, разрабатываемым компанией Humanized (основанной Джеффри Раскиным, в котрой в последующем работал его сын). В дальнейшем компания начала работу над Mozilla Ubiquity (аналог Enso, являющийся плагином для FireFox), что позволило ей сделать Enso бесплатным.

Enso

Лучше 1 раз увидеть, чем 7 раз прочитать, базовые возможности представлены в следующих роликах:

На настоящий момент на сайте компании есть две версии продукта:

удобна в эксплуатации, но умеет делать лишь базовые вещи.

настройка (как и во второй версии) происходит через embeded веб-сервер

в данной версии появилось огромное количество очень полезных плагинов (к примеру поиск в google, генерация объектов-карт по выделенному адресу) однако юзабили немного упало (с моей точки зрения) в плане того, что после ввода команды начала открываться отдельная строка для ввода параметров, на что уходило время, и приходилось нажимать лишний раз enter

Все отлично, за исключением того, что проект на данном сайте вроде как заброшен, что не совсем воодушевляло к использованию, однако слазив внутрь и посмотрев реализацию, обнаружилось, что всё написано на Python (межплатформенность?), а так же исходники доступны в свободном доступе, что немного приободрило.

В дальнейших поисках упоминаний о Enso я наткнулся на коммунити http://www.ensowiki.com, а так же (самое главное) хостинг нынешей версии Enso https://launchpad.net/enso, итак, что же изменилось с тех времен:

  • настройка больше не через веб-сервер
  • межплатформенность (Windows, Linux, Mac OS X, etc)
  • интерфейс первой версии
  • практически все плагины из второй версии

Используем Enso

Для установки существует инсталлер, поэтому трудности вряд ли могут встретиться. Далее у меня возникла необходимость в настройке (теперь для совершения настроек существует файл enso\config.py) “основной” клавиши (Caps Lock) в режим залипания (Sticky в терминологии создателей программы), для этого я проделал следующее:

# Whether the Quasimode is actually modal («sticky»).

IS_QUASIMODE_MODAL = True

Расширяем Enso

Классно, мой питомец (Enso) теперь стал послушным и ласковым, однако хочется научить его понимать новые команды, ну что ж, пускай это будет Enso hello world.

Я отправился в папку commands в корне, куда добавил файл butaji.py со следующим содержимым:

import enso.config

from enso.messages import displayMessage

def cmd_butaji(ensoapi, cmd):

if cmd == «time»:

ensoapi.display_message(«Hello world»)

cmd_butaji.valid_args = [‘time’]

И у меня получилось следующее:

image

image

Великолепно! я думаю, что мы с Enso очень сдружимся.


Ещё раз о SharePoint Guidance

Небольшая заметка, в которой я в очередной раз хотел бы обратить внимание на следующий документ:

sharepoint_guidance[1]

patterns & practices SharePoint Guidance

исключительно рекомендую всем разработчикам SharePoint

А так же вчера на http://channel9.msdn.com/ вышло несколько роликов, о работе с эти проектом:

How to use the logging components? — p & p Developing SharePoint Applications guidance

How to use the configuration component? — p & p Developing SharePoint Applications guidance

How to use the SharePoint Service Locator? — p & p Developing SharePoint Applications guidance

Walkthrough of the Contoso Reference Implementation- p & p Developing SharePoint Applications guidance

Приятного просмотра.