Friday, October 24, 2008

За и Против URI-based interface

Под такими интерфейсами имеется виду интерфейс связи между слоями в приложения(или системы) - когда весь обмен происходит через запросы:
  • get(URI) - получения информации с единственным параметром URI - строкой описывающей, что нужно получить или что нужно выполнить;
  • set(URI,Object) - сохранения с параметром URI описывающей какой ресурс нужно изменить и значение на которое нужно изменить.
В общем случае объектом при передаче между слоями может быть бинарное представление объекта, сериализованый(serialized object) объект в xml или обычная строка.

Пример: URI - /p1=v1/p2=v2 ~ select * from all where p1=v1 and p2=v2;

Достоинства:
  • унификация запросов между слоями и http запросами на сервер;
  • гибкость логики запроса;
  • возможность расширения - добавления новых параметров при сохранении обработки старых вариантов не влияет на работу системы и прозрачно для приложения;
  • удобное представление запроса для случая хранения данных в дереве(подобие xpath);
  • возможность кеширования всех приходящих запросов через один механизм;
  • возможность указания разрешений через регулярные выражения для строки.

Недостатки:
  • необходимость дополнительного разбора и формирования запросов для преобразования в форму удобную для выполнения;
  • сложность(иногда невозможность) передачи в качестве параметра в запросе величины без достаточно простого строкового отображения.

Sunday, October 19, 2008

patch xml

Или описание способа наложения patches на xml.

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

  Решение: использовать как patch xml полностью повторяющий структуру исходного файла с удалением частей которые не изменились.
Исходный файл:
<a>
  <b>
    <c>34</c>
  </b>
  <b>
    <c>45</c>
  </b>
</a>

Изменения:
<a>
  <b/>
  <b>
    <c>56</c>
  </b>
</a>
Результат:
<a>
  <b>
    <c>34</c>
  </b>
  <b>
    <c>56</c>
  </b>
</a>

  В этом примере так как первый узел с не изменился - он не присутствует в файле отличий. Родительский элемент от него присутствует для того чтобы указать, что изменился второй узел C.

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

Исходный файл:
<a>
  <b>
    <id>34</id>
    <c>34</c>
  </b>
  <b>
    <id>45</id>
    <c>45</c>
  </b>
</a>

Изменения:
<a>
  <b>
    <id>45</id>
    <c>56</c>
  </b>
</a>

Результат:
<a>
  <b>
    <id>34</id>
    <c>34</c>
  </b>
  <b>
    <id>45</id>
    <c>56</c>
  </b>
</a>
  Для удаляемых элементов завести служебный флаг удалено - чтобы по окончанию наложения получить уменьшение объема.
 Реализация обоих алгоритмом достаточно простая- создание из xml структуры в виде дерева
элементов содержащих:
  • имя элемента(узла),
  • номер по порядку в исходном xml(для второго случая должен заменяться на идентификатор - если он есть),
  • список подчиненных узлов,
  • значение элемента.


  С последующим наложением этих деревьев друг на друга или на исходный xml (не требуется потом преобразовывать в xml).

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

Saturday, October 18, 2008

Silverlight 2.0

Компания Microsoft выпустила финальную версию Silverlight 2.0 и мои ухищрения по установке бета версии на экспресс версию стали не нужными. Также, как следствии появилась полная интеграция с студией.

Wednesday, October 15, 2008

Изменил внешний вид блога.

Подсмотрел автоматический перевод блога на Agile Ukraine и решил добавить и себе - может кто-то решит почитать мой блог на английском.

Sunday, October 12, 2008

Agile Gathering 6.


Побывал на Agile Gathering 6 - все очень понравилось. Наверное ещё неделю буду всем рассказывать как интересно там было и как жаль, что не все смогли там побывать. Постараюсь все свои впечатления описать :-).

Все доклады были интересными. Часть докладов была на конференции в Харькове, но звучали они по новому - то есть докладчик заострял внимание на новых моментах, поэтому было интересно их слушать. Жать что в отличии от Харьковской конференции - видео не будет.

В докладе Mixing Agile and RUP by Roman Oksyukovski заинтересовал опыт работы с заказчиком при создании ERP системы, когда применение Agile подхода к планированию позволило получить систему реализующую все нужные заказчику бизнес процессы.

Последним на конференции выступал Scrum Trainer Robin Dymond(американец) - рассказывал о обезжиривание процесса разработки. Полностью название его доклада не запомнил, но не в этом суть. Основная идея (точнее моя интерпретация) состоит в том что нужно максимально снизить затраты на не производственные затраты и как следствии снизить затраты на всю разработку. В общем случае CV(Client Value) + BV(Business Value) и непроизводственные затраты. Если первые два значения интересуют соответственно клиента и заказчика - то последнее только мёртвый груз. В начале доклада как пример эффективного решения этого вопроса производство самолётов(3 дня крупно-блочная сборка боинга767), постройка небоскрёбов и магазин очень часто выпускающий новые - коллекции, но с минимальными изменениями - что приводит к тому что они быстро подстраиваются к тенденциям.

OpenSpace как такового не было. После последнего докладчика - все быстро разошлись.

Затем у меня было свободное время:-) Поев пирожков на конференции (уж очень вкусные они были), довольный и сытый я пошёл смотреть центр Киева. Время на это у меня было много и я пошёл по маршруту: Площадь независимости - стадион Динамо - Мариинский Парк - памятник погибшим во второй мировой в виде гигантского столба - Печерская лавра - статуя Родина-мать. Все оказалось довольно близко - за час прошёл весь маршрут. Что-то все очень близко в Киеве. Все эти места я и раньше видел - но тогда мимоходом в командировках - поэтому не очень рассматривал. Теперь ночью увидел во всей красе - красивый город ночью. И киевлянки красивые:-) Много народа гуляет по паркам...

К сожалению фотографий нет. Камера в мобилке делает не очень хорошие снимки ночью.

Friday, October 10, 2008

Реализации strspn

Когда разбирался в коде реализации разбора и преобразования html - в gtkhtml - заметил что при разборе любого текстового файла очень часто используется функции strspn. Конечно это обычная практика - сам так делал, но не анализировал эту ситуацию.

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

Как результат понял что результат разбора очень зависит от скорости работы этот функции. Стало интересно какой алгоритм используется при при реализации strspn - просто ради общего развития, что в этом направлении сделано. И вот что я выяснил:

В glibc 2.7 существует 2 вида реализаций:

  • Медленная реализация вида - проход исходной строке в цикле с последующим проходом для каждого символа по строке - шаблону. Довольно таки простой надежный алгоритм, но не более количество проходов если не ошибаюсь сложность O это O(n*m) - где m*n это соответственно количество символов в исходном тексте и количество символов в шаблоне. Используется только для тестирования реализации. Расположена в файле string/test-strspn.c.
  • Основная реализация расположена в sysdeps/архитектура/strspn.S и реализует на ассемблере эту функцию для каждой поддерживаемой архитектуры. Алгоритм немного изменился - вначале создается буфер под 256 байт для реализации множества на масcиве флагов(массив создается в стеке). Затем для для каждого символа присутствующего в шаблоне устанавливается флаг. Затем осуществляется проход по исходной строке и осуществляется обычная проверка установлен ли флаг(значение байта != 0). В результате сложность алгоритма не зависит от количества символов в шаблоне(O(n*m)).
Выше указанное относиться к архитектура близким x86, для sparc - алгоритм сложнее и с первого захода я его не понял, так как эту архитектуру не очень глубоко знаю, и говорить точно ничего не могу.

Возможные пути улучшения:

Заменить массив из 256 байт на массив из 32 байт(256 бит) и проверять установлен ли бит в байте. Имеет основным достоинством что использует меньше памяти и возможно на архитектурах с такой разрядностью и/или аппаратно реализованной проверкой установлен ли бит - получить реализацию с минимальной зависимостью от скорости обращения к памяти при проверке присутствия элемента во множестве. Для архитектур x86 это большого выграша дать не может так как не полностью все множество влазит в размерность регистров и получение данных из кеша достаточно быстрое и получение данных из исходной строки идет с учетом особенностей архитектуры и получение данных идет с размерностью равной 32 бита с последующим получением частей. Так используется получение именно по 4 байта есть подозрение, что на части процессоров оно работает значительно быстрее получения 64 битных значений.

Для реализации получения значения бита в множестве на массиве из 32 байт пришлось бы использовать 5 инструкции:
  • получение байта в котором установлен бит через сдвиг(>>5 или >>4),
  • получение этого байта из памяти(скорее получение 4-8 байт в котором расположен нужный байт)
  • получение позиции в которой должен быть бит через и(i&(1<<5-1))
  • сдвиг полученного из памяти значения на полученное выше количество бит
  • проверка установлен ли этот бит через &
В алгоритмах вместо этого используется косвенная операция проверки установлен ли элемент в массиве testb, которая в теории проработает быстрее чем 5 ранее указанных .

И еще одно возможное ускорение рассчитанное на обычное наиболее частое употребление: пропустить пробелы - при этом снизив количество обращений к памяти - объединить все элементы в шаблоне по или и для каждого элемента в исходном тексте проверять через или входит ли он в подозрительное множество. Также можно проверять группу символов выравненных по границе машинного слова и передвигаться на размер этого слова.

Особого ускорения это не даст - может пара процентов. Нужно бы это проверить на досуге....

Sunday, October 5, 2008

Конференции

Побывал на позапрошлой неделе на третьей встрече IT-Talk в четверг, рассказывали интересно, но время поджимало и поэтому коротко.

Зато в субботу насладился по полной :-) Слушал весь день. Постараюсь не пропустить Agile Gathering 6.

Содержание можно посмотреть по ссылкам.