пятница, ноября 07, 2008
пятница, октября 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
Я победил QC :)
понедельник, октября 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;
понедельник, сентября 29, 2008
Косяк в TEncoding.FreeEncodings;
Не освобождается объект кодировки UTF7. И когда я только QC буду побеждать... :)
воскресенье, сентября 28, 2008
среда, сентября 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, линки распознаваться не будут и пользователь будет видеть разметку.
пятница, августа 15, 2008
воскресенье, мая 18, 2008
понедельник, мая 12, 2008
Embarcadero + CodeGear
О покупке CodeGear компанией Embarcadero, стало известно почти неделю тому назад. А вот обращение к клиентам CodeGear, в котором, в частности, говорится о том, что дальнейшая разработка будет нацелена на гетерогенные платформы и различные СУБД. Ребята, идем на Linux и MacOS? :)
четверг, апреля 24, 2008
XML-RPC: Общие ошибки
Одна из самых часто встречающихся ошибок в реализациях XML-RPC -- экранирование лишних символов в строках. Лишних в том смысле, что спецификация XML-RPC их экранирования не требует. Для корректного парсинга пакета требуется экранировать символы: < (<) и & (&). Любые другие символы экранироваться не должны, но очень часто ошибочно экранируют еще и другие символы: ' ('), " ("), > (>).
среда, апреля 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
Кажется, сабжевая библиотека тихо умирает :( Автор отказывается делать какие-либо изменения/дополнения в будущем.
суббота, января 19, 2008
пятница, января 11, 2008
Ужос, нах...
Вчера, на одном форуме, увидел вопрос дельфиста:
"Раньше использовал инди смтп а как его запихать в поток не знаю. Формы же нет, куда его перетащить можно."
Это было бы смешно, если б не было так грустно :( Остается надеяться, что вот такие кадры, в скором времени, свалят под .Net (а именно такие, в основном, и валят, т.к. Delphi их донимает "акцесс виолатион'ами") и перестанут порочить доброе имя Дельфистов. В результате, свалившие будут писать тормозных и охотчих до памяти монстров (но главное (!), без "акцесс виолатион'ов" :D) на, и без того, тормозящей платформе, а лагерь .Net получит перебежавших чайников, в добавок к родным образованиям :) и постепенно будет ими опорочен :). Аминь.
пятница, января 04, 2008
Очередная бага TAlXmlDocument
Ошибка, иногда, появляется при парсинге документов имеющих комментарии. Воспроизвести ошибку довольно просто -- в цикле создавать и парсить документ, с комментарием переменной длинны, от одного символа до размера буфера. Дело в том, что в процедуре PosInXmlString не учитываются некоторые особенности при расчете смещения. Однако, решить проблему очень просто:
- В процедуре PosInXmlString изменить строку Offset := RawXmlStringLength - RawXmlStringPos{ + 2};
- В процедуре AnalyzeComment добавить условие на размер комментария, длина которого не может быть меньше нуля And (P1 - RawXmlStringPos - 4 >= 0)