<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Роман.Янковский.me</title>
	<atom:link href="http://roman.yankovsky.me/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://roman.yankovsky.me</link>
	<description>Tuo tibi iudicio est utendum</description>
	<lastBuildDate>Mon, 31 Dec 2018 14:52:20 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.4.33</generator>
	<item>
		<title>Итоги 2018</title>
		<link>http://roman.yankovsky.me/?p=1874</link>
		<comments>http://roman.yankovsky.me/?p=1874#respond</comments>
		<pubDate>Mon, 31 Dec 2018 14:52:20 +0000</pubDate>
		<dc:creator><![CDATA[Роман Янковский]]></dc:creator>
				<category><![CDATA[Жизнь]]></category>

		<guid isPermaLink="false">http://roman.yankovsky.me/?p=1874</guid>
		<description><![CDATA[Пришла пора подвести итоги 2018 года. Год получился каким-то незаконченным. Очень многое, что хотелось бы сделать, сделать не удалось. Меньше удалось прочитать, меньше куда-то сходить, меньше куда-то съездить. Надеюсь, в 2019 году удастся взять ситуацию в свои руки. Немного списков. Сначала прочитанное за прошедший год. По статистике электронной читалки: 12 книг закончено 84 часа 3840 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Пришла пора подвести итоги 2018 года. Год получился каким-то незаконченным. Очень многое, что хотелось бы сделать, сделать не удалось. Меньше удалось прочитать, меньше куда-то сходить, меньше куда-то съездить. Надеюсь, в 2019 году удастся взять ситуацию в свои руки.</p>
<p>Немного списков. Сначала прочитанное за прошедший год. </p>
<p>По статистике электронной читалки:</p>
<ul>
<li>12 книг закончено</li>
<li>84 часа</li>
<li>3840 бумажных страниц</li>
</ul>
<p>Список (жирным выделил то, что рекомендую):</p>
<ol>
<li>Елена Котова. Откуда берутся деньги, Карл?</li>
<li>Уильям Шекспир. Гамлет, принц датский</li>
<li>Александр Дружинин. Полинька Сакс</li>
<li>Николай Лесков. Леди Макбет Мценского уезда</li>
<li>Александр Островский. Гроза</li>
<li>Александр Островский. Бесприданница</li>
<li><strong>Людмила Петрушевская. Время ночь</strong></li>
<li>Массимо Пильюччи. Как быть стоиком. Античная философия и современная жизнь</li>
<li>Коллектив авторов. Горожанин. Что мы знаем о жителе большого города</li>
<li><strong>Лев Толстой. Смерть Ивана Ильича</strong></li>
<li><strong>Герман Гессе. Степной волк</strong></li>
<li>Саша Соколов. Школа для дураков</li>
</ol>
<p>Статистика перелетов из FLIO:</p>
<ul>
<li>Километры: 22962</li>
<li>Полёты: 17</li>
<li>Аэропорты: 10</li>
<li>Страны: 7</li>
</ul>
<p>Посоветуйте еще какие-нибудь приложения для статистики :)</p>
<p>С новым годом!</p>
]]></content:encoded>
			<wfw:commentRss>http://roman.yankovsky.me/?feed=rss2&#038;p=1874</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Прочитанное за 2017 год</title>
		<link>http://roman.yankovsky.me/?p=1870</link>
		<comments>http://roman.yankovsky.me/?p=1870#respond</comments>
		<pubDate>Mon, 25 Dec 2017 10:24:24 +0000</pubDate>
		<dc:creator><![CDATA[Роман Янковский]]></dc:creator>
				<category><![CDATA[Жизнь]]></category>

		<guid isPermaLink="false">http://roman.yankovsky.me/?p=1870</guid>
		<description><![CDATA[Прочитанное за прошедший год. Вряд ли я успею что-то в этот список добавить, поэтому пора подводить итоги. Несколько книг я не дочитал, какие-то из них я дочитаю, какие-то нет, но в список они не включены. Жирным я выделил то, что рекомендую. По статистике электронной читалки: 18 книг закончено 181 час 10046 бумажных страниц Список: Агата [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Прочитанное за прошедший год. Вряд ли я успею что-то в этот список добавить, поэтому пора подводить итоги. Несколько книг я не дочитал, какие-то из них я дочитаю, какие-то нет, но в список они не включены. Жирным я выделил то, что рекомендую.</p>
<p>По статистике электронной читалки:</p>
<ul>
<li>18 книг закончено</li>
<li>181 час</li>
<li>10046 бумажных страниц</li>
</ul>
<p>Список:</p>
<ol>
<li>Агата Кристи. Убийство Роджера Экройда</li>
<li>Агата Кристи. Свидание со смертью</li>
<li>Иосиф Бродский. Как читать книгу</li>
<li>Агата Кристи. Часы</li>
<li><strong>Мариша Пессл. Некоторые вопросы теории катастроф</strong></li>
<li><strong>Мариша Пессл. Ночное кино</strong></li>
<li><strong>Герман Гессе. Душа ребенка</strong></li>
<li><strong>Герман Гессе. Сиддхартха</strong></li>
<li>Робин Слоун. Круглосуточный книжный мистера Пенумбры</li>
<li>Олдос Хаксли. Остров</li>
<li><strong>Олдос Хаксли. Двери восприятия. Рай и ад</strong></li>
<li>Стивен Бэчелор. Что такое буддизм? Как жить по принципам Будды</li>
<li><strong>Юлия Гиппенрейтер. Общаться с ребенком. Как?</strong></li>
<li><strong>Александр Роднянский. Выходит продюсер</strong></li>
<li><strong>Лев Троцкий. Преданная революция: Что такое СССР и куда он идет?</strong></li>
<li><strong>Лев Толстой. Чем люди живы</strong></li>
<li>Лев Толстой. Карма</li>
<li><strong>Лев Толстой. Семейное счастье</strong></li>
</ol>
<p>Открытия года для меня: Мариша Пессл, Герман Гессе и Лев Троцкий.</p>
]]></content:encoded>
			<wfw:commentRss>http://roman.yankovsky.me/?feed=rss2&#038;p=1870</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delphi Cookbook &#8212; Second Edition</title>
		<link>http://roman.yankovsky.me/?p=1834</link>
		<comments>http://roman.yankovsky.me/?p=1834#comments</comments>
		<pubDate>Wed, 30 Mar 2016 13:00:48 +0000</pubDate>
		<dc:creator><![CDATA[Роман Янковский]]></dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://roman.yankovsky.me/?p=1834</guid>
		<description><![CDATA[Где-то ближе к концу весны запланирован выход второго издания книги Delphi Cookbook (уже доступен предзаказ). Мне посчастливилось эту книгу рецензировать. Это был очень интересный процесс, удалось заглянуть одним глазком за кулисы книгоиздания. В общем, я с большим удовольствием ее прочитал. Как любая поваренная книга (&#171;cookbook&#187; все-таки), эта книга представляет собой сборник рецептов. Рецепты совершенно разнообразные [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="https://www.packtpub.com/application-development/delphi-cookbook-second-edition"><img class="alignleft" src="http://www.danieleteti.it/wp-content/uploads/2016/02/B04677_MockupCover_Cookbook.png" alt="" width="150"  /></a> Где-то ближе к концу весны запланирован выход второго издания книги Delphi Cookbook (уже доступен предзаказ). Мне посчастливилось эту книгу рецензировать. Это был очень интересный процесс, удалось заглянуть одним глазком за кулисы книгоиздания.</p>
<p>В общем, я с большим удовольствием ее прочитал.</p>
<p>Как любая поваренная книга (&#171;cookbook&#187; все-таки), эта книга представляет собой сборник рецептов. Рецепты совершенно разнообразные &#8212; от использования стилей в VCL, до рисования нестандартных вещей в FMX ListView, от примеров функционального программирования в Delphi до импорта Java-библиотек на андроиде. Более 60 рецептов, если верить обложке :)</p>
<p>Лично меня эта книга заинтересовала в первую очередь не столько сутью самих рецептов, сколько тем фактом, что автор для решения поставленных задач использует все нововведения Delphi, какие только возможно. За этим очень интересно наблюдать. Delphi в последние годы развивается быстро и не всегда отдаешь себе отчет в том, сколько же всего нового появилось в свежих версиях.</p>
<p>Поэтому я рекомендую Delphi Cookbook в первую очередь тем, кто все еще работает со старыми версиям Delphi и хочет поближе приглядеться к нововведениям. Хотя и те, кто работает с новыми версиями, тоже найдут, чем расширить свой кругозор.</p>
<p>Хороших книг о Delphi в последнее время довольно мало издается. Так что новость довольно позитивная, на мой взгляд.</p>
]]></content:encoded>
			<wfw:commentRss>http://roman.yankovsky.me/?feed=rss2&#038;p=1834</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Сокращение в московском офисе Embarcadero</title>
		<link>http://roman.yankovsky.me/?p=1829</link>
		<comments>http://roman.yankovsky.me/?p=1829#comments</comments>
		<pubDate>Wed, 30 Dec 2015 13:17:18 +0000</pubDate>
		<dc:creator><![CDATA[Роман Янковский]]></dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://roman.yankovsky.me/?p=1829</guid>
		<description><![CDATA[Сегодня в московском офисе Embarcadero произошло сокращение. Офис покинули Денис Васильев (менеджер по продуктам RAD Studio), Сергей Терлецкий (менеджер по образованию), Алексей Голопяткин (менеджер по СНГ), Екатерина Макарова (маркетинг). То есть 50% работавших в московском офисе. Можно считать это первыми действиями нового менеджмента из Idera. К лучшему оно или нет, мы узнаем потом. Но что [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Сегодня в московском офисе Embarcadero произошло сокращение. Офис покинули Денис Васильев (менеджер по продуктам RAD Studio), Сергей Терлецкий (менеджер по образованию), Алексей Голопяткин (менеджер по СНГ), Екатерина Макарова (маркетинг). То есть 50% работавших в московском офисе.</p>
<p>Можно считать это первыми действиями нового менеджмента из Idera. К лучшему оно или нет, мы узнаем потом. Но что будет с презентациями Delphi, вебинарами и т.п. на русском языке теперь совсем непонятно. </p>
<p>Пожелаем Денису, Сергею, Алексею и Екатерине удачи в дальнейшей карьере!</p>
]]></content:encoded>
			<wfw:commentRss>http://roman.yankovsky.me/?feed=rss2&#038;p=1829</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>FixInsight &#038; Parnassus Navigator</title>
		<link>http://roman.yankovsky.me/?p=1825</link>
		<comments>http://roman.yankovsky.me/?p=1825#comments</comments>
		<pubDate>Tue, 01 Dec 2015 13:55:37 +0000</pubDate>
		<dc:creator><![CDATA[Роман Янковский]]></dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://roman.yankovsky.me/?p=1825</guid>
		<description><![CDATA[Хочу анонсировать новогоднее предложение. В декабре два плагина для Delphi &#8212; FixInsight и Parnassus Navigator &#8212; можно получить по цене одного. Про Parnassus Navigator я уже писал. Очень интересная штука, действительно упрощает повседневную жизнь. Ускоряет навигацию в коде. С учетом того, что у FixInsight для России специальная цена, все это вместе делает новогоднее предложение особенно [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Хочу анонсировать новогоднее предложение. </p>
<p>В декабре два плагина для Delphi &#8212; FixInsight и Parnassus Navigator &#8212; можно получить по цене одного. Про <a href="http://roman.yankovsky.me/?p=1790">Parnassus Navigator</a> я уже писал. Очень интересная штука, действительно упрощает повседневную жизнь. Ускоряет навигацию в коде.</p>
<p>С учетом того, что у FixInsight для России специальная цена, все это вместе делает новогоднее предложение особенно выгодным. Вряд ли такое можно встретить где-то еще. Ссылка вот: <a href="http://sourceoddity.com/fixinsight/order.html">http://sourceoddity.com/fixinsight/order.html</a></p>
<p>С наступающим поздравлять пока рано! НО. Но вы можете поздравить меня с днем рожденья :)</p>
]]></content:encoded>
			<wfw:commentRss>http://roman.yankovsky.me/?feed=rss2&#038;p=1825</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Вебинар об FixInsight</title>
		<link>http://roman.yankovsky.me/?p=1820</link>
		<comments>http://roman.yankovsky.me/?p=1820#comments</comments>
		<pubDate>Wed, 29 Jul 2015 15:24:42 +0000</pubDate>
		<dc:creator><![CDATA[Роман Янковский]]></dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://roman.yankovsky.me/?p=1820</guid>
		<description><![CDATA[Сегодня состоялся вебинар о статическом анализе и об FixInsight в частности. У меня не большой опыт подобных выступлений, но вроде бы получилось неплохо. Хотя звук получился так себе. Посмотреть запись можно на ютубе: А сама презентация вот:]]></description>
				<content:encoded><![CDATA[<p>Сегодня состоялся вебинар о статическом анализе и об FixInsight в частности. У меня не большой опыт подобных выступлений, но вроде бы получилось неплохо. Хотя звук получился так себе.</p>
<p>Посмотреть запись можно на ютубе:</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/A2R34URarpA" frameborder="0" allowfullscreen></iframe></p>
<p>А сама презентация вот:</p>
<p><iframe src="//www.slideshare.net/slideshow/embed_code/key/NHAk2pxLg3dcGN" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://roman.yankovsky.me/?feed=rss2&#038;p=1820</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Parnassus Navigator</title>
		<link>http://roman.yankovsky.me/?p=1790</link>
		<comments>http://roman.yankovsky.me/?p=1790#comments</comments>
		<pubDate>Thu, 02 Jul 2015 21:25:02 +0000</pubDate>
		<dc:creator><![CDATA[Роман Янковский]]></dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://roman.yankovsky.me/?p=1790</guid>
		<description><![CDATA[Товарищ Дэвид Миллингтон написал крутой новый плагин для Delphi. Скачать его можно тут, а в блоге автора есть подробное описание. Я не буду его пересказывать, я буду краток. Во-первых, Navigator позволяет быстро перемещаться по модулю с помощью нового поискового окна. Раньше я постоянно нажимал CTRL+F, вводил текст, а потом F3 F3 F3&#8230; А кто так [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Товарищ Дэвид Миллингтон написал крутой новый плагин для Delphi. Скачать его можно <a href="https://parnassus.co/delphi-tools/parnassus-navigator/">тут</a>, а в <a href="https://parnassus.co/parnassus-navigator-a-new-delphi-plugin/">блоге автора есть подробное описание</a>. Я не буду его пересказывать, я буду краток.</p>
<p>Во-первых, Navigator позволяет быстро перемещаться по модулю с помощью нового поискового окна. Раньше я постоянно нажимал CTRL+F, вводил текст, а потом F3 F3 F3&#8230; А кто так не делает? С навигатором это делать намного проще.</p>
<p><img class="aligncenter size-full wp-image-1791" src="http://roman.yankovsky.me/wp-content/uploads/2015/07/2015-07-03-00-01-04-Parnassus-Navigator-Go-To.png" alt="" width="600" srcset="http://roman.yankovsky.me/wp-content/uploads/2015/07/2015-07-03-00-01-04-Parnassus-Navigator-Go-To-300x174.png 300w, http://roman.yankovsky.me/wp-content/uploads/2015/07/2015-07-03-00-01-04-Parnassus-Navigator-Go-To-1024x593.png 1024w, http://roman.yankovsky.me/wp-content/uploads/2015/07/2015-07-03-00-01-04-Parnassus-Navigator-Go-To.png 1200w" sizes="(max-width: 1200px) 100vw, 1200px" /></p>
<p>То есть можно просто ввести фрагменты слов и получить полный список подходящих идентификаторов в текущем модуле. Это могут быть не только методы и процедуры, но и сами классы, свойства классов, секции uses и т.п. Вся структура модуля как на ладони.</p>
<p>Во-вторых, там есть крутая миникарта, которая тоже помогает перемещаться по коду чуть быстрее.<br />
<img class="aligncenter size-full wp-image-1792" src="http://roman.yankovsky.me/wp-content/uploads/2015/07/2015-07-03-00-03-58-Скриншот-экрана.png" alt="" width="600" srcset="http://roman.yankovsky.me/wp-content/uploads/2015/07/2015-07-03-00-03-58-Скриншот-экрана-300x182.png 300w, http://roman.yankovsky.me/wp-content/uploads/2015/07/2015-07-03-00-03-58-Скриншот-экрана-1024x620.png 1024w, http://roman.yankovsky.me/wp-content/uploads/2015/07/2015-07-03-00-03-58-Скриншот-экрана.png 1200w" sizes="(max-width: 1200px) 100vw, 1200px" /></p>
<p>В-третьих, лично мне особенно приятно то, что это еще один интересный проект использующий мой <a href="https://github.com/RomanYankovsky/DelphiAST">DelphiAST</a>. Оказывается, многим не хватало хорошего парсера.</p>
<p>Как вам? Интересно, чего вам не достает в Delphi IDE из того, что уже есть в других средах разработки? </p>
]]></content:encoded>
			<wfw:commentRss>http://roman.yankovsky.me/?feed=rss2&#038;p=1790</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Sapiens: A Brief History of Humankind</title>
		<link>http://roman.yankovsky.me/?p=1785</link>
		<comments>http://roman.yankovsky.me/?p=1785#respond</comments>
		<pubDate>Wed, 24 Jun 2015 12:57:12 +0000</pubDate>
		<dc:creator><![CDATA[Роман Янковский]]></dc:creator>
				<category><![CDATA[Цитаты]]></category>

		<guid isPermaLink="false">http://roman.yankovsky.me/?p=1785</guid>
		<description><![CDATA[Читаю отличную книгу Ювала Ноя Харари &#171;Краткая история человечества&#187;. Позволю себе процитировать несколько отрывков. We believe in a particular order not because it is objectively true, but because believing in it enables us to cooperate effectively and forge a better society. Imagined orders are not evil conspiracies or useless mirages. Rather, they are the only [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Читаю отличную книгу <a href="http://www.amazon.com/Sapiens-A-Brief-History-Humankind/dp/0062316095">Ювала Ноя Харари &#171;Краткая история человечества&#187;</a>. Позволю себе процитировать несколько отрывков.</p>
<blockquote><p>We believe in a particular order not because it is objectively true, but because believing in it enables us to cooperate effectively and forge a better society. Imagined orders are not evil conspiracies or useless mirages. Rather, they are the only way large numbers of humans can cooperate effectively.
</p></blockquote>
<p>&#8230;</p>
<blockquote><p>It is easy to accept that Hammurabi&#8217;s Code was a myth, but we do not want to hear that human rigths are also a myth. If people realise that human rights exist only in the imagination, isn&#8217;t there a danger that our society will collapse?
</p></blockquote>
<p>&#8230;</p>
<blockquote><p>Homo sapiens has no natural rights, just as spiders, hyenas and chimpanzees have no natural rights. But don&#8217;t tell that to our servants, lest they murder us at night.
</p></blockquote>
<p>&#8230;</p>
<blockquote><p>The modern age has witnessed the rise of a number of new natural-law religions, such as libralism, Communism, capitalism, nationalism and Nazism.
</p></blockquote>
<p>&#8230;</p>
<blockquote><p>Our modern attempts to stabilise the sociopolitical order have had no choice but to rely on either of two unscientific methods: a. Take a scientific theory, and in opposition to common scientific practices, declare that it is a final and absolute truth. This was the method used by Nazis (who claimed that their racial policies were the corollaries of biological facts) and Communists (who claimed that Marx and Lenin had divined absolute economic truths that could never be refuted). b. Leave science out of it and live in accordance with a non-scientific absolute truth. This has been the strategy of liberal humanism, which is built on a dogmatic belief in the unique worth and rights of human beings &#8212; a doctrine which has embarrassingly little in common with the scientific study of Homo sapience.</p></blockquote>
<p>Очень занимательное чтиво. Крайне рекомендую.</p>
]]></content:encoded>
			<wfw:commentRss>http://roman.yankovsky.me/?feed=rss2&#038;p=1785</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FixInsight vs FMX</title>
		<link>http://roman.yankovsky.me/?p=1774</link>
		<comments>http://roman.yankovsky.me/?p=1774#comments</comments>
		<pubDate>Sat, 11 Apr 2015 11:36:10 +0000</pubDate>
		<dc:creator><![CDATA[Роман Янковский]]></dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://roman.yankovsky.me/?p=1774</guid>
		<description><![CDATA[В этом посте я продолжу анализ библиотек поставляемых с Delphi. В предыдущих сериях я рассмотрел Delphi VCL и RTL. Как обычно я постараюсь найти все самое интересное и пропущу разнообразные мелочи, иначе этот пост получится слишком длинным. Все примеры кода в этом посте касаются Delphi XE8 (версия 22.0.19027.8951). W517 Variable hides a class field, method [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>В этом посте я продолжу анализ библиотек поставляемых с Delphi. В предыдущих сериях я рассмотрел Delphi <a href="http://roman.yankovsky.me/?p=1748">VCL</a> и <a href="http://roman.yankovsky.me/?p=1766">RTL</a>. Как обычно я постараюсь найти все самое интересное и пропущу разнообразные мелочи, иначе этот пост получится слишком длинным. Все примеры кода в этом посте касаются Delphi XE8 (версия 22.0.19027.8951).</p>
<p><strong>W517 Variable hides a class field, method or property</strong></p>
<pre class="brush: delphi; first-line: 2729; highlight: [2731]; title: FMX.Controls3D.pas; notranslate">
procedure TLight.ReadDiffuse(Reader: TReader);
var
  Color: Integer;
begin
  IdentToAlphaColor(Reader.ReadIdent, Color);
  {$R-}
  Color := TAlphaColor(Color);
  {$R+}
end;
</pre>
<p>И то же самое в другом модуле.</p>
<pre class="brush: delphi; first-line: 1326; highlight: [1328]; title: FMX.Objects3D.pas; notranslate">
procedure TStrokeCube.ReadDiffuse(Reader: TReader);
var
  Color: Integer;
begin
  IdentToAlphaColor(Reader.ReadIdent, Color);
  {$R-}
  Color := TAlphaColor(Color);
  {$R+}
end;
</pre>
<p>Это одно из тех многочисленных предупреждений &#171;переменная скрывает поле класса&#187;, о которых я говорил в предыдущем посте. В этом случае мы действительно видим баг. Классы TLight и TStrokeCube имеют свойство Color (типа TAlphaColor, конечно). Так что я предполагаю, что на самом деле имелось ввиду что-то вроде &#171;Self.Color := TAlphaColor(Color)&#187;, но лучше просто переименовать переменную. Использовать одинаковые имена для переменных и полей класса &#8212; это очень плохой стиль. И Embarcadero, к сожалению, им злоупотребляет. Часто это совершенно не вредит, но иногда ведет к трудноотлавливаемым багам вроде этого. Просто посмотрите на этот код, запомните и никогда так не делайте. Никогда.</p>
<p><strong>W511 Object created in TRY block</strong></p>
<pre class="brush: delphi; first-line: 4738; highlight: [4744,4745]; title: FMX.Forms.pas; notranslate">
begin
  if ([csDesigning, csDestroying, csLoading, csUpdating] * ComponentState &lt;&gt; []) or
     (FUpdating &gt; 0) then Exit;
  { Update objects in form }
  try
    Comparer := TComparerTFmxObject.Create;
    ClientList := TTObjInfoList.Create(Comparer);
    Bucket := TDictionary&lt;TObject, TObject&gt;.Create;
    for InitiatedCount := 0 to 7 do
    begin
      if CollectActionClients(ClientList) = 0 then
        Break;
      ClientList.Sort;
      for I := 0 to ClientList.Count - 1 do
        ClientList[I].ActionClient.InitiateAction;
      ClientList.Clear;
    end;
  finally
    FreeAndNil(ClientList);
    FreeAndNil(Bucket);
  end;
end;
</pre>
<p>Приложение может вызвать исключение до того как ссылка на экземпляр класса будет присвоена переменным ClientList и/или Bucket. Это значит, что в блоке finally может быть попытка освободить объекты, которые не создавались.</p>
<p><strong>W523 Interface declared without a GUID</strong></p>
<pre class="brush: delphi; first-line: 20; title: FMX.Import.pas; notranslate">
  IModelImporter = interface
    function GetDescription: string;
    function GetExt: string;

    function LoadFromFile(const AFileName: string; out AMesh: TMeshDynArray;
      const AOwner: TComponent): Boolean;
  end;
</pre>
<pre class="brush: delphi; first-line: 22; title: FMX.Switch.iOS.pas; notranslate">
  IFMXUISwitch = interface(UISwitch)
    { Touches }
    procedure touchesBegan(touches: NSSet; withEvent: UIEvent); cdecl;
    procedure touchesCancelled(touches: NSSet; withEvent: UIEvent); cdecl;
    procedure touchesEnded(touches: NSSet; withEvent: UIEvent); cdecl;
    procedure touchesMoved(touches: NSSet; withEvent: UIEvent); cdecl;
    procedure ValueChanged; cdecl;
  end;
</pre>
<p>Не баг на самом деле, но так как интерфейсам не присвоен GUID, то они не могут быть использованы с функцией Supports или оператором As. Может быть стоит добавить GUID, почему нет?</p>
<p><strong>W510 Values on both sides of the operator are equal</strong></p>
<pre class="brush: delphi; first-line: 6833; title: FMX.ListView.pas; notranslate">
function SamePosition(const APosition1, APosition2: TPosition): Boolean; overload;
begin
  Result := (APosition1.X = APosition2.X) and (APosition1.Y = APosition1.Y);
end;
</pre>
<p>Предположу, что имелось ввиду &#171;APosition1.Y = APosition2.Y&#187;.</p>
<p><strong>W508 Variable is assigned twice successively</strong></p>
<pre class="brush: delphi; first-line: 2731; title: FMX.Materials.pas; notranslate">
  FPixelShader := TShaderManager.RegisterShaderFromData('gouraud.fps', TContextShaderKind.PixelShader, '', [
    TContextShaderSource.Create(TContextShaderArch.DX9, [
      $00, $02, $FF, $FF, $FE, $FF, $32, $00, $43, $54, $41, $42, $1C, $00, $00, $00, $9F, $00, $00, $00, $00, $02, $FF, $FF, $03, $00, $00, $00, $1C, $00, $00, $00, $00, $01, $00, $20, $98, $00, $00, $00,
// skipped
</pre>
<pre class="brush: delphi; first-line: 2801; title: FMX.Materials.pas; notranslate">
  FPixelShader := TShaderManager.RegisterShaderFromData('gouraud.fps', TContextShaderKind.PixelShader, '', [
    TContextShaderSource.Create(TContextShaderArch.DX9, [
      $00, $02, $FF, $FF, $FE, $FF, $32, $00, $43, $54, $41, $42, $1C, $00, $00, $00, $9F, $00, $00, $00, $00, $02, $FF, $FF, $03, $00, $00, $00, $1C, $00, $00, $00, $00, $01, $00, $20, $98, $00, $00, $00,
// skipped
</pre>
<p>Два одинаковых присвоения одной переменной подряд. Вероятно не баг, просто неаккуратная копипаста.</p>
<p><strong>W503 Assignment right hand side is equal to its left hand side</strong></p>
<pre class="brush: delphi; first-line: 316; highlight: [317]; title: FMX.Utils.pas; notranslate">
  if X1 &gt; X2 then
    X1 := X1;
  if Y1 &gt; Y2 then
    Y1 := Y2;
</pre>
<p>Предположу, что имелось ввиду &#171;X1 := X2&#187;.</p>
<pre class="brush: delphi; first-line: 155; highlight: [156]; title: FMX.Platform.Mac.pas; notranslate">
      if (Self.Form &lt;&gt; nil) and (Self.Form.Handle &lt;&gt; nil) then
        Self.Form := Self.Form;
</pre>
<p>Не знаю что здесь должно было быть (Self.Form здесь &#8212; это поле record&#8217;а). </p>
<p>И еще одно похожее место.</p>
<pre class="brush: delphi; first-line: 979; highlight: [982]; title: FMX.StdActns.pas; notranslate">
      if FNew.FFrequency &lt;&gt; 0 then
        FNew.FValue := Round(FNew.FValue / FNew.FFrequency) * FNew.FFrequency
      else
        FNew.FValue := FNew.FValue;
</pre>
<p><strong>W510 Values on both sides of the operator are equal</strong></p>
<pre class="brush: delphi; first-line: 1458; highlight: [1458]; title: FMX.Platform.Win.pas; notranslate">
            if RegionSize = RegionSize then
            begin
              SetLength(UpdateRects, RegionData.rdh.nCount);
              for i := 0 to RegionData.rdh.nCount - 1 do
              begin
                R := PRgnRects(@RegionData.buffer[0])[i];
                UpdateRects[i] := RectF(R.Left, R.Top, R.Right, R.Bottom);
              end;
            end;
</pre>
<p>Что здесь имелось ввиду?</p>
<p><strong>W513 Format parameter count mismatch</strong></p>
<pre class="brush: delphi; first-line: 1089; highlight: [1091]; title: FMX.StdActns.pas; notranslate">
function TCustomValueRange.GetNamePath: string;
begin
  Result := Format( 'Value: %0:*.*f (%1:*.*f..%2:*.*f)', [Value, Min, Max]);
end;
</pre>
<p>Строка форматирования неправильная. При выполнении этого кода будет сообщение об ошибке.</p>
<p><strong>W505 Empty THEN block</strong></p>
<pre class="brush: delphi; first-line: 296; highlight: [296]; title: FMX.Styles.pas; notranslate">
      if FoundValue.Count &gt; 1 then
      else if FoundValue.Count &gt; 0 then
        PropValues[Name] := FoundValue[0];
</pre>
<p>Этот код очень странно выглядит. Вероятно его можно заменить на что-то такое: &#171;If FoundValue.Count = 1 then PropValues[Name] := FoundValue[0]&#187;.</p>
<p>Ну вот и все на сегодня. Используйте <a href="http://sourceoddity.com/fixinsight/">FixInsight</a>, чтобы найти баги <em>до того</em> как ваши пользователи их найдут :)</p>
]]></content:encoded>
			<wfw:commentRss>http://roman.yankovsky.me/?feed=rss2&#038;p=1774</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FixInsight vs RTL</title>
		<link>http://roman.yankovsky.me/?p=1766</link>
		<comments>http://roman.yankovsky.me/?p=1766#comments</comments>
		<pubDate>Mon, 30 Mar 2015 15:02:03 +0000</pubDate>
		<dc:creator><![CDATA[Роман Янковский]]></dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://roman.yankovsky.me/?p=1766</guid>
		<description><![CDATA[В этом посте я продолжу анализ библиотек поставляемых с Delphi. В прошлый раз мы заглянули внутрь Delphi VCL, а в этот раз будем разглядывать RTL. Я снова пропущу всякие мелочи и постараюсь сосредоточиться на самом интересном. Все примеры кода в этом посте касаются Delphi XE7 (версия 21.0.17017.3725). W503 Assignment right hand side is equal to [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>В этом посте я продолжу анализ библиотек поставляемых с Delphi. <a href="http://roman.yankovsky.me/?p=1748">В прошлый раз</a> мы заглянули внутрь Delphi VCL, а в этот раз будем разглядывать RTL. Я снова пропущу всякие мелочи и постараюсь сосредоточиться на самом интересном. Все примеры кода в этом посте касаются Delphi XE7 (версия 21.0.17017.3725).</p>
<p><strong>W503 Assignment right hand side is equal to its left hand side</strong></p>
<pre class="brush: delphi; first-line: 1596; highlight: [1599]; title: Androidapi.JNI.ApkExpansion.pas; notranslate">
  constructor TNativeDownloader.Create(PublicKey: string; Salt: array of Byte; MainFile, PatchFile: TApkFileInfo);
  begin
    FMainFile := MainFile;
    FPatchFile := FPatchFile;
    FDownloader := TJNativeDownloaderLauncher.JavaClass.init(StringToJString(PublicKey), ByteArrayToJArray(Salt),
      CreateApkList(MainFile, PatchFile));
    Create;
  end;
</pre>
<p>Я думаю, тут должно было быть &#171;FPatchFile := PatchFile&#187;.</p>
<p><strong>W501 Empty EXCEPT block</strong></p>
<pre class="brush: delphi; first-line: 308; title: System.PushNotification.pas; notranslate">
  try
    Assert(FConnections.Count = 0); // All connections should have been removed
  except
  end;
</pre>
<p>Это не ошибка, просто непонятная какая-то ерунда :)</p>
<p><strong>W517 Variable hides a class field, method or property</strong></p>
<pre class="brush: delphi; first-line: 1854; highlight: [1863,1865]; title: System.Threading.pas; notranslate">
procedure TTask.ExecuteReplicates(Root: TTask);
var
                                     
//  ReplicasQuitting: Boolean;
  ReplicaProc: TProc;
begin
//  ReplicasQuitting := False;
  ReplicaProc := procedure
    var
      CurrentTask, ChildTask: ITask;
    begin
      CurrentTask := CurrentTask;
      if not Root.ShouldCreateReplica {or ReplicasQuitting} then
        Exit;
      ChildTask := Root.CreateReplicaTask(ReplicaProc, Self, [TCreateFlag.Replicating, TCreateFlag.Replica]);
      ChildTask.Start;
      try
        Root.CallUserCode;
      except
        Root.HandleException(TTask(ChildTask), TObject(AcquireExceptionObject));
      end;
    end;
  ReplicaProc;
end;
</pre>
<p>Сообщение W517 довольно часто встречается при анализе и VCL, и RTL. Но это место, по-моему, самое интересное. В классе TTask есть метод под названием CurrentTask и переменная CurrentTask перекрывает этот метод. Кстати, тут на строке 1865 еще одно предупреждение: &#171;W503 Assignment right hand side is equal to its left hand side&#187;.</p>
<p>То есть непонятно что имелось ввиду &#171;CurrentTask := Self.CurrentTask&#187; или просто эта переменная там без какого-то смысла? В любом случае код довольно странно выглядит и достоин того, чтобы на него внимательно взглянуть.</p>
<p>Я не могу процитировать все сообщений W517, их слишком много. Но давайте вернемся к VCL и взглянем на еще один фрагмент.</p>
<pre class="brush: delphi; first-line: 5924; highlight: [5927]; title: Vcl.Dialogs.pas; notranslate">
procedure TCustomTaskDialog.ShowHelpException(E: Exception);
var
  Msg: string;
  Flags: Integer;
  SubE: Exception;
begin
  Flags := MB_OK or MB_ICONSTOP;
  if Application.UseRightToLeftReading then
    Flags := Flags or MB_RTLREADING;
  // ... [skipped]
</pre>
<p>Это не баг. Но это запросто сможет стать багом, если код изменится. Например, этот код будет компилироваться даже если переменную Flags просто удалить (ведь в классе TCustomTaskDialog есть свойство с таким же именем). Или, например, можно легко ошибиться и использовать в этом методе переменную вместо одноименного свойства, либо наоборот.</p>
<p><strong>W504 Missing INHERITED call in destructor</strong></p>
<pre class="brush: delphi; first-line: 1448; title: Androidapi.JNIBridge.pas; notranslate">
destructor TJavaImport.Destroy;
begin
  TJNIResolver.DeleteGlobalRef(GetObjectID);
end;
</pre>
<p>Снова немало сообщений о пропущенном &#171;inherited&#187; в конструкторе. Процитирую только один пример.</p>
<p><strong>W508 Variable is assigned twice successively</strong></p>
<pre class="brush: delphi; first-line: 24812; title: System.SysUtils.pas; notranslate">
      // Another thread could start traversing the list between when we set the
      // head to P and when we assign to P.Next.  Initializing P.Next to point
      // to itself will make others spin until we assign the tail to P.Next.
      P.Next := P;
      P.Next := PThreadInfo(AtomicExchange(Pointer(FHashTable[H]), Pointer(P)));
</pre>
<p>Насколько я понимаю, это не баг. Но это место достойно цитирования. Как-то я не задумывался, что с многопоточностью можно работать вот так. Очень интересно.</p>
<p>На сегодня у меня все. Если пост вам понравился, то дайте мне знать на какую библиотеку или фреймворк мне стоит взглянуть с помощью <a href="http://sourceoddity.com/fixinsight/">FixInsight</a> в следующий раз. FMX? JEDI? Что-то еще?</p>
]]></content:encoded>
			<wfw:commentRss>http://roman.yankovsky.me/?feed=rss2&#038;p=1766</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk

 Served from: roman.yankovsky.me @ 2026-04-19 00:28:36 by W3 Total Cache -->