<?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:blogger='http://schemas.google.com/blogger/2008' 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-3534124135013415942</id><updated>2020-11-17T13:01:37.249+03:00</updated><category term="Delphi"/><category term="Переводы"/><category term="Программирование"/><category term="Творчество"/><category term="CnPack IDE-Мастер"/><category term="Конкурс Delphi 2011"/><category term="Образование"/><category term="Россия"/><category term="Хакинг"/><category term="Экономика"/><category term="Pascal"/><category term="Python"/><category term="Общество"/><category term="Политика"/><category term="Технологии"/><title type='text'>Keeper&#39;s blog</title><subtitle type='html'>== I&#39;m starting with the man in the mirror ==</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-6927825873899587128</id><published>2014-06-21T01:00:00.000+04:00</published><updated>2014-06-22T17:05:46.803+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Pascal"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="Образование"/><title type='text'>Информатика и ИКТ - ЕГЭ 2014 (C4)</title><content type='html'>Довольно интересная задача С4 попалась в этом году в ЕГЭ по информатике и ИКТ. И, хотя, она оказалась проще, чем ряд задач прошлых лет, некоторые столкнулись с определенными трудностями при ее решении.&lt;br /&gt;Приведу один из возможных эффективных способов ее решения.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Условие (примерное)&lt;/b&gt;&lt;br /&gt;Спутник передает данные на землю, посылая их каждую минуту. Данные подаются в формате целого числа от 0 до 1000, количество значений не превышает 10000. Найти максимальное произведение значений, разница между которыми составляет не менее 7 минут. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Решение (Паскаль)&lt;/b&gt;&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;program c4;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;  N_MAX = 1000; // Правая граница чисел&lt;br /&gt;  MINS = 7; // Минимальное кол-во минут между данными&lt;br /&gt;  D_C = 4; // кол-во символов под форматный вывод&lt;br /&gt;  &lt;br /&gt;var&lt;br /&gt;  Data: array[1..MINS] of Real;&lt;br /&gt;  i, j, N: Integer;&lt;br /&gt;  max, maxPro: Real;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  Write(&#39;N = &#39;); Readln(N);&lt;br /&gt;  &lt;br /&gt;  randomize;&lt;br /&gt;  for i := 1 to MINS do&lt;br /&gt;  begin&lt;br /&gt;    Data[i] := random(N_MAX + 1);&lt;br /&gt;    Write(Data[i]:D_C:1, &#39; &#39;);&lt;br /&gt;  end;&lt;br /&gt;    &lt;br /&gt;  max := 0;&lt;br /&gt;  maxPro := 0;&lt;br /&gt;  for i := MINS + 1 to N do&lt;br /&gt;  begin&lt;br /&gt;    if Data[1] &gt; max then&lt;br /&gt;      max := Data[1];&lt;br /&gt;      &lt;br /&gt;    for j := 1 to MINS - 1 do&lt;br /&gt;      Data[j] := Data[j + 1];&lt;br /&gt;    Data[MINS] := random(N_MAX + 1);&lt;br /&gt;    Write(Data[MINS]:D_C:1, &#39; &#39;);&lt;br /&gt;      &lt;br /&gt;    if max * Data[MINS] &gt; maxPro then&lt;br /&gt;      maxPro := max * Data[MINS];&lt;br /&gt;  end;&lt;br /&gt;  &lt;br /&gt;  Writeln;&lt;br /&gt;  Writeln(&#39;Максимальное произведение = &#39;, maxPro:D_C:1);&lt;br /&gt;  &lt;br /&gt;  readln;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;Краткие пояснения:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;  { &lt;br /&gt;  * Алгоритм решения:&lt;br /&gt;  * &lt;br /&gt;  * max - максимальное число в последовательности&lt;br /&gt;  * maxPro - максимальное произведение&lt;br /&gt;  * &lt;br /&gt;  * Первые MINS чисел заносим в массив&lt;br /&gt;  * Далее:&lt;br /&gt;  * 1) определяем max из первого элемента; &lt;br /&gt;  * 2) добавляем новый элемент в конец массива, предварительно сдвинув его&lt;br /&gt;  *    на 1 элемент влево (1-й элемент больше не нужен, если там был max, мы его запомнили)&lt;br /&gt;  * 3) определяем максимальное произведение из max и введенного эл-та (a[MINS])&lt;br /&gt;  *    (соблюдая расстояние в MINS минут);&lt;br /&gt;  * &lt;br /&gt;  * В программе ввод чисел реализован через генератор случайных чисел,&lt;br /&gt;  * и может быть заменен на ручной ввод&lt;br /&gt;  * }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Решение (Питон 3+)&lt;/b&gt; &lt;br /&gt;&lt;pre class=&quot;brush: python&quot;&gt;import random, queue&lt;br /&gt;&lt;br /&gt;N_MAX = 1000 &lt;br /&gt;MINS = 7 &lt;br /&gt;D_C = 4 &lt;br /&gt;&lt;br /&gt;N = int(input(&#39;N = &#39;));&lt;br /&gt;  &lt;br /&gt;# Используем очередь, поэтому перестановки далее будут лишними&lt;br /&gt;# Можно использовать и списки - выбирайте сами&lt;br /&gt;Data = queue.Queue(MINS)&lt;br /&gt;for _ in range(MINS):&lt;br /&gt;    Item = random.randint(0, N_MAX)&lt;br /&gt;    Data.put(Item)&lt;br /&gt;    print(&#39;{0:{D_C}.1f}&#39;.format(Item, D_C = D_C), end = &#39; &#39;)&lt;br /&gt; &lt;br /&gt;maxItem = 0&lt;br /&gt;maxPro = 0&lt;br /&gt;for _ in range(MINS + 1, N + 1):&lt;br /&gt;    Item = Data.get()&lt;br /&gt;    if Item &gt; maxItem:&lt;br /&gt;        maxItem = Item&lt;br /&gt;  &lt;br /&gt;    Item = random.randint(0, N_MAX)&lt;br /&gt;    Data.put(Item)&lt;br /&gt;    print(&#39;{0:{D_C}.1f}&#39;.format(Item, D_C = D_C), end = &#39; &#39;)&lt;br /&gt;  &lt;br /&gt;    if maxItem * Item &gt; maxPro:&lt;br /&gt;        maxPro = maxItem * Item&lt;br /&gt;        &lt;br /&gt;print(&#39;\nМаксимальное произведение = {0:{D_C}.1f}&#39;.format(maxPro, D_C = D_C), end = &#39; &#39;)&lt;br /&gt;&lt;br /&gt;input&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Скриншот&lt;/b&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-4aUDYToi4mI/U6YfS2rRm3I/AAAAAAAAAu0/zr4Et6_xT8A/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+%25D0%25BE%25D1%2582+2014-06-22+04%253A09%253A41.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-4aUDYToi4mI/U6YfS2rRm3I/AAAAAAAAAu0/zr4Et6_xT8A/s640/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+%25D0%25BE%25D1%2582+2014-06-22+04%253A09%253A41.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Если у кого-нибудь есть более светлые идеи - предлагайте в комментариях.&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/6927825873899587128/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2014/06/2014-c4.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/6927825873899587128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/6927825873899587128'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2014/06/2014-c4.html' title='Информатика и ИКТ - ЕГЭ 2014 (C4)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-4aUDYToi4mI/U6YfS2rRm3I/AAAAAAAAAu0/zr4Et6_xT8A/s72-c/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+%25D0%25BE%25D1%2582+2014-06-22+04%253A09%253A41.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-8581122329581943833</id><published>2014-01-19T02:01:00.000+04:00</published><updated>2014-01-19T20:40:04.826+04:00</updated><title type='text'>Технология уничтожения</title><content type='html'>Всё прогрессивное человечество, как нам говорят, абсолютно естественным образом приняло геев, их субкультуру, их право заключать браки, усыновлять детей и пропагандировать свою сексуальную ориентацию в школах и детских садах. Нам говорят, что всё это — естественный ход вещей.&lt;br /&gt;&lt;br /&gt;Нам лгут.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ложь о естественном ходе вещей опроверг американский социолог Джозеф Овертон, описавший технологию изменение отношения общества к некогда принципиальным для этого общества вопросам.&lt;br /&gt;&lt;br /&gt;Прочитайте это описание и станет понятно, как легализуют гомосексуализм и однополые браки. Станет совершенно очевидно, что работа по легализации педофилии и инцеста будет завершена в Европе уже в ближайшие годы. Как и детская эвтаназия, кстати.&lt;br /&gt;&lt;br /&gt;Что ещё можно вытащить оттуда в наш мир, используя технологию, описанную Овертоном?&lt;br /&gt;&lt;br /&gt;Она работает безотказно.&lt;br /&gt;&lt;br /&gt;***&lt;br /&gt;Джозеф П. Овертон (1960-2003), старший вице-президент центра общественой политики Mackinac Center. Погиб в авиакатастрофе. Сформулировал модель изменения представления проблемы в общественном мнении, посмертно названную Окном Овертона.&lt;br /&gt;***&lt;br /&gt;&lt;br /&gt;Джозеф Овертон описал, как совершенно чуждые обществу идеи были подняты из помойного бака общественного презрения, отмыты и, в конце концов, законодательно закреплены.&lt;br /&gt;&lt;br /&gt;Согласно Окну возможностей Овертона, для каждой идеи или проблемы в обществе существует т.н. окно возможностей. В пределах этого окна идею могут или не могут широко обсуждать, открыто поддерживать, пропагандировать, пытаться закрепить законодательно. Окно двигают, меняя тем самым веер возможностей, от стадии «немыслимое», то есть совершенно чуждое общественной морали, полностью отвергаемое до стадии «актуальная политика», то есть уже широко обсуждённое, принятое массовым сознанием и закреплённое в законах.&lt;br /&gt;&lt;br /&gt;Это не промывание мозгов как таковое, а технологии более тонкие. Эффективными их делает последовательное, системное применение и незаметность для общества-жертвы самого факта воздействия.&lt;br /&gt;&lt;br /&gt;Ниже я на примере разберу, как шаг за шагом общество начинает сперва обсуждать нечто неприемлемое, затем считать это уместным, а в конце концов смиряется с новым законом, закрепляющим и защищающим некогда немыслимое.&lt;br /&gt;&lt;br /&gt;Возьмём для примера что-то совершенно невообразимое. Допустим, каннибализм, то есть идею легализовать право граждан на поедание друг друга. Достаточно жёсткий пример?&lt;br /&gt;&lt;br /&gt;Но всем очевидно, что прямо сейчас (2014г.) нет возможности развернуть пропаганду каннибализма — общество встанет на дыбы. Такая ситуация означает, что проблема легализации каннибализма находится в нулевой стадии окна возможностей. Эта стадия, согласно теории Овертона, называется «Немыслимое». Смоделируем теперь, как это немысливое будет реализовано, пройдя все стадии окна возможностей.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ТЕХНОЛОГИЯ&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ещё раз повторю, Овертон описал ТЕХНОЛОГИЮ, которая позволяет легализовать абсолютно любую идею.&lt;br /&gt;&lt;br /&gt;Обратите внимание! Он не концепцию предложил, не мысли свои сформулировал некоторым образом — он описал работающую технологию. То есть такую последовательность действий, исполнение которой неизменно приводит к желаемому результату. В качестве оружия для уничтожения человеческих сообществ такая технология может быть эффективнее термоядерного заряда.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;КАК ЭТО СМЕЛО!&lt;br /&gt;&lt;br /&gt;Тема каннибализма пока ещё отвратительна и совершенно не приемлема в обществе. Рассуждать на эту тему нежелательно ни в прессе, ни, тем более, в приличной компании. Пока это немыслимое, абсурдное, запретное явление. Соответственно, первое движение Окна Овертона — перевести тему каннибализма из области немыслимого в область радикального.&lt;br /&gt;&lt;br /&gt;У нас ведь есть свобода слова.&lt;br /&gt;&lt;br /&gt;Ну, так почему бы не поговорить о каннибализме?&lt;br /&gt;&lt;br /&gt;Учёным вообще положено говорить обо всём подряд — для учёных нет запретных тем, им положено всё изучать. А раз такое дело, соберём этнологический симпозиум по теме «Экзотические обряды племён Полинезии». Обсудим на нём историю предмета, введём её в научный оборот и получим факт авторитетного высказывания о каннибализме.&lt;br /&gt;&lt;br /&gt;Видите, о людоедстве, оказывается, можно предметно поговорить и как бы остаться в пределах научной респектабельности.&lt;br /&gt;&lt;br /&gt;Окно Овертона уже двинулось. То есть уже обозначен пересмотр позиций. Тем самым обеспечен переход от непримиримо отрицательного отношения общества к отношению более позитивному.&lt;br /&gt;&lt;br /&gt;Одновременно с околонаучной дискуссией непременно должно появиться какое-нибудь «Общество радикальных каннибалов». И пусть оно будет представлено лишь в интернете — радикальных каннибалов непременно заметят и процитируют во всех нужных СМИ.&lt;br /&gt;&lt;br /&gt;Во-первых, это ещё один факт высказывания. А во-вторых, эпатирующие отморозки такого специального генезиса нужны для создания образа радикального пугала. Это будут «плохие каннибалы» в противовес другому пугалу — «фашистам, призывающим сжигать на кострах не таких, как они». Но о пугалах чуть ниже. Для начала достаточно публиковать рассказы о том, что думают про поедание человечины британские учёные и какие-нибудь радикальные отморозки иной природы.&lt;br /&gt;&lt;br /&gt;Результат первого движения Окна Овертона: неприемлемая тема введена в оборот, табу десакрализовано, произошло разрушение однозначности проблемы — созданы «градации серого».&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ПОЧЕМУ БЫ И НЕТ?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Следующим шагом Окно движется дальше и переводит тему каннибализма из радикальной области в область возможного.&lt;br /&gt;&lt;br /&gt;На этой стадии продолжаем цитировать «учёных». Ведь нельзя же отворачиваться от знания? Про каннибализм. Любой, кто откажется это обсуждать, должен быть заклеймён как ханжа и лицемер.&lt;br /&gt;&lt;br /&gt;Осуждая ханжество, обязательно нужно придумать каннибализму элегантное название. Чтобы не смели всякие фашисты навешивать на инакомыслящих ярлыки со словом на букву «Ка».&lt;br /&gt;&lt;br /&gt;Внимание! Создание эвфемизма — это очень важный момент. Для легализации немыслимой идеи необходимо подменить её подлинное название.&lt;br /&gt;&lt;br /&gt;Нет больше каннибализма.&lt;br /&gt;&lt;br /&gt;Теперь это называется, например, антропофагия. Но и этот термин совсем скоро заменят ещё раз, признав и это определение оскорбительным.&lt;br /&gt;&lt;br /&gt;Цель выдумывания новых названий — увести суть проблемы от её обозначения, оторвать форму слова от его содержания, лишить своих идеологических противников языка. Каннибализм превращается в антропофагию, а затем в антропофилию, подобно тому, как преступник меняет фамилии и паспорта.&lt;br /&gt;&lt;br /&gt;Параллельно с игрой в имена происходит создание опорного прецедента — исторического, мифологического, актуального или просто выдуманного, но главное — легитимированного. Он будет найден или придуман как «доказательство» того, что антропофилия может быть в принципе узаконена.&lt;br /&gt;&lt;br /&gt;«Помните легенду о самоотверженной матери, напоившей своей кровью умирающих от жажды детей?»&lt;br /&gt;&lt;br /&gt;«А истории античных богов, поедавших вообще всех подряд — у римлян это было в порядке вещей!»&lt;br /&gt;&lt;br /&gt;«Ну, а у более близких нам христиан, тем более, с антропофилией всё в полном порядке! Они до сих пор ритуально пьют кровь и едят плоть своего бога. Вы же не обвиняете в чём-то христианскую церковь? Да кто вы такие, чёрт вас побери?»&lt;br /&gt;&lt;br /&gt;Главная задача вакханалии этого этапа — хотя бы частично вывести поедание людей из-под уголовного преследования. Хоть раз, хоть в какой-то исторический момент.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ТАК И НАДО&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;После того как предоставлен легитимирующий прецендент, появляется возможность двигать Окно Овертона с территории возможного в область рационального.&lt;br /&gt;&lt;br /&gt;Это третий этап. На нём завершается дробление единой проблемы.&lt;br /&gt;&lt;br /&gt;«Желание есть людей генетически заложено, это в природе человека»&lt;br /&gt;«Иногда съесть человека необходимо, существуют непреодолимые обстоятельства»&lt;br /&gt;«Есть люди, желающие чтобы их съели»&lt;br /&gt;«Антропофилов спровоцировали!»&lt;br /&gt;«Запретный плод всегда сладок»&lt;br /&gt;«Свободный человек имеет право решать что ему есть»&lt;br /&gt;«Не скрывайте информацию и пусть каждый поймёт, кто он — антропофил или антропофоб»&lt;br /&gt;«А есть ли в антропофилии вред? Неизбежность его не доказана».&lt;br /&gt;&lt;br /&gt;В общественном сознании искусственно создаётся «поле боя» за проблему. На крайних флангах размещают пугала — специальным образом появившихся радикальных сторонников и радикальных противников людоедства.&lt;br /&gt;&lt;br /&gt;Реальных противников — то есть нормальных людей, не желающих оставаться безразличными к проблеме растабиурования людоедства — стараются упаковать вместе с пугалами и записать в радикальные ненавистники. Роль этих пугал — активно создавать образ сумасшедших психопатов — агрессивные, фашиствующие ненавистники антропофагии, призывающие жечь заживо людоедов, жидов, коммунистов и негров. Присутствие в СМИ обеспечивают всем перечисленным, кроме реальных противников легализации.&lt;br /&gt;&lt;br /&gt;При таком раскладе сами т.н. антропофилы остаются как бы посередине между пугалами, на «территории разума», откуда со всем пафосом «здравомыслия и человечности» осуждают «фашистов всех мастей».&lt;br /&gt;&lt;br /&gt;«Учёные» и журналисты на этом этапе доказывают, что человечество на протяжении всей своей истории время от времени поедало друг друга, и это нормально. Теперь тему антропофилии можно переводить из области рационального, в категорию популярного. Окно Овертона движется дальше.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;В ХОРОШЕМ СМЫСЛЕ&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Для популяризации темы каннибализма необходимо поддержать её поп-контентом, сопрягая с историческими и мифологическими личностями, а по возможности и с современными медиаперсонами.&lt;br /&gt;&lt;br /&gt;Антропофилия массово проникает в новости и токшоу. Людей едят в кино широкого проката, в текстах песен и видеоклипах.&lt;br /&gt;&lt;br /&gt;Один из приёмов популяризации называется «Оглянитесь по сторонам!»&lt;br /&gt;&lt;br /&gt;«Разве вы не знали, что один известный композитор — того... антропофил?»&lt;br /&gt;&lt;br /&gt;«А один всем известный польский сценарист — всю жизнь был антропофилом, его даже преследовали.»&lt;br /&gt;&lt;br /&gt;«А сколько их по психушкам сидело! Сколько миллионов выслали, лишили гражданства!.. Кстати, как вам новый клип Леди Гаги «Eat me, baby»?&lt;br /&gt;&lt;br /&gt;На этом этапе разрабатываемую тему выводят в ТОП и она начинает автономно самовоспроизводиться в массмедиа, шоубизнесе и политике.&lt;br /&gt;&lt;br /&gt;Другой эффективный приём: суть проблемы активно забалтывают на уровне операторов информации (журналистов, ведущих телепередач, общественников и тд), отсекая от дискуссии специалистов.&lt;br /&gt;&lt;br /&gt;Затем, в момент, когда уже всем стало скучно и обсуждение проблемы зашло в тупик, приходит специальным образом подобранный профессионал и говорит: «Господа, на самом деле всё совсем не так. И дело не в том, а вот в этом. И делать надо то-то и то-то» — и даёт тем временем весьма определённое направление, тенденциозность которого задана движением «Окна».&lt;br /&gt;&lt;br /&gt;Для оправдания сторонников легализации используют очеловечивание преступников через создание им положительного образа через не сопряжённые с преступлением характеристик.&lt;br /&gt;&lt;br /&gt;«Это же творческие люди. Ну, съел жену и что?»&lt;br /&gt;&lt;br /&gt;«Они искренне любят своих жертв. Ест, значит любит!»&lt;br /&gt;&lt;br /&gt;«У антропофилов повышенный IQ и в остальном они придерживаются строгой морали»&lt;br /&gt;&lt;br /&gt;«Антропофилы сами жертвы, их жизнь заставила»&lt;br /&gt;&lt;br /&gt;«Их так воспитали» и т.д.&lt;br /&gt;&lt;br /&gt;Такого рода выкрутасы — соль популярных ток-шоу.&lt;br /&gt;&lt;br /&gt;«Мы расскажем вам трагическую историю любви! Он хотел её съесть! А она лишь хотела быть съеденной! Кто мы, чтобы судить их? Быть может, это — любовь? Кто вы такие, чтобы вставать у любви на пути?!»&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;МЫ ЗДЕСЬ ВЛАСТЬ&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;К пятому этапу движения Окна Овертона переходят, когда тема разогрета до возможности перевести её из категории популярного в сферу актуальной политики.&lt;br /&gt;&lt;br /&gt;Начинается подготовка законодательной базы. Лоббистские группировки во власти консолидируются и выходят из тени. Публикуются социологические опросы, якобы подтверждающие высокий процент сторонников легализации каннибализма. Политики начинают катать пробные шары публичных высказываний на тему законодательного закрепления этой темы. В общественное сознание вводят новую догму — «запрещение поедания людей запрещено».&lt;br /&gt;&lt;br /&gt;Это фирменное блюдо либерализма — толерантность как запрет на табу, запрет на исправление и предупреждение губительных для общества отклонений.&lt;br /&gt;&lt;br /&gt;Во время последнего этапа движения Окна из категории «популярное» в «актуальную политику» общество уже сломлено. Самая живая его часть ещё как-то будет сопротивляться законодательному закреплению не так давно ещё немыслимых вещей. Но в целом уже общество сломлено. Оно уже согласилось со своим поражением.&lt;br /&gt;&lt;br /&gt;Приняты законы, изменены (разрушены) нормы человеческого существования, далее отголосками эта тема неизбежна докатится до школ и детских садов, а значит следующее поколение вырастет вообще без шанса на выживание. Так было с легализацией педерастии (теперь они требуют называть себя геями). Сейчас на наших глазах Европа легализует инцест и детскую эвтаназию.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;КАК СЛОМАТЬ ТЕХНОЛГИЮ&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Описанное Овертоном Окно возможностей легче всего движется в толерантном обществе. В том обществе, у которого нет идеалов, и, как следствие, нет чёткого разделения добра и зла.&lt;br /&gt;&lt;br /&gt;Вы хотите поговорить о том, что ваша мать — шлюха? Хотите напечатать об этом доклад в журнале? Спеть песню. Доказать в конце концов, что быть шлюхой — это нормально и даже необходимо? Это и есть описанная выше технология. Она опирается на вседозволенность.&lt;br /&gt;&lt;br /&gt;Нет табу.&lt;br /&gt;&lt;br /&gt;Нет ничего святого.&lt;br /&gt;&lt;br /&gt;Нет сакральных понятий, само обсуждение которых запрещено, а их грязное обмусоливание — пресекается немедленно. Всего этого нет. А что есть?&lt;br /&gt;&lt;br /&gt;Есть так называемая свобода слова, превращённая в свободу расчеловечивания. На наших глазах, одну за другой, снимают рамки, ограждавшие обществу бездны самоуничтожения. Теперь дорога туда открыта.&lt;br /&gt;&lt;br /&gt;Ты думаешь, что в одиночку не сможешь ничего изменить?&lt;br /&gt;&lt;br /&gt;Ты совершенно прав, в одиночку человек не может ни черта.&lt;br /&gt;&lt;br /&gt;Но лично ты обязан оставаться человеком. А человек способен найти решение любой проблемы. И что не сумеет один — сделают люди, объединённые общей идеей. Оглянись по сторонам.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://rvs.livejournal.com/27431.html&quot;&gt;http://rvs.livejournal.com/27431.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Дополнительные источники: &lt;a href=&quot;http://&quot;&gt;http://businessmsk.livejournal.com/641375.html&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/8581122329581943833/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2014/01/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/8581122329581943833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/8581122329581943833'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2014/01/blog-post.html' title='Технология уничтожения'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-8114054272783769307</id><published>2013-09-25T00:18:00.001+04:00</published><updated>2013-09-25T00:18:30.653+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><title type='text'>Что бы сделали мы с Delphi XE5/XE6... - подводим итоги</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;С некоторым запозданием подводим обещанные итоги &lt;a href=&quot;http://keeper89.blogspot.ru/2013/07/vote-for-delphi-xe5-xe6.html&quot;&gt;летнего опроса&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Вот, пятерка пожеланий-победителей:&lt;br /&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Исправить баги и &quot;тормоза&quot; в QC, в т.ч. переходящие от версии к версии (13).&lt;/li&gt;&lt;li&gt;Выпустить Delphi-Express, литературу по новым возможностям и современному состоянию языка/среды, в т.ч. на глубоком уровне; оптимизировать и повысить скорость исполняемых файлов; сделать компилятор под Linux (6).&lt;/li&gt;&lt;li&gt;Улучшить справочную систему (быстродействие, содержание) (5).&lt;/li&gt;&lt;li&gt;Снизить цены на Delphi/RAD Studio; усовершенствовать IDE (4).&lt;/li&gt;&lt;li&gt;Значительно расширить компонентную базу, добавить полноценные компоненты, а не урезанные версии, исправить существующие (например, TBalloonHint или Ribbon); провести качественный рефакторинг и нативные компоненты в FM; улучшить стабильность и скорость среды (3).&lt;/li&gt;&lt;/ol&gt;В скобках указано количество голосов, полученное путем группировки мнений авторов. В случае, если одно и тоже количество голосов набирало несколько позиций - им присваивалось одно и тоже место, а сами позиции разделялись точкой с запятой.&lt;br /&gt;&lt;br /&gt;В пятерке явно выделяется желание увидеть пофикшеные баги, остальные пункты обладают примерно одинаковой степенью влияния. Наиболее неожиданным для меня является появление в топе наличия компилятора под Linux.&lt;br /&gt;&lt;br /&gt;Остальные пожелания, в авторской редакции, оставляю на прочтение в &lt;a href=&quot;http://keeper89.blogspot.com/2013/07/vote-for-delphi-xe5-xe6.html?showComment=1374145046228#c5895654121970348165&quot;&gt;комментариях&lt;/a&gt; к оригинальному посту.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/8114054272783769307/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2013/09/delphi-xe5xe6.html#comment-form' title='Комментарии: 26'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/8114054272783769307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/8114054272783769307'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2013/09/delphi-xe5xe6.html' title='Что бы сделали мы с Delphi XE5/XE6... - подводим итоги'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-7915210037619549729</id><published>2013-08-04T12:40:00.001+04:00</published><updated>2013-08-04T12:43:16.094+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Программирование"/><title type='text'>Numerics для Delphi &amp; FPC (работа с большими числами)</title><content type='html'>&lt;a href=&quot;http://sergworks.wordpress.com&quot;&gt;Сергей Касандров&lt;/a&gt; выпустил довольно интересный модуль для работы с большими числами в Delphi и FreePascal (сделано на чистом Паскале, без оптимизаций) - &lt;a href=&quot;http://sergworks.wordpress.com/2013/08/03/numerics-for-delphi-fpc/&quot;&gt;новость&lt;/a&gt; и &lt;a href=&quot;https://bitbucket.org/sergworks/tforge/downloads/Numerics050.zip&quot;&gt;архив&lt;/a&gt;. В архиве содержится исходный код модуля, а также тестовый проект и скомпилированные dll (32- и 64-битные).&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Для предварительного ознакомления с реализацией код модуля (из архива) приведен ниже.&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;{ *********************************************************** }&lt;br /&gt;{ *       Numerics(32/64).dll import for Pascal             * }&lt;br /&gt;{ * ------------------------------------------------------- * }&lt;br /&gt;{ *       set const LibName = &#39;numerics32.dll&#39;              * }&lt;br /&gt;{ *         to import numerics32.dll;                       * }&lt;br /&gt;{ *       set const LibName = &#39;numerics64.dll&#39;              * }&lt;br /&gt;{ *         to import numerics64.dll;                       * }&lt;br /&gt;{ *********************************************************** }&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;  Copyright (c) 2013 Sergey Kasandrov&lt;br /&gt;&lt;br /&gt;  Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;  of this software and associated documentation files (the &quot;Software&quot;), to deal&lt;br /&gt;  in the Software without restriction, including without limitation the rights&lt;br /&gt;  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;  copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;  furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;  The above copyright notice and this permission notice shall be included in&lt;br /&gt;  all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;  THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;  THE SOFTWARE.&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;unit Numerics;&lt;br /&gt;&lt;br /&gt;{$IFDEF FPC}&lt;br /&gt;  {$mode delphi}&lt;br /&gt;{$ENDIF}&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses Windows, SysUtils;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TF_RESULT = LongInt;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;                                              // = common microsoft codes =&lt;br /&gt;  TF_S_OK           = TF_RESULT(0);           // Operation successful&lt;br /&gt;  TF_S_FALSE        = TF_RESULT(1);           // Operation successful&lt;br /&gt;  TF_E_FAIL         = TF_RESULT($80004005);   // Unspecified failure&lt;br /&gt;  TF_E_INVALIDARG   = TF_RESULT($80070057);   // One or more arguments are not valid&lt;br /&gt;  TF_E_NOINTERFACE  = TF_RESULT($80004002);   // No such interface supported&lt;br /&gt;  TF_E_NOTIMPL      = TF_RESULT($80004001);   // Not implemented&lt;br /&gt;  TF_E_OUTOFMEMORY  = TF_RESULT($8007000E);   // Failed to allocate necessary memory&lt;br /&gt;  TF_E_UNEXPECTED   = TF_RESULT($8000FFFF);   // Unexpected failure&lt;br /&gt;&lt;br /&gt;                                              // = TFL specific codes =&lt;br /&gt;  TF_E_NOMEMORY     = TF_RESULT($A0000003);   // specific TFL memory error&lt;br /&gt;  TF_E_LOADERROR    = TF_RESULT($A0000004);   // Error loading dll&lt;br /&gt;&lt;br /&gt;{$IFDEF FPC}&lt;br /&gt;type&lt;br /&gt;  TBytes = array of Byte;&lt;br /&gt;{$ENDIF}&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  IBigNumber = interface&lt;br /&gt;&lt;br /&gt;    function GetIsEven: Boolean; stdcall;&lt;br /&gt;    function GetIsOne: Boolean; stdcall;&lt;br /&gt;    function GetIsPowerOfTwo: Boolean; stdcall;&lt;br /&gt;    function GetIsZero: Boolean; stdcall;&lt;br /&gt;    function GetSign: Integer; stdcall;&lt;br /&gt;    function GetSize: Integer; stdcall;&lt;br /&gt;&lt;br /&gt;    function CompareNumber(Num: IBigNumber): Integer; stdcall;&lt;br /&gt;    function CompareNumberU(Num: IBigNumber): Integer; stdcall;&lt;br /&gt;&lt;br /&gt;    function AddNumber(Num: IBigNumber; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function AddNumberU(Num: IBigNumber; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function SubNumber(Num: IBigNumber; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function SubNumberU(Num: IBigNumber; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function MulNumber(Num: IBigNumber; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function MulNumberU(Num: IBigNumber; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function DivRemNumber(Num: IBigNumber; var Q, R: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function DivRemNumberU(Num: IBigNumber; var Q, R: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;&lt;br /&gt;    function AndNumber(Num: IBigNumber; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function AndNumberU(Num: IBigNumber; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function OrNumber(Num: IBigNumber; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function OrNumberU(Num: IBigNumber; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function XorNumber(Num: IBigNumber; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;&lt;br /&gt;    function ShlNumber(Shift: Cardinal; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function ShrNumber(Shift: Cardinal; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;&lt;br /&gt;    function AssignNumber(var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function AbsNumber(var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function NegateNumber(var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function Pow(Value: Cardinal; var IRes: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function PowU(Value: Cardinal; var IRes: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function PowerMod(IExp, IMod: IBigNumber; var IRes: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function SqrtNumber(var IRes: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;&lt;br /&gt;    function ToLimb(var Value: UInt32): TF_RESULT; stdcall;&lt;br /&gt;    function ToIntLimb(var Value: Int32): TF_RESULT; stdcall;&lt;br /&gt;    function ToDec(P: PByte; var L: Integer): TF_RESULT; stdcall;&lt;br /&gt;    function ToHex(P: PByte; var L: Integer; TwoCompl: Boolean): TF_RESULT; stdcall;&lt;br /&gt;    function ToPByte(P: PByte; var L: Cardinal): TF_RESULT; stdcall;&lt;br /&gt;&lt;br /&gt;    function CompareToLimb(B: UInt32): Integer; stdcall;&lt;br /&gt;    function CompareToLimbU(B: UInt32): Integer; stdcall;&lt;br /&gt;    function CompareToIntLimb(B: Int32): Integer; stdcall;&lt;br /&gt;    function CompareToIntLimbU(B: Int32): Integer; stdcall;&lt;br /&gt;&lt;br /&gt;    function AddLimb(Limb: LongWord; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function AddLimbU(Limb: LongWord; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function AddIntLimb(Limb: LongInt; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;&lt;br /&gt;    function SubLimb(Limb: LongWord; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function SubLimb2(Limb: LongWord; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function SubLimbU(Limb: LongWord; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function SubLimbU2(Limb: LongWord; var Res: LongWord): TF_RESULT; stdcall;&lt;br /&gt;    function SubIntLimb(Limb: LongInt; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function SubIntLimb2(Limb: LongInt; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;&lt;br /&gt;    function MulLimb(Limb: LongWord; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function MulLimbU(Limb: LongWord; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function MulIntLimb(Limb: LongInt; var Res: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;&lt;br /&gt;    function DivRemLimb(Limb: LongWord; var Q: IBigNumber; var R: IBigNumber): TF_RESULT; stdcall;&lt;br /&gt;    function DivRemLimb2(Limb: LongWord; var Q: IBigNumber; var R: LongWord): TF_RESULT; stdcall;&lt;br /&gt;    function DivRemLimbU(Limb: LongWord; var Q: IBigNumber; var R: LongWord): TF_RESULT; stdcall;&lt;br /&gt;    function DivRemLimbU2(Limb: LongWord; var Q: LongWord; var R: LongWord): TF_RESULT; stdcall;&lt;br /&gt;    function DivRemIntLimb(Limb: LongInt; var Q: IBigNumber; var R: LongInt): TF_RESULT; stdcall;&lt;br /&gt;    function DivRemIntLimb2(Limb: LongInt; var Q: LongInt; var R: LongInt): TF_RESULT; stdcall;&lt;br /&gt;&lt;br /&gt;    function ToDblLimb(var Value: UInt64): TF_RESULT; stdcall;&lt;br /&gt;    function ToDblIntLimb(var Value: Int64): TF_RESULT; stdcall;&lt;br /&gt;    function CompareToDblLimb(B: UInt64): Integer; stdcall;&lt;br /&gt;    function CompareToDblLimbU(B: UInt64): Integer; stdcall;&lt;br /&gt;    function CompareToDblIntLimb(B: Int64): Integer; stdcall;&lt;br /&gt;    function CompareToDblIntLimbU(B: Int64): Integer; stdcall;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  BigCardinal = record&lt;br /&gt;  private&lt;br /&gt;    FNumber: IBigNumber;&lt;br /&gt;  public&lt;br /&gt;    function ToString: string;&lt;br /&gt;    function ToHexString(Digits: Integer = 0; const Prefix: string = &#39;&#39;;&lt;br /&gt;                         TwoCompl: Boolean = False): string;&lt;br /&gt;    function ToBytes: TBytes;&lt;br /&gt;    function TryParse(const S: string; TwoCompl: Boolean = False): Boolean;&lt;br /&gt;    procedure Free;&lt;br /&gt;&lt;br /&gt;    class function Compare(const A, B: BigCardinal): Integer; static;&lt;br /&gt;    function CompareTo(const B: BigCardinal): Integer; overload;&lt;br /&gt;&lt;br /&gt;    class function Pow(const Base: BigCardinal; Value: Cardinal): BigCardinal; static;&lt;br /&gt;    class function DivRem(const Dividend, Divisor: BigCardinal;&lt;br /&gt;                          var Remainder: BigCardinal): BigCardinal; overload; static;&lt;br /&gt;&lt;br /&gt;    class operator Explicit(const Value: BigCardinal): Cardinal;&lt;br /&gt;    class operator Explicit(const Value: BigCardinal): Integer;&lt;br /&gt;    class operator Explicit(const Value: BigCardinal): UInt64;&lt;br /&gt;    class operator Explicit(const Value: BigCardinal): Int64;&lt;br /&gt;    class operator Implicit(const Value: Cardinal): BigCardinal;&lt;br /&gt;    class operator Implicit(const Value: UInt64): BigCardinal;&lt;br /&gt;    class operator Explicit(const Value: Integer): BigCardinal;&lt;br /&gt;    class operator Explicit(const Value: Int64): BigCardinal;&lt;br /&gt;    class operator Explicit(const Value: TBytes): BigCardinal;&lt;br /&gt;    class operator Explicit(const Value: string): BigCardinal;&lt;br /&gt;&lt;br /&gt;    class operator Equal(const A, B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A, B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A, B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A, B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A, B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A, B: BigCardinal): Boolean; inline;&lt;br /&gt;&lt;br /&gt;    class operator Add(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;    class operator Subtract(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;    class operator Multiply(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;    class operator IntDivide(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;    class operator Modulus(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;&lt;br /&gt;    class operator LeftShift(const A: BigCardinal; Shift: Cardinal): BigCardinal;&lt;br /&gt;    class operator RightShift(const A: BigCardinal; Shift: Cardinal): BigCardinal;&lt;br /&gt;&lt;br /&gt;    class operator BitwiseAnd(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;    class operator BitwiseOr(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;&lt;br /&gt;    function CompareToCard(const B: Cardinal): Integer;&lt;br /&gt;    function CompareToInt(const B: Integer): Integer;&lt;br /&gt;    function CompareTo(const B: Cardinal): Integer; overload; inline;&lt;br /&gt;    function CompareTo(const B: Integer): Integer; overload; inline;&lt;br /&gt;&lt;br /&gt;    class operator Equal(const A: BigCardinal; const B: Cardinal): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: Cardinal; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: BigCardinal; const B: Integer): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: Integer; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: BigCardinal; const B: Cardinal): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: Cardinal; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: BigCardinal; const B: Integer): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: Integer; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: BigCardinal; const B: Cardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: Cardinal; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: BigCardinal; const B: Integer): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: Integer; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: BigCardinal; const B: Cardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: Cardinal; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: BigCardinal; const B: Integer): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: Integer; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: BigCardinal; const B: Cardinal): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: Cardinal; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: BigCardinal; const B: Integer): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: Integer; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: BigCardinal; const B: Cardinal): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: Cardinal; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: BigCardinal; const B: Integer): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: Integer; const B: BigCardinal): Boolean; inline;&lt;br /&gt;&lt;br /&gt;    function CompareToUInt64(const B: UInt64): Integer;&lt;br /&gt;    function CompareToInt64(const B: Int64): Integer;&lt;br /&gt;    function CompareTo(const B: UInt64): Integer; overload; inline;&lt;br /&gt;    function CompareTo(const B: Int64): Integer; overload; inline;&lt;br /&gt;&lt;br /&gt;    class operator Equal(const A: BigCardinal; const B: UInt64): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: UInt64; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: BigCardinal; const B: Int64): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: Int64; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: BigCardinal; const B: UInt64): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: UInt64; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: BigCardinal; const B: Int64): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: Int64; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: BigCardinal; const B: UInt64): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: UInt64; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: BigCardinal; const B: Int64): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: Int64; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: BigCardinal; const B: UInt64): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: UInt64; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: BigCardinal; const B: Int64): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: Int64; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: BigCardinal; const B: UInt64): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: UInt64; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: BigCardinal; const B: Int64): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: Int64; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: BigCardinal; const B: UInt64): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: UInt64; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: BigCardinal; const B: Int64): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: Int64; const B: BigCardinal): Boolean; inline;&lt;br /&gt;&lt;br /&gt;    class function DivRem(const Dividend: BigCardinal; Divisor: Cardinal;&lt;br /&gt;                          var Remainder: Cardinal): BigCardinal; overload; static;&lt;br /&gt;    class function DivRem(const Dividend: Cardinal; Divisor: BigCardinal;&lt;br /&gt;                          var Remainder: Cardinal): Cardinal; overload; static;&lt;br /&gt;&lt;br /&gt;    class operator Add(const A: BigCardinal; const B: Cardinal): BigCardinal;&lt;br /&gt;    class operator Add(const A: Cardinal; const B: BigCardinal): BigCardinal;&lt;br /&gt;    class operator Subtract(const A: BigCardinal; const B: Cardinal): BigCardinal;&lt;br /&gt;    class operator Subtract(const A: Cardinal; const B: BigCardinal): Cardinal;&lt;br /&gt;    class operator Multiply(const A: BigCardinal; const B: Cardinal): BigCardinal;&lt;br /&gt;    class operator Multiply(const A: Cardinal; const B: BigCardinal): BigCardinal;&lt;br /&gt;    class operator IntDivide(const A: BigCardinal; const B: Cardinal): BigCardinal;&lt;br /&gt;    class operator IntDivide(const A: Cardinal; const B: BigCardinal): Cardinal;&lt;br /&gt;    class operator Modulus(const A: BigCardinal; const B: Cardinal): Cardinal;&lt;br /&gt;    class operator Modulus(const A: Cardinal; const B: BigCardinal): Cardinal;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  BigInteger = record&lt;br /&gt;  private&lt;br /&gt;    FNumber: IBigNumber;&lt;br /&gt;    function GetSign: Integer;&lt;br /&gt;  public&lt;br /&gt;    function ToString: string;&lt;br /&gt;    function ToHexString(Digits: Integer = 0; const Prefix: string = &#39;&#39;;&lt;br /&gt;                         TwoCompl: Boolean = False): string;&lt;br /&gt;    function ToBytes: TBytes;&lt;br /&gt;    function TryParse(const S: string; TwoCompl: Boolean = False): Boolean;&lt;br /&gt;    procedure Free;&lt;br /&gt;&lt;br /&gt;    property Sign: Integer read GetSign;&lt;br /&gt;&lt;br /&gt;    class function Compare(const A, B: BigInteger): Integer; overload; static;&lt;br /&gt;    class function Compare(const A: BigInteger; const B: BigCardinal): Integer; overload; static;&lt;br /&gt;    class function Compare(const A: BigCardinal; const B: BigInteger): Integer; overload; static;&lt;br /&gt;    function CompareTo(const B: BigInteger): Integer; overload; inline;&lt;br /&gt;    function CompareTo(const B: BigCardinal): Integer; overload; inline;&lt;br /&gt;&lt;br /&gt;    class function Abs(const A: BigInteger): BigInteger; static;&lt;br /&gt;    class function Pow(const Base: BigInteger; Value: Cardinal): BigInteger; static;&lt;br /&gt;    class function DivRem(const Dividend, Divisor: BigCardinal;&lt;br /&gt;                          var Remainder: BigCardinal): BigCardinal; overload; static;&lt;br /&gt;&lt;br /&gt;    class operator Implicit(const Value: BigCardinal): BigInteger; inline;&lt;br /&gt;    class operator Explicit(const Value: BigInteger): BigCardinal; inline;&lt;br /&gt;&lt;br /&gt;    class operator Explicit(const Value: BigInteger): Cardinal;&lt;br /&gt;    class operator Explicit(const Value: BigInteger): UInt64;&lt;br /&gt;    class operator Explicit(const Value: BigInteger): Integer;&lt;br /&gt;    class operator Explicit(const Value: BigInteger): Int64;&lt;br /&gt;    class operator Implicit(const Value: UInt32): BigInteger;&lt;br /&gt;    class operator Implicit(const Value: UInt64): BigInteger;&lt;br /&gt;    class operator Implicit(const Value: Int32): BigInteger;&lt;br /&gt;    class operator Implicit(const Value: Int64): BigInteger;&lt;br /&gt;    class operator Explicit(const Value: TBytes): BigInteger;&lt;br /&gt;    class operator Explicit(const Value: string): BigInteger;&lt;br /&gt;&lt;br /&gt;    class operator Equal(const A, B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: BigInteger; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: BigCardinal; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A, B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: BigInteger; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: BigCardinal; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A, B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: BigInteger; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: BigCardinal; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A, B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: BigInteger; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: BigCardinal; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A, B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: BigInteger; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: BigCardinal; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A, B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: BigInteger; const B: BigCardinal): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: BigCardinal; const B: BigInteger): Boolean; inline;&lt;br /&gt;&lt;br /&gt;    class operator Add(const A, B: BigInteger): BigInteger;&lt;br /&gt;    class operator Subtract(const A, B: BigInteger): BigInteger;&lt;br /&gt;    class operator Multiply(const A, B: BigInteger): BigInteger;&lt;br /&gt;    class operator IntDivide(const A, B: BigInteger): BigInteger;&lt;br /&gt;    class operator Modulus(const A, B: BigInteger): BigInteger;&lt;br /&gt;&lt;br /&gt;    class operator LeftShift(const A: BigInteger; Shift: Cardinal): BigInteger;&lt;br /&gt;    class operator RightShift(const A: BigInteger; Shift: Cardinal): BigInteger;&lt;br /&gt;&lt;br /&gt;    class operator BitwiseAnd(const A, B: BigInteger): BigInteger;&lt;br /&gt;    class operator BitwiseOr(const A, B: BigInteger): BigInteger;&lt;br /&gt;    class operator BitwiseXor(const A, B: BigInteger): BigInteger;&lt;br /&gt;&lt;br /&gt;    function CompareToCard(const B: Cardinal): Integer;&lt;br /&gt;    function CompareToInt(const B: Integer): Integer;&lt;br /&gt;    function CompareTo(const B: Cardinal): Integer; overload; inline;&lt;br /&gt;    function CompareTo(const B: Integer): Integer; overload; inline;&lt;br /&gt;    class operator Equal(const A: BigInteger; const B: Cardinal): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: Cardinal; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: BigInteger; const B: Integer): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: Integer; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: BigInteger; const B: Cardinal): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: Cardinal; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: BigInteger; const B: Integer): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: Integer; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: BigInteger; const B: Cardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: Cardinal; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: BigInteger; const B: Integer): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: Integer; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: BigInteger; const B: Cardinal): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: Cardinal; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: BigInteger; const B: Integer): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: Integer; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: BigInteger; const B: Cardinal): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: Cardinal; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: BigInteger; const B: Integer): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: Integer; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: BigInteger; const B: Cardinal): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: Cardinal; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: BigInteger; const B: Integer): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: Integer; const B: BigInteger): Boolean; inline;&lt;br /&gt;&lt;br /&gt;    function CompareToDoubleUInt(const B: UInt64): Integer;&lt;br /&gt;    function CompareToDoubleInt(const B: Int64): Integer;&lt;br /&gt;    function CompareTo(const B: UInt64): Integer; overload; inline;&lt;br /&gt;    function CompareTo(const B: Int64): Integer; overload; inline;&lt;br /&gt;&lt;br /&gt;    class operator Equal(const A: BigInteger; const B: UInt64): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: UInt64; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: BigInteger; const B: Int64): Boolean; inline;&lt;br /&gt;    class operator Equal(const A: Int64; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: BigInteger; const B: UInt64): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: UInt64; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: BigInteger; const B: Int64): Boolean; inline;&lt;br /&gt;    class operator NotEqual(const A: Int64; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: BigInteger; const B: UInt64): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: UInt64; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: BigInteger; const B: Int64): Boolean; inline;&lt;br /&gt;    class operator GreaterThan(const A: Int64; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: BigInteger; const B: UInt64): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: UInt64; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: BigInteger; const B: Int64): Boolean; inline;&lt;br /&gt;    class operator GreaterThanOrEqual(const A: Int64; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: BigInteger; const B: UInt64): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: UInt64; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: BigInteger; const B: Int64): Boolean; inline;&lt;br /&gt;    class operator LessThan(const A: Int64; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: BigInteger; const B: UInt64): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: UInt64; const B: BigInteger): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: BigInteger; const B: Int64): Boolean; inline;&lt;br /&gt;    class operator LessThanOrEqual(const A: Int64; const B: BigInteger): Boolean; inline;&lt;br /&gt;&lt;br /&gt;    class function DivRem(const Dividend: BigInteger; const Divisor: Cardinal;&lt;br /&gt;                          var Remainder: BigInteger): BigInteger; overload; static;&lt;br /&gt;    class function DivRem(const Dividend: Cardinal; const Divisor: BigInteger;&lt;br /&gt;                          var Remainder: Cardinal): BigInteger; overload; static;&lt;br /&gt;    class function DivRem(const Dividend: BigInteger; const Divisor: Integer;&lt;br /&gt;                          var Remainder: Integer): BigInteger; overload; static;&lt;br /&gt;    class function DivRem(const Dividend: Integer; const Divisor: BigInteger;&lt;br /&gt;                          var Remainder: Integer): Integer; overload; static;&lt;br /&gt;&lt;br /&gt;    class operator Add(const A: BigInteger; const B: Cardinal): BigInteger;&lt;br /&gt;    class operator Add(const A: Cardinal; const B: BigInteger): BigInteger;&lt;br /&gt;    class operator Add(const A: BigInteger; const B: Integer): BigInteger;&lt;br /&gt;    class operator Add(const A: Integer; const B: BigInteger): BigInteger;&lt;br /&gt;    class operator Subtract(const A: BigInteger; const B: Cardinal): BigInteger;&lt;br /&gt;    class operator Subtract(const A: Cardinal; const B: BigInteger): BigInteger;&lt;br /&gt;    class operator Subtract(const A: BigInteger; const B: Integer): BigInteger;&lt;br /&gt;    class operator Subtract(const A: Integer; const B: BigInteger): BigInteger;&lt;br /&gt;    class operator Multiply(const A: BigInteger; const B: Cardinal): BigInteger;&lt;br /&gt;    class operator Multiply(const A: Cardinal; const B: BigInteger): BigInteger;&lt;br /&gt;    class operator Multiply(const A: BigInteger; const B: Integer): BigInteger;&lt;br /&gt;    class operator Multiply(const A: Integer; const B: BigInteger): BigInteger;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  EBigNumberError = class(Exception)&lt;br /&gt;  private&lt;br /&gt;    FCode: TF_RESULT;&lt;br /&gt;  public&lt;br /&gt;    constructor Create(ACode: TF_RESULT; const Msg: string);&lt;br /&gt;    property Code: TF_RESULT read FCode;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;procedure BigNumberError(ACode: TF_RESULT; const Msg: string);&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TBigNumberFromUInt32 = function(var A: IBigNumber; Value: UInt32): TF_RESULT; stdcall;&lt;br /&gt;  TBigNumberFromUInt64 = function(var A: IBigNumber; Value: UInt64): TF_RESULT; stdcall;&lt;br /&gt;  TBigNumberFromInt32 = function(var A: IBigNumber; Value: Int32): TF_RESULT; stdcall;&lt;br /&gt;  TBigNumberFromInt64 = function(var A: IBigNumber; Value: Int64): TF_RESULT; stdcall;&lt;br /&gt;  TBigNumberFromPChar = function(var A: IBigNumber; P: PByte; L: Integer;&lt;br /&gt;           CharSize: Integer; AllowNegative: Boolean; TwoCompl: Boolean): TF_RESULT; stdcall;&lt;br /&gt;  TBigNumberFromPByte = function(var A: IBigNumber;&lt;br /&gt;    P: PByte; L: Cardinal; AllowNegative: Boolean): TF_RESULT; stdcall;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  BigNumberFromUInt32: TBigNumberFromUInt32;&lt;br /&gt;  BigNumberFromUInt64: TBigNumberFromUInt64;&lt;br /&gt;  BigNumberFromInt32: TBigNumberFromInt32;&lt;br /&gt;  BigNumberFromInt64: TBigNumberFromInt64;&lt;br /&gt;  BigNumberFromPChar: TBigNumberFromPChar;&lt;br /&gt;  BigNumberFromPByte: TBigNumberFromPByte;&lt;br /&gt;&lt;br /&gt;{ EBigNumberError }&lt;br /&gt;&lt;br /&gt;constructor EBigNumberError.Create(ACode: TF_RESULT; const Msg: string);&lt;br /&gt;begin&lt;br /&gt;  inherited Create(Msg);&lt;br /&gt;  FCode:= ACode;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure BigNumberError(ACode: TF_RESULT; const Msg: string);&lt;br /&gt;begin&lt;br /&gt;  raise EBigNumberError.Create(ACode, Msg);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure HResCheck(Value: TF_RESULT; const ErrMsg: string); inline;&lt;br /&gt;begin&lt;br /&gt;  if Value &lt;&gt; S_OK then&lt;br /&gt;    BigNumberError(Value, ErrMsg);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ BigCardinal }&lt;br /&gt;&lt;br /&gt;function BigCardinal.ToString: string;&lt;br /&gt;var&lt;br /&gt;  BytesUsed: Integer;&lt;br /&gt;  L, L1: Integer;&lt;br /&gt;  P, P1: PByte;&lt;br /&gt;  I: Integer;&lt;br /&gt;  HR: TF_RESULT;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  BytesUsed:= FNumber.GetSize;&lt;br /&gt;// log(256) approximated from above by 41/17&lt;br /&gt;  L:= (BytesUsed * 41) div 17 + 1;&lt;br /&gt;  GetMem(P, L);&lt;br /&gt;  try&lt;br /&gt;    L1:= L;&lt;br /&gt;    HR:= FNumber.ToDec(P, L1);&lt;br /&gt;// -- kludge&lt;br /&gt;    if HR = TF_E_INVALIDARG then begin&lt;br /&gt;      FreeMem(P);&lt;br /&gt;      L:= L1;&lt;br /&gt;      GetMem(P, L);&lt;br /&gt;      HR:= FNumber.ToDec(P, L1);&lt;br /&gt;    end;&lt;br /&gt;// -- end of kludge&lt;br /&gt;    HResCheck(HR, &#39;BigCardinal -&gt; string conversion error&#39;);&lt;br /&gt;    SetLength(Result, L1);&lt;br /&gt;    P1:= P;&lt;br /&gt;    for I:= 1 to L1 do begin&lt;br /&gt;      Result[I]:= Char(P1^);&lt;br /&gt;      Inc(P1);&lt;br /&gt;    end;&lt;br /&gt;  finally&lt;br /&gt;    FreeMem(P);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigCardinal.ToHexString(Digits: Integer; const Prefix: string;&lt;br /&gt;                         TwoCompl: Boolean): string;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  L, L1: Integer;&lt;br /&gt;  P, P1: PByte;&lt;br /&gt;  HR: TF_RESULT;&lt;br /&gt;  I: Integer;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  HR:= FNumber.ToHex(nil, L, TwoCompl);&lt;br /&gt;  if HR = TF_E_INVALIDARG then begin&lt;br /&gt;    GetMem(P, L);&lt;br /&gt;    try&lt;br /&gt;      L1:= L;&lt;br /&gt;      HResCheck(FNumber.ToHex(P, L1, TwoCompl),&lt;br /&gt;                       &#39;BigCardinal -&gt; hex string conversion error&#39;);&lt;br /&gt;      if Digits &lt; L1 then Digits:= L1;&lt;br /&gt;      Inc(Digits, Length(Prefix));&lt;br /&gt;      SetLength(Result, Digits);&lt;br /&gt;      Move(Pointer(Prefix)^, Pointer(Result)^, Length(Prefix) * SizeOf(Char));&lt;br /&gt;      P1:= P;&lt;br /&gt;      I:= Length(Prefix);&lt;br /&gt;      while I + L1 &lt; Digits do begin&lt;br /&gt;        Inc(I);&lt;br /&gt;        Result[I]:= &#39;0&#39;;&lt;br /&gt;      end;&lt;br /&gt;      while I &lt; Digits do begin&lt;br /&gt;        Inc(I);&lt;br /&gt;        Result[I]:= Char(P1^);&lt;br /&gt;        Inc(P1);&lt;br /&gt;      end;&lt;br /&gt;    finally&lt;br /&gt;      FreeMem(P);&lt;br /&gt;    end;&lt;br /&gt;  end&lt;br /&gt;  else&lt;br /&gt;    BigNumberError(HR, &#39;BigCardinal -&gt; hex string conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigCardinal.ToBytes: TBytes;&lt;br /&gt;var&lt;br /&gt;  HR: TF_RESULT;&lt;br /&gt;  L: Cardinal;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  L:= 0;&lt;br /&gt;  HR:= FNumber.ToPByte(nil, L);&lt;br /&gt;  if (HR = TF_E_INVALIDARG) and (L &gt; 0) then begin&lt;br /&gt;    SetLength(Result, L);&lt;br /&gt;    HR:= FNumber.ToPByte(Pointer(Result), L);&lt;br /&gt;  end;&lt;br /&gt;  HResCheck(HR, &#39;BigCardinal -&gt; TBytes conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigCardinal.TryParse(const S: string; TwoCompl: Boolean): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= BigNumberFromPChar(FNumber, Pointer(S), Length(S),&lt;br /&gt;                              SizeOf(Char), False, TwoCompl) = TF_S_OK;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure BigCardinal.Free;&lt;br /&gt;begin&lt;br /&gt;  FNumber:= nil;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigCardinal.Compare(const A, B: BigCardinal): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.FNumber.CompareNumberU(B.FNumber);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigCardinal.CompareTo(const B: BigCardinal): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(Self, B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigCardinal.Pow(const Base: BigCardinal; Value: Cardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Base.FNumber.PowU(Value, Result.FNumber), &#39;BigCardinal.Power&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigCardinal.DivRem(const Dividend, Divisor: BigCardinal;&lt;br /&gt;                                  var Remainder: BigCardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Dividend.FNumber.DivRemNumberU(Divisor.FNumber,&lt;br /&gt;            Result.FNumber, Remainder.FNumber),&lt;br /&gt;            &#39;BigCardinal.DivRem&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Explicit(const Value: BigCardinal): Cardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Value.FNumber.ToLimb(Result),&lt;br /&gt;    &#39;BigCardinal -&gt; Cardinal conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Explicit(const Value: BigCardinal): Integer;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Value.FNumber.ToIntLimb(Result),&lt;br /&gt;    &#39;BigCardinal -&gt; Integer conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Explicit(const Value: BigCardinal): UInt64;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Value.FNumber.ToDblLimb(Result),&lt;br /&gt;    &#39;BigCardinal -&gt; UInt64 conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Explicit(const Value: BigCardinal): Int64;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Value.FNumber.ToDblIntLimb(Result),&lt;br /&gt;    &#39;BigCardinal -&gt; Int64 conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Implicit(const Value: Cardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(BigNumberFromUInt32(Result.FNumber, Value),&lt;br /&gt;            &#39;BigNumberFromLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Implicit(const Value: UInt64): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(BigNumberFromUInt64(Result.FNumber, Value),&lt;br /&gt;            &#39;BigNumberFromDblLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Explicit(const Value: Integer): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  if Value &lt; 0 then&lt;br /&gt;    BigNumberError(TF_E_INVALIDARG,&lt;br /&gt;      &#39;Integer -&gt; BigCardinal conversion error&#39;)&lt;br /&gt;  else begin&lt;br /&gt;    HResCheck(BigNumberFromInt32(Result.FNumber, Value),&lt;br /&gt;            &#39;TBigNumber.FromInteger&#39;);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Explicit(const Value: Int64): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  if Value &lt; 0 then&lt;br /&gt;    BigNumberError(TF_E_INVALIDARG,&lt;br /&gt;      &#39;Int64 -&gt; BigCardinal conversion error&#39;)&lt;br /&gt;  else begin&lt;br /&gt;    HResCheck(BigNumberFromInt64(Result.FNumber, Value),&lt;br /&gt;            &#39;BigNumberFromDblIntLimb&#39;);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Explicit(const Value: TBytes): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(BigNumberFromPByte(Result.FNumber,&lt;br /&gt;            Pointer(Value), Length(Value), False),&lt;br /&gt;    &#39;TBytes -&gt; BigCardinal conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Explicit(const Value: string): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(BigNumberFromPChar(Result.FNumber, Pointer(Value), Length(Value),&lt;br /&gt;                               SizeOf(Char), False, False),&lt;br /&gt;    &#39;string -&gt; BigCardinal conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Equal(const A, B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.NotEqual(const A, B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThan(const A, B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThanOrEqual(const A, B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThan(const A, B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThanOrEqual(const A, B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Add(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.AddNumberU(B.FNumber, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.Add&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Subtract(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.SubNumberU(B.FNumber, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.Subtract&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Multiply(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.MulNumberU(B.FNumber, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.Multiply&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.IntDivide(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;var&lt;br /&gt;  Remainder: IBigNumber;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.DivRemNumberU(B.FNumber, Result.FNumber, Remainder),&lt;br /&gt;            &#39;BigCardinal.IntDivide&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Modulus(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;var&lt;br /&gt;  Quotient: IBigNumber;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.DivRemNumberU(B.FNumber, Quotient, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.Modulus&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LeftShift(const A: BigCardinal; Shift: Cardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.ShlNumber(Shift, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.Shl&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.RightShift(const A: BigCardinal; Shift: Cardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.ShrNumber(Shift, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.Shr&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.BitwiseAnd(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.AndNumberU(B.FNumber, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.And&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.BitwiseOr(const A, B: BigCardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.OrNumberU(B.FNumber, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.Or&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigCardinal.CompareToCard(const B: Cardinal): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= FNumber.CompareToLimbU(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigCardinal.CompareToInt(const B: Integer): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= FNumber.CompareToIntLimbU(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigCardinal.CompareTo(const B: Cardinal): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= CompareToCard(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigCardinal.CompareTo(const B: Integer): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= CompareToInt(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Equal(const A: BigCardinal; const B: Cardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToCard(B) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Equal(const A: Cardinal; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToCard(A) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Equal(const A: BigCardinal; const B: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt(B) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Equal(const A: Integer; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt(A) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.NotEqual(const A: BigCardinal; const B: Cardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToCard(B) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.NotEqual(const A: Cardinal; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToCard(A) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.NotEqual(const A: BigCardinal; const B: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt(B) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.NotEqual(const A: Integer; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt(A) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThan(const A: BigCardinal; const B: Cardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToCard(B) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThan(const A: Cardinal; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToCard(A) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThan(const A: BigCardinal; const B: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt(B) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThan(const A: Integer; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt(A) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThanOrEqual(const A: BigCardinal; const B: Cardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToCard(B) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThanOrEqual(const A: Cardinal; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToCard(A) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThanOrEqual(const A: BigCardinal; const B: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt(B) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThanOrEqual(const A: Integer; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt(A) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThan(const A: BigCardinal; const B: Cardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToCard(B) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThan(const A: Cardinal; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToCard(A) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThan(const A: BigCardinal; const B: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt(B) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThan(const A: Integer; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt(A) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThanOrEqual(const A: BigCardinal; const B: Cardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToCard(B) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThanOrEqual(const A: Cardinal; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToCard(A) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThanOrEqual(const A: BigCardinal; const B: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt(B) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThanOrEqual(const A: Integer; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt(A) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{--- Comparison with 64-bit integers ---}&lt;br /&gt;&lt;br /&gt;function BigCardinal.CompareToUInt64(const B: UInt64): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= FNumber.CompareToDblLimbU(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigCardinal.CompareToInt64(const B: Int64): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= FNumber.CompareToDblIntLimbU(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigCardinal.CompareTo(const B: UInt64): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= CompareToUInt64(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigCardinal.CompareTo(const B: Int64): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= CompareToInt64(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Equal(const A: BigCardinal; const B: UInt64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToUInt64(B) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Equal(const A: UInt64; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToUInt64(A) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Equal(const A: BigCardinal; const B: Int64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt64(B) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Equal(const A: Int64; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt64(A) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.NotEqual(const A: BigCardinal; const B: UInt64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToUInt64(B) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.NotEqual(const A: UInt64; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToUInt64(A) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.NotEqual(const A: BigCardinal; const B: Int64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt64(B) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.NotEqual(const A: Int64; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt64(A) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThan(const A: BigCardinal; const B: UInt64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToUInt64(B) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThan(const A: UInt64; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToUInt64(A) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThan(const A: BigCardinal; const B: Int64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt64(B) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThan(const A: Int64; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt64(A) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThanOrEqual(const A: BigCardinal; const B: UInt64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToUInt64(B) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThanOrEqual(const A: UInt64; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToUInt64(A) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThanOrEqual(const A: BigCardinal; const B: Int64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt64(B) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.GreaterThanOrEqual(const A: Int64; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt64(A) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThan(const A: BigCardinal; const B: UInt64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToUInt64(B) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThan(const A: UInt64; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToUInt64(A) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThan(const A: BigCardinal; const B: Int64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt64(B) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThan(const A: Int64; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt64(A) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThanOrEqual(const A: BigCardinal; const B: UInt64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToUInt64(B) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThanOrEqual(const A: UInt64; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToUInt64(A) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThanOrEqual(const A: BigCardinal; const B: Int64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt64(B) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.LessThanOrEqual(const A: Int64; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt64(A) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Add(const A: BigCardinal; const B: Cardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.AddLimbU(B, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.AddLimbU&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Add(const A: Cardinal; const B: BigCardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(B.FNumber.AddLimbU(A, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.AddLimbU&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Subtract(const A: BigCardinal; const B: Cardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.SubLimbU(B, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.SubLimbU&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Subtract(const A: Cardinal; const B: BigCardinal): Cardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(B.FNumber.SubLimbU2(A, Result),&lt;br /&gt;            &#39;BigCardinal.SubLimbU2&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Multiply(const A: BigCardinal; const B: Cardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.MulLimbU(B, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.MulLimbU&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Multiply(const A: Cardinal; const B: BigCardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(B.FNumber.MulLimbU(A, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.MulLimbU&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class function BigCardinal.DivRem(const Dividend: BigCardinal;&lt;br /&gt;               Divisor: Cardinal; var Remainder: Cardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Dividend.FNumber.DivRemLimbU(Divisor, Result.FNumber, Remainder),&lt;br /&gt;            &#39;BigCardinal.DivRemLimbU&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigCardinal.DivRem(const Dividend: Cardinal;&lt;br /&gt;               Divisor: BigCardinal; var Remainder: Cardinal): Cardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Divisor.FNumber.DivRemLimbU2(Dividend, Result, Remainder),&lt;br /&gt;            &#39;BigCardinal.DivRemLimbU2&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.IntDivide(const A: BigCardinal; const B: Cardinal): BigCardinal;&lt;br /&gt;var&lt;br /&gt;  Remainder: Cardinal;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.DivRemLimbU(B, Result.FNumber, Remainder),&lt;br /&gt;            &#39;BigCardinal.IntDivide&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.IntDivide(const A: Cardinal; const B: BigCardinal): Cardinal;&lt;br /&gt;var&lt;br /&gt;  Remainder: Cardinal;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(B.FNumber.DivRemLimbU2(A, Result, Remainder),&lt;br /&gt;            &#39;BigCardinal.IntDivide&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Modulus(const A: BigCardinal; const B: Cardinal): Cardinal;&lt;br /&gt;var&lt;br /&gt;  Quotient: IBigNumber;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.DivRemLimbU(B, Quotient, Result),&lt;br /&gt;            &#39;BigCardinal.Modulus&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class operator BigCardinal.Modulus(const A: Cardinal; const B: BigCardinal): Cardinal;&lt;br /&gt;var&lt;br /&gt;  Quotient: Cardinal;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(B.FNumber.DivRemLimbU2(A, Quotient, Result),&lt;br /&gt;            &#39;BigCardinal.Modulus&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ -------------------------- BigInteger -------------------------- }&lt;br /&gt;&lt;br /&gt;function BigInteger.GetSign: Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= FNumber.GetSign;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.ToString: string;&lt;br /&gt;var&lt;br /&gt;  BytesUsed: Integer;&lt;br /&gt;  L, L1: Integer;&lt;br /&gt;  P, P1: PByte;&lt;br /&gt;  I: Integer;&lt;br /&gt;  IsMinus: Boolean;&lt;br /&gt;  HR: TF_RESULT;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  BytesUsed:= FNumber.GetSize;&lt;br /&gt;// log(256) approximated from above by 41/17&lt;br /&gt;  L:= (BytesUsed * 41) div 17 + 1;&lt;br /&gt;  GetMem(P, L);&lt;br /&gt;  try&lt;br /&gt;    L1:= L;&lt;br /&gt;    HR:= FNumber.ToDec(P, L1);&lt;br /&gt;// -- kludge&lt;br /&gt;    if HR = TF_E_INVALIDARG then begin&lt;br /&gt;      FreeMem(P);&lt;br /&gt;      L:= L1;&lt;br /&gt;      GetMem(P, L);&lt;br /&gt;      HR:= FNumber.ToDec(P, L1);&lt;br /&gt;    end;&lt;br /&gt;// -- end of kludge&lt;br /&gt;    HResCheck(HR, &#39;BigInteger -&gt; string conversion error&#39;);&lt;br /&gt;    IsMinus:= GetSign &lt; 0;&lt;br /&gt;    if IsMinus then Inc(L1);&lt;br /&gt;    SetLength(Result, L1);&lt;br /&gt;    I:= 1;&lt;br /&gt;    if IsMinus then begin&lt;br /&gt;      Result[1]:= &#39;-&#39;;&lt;br /&gt;      Inc(I);&lt;br /&gt;    end;&lt;br /&gt;    P1:= P;&lt;br /&gt;    while I &lt;= L1 do begin&lt;br /&gt;      Result[I]:= Char(P1^);&lt;br /&gt;      Inc(P1);&lt;br /&gt;      Inc(I);&lt;br /&gt;    end;&lt;br /&gt;  finally&lt;br /&gt;    FreeMem(P);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.ToHexString(Digits: Integer; const Prefix: string;&lt;br /&gt;                                TwoCompl: Boolean): string;&lt;br /&gt;const&lt;br /&gt;  ASCII_8 = 56;   // Ord(&#39;8&#39;)&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  L, L1: Integer;&lt;br /&gt;  P, P1: PByte;&lt;br /&gt;  HR: TF_RESULT;&lt;br /&gt;  Filler: Char;&lt;br /&gt;  I: Integer;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  Result:= &#39;&#39;;&lt;br /&gt;  HR:= FNumber.ToHex(nil, L, TwoCompl);&lt;br /&gt;  if HR = TF_E_INVALIDARG then begin&lt;br /&gt;    GetMem(P, L);&lt;br /&gt;    try&lt;br /&gt;      L1:= L;&lt;br /&gt;      HResCheck(FNumber.ToHex(P, L1, TwoCompl),&lt;br /&gt;                       &#39;BigInteger -&gt; hex string conversion error&#39;);&lt;br /&gt;      if Digits &lt; L1 then Digits:= L1;&lt;br /&gt;      I:= 1;&lt;br /&gt;      if (FNumber.GetSign &lt; 0) and not TwoCompl then begin&lt;br /&gt;        Inc(I);&lt;br /&gt;        SetLength(Result, Digits + Length(Prefix) + 1);&lt;br /&gt;        Result[1]:= &#39;-&#39;;&lt;br /&gt;      end&lt;br /&gt;      else&lt;br /&gt;        SetLength(Result, Digits + Length(Prefix));&lt;br /&gt;      Move(Pointer(Prefix)^, Result[I], Length(Prefix) * SizeOf(Char));&lt;br /&gt;      Inc(I, Length(Prefix));&lt;br /&gt;      if Digits &gt; L1 then begin&lt;br /&gt;        if TwoCompl and (P[L1] &gt;= ASCII_8) then Filler:= &#39;F&#39;&lt;br /&gt;        else Filler:= &#39;0&#39;;&lt;br /&gt;        while I + L1 &lt;= Length(Result) do begin&lt;br /&gt;          Result[I]:= Filler;&lt;br /&gt;          Inc(I);&lt;br /&gt;        end;&lt;br /&gt;      end;&lt;br /&gt;      P1:= P;&lt;br /&gt;      while I &lt;= Length(Result) do begin&lt;br /&gt;        Result[I]:= Char(P1^);&lt;br /&gt;        Inc(I);&lt;br /&gt;        Inc(P1);&lt;br /&gt;      end;&lt;br /&gt;    finally&lt;br /&gt;      FreeMem(P);&lt;br /&gt;    end;&lt;br /&gt;  end&lt;br /&gt;  else&lt;br /&gt;    BigNumberError(HR, &#39;BigInteger -&gt; hex string conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.ToBytes: TBytes;&lt;br /&gt;var&lt;br /&gt;  HR: TF_RESULT;&lt;br /&gt;  L: Cardinal;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  L:= 0;&lt;br /&gt;  HR:= FNumber.ToPByte(nil, L);&lt;br /&gt;  if (HR = TF_E_INVALIDARG) and (L &gt; 0) then begin&lt;br /&gt;    SetLength(Result, L);&lt;br /&gt;    HR:= FNumber.ToPByte(Pointer(Result), L);&lt;br /&gt;  end;&lt;br /&gt;  HResCheck(HR, &#39;BigInteger -&gt; TBytes conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.TryParse(const S: string; TwoCompl: Boolean): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= BigNumberFromPChar(FNumber, Pointer(S), Length(S),&lt;br /&gt;                              SizeOf(Char), True, TwoCompl) = TF_S_OK;&lt;br /&gt;//  Result:= BigNumberFromPWideChar(FNumber, Pointer(S), Length(S),&lt;br /&gt;//              True) = TF_S_OK;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure BigInteger.Free;&lt;br /&gt;begin&lt;br /&gt;  FNumber:= nil;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigInteger.Compare(const A, B: BigInteger): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.FNumber.CompareNumber(B.FNumber);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigInteger.Compare(const A: BigInteger; const B: BigCardinal): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.FNumber.CompareNumber(B.FNumber);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigInteger.Compare(const A: BigCardinal; const B: BigInteger): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.FNumber.CompareNumber(B.FNumber);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.CompareTo(const B: BigInteger): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(Self, B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.CompareTo(const B: BigCardinal): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(Self, B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigInteger.Abs(const A: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.AbsNumber(Result.FNumber), &#39;BigInteger.Abs&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigInteger.Pow(const Base: BigInteger; Value: Cardinal): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Base.FNumber.Pow(Value, Result.FNumber),&lt;br /&gt;                        &#39;BigInteger.Power&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigInteger.DivRem(const Dividend, Divisor: BigCardinal;&lt;br /&gt;               var Remainder: BigCardinal): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Dividend.FNumber.DivRemNumber(Divisor.FNumber,&lt;br /&gt;            Result.FNumber, Remainder.FNumber),&lt;br /&gt;            &#39;BigInteger.DivRem&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Implicit(const Value: BigCardinal): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  Result.FNumber:= Value.FNumber;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Explicit(const Value: BigInteger): BigCardinal;&lt;br /&gt;begin&lt;br /&gt;  if (Value.FNumber.GetSign &lt; 0) then&lt;br /&gt;      BigNumberError(TF_E_INVALIDARG, &#39;Negative value&#39;);&lt;br /&gt;  Result.FNumber:= Value.FNumber;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Explicit(const Value: BigInteger): Cardinal;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Value.FNumber.ToLimb(Result),&lt;br /&gt;    &#39;BigInteger -&gt; UInt32 conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Explicit(const Value: BigInteger): UInt64;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Value.FNumber.ToDblLimb(Result),&lt;br /&gt;    &#39;BigInteger -&gt; UInt64 conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Explicit(const Value: BigInteger): Integer;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Value.FNumber.ToIntLimb(Result),&lt;br /&gt;    &#39;BigInteger -&gt; Int32 conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Explicit(const Value: BigInteger): Int64;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Value.FNumber.ToDblIntLimb(Result),&lt;br /&gt;    &#39;BigInteger -&gt; Int64 conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Implicit(const Value: UInt32): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(BigNumberFromUInt32(Result.FNumber, Value),&lt;br /&gt;            &#39;BigNumberFromLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Implicit(const Value: UInt64): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(BigNumberFromUInt64(Result.FNumber, Value),&lt;br /&gt;            &#39;BigNumberFromDblLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Implicit(const Value: Int32): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(BigNumberFromInt32(Result.FNumber, Value),&lt;br /&gt;            &#39;BigNumberFromIntLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Implicit(const Value: Int64): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(BigNumberFromInt64(Result.FNumber, Value),&lt;br /&gt;            &#39;BigNumberFromDblIntLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Explicit(const Value: TBytes): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(BigNumberFromPByte(Result.FNumber,&lt;br /&gt;            Pointer(Value), Length(Value), True),&lt;br /&gt;            &#39;TBytes -&gt; BigInteger conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Explicit(const Value: string): BigInteger;&lt;br /&gt;begin&lt;br /&gt;//  HResCheck(BigNumberFromPWideChar(Result.FNumber, Pointer(Value),&lt;br /&gt;//            Length(Value), True),&lt;br /&gt;  HResCheck(BigNumberFromPChar(Result.FNumber, Pointer(Value), Length(Value),&lt;br /&gt;                               SizeOf(Char), True, False),&lt;br /&gt;            &#39;string -&gt; BigInteger conversion error&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Equal(const A, B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Equal(const A: BigCardinal; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Equal(const A: BigInteger; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.NotEqual(const A, B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.NotEqual(const A: BigCardinal; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.NotEqual(const A: BigInteger; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThan(const A, B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThan(const A: BigInteger; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThan(const A: BigCardinal; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThanOrEqual(const A, B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThanOrEqual(const A: BigInteger; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThanOrEqual(const A: BigCardinal; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThan(const A, B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThan(const A: BigInteger; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThan(const A: BigCardinal; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThanOrEqual(const A, B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThanOrEqual(const A: BigInteger; const B: BigCardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThanOrEqual(const A: BigCardinal; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= Compare(A, B) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Add(const A, B: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.AddNumber(B.FNumber, Result.FNumber), &#39;BigInteger.Add&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Subtract(const A, B: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.SubNumber(B.FNumber, Result.FNumber), &#39;BigInteger.Subtract&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Multiply(const A, B: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.MulNumber(B.FNumber, Result.FNumber), &#39;BigInteger.Multiply&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.IntDivide(const A, B: BigInteger): BigInteger;&lt;br /&gt;var&lt;br /&gt;  Remainder: IBigNumber;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.DivRemNumber(B.FNumber, Result.FNumber, Remainder),&lt;br /&gt;            &#39;BigInteger.IntDivide&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Modulus(const A, B: BigInteger): BigInteger;&lt;br /&gt;var&lt;br /&gt;  Quotient: IBigNumber;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.DivRemNumber(B.FNumber, Quotient, Result.FNumber),&lt;br /&gt;            &#39;BigInteger.Modulus&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LeftShift(const A: BigInteger; Shift: Cardinal): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.ShlNumber(Shift, Result.FNumber),&lt;br /&gt;   &#39;BigInteger.Shl&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.RightShift(const A: BigInteger; Shift: Cardinal): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.ShrNumber(Shift, Result.FNumber),&lt;br /&gt;   &#39;BigInteger.Shr&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.BitwiseAnd(const A, B: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.AndNumber(B.FNumber, Result.FNumber),&lt;br /&gt;                       &#39;BigInteger.And&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.BitwiseOr(const A, B: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.OrNumber(B.FNumber, Result.FNumber),&lt;br /&gt;                       &#39;BigInteger.Or&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.BitwiseXor(const A, B: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.XorNumber(B.FNumber, Result.FNumber),&lt;br /&gt;                       &#39;BigInteger.Xor&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.CompareToCard(const B: Cardinal): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= FNumber.CompareToLimb(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.CompareToInt(const B: Integer): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= FNumber.CompareToIntLimb(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.CompareTo(const B: Cardinal): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= CompareToCard(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.CompareTo(const B: Integer): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= CompareToInt(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Equal(const A: BigInteger; const B: Cardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToCard(B) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Equal(const A: Cardinal; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToCard(A) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Equal(const A: BigInteger; const B: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt(B) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Equal(const A: Integer; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt(A) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.NotEqual(const A: BigInteger; const B: Cardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToCard(B) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.NotEqual(const A: Cardinal; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToCard(A) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.NotEqual(const A: BigInteger; const B: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt(B) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.NotEqual(const A: Integer; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt(A) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThan(const A: BigInteger; const B: Cardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToCard(B) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThan(const A: Cardinal; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToCard(A) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThan(const A: BigInteger; const B: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt(B) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThan(const A: Integer; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt(A) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThanOrEqual(const A: BigInteger; const B: Cardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToCard(B) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThanOrEqual(const A: Cardinal; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToCard(A) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThanOrEqual(const A: BigInteger; const B: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt(B) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThanOrEqual(const A: Integer; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt(A) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThan(const A: BigInteger; const B: Cardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToCard(B) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThan(const A: Cardinal; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToCard(A) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThan(const A: BigInteger; const B: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt(B) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThan(const A: Integer; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt(A) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThanOrEqual(const A: BigInteger; const B: Cardinal): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToCard(B) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThanOrEqual(const A: Cardinal; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToCard(A) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThanOrEqual(const A: BigInteger; const B: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToInt(B) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThanOrEqual(const A: Integer; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToInt(A) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function BigInteger.CompareToDoubleUInt(const B: UInt64): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= FNumber.CompareToDblLimb(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.CompareToDoubleInt(const B: Int64): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= FNumber.CompareToDblIntLimb(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.CompareTo(const B: UInt64): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= CompareToDoubleUInt(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigInteger.CompareTo(const B: Int64): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result:= CompareToDoubleInt(B);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Equal(const A: BigInteger; const B: UInt64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToDoubleUInt(B) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Equal(const A: UInt64; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToDoubleUInt(A) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Equal(const A: BigInteger; const B: Int64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToDoubleInt(B) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Equal(const A: Int64; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToDoubleInt(A) = 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.NotEqual(const A: BigInteger; const B: UInt64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToDoubleUInt(B) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.NotEqual(const A: UInt64; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToDoubleUInt(A) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.NotEqual(const A: BigInteger; const B: Int64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToDoubleInt(B) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.NotEqual(const A: Int64; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToDoubleInt(A) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThan(const A: BigInteger; const B: UInt64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToDoubleUInt(B) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThan(const A: UInt64; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToDoubleUInt(A) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThan(const A: BigInteger; const B: Int64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToDoubleInt(B) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThan(const A: Int64; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToDoubleInt(A) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThanOrEqual(const A: BigInteger; const B: UInt64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToDoubleUInt(B) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThanOrEqual(const A: UInt64; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToDoubleUInt(A) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThanOrEqual(const A: BigInteger; const B: Int64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToDoubleInt(B) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.GreaterThanOrEqual(const A: Int64; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToDoubleInt(A) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThan(const A: BigInteger; const B: UInt64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToDoubleUInt(B) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThan(const A: UInt64; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToDoubleUInt(A) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThan(const A: BigInteger; const B: Int64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToDoubleInt(B) &lt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThan(const A: Int64; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToDoubleInt(A) &gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThanOrEqual(const A: BigInteger; const B: UInt64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToDoubleUInt(B) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThanOrEqual(const A: UInt64; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToDoubleUInt(A) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThanOrEqual(const A: BigInteger; const B: Int64): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= A.CompareToDoubleInt(B) &lt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.LessThanOrEqual(const A: Int64; const B: BigInteger): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result:= B.CompareToDoubleInt(A) &gt;= 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigInteger.DivRem(const Dividend: BigInteger;&lt;br /&gt;               const Divisor: Cardinal; var Remainder: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Dividend.FNumber.DivRemLimb(Divisor, Result.FNumber, Remainder.FNumber),&lt;br /&gt;            &#39;BigCardinal.DivRemLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigInteger.DivRem(const Dividend: Cardinal;&lt;br /&gt;               const Divisor: BigInteger; var Remainder: Cardinal): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Divisor.FNumber.DivRemLimb2(Dividend, Result.FNumber, Remainder),&lt;br /&gt;            &#39;BigCardinal.DivRemLimb2&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigInteger.DivRem(const Dividend: BigInteger;&lt;br /&gt;               const Divisor: Integer; var Remainder: Integer): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Dividend.FNumber.DivRemIntLimb(Divisor, Result.FNumber, Remainder),&lt;br /&gt;            &#39;BigCardinal.DivRemIntLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function BigInteger.DivRem(const Dividend: Integer;&lt;br /&gt;               const Divisor: BigInteger; var Remainder: Integer): Integer;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(Divisor.FNumber.DivRemIntLimb2(Dividend, Result, Remainder),&lt;br /&gt;            &#39;BigCardinal.DivRemIntLimb2&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Add(const A: BigInteger; const B: Cardinal): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.AddLimb(B, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.AddLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Add(const A: Cardinal; const B: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(B.FNumber.AddLimb(A, Result.FNumber),&lt;br /&gt;            &#39;BigCardinal.AddLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Add(const A: BigInteger; const B: Integer): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.AddIntLimb(B, Result.FNumber),&lt;br /&gt;           &#39;BigInteger.AddIntLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Add(const A: Integer; const B: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(B.FNumber.AddIntLimb(A, Result.FNumber),&lt;br /&gt;            &#39;BigInteger.AddIntLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Subtract(const A: BigInteger; const B: Cardinal): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.SubLimb(B, Result.FNumber),&lt;br /&gt;            &#39;BigInteger.Subtract&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Subtract(const A: Cardinal; const B: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(B.FNumber.SubLimb2(A, Result.FNumber),&lt;br /&gt;            &#39;BigInteger.Subtract&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Subtract(const A: BigInteger; const B: Integer): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.SubIntLimb(B, Result.FNumber),&lt;br /&gt;            &#39;BigInteger.Subtract&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Subtract(const A: Integer; const B: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(B.FNumber.SubIntLimb2(A, Result.FNumber),&lt;br /&gt;            &#39;BigInteger.Subtract&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Multiply(const A: BigInteger; const B: Cardinal): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.MulLimb(B, Result.FNumber),&lt;br /&gt;            &#39;BigInteger.MulLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Multiply(const A: Cardinal; const B: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(B.FNumber.MulLimb(A, Result.FNumber),&lt;br /&gt;            &#39;BigInteger.MulLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Multiply(const A: BigInteger; const B: Integer): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(A.FNumber.MulIntLimb(B, Result.FNumber),&lt;br /&gt;            &#39;BigInteger.MulIntLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class operator BigInteger.Multiply(const A: Integer; const B: BigInteger): BigInteger;&lt;br /&gt;begin&lt;br /&gt;  HResCheck(B.FNumber.MulIntLimb(A, Result.FNumber),&lt;br /&gt;            &#39;BigInteger.MulIntLimb&#39;);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// -------------------------------------------------------------- //&lt;br /&gt;&lt;br /&gt;function BigNumberFrom32Stub(var A: IBigNumber; Value: UInt32): TF_RESULT; stdcall;&lt;br /&gt;begin&lt;br /&gt;  Result:= TF_E_LOADERROR;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigNumberFrom64Stub(var A: IBigNumber; Value: UInt64): TF_RESULT; stdcall;&lt;br /&gt;begin&lt;br /&gt;  Result:= TF_E_LOADERROR;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigNumberFromPCharStub(var A: IBigNumber; P: PByte; L: Integer;&lt;br /&gt;           CharSize: Integer; AllowNegative: Boolean; TwoCompl: Boolean): TF_RESULT; stdcall;&lt;br /&gt;begin&lt;br /&gt;  Result:= TF_E_LOADERROR;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function BigNumberFromPByteStub(var A: IBigNumber;&lt;br /&gt;           P: PByte; L: Cardinal; AllowNegative: Boolean): TF_RESULT; stdcall;&lt;br /&gt;begin&lt;br /&gt;  Result:= TF_E_LOADERROR;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;{$IFDEF WIN64}&lt;br /&gt;  LibName = &#39;numerics64.dll&#39;;&lt;br /&gt;{$ELSE}&lt;br /&gt;  LibName = &#39;numerics32.dll&#39;;&lt;br /&gt;{$ENDIF}&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  LibHandle: THandle = 0;&lt;br /&gt;&lt;br /&gt;function LoadLib: Boolean;&lt;br /&gt;begin&lt;br /&gt;  if LibHandle &lt;&gt; 0 then begin&lt;br /&gt;    Result:= True;&lt;br /&gt;    Exit;&lt;br /&gt;  end;&lt;br /&gt;  Result:= False;&lt;br /&gt;  LibHandle:= LoadLibrary(LibName);&lt;br /&gt;  if LibHandle &lt;&gt; 0 then begin&lt;br /&gt;    @BigNumberFromUInt32:= GetProcAddress(LibHandle, &#39;BigNumberFromLimb&#39;);&lt;br /&gt;    @BigNumberFromUInt64:= GetProcAddress(LibHandle, &#39;BigNumberFromDblLimb&#39;);&lt;br /&gt;    @BigNumberFromInt32:= GetProcAddress(LibHandle, &#39;BigNumberFromIntLimb&#39;);&lt;br /&gt;    @BigNumberFromInt64:= GetProcAddress(LibHandle, &#39;BigNumberFromDblIntLimb&#39;);&lt;br /&gt;    @BigNumberFromPChar:= GetProcAddress(LibHandle, &#39;BigNumberFromPChar&#39;);&lt;br /&gt;    @BigNumberFromPByte:= GetProcAddress(LibHandle, &#39;BigNumberFromPByte&#39;);&lt;br /&gt;    Result:= (@BigNumberFromUInt32 &lt;&gt; nil)&lt;br /&gt;             and (@BigNumberFromUInt64 &lt;&gt; nil)&lt;br /&gt;             and (@BigNumberFromInt32 &lt;&gt; nil)&lt;br /&gt;             and (@BigNumberFromInt64 &lt;&gt; nil)&lt;br /&gt;             and (@BigNumberFromPChar &lt;&gt; nil)&lt;br /&gt;             and (@BigNumberFromPByte &lt;&gt; nil)&lt;br /&gt;  end;&lt;br /&gt;  if not Result then begin&lt;br /&gt;    @BigNumberFromUInt32:= @BigNumberFrom32Stub;&lt;br /&gt;    @BigNumberFromUInt64:= @BigNumberFrom64Stub;&lt;br /&gt;    @BigNumberFromInt32:= @BigNumberFrom32Stub;&lt;br /&gt;    @BigNumberFromInt64:= @BigNumberFrom64Stub;&lt;br /&gt;    @BigNumberFromPChar:= @BigNumberFromPCharStub;&lt;br /&gt;    @BigNumberFromPByte:= @BigNumberFromPByteStub;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;initialization&lt;br /&gt;  LoadLib;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/7915210037619549729/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2013/08/numerics-delphi-fpc.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/7915210037619549729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/7915210037619549729'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2013/08/numerics-delphi-fpc.html' title='Numerics для Delphi &amp; FPC (работа с большими числами)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-6163295633643193025</id><published>2013-07-23T03:43:00.000+04:00</published><updated>2013-08-04T16:19:04.244+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CnPack IDE-Мастер"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><title type='text'>CnPack IDE-Мастер: подсветка операторов управления потоком выполнения</title><content type='html'>В меню &lt;i&gt;CnPack -&gt; Настройки IDE-расширений -&gt; Подсветка синтаксиса&lt;/i&gt; появилась новая опция - &quot;Выделять операторы упр. потоком выполнения&quot;:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-k-XE4VLjVz0/Ueuh4jYQbuI/AAAAAAAAAaA/olvu3fCYF-Q/s1600/Flow.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-k-XE4VLjVz0/Ueuh4jYQbuI/AAAAAAAAAaA/olvu3fCYF-Q/s1600/Flow.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;При включенной опции такие конструкции как &lt;i&gt;Exit/Abort/Break/Continue/Raise&lt;/i&gt; будут выделены:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-iTa0kFnzqHY/Ue3DU5wEU9I/AAAAAAAAAac/3Fq5wr73-E4/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-iTa0kFnzqHY/Ue3DU5wEU9I/AAAAAAAAAac/3Fq5wr73-E4/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/6163295633643193025/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2013/07/cnpack-ide.html#comment-form' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/6163295633643193025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/6163295633643193025'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2013/07/cnpack-ide.html' title='CnPack IDE-Мастер: подсветка операторов управления потоком выполнения'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-k-XE4VLjVz0/Ueuh4jYQbuI/AAAAAAAAAaA/olvu3fCYF-Q/s72-c/Flow.png" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-2029378307585890355</id><published>2013-07-18T14:51:00.000+04:00</published><updated>2013-07-18T15:59:19.056+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><title type='text'>Что бы сделали мы с Delphi XE5/XE6/...</title><content type='html'>Уважаемые читатели блога и ленты &lt;a href=&quot;http://Delphifeeds.ru&quot;&gt;Delphifeeds.ru&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Приглашаю всех неравнодушных к Delphi поучаствовать в следующем опросе. Задача такая - укажите в комментариях от 1 до 3 желаемых или просто необходимых фич в будущих версиях Delphi, которые с Вашей точки зрения способствовали бы развитию всестороннему продукта. Комментарии также могут относится к продукту не напрямую (например, рекомендация &quot;проводить больше вебинаров&quot;). Свои соображения я оставляю первым комментарием.&lt;br /&gt;&lt;br /&gt;Старайтесь выражать мысли кратко и лаконично. В начале осени мы подведем итоги и составим &quot;график желаний&quot;.</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/2029378307585890355/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2013/07/vote-for-delphi-xe5-xe6.html#comment-form' title='Комментарии: 107'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/2029378307585890355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/2029378307585890355'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2013/07/vote-for-delphi-xe5-xe6.html' title='Что бы сделали мы с Delphi XE5/XE6/...'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>107</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-3459433026762292945</id><published>2013-07-05T10:52:00.000+04:00</published><updated>2013-07-19T05:05:45.849+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Переводы"/><title type='text'>Как программно завершить работу, сделать перезагрузку, перевести компьютер в ждущий режим или выйти из системы в OS X?</title><content type='html'>Одним из простых путей является использование объекта Cocoa NSAppleScript для запуска следующего скрипта:&lt;br /&gt;&lt;pre class=&quot;brush: plain&quot;&gt;tell application &quot;Finder&quot; to shut down&lt;br /&gt;&lt;/pre&gt;И, конечно, ‘to shut down’ может быть заменено на ‘to restart’, ‘to sleep’ или ‘to log out’.&lt;br /&gt;&lt;br /&gt;В последних версиях Delphi NSAppleScript (или если быть более точным - его интерфейс) объявлен в модуле Macapi.Foundation. Увы, объявлен он не совсем точно (см. &lt;a href=&quot;http://qc.embarcadero.com/wc/qcmain.aspx?d=100934&quot;&gt;здесь&lt;/a&gt;), поэтому его необходимо немного подправить следующим образом:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;uses&lt;br /&gt;  Macapi.ObjectiveC, Macapi.CocoaTypes, Macapi.Foundation;&lt;br /&gt; &lt;br /&gt;type&lt;br /&gt;  NSAppleScript = interface(NSObject)&lt;br /&gt;    [&#39;{0AB1D902-25CE-4F0B-A3BE-C4ABEDEB88BC}&#39;]&lt;br /&gt;    function compileAndReturnError(errorInfo: Pointer): Boolean; cdecl;&lt;br /&gt;    function executeAndReturnError(errorInfo: Pointer): Pointer; cdecl;&lt;br /&gt;    function executeAppleEvent(event: NSAppleEventDescriptor; error: Pointer): Pointer; cdecl;&lt;br /&gt;    function initWithContentsOfURL(url: NSURL; error: Pointer): Pointer; cdecl;&lt;br /&gt;    function initWithSource(source: NSString): Pointer; cdecl;&lt;br /&gt;    function isCompiled: Boolean; cdecl;&lt;br /&gt;    function source: NSString; cdecl;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  TNSAppleScript = class(TOCGenericImport&amp;lt;NSAppleScriptClass, NSAppleScript&amp;gt;)  &lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt; &lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  Script: NSAppleScript;&lt;br /&gt;  Error: Pointer;&lt;br /&gt;begin&lt;br /&gt;  Error := nil;&lt;br /&gt;  Script := TNSAppleScript.Wrap(TNSAppleScript.Alloc.initWithSource(&lt;br /&gt;    NSSTR(&#39;tell application &quot;Finder&quot; to shut down&#39;)));&lt;br /&gt;  try&lt;br /&gt;    if Script.executeAndReturnError(Error) = nil then&lt;br /&gt;      raise EOSError.Create(&#39;AppleScript macro failed&#39;);&lt;br /&gt;  finally&lt;br /&gt;    Script.release;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;И все работает прекрасно.&lt;br /&gt;&lt;br /&gt;Источник: &lt;a href=&quot;http://delphihaven.wordpress.com/2013/07/04/programmatically-shutting-down-restarting-sleeping-or-logging-off-on-os-x/&quot;&gt;http://delphihaven.wordpress.com/2013/07/04/programmatically-shutting-down-restarting-sleeping-or-logging-off-on-os-x/&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/3459433026762292945/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2013/07/os-x.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/3459433026762292945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/3459433026762292945'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2013/07/os-x.html' title='Как программно завершить работу, сделать перезагрузку, перевести компьютер в ждущий режим или выйти из системы в OS X?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-9137114799618312483</id><published>2013-07-04T17:51:00.000+04:00</published><updated>2013-07-04T17:51:45.604+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Переводы"/><title type='text'>Получение информации о системе в OSX и iOS с помощью Delphi (XE2, XE3, XE4) - Часть 2</title><content type='html'>Данная статья является продолжением статьи &lt;a href=&quot;http://keeper89.blogspot.ru/2013/07/osx-ios-delphi-xe2-xe3-xe4-1.html&quot;&gt;Получение информации о системе в OSX и iOS с помощью Delphi (XE2, XE3, XE4) - Часть 1&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Внутри модуля &lt;i&gt;Posix.SysSysctl&lt;/i&gt; (являющимся, как уже было сказано, трансляцией файла sysctl.h) можно обнаружить ряд массивов (CTL_NAMES, CTL_KERN_NAMES, CTL_HW_NAMES, CTL_USER_NAMES, CTL_VM_NAMES), которые содержат идентификаторы системной информации, рассмотренные нами в предыдущей статье. Используя их, можно построить идентификатор (параметр &lt;i&gt;name&lt;/i&gt;) для передачи в функцию &lt;i&gt;SysCtlByName&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;В качестве примера, составить идентификатор для получения версии ядра можно следующим образом:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;Name := PAnsiChar(CTL_NAMES[CTL_KERN].ctl_name + &#39;.&#39; + CTL_KERN_NAMES[KERN_VERSION].ctl_name); // Версия ядра&lt;br /&gt;&lt;/pre&gt;а затем вызвать SysCtlByName:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;function KernelVersion: AnsiString;&lt;br /&gt;var&lt;br /&gt;  res: Integer;&lt;br /&gt;  len: size_t;&lt;br /&gt;  p, Name: PAnsiChar;&lt;br /&gt;begin&lt;br /&gt;  len := SizeOf(Result);&lt;br /&gt;  Name := PAnsiChar(CTL_NAMES[CTL_KERN].ctl_name + &#39;.&#39; + CTL_KERN_NAMES[KERN_VERSION].ctl_name);&lt;br /&gt;  res := SysCtlByName(Name, nil, @len, nil, 0);&lt;br /&gt;    if (len &gt; 0) and (res = 0)  then&lt;br /&gt;    begin&lt;br /&gt;      GetMem(p, len);&lt;br /&gt;      try&lt;br /&gt;        res := SysCtlByName(Name, p, @len, nil, 0);&lt;br /&gt;        if res = 0 then&lt;br /&gt;          Result := p;&lt;br /&gt;      finally&lt;br /&gt;        FreeMem(p);&lt;br /&gt;      end;&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;Используя эти массивы, можно получить много полезной, предусмотренной в них информации, попробуйте воспроизвести следующий проект:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;{$APPTYPE CONSOLE}&lt;br /&gt; &lt;br /&gt;{$R *.res}&lt;br /&gt; &lt;br /&gt;uses&lt;br /&gt;  System.Classes,&lt;br /&gt;  System.Types,&lt;br /&gt;  Posix.Errno,&lt;br /&gt;  Posix.SysTypes,&lt;br /&gt;  Posix.SysSysctl,&lt;br /&gt;  System.SysUtils;&lt;br /&gt; &lt;br /&gt;function GetsysctlIntValue(mib: TIntegerDynArray) : integer;&lt;br /&gt;var&lt;br /&gt;  len : size_t;&lt;br /&gt;  res : integer;&lt;br /&gt;begin&lt;br /&gt;   len := sizeof(Result);&lt;br /&gt;   res:=sysctl(@mib[0], 2, @Result, @len, nil, 0);&lt;br /&gt;   if res&lt;&gt;0 then&lt;br /&gt;    Result:=-1; // RaiseLastOSError;&lt;br /&gt;end;&lt;br /&gt; &lt;br /&gt;function GetsysctlInt64Value(mib: TIntegerDynArray) : Int64;&lt;br /&gt;var&lt;br /&gt;  len : size_t;&lt;br /&gt;  res : integer;&lt;br /&gt;begin&lt;br /&gt;   len := sizeof(Result);&lt;br /&gt;   res:=sysctl(@mib[0], 2, @Result, @len, nil, 0);&lt;br /&gt;   if res&lt;&gt;0 then&lt;br /&gt;     Result:=-1; //RaiseLastOSError;&lt;br /&gt;end;&lt;br /&gt; &lt;br /&gt;function GetsysctlStrValue(mib: TIntegerDynArray) : AnsiString;&lt;br /&gt;var&lt;br /&gt;  len : size_t;&lt;br /&gt;  p   : PAnsiChar;&lt;br /&gt;  res : integer;&lt;br /&gt;begin&lt;br /&gt;   Result:=&#39;&#39;;&lt;br /&gt;   res:=sysctl(@mib[0], 2, nil, @len, nil, 0);&lt;br /&gt;   if (len&gt;0) and (res=0)  then&lt;br /&gt;   begin&lt;br /&gt;     GetMem(p, len);&lt;br /&gt;     try&lt;br /&gt;       res:=sysctl(@mib[0], 2, p, @len, nil, 0);&lt;br /&gt;       if res=0 then&lt;br /&gt;        Result:=p;&lt;br /&gt;     finally&lt;br /&gt;       FreeMem(p);&lt;br /&gt;     end;&lt;br /&gt;   end;&lt;br /&gt;end;&lt;br /&gt; &lt;br /&gt;procedure  ListKernelValues;&lt;br /&gt;var&lt;br /&gt;  mib : TIntegerDynArray;&lt;br /&gt;  i   : Integer;&lt;br /&gt;begin&lt;br /&gt; Writeln(&#39;High kernel limits&#39;);&lt;br /&gt; Writeln(&#39;------------------&#39;);&lt;br /&gt; for i:=0 to KERN_MAXID-1 do&lt;br /&gt; begin&lt;br /&gt;    mib:=TIntegerDynArray.Create(CTL_KERN, i);&lt;br /&gt;    case CTL_KERN_NAMES[i].ctl_type of&lt;br /&gt;     CTLTYPE_NODE  :  Writeln(Format(&#39;%s.%-18s %s&#39;,[CTL_NAMES[CTL_KERN].ctl_name, CTL_KERN_NAMES[i].ctl_name, &#39;[node]&#39;]));&lt;br /&gt;     CTLTYPE_OPAQUE:  Writeln(Format(&#39;%s.%-18s %s&#39;,[CTL_NAMES[CTL_KERN].ctl_name, CTL_KERN_NAMES[i].ctl_name, &#39;[structure]&#39;]));&lt;br /&gt;     CTLTYPE_INT   :  Writeln(Format(&#39;%s.%-18s %d&#39;,[CTL_NAMES[CTL_KERN].ctl_name, CTL_KERN_NAMES[i].ctl_name, GetsysctlIntValue(mib)]));&lt;br /&gt;     CTLTYPE_QUAD  :  Writeln(Format(&#39;%s.%-18s %d&#39;,[CTL_NAMES[CTL_KERN].ctl_name, CTL_KERN_NAMES[i].ctl_name, GetsysctlInt64Value(mib)]));&lt;br /&gt;     CTLTYPE_STRING : Writeln(Format(&#39;%s.%-18s %s&#39;,[CTL_NAMES[CTL_KERN].ctl_name, CTL_KERN_NAMES[i].ctl_name, GetsysctlStrValue(mib)]));&lt;br /&gt;    end;&lt;br /&gt; end;&lt;br /&gt; Writeln;&lt;br /&gt;end;&lt;br /&gt; &lt;br /&gt;procedure  ListGenericCPU_IO_Values;&lt;br /&gt;var&lt;br /&gt;  mib : TIntegerDynArray;&lt;br /&gt;  i   : Integer;&lt;br /&gt;begin&lt;br /&gt; Writeln(&#39;Generic CPU, I/O&#39;);&lt;br /&gt; Writeln(&#39;-----------------&#39;);&lt;br /&gt; for i:=0 to HW_MAXID-1 do&lt;br /&gt; begin&lt;br /&gt;    mib:=TIntegerDynArray.Create(CTL_HW, i);&lt;br /&gt;    case CTL_HW_NAMES[i].ctl_type of&lt;br /&gt;     CTLTYPE_NODE  :  Writeln(Format(&#39;%s.%-18s %s&#39;,[CTL_NAMES[CTL_HW].ctl_name, CTL_HW_NAMES[i].ctl_name, &#39;[node]&#39;]));&lt;br /&gt;     CTLTYPE_OPAQUE:  Writeln(Format(&#39;%s.%-18s %s&#39;,[CTL_NAMES[CTL_HW].ctl_name, CTL_HW_NAMES[i].ctl_name, &#39;[structure]&#39;]));&lt;br /&gt;     CTLTYPE_INT   :  Writeln(Format(&#39;%s.%-18s %d&#39;,[CTL_NAMES[CTL_HW].ctl_name, CTL_HW_NAMES[i].ctl_name, GetsysctlIntValue(mib)]));&lt;br /&gt;     CTLTYPE_QUAD  :  Writeln(Format(&#39;%s.%-18s %d&#39;,[CTL_NAMES[CTL_HW].ctl_name, CTL_HW_NAMES[i].ctl_name, GetsysctlInt64Value(mib)]));&lt;br /&gt;     CTLTYPE_STRING : Writeln(Format(&#39;%s.%-18s %s&#39;,[CTL_NAMES[CTL_HW].ctl_name, CTL_HW_NAMES[i].ctl_name, GetsysctlStrValue(mib)]));&lt;br /&gt;    end;&lt;br /&gt; end;&lt;br /&gt; Writeln;&lt;br /&gt;end;&lt;br /&gt; &lt;br /&gt;procedure  ListUserLevelValues;&lt;br /&gt;var&lt;br /&gt;  mib : TIntegerDynArray;&lt;br /&gt;  i   : Integer;&lt;br /&gt;begin&lt;br /&gt; mib:=TIntegerDynArray.Create(CTL_USER, 0);&lt;br /&gt; Writeln(&#39;User-level&#39;);&lt;br /&gt; Writeln(&#39;----------&#39;);&lt;br /&gt; for i:=0 to USER_MAXID-1 do&lt;br /&gt; begin&lt;br /&gt;    mib[1]:=i;&lt;br /&gt;    case CTL_USER_NAMES[i].ctl_type of&lt;br /&gt;     CTLTYPE_NODE  :  Writeln(Format(&#39;%s.%-18s %s&#39;,[CTL_NAMES[CTL_USER].ctl_name, CTL_USER_NAMES[i].ctl_name, &#39;[node]&#39;]));&lt;br /&gt;     CTLTYPE_OPAQUE:  Writeln(Format(&#39;%s.%-18s %s&#39;,[CTL_NAMES[CTL_USER].ctl_name, CTL_USER_NAMES[i].ctl_name, &#39;[structure]&#39;]));&lt;br /&gt;     CTLTYPE_INT   :  Writeln(Format(&#39;%s.%-18s %d&#39;,[CTL_NAMES[CTL_USER].ctl_name, CTL_USER_NAMES[i].ctl_name, GetsysctlIntValue(mib)]));&lt;br /&gt;     CTLTYPE_QUAD  :  Writeln(Format(&#39;%s.%-18s %d&#39;,[CTL_NAMES[CTL_USER].ctl_name, CTL_USER_NAMES[i].ctl_name, GetsysctlInt64Value(mib)]));&lt;br /&gt;     CTLTYPE_STRING : Writeln(Format(&#39;%s.%-18s %s&#39;,[CTL_NAMES[CTL_USER].ctl_name, CTL_USER_NAMES[i].ctl_name, GetsysctlStrValue(mib)]));&lt;br /&gt;    end;&lt;br /&gt; end;&lt;br /&gt; Writeln;&lt;br /&gt;end;&lt;br /&gt; &lt;br /&gt;procedure  ListVMValues;&lt;br /&gt;var&lt;br /&gt;  mib : TIntegerDynArray;&lt;br /&gt;  i   : Integer;&lt;br /&gt;begin&lt;br /&gt; Writeln(&#39;Virtual memory&#39;);&lt;br /&gt; Writeln(&#39;-------------&#39;);&lt;br /&gt; for i:=0 to VM_MAXID-1 do&lt;br /&gt; begin&lt;br /&gt;    mib:=TIntegerDynArray.Create(CTL_VM, i);&lt;br /&gt;    case CTL_VM_NAMES[i].ctl_type of&lt;br /&gt;     CTLTYPE_NODE  :  Writeln(Format(&#39;%s.%-18s %s&#39;,[CTL_NAMES[CTL_VM].ctl_name, CTL_VM_NAMES[i].ctl_name, &#39;[node]&#39;]));&lt;br /&gt;     CTLTYPE_OPAQUE:  Writeln(Format(&#39;%s.%-18s %s&#39;,[CTL_NAMES[CTL_VM].ctl_name, CTL_VM_NAMES[i].ctl_name, &#39;[structure]&#39;]));&lt;br /&gt;     CTLTYPE_INT   :  Writeln(Format(&#39;%s.%-18s %d&#39;,[CTL_NAMES[CTL_VM].ctl_name, CTL_VM_NAMES[i].ctl_name, GetsysctlIntValue(mib)]));&lt;br /&gt;     CTLTYPE_QUAD  :  Writeln(Format(&#39;%s.%-18s %d&#39;,[CTL_NAMES[CTL_VM].ctl_name, CTL_VM_NAMES[i].ctl_name, GetsysctlInt64Value(mib)]));&lt;br /&gt;     CTLTYPE_STRING : Writeln(Format(&#39;%s.%-18s %s&#39;,[CTL_NAMES[CTL_VM].ctl_name, CTL_VM_NAMES[i].ctl_name, GetsysctlStrValue(mib)]));&lt;br /&gt;    end;&lt;br /&gt; end;&lt;br /&gt; Writeln;&lt;br /&gt;end;&lt;br /&gt; &lt;br /&gt;begin&lt;br /&gt;  try&lt;br /&gt;    ListKernelValues;&lt;br /&gt;    ListGenericCPU_IO_Values;&lt;br /&gt;    ListUserLevelValues;&lt;br /&gt;    ListVMValues;&lt;br /&gt;  except&lt;br /&gt;    on E: Exception do&lt;br /&gt;      Writeln(E.ClassName, &#39;: &#39;, E.Message);&lt;br /&gt;  end;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Источник: &lt;a href=&quot;http://theroadtodelphi.wordpress.com/2013/06/29/getting-system-information-in-osx-and-ios-using-delphi-xe2-xe3-xe4-part-2/&quot;&gt;http://theroadtodelphi.wordpress.com/2013/06/29/getting-system-information-in-osx-and-ios-using-delphi-xe2-xe3-xe4-part-2/&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/9137114799618312483/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2013/07/osx-ios-delphi-xe2-xe3-xe4-2.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/9137114799618312483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/9137114799618312483'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2013/07/osx-ios-delphi-xe2-xe3-xe4-2.html' title='Получение информации о системе в OSX и iOS с помощью Delphi (XE2, XE3, XE4) - Часть 2'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-5294928069419329281</id><published>2013-07-03T22:36:00.004+04:00</published><updated>2013-07-03T22:36:53.260+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Переводы"/><title type='text'>Получение информации о системе в OSX и iOS с помощью Delphi (XE2, XE3, XE4) - Часть 1</title><content type='html'>В статье будут рассмотрены вопросы использования функций модулей &lt;b&gt;sysctl&lt;/b&gt;, &lt;b&gt;sysctlbyname&lt;/b&gt; и &lt;b&gt;sysctlnametomib&lt;/b&gt; для получения информации о системе (параметры ядра, железа, сети, файловой системы, информации о компьютере и пользователе) в OSX и iOS.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;sysctl&lt;/span&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp&quot;&gt;int sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen);&lt;br /&gt;&lt;/pre&gt;Модуль &lt;a href=&quot;https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/sysctl.3.html&quot;&gt;sysctl&lt;/a&gt; содержит функции для получения/установки системной информации; типы данных, возвращаемые функцией &lt;i&gt;sysctl&lt;/i&gt; - целые числа (int32, int64), строки (AnsiString) и записи (records). Данная функция объявлена в модуле &lt;i&gt;Posix.SysSysctl&lt;/i&gt; (SysSysctlAPI.inc).&lt;br /&gt;&lt;br /&gt;Примечание: модуль Posix.SysSysctl - частичное портирование файла sysctl.h.&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;function sysctl(name: PInteger; namelen: cardinal; oldp: Pointer; oldlen: Psize_t; newp: Pointer; newlen: size_t): Integer; cdecl; external libc name _PU + &#39;sysctl&#39;;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;name&lt;/b&gt;: указатель на &lt;a href=&quot;http://ru.wikipedia.org/wiki/Management_Information_Base&quot;&gt;Management Information Base (MIB)&lt;/a&gt;, который &quot;внутри&quot; является массивом Integer. Каждый элемент массива должен быть заполнен значениями, связанными с какими-либо данными для чтения/записи. Количество элементов массива зависит от читаемой/записываемой информации, в большинстве случаев используется 2 первых значения: первый элемент отражает позицию данных в MIB (тип информации), второй содержит значение.&lt;br /&gt;&lt;br /&gt;Существует несколько значений первого элемента в MIB (все они прописаны в модуле Posix.SysSysctl):&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;Идентификатор  Значение         Описание&lt;br /&gt;&lt;br /&gt;CTL_DEBUG      $00000005        Debugging&lt;br /&gt;CTL_VFS        $00000003        File system&lt;br /&gt;CTL_HW         $00000006        Generic CPU, I/O&lt;br /&gt;CTL_KERN       $00000001        High kernel limits&lt;br /&gt;CTL_MACHDEP    $00000007        Machine dependent&lt;br /&gt;CTL_NET        $00000004        Networking&lt;br /&gt;CTL_USER       $00000008        User-level&lt;br /&gt;CTL_VM         $00000002        Virtual memory &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Итак, если нужно получить информацию о ядре, необходимо заполнить массив следующим образом:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;var&lt;br /&gt;  mib : array[0..1] of Integer;&lt;br /&gt;  ...&lt;br /&gt;  ...&lt;br /&gt; mib[0] := CTL_KERN;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Второй элемент массива связан с первым, его возможные значения также определены в модуле Posix.SysSysctl. Так, например, для получения величины максимального количества поддерживаемых процессов необходимо использовать значение KERN_MAXPROC($00000006). &lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;var&lt;br /&gt;  mib : array[0..1] of Integer;&lt;br /&gt;  ...&lt;br /&gt;  ...&lt;br /&gt;  mib[0] := CTL_KERN;&lt;br /&gt;  mib[1] := KERN_MAXPROC;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь рассмотрим остальные параметры функции sysctl.&lt;br /&gt;&lt;b&gt;namelen&lt;/b&gt;: размер записи mib.&lt;br /&gt;&lt;b&gt;oldp&lt;/b&gt;: указатель на получаемые данные типа Integer, int64, AnsiString (MarshaledAString) или записью.&lt;br /&gt;&lt;b&gt;oldlen&lt;/b&gt;: размер параметра oldp.&lt;br /&gt;&lt;b&gt;newp&lt;/b&gt;: указатель на записываемые данные. Если ничего не изменяется - необходимо передать nil.&lt;br /&gt;&lt;b&gt;newlen&lt;/b&gt;: размер параметра newp.&lt;br /&gt;&lt;br /&gt;С учетом рассмотренного выше, приведем функцию для получения величины максимального количества поддерживаемых процессов:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;function MaxProcesses : Integer;&lt;br /&gt;var&lt;br /&gt;  mib: array[0..1] of Integer;&lt;br /&gt;  res: Integer;&lt;br /&gt;  len: size_t;&lt;br /&gt;begin&lt;br /&gt; &lt;br /&gt;  mib[0] := CTL_KERN;&lt;br /&gt;  mib[1] := KERN_MAXPROC;&lt;br /&gt; &lt;br /&gt;  len := sizeof(Result);&lt;br /&gt;  res := sysctl(@mib, Length(mib), @Result, @len, nil, 0);&lt;br /&gt;  if res &lt;&gt; 0 then&lt;br /&gt;   RaiseLastOSError;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;Получить Int64-значение можно аналогично, в качестве примера рассмотрим код для получения размера установленной памяти, использую идентификаторы CTL_HW и HW_MEMSIZE.&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;function MemSize : Int64;&lt;br /&gt;var&lt;br /&gt;  mib: array[0..1] of Integer;&lt;br /&gt;  res: Integer;&lt;br /&gt;  len: size_t;&lt;br /&gt;begin&lt;br /&gt;  mib[0] := CTL_HW;&lt;br /&gt;  mib[1] := HW_MEMSIZE;&lt;br /&gt; &lt;br /&gt;  len := sizeof(Result);&lt;br /&gt;  res := sysctl(@mib, Length(mib), @Result, @len, nil, 0);&lt;br /&gt;  if res &lt;&gt; 0 then&lt;br /&gt;   RaiseLastOSError;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;Для получения строкового значения, в первую очередь необходимо передать длину предполагаемой строки для создания буфера, сделать это можно следующим образом (передав nil в качестве параметра oldp):&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;sysctl(@mib, Length(mib), nil, @len, nil, 0)&lt;br /&gt;&lt;/pre&gt;Следующий пример демонстрирует получения строки (ASCII), используя функцию sysctl. &lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;function KernelVersion : AnsiString;&lt;br /&gt;var&lt;br /&gt;  mib: array[0..1] of Integer;&lt;br /&gt;  res: Integer;&lt;br /&gt;  len: size_t;&lt;br /&gt;  p: MarshaledAString; // в XE2 можно использовать PAnsiChar &lt;br /&gt;begin&lt;br /&gt;  mib[0] := CTL_KERN;&lt;br /&gt;  mib[1] := KERN_VERSION;&lt;br /&gt;  // получаем размер буфера&lt;br /&gt;  res := sysctl(@mib, Length(mib), nil, @len, nil, 0);&lt;br /&gt;  if res&lt;&gt;0 then&lt;br /&gt;    RaiseLastOSError;&lt;br /&gt;   &lt;br /&gt;  // устанавливаем размер буфера&lt;br /&gt;  GetMem(p, len);&lt;br /&gt;  try&lt;br /&gt;    res := sysctl(@mib, Length(mib), p, @len, nil, 0);&lt;br /&gt;    if res &lt;&gt; 0 then&lt;br /&gt;      RaiseLastOSError;&lt;br /&gt;    Result := p;&lt;br /&gt;  finally&lt;br /&gt;    FreeMem(p);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;Наконец, функцию &lt;i&gt;sysctl&lt;/i&gt; можно использовать для получения записей, передавая указатель на заранее подготовленный record.&lt;br /&gt;Рассмотрим пример получения значений тактовой частоты из ядра.&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;procedure GetClockInfo;&lt;br /&gt;type&lt;br /&gt; clockinfo = record&lt;br /&gt;    hz      : Integer;&lt;br /&gt;    tick    : Integer;&lt;br /&gt;    tickadj : Integer;&lt;br /&gt;    stathz  : Integer;&lt;br /&gt;    profhz  : Integer;&lt;br /&gt;  end;&lt;br /&gt; &lt;br /&gt;(*&lt;br /&gt;struct clockinfo {&lt;br /&gt;    int hz;     &lt;br /&gt;    int tick;      &lt;br /&gt;    int tickadj;&lt;br /&gt;    int stathz;   &lt;br /&gt;    int profhz; &lt;br /&gt;};&lt;br /&gt;*)&lt;br /&gt; &lt;br /&gt;var&lt;br /&gt;  mib: array[0..1] of Integer;&lt;br /&gt;  res: Integer;&lt;br /&gt;  len: size_t;&lt;br /&gt;  clock: clockinfo;&lt;br /&gt;begin&lt;br /&gt;  FillChar(clock, sizeof(clock), 0);&lt;br /&gt;  mib[0] := CTL_KERN;&lt;br /&gt;  mib[1] := KERN_CLOCKRATE;&lt;br /&gt;  len := sizeof(clock);&lt;br /&gt;  res := sysctl(@mib, Length(mib), @clock, @len, nil, 0);&lt;br /&gt;  if res &lt;&gt; 0 then&lt;br /&gt;    RaiseLastOSError;&lt;br /&gt;  &lt;br /&gt;  Writeln(Format(&#39;clock frequency             %d&#39;,[clock.hz]));&lt;br /&gt;  Writeln(Format(&#39;micro-seconds per hz tick   %d&#39;,[clock.tick]));&lt;br /&gt;  Writeln(Format(&#39;clock skew rate for adjtime %d&#39;,[clock.tickadj]));&lt;br /&gt;  Writeln(Format(&#39;statistics clock frequency  %d&#39;,[clock.stathz]));&lt;br /&gt;  Writeln(Format(&#39;profiling clock frequency   %d&#39;,[clock.profhz]));&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;sysctlbyname&lt;/span&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp&quot;&gt;int sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen);&lt;br /&gt;&lt;/pre&gt;Функция &lt;i&gt;sysctlbyname&lt;/i&gt; работает по тому же принципу, что и &lt;i&gt;sysctl&lt;/i&gt;, однако получение значений осуществляется путем передачи специального строкового идентификатора. Это в свою очередь позволяет избежать передачи в функцию mib-записи и ее размера.&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;function sysctlbyname(Name: MarshaledAString; oldp: Pointer; oldlen: Psize_t; newp: Pointer; newlen: size_t): Integer; cdecl; external libc name _PU + &#39;sysctlbyname&#39;;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;name&lt;/b&gt;: идентификатор, определяющий возвращаемое значение и состоящий из двух &quot;уровней&quot;.&lt;br /&gt;В качестве элементов &quot;первого&quot; уровня, могут использоваться следующие идентификаторы:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;Идентификатор  Строка&lt;br /&gt;&lt;br /&gt;CTL_DEBUG      debug&lt;br /&gt;CTL_VFS        vfs&lt;br /&gt;CTL_HW         hw&lt;br /&gt;CTL_KERN       kern&lt;br /&gt;CTL_MACHDEP    machdep&lt;br /&gt;CTL_NET        net&lt;br /&gt;CTL_USER       user&lt;br /&gt;CTL_VM         vm&lt;br /&gt;&lt;/pre&gt;Приведенные идентификаторы также необходимо дополнить идентификатором &quot;второго&quot; уровня, конкретизирующим информацию, которую нужно получить/записать.&lt;br /&gt;&lt;br /&gt;В качестве примера рассмотрим следующие возможные значения, которые могут использоваться в качестве идентификатора &lt;b&gt;name&lt;/b&gt;:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;Идентификатор                   Тип &lt;br /&gt;         &lt;br /&gt;kern.ostype                     string      &lt;br /&gt;kern.osrelease                  string      &lt;br /&gt;kern.osrevision                 integer     &lt;br /&gt;kern.version                    string      &lt;br /&gt;kern.maxvnodes                  integer      &lt;br /&gt;kern.maxproc                    integer      &lt;br /&gt;kern.maxfiles                   integer      &lt;br /&gt;kern.argmax                     integer     &lt;br /&gt;kern.securelevel                integer      &lt;br /&gt;kern.hostname                   string       &lt;br /&gt;kern.hostid                     integer      &lt;br /&gt;kern.clockrate                  struct      &lt;br /&gt;kern.posix1version              integer     &lt;br /&gt;kern.ngroups                    integer     &lt;br /&gt;kern.job_control                integer     &lt;br /&gt;kern.saved_ids                  integer     &lt;br /&gt;kern.link_max                   integer     &lt;br /&gt;kern.max_canon                  integer     &lt;br /&gt;kern.max_input                  integer     &lt;br /&gt;kern.name_max                   integer     &lt;br /&gt;kern.path_max                   integer     &lt;br /&gt;kern.pipe_buf                   integer     &lt;br /&gt;kern.chown_restricted           integer     &lt;br /&gt;kern.no_trunc                   integer     &lt;br /&gt;kern.vdisable                   integer     &lt;br /&gt;kern.boottime                   struct      &lt;br /&gt;vm.loadavg                      struct      &lt;br /&gt;vm.swapusage                    struct      &lt;br /&gt;machdep.console_device          dev_t       &lt;br /&gt;net.inet.ip.forwarding          integer      &lt;br /&gt;net.inet.ip.redirect            integer      &lt;br /&gt;net.inet.ip.ttl                 integer      &lt;br /&gt;net.inet.icmp.maskrepl          integer     &lt;br /&gt;net.inet.udp.checksum           integer      &lt;br /&gt;hw.machine                      string      &lt;br /&gt;hw.model                        string      &lt;br /&gt;hw.ncpu                         integer     &lt;br /&gt;hw.byteorder                    integer     &lt;br /&gt;hw.physmem                      integer     &lt;br /&gt;hw.usermem                      integer     &lt;br /&gt;hw.memsize                      integer     &lt;br /&gt;hw.pagesize                     integer     &lt;br /&gt;user.cs_path                    string      &lt;br /&gt;user.bc_base_max                integer     &lt;br /&gt;user.bc_dim_max                 integer     &lt;br /&gt;user.bc_scale_max               integer     &lt;br /&gt;user.bc_string_max              integer     &lt;br /&gt;user.coll_weights_max           integer     &lt;br /&gt;user.expr_nest_max              integer     &lt;br /&gt;user.line_max                   integer     &lt;br /&gt;user.re_dup_max                 integer     &lt;br /&gt;user.posix2_version             integer     &lt;br /&gt;user.posix2_c_bind              integer     &lt;br /&gt;user.posix2_c_dev               integer     &lt;br /&gt;user.posix2_char_term           integer     &lt;br /&gt;user.posix2_fort_dev            integer     &lt;br /&gt;user.posix2_fort_run            integer     &lt;br /&gt;user.posix2_localedef           integer     &lt;br /&gt;user.posix2_sw_dev              integer     &lt;br /&gt;user.posix2_upe                 integer    &lt;br /&gt;&lt;/pre&gt;Примечание: получить полный список поддерживаемых команд можно путем ввода &lt;i&gt;sysctl -A&lt;/i&gt; в терминале операционной системы.  &lt;br /&gt;&lt;br /&gt;Приведенный ниже код показывает, как использовать &lt;i&gt;SysCtlByName&lt;/i&gt; для получения количества установленных процессоров.&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;function NumberOfCPU: Integer;&lt;br /&gt;var&lt;br /&gt;  res: Integer;&lt;br /&gt;  len: size_t;&lt;br /&gt;begin&lt;br /&gt;  len := SizeOf(Result);&lt;br /&gt;  res := SysCtlByName(&#39;hw.ncpu&#39;, @Result, @len, nil, 0);&lt;br /&gt;  if res &lt;&gt; 0 then&lt;br /&gt;    RaiseLastOSError;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;Примечание: функция &lt;i&gt;sysctl&lt;/i&gt; выполняется примерно в 3 раза быстрее, чем &lt;i&gt;sysctlbyname&lt;/i&gt;, поэтому, если производительность является ключевым аспектом - лучше использовать &lt;i&gt;sysctl&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;sysctlnametomib&lt;/span&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp&quot;&gt;int sysctlnametomib(const char *name, int *mibp, size_t *sizep);&lt;br /&gt;&lt;/pre&gt;Функция &lt;i&gt;sysctlnametomib&lt;/i&gt; заполняет mib по строковому идентификатору. Обычно, данная функция используется в приложениях, часто работающих с одними и теми же значениями.&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;function sysctlnametomib(name: MarshaledAString; mibp: PInteger; sizep: Psize_t): Integer; cdecl; external libc name _PU + &#39;sysctlnametomib&#39;;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;name&lt;/b&gt;: строковый идентификатор значения (см. предыдущий пункт).&lt;br /&gt;&lt;b&gt;mibp&lt;/b&gt;: указатель на mib-запись.&lt;br /&gt;&lt;b&gt;sizep&lt;/b&gt;: указатель на длину mib-записи.&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;var&lt;br /&gt;  mib : array[0..1] of Integer;&lt;br /&gt;  res : Integer;&lt;br /&gt;  len : size_t;&lt;br /&gt;begin&lt;br /&gt;  len := Length(mib);&lt;br /&gt;  sysctlnametomib(&#39;hw.physicalcpu&#39;, @mib, @len);&lt;br /&gt;  // теперь mib-запись правильно заполнена и готова для передачи в функцию sysctl &lt;br /&gt;&lt;/pre&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;Error Handling&lt;/span&gt;&lt;br /&gt;Все указанные выше функции возвращают 0, если выполнились успешно, и код ошибки в противном случае. Такой код может быть получен через &lt;i&gt;Posix.Errno&lt;/i&gt; или с использованием функции &lt;i&gt;GetLastError&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Возможные коды ошибок могут быть найдены в файле C:\Program Files (x86)\Embarcadero\RAD Studio\{ВЕРСИЯ}\source\rtl\posix\osx\ErrnoTypes.inc (при установке IDE по умолчанию).&lt;br /&gt;&lt;br /&gt;И наконец, итоговый пример, задействующий все положения настоящей статьи:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;{$APPTYPE CONSOLE}&lt;br /&gt; &lt;br /&gt;uses&lt;br /&gt;  //System.Classes,&lt;br /&gt;  //System.Types,&lt;br /&gt;  //Posix.Errno,&lt;br /&gt;  Posix.SysTypes,&lt;br /&gt;  Posix.SysSysctl,&lt;br /&gt;  System.SysUtils;&lt;br /&gt; &lt;br /&gt;//https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/sysctl.3.html&lt;br /&gt;//https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/sysctl.8.html&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;function NumberOfCPU: Integer;&lt;br /&gt;var&lt;br /&gt;  res: Integer;&lt;br /&gt;  len: size_t;&lt;br /&gt;begin&lt;br /&gt;  len := SizeOf(Result);&lt;br /&gt;  res := SysCtlByName(&#39;hw.ncpu&#39;, @Result, @len, nil, 0);&lt;br /&gt;  if res &lt;&gt; 0 then&lt;br /&gt;    RaiseLastOSError;&lt;br /&gt;end;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;function MaxProcesses: Integer;&lt;br /&gt;var&lt;br /&gt;  mib: array[0..1] of Integer;&lt;br /&gt;  res: Integer;&lt;br /&gt;  len: size_t;&lt;br /&gt;begin&lt;br /&gt; &lt;br /&gt; mib[0] := CTL_KERN;&lt;br /&gt; mib[1] := KERN_MAXPROC;&lt;br /&gt; &lt;br /&gt; len := sizeof(Result);&lt;br /&gt; res := sysctl(@mib, Length(mib), @Result, @len, nil, 0);&lt;br /&gt; if res &lt;&gt; 0 then&lt;br /&gt;   RaiseLastOSError;&lt;br /&gt;end;&lt;br /&gt; &lt;br /&gt;function MemSize : Int64;&lt;br /&gt;var&lt;br /&gt;  mib: array[0..1] of Integer;&lt;br /&gt;  res: Integer;&lt;br /&gt;  len: size_t;&lt;br /&gt;begin&lt;br /&gt; mib[0] := CTL_HW;&lt;br /&gt; mib[1] := HW_MEMSIZE;&lt;br /&gt; &lt;br /&gt; len := sizeof(Result);&lt;br /&gt; res := sysctl(@mib, Length(mib), @Result, @len, nil, 0);&lt;br /&gt; if res &lt;&gt; 0 then&lt;br /&gt;   RaiseLastOSError;&lt;br /&gt;end; &lt;br /&gt; &lt;br /&gt;function KernelVersion : AnsiString;&lt;br /&gt;var&lt;br /&gt;  mib: array[0..1] of Integer;&lt;br /&gt;  res: Integer;&lt;br /&gt;  len: size_t;&lt;br /&gt;  p: MarshaledAString; // в XE2 используйте PAnsiChar&lt;br /&gt;begin&lt;br /&gt;  mib[0] := CTL_KERN;&lt;br /&gt;  mib[1] := KERN_VERSION;&lt;br /&gt;  res := sysctl(@mib, Length(mib), nil, @len, nil, 0);&lt;br /&gt;  if res &lt;&gt; 0 then&lt;br /&gt;    RaiseLastOSError;&lt;br /&gt;&lt;br /&gt;  GetMem(p, len);&lt;br /&gt;  try&lt;br /&gt;    res := sysctl(@mib, Length(mib), p, @len, nil, 0);&lt;br /&gt;    if res &lt;&gt; 0 then&lt;br /&gt;      RaiseLastOSError;&lt;br /&gt;    Result := p;&lt;br /&gt;  finally&lt;br /&gt;    FreeMem(p);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt; &lt;br /&gt;procedure GetClockInfo;&lt;br /&gt;type&lt;br /&gt;  clockinfo = record&lt;br /&gt;    hz      : Integer;&lt;br /&gt;    tick    : Integer;&lt;br /&gt;    tickadj : Integer;&lt;br /&gt;    stathz  : Integer;&lt;br /&gt;    profhz  : Integer;&lt;br /&gt;  end;&lt;br /&gt; &lt;br /&gt;var&lt;br /&gt;  mib: array[0..1] of Integer;&lt;br /&gt;  res: Integer;&lt;br /&gt;  len: size_t;&lt;br /&gt;  clock: clockinfo;&lt;br /&gt;begin&lt;br /&gt;  FillChar(clock, sizeof(clock), 0);&lt;br /&gt;  mib[0] := CTL_KERN;&lt;br /&gt;  mib[1] := KERN_CLOCKRATE;&lt;br /&gt;  len := sizeof(clock);&lt;br /&gt;  res := sysctl(@mib, Length(mib), @clock, @len, nil, 0);&lt;br /&gt;  if res &lt;&gt; 0 then&lt;br /&gt;    RaiseLastOSError;&lt;br /&gt; &lt;br /&gt;  Writeln(Format(&#39;clock frequency             %d&#39;,[clock.hz]));&lt;br /&gt;  Writeln(Format(&#39;micro-seconds per hz tick   %d&#39;,[clock.tick]));&lt;br /&gt;  Writeln(Format(&#39;clock skew rate for adjtime %d&#39;,[clock.tickadj]));&lt;br /&gt;  Writeln(Format(&#39;statistics clock frequency  %d&#39;,[clock.stathz]));&lt;br /&gt;  Writeln(Format(&#39;profiling clock frequency   %d&#39;,[clock.profhz]));&lt;br /&gt;end;&lt;br /&gt; &lt;br /&gt;begin&lt;br /&gt;  try&lt;br /&gt;    Writeln(Format(&#39;max processes     %d&#39;,[MaxProcesses]));&lt;br /&gt;    Writeln(Format(&#39;number of cpus    %d&#39;,[NumberOfCPU]));&lt;br /&gt;    Writeln(Format(&#39;physical ram size %s&#39;,[FormatFloat(&#39;#,&#39;, MemSize)]));&lt;br /&gt;    Writeln(Format(&#39;Kernel Version    %s&#39;,[KernelVersion]));&lt;br /&gt;    GetClockInfo;&lt;br /&gt;  except&lt;br /&gt;    on E: Exception do&lt;br /&gt;      Writeln(E.ClassName, &#39;: &#39;, E.Message);&lt;br /&gt;  end;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Источник: &lt;a href=&quot;http://theroadtodelphi.wordpress.com/2013/05/31/getting-system-information-in-osx-and-ios-using-delphi-xe2-xe3-xe4-part-1/&quot;&gt;http://theroadtodelphi.wordpress.com/2013/05/31/getting-system-information-in-osx-and-ios-using-delphi-xe2-xe3-xe4-part-1/&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/5294928069419329281/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2013/07/osx-ios-delphi-xe2-xe3-xe4-1.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/5294928069419329281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/5294928069419329281'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2013/07/osx-ios-delphi-xe2-xe3-xe4-1.html' title='Получение информации о системе в OSX и iOS с помощью Delphi (XE2, XE3, XE4) - Часть 1'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-4871009872386923121</id><published>2013-06-23T03:07:00.000+04:00</published><updated>2013-06-23T03:07:09.407+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><title type='text'>Что происходит с...</title><content type='html'>...индексом Delphi?&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-65I9tWpJMm4/UcYt40nZuVI/AAAAAAAAAYg/vNHGEgRhP5w/s1600/%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82_23_06_2013_(03_04).png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-65I9tWpJMm4/UcYt40nZuVI/AAAAAAAAAYg/vNHGEgRhP5w/s1600/%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82_23_06_2013_(03_04).png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&quot;&gt;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/4871009872386923121/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2013/06/blog-post_23.html#comment-form' title='Комментарии: 26'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/4871009872386923121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/4871009872386923121'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2013/06/blog-post_23.html' title='Что происходит с...'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-65I9tWpJMm4/UcYt40nZuVI/AAAAAAAAAYg/vNHGEgRhP5w/s72-c/%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82_23_06_2013_(03_04).png" height="72" width="72"/><thr:total>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-8787567793828667293</id><published>2013-04-16T01:23:00.000+04:00</published><updated>2013-04-16T01:23:41.222+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><title type='text'>Delphi XE4 уже рядом</title><content type='html'>Открыта регистрация на презентацию продукта: http://forms.embarcadero.com/forms/AMUSCA1304RADStudioLaunchWeb4-24&lt;br /&gt;&lt;br /&gt;Интересно, с чем связано ускорение цикла выхода новых версий?</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/8787567793828667293/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2013/04/delphi-xe4.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/8787567793828667293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/8787567793828667293'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2013/04/delphi-xe4.html' title='Delphi XE4 уже рядом'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-6204800960607329309</id><published>2013-03-03T17:00:00.003+04:00</published><updated>2013-03-03T17:00:48.196+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Программирование"/><title type='text'>Qt QPropertyAnimation &amp; FireMonkey Float Animation</title><content type='html'>На днях наткнулся на занимательное видео:&lt;br /&gt;&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/BRlrn4dx9Nk&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Данную штуку можно сделать уже в Qt 4.6 (это примерно 2009 г.). Аналогичные эффекты доступны в Firemonkey (c 2011 г.). Вопрос к знатокам: как соотносится первое со вторым и чем одно лучше/хуже другого?</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/6204800960607329309/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2013/03/qt-qpropertyanimation-firemonkey-float.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/6204800960607329309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/6204800960607329309'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2013/03/qt-qpropertyanimation-firemonkey-float.html' title='Qt QPropertyAnimation &amp; FireMonkey Float Animation'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/BRlrn4dx9Nk/default.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-2049786131069851275</id><published>2013-02-18T15:38:00.000+04:00</published><updated>2013-02-18T15:38:02.564+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Переводы"/><title type='text'>Вопросы производительности в конструкторах динамических массивов</title><content type='html'>В Delphi Вы можете произвести инициализацию динамического массива двумя способами: вручную или используя &quot;магический&quot; конструктор:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;...&lt;br /&gt;type&lt;br /&gt;   TIntegerArray = array of Integer;&lt;br /&gt;&lt;br /&gt;procedure Test;&lt;br /&gt;var &lt;br /&gt;   a : TIntegerArray;&lt;br /&gt;begin&lt;br /&gt;   // &quot;Магический&quot; конструктор&lt;br /&gt;   a := TIntegerArray.Create(1, 2);&lt;br /&gt;&lt;br /&gt;   // Инициализация вручную&lt;br /&gt;   SetLength(a, 2);&lt;br /&gt;   a[0] := 1;&lt;br /&gt;   a[1] := 2;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;На выходе получаем абсолютно идентичные массивы, но во всем ли эти способы одинаковы?&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;В чем же разница?&lt;/span&gt;&lt;br /&gt;Первый способ более лаконичен, но при этом чуть менее эффективен; в этом можно убедиться, посмотрев в окно CPU:&lt;br /&gt;&lt;pre class=&quot;brush: plain&quot;&gt;...&lt;br /&gt;// &quot;Магический&quot; конструктор&lt;br /&gt;TestUnit.pas.32: a := TIntegerArray.Create(1, 2);&lt;br /&gt;00511335 8D45F8           lea eax,[ebp-$08]&lt;br /&gt;00511338 8B15F0125100     mov edx,[$005112f0]&lt;br /&gt;0051133E E89576EFFF       call @DynArrayClear   // кто-нибудь знает, зачем?&lt;br /&gt;00511343 6A02             push $02&lt;br /&gt;00511345 8D45F8           lea eax,[ebp-$08]&lt;br /&gt;00511348 B901000000       mov ecx,$00000001&lt;br /&gt;0051134D 8B15F0125100     mov edx,[$005112f0]&lt;br /&gt;00511353 E87476EFFF       call @DynArraySetLength&lt;br /&gt;00511358 83C404           add esp,$04&lt;br /&gt;0051135B 8B45F8           mov eax,[ebp-$08]&lt;br /&gt;0051135E C70001000000     mov [eax],$00000001&lt;br /&gt;00511364 8B45F8           mov eax,[ebp-$08]&lt;br /&gt;00511367 C7400402000000   mov [eax+$04],$00000002&lt;br /&gt;0051136E 8B55F8           mov edx,[ebp-$08]&lt;br /&gt;00511371 8D45FC           lea eax,[ebp-$04]&lt;br /&gt;00511374 8B0DF0125100     mov ecx,[$005112f0]&lt;br /&gt;0051137A E89576EFFF       call @DynArrayAsg&lt;br /&gt;&lt;br /&gt;// Инициализация вручную&lt;br /&gt;TestUnit.pas.35: SetLength(a, 2);&lt;br /&gt;0051137F 6A02             push $02&lt;br /&gt;00511381 8D45FC           lea eax,[ebp-$04]&lt;br /&gt;00511384 B901000000       mov ecx,$00000001&lt;br /&gt;00511389 8B15F0125100     mov edx,[$005112f0]&lt;br /&gt;0051138F E83876EFFF       call @DynArraySetLength&lt;br /&gt;00511394 83C404           add esp,$04&lt;br /&gt;TestUnit.pas.36: a[0] := 1;&lt;br /&gt;00511397 8B45FC           mov eax,[ebp-$04]&lt;br /&gt;0051139A C70001000000     mov [eax],$00000001&lt;br /&gt;TestUnit.pas.37: a[1] := 2;&lt;br /&gt;005113A0 8B45FC           mov eax,[ebp-$04]&lt;br /&gt;005113A3 C7400402000000   mov [eax+$04],$00000002&lt;br /&gt;&lt;/pre&gt;Перед тем как обвинить во всем компилятор, Вам следует чуть глубже понять разницу в приведенных способах инициализации массивов:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;в первом случае при создании массива все его элементы инициализируются единовременно, переводя его в определенное состояние;&lt;/li&gt;&lt;li&gt;в случае ручной инициализации, массив изменяется в несколько раз, и, соответственно, массив может быть определен не полностью.&lt;/li&gt;&lt;/ul&gt;Конечно, в нашем примере компилятор мог бы определить, что массив не виден извне процедуры, и сгенерировать меньший код, однако эта оптимизация смогла бы помочь только в случае локальной переменной.&lt;br /&gt;В более общем случае, оптимизация могла бы заключаться в отказе компилятора от создания временных массивов, если инициализируемый массив не используется (таким образом неопределенность не имеет значения), это в свою очередь может стать предпосылкой зарождения идеи подсчета ссылок на массивы.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;Больше деталей&lt;/span&gt;&lt;br /&gt;Использование &quot;магического&quot; конструктора влечет за собой следующие издержки:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;вызов DynArrayClear (не понимаю, зачем он здесь), освобождающий блок памяти, выделенный ранее для временного массива;&lt;/li&gt;&lt;li&gt;вызов DynArraySetLength, выделяющий новый блок памяти с последующим его обнулением;&lt;/li&gt;&lt;li&gt;вызов DynArrayAssign, приводящий к освобождению памяти, занимаемой текущим массивом (если он не пустой), а также локу счетчика ссылок и дополнительным инициализации и финализации временного массива.&lt;/li&gt;&lt;/ul&gt;В многопоточном приложении подобные дополнительные манипуляции с памятью и локи плачевно повлияют на производительность. Если Вы потестируете наш пример в многопоточной среде, то увидите, что при использовании &quot;магического&quot; конструктора выполнение кода сведется к однопоточному.&lt;br /&gt;При ручной инициализации мы имеем только один вызов DynArraySetLength, и если массив не пустой, это может вообще не привести к выделению нового блока памяти (т.к. просто может быть уменьшен/увеличен существующий). Поэтому, если Вы инициализируете массив не один раз, ручная инициализация обойдется Вам дешевле.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;Как сделать инициализатор лучше?&lt;/span&gt;&lt;br /&gt;Мы увидели, что &quot;магический&quot; конструктор не является хорошим вариантом, но что если Вы хотите воспользоваться подобным удобным способом инициализации? На помощь приходят открытые массивы:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;...&lt;br /&gt;procedure InitializeArray(var a: TIntegerArray; const values: array of Integer);&lt;br /&gt;begin&lt;br /&gt;   SetLength(a, Length(values));&lt;br /&gt;   if Length(values) &gt; 0 then&lt;br /&gt;      Move(values[0], a[0], Length(values)*SizeOf(Integer));&lt;br /&gt;end;&lt;br /&gt;...&lt;br /&gt;InitializeArray(a, [1, 2]);&lt;br /&gt;&lt;/pre&gt;Указанная функция не будет эффективнее ручной инициализации: внутри будет происходить дополнительное копирование значений элементов. Однако, она убирает дополнительное выделение памяти и установку локов, поэтому больше подойдет для многопоточных приложений, будучи при этом компактной и лаконичной.&lt;br /&gt;Обратите внимание, что для всех managed-типов (строк, интерфейсов и т.д.), которые System.Move не принимает в качестве аргумента, Вам понадобится использовать либо asm-хаки, либо инициализировать массив поэлементно (например, через цикл for-to-do), что во многих случаях сделает данный вариант неконкурентоспособным относительно ручного аналога.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;Хотите еще лучше?&lt;/span&gt;&lt;br /&gt;В общем случае, все приведенные выше подходы страдают от вызова довольно сложной процедуры SetLength (взгляньте на DynArraySetLength в System.pas и убедитесь), поэтому, если есть шанс, что динамический массив не изменится в размере, Вы можете выиграть сделав так:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;...&lt;br /&gt;if Length(a) &lt;&gt; Length(value) then&lt;br /&gt;   SetLength(a, Length(Values));&lt;br /&gt;&lt;/pre&gt;Что может увеличить производительность до 10 раз.&lt;br /&gt;Упс! А почему RTL этого не делает, спросите Вы?&lt;br /&gt;&lt;br /&gt;Ответ прост - не может. Динамические массивы в Delphi - это не смесь простых типов и указателей, и SetLength - то место, где непосредственно проиходит определение, с чем мы имеем дело (для доп. изучения см. &lt;a href=&quot;http://delphitools.info/2011/06/15/poll-dynamic-arrays-as-reference-or-value-type/&quot;&gt;{1}&lt;/a&gt;, &lt;a href=&quot;http://docwiki.embarcadero.com/RADStudio/XE3/en/Structured_Types#Dynamic_Arrays&quot;&gt;{2}&lt;/a&gt; и &lt;a href=&quot;http://www.transl-gunsmoker.ru/2009/09/blog-post.html#dynarrays&quot;&gt;{3}&lt;/a&gt;).&lt;br /&gt;В &lt;a href=&quot;http://code.google.com/p/dwscript/&quot;&gt;DWScript&lt;/a&gt;, например, динамические массивы - ссылочные типы, имеют больше возможностей, а их инициализация более компактна:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;...&lt;br /&gt;a := [1, 2];&lt;br /&gt;&lt;/pre&gt;А при использовании &lt;a href=&quot;http://smartmobilestudio.com/&quot;&gt;Smart Pascal&lt;/a&gt; в Chrome &lt;a href=&quot;http://code.google.com/p/v8/&quot;&gt;V8&lt;/a&gt; или &lt;a href=&quot;http://nodejs.org/&quot;&gt;node.js&lt;/a&gt; Вам все-таки придется воспользоваться рассмотренными советами по оптимизации.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://delphitools.info/2013/02/18/delphi-array-constructors-performance-or-lack-of/&quot;&gt;http://delphitools.info/2013/02/18/delphi-array-constructors-performance-or-lack-of/&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/2049786131069851275/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2013/02/blog-post_18.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/2049786131069851275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/2049786131069851275'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2013/02/blog-post_18.html' title='Вопросы производительности в конструкторах динамических массивов'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-5833924871541650218</id><published>2013-01-17T15:42:00.000+04:00</published><updated>2013-07-20T04:44:00.034+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Творчество"/><title type='text'>Штриховка в TChart</title><content type='html'>На днях коллега поинтересовался вопросом - а можно ли в стандартном TChart сделать что-то наподобии такого:&lt;br /&gt;&lt;img src=&quot;https://lh6.googleusercontent.com/-GLLcTawK3JA/UPfh6qegdjI/AAAAAAAAARo/jZLDxlZL6nc/s800/s1_image002.jpg&quot;/&gt;&lt;br /&gt;Гугл ответа не дал, поэтому пришлось думать над решением самому :). Нашлось оно довольно быстро следующим образом:&lt;br /&gt;&lt;pre class=&quot;brush: delphi&quot;&gt;...&lt;br /&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,&lt;br /&gt;  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VCLTee.TeEngine, VCLTee.Series,&lt;br /&gt;  Vcl.ExtCtrls, VCLTee.TeeProcs, VCLTee.Chart, System.Generics.Collections;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  THatchDirection = (hdUp, hdDown);&lt;br /&gt;&lt;br /&gt;  TForm1 = class(TForm)&lt;br /&gt;    Chart1: TChart;&lt;br /&gt;    procedure FormDestroy(Sender: TObject);&lt;br /&gt;    procedure FormCreate(Sender: TObject);&lt;br /&gt;    procedure Chart1AfterDraw(Sender: TObject);&lt;br /&gt;    procedure FormShow(Sender: TObject);&lt;br /&gt;  private&lt;br /&gt;    var&lt;br /&gt;      FHatchDirectionList: TList&amp;lt;THatchDirection&amp;gt;;&lt;br /&gt;    procedure DrawHatch(Series: TChartSeries; HatchDirection: THatchDirection);&lt;br /&gt;    procedure AddInEquation(XStart, XEnd, XStep: Double; YFunc: TFunc&amp;lt;Double,&lt;br /&gt;        Double&amp;gt;; AHatchDirection: THatchDirection; AColor: TColor);&lt;br /&gt;    { Private declarations }&lt;br /&gt;  public&lt;br /&gt;    { Public declarations }&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  Form1: TForm1;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  // Содержит список направлений штриховок, индексация FHatchDirectionList[I} = Chart1.Series[I]&lt;br /&gt;  FHatchDirectionList := TList&amp;lt;THatchDirection&amp;gt;.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormShow(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  FHatchDirectionList.Clear;&lt;br /&gt;  Chart1.ClearChart;&lt;br /&gt;  Chart1.View3D := False;&lt;br /&gt;&lt;br /&gt;  // Прямая&lt;br /&gt;  AddInEquation(0, 50, 1,&lt;br /&gt;                function(x: Double): Double&lt;br /&gt;                begin&lt;br /&gt;                  Result := x;&lt;br /&gt;                end,&lt;br /&gt;                THatchDirection.hdDown, clRed);&lt;br /&gt;&lt;br /&gt;  // Еще одна&lt;br /&gt;  AddInEquation(0, 50, 1,&lt;br /&gt;                function(x: Double): Double&lt;br /&gt;                begin&lt;br /&gt;                  Result := 50 - x;&lt;br /&gt;                end,&lt;br /&gt;                THatchDirection.hdDown, clBlue);&lt;br /&gt;&lt;br /&gt;  // Парабола&lt;br /&gt;  AddInEquation(10, 40, 1,&lt;br /&gt;                function(x: Double): Double&lt;br /&gt;                begin&lt;br /&gt;                  Result := 0.2 * sqr(x - 25) + 8;&lt;br /&gt;                end,&lt;br /&gt;                THatchDirection.hdUp, clGreen);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  FreeAndNil(FHatchDirectionList);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.DrawHatch(Series: TChartSeries; HatchDirection: THatchDirection);&lt;br /&gt;const&lt;br /&gt;  HATCH_SIZE = 10;&lt;br /&gt;var&lt;br /&gt;  i, k: Integer;&lt;br /&gt;  XPos, YPos: Integer;&lt;br /&gt;begin&lt;br /&gt;  Chart1.Canvas.Pen.Color := Series.Color;&lt;br /&gt;  Chart1.Canvas.Pen.Width := Series.Pen.Width - 1;&lt;br /&gt;  case HatchDirection of&lt;br /&gt;    hdUp:   k := -1;&lt;br /&gt;    hdDown: k := 1;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  for i := 0 to Series.XValues.Count - 1 do&lt;br /&gt;  begin&lt;br /&gt;    XPos := Series.CalcXPosValue(Series.XValue[i]);&lt;br /&gt;    YPos := Series.CalcYPosValue(Series.YValue[i]);&lt;br /&gt;    Chart1.Canvas.Line(XPos, YPos, XPos, YPos + k*HATCH_SIZE);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Chart1AfterDraw(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  i: Integer;&lt;br /&gt;begin&lt;br /&gt;  for i := 0 to FHatchDirectionList.Count - 1 do&lt;br /&gt;    DrawHatch(Chart1.Series[i], FHatchDirectionList[i]);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.AddInEquation(XStart, XEnd, XStep: Double; YFunc: TFunc&amp;lt;Double, Double&amp;gt;;&lt;br /&gt;  AHatchDirection: THatchDirection; AColor: TColor);&lt;br /&gt;var&lt;br /&gt;  i: Double;&lt;br /&gt;  SR1: TLineSeries;&lt;br /&gt;begin&lt;br /&gt;  SR1 := TLineSeries.Create(Chart1);&lt;br /&gt;  SR1.Color := AColor;&lt;br /&gt;  SR1.Pen.Width := 3;&lt;br /&gt;  i := XStart;&lt;br /&gt;  while i &amp;lt;= XEnd do&lt;br /&gt;  begin&lt;br /&gt;    SR1.AddXY(i, YFunc(i));&lt;br /&gt;    i := i + XStep;&lt;br /&gt;  end;&lt;br /&gt;  Chart1.AddSeries(SR1);&lt;br /&gt;  FHatchDirectionList.Add(AHatchDirection);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;Остановлюсь на нескольких моментах (этапы реализации):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Первым делом заводим тип штриховки (&lt;span class=&quot;code_in_text&quot;&gt;THatchDirection = (hdUp, hdDown)&lt;/span&gt;) и список (&lt;span class=&quot;code_in_text&quot;&gt;FHatchDirectionList: TList&lt;thatchdirection&gt;&lt;/span&gt;), хранящий ее состояния для каждой серии чарта.&lt;/li&gt;&lt;li&gt;Далее, при добавлении серии (неравенства) - &lt;span class=&quot;code_in_text&quot;&gt;AddInEquation&lt;/span&gt; (стоит обратить внимание на использование анонимных методов), добавляем тип штриховки.&lt;/li&gt;&lt;li&gt;И, наконец, в методе &lt;span class=&quot;code_in_text&quot;&gt;Chart1.AfterDraw&lt;/span&gt; &quot;дорисовываем&quot; к графикам штриховку в нужном направлении (соль - в методе &lt;span class=&quot;code_in_text&quot;&gt;DrawHatch&lt;/span&gt;).&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Вот результат:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-RQiNnmYAAfg/UPfh6rbhu8I/AAAAAAAAARs/0uR6VhpH7o4/s800/TChatWithHatches.png&quot;/&gt;&lt;br /&gt;&lt;br /&gt;Проект можно воспроизвести, лишь кинув на форму TChart и заменив код формы на приведенный.</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/5833924871541650218/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2013/01/tchart.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/5833924871541650218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/5833924871541650218'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2013/01/tchart.html' title='Штриховка в TChart'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh6.googleusercontent.com/-GLLcTawK3JA/UPfh6qegdjI/AAAAAAAAARo/jZLDxlZL6nc/s72-c/s1_image002.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-4902757913311030595</id><published>2012-09-03T19:03:00.000+04:00</published><updated>2012-09-03T19:06:00.807+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><title type='text'>Вышла RAD Stuido XE3!</title><content type='html'>&lt;a href=&quot;http://www.embarcadero.com/products/rad-studio&quot;&gt;Основная страница&lt;/a&gt; продукта сообщает, что вышла новая версия студии - RAD Studio XE3!&lt;br /&gt;&lt;br /&gt;Что нового:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.embarcadero.com/ru/products/rad-studio/whats-new&quot;&gt;RAD Studio&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.embarcadero.com/ru/products/delphi/whats-new&quot;&gt;Delphi&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.embarcadero.com/products/cbuilder/whats-new&quot;&gt;C++Builder&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.embarcadero.com/ru/products/prism/whats-new&quot;&gt;Delphi Prism&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.embarcadero.com/ru/products/whats-new-in-html5-builder&quot;&gt;HTML5 Builder&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Полный список изменений есть в &lt;a href=&quot;http://docwiki.embarcadero.com/RADStudio/en/What%27s_New_in_Delphi_and_C%2B%2BBuilder_XE3&quot;&gt;вики&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Скачать триал можно &lt;a href=&quot;http://altd.embarcadero.com/download/radstudio/xe3/radstudio_xe3_win_esd.zip&quot;&gt;тут&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;Как было обещано ранее, подведем итоги опроса &quot;&lt;a href=&quot;http://keeper89.blogspot.com/2012/06/delphi-xe3-express.html&quot;&gt;Голосуем за Delphi XE3 Express!&lt;/a&gt;&quot;, проводившегося практически все лето - с 4 июня по 3 сентября (дату выхода новой студии).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Итоги следующие: из &lt;b&gt;493 &lt;/b&gt;проголовавших &lt;b&gt;471 &lt;/b&gt;человек - &lt;b&gt;ЗА &lt;/b&gt;выпуск Express-редакции Delphi (!), остальные &lt;b&gt;22 &lt;/b&gt;- &lt;b&gt;против&lt;/b&gt;, или &lt;b&gt;96%&lt;/b&gt; против &lt;b&gt;4%&lt;/b&gt;.&lt;/i&gt;, из которых &lt;b&gt;более 50%&lt;/b&gt; проголосовали за серьезную функционльность:&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://lh4.googleusercontent.com/-NlgzyVL3lE4/UETF_vCRKZI/AAAAAAAAAPk/DNs7tR4M0pI/s800/Screenshot%2520-%252003.09.2012%2520%252C%252018_51_04.png&quot; /&gt;&lt;br /&gt;Думаю, никто не будет спорить, что мнение комьюнити практически едингласное. Благодарю участников опроса (особенно тех, кто оставил интересные комментарии) и надеюсь на вашу дальнейшую активность!&lt;br /&gt;&lt;br /&gt;Письмо с просьбой и результатами голования будут отправлены David&#39;у I - посмотрим, на официальный отклик.</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/4902757913311030595/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2012/09/rad-stuido-xe3.html#comment-form' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/4902757913311030595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/4902757913311030595'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2012/09/rad-stuido-xe3.html' title='Вышла RAD Stuido XE3!'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh4.googleusercontent.com/-NlgzyVL3lE4/UETF_vCRKZI/AAAAAAAAAPk/DNs7tR4M0pI/s72-c/Screenshot%2520-%252003.09.2012%2520%252C%252018_51_04.png" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-8085330684595012189</id><published>2012-08-22T15:12:00.002+04:00</published><updated>2012-08-22T15:12:44.366+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><title type='text'>RAD Studio XE3 Preview</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;iframe allowfullscreen=&quot;allowfullscreen&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;http://www.youtube.com/embed/OZweoTDTP2M?feature=player_detailpage&quot; width=&quot;640&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;И еще. Недавно была анонсирована программа The Embarcadero MVP Program (бывшая Embarcadero Community Evangalist, насколько я понял), и от России там &lt;a href=&quot;http://blogs.embarcadero.com/ao/2012/08/21/39304&quot;&gt;уже присутствуют&lt;/a&gt;:&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Александр Алексеев&lt;/li&gt;&lt;li&gt;Александр Божко&lt;/li&gt;&lt;li&gt;Андрей Терехов&lt;/li&gt;&lt;li&gt;Владислав Баженов&lt;/li&gt;&lt;/ul&gt;Поздравляем!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/8085330684595012189/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2012/08/rad-studio-xe3-preview.html#comment-form' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/8085330684595012189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/8085330684595012189'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2012/08/rad-studio-xe3-preview.html' title='RAD Studio XE3 Preview'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/OZweoTDTP2M/default.jpg" height="72" width="72"/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-7703903536485362533</id><published>2012-08-09T12:49:00.002+04:00</published><updated>2012-08-09T12:52:50.835+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><title type='text'>David I, Delphi users &amp; Former employees</title><content type='html'>Интересная баталия произошла в &lt;a href=&quot;http://www.deltics.co.nz/blog/?p=936&quot;&gt;комментариях к данному&lt;/a&gt; посту в блоге &lt;a href=&quot;http://www.deltics.co.nz&quot;&gt;http://www.deltics.co.nz&lt;/a&gt;, в том числе, с участием David I. Пост, кстати, тоже интересный.&lt;br /&gt;&lt;br /&gt;Кроме того, в последнее время (один из них в том же посте) проскочили и комментарии бывших сотрудников (мифических или настоящих - загадка), которые в настоящее время удалены:&lt;br /&gt;&lt;img src=&#39;https://lh6.googleusercontent.com/-De0vNp2bzR8/UCN3BgPsEVI/AAAAAAAAAOw/vi8_kx7Cxrs/s800/427d73d02b77.png&#39;&gt;&lt;br /&gt;&lt;img src=&#39;https://lh6.googleusercontent.com/-LVFcJicWKx4/UCN3Bnqo8hI/AAAAAAAAAOw/LhyiIOjkFp4/s800/Safari.png&#39;&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/7703903536485362533/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2012/08/david-i-delphi-users-former-employees.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/7703903536485362533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/7703903536485362533'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2012/08/david-i-delphi-users-former-employees.html' title='David I, Delphi users &amp; Former employees'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh6.googleusercontent.com/-De0vNp2bzR8/UCN3BgPsEVI/AAAAAAAAAOw/vi8_kx7Cxrs/s72-c/427d73d02b77.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-7876208290034876891</id><published>2012-07-05T13:42:00.003+04:00</published><updated>2012-07-05T13:42:37.186+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Россия"/><category scheme="http://www.blogger.com/atom/ns#" term="Экономика"/><title type='text'>О проблемах СССР конца 50-х годов</title><content type='html'>По своей профессии я весьма далек от политики и экономики и являюсь чистым технарем. Более 50 лет я занимаюсь созданием принципиально новых средств вычислительной техники или, как сейчас принято говорить, развитием компьютерных технологий. Недавно меня попросили написать статью об истории создания и развития того направления вычислительной техники, которым я занимаюсь всю жизнь. В ходе работы над этой статьей, систематизируя свои воспоминания и изучая ряд исторических материалов, я неожиданно для себя обнаружил, что в советской истории существует период феноменального развития науки, техники и экономики в целом.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Начиная с середины сороковых годов создается целый ряд инновационных отраслей, таких, как атомная, ракетная, вычислительная техника, электроника, где мы, как минимум, не уступали США, а зачастую и опережали. Все остальные страны были далеко позади.&lt;br /&gt;&lt;br /&gt;Если атомная бомбы появилась в СССР в 1949 году, через 4 года после США, то первая в мире водородная бомба РДС-6 была уже советской. Первая в мире атомная электростанция была введена в эксплуатацию в СССР летом 1954 года, на год раньше, чем в Англии, и на 2 года раньше, чем в США. Только в СССР были созданы атомные ледоколы («Ленин» - 1959 г.). Единственный в мире самолет с атомным двигателем М-50А, поднявшийся в небо в 1960 году, был создан в СССР в ОКБ В.М. Мясищева. Лишь атомные подводные лодки появились в США в 1955 году, на 3 года раньше, чем в СССР.&lt;br /&gt;&lt;br /&gt;Достижения СССР в ракетной технике и космонавтике, начиная с первого спутника, запущенного в октябре 1957 года, общеизвестны.&lt;br /&gt;&lt;br /&gt;Уже в 1948 году, когда в США и Англии только разрозненные коллективы занимались разработкой единичных образцов компьютеров и в мире не было еще ни одного действующего изделия, в СССР по инициативе Сталина были созданы Институт точной механики и вычислительной техники (ИТМ и ВТ) АН СССР и Специальное конструкторское бюро N245 («СКБ-245»), как было написано в постановлении Правительства: «...для разработки и внедрения в производство средств вычислительной техники для систем управления оборонными объектами». В 1951 году создается первая советская цифровая вычислительная машина МЭСМ - сразу как промышленный образец. Следует заметить, что первые промышленные компьютеры в США (UNIVAC 1) и в Англии (Ferranti Mark 1) также появились в том же 1951 году. В 1953 году начинается серийное производство машин БЭСМ, «Стрела» и М-2 (для военных применений), которые находились на уровне лучших американских компьютеров того времени и существенно превосходили компьютеры других стран.&lt;br /&gt;&lt;br /&gt;Следует отметить, что в 50-х годах и советская электроника была на высоком уровне. Промышленное производство полупроводниковых транзисторов в США началось в марте 1958 года фирмой Fairchild Corp. при цене $150 за штуку. А информация о характеристиках отечественных «кристаллических триодов» была помещена в шестом номере популярного журнала «Радио» за 1955 год, а в 1956 году, на два года раньше, чем в США, началось промышленное производство. Осенью 1957 года я, будучи студентом третьего курса ЛЭТИ, занимался на кафедре автоматики и телемеханики практической разработкой цифровых устройств на транзисторах П-16. К этому времени транзисторы в СССР были не только общедоступны, но и дешевы (в пересчете на американские деньги менее доллара за штуку).&lt;br /&gt;&lt;br /&gt;Еще более поразительны успехи экономики в целом несмотря на полное отсутствие внешних кредитов и минимальные объемы нефтяных денег (газовых денег тогда не было). Уже в 1947 году промышленный потенциал СССР был полностью восстановлен, а в 1950 году он вырос более чем в 2 раза по отношению к довоенному 1940 году. Ни одна из стран, пострадавших в войне, к этому времени не вышла даже на довоенный уровень несмотря на мощные финансовые вливания со стороны США. Например, Япония достигла довоенного уровня лишь в 1955 году, хотя, если не считать ядерных бомбардировок, серьезных разрушений там не было. Лимитированное распределение продуктов по карточкам было отменено в СССР в 1947 году, а в Англии, несмотря на помощь США, лишь в 1954 году. В сентябрьском номере журнала «Нейшнл бизнес» (&quot;National Business&quot;) за 1953 г. в статье Герберта Гарриса «Русские догоняют нас» отмечалось, что СССР по темпам роста экономической мощи опережает любую страну и что в настоящее время темпы роста в СССР в 2-3 раза выше, чем в США. Годом ранее кандидат в президенты США Стивенсон оценивал положение таким образом, что если темпы роста производства в сталинской России сохранятся, то к 1970 г. объем русского производства в 3-4 раза превысит американский. Заметим, что темпы роста советской экономики в послевоенный период были намного выше, чем в довоенный.&lt;br /&gt;&lt;br /&gt;Но начиная с середины 50-х годов, ситуация резко меняется. Снижаются темпы роста, а в ряде областей возникают настоящие провалы. Вот как сказал об этом в 1991 году японский миллиардер Хероси Теравама, обращаясь к советским экономистам: «Вы не говорите об основном, о вашей первенствующей роли в мире. В 1939 году вы, русские, были умными, а мы, японцы, дураками. В 1949 году вы стали еще умнее, а мы были пока дураками. А в 1955 году мы поумнели, а вы превратились в пятилетних детей. Вся наша экономическая система практически полностью скопирована с вашей, с той лишь разницей, что у нас капитализм, частные производители, и мы более 15% роста никогда не достигали, а вы же при общественной собственности на средства производства достигали 30% и более. Во всех наших фирмах висят ваши лозунги сталинской поры». Из приведенного высказывания можно сделать ряд выводов. В 1939 году в СССР был разработан новый метод повышения эффективности экономики (МПЭ). МПЭ использовался в большинстве отраслей народного хозяйства. МПЭ являлся эффективным как для социалистического, так и для капиталистического уклада экономики, но для социалистического уклада эффективность МПЭ была выше более, чем в 2 раза. В 1955 году Япония заимствовала МПЭ, что и обеспечило ее бурный экономический рост за счет, прежде всего, инновационных технологий («японское чудо»), а СССР в том же году отказался от МПЭ, что обусловило последующую деградацию экономики. Итак, в СССР с 1939 по 1955 год применялся волшебный метод, обеспечивший беспрецедентный взлет экономики. Об этом методе в настоящее время не известно абсолютно ничего, хотя в те времена в СССР он применялся повсеместно.&lt;br /&gt;&lt;br /&gt;Моя трудовая деятельность началась в 1958 году, когда МПЭ уже был ликвидирован, но я хорошо помню рассказы сослуживцев, работавших в те времена, когда МПЭ действовал. МПЭ являлся совокупностью хорошо продуманных материальных и моральных стимулов для активизации творческой активности масс, направленной на снижение себестоимости и повышение качества (улучшения характеристик) разрабатываемой или уже производимой продукции. Система стимулов варьировалась в зависимости от отрасли и типа предприятия. Однако в любом варианте эти стимулы не распространялись на начальников любого ранга. Возможно, для руководящих работников была отдельная система стимулов, но мне об этом неизвестно.&lt;br /&gt;&lt;br /&gt;Материальные стимулы в организациях, занимавшихся разработками новой техники, заключались в коллективных и индивидуальных премиях, выплачиваемых сразу после приемки разрабатываемого изделия государственной комиссией (буквально в тот же день), если в акте комиссии отмечалось улучшение характеристик изделия по отношению к техническому заданию. Для каждой характеристики, включая время разработки изделия и стоимость разработки, имелась определенная премиальная шкала, известная разработчикам еще до начала проектирования. Например, за каждый сэкономленный килограмм веса изделия в ОКБ-590, где мне пришлось работать, выплачивалось 500 рублей (половина месячного оклада инженера). Эту премию получали все члены коллектива, участвующего в проекте, в одинаковом размере независимо от должности. Существовали и индивидуальные премии, необходимым условием выплаты которых являлось наличие рационализаторских предложений или заявок на изобретение, благодаря которым и стало возможным улучшение характеристик изделия. За каждую новацию авторам выплачивалась дополнительная сумма, кратная вознаграждению, полученному каждым членом коллектива, что не отменяло и обычных вознаграждений за экономический эффект, полученный от внедрения изобретения или рационализаторского предложения. Руководитель проекта, как правило, не занимавший административной должности, также получал дополнительную премию. Моральные стимулы заключались в том, что лица, обеспечившие коллективу получение таких премий, ускоренно продвигались по службе и в основном из их числа назначались руководители проектов. Одновременно применялись и обычные квартальные и годовые премии. Необходимо отметить и хороший моральный климат в научно-технических коллективах. К людям, способным к творческой работе, коллеги относились бережно, стараясь освободить их от рутинной работы без всяких указаний начальства, так как успехи одного распространялись на всех. Иными словами, человек человеку был другом. Здесь разработчики метода учли печальный опыт стахановского движения, когда успех одного больно бил по карману и статусу других и в коллективе начинался разлад.&lt;br /&gt;&lt;br /&gt;При относительно небольших затратах эффективность МПЭ была исключительно высока во всех отраслях народного хозяйства. Даже в армии во время войны существовала жесткая шкала денежных выплат и наград за личное уничтожение техники или живой силы противника, а также нанесение иного урона (например, взятие в плен офицеров противника, обладающих важной информацией). В оборонной промышленности в годы войны одновременно с напряженной производственной деятельностью велась непрерывная работа по совершенствованию технологических процессов. Так, за 4 военных года себестоимость производства большинства образцов вооружений (самолеты, танки и т.д.) была снижена в 2-3 раза. Даже винтовка Мосина, разработанная еще в XIX веке, подешевела в 1,6 раза. МПЭ позволял в максимальной степени использовать творческую активность рядовых исполнителей и выявлять яркие таланты. МПЭ применялся и в сельском хозяйстве на уровне совхозов и МТС (машинно-тракторных станций). Об этом говорит известный факт, что М.С. Горбачев получил в семнадцатилетнем возрасте орден за уборку урожая.&lt;br /&gt;&lt;br /&gt;Главной особенностью МПЭ являлось то, что при его использовании не только повышалась творческая активность большого числа людей и выявлялись таланты, но также изменялась психология всех членов коллектива, а также взаимоотношения в коллективе. Любой член коллектива осознавал свою значимость для общего процесса и с готовностью выполнял любую часть работы, даже в том случае, если эта работа не соответствовала его статусу. Взаимная доброжелательность, стремление оказать помощь друг другу были совершенно типичными чертами. По сути, каждый член коллектива считал себя личностью, а не винтиком сложного механизма. Изменялись и взаимоотношения начальников с подчиненными. Вместо приказов и указаний начальник стремился разъяснить каждому подчиненному, какую роль в общем деле играет та работа, которая ему поручается. По мере становления коллективов и формирования новой психологии сами материальные стимулы отходили на задний план и уже не являлись главной движущей силой. Полагаю, что разработчики МПЭ рассчитывали именно на такой эффект.&lt;br /&gt;&lt;br /&gt;Все вышеизложенное я знаю не по рассказам очевидцев, а по личным впечатлениям. Хотя я пришел в ОКБ-590 в 1958 году, через 3 года после отмены МПЭ, но психология - вещь инерционная, и она сохранялась длительное время даже при отсутствии внешних стимулов. Первые три года я работал в лаборатории цифровых систем, где начал свою деятельность с нижней ступеньки - настройщика узлов бортовой цифровой вычислительной машины. Эта специальность считалась рабочей, и настройщики (два человека) работали на сдельной оплате, получая значительно больше инженеров, в то время как я работал на фиксированном окладе техника. Мое появление неизбежно приводило к финансовым потерям двух других настройщиков, поскольку число узлов было ограничено лишь опытными образцами, после изготовления которых настройщики занимались лишь ремонтом при существенно меньшей оплате. Тем не менее меня приняли очень тепло и в течение месяца знакомили с тонкостями процесса настройки. Отношение ко мне не изменилось и через пару месяцев, когда я стал настраивать в несколько раз больше узлов, чем мои коллеги, и впоследствии, когда закончилась массовая настройка узлов. То есть для обычных рабочих парней общее дело коллектива лаборатории (создание опытных образцов БЦВМ) было важнее их личных финансовых интересов.&lt;br /&gt;&lt;br /&gt;Работа в качестве настройщика продолжалась недолго. Уже через несколько месяцев меня стали привлекать к инженерной работе, причем не только в качестве помощника. Характерной чертой лаборатории было полное отсутствие субординации. Все друг к другу обращались по именам, в том числе и к начальнику лаборатории. Этому способствовала и небольшая разница в возрасте сотрудников лаборатории, самому старшему из которых было менее 35 лет. Начальник лаборатории или руководитель группы не просто выдавали задание, а стремились донести до каждого члена коллектива цели этого задания и его роль для решения общей задачи. Рабочий день продолжался с 9 утра до 10-11 вечера, причем на чисто добровольной основе и без какой-либо дополнительной оплаты. Зато никто не контролировал время прихода и ухода сотрудников, что для режимных предприятий было совершенно нетипично.&lt;br /&gt;&lt;br /&gt;В мае 1961 года меня перевели в лабораторию аналоговых систем и назначили руководителем важнейшего для организации (да и для страны) проекта. Эта лаборатория функционировала с момента основания организации в 1945 году. Поэтому сотрудники здесь были старше по возрасту. Но атмосфера была такая же. Лишь к начальнику лаборатории все обращались по имени и отчеству, но не из-за его должности, а из-за возраста и опыта. Он провел всю войну на фронте, и прямо из армии его откомандировали в только что образованное ОКБ. Из всего коллектива только я знал, что и как надо делать, поскольку являлся единственным специалистом в области цифровой техники. И ведущие инженеры с 10-15-летним стажем без какого либо внутреннего сопротивления выполняли роль подсобных рабочих, поскольку понимали, что это необходимо для дела. Снова напомню, что к этому времени никаких стимулов уже не было. И третье подразделение нашего конструкторского бюро, с которым мне приходилось тесно взаимодействовать, работало в таком же стиле.&lt;br /&gt;&lt;br /&gt;Еще одна деталь. За все время работы в ОКБ-590 (в январе 1963 года оно было ликвидировано, а все сотрудники вместе с тематикой переведены в ОКБ-680, впоследствии НПО &quot;Электроавтоматика&quot;) я ни разу не слышал слово &quot;партия&quot;. Комната месткома была, а парткома не было. Только в 1963 году в новой организации я узнал, что в лаборатории было довольно много членов партии, и меня сразу же попытались сагитировать на вступление, но я уклонился. Иначе мне не удалось бы в 1964 году покинуть эту организацию. Кстати, начальник ОКБ-590 В.И. Ланердин был беспартийным. Говорили, что на пост начальника ОКБ Ланердина назначил лично Сталин, а до этого во время войны он работал в США, отвечая за поставки в СССР авиационной техники по ленд-лизу. К моменту назначения ему было не более 35 лет.&lt;br /&gt;&lt;br /&gt;Люди старшего поколения помнят фильм М. Ромма &quot;9 дней одного года&quot;, где была хорошо показана творческая атмосфера у физиков-ядерщиков. Могу определенно утверждать, что у нас в ОКБ-590 была такая же атмосфера. Правда, в новой организации эта атмосфера мгновенно исчезла, хотя люди остались те же самые. Сразу был введен жесткий режим. За пятиминутное опоздание лишали премии, а для того, чтобы отлучиться во время рабочего дня, надо было получать разрешение заместителя начальника по режиму. В итоге после 6 вечера никого в организации не оставалось. Более того, было запрещено оставаться работать по окончании рабочего дня. Правда, большую часть времени в 1963-1964 годах я и основная часть коллектива проводили в командировках, сначала в Москве на опытном заводе (где мне издалека приходилось видеть Сергея Хрущева), а затем в Смоленске на серийном заводе.&lt;br /&gt;&lt;br /&gt;Об экономическом эффекте творческой атмосферы свидетельствует следующее. Мой первый проект вычислительного устройства для управления пусковыми ракетными установками для системы ПРО А-35 был выполнен за 2 года, если считать от момента получения технического задания до комплексных испытаний опытных образцов в реальных условиях. Аналогичный по сложности проект суперкомпьютера ЕС-2704 при вдвое большем по численности коллективе и том же руководителе выполнялся уже 6 лет (1982-1988). И еще один пример. При создании советского стратегического бомбардировщика Ту-4 в качестве образца был взят американский бомбардировщик Б-29. Работа по изучению доставленного в Москву Б-29 началась в июле 1945 года. Менее чем через год, в марте 1946-го, техническая документация была передана на серийный завод. В мае 1947 года состоялся первый полет. А с начала 1949 года бомбардировщик был принят на вооружение. В послесталинский период от начала разработки самолета до его серийного производства проходило 8-12 лет. Ну а сейчас и того больше.&lt;br /&gt;&lt;br /&gt;Почему МПЭ эффективно использовался в СССР и Японии, а больше никто его перенимать не стал? Как было отмечено ранее, главным фактором МПЭ была причастность к общему делу, полезному для страны и общества в целом. При частной собственности этот фактор отсутствует, ибо главная польза идет хозяину. Япония же страна весьма специфичная. До конца двадцатого века для многих японцев фирма отождествлялась с семьей и потому польза для фирмы то же самое, что для семьи. По мере распространения западных ценностей в Японии этот менталитет стал утрачиваться, и эффективность МПЭ стала падать. И сейчас для экономики Японии характерна стагнация, хотя вряд ли кто-либо отменял МПЭ. По этим же причинам МПЭ невозможно возродить в современной России, где и государственные предприятия работают на частного хозяина (в данном случае свору чиновников).&lt;br /&gt;&lt;br /&gt;В середине 50-х годов МПЭ был тихо и незаметно отменен. Премии при завершении проектов сохранились и даже увеличились, но потеряли всякую стимулирующую роль. Теперь величина премии зависела от должностного оклада и от субъективного мнения руководства и не зависела от качества изделия и его экономических параметров. Из технического задания исчезли требования по себестоимости продукции и стоимости разработки. Объем премии был фиксирован на уровне 2% от стоимости разработки. В результате стало выгодно не снижать, а, наоборот, повышать как стоимость разработки, так и себестоимость проектируемого изделия. На заводах из плановых заданий исчезло ранее обязательное требование к снижению себестоимости продукции, что сразу привело к прекращению любых работ по совершенствованию технологических процессов. В это же время устанавливаются верхние ограничения на величину сдельной оплаты труда, на размер вознаграждения за рационализаторские предложения и изобретения. Изменился и моральный климат в коллективах. Теперь зарплата однозначно определялась окладом и не зависела от качества работы как коллективной, так и индивидуальной. Возросла роль субъективных факторов при должностных повышениях, что приводило к зависти и склокам. Иными словами, человек человеку стал чужим, а иногда и врагом.&lt;br /&gt;&lt;br /&gt;Отмена МПЭ больнее всего ударила по преподавателям технических вузов. Зарплата преподавателя состояла из двух частей - оклад преподавателя и оплата научной работы. Преподавательскую деятельность оплачивал вуз из своих бюджетных средств, а оплата научной деятельности шла за счет хоздоговорных НИР. Оклады преподавателей оставались неизменными с довоенных времен вплоть до 1991 года (с учетом десятикратной деноминации денег 1961 года). За научную работу после отмены МПЭ преподаватель получал половину ставки младшего или старшего научного сотрудника, меньше половины основного оклада. В годы же действия МПЭ научная составляющая зарплаты могла в разы превышать основной оклад при условии эффективного выполнения НИР. Известно, что зарплата некоторых профессоров достигала 20 тысяч рублей при основном окладе 4 тысячи. Недаром народная молва относила профессоров к самым богатым людям в СССР. Но и доценты были ненамного беднее, поскольку научная составляющая зарплаты не зависела от основного оклада. Хотя в гуманитарных вузах, скорее всего, преподаватели получали лишь основной оклад.&lt;br /&gt;&lt;br /&gt;Итак, легкое незаметное воздействие привело к остановке главного двигателя советской экономики. Какое-то время движение продолжалось по инерции, затем началась деградация, и в конце 80-х годов экономика разрушилась окончательно. Учитывая глобальный характер применения МПЭ, отменить его мог только руководитель СССР, которым с 1953 года был Н.С. Хрущев. В настоящее время известно, что все без исключения действия Хрущева в области экономики имели крайне негативные последствия. Однако принято считать, что Хрущев действовал из благих побуждений («хотел как лучше, а получалось как всегда»), но терпел неудачи в силу слабого образования и импульсивного характера. Но ликвидация МПЭ была проведена очень точно, грамотно и, главное, незаметно для окружающих, включая, скорее всего, остальных руководителей страны. Здесь благих побуждений нельзя увидеть даже в микроскоп. Есть основания считать, что и другие действия Хрущева были столь же глубоко продуманы и имели единую цель, в том числе и знаменитый доклад на двадцатом съезде партии. Здесь уместно привести высказывание Молотова о Хрущеве, сделанное им в 80-е годы: «Хрущёв, он же сапожник в вопросах теории, он же противник марксизма-ленинизма, это же враг коммунистической революции, скрытый и хитрый, очень завуалированный».&lt;br /&gt;&lt;a href=&quot; http://worldcrisis.ru/crisis/993685&quot;&gt;&lt;br /&gt;http://worldcrisis.ru/crisis/993685&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/7876208290034876891/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2012/07/50.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/7876208290034876891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/7876208290034876891'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2012/07/50.html' title='О проблемах СССР конца 50-х годов'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-3447693480794154973</id><published>2012-06-04T22:50:00.000+04:00</published><updated>2012-06-05T01:22:10.559+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><title type='text'>Голосуем за Delphi XE3 Express!</title><content type='html'>Уважаемые читатели блога и ленты Delphifeeds.ru!&lt;br /&gt;&lt;br /&gt;Прошу вас поучаствовать в голосовании, которое находится на любой странице данного блога в верхнем левом углу или в данном сообщении. Голосование продлится до 1 сентября (примерного выхода следующей версии Delphi).&lt;br /&gt;Опрос создается с целью определить, нужна ли бесплатная редакция нашей любимой среды и языка разработки, в каком бы виде Вы ее хотели видеть и возможного взаимодействия с Embarcadero на предмет результатов голосования :) &lt;br /&gt;&lt;br /&gt;В комментариях просьба написать развернутое мнение - причину голосования.&lt;br /&gt;&lt;br /&gt;Заранее спасибо!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Нужна ли &quot;Express&quot;-версия Delphi XE3?&lt;/b&gt;&lt;br /&gt;&lt;iframe allowtransparency=&quot;true&quot; name=&quot;poll-widget1908033443933645419&quot; src=&quot;http://www.google.com/reviews/polls/display/1908033443933645419/blogger_template/run_app?txtclr=%23666666&amp;amp;lnkclr=%230066cc&amp;amp;chrtclr=%230066cc&amp;amp;font=normal+normal+100%25+Georgia,+Serif&amp;amp;hideq=true&amp;amp;purl=http://keeper89.blogspot.com/&quot; style=&quot;border: medium none; width: 100%; height: 195px;&quot; frameborder=&quot;0&quot; height=&quot;300&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/3447693480794154973/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2012/06/delphi-xe3-express.html#comment-form' title='Комментарии: 17'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/3447693480794154973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/3447693480794154973'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2012/06/delphi-xe3-express.html' title='Голосуем за Delphi XE3 Express!'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-2766161358463673379</id><published>2012-05-19T00:30:00.000+04:00</published><updated>2012-05-19T12:53:59.344+04:00</updated><title type='text'>Экономические мотивы национализма (Л. Пайдиев)</title><content type='html'>Национализм возник, не в последнюю очередь, по экономическим причинам — как инструмент получения преимуществ в конкурентной борьбе. Утверждение о том, что Нация и Буржуазия связаны между собой, стало общим местом. Но в чём именно их взаимосвязь и какие экономические выгоды приносит национализм обществу — об этом стоит сказать подробнее.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;Первое&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Рыночная экономика — это война всех против всех.&lt;/b&gt; Причём война из-за денег достигает такой ожесточённости, какая и не снилась миру животных. Война — это не рыцарский турнир. Война — это когда режут спящего, бьют из за угла, вдесятером нападают на одного, вывешивают флаги мира, чтобы легче ворваться в город.&lt;br /&gt;&lt;br /&gt;На войне всегда, в конце концов, выигрывают «Большие Батальоны». Задача любого вождя обеспечить себе большие и сплочённые батальоны и посеять смуту в чужих рядах. Тот, у кого есть миллиард, всегда раздавит того, у кого есть миллион, просто по закону больших чисел.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;Второе&lt;/span&gt;&lt;br /&gt;Конкуренция — очень разорительная для общества вещь. Фирма тратит огромные средства на вхождение в рынок, на собственно конкурентную борьбу (реклама, дублирование, подкуп, шпионаж) и, самое страшное, на выведение проигравших с рынка. Тот, кто представляет себе, чем чревато для общества разорение банков — содрогнётся. Отсюда желание ограничить конкуренцию, ввести её в некоторые рамки. &lt;b&gt;Во имя единства нации конкуренция внутри страны регламентируется и превращается в рыцарский турнир.&lt;/b&gt; На то созданы специальные государственные и общественные органы.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;Третье&lt;/span&gt;&lt;br /&gt;Капиталист ориентируется при принятии решений о развитии производства на показатели, измеряемые процентами от нормы прибыли. Но для общества цена его решения может быть несопоставимо выше. С уходом производства из данной страны или данного города теряются и налоги, и зарплата рабочих, и прибыль других капиталистов, обесценивается недвижимость. Значит, &lt;b&gt;нужны институты, которые включат «сопутствующие» интересы общества в систему калькуляции собственных интересов капиталиста.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;Четвертое&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Бизнес невозможен без справедливого суда.&lt;/b&gt; Но за определённым уровнем экономических интересов справедливость суда испаряется для чужих. В Нигерии при нескольких тысячах долларах, в США при многомиллионных интересах Американского Народа. Счастье, если у тебя есть паспорт гражданина страны со справедливым судом. Это неубиенное конкурентное преимущество.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;Пятое&lt;/span&gt;&lt;br /&gt;&lt;b&gt;В мире глобальной конкуренции выигрывает тот, кто может мобилизовать больше денег.&lt;/b&gt; Поэтому самым высокооплачиваемым специалистом в этом мире является специалист по привлечению средств. Не собственник земли, знаний, капитала, а инвестиционный банкир. А выигрывает конкуренцию на этом рынке тот, кто близок к эмиссии резервной валюты. А эмитировать такую валюту может лишь национальное государство.&lt;br /&gt;&lt;br /&gt;Почему? Хотя бы потому, что мировая торговля идёт по морям. Значит, нужны авианосцы. Враждебные страны надо плотно переформатировать или уничтожать со всем населением. Если врага не уничтожать до последнего человека, а менять, нужны и сухопутные войска. А это всё национальное государство.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;Кому выгодна националистическая политика?&lt;/span&gt;&lt;br /&gt;В национальном государстве царит Закон. Люмпенов нет. Ребёнок после школы спокойно приходит домой, девушка спокойно гуляет вечером. В процветающую страну едут туристы. Индустрия туризма выигрывает самой первой. Но главными выигравшими являются элиты данной страны. Опираясь на своё государство, как на мощный тыл, они могут претендовать на высокие места в мировой элите.&lt;br /&gt;&lt;br /&gt;Наиболее зрим и осязаем выигрыш тех, кто делает деньги на недвижимости и сфере услуг. Вообще, все живущие с ренты, все, кто продаёт услуги здесь (домовладельцы, железнодорожники, газетчики, книгоиздатели, рестораторы), жизненно заинтересованы в существовании национального государства. Но больше всего заинтересованы местные финансисты. У них есть своя резервная валюта. &lt;b&gt;Возможность создавать деньги из воздуха в кризисные моменты является решающим конкурентным преимуществом в страховом и инвестиционном бизнесе.&lt;/b&gt; В постиндустриальной экономике не производитель и не собственник капитала получает выгоды от глобализации, но тот, кто может мобилизовать капиталы для проектов того и другого, и застраховать их риски. Участие в инвестиционном и страховом бизнесе целиком и полностью зависит от близости к эмиссионному центру в периоды кризисов. Именно поэтому, каждый раз поднимаясь, Германия починяла себе Центробанк, и каждый раз после поражения у неё его отнимали. Именно это стратегическое преимущество демонстрирует экономика США последние годы.&lt;br /&gt;&lt;br /&gt;Повседневная жизнь элиты становится более комфортной и безопасной. Одно дело, когда по делам ты спокойно вышел из дома и сам повёл машину по чистому городу, поел в кафе, где побеседовал с нужными людьми. Всё сделал сам. Как Сорос в Швейцарии. И другое дело — ехать с толпой охранников по грязному неуютному городу, застревая в пробках в компрадорском государстве. Всюду чужие и враждебные глаза. Поэтому элита так любит Лондон или Цюрих. Там они всегда могут вести частную жизнь. Хотя это города, где они всегда будут чужими.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;Цена национального государства&lt;/span&gt;&lt;br /&gt;Национальное государство, по определению, стоит дорого.&lt;br /&gt;&lt;br /&gt;1. Оно обеспечивает эффективный правопорядок. Это требует больших расходов на судебную систему, полицию, спецслужбы, контрольные органы разного рода (например, система счётных палат, антимонопольные органы), законодательную систему.&lt;br /&gt;&lt;br /&gt;2. Государство эффективно защищает своих производителей на внешних и внутренних рынках. Это требует сильной армии и военно-морского флота (международная торговля идёт по морям), сильной разведки.&lt;br /&gt;&lt;br /&gt;3. Для защиты внутреннего рынка нужна сильная и эффективная таможня. Унификация тарифов не допустима. Поскольку таможенные войны сегодня недопустимы, то надо прибегать к нетарифным методам. Это санитарный надзор, патентное право, провокации и т.п.&lt;br /&gt;&lt;br /&gt;4. Квалифицированная рабочая сила. Человек как животное очень ленив. Бомж — это самое естественное и сладостное состояние человека на протяжении миллионов лет его истории (недавно бомжи, жившие в теплоцентрали, начали охотиться на людей и пожирать их). Воспитание человека «рисовой цивилизации» потребовало пары тысячелетий и управляемого естественного отбора. Воспитание техника и квалифицированного рабочего, тем более инженера, потребовало создания огромных дорогостоящих систем. Вне их человек вначале превращается в человека военной демократии (чечена), а потом в собирателя (бомжа).&lt;br /&gt;&lt;br /&gt;5. Система социальной защиты. Свой человек, «брат во Христе» не должен помирать под забором.&lt;br /&gt;&lt;br /&gt;6. Хорошее образование. Талантливый юноша должен получить образование. Тем более, что из «золотой молодёжи» работники получаются плохие, причём даже в вузах, имеющих многовековой опыт воспитания элитных лоботрясов.&lt;br /&gt;&lt;br /&gt;Но всё это всё означает, что налоги в такой стране высоки! Очень высоки! Шведы и датчане — рекордсмены по налогам. Проповедь низких налогов в современном мире есть злонамеренная ложь. Это может обещать или лжец, или невежда. Или глава государства, которое может грабить соседей.&lt;br /&gt;&lt;br /&gt;Высокие налоги экономика может вынести только при эффективном их расходовании. &lt;b&gt;Нецелевое расходование бюджетных средств, с точки зрения национального государства, — тяжелейшее преступление.&lt;/b&gt; По тяжести — второе после неуплаты налогов (тут тоже не действует принцип «презумпции невиновности»).&lt;br /&gt;&lt;br /&gt;В национальном государстве царит нетерпимость к коррупции — как к разновидности предательства, измены Народу. Вместе с тем, проблема коррупции и забюрократизрованности служит наиболее распространенным возражением против принципов национального государства. Но коррупция далеко не так непобедима, как это у нас принято считать. И лучшее подтверждение тому — опыт состоявшихся национальных государств, которыми выработаны достаточно эффективные технические приемы. Назовем лишь самые простые и очевидные из них:&lt;br /&gt;&lt;br /&gt;1. Соответствие официальных доходов реальным расходам. Если расходы не соответствуют официально декларируемым доходам — тюрьма. Причём расходы считаются по специальным методикам («если купил дорогую машину, значит, ел икру, а не «одной я корочкой питался»…). Цель этого механизма — не должно появляться никаких богачей ниоткуда. И в случае сомнений — тюрьма. Этого уже достаточно для того, чтобы резко ограничить коррупцию.&lt;br /&gt;&lt;br /&gt;2. Независимая система регистрации преступлений, и поощрение людей, от премии до продвижения по службе, в соответствии с коэффициентом раскрываемости. Причём оба эти принципа реализуются одновременно. Был даже соответствующий Указ Президента Ельцина, который давал поручение Министерству внутренних дел разработать необходимую систему и который благополучно замотали в ведомстве Рушайло, а Контрольное управление Президента внимания на это не обратило.&lt;br /&gt;&lt;br /&gt;Итак, институты национального государства сложно устроены и дорого стоят. Но отказавшиеся платить эту цену заплатят куда дороже. Только нации смогли создать богатые и процветающие государства, общества.&lt;br /&gt;&lt;br /&gt;Или ты борешься за высокооплачиваемые рабочие места, или за рабочие места голодных негров. По мере развития экономики конкуренция на рынке низкоквалифицированного труда возрастает.&lt;br /&gt;&lt;br /&gt;Если в России будет создано национальное государство — мы будем бороться за высокооплачиваемые рабочие места в сфере международных финансов. Если нет — за кусок хлеба с неграми: «Полдюжины кузнечиков и горсточка риса за 12-часовой рабочий день». Середины не будет.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;Почему многим не нравится национальное государство?&lt;/span&gt;&lt;br /&gt;Мне могут задать вопрос: если национализм столь выгоден в экономике, то почему же национальное государство не стало повсеместно господствующей формой общественного устройства?&lt;br /&gt;&lt;br /&gt;Отвечу: именно поэтому. Эффективное государство начинает бороться за самые высокооплачиваемые рабочие места. И его бьют конкуренты. В том числе и применяя прямое насилие.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;У национального государства есть могучий внешний враг — международный финансовый капитал.&lt;/b&gt; У международного финансового капитала быстро находится и союзник внутри. Этого внутреннего врага принято называть компрадорской буржуазией. Обычно это экспортёры сырья.&lt;br /&gt;&lt;br /&gt;Здесь к месту вспомнить о рикардианском парадоксе. Математическому уму Рикардо принадлежит блестящее и безупречное доказательство преимущества свободной торговли. Известно, что в разных странах существуют разные пропорции между затратами на производство различных товаров. Допустим, затраты на производство компьютера в США эквивалентны затратам на производство 1 тонны нефти, а в России затратам на производство 3 тонн нефти. Тогда бросив все силы на нефтедобычу, Россия заработает втрое больше, чем бросив на производство компьютеров.&lt;br /&gt;&lt;br /&gt;Таким образом, для экономики из двух товаров и двух стран каждой стране оказывается выгодней специализироваться на том товаре, относительные затраты на производство которого меньше относительных затрат на производство аналога в другой. При этом обе получают прибыль от внешнеторгового обмена. США при тех же затратах получат больше нефти, а Россия — больше компьютеров.&lt;br /&gt;&lt;br /&gt;Для большего числа товаров и стран эта схема обобщается и усложняется, но неизменным остается главное открытие Рикардо: специализация позволяет каждой стране в условиях свободной торговли получать максимум того, что она может заработать при сложившейся экономической ситуации. Протекционизм же нарушает эти пропорции и страны получают меньше, чем могли бы. Следовательно, свобода торговли — главное условие получения максимальной прибыли каждой страной. Непонятно, с чем же здесь можно спорить?&lt;br /&gt;&lt;br /&gt;И все же следует обратить внимание на одно обстоятельство. Рикардо доказывает, что свобода торговли выгодна всем при сложившихся экономических условиях. А условия эти таковы, что в Англии XIX в. технологический уровень промышленного производства выше, чем допустим в Германии или Франции. Этим последним оказывается выгодным специализироваться на производстве зерна и уничтожить свою промышленность. Продавая зерно, они получат в обмен на него из Англии больше промышленных продуктов, чем могут произвести сами. Прямая выгода.&lt;br /&gt;&lt;br /&gt;Фридрих Лист первый внес в экономическую науку идею, что любое экономическое решение должно рассматриваться не только с точки зрения сегодняшней эффективности, но и с точки зрения его длительных и косвенных последствий. Позже Маршалл назовет эти косвенные последствия extemal economies. Но прямая выгода сегодня оборачивается консервацией отсталости и проигрышем завтра. Германия и Франция отставали во времена Листа от Англии лет на двадцать. В условиях свободы торговли они отстали бы навсегда.&lt;br /&gt;&lt;br /&gt;Итак, свобода торговли консервирует сложившееся положение вещей — индустриальное лидерство одних и отсталость других. Цель же Листа заключается в том, чтобы вывести Германию из отсталости. А значит он — противник свободы торговли. Идеи Листа универсальны для всех стран догоняющего развития. Для этих стран неприменимы кажущиеся очевидными теоретические схемы лидеров мировой экономики. Для догоняющего развития нужна система специальных мер, одной из которых неизбежно оказывается протекционизм.&lt;br /&gt;&lt;br /&gt;В условиях свободного перетока капитала рикардианская закономерность модифицируется: производство умирает, как только норма прибыли капитала становится меньше, чем в стране конкуренте. Обратите внимание на эту закономерность: достаточно производству создавать всего на несколько процентов меньшую добавочную стоимость, как из страны уходит и зарплата, и налоги, и рента и доходы на капитал.&lt;br /&gt;&lt;br /&gt;Стране выгодно, чтобы сырьё перерабатывалось внутри ее границ по всей технологической цепочке до высших форм. Тогда масса вновь созданной стоимости в стране будет больше, будет расти национальное богатство. Лес кругляк — до бумаги, газ — до этилена и пластмасс, руда до металла и машин. Но отдельному производителю сырья это не очень выгодно: страна, Нация будет платить ему всегда меньше, чем мировой рынок. К газовику приходит финансист Сити: «Из одного кубометра газа Я, Великий финансист, могу сделать гораздо больше продукции, денег, чем твоя Нация, ибо наша экономика эффективней на всех этапах его переработки использования. Поэтому я всегда заплачу за него больше, чем твоя Нация. Зачем тебе эти голодранцы? Кто они такие? Нация жалких генетических отбросов Человечества. Этих денег хватит тебе и на благотворительность, чтобы откупиться от твоего бога и твоей совести».&lt;br /&gt;&lt;br /&gt;И компрадор продаёт свой Народ за замок под Лондоном и счета в банках Сити. Потом начинается похмелье. Добыча и экспорт сырья становится всё менее выгодным. Ибо его экспорт дотировала вся страна, разработавшая месторождения, построившая инфраструктуры. Теперь она этого не может. И экспорт уже идёт за деньги компрадора, на последнем издыхании. В Китае обычным у компрадора был дворец с каменным фасадом и стенами из досок. Он выглядел свирепым грабителем в глазах народа, а реально ему оставляли крохи. Эта история повторяется и в России. Драма разворачивается буквально в эти дни у нас на глазах.&lt;br /&gt;&lt;br /&gt;Почему внутреннего врага могли победить очень немногие? &lt;b&gt;Важнейшей предпосылкой является наличие Нации и большого внутреннего рынка.&lt;/b&gt; Большой внутренний рынок даёт автономию, позволяет выстраивать длинные межотраслевые цепочки. И, самое главное, ключевое для национального государства — иметь сильную национальную валюту. Без этого нет кредитной системы.&lt;br /&gt;&lt;br /&gt;В целом, без всей системы институтов национального государства, идеологией которых является братство нации, завоевание места под солнцем рынка невозможно. «Мы один народ на единой земле» — вот универсальная формула победы. &lt;b&gt;«Мы — вместе. А враги — пусть убивают друг друга сами».&lt;/b&gt; Мощная идеология и богатая культура создают нацию. Под обаяние национальной культуры попадают огромные массы людей. Самые разные племена и национальности стремятся влиться в нацию. И тогда большая страна и национальное единство миллионов становятся реальными.&lt;br /&gt;&lt;br /&gt;У России и русских всё это было. Наши силы подорваны, мы на грани вылета в небытие, но шанс ещё есть. Мы ещё можем собрать 200-миллионный народ.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;a href=&quot;http://www.apn.ru/publications/article17450.htm&quot;&gt;http://www.apn.ru/publications/article17450.htm&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/2766161358463673379/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2012/05/blog-post_19.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/2766161358463673379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/2766161358463673379'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2012/05/blog-post_19.html' title='Экономические мотивы национализма (Л. Пайдиев)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-144216748809640483</id><published>2012-02-27T16:20:00.000+04:00</published><updated>2012-02-27T16:20:29.927+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CnPack IDE-Мастер"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><title type='text'>Новые фишки в CnPack IDE-Мастере</title><content type='html'>Недавно &lt;a href=&quot;http://keeper89.blogspot.com/2011/08/cnpack-ide-imagelist.html&quot;&gt;я рассказывал про редактор ImageList&lt;/a&gt;, и снова наступающие изменения в CnPack IDE-Мастере.&lt;br /&gt;&lt;br /&gt;1. Добавилась настройка &quot;Разделитель между процедурами и функциями&quot;:&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://lh4.googleusercontent.com/-35OdWScHoCQ/T0tumQ5HmFI/AAAAAAAAAMg/MZ1I1qo6-Sk/s800/chkSeparateLine2.png&quot; /&gt;&lt;br /&gt;Выглядит это следующим образом:&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://lh6.googleusercontent.com/-Jxm-40XypgY/T0tumB8GrOI/AAAAAAAAAMg/0F5EreZGAsw/s800/chkSeparateLine.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;2. Добавились 2 команды - переход к следующему и предыдущему идентификатору в коде:&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://lh4.googleusercontent.com/-0hPgQSwIaYE/T0tw1NAAAWI/AAAAAAAAAMg/pupT0ekIkX8/s800/JumpTo.png&quot; /&gt;&lt;br /&gt;С ними все понятно и так.&lt;br /&gt;&lt;br /&gt;Ждем новых фишек!</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/144216748809640483/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2012/02/cnpack-ide.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/144216748809640483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/144216748809640483'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2012/02/cnpack-ide.html' title='Новые фишки в CnPack IDE-Мастере'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh4.googleusercontent.com/-35OdWScHoCQ/T0tumQ5HmFI/AAAAAAAAAMg/MZ1I1qo6-Sk/s72-c/chkSeparateLine2.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-8164222666208432119</id><published>2012-02-12T20:50:00.002+04:00</published><updated>2012-02-12T20:53:54.267+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Программирование"/><title type='text'>Hydra 4</title><content type='html'>Очень интересная вещь, если кто не видел, рекомендую посмотреть:&lt;br /&gt;&lt;a href=&quot;http://www.remobjects.com/tv/hydra.aspx&quot;&gt;http://www.remobjects.com/tv/hydra.aspx&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;&lt;br /&gt;RemObjects Hydra Overview&lt;/span&gt;&lt;br /&gt;&lt;iframe width=&quot;840&quot; height=&quot;472&quot; src=&quot;http://www.youtube.com/embed/8oA_whexkUQ&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;&lt;br /&gt;Introducing RemObjects Hydra 4&lt;/span&gt;&lt;br /&gt;&lt;iframe width=&quot;840&quot; height=&quot;472&quot; src=&quot;http://www.youtube.com/embed/YLnaZcXro_Y&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;span class=&quot;KeeperHeader1&quot;&gt;&lt;br /&gt;Mixing VCL &amp;amp; FireMonkey with RemObjects Hydra&lt;/span&gt;&lt;br /&gt;&lt;iframe width=&quot;840&quot; height=&quot;472&quot; src=&quot;http://www.youtube.com/embed/1ADYE5EdIKQ&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/8164222666208432119/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2012/02/hydra-4.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/8164222666208432119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/8164222666208432119'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2012/02/hydra-4.html' title='Hydra 4'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/8oA_whexkUQ/default.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-5000444427512192466</id><published>2011-10-20T00:08:00.000+04:00</published><updated>2011-10-20T00:08:04.135+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><title type='text'>Кроссплатформленная разработка: EXE + DLL</title><content type='html'>&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;http://www.youtube.com/embed/n7nMtJMdEyw&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/5000444427512192466/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2011/10/exe-dll.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/5000444427512192466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/5000444427512192466'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2011/10/exe-dll.html' title='Кроссплатформленная разработка: EXE + DLL'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/n7nMtJMdEyw/default.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-8860388321679185791</id><published>2011-10-20T00:06:00.002+04:00</published><updated>2011-10-20T00:08:16.843+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi"/><title type='text'>Конвертируем проект: VCL-&gt;FireMonkey</title><content type='html'>&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;http://www.youtube.com/embed/22MbO_HzU-E&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/8860388321679185791/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2011/10/vcl-firemonkey.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/8860388321679185791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/8860388321679185791'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2011/10/vcl-firemonkey.html' title='Конвертируем проект: VCL-&gt;FireMonkey'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/22MbO_HzU-E/default.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3534124135013415942.post-3518004699472693065</id><published>2011-10-07T15:33:00.000+04:00</published><updated>2011-10-07T15:33:36.162+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Политика"/><title type='text'>Идите в избирком и получите паспорт! (М. Делягин)</title><content type='html'>Нелегитимность предстоящих нам в ближайшем будущем процедур назначения депутатов Госдумы, а затем – премьера Путина президентом России (разумеется, «при соблюдении высочайших демократических стандартов избирательных процедур»), как представляется, обусловлена, по меньшей мере, четырьмя причинами, каждой из которых было бы уже вполне достаточно.&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Первая, и самая очевидная – гомерический масштаб фальсификаций, выявленный, насколько можно судить, в ходе многочисленных скандалов прошлых лет: от прямых показаний наблюдателей до результатов математического анализа голосов. Стоит вспомнить «казус Ингушетии», голоса которой были отданы «Единой России», хотя большинство избирателей затем написали заявления, что вовсе не ходили на выборы, и «казус Митрохина» (когда оказалось, что на участке, где голосовал он с женой, «Яблоку» не было отдано ни одного голоса вообще).&lt;br /&gt;&lt;br /&gt;Вторая причина нелегитимности предстоящих выборов – вопиюще неравный, по мнению автора, доступ к агитационным возможностям: от «паровозов» в списках «Е..ной России» (!) до запугивания бизнесменов, финансирующих неугодных.&lt;br /&gt;&lt;br /&gt;Третья – недопущение на выборы всех новых политических сил (вероятно, заподозренных в нелояльности к Администрации президента). Последней новой партией была «Родина» образца 2003 года (ставшая основой «Справедливой России» – «Правое дело» наследует даже не СПС, а еще гайдаровскому «Демвыбору»).&lt;br /&gt;&lt;br /&gt;Российские политические партии мало меняются и несут свои «родимые пятна» на протяжении всей истории; поэтому допущенный на выборы политический спектр отражает реальность, дай Бог, начала 2000-х годов. Социально-политическая же структура общества меняется значительно быстрее, в результате чего огромная часть современных избирателей a prioriлишена даже возможности политического представительства: им просто не за кого голосовать.&lt;br /&gt;&lt;br /&gt;Наконец, последнюю причину нелегитимности предстоящих выборов публично доказал в конце лета не кто-нибудь, а член Центризбиркома (от КПРФ), продемонстрировав, что голосование с использованием электронных урн позволяет точно установить, за кого голосовал тот или иной гражданин, что, строго говоря, представляется прямым нарушением тайны голосования, а с ней – и Конституции РФ.&lt;br /&gt;&lt;br /&gt;Изложенное вполне очевидно основной части общества: понимание того, что так называемые «выборы» представляют собой не вполне пристойный спектакль, распространяется все более широко и захватывает даже прежде лояльные к власти социальные группы.&lt;br /&gt;&lt;br /&gt;Сегодня мыслящую Россию объединяет один вопрос – что делать, чтобы продемонстрировать свое отношение к высочайшему безобразию?&lt;br /&gt;&lt;br /&gt;Совет «наблюдай внимательно!» уже давно разоблачил себя как официальная пропаганда и напоминает издевательство, как и совет защищать свои политические права в суде.&lt;br /&gt;&lt;br /&gt;Наиболее популярен ответ Навального «голосуй за меньшее зло»: за кого угодно, кроме «Партии жуликов и воров» (тм).&lt;br /&gt;&lt;br /&gt;Другой рецепт стар, как мир: испорти бюллетень или забери его с собой.&lt;br /&gt;&lt;br /&gt;Однако они слабы. Забрать выданный бюллетень с собой может и не получиться – строго говоря, это неправовое действие. Матерное ругательство, которое Вы напишете на бюллетене, не прочитает никто, кроме Вашей учительницы литературы, оказавшейся в избирательной комиссии. А проголосовав за кого бы ни было, Вы не поможете им (насколько можно судить, Ваш голос с легкостью перебросят «кому надо»), но лишь подтвердите своим приходом легитимность «выборов» и сделаете половину дела за фальсификаторов, обеспечив им явку.&lt;br /&gt;&lt;br /&gt;Конечно, хороших ответов в таких ситуациях не бывает, но бывают более разумные.&lt;br /&gt;&lt;br /&gt;Прежде всего, задача фальсификаторов выборов складывается из двух частей: обеспечение явки и «правильное» распределение голосов.&lt;br /&gt;&lt;br /&gt;Хотя бы из простого человеческого злорадства не стоит делать за этих людей даже часть их работы: не стоит ходить на эти «голосуйки», прикидывающиеся выборами. Тем более что самим фактом прихода на них Вы – повторюсь – признаете их легитимность и свое согласие с ними.&lt;br /&gt;&lt;br /&gt;Посмотрите официозные телеканалы: эти люди заботятся о Вас? Защищают Вас? И Вы – скорее всего – их на самом деле не выбирали даже в кошмарном сне.&lt;br /&gt;&lt;br /&gt;Но «протест на диване» за пределами теплого круга персонажей «Нашей Раши», конечно, приемлем далеко не для всех.&lt;br /&gt;&lt;br /&gt;Официальное исключение себя из списков избирателей, предложенное Лимоновым, не только слишком хлопотно и демонстративно: оно не проработано юридически. Законом оно предусмотрено, а вот инструкции для технического сотрудника избиркома, как это делать, нет. В результате Вы можете добиться своего (потратив массу сил и времени) в Москве, Питере и, может быть, Нижнем Новгороде, но в большинстве регионов России Вам этого сделать не удастся – просто технически. Кстати, даже в Москве попытка С. Удальцова вычеркнуть себя из списка «избирателей» довела его до суда, который отклонил его требование. И судью можно понять: как это – вычеркивать себя из списка, по сути дела, рабов? Какой же это раб, если он может самоисключиться?&lt;br /&gt;&lt;br /&gt;Поэтому отбирать свой голос у фальсификаторов следует, используя технологически отработанные механизмы. Лучший из них – получение открепительного талона.&lt;br /&gt;&lt;br /&gt;Обычно они, насколько можно судить, используются для фальсификаций, но любое оружие применимо против его создателя.&lt;br /&gt;&lt;br /&gt;Если Вы придете в избирком и объясните, что во время выборов будете в командировке или в гостях у друзей, и попросите выдать Вам открепительный талон – Вам невозможно будет отказать. Это рутинная бюрократическая процедура, отработанная до мелочей.&lt;br /&gt;&lt;br /&gt;Единственно, что не следует при получении открепительного талона выкрикивать политические лозунги, выказывать свое отношение к политическому строю и лично паханату: как минимум такое поведение создаст у выдающих открепительный талон ощущение, что Вы не будете голосовать, и, соответственно, Ваш голос можно будет использовать при голосовании.&lt;br /&gt;&lt;br /&gt;Если же Вы будете выглядеть обычным добропорядочным и послушным пропаганде человеком, Ваш голос никем не будет присвоен.&lt;br /&gt;&lt;br /&gt;И справка об этом – открепительный талон с гербовой печатью – останется у Вас как паспорт подлинного, честного и ответственного перед своим народом и своей страной гражданина России. (Возможно, потом какие-то институты гражданской активности будут даже давать преимущества обладателю такого талона – своего рода «ветерану демократии».)&lt;br /&gt;&lt;br /&gt;Кстати, вечером в день голосования полезно будет зайти на избирательный участок минут за 30 до его закрытия и проверить, не поставлена ли против Вашей фамилии подпись, свидетельствующая о том, что вы проголосовали. Если она есть – это доказательство фальсификации, можно писать заявление, настаивать на возбуждении уголовного дела против председателя комиссии и ее членов и отмене выборов на данном участке. Ничего этого, конечно, не будет, но панику Вы устроите, особенно, если таких, как Вы, будет несколько.&lt;br /&gt;&lt;br /&gt;Если же у Вас совсем много сил и времени – не поленитесь, снимите видеорегистратором двери в избирательный участок в течение всего времени голосования. Если запись покажет, что в двери вошло (и вышло) семьсот человек, а «Е..ная Россия» получит на этом участке тысячу голосов — это будет еще одно убедительное и потому полезное доказательство фальсификации выборов.&lt;br /&gt;&lt;br /&gt;Если же Вы симпатизируете какому-нибудь политику (такое бывает), то чем голосовать за него, напишите ему теплое личное письмо: голос, скорее всего, будет украден (или приписан), а письмо дойдет. Политикам редко приходится получать от обычных людей искренние слова одобрения, их ремесло жесткое и холодное, и они нуждаются в таких словах — а голоса на «голосуйках» они, насколько можно судить, получают не от Вас.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://delyagin.ru/articles/19603.html&quot;&gt;http://delyagin.ru/articles/19603.html&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://keeper89.blogspot.com/feeds/3518004699472693065/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://keeper89.blogspot.com/2011/10/blog-post_07.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/3518004699472693065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3534124135013415942/posts/default/3518004699472693065'/><link rel='alternate' type='text/html' href='http://keeper89.blogspot.com/2011/10/blog-post_07.html' title='Идите в избирком и получите паспорт! (М. Делягин)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/03120580275383764107</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>