пятница, 16 ноября 2012 г.

FarColorer включен в официальный дистрибутив Far Manager

Случилось неожиданное, но очень приятное событие. С 12.11.2012 плагин FarColorer включен в официальную поставку Far Manager.
Теперь, при каждой ночной сборке Far, будет так же собрана текущая версия (trunk) FarColorer. Так же происходит сборка схем и цветовых стилей.

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

Так получилось, что это событие совпало с открытием у меня странички "Проекты" (в шапке). На ней поднят Redmine - багтрекер. В нем создан проект "Colorer Library".
Данный проект является зеркалом проекта Colorer Library на sourceforge.net .
Цель создания зеркала:
  • решить проблему с медленной работой сайта sourceforge.net
  • использование нормального функционала по управлению проектом
  • создание Issue и контроль их исправления
Теперь все полученные ошибки и пожелания я заношу туда. Так проще отслеживать что нужно сделать - ранее страдал забывчивостью, да простит меня Roman Kuzmin -).
Создавать Issue на данном сайте имеет смысл только для FarColorer. Для остальных подпроектов Colorer Library следует использовать основной сайт . При необходимости они будут продублированы на этом сайте мной.

четверг, 18 октября 2012 г.

Особенности использования git subtree

В Git есть замечательная возможность по внедрению в проект внешних проектов, называемая Subtree Merging. Её плюсы в том, что можно править код этого внешнего проекта и при необходимости/возможности вносить эти изменения в его хранилище. так же легко и прозрачно сливать новые изменения из этого внешнего проекта к себе.
Но не все так просто. В приведенной выше ссылке на главу книги, посвященной под-деревьям, не говорится о том, при сливании в свой проект свежих изменений из внешнего проекта вы теряете свои локальные изменения данного проекта.  Единственное упоминание об этом я нашел только в документации по модулю git-subtree, который является альтернативным способом использования под-деревьев.
merge::
 Merge recent changes up to <commit> into the <prefix> subtree. As with normal 'git merge', this doesn't remove your own local changes; it just merges those changes into the latest <commit>. With '--squash', creates only one commit that contains all the changes, rather than merging in the entire history.
Правильной стратегией использования под-деревьев является следующее:
  1. влить в свой проект внешний проект, как это описано в инструкции
  2. если требуются изменения в локальной копии внешнего проекта - делаем их и коммитим.
  3. если требуется слить к себе изменения внешнего проекта, то в начале нужно слить локальные изменения этого проекта в бранч (созданный на шаге 1). Cливать той же командой, что и из бранча к себе
     git merge --squash -s subtree --no-commit your_branch
    Ну а затем делаем pull из внешнего проекта, в результате которого локальные изменения сливаются с внешними. Далее сливаем бранч к себе.
Жаль, что данное поведение не описано было. Начал проект, опираясь на под-деревья. И пройдя много коммитов напоролся на такую проблему. Ушло много времени, чтобы разобраться.

понедельник, 8 октября 2012 г.

Colorer 1.0.3.12 и обновления схем


Colorer 1.0.3.12 для Far 3

Изменения
  1. Плагин адаптирован под Far3 build 2876 API
  2. исправлена ошибка чтения настроек
Изменения схем
New:
- powershell (Roman Kuzmin)
- R (Roman Kuzmin)
- Lemon Parser Generator (Aleksey Dobrunov)
- json (Aliaksei Chapyzhenka)
- LLVM IR (Aliaksei Chapyzhenka)
Fixed:
- sql - 'end' for case block; fixed qualified host variables
- csharp - add struct in outlined; keyword 'var'; simple parse verbatim string
- php - php 5.4 support: traits, binary numbers, some functions deprecation (lazyeugene)
- less - some fixes (lazyeugene)
- SilverStripe - some fixes (lazyeugene)
- css - new keywords (lazyeugene)
- cobol - many fixes (Pavel Pleva)
- cobolfr - many fixes (Pavel Pleva)
- jcl - many fixes (Pavel Pleva)
- makefile- fixed comment after var definition (Pavel Pleva)
- pl1 - many fixes (Pavel Pleva)
- sh - fixed --eq (Pavel Pleva)
- graphviz - updated for Graphviz 2.28 (Roman Kuzmin)

Измененные схемы так же можно скачать отдельно по ссылке hrc-update.2012-10-08.zip

среда, 26 сентября 2012 г.

FarColorer 1.0.3.11

К очередному большому слому API в Far новая версия плагина.
Colorer 1.0.3.11 для Far 3

Изменения
  1. Плагин адаптирован под Far3 build 2838 API
  2. Исправлена ошибка вставки текста по ctrl+Enter из outline

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

FarColorer 1.0.3.10



Colorer 1.0.3.10 для Far 3

Изменения
  1. Плагин адаптирован под Far3 build 2573 API
  2. Выводим название текущего региона, а не родительского в меню "Данные региона"
Изменения схем
New:
- UniVision Basic (Pete Howell)
- markdown (Roman Kuzmin)
- squirrel
Fixed:
- matlab - try/catch support
- postscript - add keyword
- fix error in csharp, markdown, pl1, ubasic
- c-win32.ent - add keyword, constants
- c.hrc - printf format string


среда, 14 марта 2012 г.

FarColorer 1.0.3.9 и обновление схем


Colorer 1.0.3.9 для Far 3

Изменения
  1. В меню добавлен пункт вывода имени региона и схемы под курсором
  2. Исправлено: после смены цветового стиля не происходило обновление экрана
  3. Реализован вызов плагина из макросов по callplugin 
Изменения схем
New:
- SHPAML (Eric Gustavson https://github.com/occulens/shpaml-colorer)
- Less Css (lazyeugene)
- SilverStripe (lazyeugene)
Fixed:
- Far MacroLib
- Far.hrc - new in Far3
- Html - pair tags, conditional comments (IE) , new tags and etc. (lazyeugene)
- CSS - new keywords (lazyeugene)
- ASP - insertions in the scipt tags (lazyeugene)
- php - new keywords, json, OAuth; function name and constants case insensitive (lazyeugene)

Измененные схемы так же можно скачать отдельно по ссылке hrc-update.2012-03-15.7z

воскресенье, 8 января 2012 г.

Утечки памяти и невозможность управлять памятью

Очень часто C++ упрекают в том, что в нем сложно управлять памятью. Постоянно программисты забывают освобождать указатели. Из-за этого падают программы, или в лучшем случае съедают много памяти. Сам часто делаю такие ошибки, благо современный инструментарий позволяет находить такие ошибки. Но самое главное, ты сам можешь управлять памятью. Хочешь - выделил, хочешь удалил. Свобода выбора.
Другое дело встроенные в ПО языки программирования. Например Oracle PL/SQL.
Последние пару месяцев довелось проводить нагрузочное тестирование продукта, работающего на Oracle 10g. Куча тестов, снятие трейсов, анализ трейсов. Рекомендации по оптимизации, патчи. Вроде все нормально. Но как обычно, пришел он. Писец. Процессы на базе данных съели всю память, PGA вырос до максимума, база встала. Налицо серьезная утечка памяти.
Первая мысль - сейчас возьмем какой-нибудь инструмент для oracle и найдем, что течет. Ха, нет такого. DBA говорят, что есть вроде тузла, но плохо документирована, и они её сами не знают. Поиск в гугле по возможному поиску утечек памяти говорит только об оном - снять дамп памяти с процесса и провести анализ. Что этот анализ даст не очень понятно.
Вторая мысль - у нас ведь есть код. Будем в нем искать. Но что может течь в pl/sql ? встроенные типы number, varchar ? более сложные структуры ? в pl/sql нет понятия деструктора. Присвоил переменной значение, попользовался, забыл. Oracle сам подчищает. Максимум для массивов можно и нужно вызывать удаление всех элементов. Плюс в некоторых пакетах, работающих с clob и xml, нужно вызывать методы очистки. Хотя по умолчанию, время жизни у них в пределах функции.
Поиск по коду, комментирование кусков кода и т.п. в итоге указало на массив с переменными типа xmltype. Но все было корректно с точки зрения кода. Печальный вывод - бага oracle.  Oracle сам управляет памятью, мы ничего не можем вручную удалить (кроме массива). При присвоениях переменным результата работы функции мы не знаем, что будет сделано с памятью - будет копирование, или присвоение указателя на кусок памяти. Мы отданы на милость Oracle и его баги.
Для подтверждения лезем на металинк и ищем похожие ошибки. И оказываемся не одинокими. Куча ошибок с утечкой памяти в xmltype. Патчи? не, вы обновитесь на 11g (задача не тривиальная, и требующая проверки всего кода на совместимость), там скорее всего нормально. А если нет, мы вам выпустим патч на 11g. И сплошь попытки найти ошибки в коде заявителей. К нашей радости, мы нашли обходной путь для очистки памяти.

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

FarColorer 1.0.3.7 и обновление схем



Как и обещал ранее, добавил совместимость с windows 2000 SP4. Вот одна из статей, где описано что нужно сделать в коде для компиляции в VC++ 2010 программ для windows 2000. Более интересный вариант от far group у меня поначалу не завелся, поэтому отказался от него.

Colorer 1.0.3.7 для Far 2
Colorer 1.0.3.7 для Far 3

Изменения
  1. совместимость с windows 2000 sp4 
Изменения схем
New:
- Go (Mikhail Kupchik)
- Far MacroLib (Max Rusov)
Fixed:
- NowDoc in PHP
- regexp
- C++ function outline
- far.hrc - new in Far3
- vbasic and vbscript - fix outline
- lua (Aidar, darkmist )
- cobol.hrc: updated keywords list, removed import, color all keywords the same, allow string in single or double quotes (Pavel Pleva)
- cobolfr.hrc: updated keywords list, removed import, color all keywords the same (Pavel Pleva)
- pl1.hrc: added preprocessor comments, removed import, and other (Pavel Pleva)

Измененные схемы так же можно скачать отдельно по ссылке hrc-update.2012-01-08.7z

среда, 4 января 2012 г.

Небольшое достижение

Вот такой подарок получил на новый год на месте работы.
P.S.  это не конкурс красоты -)

вторник, 27 декабря 2011 г.

FarColorer 1.0.3.6

По просьбам пользователей, версию для Far 2 не забрасываю. Буду исправлять ошибки. Остальные плюшки только в версии под Far 3.

Colorer 1.0.3.6 для Far 2

Изменения для Far 2

  1. исправлен ввод символов _ и ~ в outline
  2. при указании своего catalog.xml проверка наличия rgb стилей проверяется только при включенном режиме TrueMod
  3. при смене типа файла не очищались списки функций и ошибок.
  4. если в сохраненных настройках установлен отсутствующий на момент загрузки цветовой стиль, то вначале пытаемся загрузить стиль по умолчанию (default), затем первый в списке.
  5. ошибки при работе с меню выбора типа файла
  6. переменные окружения в путях до hrc файлов
  7. разные мелкие ошибки и оптимизации
Colorer 1.0.3.6 для Far 3

Изменения для Far 3
  1. исправлен ввод символов _ и ~ в outline
  2. при указании своего catalog.xml проверка наличия rgb стилей проверяется только при включенном режиме TrueMod
В следующей версии заставлю плагин работать под Win 2000. Надо только добраться до тестовой зоны. Решение у Far Team уже есть.

воскресенье, 25 декабря 2011 г.

FarColorer 1.0.3.5 для Far3

К выходу первых публичных сборок Far 3 адаптированная версия плагина.
Colorer 1.0.3.5 для Far 3

Изменения
  1. Плагин адаптирован под Far3 build 2328 API
  2. Настройки сохраняются и читаются через Far API
  3. Плагин именуется FarColorer
  4. ошибки при работе с меню выбора типа файла
  5. работа с TrueMod Far3
  6. переменные окружения в путях до hrc файлов
  7. "крест" работает на темных схемах и в TrueMod
  8. на отображение "креста" не влияет присутствие символа табуляции.
  9. при отображении в редакторе символов пробела/табуляции им задавался разный цвет
  10. если в сохраненных настройках установлен отсутсвующий на момент загрузки цветовой стиль, то вначале пытаемся загрузить стиль поумолчани (default), атем первый в списке.
  11. при смене типа файла не очищались списки функций и ошибок.

понедельник, 4 июля 2011 г.

FarColorer 1.0.3.4

Colorer 1.0.3.4 для Far2
Colorer 1.0.3.4 для Far 3.0.2095

Изменения
  1. откат "на некоторых схемах в far передавалась лишняя цветовая зона" - для схем типа php приводило к ошибкам раскраски 
  2. новое меню выбора типа файлов. теперь можно задавать горячие клавиши, список "Избранные".
  3.  для параметра FullBack и всех системных параметров схем в списке выбора
    значений отображались неверные значения для выбора.

четверг, 30 июня 2011 г.

FarColorer 1.0.3.3



Colorer 1.0.3.2 для Far2
Colorer 1.0.3.2 для Far 3.0.2085

Изменения
  1. ошибка чтения настроек при заданном пути до catalog.xml
Изменения схем
Fixed:
- Pascal - write characters with codes 0-31 in the format ^@, ^A, ^B (Igor Yudincev)
- file type detection

среда, 29 июня 2011 г.

FarColorer 1.0.3.2


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

Colorer 1.0.3.2 для Far2
Colorer 1.0.3.2 для Far 3.0.2085

Изменения
  1. на некоторых схемах в far передавалась лишняя цветовая зона
  2.  при вставке текста из Outliner устанавливаем курсор на конец вставленного текста
  3. добавлена возможность использовать prototype с одинаковыми именами.
     т.е. теперь можно добавлять свои схемы для файлов, полностью заменяющие стандартные. 

Изменения схем
Fixed:
- add missing words for c, cpp, jscript, qmake, sql, vbscript, email (from HaRT)
- add C function outlining for C# (from Vladimir Panteleev)
- major improvements to D syntax file (from Vladimir Panteleev)
- minor fix proto.hrc (from Vladimir Panteleev)
- Pascal - write characters with codes 0-31 in the format ^@, ^A, ^B (Igor Yudincev)
- far.hrc - add support verbatim string; new functions
- c.hrc - shows #include and #define in the outline list is closed by key
- csharp.hrc - add support verbatim string;

    четверг, 16 июня 2011 г.

    Хранение backup`ов

    В мае, после поломки одного из компьютеров,  озаботился проблемой резервного хранения важных данных. Компьютеру своему доверять не стоит, сегодня работает, завтра нет. сегодня он есть , а завтра (не дай бог) сперли/потерял. Флешки и переносные или съемные жесткие тоже не вариант, причина что и выше. Запись на диски  - опять все что выше, плюс их нужно хранить отдельно от кипы других одноразовых болванок. Но вышеприведенные методы не исключаются как дополнительные.  Нужно что то более надежное.
    Сейчас стали популярно хранить backup и просто нужные файлы в сети, в сервисах на подобие DropBox. Оно удобно - везде, где есть интернет, ты можешь получить доступ к хранилищу; надежность хранения на таких сервисах выше, чем на домашнем компьютере (raid, backup и т.п.) Оно конечно не исключает вероятность хорошего такого сбоя, когда все ёк.  Но все же в разы надежнее. Плюс программки , которые делают резервные копии и закачивают их на сервер в сети. Минусы у них тоже есть. бесплано дается ограниченное место. нарастить можно но платно (суммы может и не очень большие, но за небольшой перерасход бесплатного места это много). твои данные могут еще и просматривать (привет dropbox). и многое другое.
    А еще  сейчас очень популярна темя облачных вычислений. (Облака, Белогривые лошадки. Облака, Что вы мчитесь без оглядки? (с)Сергей Козлов). Ресурсы на них стоят сравнительно недорого. (Кстати, онлайн хранилища зачастую используют как раз их. ) Можно выбрать оптимальные для себя настройки по ресурсам.
    Для себя, как наверное уже догадались, выбрал онлайн хранилище в облаке. Начитавшись хабрахабры выбрал облако от Selectel. Создал себе сервер с конфигурацией Mini (32) (Debian), оперативки в минимум (зачем нам она ? ), жесткий пока на 5 гб. И понеслась. Залил статичные старые данные , которые не предвидится изменять по ssh (надо бы придумать систему какую-нибудь хитрую по backup, но опять же надо ли ? ). и теперь храню их там. По деньгам выходит очень недорого. За 40 дней использования, в которые входила заливка данных (а это отдельные ресурсы сети) потратилось 92,13 рубля.
    Машинное время 1,63 руб. / 1.630 час.
    Потребление памяти 62,44 руб. / 125.683 ГБ * час.
    Диск: запросов на чтение 0,23 руб. / 0.069 млн. шт.
    Диск: запросов на запись 2,01 руб. / 0.603 млн. шт.
    Диск: прочитанный объём 0,16 руб. / 1.600 ГБ
    Диск: записанный объём 0,53 руб. / 5.300 ГБ
    Диск: хранение 24,53 руб. / 4.909 ТБ * час
    Сеть: получено 0,52 руб. / 2.600 ГБ
    Сеть: отправлено 0,08 руб. / 0.080 ГБ
    Итого 92,13 руб.
    Так это еще с учетом , что машина была все время включена. Если данные заливаются руками (не скрипты), да и редко, то можно выключать машину. А это исключает оплату за оперативку, только за хранение.  В итоге очень даже неплохое и недорогое решение по хранению файлов. Нарастить текущие 5 гб можно из админки, правда потребуется подшаманить после этого в ос. на крайняк можно слить данные к себе, удалить машину, создать новую с уже новым размером пространства, и залить обратно.

    среда, 15 июня 2011 г.

    Переезд на blogspot

    В целях оптимизации расходов, и пропавшей необходимости в vds перенес блог на Blogspot.
    Процесс переезда с WordPress на Blogspot неплохо описан у Umputun`а . По нему собственно и делал.

    Если что не так отображается, пишите, будем править. 

    суббота, 19 марта 2011 г.

    FarColorer для Far 1.75 и Far 2

    Поборов рекурсию и падения, можно выпустить новую версию плагина. Да и не просто для Far2 , а и еще для Far 1.75. Судя по сайту проекта, спрос на 1.75 большой.

    Эти версии особенные еще и тем, что скорее всего они последние в своих линейках. Что-то дорабатывать для Far 1.75 желания нет, разве что баги поправить.  А Far2 умер в непотребном состоянии, надо сразу на 3 версию переходить.

    Да и с Colorer надо что то делать. Хотя бы нумерацию версий привести к какому то порядку. Что-то типа   первая цифра - это версия фара, а остальное как получится. Бардак иначе получается.

    Ну хватит слов, перейдем к делу.

    Изменения схем
    New:
    - Python scheme completely rewritten (anatoly techtonik)
    - add support Expect
    Fixed:
    - remove .cgi from Perl extensions, use first line for detection
    - fix firstline of Python prototype to allow spaces in shebang
    - fix comments in Tcl ( Nikita Retunsky)
    - c# add #region/#endregion , get, set, yield

    Colorer 1.0.3.1 для Far2

    Изменения
    1. Работа с очень длинными строками. Ранее падали или недокрашивали длинные строки.
      Если нужно ограничить длину строки для раскраски используйте параметр maxlinelength в настройках схем.
    2. оптимизации и борьба с утечками в библиотеке.

    Colorer 1.0.2.2 для Far 1.75 x86
    Colorer 1.0.2.2 для Far 1.75 x64

    Изменения
    1. Работа с очень длинными строками. Ранее падали или недокрашивали длинные строки.
      Если нужно ограничить длину строки для раскраски используйте параметр maxlinelength в proto.hrc.
    2. оптимизации и борьба с утечками в библиотеке.
    3. увеличена скорость работы за счет хака far
    4. убрана не используемая опция "Время до показа диалога отмены"
    5. меню "Список функций" нормально вводятся в фильтр клавиши ":;-_~" , цифры с цифровой клавиатуры
    6. исправлено отображение неверного числа схем в меню выбора схемы
    7. исправлена ошибка работы "креста" при выборе типа раскраски
    8. ошибка работы с диалогом настроек плагина в 64-битной версии, приводящая к падению Far
    9. всякие мелочи

    Опыт отказа от рекурсии. Happy end

    Как оказалось, я был не прав по поводу того, что устранить потерю скорости не получится. При более внимательном рассмотрении увидел, что переменных класса CRegExp довольно таки много, а не одна. Соответственно им создавался отдельный стек. А это бага .... Ну ты лошара (с).

    В общем после исправления этого момента потеря производительности стала незначительной. Так что Happy End

    Попробовать изменения можно будет в новой версии плагина FarColorer 1.0.3.1

    четверг, 17 марта 2011 г.

    Опыт отказа от рекурсии

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

    Итак, рекурсия - это вызов функцией самой себя. Всем известен алгоритм вычисления факториала, классика книг. Все красиво и элегантно, хоть циклом кажется и проще. А уж всевозможные алгоритмы анализа строки и работы с регулярными выражениями. Казалось бы, используй и радуйся.
    Но не все так просто. Глубина рекурсии (как много раз функция может вызвать саму себя ) ограничена. Ограничена размером стека. Дело в том, что перед вызовом функцией самой себя, нужно сохранить значения всех локальных переменных, чтобы ими можно было воспользоваться после возвращения. А сохраняется это все в стек. И вот пока в стеке есть место, мы можем углубляться в рекурсию. Все глубже , глубже. Пока не выскочит ошибка - Stack overflow. И все , тушите свет.
    Стандартная величина стека примерно 2 мб (для windows программ). Так давайте увеличим размер стека опциями компилятора, делов то. А на сколько увеличить, так чтобы было и не много и не мало? а если запросы растут со временем , постоянно перекомпилировать? А если у вас библиотека, которая использует стек вызвавшей её программы ? И вот тут то и понимаешь, что это не наш метод. Надо как то избавляться от рекурсии.
    Вот с этим я и столкнулся в поддерживаемой мной библиотеке Colorer. Алгоритм разбора строки по регулярному выражению был рекурсивный. Так же был красив и пах. Но на длинных строках любил падать. Дай строку в 3000 символов и все, приехали. Надо было что то делать.
    Единственным методом ликвидации рекурсии, который я нашел , это избавление от хвостовой рекурсии. Суть его в следующем - если рекурсивный вызов идет последним в функции, то функцию можно заменить на цикл. Факториал как раз является примером для этого.
    Но у меня рекурсивных вызовов было очень много в функции. Часть можно было развернуть в цикл, но это совсем малая часть. Да и кстати, код был построен так, что в зависимости от результата вызова (функция возвращала bool значение) функция могла завершится или продолжить работу далее. А сама функция была циклом внутри которого switch.
    Вот тут то приходит единственное оставшееся решение - а почему бы нам не воспроизвести рекурсивный вызов с помощью цикла и сохранения параметров? т.е. сделать это все вместо компилятора. Что нам для этого нужно:
    1. список локальных переменных, которые нужно сохранить.
    2. динамический список типа стека, в который мы будем сохранять значения локальных переменных, и извлекать от туда
    3. после-рекурсионные действия , или action (не знаю как назвать это лучше)
    4. цикл 
    В начале остановимся на action. Каждый рекурсионный вызов в зависимости от результат приводил к return true, или return false, или return результат_функции, или к продолжению работы функции многими строками кода. Т.к. мы избавляемся от рекурсии в пользу цикла, то этот код нужно выполнить после завершения цикла для этого рекурсионного вызова. Т.е. когда цикл придет к return ... Потому все такие ситуации выделяем в один switch, присваивая  им свой код action.

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

    В общем описание получилось очень сумбурное, малопонятное.  Но объяснить тяжело. Проще показать результат. Правилась функция CRegExp::lowParse. До изменений файлы были следующими cregexp.cpp, cregexp.h. После применения данного метода cregexp.cpp, cregexp.h .

    В ходе испытаний, подтвердилась стабильная работа на длинных строках. Код работает корректно. Но немного упала скорость. На тестовых файлах скорость работы упала на 1 секунду (на моем компьютере). После анализа в профайлере, выяснилось , что узким местом стала работа с памятью в нашем стеке. Оптимизированный вариант приведен выше, как финальный. В нем падение скорости составляет уже примерно 0.4 секунды. Но это уже не устранимо. Зато мы не падаем на рекурсии.

    В новой версии FarColorer будет применен этот патч. И проблема, зафиксированная во многих баг-репортах , наконец таки уйдет.

    Happy end ?

    суббота, 26 февраля 2011 г.

    Добрым словом по 3g Мегафона

    Уже больше половины года пользуюсь 3g модемом Мегафона. Интернет на работе по талонам, на определенные сайты только можно ходить. Ну и в общем подключил безлимитку на 512 кб. Пользуюсь, работает и работает.

    А в последние месяцы приходится часто работать у заказчика в офисе. Они, редиски, то вообще не могут предоставить интернет, то работает все, кроме удаленного доступа в "нашу" сеть. И вот тут то меня удивил модем то, по 2 недели подряд в рабочее время через RDP по модему в нашу сеть. И ведь нормально работает. Скорости хватает,  вполне комфортно работается через RDP. В общем выручает сильно.
    Тут еще обратил внимание - ни одного обрыва за 4 суток, пока сам не оборвал связь. Для сотовой связи очень удивительно. Бывают конечно деньки, когда обрывы идут, но от сотовой связи такое ожидаемо. По крайней мере для меня.