пятница, октября 31, 2008

Приемчик

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

1. Сохранить индекс в переменной. Просто, но нужна переменная.

2. Сделать функцию и заинлайнить ее. Нужна функция.

3. Извернуться.

Собственно, я о третьем варианте:

     With WordRec(AContent[ACharIndex + CharCount]) Do
If (Word(Bytes) >= $DC00) And (Word(Bytes) <= $DFFF) Then;

воскресенье, октября 26, 2008

Оперативность QC

Все шесть моих репортов прошли во внутреннюю базу в среднем через 2 недели после подачи. Шустро. Правда с одним лажа вышла, отрепортил о баге пофикшеном в релизе :(

пятница, октября 10, 2008

Полный QCец...

Только я отрепортил о нескольких ошибках, как меня снова перестало пускать к сервису... Плавающие баги, они самые милые, ага :)

p.s.

Ой блин... Снял галку DN Authentification и все снова заработало. Сплошные воркараунды :))

среда, октября 08, 2008

понедельник, октября 06, 2008

Val в Delphi 2009

Знаете как работает Val с юникодом? Рассматриваются лишь младшие байты символов :( Для проверки прогоните цикл от lo(Char) до high(Char) и посмотрите, сколько символов будет "успешно" преобразовано в число. Грустно. Если кто-то это читает, заQCите плиз...

пятница, октября 03, 2008

Обновился Common.Encodings

В метод GetEncoding добавлен параметр со значением по умолчанию позволяющий указывать на возможность использования стандартных (определенных в классе TEncoding) кодировок. Скажем, код GetEncoding('utf-16') создаст новый объект класса TUnicodeEncoding, а код GetEncoding('utf-16', True) вернет существующий объект TEncoding.Unicode;

среда, сентября 24, 2008

Delphi 2009 aka Tiburon. TEncoding.

На домашней страничке выложен модуль Common.Encodings расширяющий возможности стандартного класса TEncoding. Модуль содержит class helper для TEncoding и несколько вспомогательных advanced records.

Примеры использования: 

1.) Перечисление доступных кодировок

Var

ei : TEncodingInfo;

Begin

For ei In TEncoding.Encodings Do
If ei.IsAvailable Then
WriteLn('codepage: ', ei.CodePage, ' name: ', ei.Name);

End;

2.) Создание кодировки по имени:

 TEncoding.Encodings.ByName('utf-16').GetEncoding;

или

 TEncoding.GetEncoding('utf-16');

3.) Создание кодировки по номеру кодовой страницы:

 TEncoding.Encodings.ByCodePage(CP_UTF16_BE).GetEncoding;

или

 TEncoding.GetEncoding(CP_UTF16_BE);

4.) Получение информации о существющей кодировке:

 With TEncoding.UTF8.GetInfo Do
WriteLn('codepage: ', CodePage, ' name: ', Name, ' display name: ', DisplayName);

пятница, сентября 19, 2008

Delphi 2009. Вкратце.

Юникод+дженерики+анонимные методы это все понятно.

Порадовала скорость среды! И особенно скорость CodeInsight (несмотря на то, что я его все равно всегда отключаю)

Наконец-то они научились различать Implicit и Explicit для записей в нативе (2007 не пробовал, может и там уже было). Но вот редактор сильно подкачал, разучившись (в 2006 он и не сильно-то умел) перемещаться по Ctrl+Shift+Up/Down между декларацией и реализацией перегруженных операторов записи (правда, я тестировал на 12.0.3155.16733, может в релизе и поправили), а также разучился (для перегруженных операторов опять же) по Ctrl+Shift+C создавать макет метода по описанию.

Появился UInt64 -- беззнаковое 64битное число.

BeginThread и TInterfaceList по-прежнему имеют потенциальные утечки.

Неработает передача Int64 в параметре диспетчеризуемого метода (вызов метода от вариантной переменной). Точнее, если передавать переменную типа Int64 все работает, а если значение Int64(1024) -- нет.

Exception обзавелся потенциальной поддержкой стек-трейсинга, но только потенциальной :)

Очень порадовал {$POINTERMATH}

В комментариях исходников встречается sysmac.h. Интересно, это то о чем я думаю...?

Порадовал хелпер для TRTLCriticalSection (syncobjs.pas)

Порадовал обновленный ZLib

Огорчает нелепость использования системных InterlockedCompareExchangePointer (и прочих Interlocked...) при наличии нативных в system.pas

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

TLinkLabel неюзабельна совершенно, т.к. на системах младше XP, линки распознаваться не будут и пользователь будет видеть разметку.

понедельник, мая 12, 2008

Embarcadero + CodeGear

О покупке CodeGear компанией Embarcadero, стало известно почти неделю тому назад. А вот обращение к клиентам CodeGear, в котором, в частности, говорится о том, что дальнейшая разработка будет нацелена на гетерогенные платформы и различные СУБД. Ребята, идем на Linux и MacOS? :)

четверг, апреля 24, 2008

XML-RPC: Общие ошибки

Одна из самых часто встречающихся ошибок в реализациях XML-RPC -- экранирование лишних символов в строках. Лишних в том смысле, что спецификация XML-RPC их экранирования не требует. Для корректного парсинга пакета требуется экранировать символы: < (&lt;) и & (&amp;). Любые другие символы экранироваться не должны, но очень часто ошибочно экранируют еще и другие символы: ' (&apos;), " (&quot;), > (&gt;).

среда, апреля 23, 2008

Extended RTTI {$METHODINFO ON}

Пару дней назад, налетел на очень интересную граблю. В своем XML-RPC сервере я использую возможность Delphi создавать расширенную RTTI, для регистрации объектов на сервере. Описывается класс с некоторым API, публичная часть (та, что будет доступна XML-RPC клиентам) выносится в секцию Published (для которой и создается Extended RTTI). Затем создается объект данного класса  и регистрируется на сервере. В процессе регистрации сервер получает прототипы методов разбирая RTTI. Все работает прекрасно, кроме того, что помимо методов вынесенных в Published, компилятор создает RTTI еще и для некоторых (даже перегруженных!) методов из секции Public. Грабля, вылезла на довольно сложном классе имеющем nested types. На простых классах такого не обнаруживается.

пятница, апреля 18, 2008

Утечка в TInterfaceList

У данного списка (как впрочем и у TList, и его потомков) есть свойство Count позволяющее, как определять количество элементов списка, так и устанавливать его. Очень удобно использовать возможность назначения количества элементов, для многократной очистки списка (т.к. делается это без перераспределения памяти к которому приводит стандартный Clear). Однако, в классе TInterfaceList данная операция приводит к потере ссылок на хранящиеся интерфейсы, следовательно они никогда не будут освобождены.

воскресенье, апреля 13, 2008

XML-RPC. Снова :)

Сегодня получил 5046 вызовов в секунду (и это на отладочной версии, со всеми проверками и ассертами)!

вторник, апреля 08, 2008

Delphi хотелка

Уже который раз ловлю себя на мысли, что очень хочется иметь параметризованные циклы for-in-do. Тогда можно было бы писать примерно так: For Item[Param] In Items Do... Что приводило бы к выборке значений соответствующих параметрам (разумеется, при поддержке перечислителя).

И вторая хотелка касающаяся for-in-do это наличие двух методов вызываемых перед началом перечисления и после. Что помогло бы при реализации перечислителей в виде advanced records, когда им (перечислителям) требуется выполнять некоторые операции (например блокировка/разблокировка) над контейнером.

воскресенье, марта 30, 2008

А знаете ли вы, что...

Операция сравнения AString = '' выполняется в два раза быстрее чем Length(AString) = 0 для AnsiString, и медленнее (примерно в 1.3) для WideString при условии, что строка не пустая.

Плагиат

Какой то пельмень, по имени Max, тырит посты из моего блога (и видимо не только из моего) и публикует на своем (ссылку не дам, ибо нефиг)  от своего имени... Этот пост для него.

четверг, марта 20, 2008

Новые высоты :)

Сегодня, после небольшой переделки работы с SAX'ом, получил скорость в 4096 (число-то какое :)) вызовов XML-RPC в секунду (метод без параметров, возвращающий nil)

воскресенье, января 27, 2008

HTML Display Components

Кажется, сабжевая библиотека тихо умирает :( Автор отказывается делать какие-либо изменения/дополнения в будущем.

пятница, января 11, 2008

Ужос, нах...

Вчера, на одном форуме, увидел вопрос дельфиста:

"Раньше использовал инди смтп а как его запихать в поток не знаю. Формы же нет, куда его перетащить можно."

Это было бы смешно, если б не было так грустно :( Остается надеяться, что вот такие кадры, в скором времени, свалят под .Net (а именно такие, в основном, и валят, т.к. Delphi их донимает "акцесс виолатион'ами") и перестанут порочить доброе имя Дельфистов. В результате, свалившие будут писать тормозных и охотчих до памяти монстров (но главное (!), без "акцесс виолатион'ов" :D) на, и без того, тормозящей платформе, а лагерь .Net получит перебежавших чайников, в добавок к родным образованиям :) и постепенно будет ими опорочен :). Аминь.

пятница, января 04, 2008

Очередная бага TAlXmlDocument

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

  1. В процедуре PosInXmlString изменить строку Offset := RawXmlStringLength - RawXmlStringPos{ + 2};
  2. В процедуре AnalyzeComment добавить условие на размер комментария, длина которого не может быть меньше нуля And (P1 - RawXmlStringPos - 4 >= 0)