<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-33057655</id><updated>2011-12-26T01:53:17.034-08:00</updated><title type='text'>Разное от программиста...</title><subtitle type='html'>Разное, оно и есть разное</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default?start-index=101&amp;max-results=100'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>112</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-33057655.post-1779726271151990044</id><published>2011-12-26T01:53:00.001-08:00</published><updated>2011-12-26T01:53:17.050-08:00</updated><title type='text'>Firemonkey это сырая пре’альфа технолоджи превью.</title><content type='html'>&lt;p&gt;Как такое можно было релизить, вообще не понятно.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1779726271151990044?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1779726271151990044/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1779726271151990044' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1779726271151990044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1779726271151990044'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2011/12/firemonkey.html' title='Firemonkey это сырая пре’альфа технолоджи превью.'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1836618395584836918</id><published>2011-12-05T01:23:00.001-08:00</published><updated>2011-12-05T10:52:27.391-08:00</updated><title type='text'>Знатные грабельки компилятора</title><content type='html'>&lt;p&gt;Сегодня налетел на такое:&lt;/p&gt;  &lt;pre&gt;program nested_exception_class;&lt;br /&gt;&lt;br /&gt;{$APPTYPE CONSOLE}&lt;br /&gt;&lt;br /&gt;{$R *.res}&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  SysUtils;&lt;br /&gt;&lt;br /&gt;Type&lt;br /&gt;&lt;br /&gt; EUnitException = Class(Exception);&lt;br /&gt;&lt;br /&gt; //&lt;br /&gt; TMyRec = Record&lt;br /&gt;&lt;br /&gt;  Type&lt;br /&gt;&lt;br /&gt;   Exception = Class(EUnitException);&lt;br /&gt;&lt;br /&gt;   EOtherException = Class(Exception);&lt;br /&gt;&lt;br /&gt; End;&lt;br /&gt; //&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt; // ожидается: TMyRec.Exception, в действительности: Exception&lt;br /&gt; WriteLn(TMyRec.EOtherException.ClassParent.ClassName);&lt;br /&gt;&lt;br /&gt; // утверждение должно быть истинным, но нарушается&lt;br /&gt; Assert(TMyRec.EOtherException.ClassParent = TMyRec.Exception);&lt;br /&gt;&lt;br /&gt;end.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Компилятор выбрал неправильного родителя для моего класса (&lt;font color="#808080"&gt;EOtherException&lt;/font&gt;), хотя в редакторе, если кликнуть (&lt;font color="#808080"&gt;Ctrl+Click&lt;/font&gt;) по, родителю (&lt;font color="#808080"&gt;Class(Exception)&lt;/font&gt;) переход происходит к “правильному” классу (&lt;font color="#808080"&gt;TMyRec.Exception&lt;/font&gt;). Баг воспроизводится в Delphi 2006, Delphi XE2 Update 2, промежуточные не проверял, но думаю и там воспроизведется.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1836618395584836918?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1836618395584836918/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1836618395584836918' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1836618395584836918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1836618395584836918'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2011/12/blog-post.html' title='Знатные грабельки компилятора'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-5565250950488182619</id><published>2011-04-01T04:15:00.001-07:00</published><updated>2011-04-01T04:15:19.560-07:00</updated><title type='text'>Долбаное первое апреля…</title><content type='html'>&lt;p&gt;…фиг поймешь, какие новости не фейковые :E&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-5565250950488182619?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/5565250950488182619/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=5565250950488182619' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5565250950488182619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5565250950488182619'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2011/04/blog-post.html' title='Долбаное первое апреля…'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-7244203894270073856</id><published>2010-12-01T09:41:00.001-08:00</published><updated>2010-12-01T09:41:31.982-08:00</updated><title type='text'>Вы все еще верите докам?</title><content type='html'>&lt;p&gt;Вот что говорит Platform SDK о реализации метода &lt;strong&gt;Invoke&lt;/strong&gt;, в части о возвращаемых значениях, интерфейса &lt;strong&gt;IDispatch&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;“&lt;em&gt;DISP_E_NONAMEDARGS &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;This implementation of &lt;b&gt;IDispatch&lt;/b&gt; does not support named arguments.&lt;/em&gt;”&lt;/p&gt;  &lt;p&gt;А вот что говорит система получив &lt;strong&gt;DISP_E_NONAMEDARGS&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Eng:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;---------------------------   &lt;br /&gt;test    &lt;br /&gt;---------------------------    &lt;br /&gt;No named arguments.    &lt;br /&gt;---------------------------    &lt;br /&gt;OK&amp;#160;&amp;#160; &lt;br /&gt;---------------------------&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Rus:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;---------------------------   &lt;br /&gt;test    &lt;br /&gt;---------------------------    &lt;br /&gt;Именованные аргументы отсутствуют.    &lt;br /&gt;---------------------------    &lt;br /&gt;ОК&amp;#160;&amp;#160; &lt;br /&gt;---------------------------&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Совсем одно и то же, правда?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-7244203894270073856?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/7244203894270073856/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=7244203894270073856' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7244203894270073856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7244203894270073856'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2010/12/blog-post.html' title='Вы все еще верите докам?'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-2515188584530298742</id><published>2010-11-30T06:53:00.001-08:00</published><updated>2010-11-30T06:53:34.891-08:00</updated><title type='text'>Моя негодуэ…</title><content type='html'>&lt;p&gt;В условии директивы &lt;strong&gt;$IF&lt;/strong&gt; нельзя проверить содержимое &lt;strong&gt;resourcestring&lt;/strong&gt; :(((&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-2515188584530298742?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/2515188584530298742/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=2515188584530298742' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2515188584530298742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2515188584530298742'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2010/11/blog-post.html' title='Моя негодуэ…'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-8371324158074187430</id><published>2010-11-24T18:55:00.001-08:00</published><updated>2010-11-26T07:59:08.080-08:00</updated><title type='text'>Условная компиляция: defines vs. const</title><content type='html'>&lt;p&gt;Те кому приходится обеспечивать работоспособность кода на нескольких версиях Delphi не по наслышке знают о “прелестях” условной компиляции. Довольно сложно держать в голове набор фич каждой версии и особенности их работы. Ориентация на CompilerVersion, RTLVersion и VERXXX кажется простым делом в момент написания кода, но превращается в кошмар к моменту его рефакторинга т.к. все детали из головы уже выветрились и скучные выражения вроде {$IF CompilerVersion &amp;gt;= 18.5} ясности не добавляют. Обычно эта проблема решается с помощью включаемых файлов (&lt;font color="#808080"&gt;те, что с расширением .inc&lt;/font&gt;), где, основываясь на значениях перечисленных выше сущностей (&lt;font color="#808080"&gt;и возможно некоторых других&lt;/font&gt;), создается некий набор определений (&lt;font color="#808080"&gt;defines&lt;/font&gt;) с читаемыми именами. Делается это, например, так:&lt;/p&gt;  &lt;pre&gt;{$IFNDEF FPC}&lt;br /&gt; {$DEFINE DCC}&lt;br /&gt;{$ENDIF}&lt;br /&gt;...&lt;br /&gt;// Anonymous methods&lt;br /&gt;{$IF Defined(DCC) and (CompilerVersion &amp;gt;= 20)}&lt;br /&gt; {$DEFINE HAS_ANON_METHODS}&lt;br /&gt;{$IFEND}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Тут мы видим создаваемое определение HAS_ANON_METHODS, которое в дальнейшем позволит нам не вспоминать о версии компилятора, а просто и удобно писать код:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Type&lt;br /&gt; TMyEvent = {$IFDEF HAS_ANON_METHODS}Reference To {$ENDIF}Procedure(Sender : TObject) Of Object;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Но так ли, на самом деле, это удобно? Судите сами. CodeInsight не обеспечивает подсказки для определений. Написав “HAS_” и нажав Ctrl+Space вы не получите весь список возможных определений, а значит снова должны все держать в голове. Это не удобно. Лично меня это просто убивало. Однако, решение есть (&lt;font color="#808080"&gt;для версий Delphi начиная с 2005&lt;/font&gt;):&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Unit Common.Features;&lt;br /&gt;&lt;br /&gt;Interface&lt;br /&gt;&lt;br /&gt;Type&lt;br /&gt;&lt;br /&gt; //&lt;br /&gt; Delphi = Record&lt;br /&gt;&lt;br /&gt;  Type&lt;br /&gt;&lt;br /&gt;   //&lt;br /&gt;   Platform = Record&lt;br /&gt;&lt;br /&gt;    Const&lt;br /&gt;&lt;br /&gt;     Windows = {$IF Defined(MSWINDOWS)}True{$ELSE}False{$IFEND};&lt;br /&gt;     Linux   = {$IF Defined(LNUX)}True{$ELSE}False{$IFEND};&lt;br /&gt;     MacOS   = {$IF Defined(MACOS)}True{$ELSE}False{$IFEND};&lt;br /&gt;&lt;br /&gt;     {$REGION ' Platform check '}&lt;br /&gt;&lt;br /&gt;      {$IF Ord(Windows) + Ord(Linux) + Ord(MacOS) &amp;lt;&amp;gt; 1}&lt;br /&gt;&lt;br /&gt;       {$MESSAGE FATAL 'Unknown platform'}&lt;br /&gt;&lt;br /&gt;      {$IFEND}&lt;br /&gt;&lt;br /&gt;     {$ENDREGION}&lt;br /&gt;&lt;br /&gt;     x32 = SizeOf(Pointer) = 4;&lt;br /&gt;     x64 = SizeOf(Pointer) = 8;&lt;br /&gt;&lt;br /&gt;   End;&lt;br /&gt;   //&lt;br /&gt;&lt;br /&gt;   //&lt;br /&gt;   Language = Record&lt;br /&gt;&lt;br /&gt;    Const&lt;br /&gt;&lt;br /&gt;     Unicode          = {$IF Declared(UnicodeString)}True{$ELSE}False{$IFEND};&lt;br /&gt;     Generics         = CompilerVersion &amp;gt; 18.5;&lt;br /&gt;     AnonymousMethods = CompilerVersion &amp;gt;= 20;&lt;br /&gt;     Attributes       = {$IF Declared(TCustomAttribute)}True{$ELSE}False{$IFEND};&lt;br /&gt;&lt;br /&gt;   End;&lt;br /&gt;   //&lt;br /&gt;&lt;br /&gt;   //&lt;br /&gt;   RTL = Record&lt;br /&gt;&lt;br /&gt;    Type&lt;br /&gt;&lt;br /&gt;     //&lt;br /&gt;     TObject = Record&lt;br /&gt;&lt;br /&gt;      Const&lt;br /&gt;&lt;br /&gt;       ToString = RTLVersion &amp;gt;= 20;&lt;br /&gt;&lt;br /&gt;     End;&lt;br /&gt;     //&lt;br /&gt;&lt;br /&gt;     //&lt;br /&gt;     ObjectInvoke = Record&lt;br /&gt;&lt;br /&gt;      Const&lt;br /&gt;&lt;br /&gt;       MaxParams = {$IF RTLVersion &amp;lt; 20}10{$ELSE}32{$IFEND};&lt;br /&gt;&lt;br /&gt;     End;&lt;br /&gt;     //&lt;br /&gt;&lt;br /&gt;   End;&lt;br /&gt;   //&lt;br /&gt;&lt;br /&gt; End;&lt;br /&gt; //&lt;br /&gt;&lt;br /&gt;Implementation&lt;br /&gt;&lt;br /&gt;End.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Это не законченное решение, пока это только концепт. Надеюсь, основная идея понятна. Небольшой пример кода:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;scode      := E_FAIL;&lt;br /&gt;bstrSource := {$IF Not Delphi.Language.Unicode}UniUtf8Decode{$IFEND}(ClassName);&lt;br /&gt;&lt;br /&gt;{$IF Delphi.RTL.TObject.ToString}&lt;br /&gt;&lt;br /&gt; bstrDescription := ExceptObject.ToString&lt;br /&gt;&lt;br /&gt;{$ELSE}&lt;br /&gt;&lt;br /&gt; If ExceptObject Is Exception Then&lt;br /&gt;  bstrDescription := Exception(ExceptObject).Message&lt;br /&gt; Else&lt;br /&gt;  bstrDescription := {$IF Not Delphi.Language.Unicode}UniUtf8Decode{$IFEND}(ExceptObject.ClassName);&lt;br /&gt;&lt;br /&gt;{$IFEND}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Помимо того, что тут мы сразу видим иерархию (&lt;font color="#808080"&gt;и это очень помогает&lt;/font&gt;), нам еще и CodeInsight будет помогать (&lt;font color="#808080"&gt;только за пределами фигурных скобок&lt;/font&gt;).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;26.11.2010&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Забыл написать о самом серьезном преимуществе такого решения. Компилятор контролирует корректность идентификаторов (&lt;font color="#808080"&gt;правда с некоторыми оговорками, но это не важно&lt;/font&gt;), и если где-то ошибиться в написании то такой код просто не скомпилируется.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-8371324158074187430?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/8371324158074187430/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=8371324158074187430' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8371324158074187430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8371324158074187430'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2010/11/defines-vs-const.html' title='Условная компиляция: defines vs. const'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-6691623397826194906</id><published>2010-06-26T08:19:00.001-07:00</published><updated>2010-06-26T08:19:52.723-07:00</updated><title type='text'>Generics vs. Inline</title><content type='html'>&lt;p&gt;Директива &lt;strong&gt;Inline&lt;/strong&gt; не действует на методы в дженериках. Кажется, благое дело обернуть работу с динамическими массивами структурой-дженериком дабы увеличить функциональность путем добавления простых методов Add, Remove, Insert и т.п. Но все благие намерения натыкаются на суровую реальность в которой существует компилятор Delphi :( Столкновение произошло на этапе добавления свойства Items с сеттером SetItem и геттером GetItem, которые, конечно-же, были объявлены как &lt;strong&gt;Inline&lt;/strong&gt; ведь их тела состоят ровно из одной строки (&lt;font color="#808080"&gt;делать проверки индексов в столь тонкой обертке не практично и даже вредно&lt;/font&gt;), а вызываться они могут очень и очень часто. После проверки выяснилось, что компилятор не разворачивает тела этих методов, а делает их вызовы :( Можно, конечно, было объявить свойство без сеттера и геттера, но такие свойства не могут быть дефолтными, а значит писать код вида &lt;strong&gt;arr[index] := x;&lt;/strong&gt; уже не удастся.&lt;/p&gt;  &lt;p&gt; “Что-же так все неуклюже-то?” © Особенности национальной охоты.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-6691623397826194906?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/6691623397826194906/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=6691623397826194906' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6691623397826194906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6691623397826194906'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2010/06/generics-vs-inline.html' title='Generics vs. Inline'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1714032358777447976</id><published>2010-01-25T12:39:00.001-08:00</published><updated>2010-01-25T12:39:15.345-08:00</updated><title type='text'>Ужасы… Windows Platform SDK</title><content type='html'>&lt;p&gt;Пользовался Windows Platform SDK for Windows Vista.&amp;#160; Желая иметь самую свежую документацию скачал новый Windows SDK for Windows 7 and .NET Framework 3.5 Service Pack 1 (&lt;font color="#808080"&gt;Build date: 6/11/2009&lt;/font&gt;).&amp;#160; Ужас. Смотрим статью о &lt;strong&gt;WideCharToMultiByte:      &lt;br /&gt;      &lt;br /&gt;&lt;/strong&gt;Список кодовых страниц для которых флаги и некоторые параметры должны быть нулевыми.&lt;/p&gt;  &lt;p&gt;Список из нового SDK:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;50220 &lt;/li&gt;    &lt;li&gt;50221 &lt;/li&gt;    &lt;li&gt;50222 &lt;/li&gt;    &lt;li&gt;50225 &lt;/li&gt;    &lt;li&gt;50227 &lt;/li&gt;    &lt;li&gt;50229 &lt;/li&gt;    &lt;li&gt;57002 through 57011 &lt;/li&gt;    &lt;li&gt;65000 (UTF-7) &lt;/li&gt;    &lt;li&gt;42 (Symbol) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;А вот страницы из прежнего SDK:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;50220 &lt;/li&gt;    &lt;li&gt;50221 &lt;/li&gt;    &lt;li&gt;50222 &lt;/li&gt;    &lt;li&gt;50225 &lt;/li&gt;    &lt;li&gt;50227 &lt;/li&gt;    &lt;li&gt;50229 &lt;/li&gt;    &lt;li&gt;&lt;strike&gt;&lt;strong&gt;52936&lt;/strong&gt;&lt;/strike&gt; &lt;/li&gt;    &lt;li&gt;&lt;em&gt;&lt;strike&gt;54936&lt;/strike&gt;&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;57002 through 57011 &lt;/li&gt;    &lt;li&gt;65000 (UTF7) &lt;/li&gt;    &lt;li&gt;42 (Symbol) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Как видим, из нового SDK исчезло упоминание страницы 52936 (&lt;font color="#808080"&gt;54936 упоминается в документации дополнительно&lt;/font&gt;). Здравствуйте, грабли!&lt;/p&gt;  &lt;p&gt;Теперь сравните описания параметров.&lt;/p&gt;  &lt;p&gt;Новый SDK:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt; &lt;dt&gt;&lt;em&gt;&lt;u&gt;lpDefaultChar [in] &lt;/u&gt;&lt;/em&gt;    &lt;p&gt;&lt;/p&gt; &lt;/dt&gt;&lt;dd&gt;   &lt;p&gt;&lt;em&gt;Optional. Pointer to the character to use if a character cannot be represented in the specified code page. The application sets this parameter to NULL if the function is to use a system default value. To obtain the system default character, the application can call the GetCPInfo&lt;/em&gt;&lt;em&gt; or GetCPInfoEx&lt;/em&gt;&lt;em&gt; function.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;strong&gt;For the CP_UTF7 and CP_UTF8 settings for CodePage, this parameter must be set to NULL. Otherwise, the function fails with ERROR_INVALID_PARAMETER.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt; &lt;/dd&gt;&lt;dt&gt;&lt;em&gt;&lt;u&gt;lpUsedDefaultChar [out] &lt;/u&gt;&lt;/em&gt;&lt;/dt&gt;&lt;dd&gt;   &lt;p&gt;&lt;em&gt;Optional. Pointer to a flag that indicates if the function has used a default character in the conversion. The flag is set to TRUE if one or more characters in the source string cannot be represented in the specified code page. Otherwise, the flag is set to FALSE. This parameter can be set to NULL.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;strong&gt;For the CP_UTF7 and CP_UTF8 settings for CodePage, this parameter must be set to NULL. Otherwise, the function fails with ERROR_INVALID_PARAMETER.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;И прежний SDK:&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/dd&gt;&lt;dt&gt;&lt;em&gt;&lt;u&gt;lpDefaultChar&lt;/u&gt;&lt;/em&gt;     &lt;p&gt;&lt;/p&gt; &lt;/dt&gt;&lt;dd&gt;&lt;em&gt;[in] Pointer to the character to use if a wide character cannot be represented in the specified code page. The application sets this parameter to a null pointer if the function is to use a system default value. To obtain the system default character, the application can call the GetCPInfo&lt;/em&gt;&lt;em&gt; or GetCPInfoEx&lt;/em&gt;&lt;em&gt; function. &lt;/em&gt;    &lt;p&gt;&lt;em&gt;&lt;strong&gt;For the code pages listed for dwFlags, this parameter must be set to a null pointer. Otherwise, the function fails with ERROR_INVALID_PARAMETER. &lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt; &lt;/dd&gt;&lt;dt&gt;&lt;em&gt;&lt;u&gt;lpUsedDefaultChar&lt;/u&gt;&lt;/em&gt;&lt;/dt&gt;&lt;dd&gt;&lt;em&gt;[in] Pointer to a flag that indicates if the function is to use a default character in the conversion. The flag is set to TRUE if a default character is necessary, and to FALSE otherwise. This parameter can be set to a null pointer. &lt;/em&gt;    &lt;p&gt;&lt;em&gt;&lt;strong&gt;For the code pages mentioned in dwFlags, lpUsedDefaultChar must be a null pointer. Otherwise, the function fails with ERROR_INVALID_PARAMETER.&lt;/strong&gt;&lt;/em&gt; &lt;/p&gt;    &lt;p&gt;Нужно ли говорить, что информация в новом SDK не соответствует действительности. Здравствуйте, еще одни грабли! Ужас… Как можно верить такой доке? Остается только проверять.&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/dd&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1714032358777447976?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1714032358777447976/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1714032358777447976' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1714032358777447976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1714032358777447976'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2010/01/windows-platform-sdk.html' title='Ужасы… Windows Platform SDK'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-3530851191547208896</id><published>2009-10-31T07:40:00.001-07:00</published><updated>2009-10-31T07:49:56.459-07:00</updated><title type='text'>Delphi 2010. Быдлокод</title><content type='html'>&lt;p&gt;Юнит DBXJSON.pas. Я вообще в ауте...&lt;/p&gt;&lt;pre&gt;class function TJSONString.Hex(const Digit: Integer): Byte;&lt;br /&gt;var&lt;br /&gt;  HexData: TBytes;&lt;br /&gt;begin&lt;br /&gt;  SetLength(HexData,16);&lt;br /&gt;  HexData[0] := Ord('0');&lt;br /&gt;  HexData[1] := Ord('1');&lt;br /&gt;  HexData[2] := Ord('2');&lt;br /&gt;  HexData[3] := Ord('3');&lt;br /&gt;  HexData[4] := Ord('4');&lt;br /&gt;  HexData[5] := Ord('5');&lt;br /&gt;  HexData[6] := Ord('6');&lt;br /&gt;  HexData[7] := Ord('7');&lt;br /&gt;  HexData[8] := Ord('8');&lt;br /&gt;  HexData[9] := Ord('9');&lt;br /&gt;  HexData[10] := Ord('A');&lt;br /&gt;  HexData[11] := Ord('B');&lt;br /&gt;  HexData[12] := Ord('C');&lt;br /&gt;  HexData[13] := Ord('D');&lt;br /&gt;  HexData[14] := Ord('E');&lt;br /&gt;  HexData[15] := Ord('F');&lt;br /&gt;  Result := HexData[Digit];&lt;br /&gt;end;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-3530851191547208896?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/3530851191547208896/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=3530851191547208896' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3530851191547208896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3530851191547208896'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/10/delphi-2010.html' title='Delphi 2010. Быдлокод'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-3587146213885480138</id><published>2009-10-20T00:53:00.001-07:00</published><updated>2009-10-20T00:53:44.714-07:00</updated><title type='text'>Delphi 2010. System.TObject.GetInterface</title><content type='html'>&lt;p&gt;Полюбуйтесь на код обеспечивающий проверку идентификатора интерфейса на соответствие "magic GUID" (&lt;font color="#808080"&gt;{CEDF24DE-80A4-447D-8C75-EB871DC121FD}&lt;/font&gt;), для безопасного кастинга (&lt;font color="#808080"&gt;TMyObject(TMyIntf)&lt;/font&gt;) к объектому типу:&lt;/p&gt;&lt;pre&gt;if (&lt;font color="#ff0000"&gt;Int64(ObjCastGUID.D1) = Int64(IID.D1)&lt;/font&gt;) and&lt;br /&gt;   (Int64(ObjCastGUID.D4) = Int64(IID.D4)) then&lt;br /&gt;    Pointer(Obj) := Self;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;И это в системном юните... &lt;strong&gt;#78808&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-3587146213885480138?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/3587146213885480138/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=3587146213885480138' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3587146213885480138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3587146213885480138'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/10/delphi-2010-systemtobjectgetinterface.html' title='Delphi 2010. System.TObject.GetInterface'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-7116633620065510485</id><published>2009-09-09T22:56:00.001-07:00</published><updated>2009-09-09T22:56:41.448-07:00</updated><title type='text'>Delphi 2010. RTTI.</title><content type='html'>У &lt;strong&gt;advanced records&lt;/strong&gt; невозможно получить список свойств. FUCK :(((&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-7116633620065510485?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/7116633620065510485/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=7116633620065510485' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7116633620065510485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7116633620065510485'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/09/delphi-2010-rtti.html' title='Delphi 2010. RTTI.'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-3412603280680329442</id><published>2009-05-26T10:59:00.001-07:00</published><updated>2009-05-26T10:59:10.362-07:00</updated><title type='text'>Ubuntu 9.04</title><content type='html'>&lt;p&gt;Четыре&amp;nbsp;дня назад получил по почте новую версию Ubuntu. Итог: оно все лучше и лучше. Несмотря на то, что чего-то не срослось с wubi общие впечатления самые положительные. Очень порадовала, сразу бросившаяся в глаза, качественная настройка саб-пиксельного сглаживания шрифтов. Им бы еще иконки отдизайнить в какой-нибудь конторе, чтоб&amp;nbsp;в едином стиле, да в Гноме немного уменьшить контролы. В общем, мне понравилось :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-3412603280680329442?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/3412603280680329442/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=3412603280680329442' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3412603280680329442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3412603280680329442'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/05/ubuntu-904.html' title='Ubuntu 9.04'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-8027825437499801992</id><published>2009-05-17T02:21:00.001-07:00</published><updated>2009-05-17T02:21:27.702-07:00</updated><title type='text'>#72213 Fixed</title><content type='html'>&lt;p&gt;На фикс такой очевидной ошибки компилятора потребовалось два месяца... Страшно подумать сколько будут фиксить некорректную инициализацию/финализацию advanced-records, на которую налететь не так просто :( Вот и юзай новые языковые фичи...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-8027825437499801992?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/8027825437499801992/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=8027825437499801992' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8027825437499801992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8027825437499801992'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/05/72213-fixed.html' title='#72213 Fixed'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-7792188599421235069</id><published>2009-04-28T00:39:00.001-07:00</published><updated>2009-04-28T00:39:27.896-07:00</updated><title type='text'>Три класса секундомеров</title><content type='html'>&lt;p&gt;Выложен модуль &lt;a href="http://kazantsev.nm.ru/cmncls.zip" target="_blank"&gt;Common.Classes.pas&lt;/a&gt; содержащий три класса (advanced-records) секундомеров. TLowResStopwatch на основе GetTickCount, THighResStopwatch&amp;nbsp;на основе QueryPerformanceCounter, и TStopwatch использующий один из предыдущих классов секундомеров в зависимости от аппаратной части компьютера.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-7792188599421235069?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/7792188599421235069/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=7792188599421235069' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7792188599421235069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7792188599421235069'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/04/blog-post_28.html' title='Три класса секундомеров'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-270924861351020870</id><published>2009-04-21T04:08:00.001-07:00</published><updated>2009-04-21T04:08:21.864-07:00</updated><title type='text'>Исправление в Interface Extender</title><content type='html'>&lt;p&gt;&lt;a href="http://kazantsev.nm.ru/intf_extender.zip" target="_blank"&gt;Исправлена&lt;/a&gt; ошибка при работе с динамическим массивом. Проявлялась при попытке добавить несколько интерфейсов на один класс.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-270924861351020870?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/270924861351020870/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=270924861351020870' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/270924861351020870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/270924861351020870'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/04/interface-extender.html' title='Исправление в Interface Extender'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1026882753537500481</id><published>2009-04-19T13:56:00.001-07:00</published><updated>2009-04-19T14:02:48.164-07:00</updated><title type='text'>Расширенная поддержка интерфейсов для Delphi</title><content type='html'>&lt;p&gt;В &lt;a href="http://tdelphi.blogspot.com/" target="_blank"&gt;блоге&lt;/a&gt; Алексея Тимохина &lt;a href="http://tdelphi.blogspot.com/2009/04/delphi-vcl.html" target="_blank"&gt;озвучена хотелка&lt;/a&gt;&amp;nbsp;касающаяся поддержки интерфейсов базовыми классами. На мой взгляд, идея весьма спорная, во всяком случае при нынешнем положении дел в языке. Однако, реализовать нечно подобное можно уже сейчас ;) &lt;a href="http://kazantsev.nm.ru/intf_extender.zip" target="_blank"&gt;Тут&lt;/a&gt; я набросал пример, как это может быть реализовано (&lt;font color="#808080"&gt;intfExtender.pas реализует непосредственно механизм расширения, а unit1.pas содержит два примера&lt;/font&gt;). Если кому пригодится, буду только рад ;) Универсальность прикладного кода, о которой говорит Алексей, таким образом можно обеспечить.&lt;/p&gt; &lt;p&gt;p.s. Модуль сильно не тестировался, посему никаких гарантий если что ;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1026882753537500481?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1026882753537500481/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1026882753537500481' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1026882753537500481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1026882753537500481'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/04/delphi.html' title='Расширенная поддержка интерфейсов для Delphi'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-983947153803690691</id><published>2009-04-15T10:32:00.001-07:00</published><updated>2009-04-15T10:32:07.405-07:00</updated><title type='text'>Очередные ошибки инициализации/финализации в Delphi 2006 - 2009</title><content type='html'>&lt;p&gt;Отчет &lt;strong&gt;#73008&lt;/strong&gt; описывает несвоевременную финализцию энумератора являющегося интерфейсом при использовании в основном теле программы (в процедурах и функциях работает нормально), что в некоторых случаях может приводить к ошибкам доступа (Access violation).&lt;/p&gt; &lt;p&gt;Отчет &lt;strong&gt;#73009&lt;/strong&gt; описывает неадекватную инициализацию (а точнее ее отсутствие) интерфейсного поля advanced record в случае, когда последняя используется в качестве возвращаемого значения.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-983947153803690691?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/983947153803690691/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=983947153803690691' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/983947153803690691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/983947153803690691'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/04/delphi-2006-2009.html' title='Очередные ошибки инициализации/финализации в Delphi 2006 - 2009'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-3320328578774136324</id><published>2009-04-10T00:49:00.001-07:00</published><updated>2009-04-10T00:50:27.384-07:00</updated><title type='text'>Утечки и неадекватное поведение Delphi 2006 - 2009 Update 1</title><content type='html'>&lt;p&gt;При передаче advanced record имеющей интерфейсное поле, в качестве константного параметра, есть немалый шанс налететь на утечку и получить неадекватное поведение т.к. даже константный параметр имеющий размер поинтера передается по значению. Подробности и код в отчете &lt;strong&gt;#72878&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-3320328578774136324?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/3320328578774136324/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=3320328578774136324' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3320328578774136324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3320328578774136324'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/04/blog-post.html' title='Утечки и неадекватное поведение Delphi 2006 - 2009 Update 1'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-723660768664709286</id><published>2009-03-23T03:55:00.001-07:00</published><updated>2009-03-23T03:55:57.802-07:00</updated><title type='text'>Неадекватная финализация Advanced records 2006-2009</title><content type='html'>&lt;p&gt;Новый отчет за номером &lt;strong&gt;#72410&lt;/strong&gt; описывает неадекватное поведение финализатора при использовании advanced records.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-723660768664709286?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/723660768664709286/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=723660768664709286' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/723660768664709286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/723660768664709286'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/03/advanced-records-2006-2009.html' title='Неадекватная финализация Advanced records 2006-2009'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1327219399899044207</id><published>2009-03-14T01:27:00.001-07:00</published><updated>2009-03-14T01:29:21.827-07:00</updated><title type='text'>Ошибка компиляции на ровном месте</title><content type='html'>&lt;p&gt;Если у класса или записи определить вложенный энумератор, который будет иметь поля "управляемых" типов (&lt;font color="#808080"&gt;string, interface, dynamic array, variant&lt;/font&gt;), то при попытке использования в операторе for-in-do мы получим ошибку компиляции на несоответствие типов.&amp;nbsp;Воспроизводится, и на Turbo Delphi Explorer, и на Delphi 2009 Update 1.&amp;nbsp;Репорт #&lt;strong&gt;72213&lt;/strong&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1327219399899044207?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1327219399899044207/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1327219399899044207' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1327219399899044207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1327219399899044207'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/03/blog-post.html' title='Ошибка компиляции на ровном месте'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-5963406477521359996</id><published>2009-02-02T08:27:00.001-08:00</published><updated>2009-02-02T08:27:57.284-08:00</updated><title type='text'>Обновлен Common.Encodings.pas</title><content type='html'>&lt;p&gt;На &lt;a href="http://kazantsev.nm.ru/" target="_blank"&gt;домашней страничке&lt;/a&gt;&amp;nbsp;выложен обновленный &lt;a href="http://kazantsev.nm.ru/encoding_helper.zip" target="_blank"&gt;Common.Encodings.pas&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Добавлены классы кодировок UTF-32 и UTF-32BE (только Delphi 2009), добавлен метод определения кодировки по BOM. Добавлены функции-аналоги WideCharToMultiByte и MultiByteToWideChar для кодировок UTF-16, UTF-16BE, UTF-32, UTF-32BE. Функции приведены к единым сигнатурам. Определен процедурный тип с сигнатурой кодирующей и декодирующей функций. Добавлен воркараунд для корректного определения доступности кодировок UTF-7, UTF-8 под Windows NT 4.0&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-5963406477521359996?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/5963406477521359996/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=5963406477521359996' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5963406477521359996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5963406477521359996'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/02/commonencodingspas.html' title='Обновлен Common.Encodings.pas'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-8892222363444254596</id><published>2009-01-31T07:27:00.001-08:00</published><updated>2009-01-31T07:27:16.051-08:00</updated><title type='text'>Утечки на интерфейсных параметрах</title><content type='html'>&lt;p&gt;Теряются объекты передаваемые в качестве параметров интерфейсных типов в случае, когда не происходит кастинга с проверкой (&lt;strong&gt;as&lt;/strong&gt;) к определенному интерфейсу. Для кода:&lt;/p&gt;&lt;pre&gt; Test(TMyObject.Create('1')); // will not be destroyed&lt;br /&gt; Test(IInterface(TMyObject.Create('2'))); // will not be destroyed&lt;br /&gt; Test(TMyObject.Create('3') As IInterface);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;утечки будут в первых двух вызовах. Воспроизводится, и на Turbo Delphi, и на Delphi 2009. Отчет #71015.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-8892222363444254596?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/8892222363444254596/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=8892222363444254596' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8892222363444254596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8892222363444254596'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/01/blog-post.html' title='Утечки на интерфейсных параметрах'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-6816206567934048449</id><published>2009-01-16T11:27:00.001-08:00</published><updated>2009-01-16T11:27:32.500-08:00</updated><title type='text'>QC, в чем магия?</title><content type='html'>&lt;p&gt;Только вчера "ругался" на неторопливость правки багов в компиляторе, а сегодня глянул на свой &amp;nbsp;отчет №70529 и удивился -- он получил статус &lt;strong&gt;Internally Opened &lt;/strong&gt;(как я понимаю, над ошибкой уже работают). Так вот, в чем магия? Неужели голос Алексея был решающим? ;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-6816206567934048449?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/6816206567934048449/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=6816206567934048449' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6816206567934048449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6816206567934048449'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/01/qc.html' title='QC, в чем магия?'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-4136474284034515733</id><published>2009-01-15T00:26:00.001-08:00</published><updated>2009-01-15T00:26:37.678-08:00</updated><title type='text'>Ошибка в Delphi 2009 Update 1</title><content type='html'>&lt;p&gt;Передача односимвольной строки в диспетчеризируемый метод приводит к передаче кода символа, а не строки. Лечится приведением строки к строке :) т.е. вот так: String('1'). Репорт номер &lt;strong&gt;70529&lt;/strong&gt;, поддержите, кому не лень.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-4136474284034515733?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/4136474284034515733/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=4136474284034515733' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4136474284034515733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4136474284034515733'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2009/01/delphi-2009-update-1.html' title='Ошибка в Delphi 2009 Update 1'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-4550346974040703399</id><published>2008-11-07T11:45:00.001-08:00</published><updated>2008-11-07T11:45:29.951-08:00</updated><title type='text'>Обновился Common.Encodings</title><content type='html'>&lt;p&gt;&lt;a href="http://kazantsev.nm.ru/encoding_helper.zip" target="_blank"&gt;Выложена обновленная версия Common.Encodings.pas&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-4550346974040703399?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/4550346974040703399/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=4550346974040703399' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4550346974040703399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4550346974040703399'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/11/commonencodings.html' title='Обновился Common.Encodings'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-7623618698607728080</id><published>2008-10-31T00:24:00.001-07:00</published><updated>2008-10-31T00:24:55.361-07:00</updated><title type='text'>Приемчик</title><content type='html'>&lt;p&gt;Потребовалось символ юникод строки проверить на предмет вхождения в суррогатную пару (&lt;font color="#808080"&gt;а конкретно, является ли символ младшим суррогатом&lt;/font&gt;). Все бы ничего, но индекс символа вычисляемый и вычислять его для каждого сравнения (&lt;font color="#808080"&gt;коих собственно два&lt;/font&gt;) не кошерно. Есть варианты решения:&lt;/p&gt; &lt;p&gt;1. Сохранить индекс в переменной. Просто, но нужна переменная.&lt;/p&gt; &lt;p&gt;2. Сделать функцию и заинлайнить ее. Нужна функция.&lt;/p&gt; &lt;p&gt;3. Извернуться.&lt;/p&gt; &lt;p&gt;Собственно, я о третьем варианте:&lt;/p&gt;&lt;pre&gt;     With WordRec(AContent[ACharIndex + CharCount]) Do&lt;br /&gt;      If (Word(Bytes) &amp;gt;= $DC00) And (Word(Bytes) &amp;lt;= $DFFF) Then;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-7623618698607728080?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/7623618698607728080/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=7623618698607728080' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7623618698607728080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7623618698607728080'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/10/blog-post.html' title='Приемчик'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-4393558851059499554</id><published>2008-10-26T05:46:00.001-07:00</published><updated>2008-10-26T05:46:52.227-07:00</updated><title type='text'>Оперативность QC</title><content type='html'>&lt;p&gt;Все шесть моих репортов прошли во внутреннюю базу в среднем через 2 недели после подачи. Шустро. Правда с одним лажа вышла, отрепортил о баге пофикшеном в релизе :(&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-4393558851059499554?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/4393558851059499554/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=4393558851059499554' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4393558851059499554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4393558851059499554'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/10/qc_26.html' title='Оперативность QC'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-6237823567426853688</id><published>2008-10-10T00:30:00.001-07:00</published><updated>2008-10-10T00:43:34.695-07:00</updated><title type='text'>Полный QCец...</title><content type='html'>&lt;p&gt;Только я отрепортил о нескольких ошибках, как меня снова перестало пускать к сервису... Плавающие баги, они самые милые, ага :)&lt;/p&gt; &lt;p&gt;p.s.&lt;/p&gt; &lt;p&gt;Ой блин... Снял галку DN Authentification и все снова заработало. Сплошные воркараунды :))&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-6237823567426853688?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/6237823567426853688/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=6237823567426853688' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6237823567426853688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6237823567426853688'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/10/qc_10.html' title='Полный QCец...'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-3660365995771488234</id><published>2008-10-08T12:59:00.001-07:00</published><updated>2008-10-08T12:59:09.879-07:00</updated><title type='text'>Я победил QC :)</title><content type='html'>QC, не пускавший меня дальше окна логина сегодня вдруг заработал! Ура. Прогресс налицо :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-3660365995771488234?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/3660365995771488234/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=3660365995771488234' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3660365995771488234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3660365995771488234'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/10/qc.html' title='Я победил QC :)'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-8416763085400498094</id><published>2008-10-05T22:15:00.001-07:00</published><updated>2008-10-05T22:15:18.905-07:00</updated><title type='text'>Val в Delphi 2009</title><content type='html'>&lt;p&gt;Знаете как работает Val с юникодом? Рассматриваются лишь младшие байты символов :( Для проверки прогоните цикл от lo(Char) до high(Char) и посмотрите, сколько символов будет "успешно" преобразовано в число. Грустно. Если кто-то это читает, заQCите плиз...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-8416763085400498094?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/8416763085400498094/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=8416763085400498094' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8416763085400498094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8416763085400498094'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/10/val-delphi-2009.html' title='Val в Delphi 2009'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1944353242636244883</id><published>2008-10-03T07:31:00.001-07:00</published><updated>2008-10-03T07:31:57.513-07:00</updated><title type='text'>Обновился Common.Encodings</title><content type='html'>&lt;p&gt;В метод GetEncoding добавлен параметр со значением по умолчанию позволяющий указывать на возможность использования стандартных (определенных в классе TEncoding) кодировок. Скажем, код &lt;strong&gt;GetEncoding('utf-16')&lt;/strong&gt; создаст новый объект класса &lt;strong&gt;TUnicodeEncoding&lt;/strong&gt;, а код &lt;strong&gt;GetEncoding('utf-16', True)&lt;/strong&gt; вернет существующий объект &lt;strong&gt;TEncoding.Unicode;&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1944353242636244883?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1944353242636244883/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1944353242636244883' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1944353242636244883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1944353242636244883'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/10/commonencodings.html' title='Обновился Common.Encodings'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-3724772096419228834</id><published>2008-09-29T07:12:00.001-07:00</published><updated>2008-09-29T07:13:17.495-07:00</updated><title type='text'>Косяк в TEncoding.FreeEncodings;</title><content type='html'>&lt;p&gt;Не освобождается объект кодировки UTF7. И когда я только QC буду побеждать... :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-3724772096419228834?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/3724772096419228834/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=3724772096419228834' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3724772096419228834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3724772096419228834'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/09/tencodingfreeencodings.html' title='Косяк в TEncoding.FreeEncodings;'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-46562507768111007</id><published>2008-09-28T07:44:00.001-07:00</published><updated>2008-09-28T07:44:56.088-07:00</updated><title type='text'>Обновился Common.Encodings.pas</title><content type='html'>&lt;p&gt;На &lt;a href="http://kazantsev.nm.ru/" target="_blank"&gt;домашней страничке&lt;/a&gt;&amp;nbsp;выложен обновленный модуль &lt;a href="http://kazantsev.nm.ru/encoding_helper.zip" target="_blank"&gt;Common.Encodings.pas&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-46562507768111007?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/46562507768111007/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=46562507768111007' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/46562507768111007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/46562507768111007'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/09/commonencodingspas.html' title='Обновился Common.Encodings.pas'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-9163176841414868090</id><published>2008-09-23T22:39:00.001-07:00</published><updated>2008-09-28T07:52:15.341-07:00</updated><title type='text'>Delphi 2009 aka Tiburon. TEncoding.</title><content type='html'>&lt;p&gt;На &lt;a href="http://kazantsev.nm.ru/" target="_blank"&gt;домашней страничке&lt;/a&gt;&amp;nbsp;выложен модуль &lt;a href="http://kazantsev.nm.ru/encoding_helper.zip" target="_blank"&gt;Common.Encodings&lt;/a&gt; расширяющий возможности стандартного класса TEncoding. Модуль содержит&amp;nbsp;&lt;em&gt;class helper&lt;/em&gt;&amp;nbsp;для TEncoding и несколько вспомогательных &lt;em&gt;advanced records.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Примеры использования:&amp;nbsp;&lt;/p&gt; &lt;p&gt;1.) Перечисление доступных кодировок&lt;/p&gt;&lt;pre&gt;Var&lt;br /&gt;&lt;br /&gt; ei : TEncodingInfo;&lt;br /&gt;&lt;br /&gt;Begin&lt;br /&gt;&lt;br /&gt; For ei In TEncoding.Encodings Do&lt;br /&gt;  If ei.IsAvailable Then&lt;br /&gt;   WriteLn('codepage: ', ei.CodePage, ' name: ', ei.Name);&lt;br /&gt;&lt;br /&gt;End;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;2.) Создание кодировки по имени:&lt;/p&gt;&lt;pre&gt; TEncoding.Encodings.ByName('utf-16').GetEncoding;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;или&lt;/p&gt;&lt;pre&gt; TEncoding.GetEncoding('utf-16');&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;3.) Создание кодировки по номеру кодовой страницы:&lt;/p&gt;&lt;pre&gt; TEncoding.Encodings.ByCodePage(CP_UTF16_BE).GetEncoding;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;или&lt;/p&gt;&lt;pre&gt; TEncoding.GetEncoding(CP_UTF16_BE);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;4.) Получение информации о существющей кодировке:&lt;/p&gt;&lt;pre&gt; With TEncoding.UTF8.GetInfo Do&lt;br /&gt;  WriteLn('codepage: ', CodePage, ' name: ', Name, ' display name: ', DisplayName);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-9163176841414868090?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/9163176841414868090/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=9163176841414868090' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/9163176841414868090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/9163176841414868090'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/09/delphi-2009-aka-tiburon-tencoding.html' title='Delphi 2009 aka Tiburon. TEncoding.'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-7994689441422042760</id><published>2008-09-19T09:37:00.001-07:00</published><updated>2008-09-19T10:26:58.534-07:00</updated><title type='text'>Delphi 2009. Вкратце.</title><content type='html'>&lt;p&gt;Юникод+дженерики+анонимные методы это все понятно.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Порадовала скорость среды! И особенно скорость CodeInsight (&lt;font color="#808080"&gt;несмотря на то, что я его все равно всегда отключаю&lt;/font&gt;)&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Наконец-то они научились различать Implicit и Explicit для записей в нативе (&lt;font color="#808080"&gt;2007 не пробовал, может и там уже было&lt;/font&gt;). Но вот редактор сильно подкачал, разучившись (&lt;font color="#808080"&gt;в 2006 он и не сильно-то умел&lt;/font&gt;) перемещаться по Ctrl+Shift+Up/Down между декларацией и реализацией перегруженных операторов записи (&lt;font color="#808080"&gt;правда, я тестировал на 12.0.3155.16733, может в релизе и поправили&lt;/font&gt;), а также разучился (&lt;font color="#808080"&gt;для перегруженных операторов опять же&lt;/font&gt;) по Ctrl+Shift+C создавать макет метода по описанию.&lt;/p&gt; &lt;p&gt;Появился UInt64 -- беззнаковое 64битное число.&lt;/p&gt; &lt;p&gt;BeginThread и TInterfaceList по-прежнему имеют потенциальные утечки.&lt;/p&gt; &lt;p&gt;Неработает передача Int64 в параметре диспетчеризуемого метода (&lt;font color="#808080"&gt;вызов метода от вариантной переменной&lt;/font&gt;). Точнее, если передавать &lt;em&gt;переменную&lt;/em&gt; типа Int64 все работает, а если &lt;em&gt;значение&lt;/em&gt; Int64(1024) -- нет.&lt;/p&gt; &lt;p&gt;Exception обзавелся потенциальной поддержкой стек-трейсинга, но только потенциальной :)&lt;/p&gt; &lt;p&gt;Очень порадовал {$POINTERMATH}&lt;/p&gt; &lt;p&gt;В комментариях исходников встречается sysmac.h. Интересно, это то о чем я думаю...?&lt;/p&gt; &lt;p&gt;Порадовал хелпер для TRTLCriticalSection (syncobjs.pas)&lt;/p&gt; &lt;p&gt;Порадовал обновленный ZLib&lt;/p&gt; &lt;p&gt;Огорчает нелепость использования системных InterlockedCompareExchangePointer (и прочих Interlocked...) при наличии нативных в system.pas&lt;/p&gt; &lt;p&gt;Ribbon огорчил неаккуратными скинами (&lt;font color="#808080"&gt;ждем редактора :) или сторонних, качественных скинов&lt;/font&gt;) и моргающей отрисовкой. DoubleBuffered Ribbon-контрола&amp;nbsp; не помогает, а буферизовать форму то еще извращение.&lt;/p&gt; &lt;p&gt;TLinkLabel неюзабельна совершенно, т.к. на системах младше XP, линки распознаваться не будут&amp;nbsp;и&amp;nbsp;пользователь будет видеть разметку.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-7994689441422042760?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/7994689441422042760/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=7994689441422042760' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7994689441422042760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7994689441422042760'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/09/delphi-2009.html' title='Delphi 2009. Вкратце.'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1863175854241257314</id><published>2008-08-14T23:48:00.001-07:00</published><updated>2008-08-14T23:48:20.541-07:00</updated><title type='text'>PNG в Delphi 2009</title><content type='html'>&lt;p&gt;Проект TPNGImage &lt;a href="http://blogs.codegear.com/nickhodges/2008/08/13/39100" target="_blank"&gt;стал частью VCL&lt;/a&gt; в ожидаемой Delphi 2009. Ура, товарищи!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1863175854241257314?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1863175854241257314/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1863175854241257314' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1863175854241257314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1863175854241257314'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/08/png-delphi-2009.html' title='PNG в Delphi 2009'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-4332652762698937408</id><published>2008-05-18T03:49:00.001-07:00</published><updated>2008-05-18T03:49:45.459-07:00</updated><title type='text'>Регионы в Win32</title><content type='html'>&lt;p&gt;Вчера на &lt;a href="http://kazantsev.nm.ru/" target="_blank"&gt;домашнюю страничку&lt;/a&gt; выложил модуль &lt;a href="http://kazantsev.nm.ru/region.zip" target="_blank"&gt;WinRegion&lt;/a&gt; для работы с регионами Win32.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-4332652762698937408?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/4332652762698937408/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=4332652762698937408' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4332652762698937408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4332652762698937408'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/05/win32.html' title='Регионы в Win32'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-5281569259669232150</id><published>2008-05-11T14:31:00.001-07:00</published><updated>2008-05-11T14:31:17.048-07:00</updated><title type='text'>Embarcadero + CodeGear</title><content type='html'>&lt;p&gt;О покупке CodeGear компанией Embarcadero, стало известно почти неделю тому назад. А &lt;a href="http://www.delphiplus.org/articles/press_release/2008/codegear_embarcadero.html" target="_blank"&gt;вот обращение&lt;/a&gt; к клиентам CodeGear, в котором, в частности, говорится о том, что дальнейшая разработка будет нацелена на гетерогенные платформы и различные СУБД. Ребята, идем на Linux и MacOS? :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-5281569259669232150?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/5281569259669232150/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=5281569259669232150' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5281569259669232150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5281569259669232150'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/05/embarcadero-codegear.html' title='Embarcadero + CodeGear'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-8774186121215414189</id><published>2008-04-24T07:43:00.001-07:00</published><updated>2008-04-24T07:43:07.045-07:00</updated><title type='text'>XML-RPC: Общие ошибки</title><content type='html'>&lt;p&gt;Одна из самых часто встречающихся ошибок в реализациях XML-RPC&amp;nbsp;-- экранирование лишних символов в строках. Лишних в том смысле, что &lt;a href="http://www.xmlrpc.com/spec" target="_blank"&gt;спецификация XML-RPC&lt;/a&gt;&amp;nbsp;их экранирования не требует. Для корректного парсинга пакета требуется экранировать символы: &lt;strong&gt;&amp;lt;&lt;/strong&gt; (&lt;font color="#808080"&gt;&amp;amp;lt;&lt;/font&gt;) и &lt;strong&gt;&amp;amp;&lt;/strong&gt; (&lt;font color="#808080"&gt;&amp;amp;amp;&lt;/font&gt;). Любые другие символы экранироваться не должны, но очень часто ошибочно экранируют еще и другие символы: &lt;strong&gt;'&lt;/strong&gt; (&lt;font color="#808080"&gt;&amp;amp;apos;&lt;/font&gt;), &lt;strong&gt;"&lt;/strong&gt; (&lt;font color="#808080"&gt;&amp;amp;quot;&lt;/font&gt;), &lt;strong&gt;&amp;gt;&lt;/strong&gt; (&lt;font color="#808080"&gt;&amp;amp;gt;&lt;/font&gt;).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-8774186121215414189?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/8774186121215414189/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=8774186121215414189' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8774186121215414189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8774186121215414189'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/04/xml-rpc_24.html' title='XML-RPC: Общие ошибки'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-4224825893746430185</id><published>2008-04-23T03:51:00.001-07:00</published><updated>2008-04-23T03:51:47.724-07:00</updated><title type='text'>Extended RTTI {$METHODINFO ON}</title><content type='html'>&lt;p&gt;Пару дней назад, налетел на очень интересную грабл&lt;em&gt;ю.&lt;/em&gt; В своем XML-RPC сервере я использую возможность Delphi создавать расширенную&amp;nbsp;RTTI,&amp;nbsp;для регистрации объектов на сервере. Описывается класс с некоторым API, публичная часть (&lt;font color="#808080"&gt;та, что будет доступна XML-RPC клиентам&lt;/font&gt;) выносится в секцию &lt;strong&gt;Published&lt;/strong&gt; (&lt;font color="#808080"&gt;для которой и создается Extended RTTI&lt;/font&gt;). Затем создается объект&amp;nbsp;данного класса &amp;nbsp;и регистрируется на сервере. В процессе регистрации сервер получает прототипы методов разбирая RTTI. Все работает прекрасно, кроме того, что помимо методов вынесенных в &lt;strong&gt;Published&lt;/strong&gt;, компилятор создает RTTI еще и для некоторых (&lt;font color="#808080"&gt;даже перегруженных!&lt;/font&gt;) методов из секции &lt;strong&gt;Public&lt;/strong&gt;. Грабл&lt;em&gt;я&lt;/em&gt;, вылезла на довольно сложном классе имеющем &lt;strong&gt;nested types&lt;/strong&gt;. На простых классах такого не обнаруживается.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-4224825893746430185?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/4224825893746430185/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=4224825893746430185' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4224825893746430185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4224825893746430185'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/04/extended-rtti-methodinfo-on.html' title='Extended RTTI {$METHODINFO ON}'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-5697527543304228145</id><published>2008-04-18T08:55:00.001-07:00</published><updated>2008-04-18T08:55:42.758-07:00</updated><title type='text'>Утечка в TInterfaceList</title><content type='html'>&lt;p&gt;У данного списка (&lt;font color="#808080"&gt;как впрочем и у TList, и его потомков&lt;/font&gt;) есть свойство &lt;strong&gt;Count&lt;/strong&gt; позволяющее, как определять количество элементов списка, так и устанавливать его. Очень удобно использовать возможность назначения количества элементов, для многократной очистки списка (&lt;font color="#808080"&gt;т.к. делается это без перераспределения памяти к которому приводит стандартный &lt;strong&gt;Clear&lt;/strong&gt;&lt;/font&gt;). Однако, в классе &lt;strong&gt;TInterfaceList&lt;/strong&gt;&amp;nbsp;данная операция&amp;nbsp;приводит к потере ссылок на хранящиеся интерфейсы,&amp;nbsp;следовательно&amp;nbsp;они никогда не будут освобождены.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-5697527543304228145?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/5697527543304228145/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=5697527543304228145' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5697527543304228145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5697527543304228145'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/04/tinterfacelist.html' title='Утечка в TInterfaceList'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-3266754724201155573</id><published>2008-04-13T11:43:00.001-07:00</published><updated>2008-04-13T11:43:28.377-07:00</updated><title type='text'>XML-RPC. Снова :)</title><content type='html'>&lt;p&gt;Сегодня получил &lt;strong&gt;5046&lt;/strong&gt; вызовов в секунду (&lt;font color="#808080"&gt;и это на отладочной версии, со всеми проверками и ассертами&lt;/font&gt;)!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-3266754724201155573?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/3266754724201155573/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=3266754724201155573' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3266754724201155573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3266754724201155573'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/04/xml-rpc.html' title='XML-RPC. Снова :)'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-2012147843051211277</id><published>2008-04-08T03:24:00.001-07:00</published><updated>2008-04-08T03:24:50.183-07:00</updated><title type='text'>Delphi хотелка</title><content type='html'>&lt;p&gt;Уже который раз ловлю себя на мысли, что очень хочется иметь параметризованные циклы &lt;strong&gt;for-in-do&lt;/strong&gt;. Тогда можно было бы писать примерно так: For Item[Param] In Items Do... Что приводило бы к выборке значений соответствующих параметрам (&lt;font color="#808080"&gt;разумеется, при поддержке перечислителя&lt;/font&gt;).&lt;/p&gt; &lt;p&gt;И вторая хотелка касающаяся &lt;strong&gt;for-in-do&lt;/strong&gt; это наличие двух методов вызываемых перед началом перечисления и после. Что помогло бы при реализации перечислителей в виде &lt;strong&gt;advanced records&lt;/strong&gt;, когда им (&lt;font color="#808080"&gt;перечислителям&lt;/font&gt;) требуется выполнять некоторые операции (&lt;font color="#808080"&gt;например блокировка/разблокировка&lt;/font&gt;) над контейнером. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-2012147843051211277?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/2012147843051211277/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=2012147843051211277' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2012147843051211277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2012147843051211277'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/04/delphi.html' title='Delphi хотелка'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-4442114393392165315</id><published>2008-03-30T06:33:00.001-07:00</published><updated>2008-03-30T06:33:53.166-07:00</updated><title type='text'>А знаете ли вы, что...</title><content type='html'>&lt;p&gt;Операция сравнения AString = '' выполняется в два раза быстрее чем Length(AString) = 0 для AnsiString, и медленнее (&lt;font color="#808080"&gt;примерно в 1.3&lt;/font&gt;) для WideString при условии, что строка не пустая.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-4442114393392165315?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/4442114393392165315/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=4442114393392165315' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4442114393392165315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4442114393392165315'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/03/blog-post_4384.html' title='А знаете ли вы, что...'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-9036663601389748901</id><published>2008-03-30T01:37:00.001-07:00</published><updated>2008-03-30T01:37:55.882-07:00</updated><title type='text'>Плагиат</title><content type='html'>&lt;p&gt;Какой то пельмень, по имени Max, тырит посты из моего блога (&lt;font color="#808080"&gt;и видимо не только из моего&lt;/font&gt;) и публикует на своем (&lt;font color="#808080"&gt;ссылку не дам, ибо нефиг&lt;/font&gt;)&amp;nbsp; от своего имени... Этот пост для него.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-9036663601389748901?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/9036663601389748901/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=9036663601389748901' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/9036663601389748901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/9036663601389748901'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/03/blog-post_30.html' title='Плагиат'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-4193655634549785170</id><published>2008-03-19T17:42:00.001-07:00</published><updated>2008-03-19T17:42:17.388-07:00</updated><title type='text'>Новые высоты :)</title><content type='html'>&lt;p&gt;Сегодня, после небольшой переделки работы с&amp;nbsp;SAX'ом, получил скорость в &lt;strong&gt;4096&lt;/strong&gt; (&lt;font color="#808080"&gt;число-то какое :)&lt;/font&gt;) вызовов XML-RPC в секунду (&lt;font color="#808080"&gt;метод без параметров, возвращающий &lt;strong&gt;nil&lt;/strong&gt;&lt;/font&gt;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-4193655634549785170?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/4193655634549785170/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=4193655634549785170' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4193655634549785170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4193655634549785170'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/03/blog-post.html' title='Новые высоты :)'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-2218997578914691165</id><published>2008-01-27T00:22:00.001-08:00</published><updated>2008-01-27T00:22:01.579-08:00</updated><title type='text'>HTML Display Components</title><content type='html'>&lt;p&gt;Кажется, сабжевая библиотека тихо умирает :( Автор отказывается делать какие-либо изменения/дополнения в будущем.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-2218997578914691165?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/2218997578914691165/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=2218997578914691165' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2218997578914691165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2218997578914691165'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/01/html-display-components.html' title='HTML Display Components'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1639710153839327224</id><published>2008-01-18T13:22:00.001-08:00</published><updated>2008-01-18T13:22:52.477-08:00</updated><title type='text'>Правки TAlXmlDocument</title><content type='html'>&lt;p&gt;На &lt;a href="http://kazantsev.nm.ru/" target="_blank"&gt;домашней страничке&lt;/a&gt; выложен модуль парсера с моими правками.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1639710153839327224?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1639710153839327224/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1639710153839327224' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1639710153839327224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1639710153839327224'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/01/talxmldocument_18.html' title='Правки TAlXmlDocument'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-9109852341273976118</id><published>2008-01-10T15:12:00.001-08:00</published><updated>2008-01-10T15:17:58.936-08:00</updated><title type='text'>Ужос, нах...</title><content type='html'>&lt;p&gt;Вчера, на одном форуме, увидел вопрос дельфиста:&lt;/p&gt; &lt;p&gt;&lt;em&gt;"Раньше использовал инди смтп а как его запихать в поток не знаю. Формы же нет, куда его перетащить можно."&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Это было бы смешно, если б не было так грустно&amp;nbsp;:(&amp;nbsp;Остается надеяться, что вот такие кадры, в скором времени, свалят под .Net (&lt;font color="#808080"&gt;а именно такие, в основном, и валят, т.к. Delphi их донимает "акцесс виолатион'ами"&lt;/font&gt;) и перестанут порочить доброе имя Дельфистов. В результате, свалившие будут писать тормозных и&amp;nbsp;охотчих до памяти&amp;nbsp;монстров (&lt;font color="#808080"&gt;но главное (!), без "акцесс виолатион'ов" :D&lt;/font&gt;) на, и без того, тормозящей платформе, а лагерь .Net&amp;nbsp;получит перебежавших чайников, в добавок к родным образованиям :) и постепенно будет ими опорочен :). Аминь.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-9109852341273976118?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/9109852341273976118/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=9109852341273976118' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/9109852341273976118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/9109852341273976118'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/01/blog-post.html' title='Ужос, нах...'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-2043490039032469478</id><published>2008-01-04T03:16:00.001-08:00</published><updated>2008-01-04T03:16:22.166-08:00</updated><title type='text'>Очередная бага TAlXmlDocument</title><content type='html'>&lt;p&gt;Ошибка, иногда, появляется при парсинге документов имеющих комментарии.&amp;nbsp;Воспроизвести ошибку&amp;nbsp;довольно просто -- в цикле создавать и парсить документ, с комментарием переменной длинны,&amp;nbsp;от одного символа до размера буфера. Дело в том, что в&amp;nbsp;процедуре &lt;strong&gt;PosInXmlString&lt;/strong&gt;&amp;nbsp;не учитываются некоторые особенности при расчете смещения. Однако, решить проблему очень просто:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;В процедуре &lt;strong&gt;PosInXmlString&lt;/strong&gt; изменить строку Offset := RawXmlStringLength - RawXmlStringPos&lt;strong&gt;{ + 2}&lt;/strong&gt;;&lt;/li&gt; &lt;li&gt;В&amp;nbsp;процедуре &lt;strong&gt;AnalyzeComment&lt;/strong&gt; добавить условие на размер комментария, длина которого не может быть меньше нуля &lt;strong&gt;And (P1 - RawXmlStringPos - 4 &amp;gt;= 0)&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-2043490039032469478?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/2043490039032469478/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=2043490039032469478' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2043490039032469478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2043490039032469478'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2008/01/talxmldocument.html' title='Очередная бага TAlXmlDocument'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-6443673106021322266</id><published>2007-12-27T09:47:00.001-08:00</published><updated>2007-12-27T09:47:13.693-08:00</updated><title type='text'>Проблема скорости TALXmlDocument</title><content type='html'>&lt;p&gt;В общем, прилетело откуда не ждали :( Пару дней назад решил попробовать отдачу статистики работы&amp;nbsp;сервера XML-RPC в комментарие пакета (&lt;font color="#808080"&gt;т.е. вместо, собственно, комментария отдается XML документ c различными данными&lt;/font&gt;). Все бы ничего, да только производительность сервера просела очень значительно... На два порядка, т.е. в 100 с лишним раз. Первым подозреваемым стал именно парсер т.к. непонятки с размером буфера у него уже были. Написал автору -- тишина. Решил сам покопаться в дебрях чужих исходников :). Профайлера нема -- ищем проблему читая код :) Нужно отдать автору парсера должное, он многое сделал для того, чтоб его создание, по скоростным характеристикам, укладывало на лопатки конкурентов :) Там и ассемблерный код, и адаптирующийся под процессор набор процедур/функций для работы со строками. В общем видно, что человек старался. Однако нашел я там и такой код, что просто волосы дыбом и нужного смайла не могу найти. Код приводить не стану т.к. вне контекста (читай метода использования) он абсолютно нормален, скажу лишь, что функция называется &lt;strong&gt;CharPosInString&lt;/strong&gt;. После того, как&amp;nbsp;я ее переписал тормоза сократились в четыре раза (&lt;font color="#808080"&gt;т.е. стало тормозить не в 100 раз, а в 25 :)&lt;/font&gt;). Ищу проблему дальше. Меняю размер комментария и вижу, что чем больше комментарий, тем сильнее тормоза. Потом убираю комментарий и добавляю в пакет параметр типа &lt;strong&gt;Base64&lt;/strong&gt; размером в 64Kb -- снова тормоза. Начинаю грешить на внутренний буфер парсера. После некоторых манипуляций выясняется, что какой бы ни была константа &lt;strong&gt;BufferSize&lt;/strong&gt;, парсер выделяет буфер под самый большой контент встретившийся ему при разборе и потом спокойно работает с этим буфером. Нашел функцию &lt;strong&gt;ExpandRawXmlString&lt;/strong&gt; отвечающую&amp;nbsp;за увеличение буфера при необходимости. В одно из условий добавил несколько строчек и проблема разрешилась (т.е. буффер увеличвается&amp;nbsp;только на время, когда он нужен, а затем возвращается к прежним размерам). В общем и целом, тормоза пропали совсем, но сердцем чую -- нужен профайлер, чтоб найти корень зла тормозящий на любом буфере больше 64 байт :).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-6443673106021322266?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/6443673106021322266/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=6443673106021322266' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6443673106021322266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6443673106021322266'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/12/talxmldocument.html' title='Проблема скорости TALXmlDocument'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-6440228758566955547</id><published>2007-12-21T04:19:00.001-08:00</published><updated>2007-12-21T04:19:54.483-08:00</updated><title type='text'>Synapse Release 38</title><content type='html'>&lt;p&gt;Сегодня вышел &lt;a href="http://www.ararat.cz/synapse" target="_blank"&gt;Synapse&lt;/a&gt; Release 38. Всем обновляться :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-6440228758566955547?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/6440228758566955547/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=6440228758566955547' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6440228758566955547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6440228758566955547'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/12/synapse-release-38.html' title='Synapse Release 38'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-4609378727515315693</id><published>2007-12-01T05:20:00.001-08:00</published><updated>2007-12-01T05:20:46.864-08:00</updated><title type='text'>Странный ping. Yandex XML-RPC</title><content type='html'>&lt;p&gt;Сегодня, от нечего делать, xml-rpc debugger'ом решил дернуть (&lt;font color="#808080"&gt;а вдруг работает&lt;/font&gt;) метод &lt;strong&gt;system.getCapabilities&lt;/strong&gt; у сервера Яндекса, который обрабатывает пинги блогов. В ответ меня поблагодарили за пинг и сообщили, что все прошло без ошибок :) Прикольно они там реализовали xml-rpc...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-4609378727515315693?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/4609378727515315693/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=4609378727515315693' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4609378727515315693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4609378727515315693'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/12/ping-yandex-xml-rpc.html' title='Странный ping. Yandex XML-RPC'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-5920440826507012156</id><published>2007-11-19T01:42:00.001-08:00</published><updated>2007-11-19T01:42:56.030-08:00</updated><title type='text'>Что-то, как-то...</title><content type='html'>&lt;p&gt;Ну, совсем меня Ubuntu убила...&amp;nbsp; Вчерась решил заархивировать папку Install весом в 9Gb находящуюся на&amp;nbsp;виндовом ntfs разделе. Не скажу, что в этом была&amp;nbsp;большая необходимость, т.к. архив я предварительно сделал под Windows, просто хотелось посмотреть, как оно в Ubuntu :) Открываю контестное меню на папке Install, выбираю пункт Add to archive (&lt;font color="#808080"&gt;или что-то вроде этого, точно не помню&lt;/font&gt;), выбираю тип архива tar.gzip. Отлично! Пошел процесс архивирования. Минут через пять, я решаю прервать это дело. Но не тут-то было... Окошечко, конечно закрылось, но вот индикатор диска продолжал указывать на сильную активность. Подождав еще минут пять, я запустил системный монитор и был несколько удивлен увиденным... В списке процессов преспокойненько болтался процесс &lt;strong&gt;tar &lt;/strong&gt;и явно продолжал архивацию. Я в шоке.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-5920440826507012156?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/5920440826507012156/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=5920440826507012156' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5920440826507012156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5920440826507012156'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/11/blog-post_19.html' title='Что-то, как-то...'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-8737649344122646737</id><published>2007-11-17T05:45:00.001-08:00</published><updated>2007-11-17T05:45:59.778-08:00</updated><title type='text'>Вторые впечатления...</title><content type='html'>&lt;p&gt;Ох, неоднозначные... Все, вроде,&amp;nbsp;в Ubuntu приятно, но вот словил таки две аномалии. Аномалия первая. Запустил поиск файлов по маске *.png. Файлов нашлось аж 16 тысяч с копейками. Затем, эти найденные файлы, перетаскиваю (&lt;font color="#808080"&gt;drag&amp;amp;drop&lt;/font&gt;) в соседнее окошечно с открытой папкой. Все, ОС померла, в смысле впала в состояние анабиоза, в котором только дисковая система продолжала свою активность. Сразу зачах плейер (&lt;font color="#808080"&gt;не помню название, но это тот, из поставки, что с подкастами&lt;/font&gt;), перестал двигаться курсор мышки. В общем через некоторое, весьма продолжительное, время диалог поиска файлов самопроизвольно закрылся безо всяких сообщений (&lt;font color="#808080"&gt;так ничего и не скопировалось&lt;/font&gt;). Аномалия вторая. Слушая музычку через упомянутый уже плейер, я решил еще помсотреть видео из папки Examples.&amp;nbsp;Запускаю на просмотр видео&amp;nbsp;с Нельсоном Манделлой, и... Это все. Запускается другой плейер и ОС зависает намертво (&lt;font color="#808080"&gt;плейер с подкастами перестает играть&lt;/font&gt;). Судя по тому, как зашуршал кулер на проце, чем то ОС его грузила, но прождав минут 10 и не получив ни какого результата я просто выключил буку. Вот такие дела.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-8737649344122646737?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/8737649344122646737/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=8737649344122646737' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8737649344122646737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8737649344122646737'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/11/blog-post_17.html' title='Вторые впечатления...'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-6193592824550164850</id><published>2007-11-14T04:20:00.001-08:00</published><updated>2007-11-14T04:20:13.422-08:00</updated><title type='text'>Первые впечатления</title><content type='html'>&lt;p&gt;Попробовав Ubuntu с LiveCD, я остался очень приятно удивлен качеством дистрибьютива. Имея прежний опыт общения лишь с ASP-Linux (кажется 9.0), могу сказать, что Ubuntu это уже не просто шаг на десктопы пользователей, это полноценный (&lt;font color="#808080"&gt;ну пусть, с некоторыми оговорками&lt;/font&gt;) конкурент Windows! Поразила отзывчивость интерфейса при сворачивании/восстановлении окон в момент пиковой загрузки процессора. Кстати, все оборудование моего ноутбука (&lt;font color="#808080"&gt;Toshiba Satellite Pro M30&lt;/font&gt;) было определено корректно, и даже noname блютуз донгл определился и заработал. Единственная претензия, так это устойчивое желание Ubuntu ползти в инет, что за драйвером для видюхи (&lt;font color="#808080"&gt;чтоб работали эффекты Compiz Fuzion&lt;/font&gt;), что за русским языком для локализации (&lt;font color="#808080"&gt;посмотреть на русский фейс было просто интересно&lt;/font&gt;). Возможно, это из-за того, что я использовал LiveCD, а не устанавливал систему на винт. Очень порадовало качество сглаживания шрифтов Subpixel Smoothing, кажется более качественным нежели Windows ClearType. А вот сами шрифты изяществом не блещут. В общем и целом, Ubuntu зачет!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-6193592824550164850?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/6193592824550164850/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=6193592824550164850' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6193592824550164850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6193592824550164850'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/11/blog-post_14.html' title='Первые впечатления'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1074095094258155672</id><published>2007-11-14T01:13:00.001-08:00</published><updated>2007-11-14T01:13:54.566-08:00</updated><title type='text'>Убунта</title><content type='html'>&lt;p&gt;Сегодня получил заказанные 09.10 диски Ubuntu! Доставили прямо в почтовый ящик. Теперь буду смотреть :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1074095094258155672?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1074095094258155672/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1074095094258155672' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1074095094258155672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1074095094258155672'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/11/blog-post.html' title='Убунта'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-2365121443149267818</id><published>2007-11-07T04:36:00.001-08:00</published><updated>2007-12-21T01:23:56.951-08:00</updated><title type='text'>XML-RPC boxcarring 2</title><content type='html'>&lt;p&gt;Позавчерашний результат в &lt;strong&gt;4500&lt;/strong&gt; вызовов в секунду, что-то не очень меня порадовал... По моим прикидкам, должно было работать значительно быстрее. Сегодня начал искать узкое место. Им оказался используемый мною &lt;a href="http://www.torry.ru/vcl/internet/html/Alcinoe31025.zip" target="_blank"&gt;SAX парсер&lt;/a&gt;, который сильно тормозил при размере пакета в 2 мегабайта. Порылся в его исходниках (&lt;font color="#808080"&gt;благо, он открытый и бесплатный&lt;/font&gt;), и попытался без профилирования определить, где могут быть затыки. Нашел константу &lt;strong&gt;BufferSize&lt;/strong&gt; = 8192 байта. Отлично, подумал я :), сейчас увеличу буфер в два раза и посмотрю. Посмотрел :( Скорость упала вдвое. Я в полнейшем шоке. Решил буфер уменьшить... Скорость возросла :) В общем, я дошел до буфера в 16 байт :) Причем с таким буфером, скорость хорошая, и при парсинге больших строк, и при парсинге файловых стримов (&lt;font color="#808080"&gt;85Мб&lt;/font&gt;).&lt;/p&gt; &lt;p&gt;P.S. Руки дойдут, посмотрю на него под профайлером, а пока результат меня удовлетворил -- &lt;strong&gt;16667&lt;/strong&gt; вызовов в секунду!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-2365121443149267818?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/2365121443149267818/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=2365121443149267818' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2365121443149267818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2365121443149267818'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/11/xml-rpc-boxcarring-2.html' title='XML-RPC boxcarring 2'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-8176557315223841738</id><published>2007-11-05T08:10:00.001-08:00</published><updated>2007-11-05T08:10:55.833-08:00</updated><title type='text'>XML-RPC boxcarring</title><content type='html'>&lt;p&gt;Сегодня протестировал механизм &lt;strong&gt;boxcarring&lt;/strong&gt;'а в &lt;a href="http://www.xmlrpc.com/spec" target="_blank"&gt;XML-RPC&lt;/a&gt;. Результат -- ~&lt;strong&gt;4500&lt;/strong&gt; вызовов в секунду!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-8176557315223841738?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/8176557315223841738/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=8176557315223841738' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8176557315223841738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8176557315223841738'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/11/xml-rpc-boxcarring.html' title='XML-RPC boxcarring'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-8325502488623732614</id><published>2007-11-02T00:12:00.001-07:00</published><updated>2007-11-02T00:12:52.973-07:00</updated><title type='text'>Delphi-грабельки 2</title><content type='html'>&lt;p&gt;Ох уж эти грабельки... Сегодня наступил там, где&amp;nbsp; и не ожидалось :( Есть в &lt;em&gt;ObjectPascal&lt;/em&gt; чудесная функция &lt;strong&gt;Slice&lt;/strong&gt;, которая возвращает N первых элементов открытого массива и использовать которую можно только, как параметр процедуры или функции. Вот сегодня мне эта радость и понадобилась. Надобность обернулась руганью компилятора о том, что функция используется не по назначению т.е. не в качестве параметра функции или процедуры. Ну, это компилятор так думал... На самом деле, все оказалось проще. Функция, а точнее метод, в который я собирался передать кусочек массива,&amp;nbsp;являлся перегруженным и имел сестру-процедуру&amp;nbsp;принимавшую два параметра, первым из которых должен был быть открытый массив&amp;nbsp; (&lt;font color="#808080"&gt;который, собственно, &lt;strong&gt;Slice&lt;/strong&gt;&amp;nbsp;и возвращает&lt;/font&gt;). Такие вот грабельки. Пришлось морщить лоб и выдумывать другое имя для сестры-процедуры :(&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-8325502488623732614?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/8325502488623732614/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=8325502488623732614' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8325502488623732614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8325502488623732614'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/11/delphi-2.html' title='Delphi-грабельки 2'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-8379844203129866279</id><published>2007-10-31T09:19:00.001-07:00</published><updated>2007-10-31T09:19:12.000-07:00</updated><title type='text'>Delphi-грабельки</title><content type='html'>&lt;p&gt;Оказывается, в Delphi нельзя объявить больше одного перегруженного метода&amp;nbsp;в секции &lt;strong&gt;Published.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Сегодня я на эти грабельки наступил... Обидно :(&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-8379844203129866279?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/8379844203129866279/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=8379844203129866279' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8379844203129866279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8379844203129866279'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/10/delphi.html' title='Delphi-грабельки'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1629345657171461029</id><published>2007-10-19T05:48:00.001-07:00</published><updated>2007-10-19T05:49:06.255-07:00</updated><title type='text'>Набросок XML-RPC сервера</title><content type='html'>&lt;p&gt;Сегодня сделал таки набросок XML-RPC сервера чтоб оценить скорость работы. В общем скорость получилась потрясающая: &lt;strong&gt;3750&lt;/strong&gt; вызовов в секунду! Правда ввиду того, что это лишь набросок, где отсутствует куча проверок, в окончательном варианте цифра будет поменьше. Но думается мне, что не меньше 3500 :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1629345657171461029?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1629345657171461029/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1629345657171461029' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1629345657171461029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1629345657171461029'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/10/xml-rpc_19.html' title='Набросок XML-RPC сервера'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-8360973405687330551</id><published>2007-10-16T05:27:00.001-07:00</published><updated>2007-10-16T05:27:40.153-07:00</updated><title type='text'>XML-RPC хотелка</title><content type='html'>&lt;p&gt;Очень хочется официального апдейта &lt;a href="http://www.xmlrpc.com/spec" target="_blank"&gt;спецификации XML-RPC&lt;/a&gt;&amp;nbsp;с целью добавления 64-битных целых. Не очень радует перспектива передавать такие числа в виде строки/двуэлементного массива/записи с двумя членами. Куда бы написать об этом (?), xmlrpc.com совсем мертв, кажется :(&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-8360973405687330551?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/8360973405687330551/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=8360973405687330551' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8360973405687330551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8360973405687330551'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/10/xml-rpc.html' title='XML-RPC хотелка'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-9055815830452000819</id><published>2007-10-09T14:09:00.001-07:00</published><updated>2007-10-09T14:09:05.029-07:00</updated><title type='text'>Семь нянек</title><content type='html'>&lt;p&gt;Сегодня бегло полистал вот эту книгу:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Programming Web Services with XML-RPC&lt;/strong&gt;&lt;br&gt;&lt;font color="#808080"&gt;Simon St. Laurent&lt;br&gt;Joe Johnston&lt;br&gt;Edd Dumbill&lt;br&gt;Publisher: O'Reilly&lt;br&gt;First Edition June 2001&lt;br&gt;ISBN: 0-596-00119-3, 230 pages&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Неоднозначные впечатления... Прям на 24 странице,&amp;nbsp; в пункте &lt;strong&gt;2.3.1.1 Parameters&lt;/strong&gt; присутствует фраза "&lt;em&gt;Even if the method requires no parameters, the &amp;lt;params&amp;gt; element must still be present.&lt;/em&gt;"&amp;nbsp;противоречащая&amp;nbsp;&lt;a href="http://www.xmlrpc.com/spec" target="_blank"&gt;спецификации XML-RPC&lt;/a&gt;. Вроде и авторов аж трое, а такой косяк допустили.&amp;nbsp;Немного ранее авторы сделали смелый вывод о том, что дубликаты членов структуры запрещены т.к. они (&lt;font color="#808080"&gt;авторы&lt;/font&gt;), в противном случае,&amp;nbsp;не могут понять, как может интерпретироваться подобная структура :)&lt;/p&gt; &lt;p&gt;В&amp;nbsp;общем,&amp;nbsp;книга мне&amp;nbsp;не очень понравилась. Какая-то однобокость суждений ощущается.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-9055815830452000819?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/9055815830452000819/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=9055815830452000819' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/9055815830452000819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/9055815830452000819'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/10/blog-post_09.html' title='Семь нянек'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-734652097209591299</id><published>2007-10-09T09:38:00.001-07:00</published><updated>2007-10-09T09:38:27.446-07:00</updated><title type='text'>Убунта</title><content type='html'>&lt;p&gt;Сегодня оформил пред-заказ на 2 (&lt;font color="#808080"&gt;32+64 bit&lt;/font&gt;) CD Linux Ubuntu 7.10. Интересно, сколько диски будут добираться до меня и действительно ли все будет бесплатно... Решил FPC 2.2 под линуксом посмотреть :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-734652097209591299?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/734652097209591299/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=734652097209591299' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/734652097209591299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/734652097209591299'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/10/blog-post.html' title='Убунта'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-2579722521489118628</id><published>2007-09-21T04:56:00.001-07:00</published><updated>2007-09-21T04:56:17.901-07:00</updated><title type='text'>Рекорды скорости</title><content type='html'>&lt;p&gt;Не то, чтобы я специально подтачивал библиотеку для достижения высоких результатов, просто в следствии совсем крошечной оптимизации удалось получить уже &lt;strong&gt;2583 &lt;/strong&gt;вызова в секунду :) без модификации серверного компонента.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-2579722521489118628?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/2579722521489118628/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=2579722521489118628' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2579722521489118628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2579722521489118628'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/09/blog-post.html' title='Рекорды скорости'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-7904928625862096018</id><published>2007-08-12T13:55:00.001-07:00</published><updated>2007-08-12T13:55:15.917-07:00</updated><title type='text'>Скорость передачи данных в XML-RPC</title><content type='html'>&lt;p&gt;Сегодня продолжил тесты на локальной машине. На этот раз решил проверить чистую скорость передачи данных (&lt;font color="#808080"&gt;как если бы передавался файл&lt;/font&gt;). В результате, скорость чуть больше 13Мб в секунду! Передавались блоки по 32Кб, в единственном параметре метода, тип Base64 (&lt;font color="#c0c0c0"&gt;т.е. реальный блок получался ~43Кб. Не стоит забывать, что &lt;a href="http://www.xmlrpc.com/spec" target="_blank"&gt;спецификация XML-RPC&lt;/a&gt; разрешает использовать и строки для передачи бинарных данных&lt;/font&gt;). Выходит, что файл размером в 130Мб был бы передан за 10 секунд. Если блоки передавать строкой, а не Base64, скорость получается 28.5Мб в секунду :)&lt;/p&gt; &lt;p&gt;Было желание попробовать этот тест с использованием gzip-сжатия, но мне стало лень прикручивать фильтр к IIS :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-7904928625862096018?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/7904928625862096018/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=7904928625862096018' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7904928625862096018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7904928625862096018'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/08/xml-rpc_12.html' title='Скорость передачи данных в XML-RPC'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1324798970872399966</id><published>2007-08-11T07:53:00.001-07:00</published><updated>2007-08-11T10:37:45.538-07:00</updated><title type='text'>Скорость XML-RPC</title><content type='html'>&lt;p&gt;Сегодня протестировал свою библиотеку XML-RPC на локальной машине (&lt;font color="#808080"&gt;до этого тестировал только при нахождении сервера под виртуалкой&lt;/font&gt;). Сервер IIS 5.1 под которым работает мой xml-rpc ISAPI. Клиент -- Delphi-приложение. Клиент вызывает метод&amp;nbsp;&lt;strong&gt;currentTime.GetCurrentTime&lt;/strong&gt; возвращающий текущую дату и время. Многократные замеры показывают результат в &lt;strong&gt;2560&lt;/strong&gt; вызовов в секунду (&lt;font color="#808080"&gt;и это без использования boxcarring'а и на неспециализированном сервере&lt;/font&gt;)!!! Кто там говорил, что XML-RPC не эффективен ;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1324798970872399966?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1324798970872399966/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1324798970872399966' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1324798970872399966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1324798970872399966'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/08/xml-rpc.html' title='Скорость XML-RPC'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-6796245252399575624</id><published>2007-08-04T22:34:00.001-07:00</published><updated>2007-08-04T22:34:10.166-07:00</updated><title type='text'>Цвет затемнения в Smoke-screen</title><content type='html'>&lt;p&gt;Для себя выбрал оптимальный вариант подбора цветов затемнения. Изначально использовал не черный, а очень темно-серый (&lt;font color="#808080"&gt;RGB: 32, 32, 32&lt;/font&gt;). Сейчас выбираю цвет в оттенок обоя рабочего стола, т.е. если на обое преобладает зеленый цвет, я немного усиливаю этот цветовой канал (&lt;font color="#808080"&gt;скажем RGB: 32, 48, 16&lt;/font&gt;) и ослабляю другой. В результате затемнение ощущается этаким, продолжением обоя :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-6796245252399575624?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/6796245252399575624/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=6796245252399575624' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6796245252399575624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6796245252399575624'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/08/smoke-screen.html' title='Цвет затемнения в Smoke-screen'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-391059279872102716</id><published>2007-08-02T08:16:00.001-07:00</published><updated>2007-08-02T08:16:49.976-07:00</updated><title type='text'>"Турба", ты меня удивляешь...</title><content type='html'>&lt;p&gt;Сегодня у меня получилось создать объект абстрактного (!) класса... Глюк плавающий и воспроизведению, что-то не поддается.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-391059279872102716?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/391059279872102716/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=391059279872102716' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/391059279872102716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/391059279872102716'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/08/blog-post.html' title='&amp;quot;Турба&amp;quot;, ты меня удивляешь...'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-5624556506959797063</id><published>2007-07-22T06:07:00.001-07:00</published><updated>2007-07-22T06:07:53.456-07:00</updated><title type='text'>JSON</title><content type='html'>&lt;p&gt;Вот &lt;a href="http://www.progdigy.com/modules.php?name=jsontoolkit" target="_blank"&gt;тут&lt;/a&gt;&amp;nbsp;обнаружил JSON Toolkit v0.3 (с поддержкой RPC). В закладки, однозначно! Пригодится, вдуг решу свой гейт JSON-RPC&amp;nbsp;2XML-RPC and vice versa&amp;nbsp;сделать :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-5624556506959797063?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/5624556506959797063/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=5624556506959797063' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5624556506959797063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5624556506959797063'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/07/json.html' title='JSON'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-3572914034584543477</id><published>2007-07-17T13:15:00.001-07:00</published><updated>2007-07-17T13:15:49.612-07:00</updated><title type='text'>Снова баг TurboDelphi/BDS2006</title><content type='html'>&lt;p&gt;Не помню, может я уже писал об этом, просто позавчера снова напоролся... Имеем свойство интерфейсного типа. Имеем сеттер получающий &lt;u&gt;константный&lt;/u&gt; параметр (&lt;font color="#808080"&gt;новое значение св-ва ес-но&lt;/font&gt;). Внутри сеттера выполняем проверку поддержки необходимого нам интерфейса средствами Supports(Value, IMyInft); Все. После отработки сеттера, мы теряем интерфейс. Баг обходится либо, отказом от &lt;u&gt;константного&lt;/u&gt; параметра либо, проверкой интерфейса расширенной версией Supports с дополнительным параметром. Интересно, в D2007 это воспроизводится?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-3572914034584543477?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/3572914034584543477/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=3572914034584543477' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3572914034584543477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3572914034584543477'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/07/turbodelphibds2006.html' title='Снова баг TurboDelphi/BDS2006'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1205062288066284192</id><published>2007-06-24T06:58:00.001-07:00</published><updated>2009-09-14T04:05:42.228-07:00</updated><title type='text'>ControlHooks</title><content type='html'>&lt;p&gt;На&amp;nbsp;&lt;a href="http://kazantsev.nm.ru/" target="_blank"&gt;домашней страничке&lt;/a&gt;&amp;nbsp;выложены модули (D2006/Turbo ~15Kb)&amp;nbsp; позволяющие создавать классы-ловушки элементов управления (потомки TControl), а также пример использования (класс-ловушка обеспечивающий принятое в Windows поведение элементов управления Edit и Combobox при статусах Disabled и ReadOnly).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1205062288066284192?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1205062288066284192/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1205062288066284192' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1205062288066284192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1205062288066284192'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/06/controlhooks.html' title='ControlHooks'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1209947114551152331</id><published>2007-06-15T00:40:00.001-07:00</published><updated>2007-06-15T00:40:36.964-07:00</updated><title type='text'>UIB 2.1 Release</title><content type='html'>&lt;p&gt;Почти неделю назад вышел &lt;a href="http://www.progdigy.com/" target="_blank"&gt;релиз 2.1&lt;/a&gt; чудесных компонентов для прямого доступа к IB/FB/Yaffil&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1209947114551152331?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1209947114551152331/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1209947114551152331' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1209947114551152331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1209947114551152331'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/06/uib-21-release.html' title='UIB 2.1 Release'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-2556976448597950090</id><published>2007-06-10T02:23:00.001-07:00</published><updated>2007-06-10T02:23:37.514-07:00</updated><title type='text'>Synapse</title><content type='html'>&lt;p&gt;В модуле blcksock.pas включена директива {M+}, соответственно все классы библиотеки получают RTTI т.к. имеют published-члены. Не знаю, с какой целью автор это сделал (&lt;font color="#808080"&gt;может для Lazarus'а. Кажется, я что-то&amp;nbsp;слышал об этом&lt;/font&gt;), но я, для win32, директиву отключаю.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-2556976448597950090?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/2556976448597950090/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=2556976448597950090' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2556976448597950090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2556976448597950090'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/06/synapse.html' title='Synapse'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-7761660950017385385</id><published>2007-06-01T07:50:00.001-07:00</published><updated>2007-08-19T11:30:30.929-07:00</updated><title type='text'>Решение с null-stream</title><content type='html'>&lt;p&gt;Собственно, ничего нового и оригинального я не напишу, но вдруг, кому пригодится :). Есть у меня класс TXmlRpcPacketGenerator, который формирует XML-RPC-пакет в соответствии с параметрами и опциями форматирования (отступы, декларация, варианты компактности). Формирование пакета происходит только в поток т.е. в объект-наследник класса TStream. Встала задача, определения размера будущего пакета ДО его формирования. Было несколько вариантов решения, но остановился я на т.н. null-stream. Создается класс TNullStream(TStream), в котором перекрываются методы Read, Write и Seek. Что делают эти методы понятно из их названия и в контексте названия потока т.е. ничего не делают :), а просто манипулируют счетчиком. Потом в такой поток формируется пакет и задача решена :)&lt;/p&gt; &lt;p&gt;Замечания относительно скорости: самая тяжелая операция в формировании XML-RPC-пакета - кодирование Base64, однако на это можно не обращать внимания т.к. по моим замерам (&lt;font color="#808080"&gt;и моим-же кодером&lt;/font&gt;) строка, общим объемом, в&amp;nbsp;18Mb кодируется всего за 0.25 секунды (PM-1.7Gh 512RAM) (&lt;font color="#808080"&gt;но это время только чистого кодирования&lt;/font&gt;). Другая тяжелая операция - это большое количество данных примитивных типов (массивы чисел, дат, булевых&amp;nbsp;и т.п.), однако и это не так страшно, например массив из 100.000 структур формируется за 0.2 секунды и имеет размер 2.4Mb.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-7761660950017385385?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/7761660950017385385/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=7761660950017385385' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7761660950017385385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7761660950017385385'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/06/null-stream.html' title='Решение с null-stream'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-7620604002241404719</id><published>2007-05-21T22:57:00.001-07:00</published><updated>2007-05-21T22:57:07.561-07:00</updated><title type='text'>Надоело читать про iso8601</title><content type='html'>На просторах ненашего интернета читал статьи об XML-RPC. Я, честно говоря, только о русских авторах думал не очень хорошо, а оказалось&amp;nbsp;- эпидемия :) В большинстве (&lt;font color="#808080"&gt;если не во всех&lt;/font&gt;) статей авторы пишут, что XML-RPC использует для представления даты и времени стандарт "&lt;font color="#000000"&gt;&lt;u&gt;квази&lt;/u&gt;" iso8601 (&lt;font color="#808080"&gt;т.е. это представление, якобы, не соответствует стандарту&lt;/font&gt;). Внимательно читая iso8601 я не увидел ни одного несоответствия &lt;u&gt;рекомендациям&lt;/u&gt; стандарта. Они, что, друг-друга просто перепечатывают?&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-7620604002241404719?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/7620604002241404719/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=7620604002241404719' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7620604002241404719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7620604002241404719'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/05/iso8601.html' title='Надоело читать про iso8601'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-6182818048037720648</id><published>2007-05-15T07:00:00.001-07:00</published><updated>2007-05-15T07:00:28.163-07:00</updated><title type='text'>Colocation заблаговременно...</title><content type='html'>Озадачился найти контору, которая предоставляет услугу colocation за приемлемые (2кило рубля в месяц максимум) деньги и без дурацких ограничений по трафику,&amp;nbsp;вида 1/4 (&lt;font color="#808080"&gt;а у меня задумка такая, что входящего будет больше нежели исходящего&lt;/font&gt;). Полазил по инету, полазил, да и опечалился совсем :( У всех ограничения :(( Нашел &lt;a href="http://www.keyweb.ru" target="_blank"&gt;keyweb.ru,&lt;/a&gt; так у них дата-центр в Германии... Что и делать, где железо размещать...??? &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-6182818048037720648?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/6182818048037720648/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=6182818048037720648' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6182818048037720648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6182818048037720648'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/05/colocation.html' title='Colocation заблаговременно...'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1700154999781288513</id><published>2007-04-22T05:03:00.001-07:00</published><updated>2007-04-22T05:03:09.027-07:00</updated><title type='text'>Маленький хинт :)</title><content type='html'>&lt;p&gt;Часто в работе приходится использовать сторонние библиотеки (&lt;font color="#808080"&gt;хотя это можно отнести и к своим&lt;/font&gt;) имеющие директивы условной компиляции и соответствующие определения. Это здорово, это позволяет гибко, под нужды приложения, компилировать библиотеку (&lt;font color="#808080"&gt;например я, в UIB&amp;nbsp;включаю UIB_NO_COMPONENT, чтоб предком всех классов стал TObject&lt;/font&gt;). Это хорошая практика, но она имеет недостатки: когда происходит обновление версии библиотеки, старые определения (&lt;font color="#808080"&gt;в файлах .inc&lt;/font&gt;) могут быть утеряны, не всегда-же все держится в голове. А если таких библиотек несколько? В общем, я для себя нашел способ избавиться от этой головной боли :) В отдельный модуль, или файл проекта (&lt;font color="#808080"&gt;а вообще, куда угодно&lt;/font&gt;) подключаются файлы определений (&lt;font color="#808080"&gt;*.inc&lt;/font&gt;) библиотек и создаются директивы условной компиляции (&lt;font color="#808080"&gt;пример для UIB&lt;/font&gt;):&lt;/p&gt;&lt;pre&gt;{$IFDEF DLLREGISTRY}&lt;br /&gt;&lt;br /&gt; {$MESSAGE FATAL 'Отключить $DEFINE DLLREGISTRY (jvuib.inc)'}&lt;br /&gt;&lt;br /&gt;{$ENDIF}&lt;br /&gt;&lt;br /&gt;{$IFNDEF FB20}&lt;br /&gt;&lt;br /&gt; {$MESSAGE FATAL 'Включить $DEFINE FB20 (jvuib.inc)'}&lt;br /&gt;&lt;br /&gt;{$ENDIF}&lt;br /&gt;&lt;br /&gt;{$IFDEF UIBTHREADSAFE}&lt;br /&gt;&lt;br /&gt; {$MESSAGE FATAL 'Отключить $DEFINE UIBTHREADSAFE (jvuib.inc)'}&lt;br /&gt;&lt;br /&gt;{$ENDIF}&lt;br /&gt;&lt;br /&gt;{$IFNDEF UIB_NO_COMPONENT}&lt;br /&gt;&lt;br /&gt; {$MESSAGE FATAL 'Включить $DEFINE UIB_NO_COMPONENT (jvuib.inc)'}&lt;br /&gt;&lt;br /&gt;{$ENDIF}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Теперь уж точно ничего не забудется при обновлении :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1700154999781288513?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1700154999781288513/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1700154999781288513' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1700154999781288513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1700154999781288513'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/04/blog-post.html' title='Маленький хинт :)'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-4751677822446628302</id><published>2007-03-16T03:13:00.001-07:00</published><updated>2007-03-16T03:15:57.866-07:00</updated><title type='text'>OLE automation</title><content type='html'>&lt;p&gt;Никогда не любил эту штуку. Не, ну здорово, конечно, в Word'е страничку иль в Excel'е табличку/отчетик заделать, но чтоб постоянно использовать - боже упаси. Однако решил, заради эксперимента, прикрутить к своей реализации XML-RPC вызов методов сервера через механизмы диспетчеризации (IDispatch). Надумано - наделано :) Вчера закончил. Результаты, честно говоря, меня очень порадовали. Прямой вызов метода выигрывает у своего диспетчеризуемого аналога всего 0.2 секунды при 10.000 итераций (т.е. разница в пересчете на одну итерацию сопоставима с погрешностью замеров). Проигрывая при&amp;nbsp; этом, по простоте (правда не сильно) и читабельности кода:&lt;/p&gt;&lt;pre&gt;Прямой вызов:&lt;br /&gt;   For SIndex := 1 To 50 Do&lt;br /&gt;     Memo1.Lines.Add(SysUtils.Format('%d - %s', [SIndex, Call('examples.getStateName', [SIndex])]));&lt;br /&gt;&lt;br /&gt;Диспетчеризуемый вызов:&lt;br /&gt;   For SIndex := 1 To 50 Do&lt;br /&gt;     Memo1.Lines.Add(SysUtils.Format('%d - %s', [SIndex, Server.examples.getStateName(SIndex)]));&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-4751677822446628302?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/4751677822446628302/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=4751677822446628302' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4751677822446628302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4751677822446628302'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/03/ole-automation.html' title='OLE automation'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1992613377659035130</id><published>2007-03-09T03:24:00.001-08:00</published><updated>2007-03-09T03:24:58.798-08:00</updated><title type='text'>Однако, Linux...</title><content type='html'>&lt;p&gt;Вчера и сегодня в новостях "Компьютерры" мелькнули сообщения о том, что Dell и HP будут поставлять компьютеры с Linux... Интересное кино.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1992613377659035130?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1992613377659035130/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1992613377659035130' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1992613377659035130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1992613377659035130'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/03/linux.html' title='Однако, Linux...'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-6181484667796836988</id><published>2007-02-22T02:47:00.001-08:00</published><updated>2007-02-22T08:26:22.221-08:00</updated><title type='text'>Идеальное хранилище</title><content type='html'>Вот так высокопарно :) Разумеется, ничего идеального нет, но то, о чем я сегодня пишу, в некотором смысле тянет на это определение ;) Речь пойдет о хранении настроек приложения, как частном случае. Как известно, для хранения настроек изначально &lt;font color="#808080"&gt;(аж&amp;nbsp;со времен DOS)&lt;/font&gt; использовались т.н. &lt;strong&gt;ini&lt;/strong&gt;-файлы, текстовые файлы с незамысловатой структурой. Решение очень простое и даже примитивное. Примитивность заключалась в неструктурированности и непизированности хранимых значений, и именно из-за нетипизированности были основные проблемы &lt;font color="#808080"&gt;(конечно, если разработчику не лень в каждом месте выполнять вручную конвертирование типов из строкового представления, для него это не проблема)&lt;/font&gt;. Потом Майкрософт сказала, что &lt;strong&gt;ini-&lt;/strong&gt;файлы - прошлый век, и всем пора пользоваться реестром &lt;font color="#808080"&gt;(единым системным хранилищем)&lt;/font&gt;. Там, и типизация, и возможность "структурного" хранения и вообще реестр - &lt;em&gt;rulezzz!&lt;/em&gt;&amp;nbsp; И толпы программистов-леммингов кинулись претворять в жизнь призыв Большого Билла. Но, как оказалось, структурированность реестра не относилась к типизации данных &lt;font color="#808080"&gt;(их по прежнему приходилось хранить в "плоском" виде)&lt;/font&gt;, структурировать можно было только расположение &lt;font color="#808080"&gt;(что, собственно, присутствовало и в &lt;strong&gt;ini&lt;/strong&gt;-файлах)&lt;/font&gt;.&amp;nbsp;&amp;nbsp;Разработчики привыкшие к такому положению дел еще со времен &lt;strong&gt;ini&lt;/strong&gt;-файлов, кажется, не особенно и растроились &lt;font color="#808080"&gt;(запросто храня массивы и&amp;nbsp;структуры в виде бинарных блоков)&lt;/font&gt;. Но время шло и пользователи стали замечать, что файлы реестра пухнут&amp;nbsp;и, как следствие,&amp;nbsp;система уже не так резва, как после установки. Оказалось, что всему виной приложения оставляющие, даже после своего удаление, в реестре груды мусора. Эта проблема породила целый класс программ-чистильщиков реестра &lt;font color="#808080"&gt;(авторы, наверное, благодарны Большому Биллу)&lt;/font&gt;. [&lt;font color="#0080ff"&gt;Кстати, с приходом &lt;strong&gt;.Net&lt;/strong&gt;&amp;nbsp;изменилось отношение Майкрософт к вопросу&amp;nbsp;хранения настроек, теперь они не рекомендуют использовать реестр и снова предлагают хранить все в файлах (все возвращается на круги своя ;))&lt;/font&gt;]&amp;nbsp;Потом появилась идея, хранить настройки в файлах формата &lt;strong&gt;XML&lt;/strong&gt;. Идея совсем не плоха, т.к.&amp;nbsp;структурирование заложено в саму суть формата, но беда &lt;font color="#808080"&gt;(не формата, как такового, а идеи хранения в нем типизированных данных)&lt;/font&gt; в том, что типизация в формате не предусмотрена &lt;font color="#808080"&gt;(еще раз скажу, что это не проблема самого формата)&lt;/font&gt;, конечно существуют различные механизмы описания, типа DTD, но для задачи хранения настроек это слишком... Как вариант, можно пойти своим путем &lt;font color="#808080"&gt;(так сделала сама Майкрософт для своего продукта Virtual PC 2004)&lt;/font&gt; и хранить в &lt;strong&gt;xml&lt;/strong&gt;-файлах информацию о типах элементов &lt;font color="#808080"&gt;(благо формат позволяет делать это весьма элегантно)&lt;/font&gt;. Я же, хочу рассказать еще об одном варианте "своего пути", личном ;) Так случилось, что мне пришлось писать собственную реализацию протокола &lt;a href="http://www.xmlrpc.com/spec"&gt;XML-RPC&lt;/a&gt;, и сейчас, софт, который пишется, пишется с прицелом на этот протокол. Так вот, для хранения настроек и некоторых файлов с данными, было решено использовать формат пакетов &lt;a href="http://www.xmlrpc.com/spec" target="_blank"&gt;XML-RPC&lt;/a&gt;&amp;nbsp;&lt;font color="#808080"&gt;(A, что может быть лучше? Тут, и строгая типизация, и богатый набор самих типов (да еще и парсинг уже написан и отлажен)).&lt;/font&gt;&lt;font color="#000000"&gt; Сам протокол имеет только два типа пакетов &lt;strong&gt;methodCall&lt;/strong&gt; и &lt;strong&gt;methodResponse&lt;/strong&gt;, настройки логичнее хранить во втором, но чтоб не смущать пользователей любящих подкрутить что-нибудь руками тэгом &lt;font color="#008000"&gt;&amp;lt;methodResponse&amp;gt;&lt;/font&gt;, я добавил третий тип пакета &lt;strong&gt;value&lt;/strong&gt; &lt;/font&gt;&lt;font color="#808080"&gt;(это не потребовало сколь нибудь значительной переделки генератора пакетов т.к. элементы &lt;strong&gt;value&lt;/strong&gt; в любом случае сериализуются)&lt;/font&gt;&lt;font color="#000000"&gt;, который аналогичен пакету &lt;strong&gt;methodResponse&lt;/strong&gt;, но где корневым элементом является &lt;strong&gt;value&lt;/strong&gt;.&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-6181484667796836988?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/6181484667796836988/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=6181484667796836988' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6181484667796836988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6181484667796836988'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/02/blog-post_22.html' title='Идеальное хранилище'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-5103077501624223294</id><published>2007-02-18T00:02:00.001-08:00</published><updated>2007-02-18T00:02:09.311-08:00</updated><title type='text'>Очередной баг</title><content type='html'>Сегодня наткнулся на интересную особенность работы конструкторов записей. Имеем запись с полем типа &lt;strong&gt;Variant&lt;/strong&gt;. В конструкторе, который, как известно, может вызываться сколь угодно раз для объекта/записи, присваиваем полю интерфейс получаемый из вновь создаваемого объекта. По идее, должно произойти освобождение старого объекта (если вызов не первый) т.к. ссылка на его интерфейс теряется, а затем назначение полю нового значения. Но при входе в конструктор, благодаря компилятору,&amp;nbsp;поле получает значение &lt;strong&gt;Unassigned&lt;/strong&gt;, в результате&amp;nbsp;чего, мы имеем утечку памяти.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-5103077501624223294?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/5103077501624223294/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=5103077501624223294' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5103077501624223294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/5103077501624223294'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/02/blog-post_18.html' title='Очередной баг'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-1297761716111791175</id><published>2007-02-07T13:13:00.001-08:00</published><updated>2007-02-08T01:22:05.867-08:00</updated><title type='text'>POPFile 0.22.4. Осьминог жукастый</title><content type='html'>&lt;p&gt;Где-то, на просторах инета наткнулся на классификатор почты, &lt;a href="http://getpopfile.org/" target="_blank"&gt;POPFile&lt;/a&gt;, использующий теорему Байеса (Bayes) для отделения мух от котлет :) Нашел несколько хвалебных отзывов от его пользователей (говорят фильтрует аж 99.9% процентов спама), и самое главное, увидел, что он имеет XML-RPC API для взаимодействия с внешним миром. Не смог пройти мимо и не попробовать "повзаимодействовать" :) Качнув и установив его на виртуальную машину,&amp;nbsp; активировал работу XML-RPC API для внешних подключений (по умолчанию XML-RPC отключен). Дело за клиентом! По первому попавшемуся примеру сваял маленький пробник для перечисления корзин классификатора. И тут меня ждал неприятный сюрприз... Ошибшись в имени метода (пропустил одну букву) я получил в ответе некорректную (не соответствующую &lt;a href="http://www.xmlrpc.com/spec" target="_blank"&gt;спецификации XML-RPC&lt;/a&gt;) fault-структуру, где член &lt;strong&gt;faultCode&lt;/strong&gt; имел строковый тип... Выходит, используемая им перловая реализация&amp;nbsp;(XMLRPC::Lite если я не ошибаюсь) кривая, коли допускает подобные вольности. Вот такие дела, авторам отпишусь :)&lt;/p&gt; &lt;p&gt;P.S. Вот и делай людям добро ;) Попытался отрапортовать об ошибке, так оказалось, для этого еще и на SourceForge'е нужно регистрироваться. Ну уж нет :)&lt;/p&gt; &lt;p&gt;P.P.S. На вызов метода &lt;strong&gt;release_session_key&lt;/strong&gt; отдается структура, также не соответствующая &lt;a href="http://www.xmlrpc.com/spec" target="_blank"&gt;спецификации XML-RPC&lt;/a&gt; (тэг &lt;em&gt;&lt;font color="#008000"&gt;&amp;lt;params&amp;gt;&lt;/font&gt;&lt;/em&gt; не имеет обязательных дочерних элементов).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-1297761716111791175?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/1297761716111791175/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=1297761716111791175' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1297761716111791175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/1297761716111791175'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/02/popfile-0224.html' title='POPFile 0.22.4. Осьминог жукастый'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-2063447840540859849</id><published>2007-02-05T14:42:00.001-08:00</published><updated>2007-02-05T14:42:24.983-08:00</updated><title type='text'>Неудавшийся поиск</title><content type='html'>Что-то я ни как не могу найти фришный (собственно и платных не видел) монитор для XML-RPC :( Не просто проксю, которая будет показывать тела пакетов, а именно полноценный монитор с парсингом сообщений и раскладыванием по полочкам передаваемых значений (в древовидную структуру например). Что-то вроде майкрософтовского SOAP listener'а (вроде так называется). А если у него окажется еще и поддержка boxcarring'а и introspection'а, то ваще будет рай :) Уж больно не хочется самому пис&lt;em&gt;а&lt;/em&gt;ть...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-2063447840540859849?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/2063447840540859849/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=2063447840540859849' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2063447840540859849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2063447840540859849'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/02/blog-post_05.html' title='Неудавшийся поиск'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-2974024947111978438</id><published>2007-02-01T11:30:00.001-08:00</published><updated>2007-02-01T11:30:05.114-08:00</updated><title type='text'>"Приведение" типов</title><content type='html'>&lt;p&gt;Правда не совсем приведение... Встала задача получить из &lt;strong&gt;TMemoryStream&lt;/strong&gt; строку. Самый простой путь, он же и самый не эффективный,&amp;nbsp; задать строке размер &lt;strong&gt;SetLength&lt;/strong&gt; и потом просто скопировать память&amp;nbsp;с помощью&amp;nbsp;&lt;strong&gt;Move&lt;/strong&gt;. Неэффективность налицо: двукратно увеличеное требование к памяти и время на копирование. Но есть вариант проще:&lt;/p&gt;&lt;pre&gt;  Type&lt;br /&gt;&lt;br /&gt;   TOpenedMemoryStream = Class(TMemoryStream);&lt;br /&gt;&lt;br /&gt;  Var&lt;br /&gt;&lt;br /&gt;   Data : PChar;&lt;br /&gt;&lt;br /&gt;  ...&lt;br /&gt;&lt;br /&gt;  With TOpenedMemoryStream(AStream) Do&lt;br /&gt;   Begin&lt;br /&gt;&lt;br /&gt;    // Если выделенной памяти ровно столько сколько требуется потоку&lt;br /&gt;    // (обычно больше т.к. память выделяется блоками по 8192 байт)&lt;br /&gt;    // увеличиваем количество выделенной памяти не изменяя размера потока&lt;br /&gt;    If Capacity = Size Then&lt;br /&gt;     Capacity := Capacity + 1;&lt;br /&gt;&lt;br /&gt;    // Сразу за блоком, занимаемым потоком, записываем признак конца строки&lt;br /&gt;    // и сохраняем указатель на блок памяти для для последующей обработки&lt;br /&gt;    PByte(Integer(Memory) + Size)^ := 0;&lt;br /&gt;    Data := Memory;&lt;br /&gt;&lt;br /&gt;   End;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Теперь переменную &lt;strong&gt;Data&lt;/strong&gt; можно приводить к строковому типу :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-2974024947111978438?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/2974024947111978438/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=2974024947111978438' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2974024947111978438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/2974024947111978438'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/02/blog-post.html' title='&amp;quot;Приведение&amp;quot; типов'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-7305444087511574852</id><published>2007-01-31T17:09:00.001-08:00</published><updated>2007-01-31T17:09:42.436-08:00</updated><title type='text'>Исходники</title><content type='html'>На &lt;a href="http://kazantsev.nm.ru/" target="_blank"&gt;домашней страничке&lt;/a&gt; выложен&amp;nbsp;&lt;a href="http://kazantsev.nm.ru/mbfa.zip"&gt;архив (~8Kb)&lt;/a&gt;&amp;nbsp;содержащий&amp;nbsp;модули и шаблон для создания мультиформенного приложения (MS Office 200 like).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-7305444087511574852?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/7305444087511574852/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=7305444087511574852' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7305444087511574852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7305444087511574852'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/01/blog-post_31.html' title='Исходники'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-4338148987731107387</id><published>2007-01-24T15:20:00.001-08:00</published><updated>2007-01-24T15:23:32.238-08:00</updated><title type='text'>День под знаком "петли"</title><content type='html'>Сегодня у меня был ужасный день... На моей Тоше (Toshiba Satellite Pro M30) жутко расхлябалась левая петля :(. Такое случалось и раньше, но там я обходился малой кровью, а именно: снимал с петли накладку (снимается она легко) и под две скрепленные заклепкой пластины (между которыми и образовывался люфт) подкладывал всяческие железки. Это помогало, но на некоторое время. Я прекрасно понимал, что раз оно заболталось, значит с одной стороны у заклепки отваливается шляпка, но с какой было не ясно. Операцию подкладывания я проводил целых три раза, и вот сегодня свершилось... Люфт стал настолько большим, что при открывании крышки накладка петли сама-собой отщелкивалась :(. Ничего не оставалось делать, как разобрать бук и посмотреть на виновницу "торжества". Как я и предполагал, нижняя шляпка заклепки отвалилась наполовину. Пришлось вооружаться плоскогубцами и пилкой по металлу т.к. заклепка выниматься не желала. Получасовая битва наконец принесла свои плоды, заклепка сдалась! Я подыскал подходящий по размеру болтик с "гравером" и гаечкой и принялся восстанавливать работоспособность железного элемента. Наконец все закончено и бук можно собирать! Ура! Сборка прошла весьма успешно и я был уже готов включить его и проверить на "мало ли чего", как вдруг вспомнил, что не поставил накладку на петлю. Ну-да, дело плевое, не первый раз, решил я, и принялся накладку устанавливать. Но, не тут-то было... Гаечка оказалась слишком толстой, и накладка, ни как не хотела надеваться на петлю :(((( Щьёрт побьерьы!!! Снова разбирать бук... Это был сильный стресс... Но делать нечего, пришлось вновь разбирать до винтика (если кто разбирал эту модель, поймет, там снимать нужно все вплоть до HDD и CD). После разборки и поиска замены толстой гаечке,&amp;nbsp;я обнаружил, что заменить ее нечем :((((( На помощь пришел напильник, коим я старательно обтачивал гайку, а заодно и головку болта. Покончив с этим делом, и примерив накладку (она наделась просто чудно) я решил, до кучи, еще и кулер смазать литолом! Надумано - наделано! Кулер смазан, накладка надета, осталась сборка. Сборка заняла минут пять, потом влажная уборка рабочего места и протирание матрицы и самого бука. У-ф-ф-ф... Зато теперь петля никуда от меня не денется ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-4338148987731107387?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/4338148987731107387/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=4338148987731107387' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4338148987731107387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/4338148987731107387'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/01/blog-post_24.html' title='День под знаком &amp;quot;петли&amp;quot;'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-972577071051108948</id><published>2007-01-23T03:08:00.001-08:00</published><updated>2007-01-23T04:48:03.317-08:00</updated><title type='text'>Наследование записей</title><content type='html'>&lt;p&gt;Ну не так, чтоб уж совсем наследование, но механизм расширения функционала рабочий. Итак: определяем запись &lt;strong&gt;TRecord&lt;/strong&gt; с неким&amp;nbsp;множеством методов. Затем (типа наследуемся) определяем запись &lt;strong&gt;TRecordDesc = Type TRecord&lt;/strong&gt;. Теперь эти записи не совместимы (для чего это нужно - ниже). Описываем &lt;strong&gt;Record Helper For TRecordDesc&lt;/strong&gt; с неким множеством методов/свойств. В итоге, мы получили функционально расширенную запись, ну а несовместимось нужна была, чтоб члены &lt;strong&gt;record helper&lt;/strong&gt;'а не попали к предку. Однако копирование записи достигается простым приведением типа ;) Если бы хэлперы позволяли описывать перегрузку операторов, можно было&amp;nbsp;обойтись и без приведения.&lt;/p&gt; &lt;p&gt;Однако есть еще способ ;). Можно использовать агрегацию, тем самым избавиться от хэлперов и приобрести возможность перегружать операторы :).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-972577071051108948?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/972577071051108948/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=972577071051108948' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/972577071051108948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/972577071051108948'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/01/blog-post_23.html' title='Наследование записей'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-7638866589038833966</id><published>2007-01-22T06:57:00.001-08:00</published><updated>2007-01-22T06:57:49.694-08:00</updated><title type='text'>Где, блин, революция!?</title><content type='html'>&lt;p&gt;Еще, когда только планировалась к выходу Delphi 6, весь инет шумел о веб-сервисах, все говорили, что вот, грядет оно, светлое будущее. И собственно где? Ну блоги, понятное дело, ну еще г-н Орейли чего-то там сделал, ну да, г-н Виннер, а еще? Публичных веб-сервисов кот наплакал, да и те умеют лишь рапортовать о валюте, времени&amp;nbsp;да погоде... Это&amp;nbsp;я к чему, да просто г-н Балмер недавно снова&amp;nbsp;предсказал революцию веб-сервисов в течении ближайших 10 лет :).&lt;/p&gt; &lt;p&gt;Что еще интересно, по задумке идеологов, веб-сервисы должна была объединить одна важная особенность - протокол взаимодействия (тогда на это точили SOAP, а Borland даже сделала RTTI для интерфейсов в шестой версии). И взгляните, что происходит сейчас: образовалась целая куча подходов к осуществлению взаимодействия (SOAP, XML-RPC, REST, JSON, PI-RPC, AJAX&amp;nbsp;и.т.д), каждый считает себя самым умным и делает то, что считает нужным. Например контора на "Г" прибила бету поискового сервиса на SOAP, и перевела его на AJAX (чего уж не на GData).&amp;nbsp; Таже контора обещает отломать от Blogger'а XML-RPC API и перейти на что-то свое... Короче, разброд полнейший... Что-же касается SOAP, то он&amp;nbsp;уже давно превратился в монстра с которым, никому, кроме породивших его Франкенштейнов, связываться не хочется.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-7638866589038833966?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/7638866589038833966/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=7638866589038833966' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7638866589038833966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7638866589038833966'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/01/blog-post_22.html' title='Где, блин, революция!?'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-6831001499325575535</id><published>2007-01-14T08:18:00.001-08:00</published><updated>2007-01-14T08:30:58.758-08:00</updated><title type='text'>Что делают в армии?</title><content type='html'>&lt;p&gt;На этот вопрос каждый отвечает себе сам :) Я пошел в армию вполне осознанно, бросив учебу в университете. Пошел, потому что так было надо (ну воспитывали нас так), т.е. все нормальные косили, а остальные шли служить. До этого я учился в техническом лицее, где получил диплом программиста и к тому времени пис&lt;em&gt;а&lt;/em&gt;л на Clipper'е, Turbo Pascal'е и Assembler'е. Имея первое место&amp;nbsp;"на республике" по программированию, и соответствующий диплом, я наивно полагал, что в армии тоже буду программировать :) Но так в общем и вышло ;) Служил я в РВСН в/ч 44200, прикомандированным к центру психологической работы. Программировал в основном психологические тесты разных мастей по именитым методикам,&amp;nbsp;но такая работа мне не очень нравилась,&amp;nbsp;хотя и напрягала не особенно.&amp;nbsp;Но кроме этого довелось мне пис&lt;em&gt;а&lt;/em&gt;ть две интересные программы: первая - расчет заработной платы военнослужащих, а вторая - мой дембельский аккорд (оптимальное распределение военнослужащих). О второй пис&lt;em&gt;а&lt;/em&gt;ть не буду т.к. пис&lt;em&gt;а&lt;/em&gt;ть придется слишком много :) Ну а первая, вот она:&lt;/p&gt; &lt;p&gt;&lt;a href="http://kazantsev.nm.ru/images/m1.png" target="_new" atomicselection="true"&gt;&lt;img height="144" src="http://kazantsev.nm.ru/blogimages/008ceb05753d_112CF/m16.png" width="192" align="left"&gt;&lt;/a&gt;&amp;nbsp;Написана на Borland Pascal 7.1 with objects. Работала под DOS, в режиме 640 x 480 x 4. В качестве базы данных использовался самописный движок для работы с .dbf (это была моя дипломная работа в лицее). Для программирования интерфейса импользовалась также самописная библиотека. Жаль, что в то время, я ни как не мог въехать в прелесть ООП и библиотека по сути состояла из объектов, но представленных весьма специфично ;) (т.е. каждый объект был записью которая манипулировалась неким множеством процедур и функций). Программа расчета &lt;a href="http://kazantsev.nm.ru/images/m2.png" target="_new" atomicselection="true"&gt;&lt;img height="144" src="http://kazantsev.nm.ru/blogimages/008ceb05753d_112CF/m26.png" width="192" align="left"&gt;&lt;/a&gt;&amp;nbsp;имела возможность создавать архивные копии данных при переходе на новый месяц, была предусмотрена система справочников, а для простоты изменения алгоритма расчета мне пришлось добавить поддержку формул, для чего был написан синтаксический анализатор (как же мне было трудно и интересно ;))&lt;a href="http://kazantsev.nm.ru/images/m3.png" target="_new" atomicselection="true"&gt;&lt;img height="144" src="http://kazantsev.nm.ru/blogimages/008ceb05753d_112CF/m36.png" width="192" align="left"&gt;&lt;/a&gt;&amp;nbsp;По интерфейсу&amp;nbsp;было решено закосить под недавно вышедшую Windows 98, отсюда и название такое ;) Мне даже было не влом сделать поддержку цветовых схем аля Windows (см. следующий скриншот)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://kazantsev.nm.ru/images/m4.png" target="_new" atomicselection="true"&gt;&lt;img height="144" src="http://kazantsev.nm.ru/blogimages/008ceb05753d_112CF/m4.png" width="192" align="left"&gt;&lt;/a&gt; &lt;p&gt;&lt;a href="http://kazantsev.nm.ru/images/m5.png" target="_new" atomicselection="true"&gt;&lt;img height="144" src="http://kazantsev.nm.ru/blogimages/008ceb05753d_112CF/m57.png" width="192" align="left"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Программа получилась даже очень ничего ;) и была внедрена в одной из воинских частей, за что я был премирован новой шоколадной "афганкой" (кто служил тот поймет ;) Вот этим я занимался в армии :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-6831001499325575535?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/6831001499325575535/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=6831001499325575535' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6831001499325575535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/6831001499325575535'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/01/blog-post_14.html' title='Что делают в армии?'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-3929157883403737858</id><published>2007-01-11T16:35:00.001-08:00</published><updated>2007-01-11T16:35:50.999-08:00</updated><title type='text'>Ностальгия...</title><content type='html'>&lt;p&gt;Сегодня наткнулся на скриншоты своей (ну писал-то я ее не один, нас было двое, но скрины только моего творчества ;)) первой и единственной корпоративной (как это модно сейчас называть) системы. Чего-то воспоминания нахлынули... В общем вот:&lt;/p&gt; &lt;p&gt;Это диалог регистрации пользователя в системе, где помимо обычных в этом деле&amp;nbsp;&amp;nbsp;&lt;a href="http://kazantsev.nm.ru/images/login.png" target="_new" atomicselection="true"&gt;&lt;img height="127" alt="Диалог регистрации" src="http://kazantsev.nm.ru/blogimages/d17d03b8f585_2C32/login15.png" width="192" align="left"&gt;&lt;/a&gt;полей можно было указать еще псевдоним базы данных к которой будет производится подключение. Это было очень удобно для разработки (а она непрерывно велась в процессе эксплуатации системы) т.к. все спорные моменты и приемы отлаживались на тестовой базе, а при опасных манипуляциях можно было подключиться и вовсе к резервному серверу :).&lt;/p&gt; &lt;p&gt;Далее опишу, как происходило обновление клиентских приложений.&lt;a href="http://kazantsev.nm.ru/images/onlineupdate.png" target="_new" atomicselection="true"&gt;&lt;img height="140" alt="Диалог обновления" src="http://kazantsev.nm.ru/blogimages/d17d03b8f585_2C32/onlineupdate9.png" width="192" align="left"&gt;&lt;/a&gt; Ввиду того, клиентские места были очень сильно разбросаны территориально (удаленные цеха, промыслы. самый дальний ~120км), проблема обновления ПО не решалась методом беготни с дискеткой по офисному зданию. Поэтому соответствующий функционал был заложен в серверную часть еще на стадии проектирования. Реализовано все было очень просто: сервер имел самые последние версии исполняемых модулей, разработчик делая билд (т.е. увеличивая версию) при подключении к серверу публиковал измененный модуль. Когда клиент подключался к серверу, тот проверял версии модулей клиента и имеющиеся у него новые и в случае необходимости, клиенту сливались обновленные версии.&lt;/p&gt; &lt;p&gt;Процесс публикации отражен на следующем скрине:&lt;/p&gt; &lt;p&gt;&lt;a href="http://kazantsev.nm.ru/images/serverexample.png" target="_new" atomicselection="true"&gt;&lt;img height="144" alt="Пример UI сервера" src="http://kazantsev.nm.ru/blogimages/d17d03b8f585_2C32/serverexample6.png" width="192" align="left"&gt;&lt;/a&gt;Это не боевой сервер, скрин был сделан специально для демонстрации состояний клиентских подключений. В динамике все выглядело очень эффектно :), при каждом новом запросе, мониторчик клиента мигал, было сказачно красиво ;).&lt;/p&gt; &lt;p&gt;Моим первым приложением был "Электронный табель" позволявший на местах (в цехах, на промыслах) вести электронный учет рабочего времени, что позволяло отделу кадров оперативно отслеживать ситуацию на рабочих местах и вносить соответствующие коррективы. Но скрина этого приложения у меня не сохранилось, вместо него публикую скрин приложения "Отдел труда и зарплаты",&lt;a href="http://kazantsev.nm.ru/images/dts.png" target="_new" atomicselection="true"&gt;&lt;img height="144" alt="ОТиЗП" src="http://kazantsev.nm.ru/blogimages/d17d03b8f585_2C32/dts6.png" width="192" align="left"&gt;&lt;/a&gt; которое полностью повторяло функционал ведения табеля, но кроме этого делало еще массу полезных вещей :). На этом скрине видно большое меню, которое формировалось&amp;nbsp; (т.е. выполнялся весьма приличный запрос к серверу и по результатам строилось меню) в момент клика пользователем на соответствующем пункте. Работало очень даже шустро :)&lt;/p&gt; &lt;p&gt;Затем было написано приложение "Банковские операции", но его скрина у меня тоже не сохранилось. После отработки по банкам, я сел за приложение "Кассовые операции", скрин которого приведен ниже.&lt;a href="http://kazantsev.nm.ru/images/cashdept.png" target="_new" atomicselection="true"&gt;&lt;img height="144" alt="Кассовые операции" src="http://kazantsev.nm.ru/blogimages/d17d03b8f585_2C32/cashdept12.png" width="192" align="left"&gt;&lt;/a&gt; Это было достаточно простое приложение, но в нем был один интересный (в то время) для меня момент: его нужно было интегрировать с веб-сервером разработчиков (т.е. не корпоративным, а именно девелоперским, т.е. нашим) т.к. на сервере работал скрипт завязаный на сторонний софт, и тащить тот софт на клиента не было ни какого желания (это только добавило бы головной боли). Почему именно веб? А почему нет! :)&lt;/p&gt; &lt;p&gt;Затем мне пришлось возвращаться к старой теме (дело в том, что ранее я уже писал для этой конторы сию прилагу, но только под ДОС, и по договору т.е. я там еще не работал) и писать приложение "Подотчет".&lt;a href="http://kazantsev.nm.ru/images/subr.png" target="_new" atomicselection="true"&gt;&lt;img height="144" alt="Подотчет" src="http://kazantsev.nm.ru/blogimages/d17d03b8f585_2C32/subr6.png" width="192" align="left"&gt;&lt;/a&gt; Изюминкой этой работы для меня стала реализация "мультиформенного" приложения т.е. приложения без главной формы (office2000 like). Решилась проблема достаточно просто и эффективно, правда пришлось сильно попотеть изучая механизмы взаимодействия различных частей VCL, чтоб обеспечить корректность работы в таком режиме. Особенно это касалось модальности окна только для активной формы.&lt;/p&gt; &lt;p&gt;Ну и наконец скрин боевого сервера&lt;a href="http://kazantsev.nm.ru/images/securitywork.png" target="_new" atomicselection="true"&gt;&lt;img height="144" alt="Боевой сервер" src="http://kazantsev.nm.ru/blogimages/d17d03b8f585_2C32/securitywork6.png" width="185" align="left"&gt;&lt;/a&gt;. На скрине открыт диалог настройки с назначением прав пользователя. Пользовательская база была интегрирована с базой MS-SQL&amp;nbsp;на котором и крутилась вся система. На SQL сервере было всего 25 лицензий, но за счет серверной части нашей системы (т.е. по сути ее второго уровня) на этих лицензиях работало ~70 целовек :) (я делал стресс-тестирование, сервер выдержал 150 подключений, но не выдержала моя рабочая машинка :)) &amp;nbsp;Я тогда считал,&amp;nbsp;мы экономили для конторы примерно $20К :) (сейчас вероятно цена уже не актуальна). Сервер вел подробнейшие логи работы пользователей, все запросы падали в лог, поэтому мы всегда могли отыскать любые концы :) (и это было важно ввиду некоей борьбы между двумя отделами). Т.к. система работала на BSS (Borland Socket Server) (знаю, что плохо, но это был единственный приемлемый вариант) у нас были частые проблемы с обрывами связи (т.к. сам BSS кривой, да и инфраструктура нашей сети была далека от идеала), поэтому в серверную и клиентскую части был добавлен функционал обеспечивающий механизм сессий и решавший таким образом проблемы с обрывами.&lt;/p&gt; &lt;p&gt;Кроме перечисленных, были написаны и другие приложения, скорее для разработчика нежели для пользователя, но из-за их незначительности упоминания они не удостаиваются. &amp;nbsp;Вот :) Пис&lt;em&gt;а&lt;/em&gt;ть замаялся ;)&lt;/p&gt; &lt;p&gt;p.s. Еще и армейскую работу вспомнить, чтоль...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-3929157883403737858?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/3929157883403737858/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=3929157883403737858' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3929157883403737858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3929157883403737858'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/01/blog-post_11.html' title='Ностальгия...'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-3142753268458052476</id><published>2007-01-11T05:12:00.001-08:00</published><updated>2007-01-11T05:12:45.553-08:00</updated><title type='text'>Еще один Free</title><content type='html'>Обнаружил, что &lt;a href="http://www.pbear.com/" target="_blank"&gt;HTML Display Components&lt;/a&gt; стали бесплатными! Идеальное решение для HTML-интерфейса или отчетов в приложениях. К плюсам можно отнести независимость от сторонних движков и их версий, вследстие чего, однозначное отображение на любой системе. К минусам -&amp;nbsp;не самое быстрое&amp;nbsp;форматирование контента и скромные возможности управления внутренними объектами вследствие отсутствия поддержки DOM. Но мне, все равно, очень нравится ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-3142753268458052476?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/3142753268458052476/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=3142753268458052476' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3142753268458052476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3142753268458052476'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/01/free.html' title='Еще один Free'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-3814705720761146846</id><published>2007-01-01T05:06:00.001-08:00</published><updated>2007-01-01T05:06:19.942-08:00</updated><title type='text'>Снова о пакетах...</title><content type='html'>&lt;p&gt;На &lt;a href="http://kazantsev.nm.ru/"&gt;домашней страничке&lt;/a&gt; добавлена инструкция по установке пакетов в Turbo Delphi Explorer. 100% работающая, сам пользуюсь.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-3814705720761146846?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/3814705720761146846/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=3814705720761146846' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3814705720761146846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/3814705720761146846'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2007/01/blog-post.html' title='Снова о пакетах...'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-8628463606249217281</id><published>2006-12-28T23:32:00.001-08:00</published><updated>2006-12-28T23:32:56.113-08:00</updated><title type='text'>Инструменты, которые Free</title><content type='html'>&lt;p&gt;Скорее речь даже не об инструментальных средствах разработчика, а о free-софте вообще. После выхода Turbo Delphi Explorer (которая free) у меня появилось желание если не отказаться от проприетарного софта совсем, то хотя бы свести его использование к минимуму. Как раз к этому моменту, вдоволь наэкспериментировавшись с Вистой (коею пользоваться не собираюсь, но в курсе быть нужно), решил начать с чистого листа, т.е. винта :) Вставил рекавери в свою Тошу и согласился на все, что мне предложили ;).&lt;/p&gt; &lt;p&gt;Итак:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;ОС - лицензионная XP Pro SP2.  &lt;li&gt;Браузер - Опера 9  &lt;li&gt;Почта - Опера 9  &lt;li&gt;Качалка - WinWGet (оболочка над консольной wget)  &lt;li&gt;Аська - QIP  &lt;li&gt;Блог-клиент - Windows Live Writer  &lt;li&gt;Музычка - foobar 2000  &lt;li&gt;Видео - Media Player Classic  &lt;li&gt;Офис - OpenOffice (мне очень понравился)  &lt;li&gt;CD писалка - с Тошей в комплекте идет&amp;nbsp;Drag'n Drop CD+DVD (рядом поставил CDBurnerXP 3 Pro)  &lt;li&gt;CD-виртуализатор - Алкоголь 120% (вечный триал ;) ибо мне хватает 3 дисков из 6 доступных)  &lt;li&gt;Графика - GIMP, PhotoFiltre, XnView  &lt;li&gt;3D - Blender  &lt;li&gt;Веб-дизайн - Nvu (мне показался удобнее дрима :)  &lt;li&gt;Виртуалка - Microsoft Virtual PC 2004 (она же free!!!)  &lt;li&gt;Архиватор - 7zip  &lt;li&gt;Файл-менеджер - Far  &lt;li&gt;Файрвол - Jetico Personal Firewall  &lt;li&gt;Антивирус - Dr.Web CureIT!  &lt;li&gt;Секурность - TrueCrypt  &lt;li&gt;Программирование - Turbo Delphi Explorer, Ada GNAT  &lt;li&gt;СУБД - FireBird (у него же есть embedded версия!!!&amp;nbsp;;) средство администрирования - IBExpert (для русских free!!!) (смотрел еще на Interbase Development Studio, но что-то она глючновата...)  &lt;li&gt;Инсталь-мейкер - InnoSetup  &lt;li&gt;Компоненты - множество бесплатных и разных ;) Условие только одно - наличие исходников. Очень нравятся: Synapse, UIB, ToolBar2000&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Чему не нашел замены (может посоветует кто...):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Macromedia Fireworks (правда я его использовал не по назначению, а именно, как обычную рисовалку (т.е. его веб-ориентация меня мало интересовала). Может глянуть на Inscape или, как его там...)  &lt;li&gt;AWIcons Pro - отличный редактор иконок  &lt;li&gt;ReGet WebSynchronizer - отличный синхронизатор (я им бэкапы исходников делаю :)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-8628463606249217281?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/8628463606249217281/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=8628463606249217281' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8628463606249217281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/8628463606249217281'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2006/12/free.html' title='Инструменты, которые Free'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-7123725205532076124</id><published>2006-12-19T01:12:00.001-08:00</published><updated>2006-12-19T01:12:51.855-08:00</updated><title type='text'>И снова пакеты в Turbo Delphi Explorer</title><content type='html'>&lt;p&gt;Ранее я уже писал о&amp;nbsp;процессе подключения пакетов в Turbo Delphi Explorer, а теперь &lt;a href="http://kazantsev.nm.ru/packloader.zip"&gt;выкладываю&lt;/a&gt; модуль делающий это без необходимости саморегистрации подключаемых пакетов.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-7123725205532076124?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/7123725205532076124/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=7123725205532076124' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7123725205532076124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/7123725205532076124'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2006/12/turbo-delphi-explorer.html' title='И снова пакеты в Turbo Delphi Explorer'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-116344836366434109</id><published>2006-11-13T12:06:00.000-08:00</published><updated>2006-11-13T12:12:50.613-08:00</updated><title type='text'>Ловкость рук, и ни какого мошенства</title><content type='html'>&lt;p&gt;&lt;strong&gt;Задача&lt;/strong&gt;: дан класс имеющий приватный &lt;strong&gt;TThreadList&lt;/strong&gt; (список с&amp;nbsp;thread-safe доступом) и содержащий некие объекты. Нужно написать&amp;nbsp;метод предоставляющий безопасный доступ к содержимому списка, без доступа пользователя к объекту-списку.&lt;/p&gt; &lt;p&gt;На первый взгляд задача совсем не простая т.к. для того чтоб обеспечить безопасный доступ необходимо вызывать методы блокировки/разблокировки объекта-списка, а условия нам этого не позволяют. На помощь приходят... интерфейсы (ну если быть точным, то лишь механизм подсчета их ссылок).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Решение&lt;/strong&gt;: Определяем интерфейс &lt;strong&gt;IObjectProvider, &lt;/strong&gt;который будет возвращать наш метод.&lt;/p&gt;&lt;pre&gt;Type&lt;br /&gt;&lt;br /&gt; IObjectProvider = Interface&lt;br /&gt;&lt;br /&gt;  Function GetObject : TObject;&lt;br /&gt;&lt;br /&gt;  Property Object : TObject Read GetObject;&lt;br /&gt;&lt;br /&gt; End;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Затем описываем класс &lt;strong&gt;TObjectProvider&lt;/strong&gt;, который реализует описанный ранее интефейс.&lt;/p&gt;&lt;pre&gt;Type&lt;br /&gt;&lt;br /&gt; //&lt;br /&gt; TObjectProvider = Class(TInterfacedObject, IObjectProvider)&lt;br /&gt;&lt;br /&gt;  Private&lt;br /&gt;&lt;br /&gt;   FList   : TThreadList;&lt;br /&gt;   FObject : TObject;&lt;br /&gt;&lt;br /&gt;  Public&lt;br /&gt;&lt;br /&gt;   Constructor Create(Const AList : TThreadList; AIndex : Integer);&lt;br /&gt;   Destructor Destroy; Override;&lt;br /&gt;&lt;br /&gt;   Function GetObject : TObject;&lt;br /&gt;&lt;br /&gt; End;&lt;br /&gt; //&lt;br /&gt;&lt;br /&gt; // Реализация конструктора&lt;br /&gt; Begin&lt;br /&gt;&lt;br /&gt;  FList   := AList;&lt;br /&gt;  FObject := TObject(FList.LockList.Items[AIndex]);&lt;br /&gt;  &lt;br /&gt; End;&lt;br /&gt; //&lt;br /&gt;&lt;br /&gt; // Реализация деструктора&lt;br /&gt; Begin&lt;br /&gt;&lt;br /&gt;  FList.UnlockList;&lt;br /&gt;  Inherited;&lt;br /&gt;&lt;br /&gt; End;&lt;br /&gt; //&lt;br /&gt;&lt;br /&gt; // Реализация метода GetObject&lt;br /&gt; Begin&lt;br /&gt;  &lt;br /&gt;  Result := FObject;&lt;br /&gt;&lt;br /&gt; End;&lt;br /&gt; //&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Теперь можно реализовать и наш метод:&lt;/p&gt;&lt;pre&gt;Function SafeGetObject(AIndex : Integer) : IObjectProvider;&lt;br /&gt;Begin&lt;br /&gt;&lt;br /&gt; Result := TObjectProvider.Create(ThreadSafeList, AIndex);&lt;br /&gt;&lt;br /&gt;End;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Как видно из кода, метод возвращает не сам объект, а интерфейс объекта-провайдера, для обеспечения безопасности. Пользователь вызвав метод и раскрыв его оператором &lt;strong&gt;with&lt;/strong&gt;, получает в эксклюзивное пользование затребованный объект, а после завершения работы с объектом сработает механизм подсчета ссылок и будет вызван деструктор объекта-провайдера, который в свою очередь разблокирует список, после чего объект-провайдер будет разрушен.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Пример&lt;/strong&gt;:&lt;/p&gt;&lt;pre&gt;With SafeGetObject(5) Do&lt;br /&gt; Begin&lt;br /&gt;&lt;br /&gt;  Object.Method;&lt;br /&gt;  ...&lt;br /&gt;  Object.Method;&lt;br /&gt;&lt;br /&gt; End;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-116344836366434109?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/116344836366434109/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=116344836366434109' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/116344836366434109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/116344836366434109'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2006/11/blog-post_13.html' title='Ловкость рук, и ни какого мошенства'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-116329207185852982</id><published>2006-11-11T16:41:00.000-08:00</published><updated>2006-11-13T12:12:50.416-08:00</updated><title type='text'>Выравнивание вариантной части</title><content type='html'>&lt;p&gt;Сегодня столкнулся с интересной штукой: вариантные поля (описанные с использованием &lt;strong&gt;case&lt;/strong&gt;) записи могут быть выровнены по разному (ну компилятору ес-но виднее). В смысле не гарантируется что начало каждого вариантного поля будет сразу после последнего описанного не вариантного (или начала записи). Об этом, по большому счету, можно и не беспокоится до тех пор пока не придется обращаться к полям по смещению ;). Но об этом нужно помнить и быть аккуратным.&lt;/p&gt; &lt;p&gt;p.s. На packed записях не проверял.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-116329207185852982?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/116329207185852982/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=116329207185852982' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/116329207185852982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/116329207185852982'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2006/11/blog-post.html' title='Выравнивание вариантной части'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-116215830062591398</id><published>2006-10-29T13:45:00.000-08:00</published><updated>2006-11-13T12:12:50.175-08:00</updated><title type='text'>Заменитель Indy</title><content type='html'>Не так давно открыл для себя сетевую библиотеку &lt;a href="http://synapse.ararat.cz/" target="_blank"&gt;Synapse.&lt;/a&gt; Ощущения самые положительные. В отличии от монстра по имени Indy, Synapse являет собой легкую и элегантную оболочку над сетевой инфраструктурой сокетов. В настоящий момент, на ее основе, мною&amp;nbsp;создаются транспортные уровни клиента и сервера XML-RPC (правда реализация на Indy, тоже предусматривается ;))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-116215830062591398?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/116215830062591398/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=116215830062591398' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/116215830062591398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/116215830062591398'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2006/10/indy.html' title='Заменитель Indy'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33057655.post-116215789921251976</id><published>2006-10-29T13:38:00.000-08:00</published><updated>2006-11-13T12:12:49.943-08:00</updated><title type='text'>Глюкобага. Очередная...</title><content type='html'>&lt;p&gt;Заколебало :( Сегодня снова столкнулся с очень неприятной багой компилятора (бага старая и ранее я ее описывал на iXBT).&lt;/p&gt; &lt;p&gt;Объявляем вложенный тип в записи. Пытаемся объявить поле данного типа и получаем от компилятора пламенный привет. А вот свойства объявленного вложенного типа определяются на ура. Есть workaround: объявить поле с типом допускающим приведение к объявленному, объявить свойство&amp;nbsp;проблемного типа и в методах доступа (read/write) производить приведение типов (поле&amp;nbsp;к свойству/свойство к полю). Дабы устранить оверхэд методов, объявить их, как &amp;nbsp;&lt;strong&gt;inline.&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33057655-116215789921251976?l=kazav.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kazav.blogspot.com/feeds/116215789921251976/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33057655&amp;postID=116215789921251976' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/116215789921251976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33057655/posts/default/116215789921251976'/><link rel='alternate' type='text/html' href='http://kazav.blogspot.com/2006/10/blog-post_29.html' title='Глюкобага. Очередная...'/><author><name>Kazantsev Alexey</name><uri>http://www.blogger.com/profile/14086309924481739588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://kazantsev.nm.ru/images/myphoto.png'/></author><thr:total>0</thr:total></entry></feed>
