Monday, December 29, 2008

Производительность реализаций str(с)spn

Тесты strspn:

  1. Стандартная реализация: .850.870
  2. Тестовая реализация на С(пример кода в glibc): 1.886.713
  3. С удаленной переменной количество пропущенный символов: 1.757.733
  4. Использование множества для проверки разрешенных символов: 1.651.749
  5. С добавлением фильтрации на бинарный максимум и минимум: 2.983.546

Тесты strcspn:

  1. Стандартная реализация: 1.388.789
  2. Тестовая реализация на С(пример кода в glibc): 10.329.430
  3. Удаление вызова функции поиска символа в строке: 2.444.628
  4. С удаленной переменной количество пропущенный символов: 2.222.662
  5. Использование множества для проверки разрешенных символов: 1.607.756
  6. Использование множества для проверки разрешенных символов(с начальным сохранением разыменованного указателя): 1.654.748
  7. Использование множества для проверки разрешенных символов с фильтрацией на бинарный максимум и минимум: 1.872.716
  8. Использование множества для проверки разрешенных символов с фильтрацией на бинарный максимум и минимум(с начальным сохранением разыменованного указателя): 1.720.738
По результатам видно что добавление фильтра ничего не дает кроме 6% замедления по сравнению с обычной версией с использованием множества. То есть 2 операции косвенной адресации с последующим сравнением работают быстрее чем 1 операция косвенной адресации с бинарной операцией и сравнением результата.

Есть предположение что это следствие особенностей архитектуры:
  • оптимизации в Суперскалярной архитектуре(данные уже подгружены в кеш результатов);
  • быстрой работе с кешем (различия в косвенной адресации и обращении к регистру минимальны);
  • компилятор не разместил фильтр в регистре процессора и как результат получили вместо одного косвенного обращения два как и при работе с множеством(отличия для тестов с использованием разыменованного указателя).
В общем нужно пробовать оптимизировать ассемблерный код для исключения возможности косвенной адресации к фильтрам. Или придумать другие тесты....

P.S. Время указано в миллисекундах для Intel(R) Pentium(R) 4 CPU 3.00GHz(32 бита) и исходники тестов можно посмотреть c/strspn.

Saturday, December 27, 2008

Singularity?

Удалось запустить Singularity под эмулятором - она запустилась только под виртуальной машиной Microsoft(Microsoft Virtual PC/). Где то месяц назад пытался запустить под bochs и VMWare но в обоих эмуляторах она не запустилась - точную причину ошибки не помню, под Virtual PC она тоже не сразу запустилась - в стандартном примере настроек было указано 512 метров памяти - при запуске вывалилась ошибка, что столько памяти виртуальная машина выделить не может, оказалось для запуска нужно около 400 метров памяти в виртуальной машине(стандартных 128 мало), если памяти мало запуск(загрузка самой ОС) выдает что не может выделить достаточно памяти. После запуска появляется командная строка - с очень маленьким количеством команд. В общем не впечатлило - как демонстрация концепции в общем не плохо - но документация года три назад меня больше понравилась - а пока видно основной недостаток для демонстрации требование в пол гигабайта мне кажется много. Я думал что за три года они достигли больших успехов. По сравнению с Minix(концепция близка) и даже другими миниос - демонстрация не очень.

Ну а идея в общем то не плоха использовать для всех компонентов управляемый код(только загрузчик на C), но идея не уникальна ОС на java тоже существует, например JNode и требования по описанию ниже(сам не пробовал).
Идея:
  1. ограничить коммуникацию между приложениями и ядром только сообщениями;
  2. описание в заголовке приложения всей требующихся ему ресурсов и возможностей(нужен ли доступ к сети, возможности и потребность в памяти);
  3. возможность перезапуска приложения при сбое;
  4. отсутствие требования к смене контекста и блокирования доступа к чужим страницам, так как доступ к памяти полностью управляется средствами языка(Не очень критичное улучшение, так как все эти операции часто контролируются аппаратно, например x86).
- уже реализовано в других операционных системах и как следствие имеет общие с ними проблемы:
  1. накладные расходы по передаче сообщений между элементами(MINIX - обычно это ограничение указывается для него);
  2. реализация части функция вне ядра в виде сервисов добавляет дополнительные затраты(опять таки MINIX), хотя в принципе при хорошо продуманном интерфейсе это не столь существенно и так работает графика в Vista и Linux(Xсы).
Ограничение возможностей для приложений, в распостраненных ос, очень часто расширяют для особенных приложений, из-за ошибок в этих приложениях эта защита преодолевается. И как следствие, эта система не всегда работает особенно при увеличении популярности ос.

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

Достаточно интересным примером я считаю минимальное количество функций доступных приложению в Linux(как и Unix) и простота и универсальность этих функций и предоставляемых абстракций. Абстракции в Inferno(расширение концепций Unix) мне показались немного излишними, но возможно если их более точно понять, что под ними скрывается они окажутся даже более удобными и универсальными - пока я по описанию не очень точно понял смысл понятий на которых они основываются(отличие от концепций Unix). Но они достаточно эффективны, так как позволяют выполнять действия такие как копирование контента между 2 узлами управляемое с 3 достаточно эффективным через передачу управления непосредственно на первых 2 узла с передачей на 3 только статистики(очень похоже на самостоятельное управление передачей устройствами SCSI), вопрос безопасности и получения доверия между этими узлами в принципе решаем и при важности скрытия источника и приемника информации(непосредственно узлы не должны иметь полных данных) вполне решаем.

Thursday, December 25, 2008

Уточнения относительно старых постов

  • Изменения к gtkhtml применили полностью(rev 9074) теперь entity заменяются на основе кода созданного gperf и код замены использует двойной буфер.
  • По тесту Тьюринга - вопрос можно ли создать искусственный интеллект не обязательно сводить к философскому вопросу: "Познаваем ли мир", его можно решить создавая урезанную версию только в определенной области, при этом получаться четко ограниченные возможности и на новые идеи(решения) даже в этой области он не способен.

Monday, December 22, 2008

Сборка мусора

Или GC(Garbage Collection) применимо к glib.

В glib относительно памяти есть договоренность, что если возвращается константный указатель. то его освобождать не нужно, а в обратном случае нужно. Так же для gobject существуют функции g_object_ref () и g_object_unref (). Это решает проблему с слежением за выделением памяти, но требует от разработчика чтобы он следил за выделением памяти и при каждом копировании указатяля делал соответствующий вызов ref/unref. Что не совсем удобно... Система автоматической сборки мусора в C# или Java более удобна, но требует соответствующей поддержки от компилятора. Хотя эта проблема решена в Vala, так как он автоматически добавляет вызовы удаления памяти в чистом виде в glib его нет.

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

Отличие он настоящей сборки мусора - автоматически память не освобождается, только добавляется код отладки освобождения чтобы можно было посмотреть где выделялось. Очищать память автоматически не удастся(нужно придумывать систему макросов), что в общем случае делать не хочется или изменять компилятор. Оптимизация размещения объектов в памяти для glibc несколько теряет смысл так как все изменения указателей отслуживать сложно и нужно изменять код чтобы с непосредственно с указателями никто не работал и как-то выделял все ссылки в объектах чтобы можно было менять их расположение - что скорее всего особого смысла не имеет.

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

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

Sunday, December 21, 2008

Изменения к gtkhtml

Мои изменения к gtkhtml частично внесли в основную ветвь. Частично - так как по умолчанию компонент ведет себя в режиме совместимости со старым поведением и старается никак не выделятся. Также обнаружился маленький дефект с памятью - при замене спец символов после перекодировки я сдвигал текст в буфере на освободившееся место, что в общем может дать снижение скорости обработки, если спецсимволов много и сдвиг не оптимизирован для случая перекрытия источника и приемника(то есть именно для этого случая).

Мои изменения(уже примененные) позволяют при отображении страницы, если указан не корректный контент тайм, сменить его и отобразить оставшуюся страницу нормально. Также я добавил в зависимости от контент тайпа возможность перекодировать параметры запросов с форм. По умолчанию эта логика отключена, так как evolution сам перекодирует сообщение перед отображением, но не удаляет из сообщения не корректную кодировку и компонент не может правильно отобразить сообщение - изменить код в evolution не удалось, так как он достаточно запутанный(или это мне только показалось).

Пока не применены мои изменения относительно замены функции получения кода спецсимвола по его имени через автоматически сгенерированную hash функцию(gperf) и замена ранее указанного перемещения(сдвига памяти) на использование 2 буферов.

В дальнейшем gtkhtml в evolution(по планам) будет заменен на WebKit и если планы не изменяться, то развитие проекта будет прекращено. А пока я подправил также и свой миниброузер ради которого и были сделаны эти изменения.

Wednesday, December 17, 2008

WebOs

Заготовка к 3 выступлению, которая не понадобилась.
Глубокие исследования не проводились,
только в теории.

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

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

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

Основными требованиями к данному хранилищу является:
  1. простота добавления новых документов с локального компьютера и возможность добавления с общедоступных сервером минуя стадию копирования файла на локальный диск, файл загружается с ресурса в глобальное хранилище автоматически;
  2. защищенность сеансов связи и использование аутентификации пользователя;
  3. экономия трафика системы - загрузка по запросу (с использованием логики пред-загрузки для файлов к которым происходит частое обращение в прошлых сеансах), реализация загрузки только отличий файлов.
Все существующее методы обеспечения и реализации удаленного рабочего стола обладают некоторыми недостатками:
  1. во время работы в такой среде требуется, чтобы на удаленном компьютере уже стояли полностью настроенные браузеры с установленными java и flash плагинами- что не во всех случаях доступно конечному пользователю.
  2. требование поддержки данными браузерами определенных технологий(javascript), что приводит к невозможности использования некоторых браузеров, если на них не было изначально рассчитано приложение.
  3. некоторые системы требуют установки дополнительных компонентов, контролировать работу которых сложно.
  4. большой объем пересылаемой информации на сервер, так как некоторые функции выполнить на локальном компьютере через браузер сложно;
  5. закрытость архитектуры – что, зачем, и куда отсылается;
  6. закрытость процедуры аутентификации, невозможно проверить ее надежность.
  7. не полная поддержка функций требующихся обычному пользователю (отсутствие интеграции компонентов и не полнота функций), например, существует: календарь, internet messenger, редактор текстов и изображений и почта, с возможность использования как хранилище документов, но они организованы как web-портал c упрощением многих функций. Это хорошо для возможности доступа с любой точки земного шара, но для постоянной работы не подходит;
  8. отсутствие гарантий конфиденциальности и неразглашения информации;
  9. реализация на основе систем удаленного рабочего стола, приводит к передаче больших объемов информации (действия пользователя + изображение с сервера), хоть и выполняется после сжатия и шифрования, представляют существенный объем, и не позволяют передавать звук и мультимедиа информацию;
  10. не реализована возможность работы при утере связи.
В результате исследования рассмотрены варианты реализации этой системы и сформированы принципы формирования эвристических правил определения первоочередности загрузки файлов с глобального хранилища в локальное. Введены категории по которым осуществляется расстановка приоритетов загрузки и синхронизации файлов. На основе составления статистики использования файлов пользователем и его предпочтений.

Wednesday, December 10, 2008

Динамический пользовательский интерфейс

Продолжение поста относительно URI-based interface. Непосредственно использование динамического пользовательского интерфейса в приложении не обязательно требует использования ранее указанного интерфейса управления и обеспечения работы с данными и их зависимостями при хранении и передаче, но у меня использовалась и подразумевается именно эта комбинация. Но это так пояснение общей структуры приложения...

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

Причиной почему был выбран XML было простота реализации рекурсивного описания компонентов внутри формочек и возможность в случае чего без редактора этих форм - руками подправить ошибки. Из этого XML формировался классы(C#) для упрощения дальнейшей обработки структуры и эти классы в дальнейшем передавались компоненту который по классам формировал элементы с нужной вложенностью и структурой.

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

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

Запуск приложения это создание контроллера окон с подгрузкой всех нужных данный и подачей сообщения о создании окна с параметрами.

При создании элемента к нему по тегу привязывается обработчик - этот обработчик должен при появлении событие(клик по кнопке например) - найти все подчиненные и выполнить над ними действия(зависимые списки например). Также при смене отображения - можно привязывать обработчики к элементам, которые должны работать по разному в зависимости от отображения(обычно если компонент может генерировать разные типы событий и их нельзя преобразовать к единому виду), и первоначальное заполнение элементов - так как в основном один элемент в зависимости от отображения может показывать разные данные. Для добавления новых обработчиков добавлялся наследники от класса основной логики и там перегружался обработчик получения события для элемента и смены отображения форм. То есть получалось дерево наследований, в каждом классе добавлялась логика обработки событий объединенных какой-то общностью - например зависимостями и типом данных.

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

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

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

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

Sunday, December 7, 2008

Проектирование


Цветная версия картинки про проектирование - раньше я видел только черно-белые.
Кто исходный автор не знаю. На автора есть ссылка только в этом посте. Различные версии этого изображения можно поискать по ссылке.
А сама картинка я думаю понятна без коментариев.

Wednesday, November 26, 2008

Тест Тьюринга

Недавно исполнилось 71 год машине Тьюринга на которой в основном строятся все современные вычислительные машины.

Мои идеи к реализации решения этого теста методом Китайской комнаты. Решение которой только свидетельствует интеллекте создателя, а не машины.

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

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

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

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

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

Friday, November 21, 2008

4 встреча IT-talk

Побывал на 4 встрече It-talk. Опять не все смогли кто собирался прийти смогли прийти. Но те кто все-таки дошли остались довольны. Оба доклада были достаточно интересными. Особо понравилась идея из второго доклада: документация должна быть понятна всем без исключений.

Единственное, что омрачало это народу пришло много и не всем сразу нашлось место - не рассчитали...

Tuesday, November 4, 2008

Попугаи и Виста

Пояснение относительно попугаев: все помнят или не очень помнят мультик в котором проверяли сколько попугаев вмещается в одном удаве. Так вот похоже и в Висте производительность тоже меряется в попугаях (это во вкладке система в панели управления). После обновления версии BIOS на ноутбуке производительность рабочего стола Aero резко скакнула с 2.4 -> 3.0(20%). Что довольно таки необычно, так как в BIOS только инициализирует с минимальными работоспособными настройками видеокарту, и как я понимаю и для стандартных обновлений тайминги не должны резко изменяться. И как следствие в принципе на производительность должны в большей степени влиять обновления драйверов на видеокарту, так как они обновляются чаще и могут перенастроить видеокарту при запуске OC. Но с обновление драйверов производительность не изменялась, а как я думаю эта оценка достаточно нелинейна, чтобы немного подсластить переход на более новые версии аппаратуры(а значит немного более дорогие) - так как очень часто при серьёзной разнице в архитектуре - разница в производительности в некритичные моменты не очень отличается. Или что тоже возможно в биосе была какая-то досадная ошибка, что и приводила к не очень эффективной работе.

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

Ещё одно решение заключается в том что архитектура у моего ноута выглядит довольно неэффективно: видеокарта не имеет памяти на борту и берет её откусывая от системной . Поэтому так как в Висте(в отличии от XP) и Линуксе драйвера в теории уже могут сами перенастраивать распределение памяти для видеокарты, то я поставил минимально доступный объем в 32 метра(по умолчанию ставиться 256), чтобы операционная система сама могла решать сколько памяти нужно и столько при потребности откусить. Но мне кажется память на видокарте хотя бы в виде кеша все таки есть - то без неё получается ZX-Specrum - где памяти под видео отдельно как таковой не было и с синхроимпульсом останавливался процессор и из памяти бралась значение цвета для точки. Что не особо положительно влияло на производительность, но зато дёшево. При этом в отличие от выше указанной архитектуры довольно популярной для интегрированных видеокарт, тут есть маленькая особенность: у всех процессоров с интегрированным контроллером памяти в процессоре получается, что для того чтобы получить доступ к памяти, нужно попросить у процессора её переслать, так как непосредственно доступ к памяти получить не удастся, как это было при работе через северный мост.

В общем архитектура UMA во всех своей красе. Зато хорошо подходит для маркетинга - так как через PCIE можно получать доступ к памяти, можно сказать, что у видокарты нет непосредственных ограничений на объем памяти. В AGP, как я помню, можно было получить не более 256 метров и только под текструры. На аппаратном уровне я думаю это решалось достаточно просто скрывая при работе от процессора некоторый объем памяти и на все запросы от интегрированной видеокарты давать доступ к этому участку. Во общем все хорошо - но гонять данные при выводе картинки через процессор звучит не очень хорошо, поэтому думаю что есть все таки маленький кеш в котором и кешируються данные под вывод(framebuffer). В версиях описания архитектуры к более поздним моделям(общей архитектуры системы, а не видиокарты) там было под эти нужды 512Мбит. И этого объема вполне хватит на отрисовку и хранение. Более точных данных я не нашёл.

И как следствии возможно, что исправление работы с памятью не повлияло на тест памяти в Висте, но позволило быстрее получать доступ видеокарте к нужным участкам памяти. Но думаю все таки, при изменение алгоритма работы с памятью, результат теста должен был измениться и для остальных тестов, а не только для производительности Аеро.

Monday, November 3, 2008

Windows Seven?

Этот пост навеян постом в блоге Sleepless in Seattle. Хотя не только им, скорее общим субъективным мнением о новой ОС от Microsoft. Именно Субъективным!!!

Многие посты, что я видел, оставили у меня впечатление, что все ожидают от новой ос чего то особенного и желания от ранее указанной корпорации выпустить что-то особо новое, что удивит мир. Но у меня сложилось немного другое мнения читая блог Команды разработки Windows 7. Хотя, все это в любом случае PR.

Да они хотят сделать новое, но не удивить мир или захватить его. Именно разработчики, а не руководящее звено, что они хотят не берусь судить. Скорее они хотят смягчить мнение о новых операционных системах фирмы и решить внутренние проблемы накопившиеся за долгие годы. Некоторых удивило, что новая ос запускается на лептопе с половиной гигобайта оперативы. Но в принципе любая ос запуститься на любом количестве памяти, если не включать особо экстравагантные варианты, скорее она запуститься на аппаратуре которая является соответствующей текущим тенденциям на которые ориентировались при разработке. У меня предустановленная Виста на ноутбуке с таким же количеством оперативы(даже меньше так как часть съела видеокарта), такая была конфигурация в которой я его купил. Да работает очень туго и студия тормозит - но работать вполне можно - если смириться с некоторыми тормозами. Сейчас я поставил больше памяти и все сносно начало работать.

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

Единственно, что не понравилось в презентации, что удалили как таковую панель на которой отображается список запущенных программ. Да красиво, что теперь программы не просто группируются, но и показывается превьюшка для открытых программ и при клике можно сразу открыть конкретное окно. Но просто по списку иконок невозможно сразу понять какие программы сейчас запущены. Я примерно таким способом настроил у себя под XFCE менюшки заменив нижнюю на cairo-dock. Удобно, но не не всегда практично и отказаться от верхнего списка запущенных программ я всё таки не могу. Спец-эффекты в виде прозрачности(в XFCE) я использую, но с минимумом на запуск - просто сделал чтобы окна при передвижении и в фоне были прозрачными - очень удобно и даже немного прикольно, но зачем все эти эффекты при запуске? Только тормозишь работу.

С начала мне хотелось их все попробовать( у меня стоит Basic версия и части эффектов просто нет), но наигравшись со всеми этими эффектами в Линуксе, уже не хочется ими пользоваться. И как я заметил их обычно отключают и пользуются только статическими эффектами в виде прозрачности и нестандартной окраски, а их можно получить бесплатно с дровами от Nvidia или сменив цветовую схему. Но и про их отсутствие ты обычно быстро забываешь и не замечаешь включены или выключены они.

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

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

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.

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

Tuesday, September 30, 2008

Выложил реализацию recaptha на erlang

Сегодня обнаружил, что на googleсode выложили реализацию протокола openid. У нас в компании тоже есть реализация протокола openid - но она не полная, там не все особенности протокола реализованы - только наиболее важные для реализуемой нами системы.

Посоветовавшись мы решили выложить часть кода которую мы реализовали полностью для протокола recaptha чтобы не отставать:-) Результаты можно посмотреть здесь. Также выложена часть внутренней документации - как пояснение работы этого кода (на русском языке - так как было для внутреннего использования). Будет настроение переведу на более распостранненый в IT сфере английский.

Sunday, September 21, 2008

Ура:-) UTF8 работает в mc

Сегодня я наконец исправил установочный скрипт mc в используемом мною дистрибутиве, теперь русские буквы отображаются правильно и сроки не разжижаются - до сих пор я менял локаль, чтобы хоть как-то пользоваться mc(уж очень меня это досаждало). Теперь у меня красиво с подсветкой табов (показываются стрелочки) и все надписи ровненькие и не появляются в разных частях экрана. Пытался прикрутить патчи от CRUX, fedora и gentoo:-) Подошли объединенные скрипты :-)

Из федоры взял перекодировку манов и надписей. Падчи поддержки не подошли от нее(не компилировались исходники).

Нашел patches от CRUX все заработало, но версия mc (4.6.1) не поддерживала отображение табов стрелочками и надписи верхнего меню немного были неправильного размера.

Решил попробовать еще раз, но от генту (она использует patches от дебиана) и все заработало теперь мой любимый mc(4.6.2-pre1) работает как мне нужно:-)

Потом решил на этом не останавливаться и попробовать установить новые иксы - как раз вышла новая меса. Оказалось у меня в системе(в дистрибутиве) стоят почти последнее версии пакетов нужно было вручную обновить только xorg, libdrm и mesa. Обновил - запускаю, а у меня появильсь 3D ускорение(r4xx) - теперь можно в игрушки в линуксе запускать. И довольно неплохо - демки тунеля показывает 150 fps в игре gl-117 - 35 кадров(только какие-то глюки с клавой). И это на gpl дровах:-). Пропроритарные у меня не смогли откомпилить модуль ядра и не запустились - и во общем-то не очень и хотелось возиться с установкой приложения с закрытыми исходниками.

Из неполностью рабочего остался только wifi(ath5k) - он как-то тормознуто и не всегда стартует. А так если пару раз перегрузить карточу она отликаеться - но пока не очень уверено. Можно конечно написать разработчикам ядра - но пока не нашел кому написать и как правильно нописать описание ошибки. На своем не очень богатом опыте знаю, что правильное сообщение ошибки 90 процентов решения ее.

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

В общем ура:-)

Sunday, September 14, 2008

Исправление gtkhtml

Для исправления моего проекта, решил немного подправить:
  1. не поддерживал иные кодировки кроме utf, нужно было перекодировать исходный текст страниц;
  2. не корректная кодировка в передаваемом запросе.
Результат моих изменений можно посмотреть в папке patches.

В исходном коде удалена перекодировка entity - так как кодировка определяется после разбора кода страницы. В разборе удалена перекодировка строк и проверки на соответствие последовательности байт utf, теперь код только копирует части строк. При запросе из разобраного дерева tokens они перекодируються и заменяються Entity. В результате рендеринг отображает страницу в правильной кодировке, если кодировка указана в заголовке ответа или через указание http-equiv. Для перекодировки при формирование запроса заменил код http_encoding_string - теперь при вызове указываеться кодировка в которую нужно перекодировать строки. Данные о кодировке беруться из htmlengine.

В коде остались такие проблемы:
  1. в gtkhtml храниться кодировка хотя там она не как не используеться - нужно перевести на использование кодировки указаной в htmltokenizer
  2. в htmltokenizer есть код в цикле добавляющий по одному символу в буфер нужно заменить на strcpy
  3. существуют проблемы перекодировки на mail.ru заголовки сылок заменяються знаками вопроса

Thursday, September 11, 2008

Портирование приложений на 64 битные платформы

К вопросам всегда ли равны указатели разным целым типам и почему стоит избегать преобразований.

Так как размеры могут не совпадать и компилятор вполне может что предположить например привести к какому-то типу ( наприме ошибка из-за которой на новом компиляторе gcc 4.3.x не компилируеться erlang) . Если не изменять типы указателей маловероятны ошибки когда на разных платформах приложения работают по разному. Даже без особеностей адресации и доступа к памяти как на ppc.

И еще маленькая идея - не передавать в скриптовые языки указатели преобразовав их в целые числа - гораздо удобнее создавать для них хеш и передавать вместо них скриптовому языку именно его. В результате мы получим возможность точно кантролировать какие области используються как переданные скрипту и управлять памятью. И мы получаем достаточно безобасную работу с указателями.
(Идея содрана как мне кажеться с интерфейса работы с gobject c Python и c управления памятью .NET(C#)).

P.S. Еще близкое к этой теме.

Семинар It-Talk


Обнаружил себя на фотографиях с семинара. Семинар очень понравился. Как я понял: он являлся сокращённой версией внутреннего курса, хотелось бы прослушать весь курс.

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

Жаль только что пропустил первый семинар.

Saturday, August 23, 2008

Простенький броузер

Сегодня я выложил свой проектик (проектик - так как он очень маленький) броузера, создан он бул около года назад поэтому возможно код не особо красив, основной его целью было возможность навигации по вебу.

Так как в то время я решил поробовать основаный на исходных кодах дистрибутив Lunar в нем firefox не коппилился под 64 разрядную архитектуру. А пользоваться инетом скартинками хотелось:-)

Маленькое отступление:
  1. Выбор был основан на том что дистрибутивы основаные на пакетах я уже пробовал - не понравилось: так как все равно сам все пытался перекомпилить и установить не стандартные версии :-)
  2. И перешел на LFS все сам руками установил:-) Поставил нужные мне версии приложений - создал подобие системы установки используя как основу скрипты из установщика Gnome - Garnome.
  3. Он у меня простоял полгода:-) И тут мне захотелось купить ноутбук. Вот он как раз AMD64 и не него я решил перенести результаты своих трудов - и появились проблемы на 64 битной платформе все было не так гладко: не мог подобрать нужные драйвера под контролер жеских дисков -- нашел нужны а он у меня после компиляции отказывался работать.
  4. И я вернулся на Ubuntu:-) но долго терпеть не мог. Так Gentoo стояла у моего друга на компьютере, я решил найти что - то подобное, но не Gentoo - в ней был старый гном, а Lunar более новый(мне тогда это казалось достаточно важным - теперь я не особо замечаю различия между версиями или они действительно стали очень мелкими).
  5. И выбор был сделан с тех пор я пользуюсь им:-) Не все конечно так отлажено как в Gentoo, но очень даже не плохо:-)
И после этой короткой(а может и не очень) исторической справки маленькое описание броузера:
  1. он может нормально обрабатывать кодировки пришедших страниц(gtkhtml понимает только utf8) ;
  2. он может отобразить html стриницу с картинками:-);
И имеет несколько мелких ошибок:
  1. Он оправляет запросы в независимости от исходной кодировки страницы utf;
  2. Очень часто ошибаеться в относительных путях если часть стриниц имеет разный путь откуда отсчитываеться относительный путь (причина очень проста - в gtkhtml не храниться кодировка страницы и путь с которого она загружена - сейчас не могу говорить точно может уже и исправили);
  3. И ужасный интерфейс без кнопочек назад и указание на какую страницу только в логах на терминал.

Вот и весь проект...

Wednesday, August 20, 2008

SilverLight WPF

Продолжая предыдущее сообщение:

Удалось создать простейшие тестовые приложения с использованием SilverLight. При создании приложения автоматически системой сборки генерируется тестовая страница и сразу можно проверить его работоспособность. Благодаря этому не нужно дополнительный проектов чтобы проверить результат, в результате отдельный сервер для тестирования не нужен( проектов под ASP создавать не нужно).

Ручками создавать проект под SilverLight из пустого проекта нельзя нужно немного подредактировать в текстовом редакторе проект, чтобы он компилировался в xap(обычный zip архив с библиотекой и ресурсными файлами) иначе получается тоже самое, но без упаковки в архив и тестовой страницы.

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

Единственное есть пара недостатков: нельзя проект запустить в режиме отладки и присоединять отдельно отлажены проекты под WPF - как следствие создать скачала обёртку как обычное десктопное приложение, а затем над основной его логикой(окошки и графические элементы) добавить обёртку для запуска под SilverLight.

В результате хоть доступны одинаковые элменты в обоих приложениях, но они расположены в разных библиотеках с одинаковыми именами и свойствами. Как следствие: выход один создание логики преобразования внутренего состояния непосредственно в элементы в обертках- но код можно просто копировать, что тоже не плохо;-).

Sunday, August 17, 2008

SilverLight и Visual Studio Express 2008

Пока опыт не очень удачен, но удалось заставить компилироваться примеры. Осталось заставить их работать:-) Проблемы с asp - часть примеров с ошибкой нет доступа к подчиненным папкам. Но часть проектов нормально запускается при открытии с локальной папки. Пробовал не все примеры и не очень подробно разбирался почему недоступны файлы через стандартный тестовый сервер.

Надеюсь это кому-то поможет...

Основа опыта здесь. Но получилось это сделать немного правильнее по моему мнению.

Отличия от описанного я файлы требуемые для компиляции получил из стандартного пакета разработки под SilverLight 2.0(Silverlight Tools Beta 2 for Visual Studio 2008 silverlight_chainer.exe). Этот пакет требует для своей установки полной версии VS, но это можно обойти распаковав это пакет и запустив непосредственно версию SilverLight 2.0(Silverlight.2.0_Developer.exe) и библиотеки для разработки silverlight_sdk.msi.

После этого можно приступать непосредственно к открытию файлов примеров. Так как все примеры расчитаны на полную версию при открытии их появиться сообщение, что не все проекты удалось открыть. Для того чтобы их открыть нужно немного подправить файл описания проектов, которые не удалось открыть, удалив строки productversion и projecttypeguids.

Более подробно можно посмотреть по указанной выше ссылке.

Скачать установочный пакет SilverLight можно с официального сайта.

Удачи всем:-)

Wednesday, August 6, 2008

Портирование приложений СSharp на mono

Начальные действия.

Написано на основе опыта полученного при портировании толстого клиента, так как портирование еще не завершено(приостановлено), то опыт не полный.

Первое и самое важное что нужно сделать это определить какой именно функционал требуется в результате портирования. Так как скорее всего в результате портирования получается несколько урезанная версия в связи с ограничениями реализации mono и возможным использованием недокументированные функций из .NET в результате чего приложения будет работать некорректно.

Определить, где хранятся основные файлы приложения и важность именно такого расположения файлов и конфигураций. Хранение данных в реестре и использование установочных пакетов удобно в Wiondows, при запуске под Linux второе не используется, а для первого нужно самому внести все данные в реестр. В моем случае это было не критично так как в реестре храниться только версия установленного приложения в системе. И как следствие приложение не сможет себя автоматически обновить.

Для определения соответствия путей можно воспользоваться расположенным ниже списком:

  1. Environment.SpecialFolder.ApplicationData===домашний каталог/.config
  2. Environment.SpecialFolder.CommonApplicationData===/usr/share
  3. Environment.SpecialFolder.CommonProgramFiles===пустое значение
  4. Environment.SpecialFolder.Cookies===пустое значение
  5. Environment.SpecialFolder.Desktop===домашний каталог/Desktop
  6. Environment.SpecialFolder.DesktopDirectory===домашний каталог/Desktop
  7. Environment.SpecialFolder.Favorites===пустое значение
  8. Environment.SpecialFolder.History===пустое значение
  9. Environment.SpecialFolder.InternetCache===пустое значение
  10. Environment.SpecialFolder.LocalApplicationData===домашний каталог/.local/share
  11. Environment.SpecialFolder.MyComputer===пустое значение
  12. Environment.SpecialFolder.MyDocuments===домашний каталог
  13. Environment.SpecialFolder.MyMusic===домашний каталог/Music
  14. Environment.SpecialFolder.MyPictures===домашний каталог/Pictures
  15. Environment.SpecialFolder.Personal===домашний каталог
  16. Environment.SpecialFolder.ProgramFiles===пустое значение
  17. Environment.SpecialFolder.Programs===пустое значение
  18. Environment.SpecialFolder.Recent===пустое значение
  19. Environment.SpecialFolder.SendTo===пустое значение
  20. Environment.SpecialFolder.StartMenu===пустое значение
  21. Environment.SpecialFolder.Startup===пустое значение
  22. Environment.SpecialFolder.System===пустое значение
  23. Environment.SpecialFolder.Templates===пустое значение
Все не установленные пути лучше не использовать так как результат будет зависеть от текущей папки(обычно это папка где запустили) и возможны неприятные неожиданности.

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

Заменить в проекте все сообщения об ошибках на более информативные с указание стека выполнения. На пример: я добавил новый компонент которые отображает ошибку и в текстовом поле под ним отображает полный стек. Это очень важно так как исключения могут возникать по самым на первый взгляд безобидным причинам и приложение будет отказываться работать.

Установить последнюю версию mono и monodevelop - последнюю - так как скорее всего, именно в ней будет реализовано максимум возможностей из .Net. Если есть ограничение на дистрибутив максимально свежую из доступных в нем.

Сделать копию описания проекта и назвать его как нибудь на подобии проект_под_VS. После этого открыть проект под VS в monodevelop - при открытии, если был установочных проект, то среда сообщит, что он не передерживается. Это нормальная реакция системы после этого проект будет уже сохранен без не поддерживающихся частей и в результате для создания установочного пакета нужно будет использовать копию проекта сделанную ранее. В остальном проект можно использовать в на обоих платформах.

При компиляции возникает 2 типа ошибок(возможен и третий но очень редко.):

  1. Не корректно по мнению компилятора написанный код - возможно прийдеться раставить в местах ошибок дополнительные скобки чтобы исправить неоднозначности кода.
  2. Не корректная кодировка файла - самая подлая ошибка:-) Для избежания ее нужно все файлы используемые в проекте перевести из cp1251 в utf8. Ее симптомы компилятор ругается на нормальный на вид код и приложение работает неправильно , идет не по тем путям куда должно было. В моем случае некоторые элементы имели русское название и отображались не те формы или не те компоненты и не срабатывали нужные реакции.
  3. Не реализованы какие-то функции вообще никак, отсутствие некоторых свойств - очень редкое событие, но вполне возможно. Единственный метод решения этой проблемы не использовать этот код.
После выполнения всех этих шагов мы должны получить код который компилируется и запускается, но еше не работает.

Запускаем приложение

Основная проблема возникающая при работе: это отсутствие отладчика в monodevelop. И всю отладку скорее всего нужно проводить методом отладочных печатей и логов.

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

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

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

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


       /// 
/// Запущены под моно
///

/// нужно урезать объем отображения
public static bool IsRunningOnMono()
{
return Type.GetType("Mono.Runtime") != null;
}

///
/// Запущена не под XP(Считаем ее самой распространенной пользовательской системой)
///

///
public static bool IsTerminalServer()
{
return !(Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor == 1);
}

///
/// Запущены под юникс
///

/// нужно запретить специфичные для виндоус операции
public static bool IsUnix()
{
return Environment.OSVersion.Platform == PlatformID.Unix;
}
После выполнения этих шагов мы получаем приложение(альфа версия), которое работает с урезанным функционалом, но выглядит очень странно:-)

Исправление внешнего вида

Эта стадия еще не завершено мной, в новой версии mono 2.0 все компоненты выглядят очень похожими на оригинальный , но лучше все таки проверить.

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

Как результат мы получим приложение которое можно тестировать(бета версия).

Исправление функционала

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

Зачем это все надо

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

  1. При компиляции мы можем обнаружит части кода которые по каким-то причинам были не завершены или сделаны не качественно - присутствуют не используемые переменные, не проверяются ответы от функций и параметры функций не проверяются на корректность.
  2. Приложение, когда это потребуется, можно будет портировать, и затратить на это меньше времени.
  3. И как следствие предыдущего факта при смене версии ос даже на одной платформе (XP -> Vista) с большей вероятностью будет работать.

Thursday, July 10, 2008

Эльбрус-3М



Только мне кажется не очень понятным как выполняется эмуляция x86 если брать преобразовывать по одной команде(наиболее универсальный метод) то при возможности выполнить 24 команды одновременно будет выполнять только одна и выполнение не более трёхсот миллионов операция - так не возможно обогнать 500 МГц PIII так как простейшие операции выполняются на нем на RISC ядре(1команда менее или равна 1 такт). Если динамически блоки бинарного кода преобразуются в код другой выполнимый на другой архитектуре - появляются проблемы разбора сложных ветвлений адрес перехода может быть вычислен косвенно и в новом коде распределение адресов сложно поддерживать(пример переход вычисляется по какой-то формуле и выполняется прибавлением результата к текущему адресу - решение удаление функции с заменой ее на таблицу переходов). Вторая проблема определения частей кода являющимися данными - они могут быть внутри исполнимого кода. В общем полиморфные вирусы могут не заработать:-).