<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:8vmr</id>
  <title>Заметки перфекциониста</title>
  <subtitle>Анто Голинко</subtitle>
  <author>
    <name>Анто Голинко</name>
  </author>
  <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom"/>
  <updated>2009-12-05T17:38:10Z</updated>
  <lj:journal userid="14736462" username="8vmr" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://8vmr.livejournal.com/data/atom" title="Заметки перфекциониста"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:14623</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/14623.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=14623"/>
    <title>8vmr @ 2009-12-05T19:41:00</title>
    <published>2009-12-05T17:37:48Z</published>
    <updated>2009-12-05T17:38:10Z</updated>
    <content type="html">Все люди делятся на две группы - те, кто делает бэкапы, и те, кто будет их делать.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:14521</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/14521.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=14521"/>
    <title>Гугл учит плохому</title>
    <published>2009-12-01T11:42:36Z</published>
    <updated>2009-12-01T11:42:36Z</updated>
    <category term="web"/>
    <content type="html">Собственно вот: &lt;a href="http://code.google.com/intl/ru-RU/speed/articles/optimizing-html.html"&gt;Reducing the file size of HTML documents&lt;/a&gt;&lt;br /&gt;Уменьшить ХТМЛ это конечно хорошо, но не путем же уродования православного и идеологически верного XHTML, преобразуя его в еретичный говно-HTML 4.0!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:14179</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/14179.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=14179"/>
    <title>One large step for open source code...</title>
    <published>2009-07-30T10:44:25Z</published>
    <updated>2009-07-30T10:44:25Z</updated>
    <content type="html">&lt;p&gt;К 40-летию мисии Apollo 11 (да, той самой с высадкой человеков на Луну) в гуглокоде были опубликованы исходные коды командного(Comanche054) и лунного(Luminary099) модуля.&lt;/p&gt;

&lt;p&gt;Собственно коды модулей, а также виртуальной машины &lt;a href="http://en.wikipedia.org/wiki/Apollo_Guidance_Computer"&gt;AGC&lt;/a&gt; можно найти &lt;a href="http://code.google.com/p/virtualagc/"&gt;тут&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Интересно:&lt;/p&gt;
&lt;p&gt;Вот что написано в википедии (офф. версия):&lt;/p&gt;
&lt;p style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; "&gt;&lt;i&gt;Фактически Армстронг перешёл на ручной режим управления спуском гораздо раньше, поскольку бортовой компьютер работал с перегрузкой, и всё время горел аварийный сигнал, нервировавший экипаж, несмотря на заверения наземного оператора, что на сигнал можно не обращать внимания (позже оператор, принявший решение несмотря на аварийные сигналы, не отказываться от посадки на Луну, получил специальную награду NASA).&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Хотя по слухам (найду источник - уточню) это был просто баг в программе.&lt;/p&gt;

А вот забавный кусочек кода оттуда же:
&lt;p&gt;&lt;code style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; overflow: auto; display: block; white-space: nowrap;"&gt;VRTSTART  TS  WCHVERT&lt;br /&gt;
# Page 801&lt;br /&gt;
    CAF  TWO    # WCHPHASE = 2 ---&amp;gt; VERTICAL: P65,P66,P67&lt;br /&gt;
    TS  WCHPHOLD&lt;br /&gt;
    TS  WCHPHASE&lt;br /&gt;
    TC  BANKCALL    # TEMPORARY, I HOPE HOPE HOPE&lt;br /&gt;
    CADR  STOPRATE  # TEMPORARY, I HOPE HOPE HOPE&lt;br /&gt;
    TC  DOWNFLAG    # PERMIT X-AXIS OVERRIDE&lt;br /&gt;
    ADRES  XOVINFLG&lt;br /&gt;
    TC  DOWNFLAG&lt;br /&gt;
    ADRES  REDFLAG&lt;br /&gt;
    TCF  VERTGUID
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;В проект вложено столько веры и надежды, на этом и долетели :)&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:13410</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/13410.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=13410"/>
    <title>www.govnocode.com</title>
    <published>2009-07-09T14:44:49Z</published>
    <updated>2009-07-10T06:17:26Z</updated>
    <category term="web"/>
    <category term="security"/>
    <lj:music>Bon Jovi - Diamond Ring</lj:music>
    <content type="html">&lt;img src="http://www.picamatic.com/show/2009/07/09/07/10/4373150_238x73.png" width="238" height="73" border="0" style="float: right" vspace="10px" hspace="10px" alt="Govnkocode" /&gt;Сегодня утром от работы меня отвлек смех из соседней комнаты: смеялись долго и громко. Заинтриговавшись причиной оваций решил сходить посмотреть в чем же дело. Как оказалось, девчонки смеялись над смешным и новым для них словом — govnocode. Я же посмеялся над "красивым" дефейсом и задумкой.&lt;br /&gt;&lt;br /&gt;Ранее я &lt;a href="http://8vmr.livejournal.com/12581.html" title="Wicked, Wicked Web"&gt;писал&lt;/a&gt; о найденных мною многочисленных уязвимостях на софтварных архивах. Этот сайт как раз оказался них.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Итак, любуйтесь(обратите внимание на адресную строку в браузере и на содержание страниц):&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.picamatic.com/show/2009/07/09/06/38/4372689_747x372.png" width="747" height="372" alt="Govnocode" /&gt; &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.picamatic.com/show/2009/07/09/06/38/4372691_747x372.png" width="747" height="372" alt="Govnocode" /&gt; &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.picamatic.com/show/2009/07/09/06/38/4372694_747x372.png" width="747" height="372" alt="Govnocode" /&gt; &lt;br /&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:12989</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/12989.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=12989"/>
    <title>Где мой CSS ???</title>
    <published>2009-04-02T20:24:50Z</published>
    <updated>2009-04-02T20:24:50Z</updated>
    <category term="web"/>
    <category term="wtf"/>
    <category term="жы-журнал"/>
    <lj:music>WT - What You Have Done</lj:music>
    <content type="html">&lt;img src="http://l-stat.livejournal.com/img/frank-eating-papers.gif" width="200" height="160" border="0" style="float: right" vspace="10px" hspace="10px" alt="Lost" /&gt;
&lt;p&gt;Ну какой толк от ЖЖ-шного &lt;a href="http://www.livejournal.com/customize/options.bml?group=customcss" rel="nofollow"&gt;Custom CSS&lt;/a&gt;, если сия фича работает только для заглавной страницы?&lt;/p&gt;

&lt;p&gt;Баг так баг. Только с заподлянкой. Дело в том, что фича исправно работает еще и при предпросмотре: отредактировал новый пост, глянул — все отлично. Отправил на печать, глянул в журнале — все как надо. А вот горькую правду узнаешь только спустя некоторое время, когда зайдешь на страницу статьи и в комментарии...&lt;/p&gt;

&lt;p&gt;... вот и пришлось переписать всю подсветку синтаксиса в предыдущем посте...&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:12581</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/12581.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=12581"/>
    <title>Wicked, Wicked Web</title>
    <published>2009-04-02T19:45:37Z</published>
    <updated>2009-07-14T06:03:14Z</updated>
    <category term="web"/>
    <category term="security"/>
    <content type="html">&lt;img src="http://www.picamatic.com/show/2009/03/31/12/11/3100206_200x200.gif" width="200" height="200" border="0" style="float: right" vspace="10px" hspace="10px" alt="Wicked, Wicked Web" /&gt;

&lt;p&gt;Вот уже скоро будет год, как я начал заниматься вебдевелопингом. Скажу сразу, что веб не является моей основной профессией — я по прежнему делфи-программист. А веб — это как часть моей широкопрофильности :)&lt;br /&gt;
За год довольно много чему научился, приобрел опыт. Чем и хочу поделиться.&lt;/p&gt;

&lt;h3&gt;Спам.&lt;/h3&gt;
&lt;p&gt;Многие решают стандартным способом — обязывают пользователя вводить капчу. Способ надежный и проверенный, но, тем не менее, не лишенный недостатков: во-первых, лишний напряг честному пользователю, а во-вторых, это надо еще специальные скрипты ставить (ну я до сих пор не знаю, как это реализовано, потому для меня это пока сложно :).&lt;/p&gt;

&lt;p&gt;Тем не менее, со спамом можно бороться и без капчи. Способ очень простой и довольно известный: на форме есть скрытое поле, назовем его &lt;i&gt;ver-code&lt;/i&gt;, заполненное заранее известным значением. Значение меняется раз в день/неделю/месяц. При постинге скрипт проверяет это значение и если оно не совпадает, посылает спам-бота куда подальше. Суть метода заключается в том, что спаммеры не успевают обновлять свои базы и постят, используя старый &lt;i&gt;ver-code&lt;/i&gt; либо вовсе без него. Конечно, это не спасает от более умных ботов, которые каждый раз загружают страницу, но поверьте, спам сократится в разы — проверенно на собственном опыте. Также есть очень малая вероятность, что за бота примут добропорядочного пользователя: в этом случае матюганы в сторону бота меняем на вежливую просьбу перезагрузить(Refresh) страницу и повторить попытку — боту то все-равно, а вот пользователь поймет вас правильно :)&lt;/p&gt;

&lt;p&gt;Также есть вполне рабочий способ, не использующий капчу, и в то же время использующий ее.  Все банально: вместо капчи вешаем статическую картинку. Все. Чтоб боты прошли такую тривиальную защиту нужно, чтоб кто-то постарался. А именно увидел, что капча не меняется, оторвал свою пятую точку,  и подкрутил настройки спаммерского ПО.  Но кто это будет делать для сайта vasia.pupkin.org?  Сей метод уже более полугода работает для &lt;a href="http://submit-everywhere.com"&gt;сайта&lt;/a&gt;, и никого спама я не видел (точнее видел в логах, подробнее &lt;a href="http://8vmr.livejournal.com/9915.html" title="Забавный спам"&gt;тут&lt;/a&gt;). Хех, интересно то, что несколько клиентов сообщали о "заклинившей" капче :)&lt;/p&gt;

&lt;h3&gt;Безопасность&lt;/h3&gt;
&lt;p&gt;Первое правило: никогда не доверяй клиентской стороне. Это учат в школе. Этим прожужжали все уши. И тем не менее многие вебдевелоперы допускают ошибки.&lt;p&gt;

&lt;p&gt;Думаете что если вы владелец http://vasia.pupkin.org то его никто не будет ломать? А вот и ошибаетесь. Не хакер, так бэд-бот: будьте готовы, что ваш сайт начнут пробовать на прочность несколько десятков раз в день. Бэд-боты как любые другие &lt;a href="http://en.wikipedia.org/wiki/Web_crawler"&gt;краулеры&lt;/a&gt; гуляют по сети и пробуют сайты на уязвимости: будь то известные дыры в различных &lt;a href="http://ru.wikipedia.org/wiki/Система_управления_содержимым" title="Система управления содержимым"&gt;CMS&lt;/a&gt; или стандартный набор &lt;a href="http://ru.wikipedia.org/wiki/Внедрение_SQL-кода" title="Внедрение SQL-кода"&gt;SQL-injection&lt;/a&gt; — вся информация о найденных брешах отправляется создателю бота, а он уже придумает, что с вами делать.&lt;/p&gt;

&lt;p&gt;Думаете, что если у вас все входящие данные экранируются, то SQL-injection не страшен? А про то, что в SQL'е все это нужно обернуть в апострофы не забыли? Я на вот этом и попался. Модифицированный пример из википедии:&lt;/p&gt;
&lt;code style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; overflow: auto; display: block; white-space: nowrap;"&gt;
&lt;span style="color: blue;"&gt;$id&lt;/span&gt; = mysql_real_escape_string(&lt;span style="color: blue;"&gt;$_REQUEST&lt;/span&gt;[&lt;span style="color: red;"&gt;'id'&lt;/span&gt;]);&lt;br /&gt;

&lt;span style="color: blue;"&gt;$res&lt;/span&gt; = mysql_query(&lt;span style="color: red;"&gt;"SELECT * FROM news WHERE id_news = $id"&lt;/span&gt;);
&lt;/code&gt;
&lt;p&gt;Вроде экранирование есть, но дыра так и осталась не прикрытой: если в &lt;i&gt;id&lt;/i&gt; передать &lt;i&gt;"-1 OR 1=1"&lt;/i&gt; то вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости.&lt;/p&gt;

&lt;p&gt;Хорошо, что &lt;a href="http://padsites.asp-shareware.com" title="Он-лайн база по всем даунлоад-архивам"&gt;сайт&lt;/a&gt; сделан вручную, без никаких &lt;i&gt;CMS&lt;/i&gt; — ошибка не стала уязвимостью, и никак себя не проявляла. Вообще хорошее правило вместо универсального &lt;i&gt;"SELECT * FROM Table"&lt;/i&gt; выбирать только то, что требуется в данный момент: &lt;i&gt;"SELECT field1, field2 FROM Table"&lt;/i&gt;. &lt;/p&gt;

&lt;p&gt;А еще хорошим правилом является просмотр логов, благодаря коим и была выявлена эта ошибка. Вообще логирование — очень важная штука. Думаю, это все знают и понимают: будь то ругательства MySQL-ля, ерроры в скриптах, или что-то еще — все нужно логировать. Но также будет очень полезным записывать и все "подозрительные" запросы, смахивающие на попытки взлома системы: кроме того, что можно всегда быть в курсе ее состояния (или хотя бы знать, что же с ней произошло :), так еще и параноидальный админ (прям как я:) сможет вовремя увидеть и быстренько подлатать брешь или сомнительный участок. А такие участки были мною исправлены....  "Подозрительность" определяется просто: например, если там где должно быть целочисленное поле идет что-то левое. В таком случае ругаемся пользователю и тихонечко пишем в лог. Такая штука полезна и для определения "а была ли попытка взлома?" — всегда можно посмотреть access-логи и восстановить полную картину: вполне возможно, что не все записалось и часть действий хакера осталась незамечена (и никак не обработана/заблокирована!).&lt;/p&gt;

&lt;p&gt;Ни в коем случае нельзя показывать пользователю интимные подробности произошедшей ошибки — это то и хакерам нужно. Казалось бы все и так знают, и у всех так сделано. Не у всех. В нете полно сайтов дающих интим, если умело попросить :). Приведу пример не так давно обнаруженных мною уязвимостей на ряде сайтов. Скажите, вы всегда проверяете валидность загружаемых файлов? А когда работаете с загруженным контентом придерживаетесь правил защиты от SQL-injection? А вот почти каждый десятый &lt;a href="http://padsites.asp-shareware.com" title="Download Sites List"&gt;даунлоад-архив&lt;/a&gt; (всего таких больше сотни) валится при попытке засабмитить &lt;a href="http://www.asp-shareware.org/pad/"&gt;PAD-файл&lt;/a&gt; (XML-файл с описанием продукта) в нужном поле которого оказалась одинарная кавычка. Причем большинство из них как раз выдают пользователю те самые интимные подробности формата таблицы БД, куда все это дело не удалось добавить.&lt;/p&gt;

&lt;h3&gt;PHP-Apache&lt;/h3&gt;
&lt;p&gt;Эта связка глючная. Причем безнадежно.  В одной версии фиксят баг — он появляется в следующей, причем приводит с собой еще семеро.&lt;/p&gt;

&lt;p&gt;Нельзя быть уверенным, что скрипты прекрасно работающие в одной верcии, успешно заведутся на следующей. Взять, например &lt;i&gt;server-side includes&lt;/i&gt;. Я нашел три баг-репорта для разных версий (!!!) и везде они были пофиксены и везде предлагали скачать свежий CVS-снапшот.  Хотя у меня была версия, для которой "якобы" этот баг был исправлен, но, увы, можно было отправлять и четвертый баг-репорт...  Та же история и с оверрайдом 404-го статус-кода на обработчике &lt;i&gt;ErrorDocument&lt;/i&gt;: в одной версии работает, в более поздней — нет, причем баг-фикс идет где-то посередине. Хорошо, когда такой баг проявляется только на одном сайте/скрипте к которому имеешь доступ. Гораздо хуже, когда пользователь не может установить и заставить работать твой "бажный" скрипт (как было с &lt;a href="http://dynamicpad.org"&gt;DynamicPAD&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Ни в коем случае нельзя слепо копипастить куски php-кода из тематических форумов и туторных сайтов — себе же дороже будет. Здесь несколько другая ситуация чем с другими ЯП: php — это серверный скрипт, требующий особого подхода к безопасности. А вот обычно те, кто добродушно делятся своим кодом, о безопасности, похоже, и не слышали. Потому и оказывают медвежью услугу.&lt;/p&gt;

&lt;p&gt;Ошибки и ворнинги php-интерпретатора в браузере видели все — такое есть на каждом &lt;i&gt;n&lt;/i&gt;-ом сайте. И каждый мог судить о некомпетентности программистов написавших тот сайт или скрипт. А вы тоже хотите афишировать свою безграмотность? Чтоб вас также само судили? Нет? Тогда нечего выводить интимные подробности тому, кому они не предназначены:&lt;/p&gt;

&lt;p&gt;&lt;code style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; overflow: auto; display: block; white-space: nowrap;"&gt;
error_reporting(&lt;span style="color: red;"&gt;'E_NONE'&lt;/span&gt;);
&lt;/code&gt;&lt;/p&gt;

В то же время показываем их только тому, кому нужно (ни в коем случае не глушите все ошибки "ухом" - @. Это плохо кончится):
&lt;ol&gt;

&lt;li&gt;в php.ini: 
&lt;p&gt;&lt;code style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; overflow: auto; display: block; white-space: nowrap;"&gt;
log_errors &lt;span style="color: red;"&gt;=&lt;/span&gt; on&lt;br /&gt;
error_log &lt;span style="color: red;"&gt;=&lt;/span&gt; /var/logs/php/errlog.txt
&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;в .htaccess
&lt;p&gt;&lt;code style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; overflow: auto; display: block; white-space: nowrap;"&gt;
 php_flag log_errors on&lt;br /&gt;
 php_value error_log /var/logs/php/errlog.txt
&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;в коде php-скрипта
&lt;p&gt;&lt;code style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; overflow: auto; display: block; white-space: nowrap;"&gt;
 log_errors(&lt;span style="color: red;"&gt;"on"&lt;/span&gt;);&lt;br /&gt;
 error_log(&lt;span style="color: red;"&gt;"/var/logs/php/errlog.txt"&lt;/span&gt;);
&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ну и пару слов про почту.&lt;/p&gt;
&lt;p&gt;Никогда не следует надеяться на функцию &lt;i&gt;mail&lt;/i&gt; — письмо может так и не дойти до адресата, и вы никогда об этом не узнаете. И не надо говорить, что ваш &lt;i&gt;sendmail&lt;/i&gt; работает безупречно — дело может быть вовсе не в нем: мало ли чего может приключиться с письмом по пути к точке назначения. Так что логируйте все тексты писем, которые вы отправляете — если даже посылка и не дойдет куда нужно, то она, по крайней мере, не пропадет безвозвратно. И, быть может, вы не потеряете клиента.&lt;/p&gt;
&lt;p&gt;SQL-запросы экранируете? Будьте добры экранировать передаваемые в &lt;i&gt;mail&lt;/i&gt; хидера (обычно это &lt;i&gt;From&lt;/i&gt;, &lt;i&gt;Reply-To&lt;/i&gt;, &lt;i&gt;Subject&lt;/i&gt;). Иначе не удивляйтесь, что ваш мейл-сервер занесли в черный список как злобного спаммера. Достаточно просто "резать" все переносы строк в этих полях (они обязаны быть однострочными).&lt;/p&gt;

&lt;p&gt;На последок. Как говорил вождь, учится, учится, и никогда не расслабляться. Помните: выживут только параноики :)&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:12318</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/12318.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=12318"/>
    <title>...</title>
    <published>2009-03-21T11:58:21Z</published>
    <updated>2009-03-21T11:58:21Z</updated>
    <category term="one-liner"/>
    <content type="html">юзая больше копипастче пишем код мы фастче...</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:11953</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/11953.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=11953"/>
    <title>Browser Security Handbook</title>
    <published>2009-02-21T12:37:49Z</published>
    <updated>2009-03-18T20:52:50Z</updated>
    <category term="web"/>
    <category term="security"/>
    <content type="html">&lt;img src="http://www.picamatic.com/show/2009/02/21/02/25/2362812_200x181.png" width="200" height="181" border="0" style="float: right" vspace="10px" hspace="10px" alt="Browser Malware" /&gt;Перешедший чуть более года назад в Google &lt;a href="http://en.wikipedia.org/wiki/Michal_Zalewski"&gt;Михал Залевски (Michal Zalewski)&lt;/a&gt;, ранее известный по ряду уязвимостей, обнаруженных им в различных браузерах, опубликовал &lt;a href="http://code.google.com/p/browsersec/wiki/Main"&gt;Browser Security Handbook&lt;/a&gt; — обзор подходов к обеспечению безопасности в браузерах вместе со сводными таблицами, описывающими эффективность их реализации (равно как и наличие таковой) в девяти версиях современных браузеров — от IE6 до Chrome. 
&lt;br /&gt;
&lt;p&gt;Проект предназначен для сбора и классификации различных проблем, связаных с безопасностью, в различных браузерах.
Рассматриваются такие неявные, неизвестные или плохо документированые вещи, как:&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-bottom: 0px;"&gt; 
&lt;li&gt;обработка и интерпретация URL'ов (включая Юникод, схему file://)&lt;/li&gt;
&lt;li&gt;работа с протоколом HTTP, способы обработки поступающего контента (включая интерпретацию content-disposition, трюки с content-type и пр.)&lt;/li&gt;
&lt;li&gt;использование браузерного кеша&lt;/li&gt;
&lt;li&gt;работа с куками&lt;/li&gt;
&lt;li&gt;обработка HTML'я, DOM&lt;/li&gt;
&lt;li&gt;стандартные политики безопасности применительно к DOM'у, Java, Falsh, Silverlight и т.д. и т.п.&lt;/li&gt;
&lt;li&gt;экспериментальные и устаревшие, но еще используемые, механизмы безопасности&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;и многое много другое.&lt;/p&gt;

&lt;a href="http://code.google.com/p/browsersec/wiki/Main"&gt;&lt;p style="color: blue"&gt;&amp;gt;&amp;gt;&amp;gt; Рекомендуется к обязательному прочтению и распространению &amp;lt;&amp;lt;&amp;lt;&lt;/p&gt;&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:11552</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/11552.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=11552"/>
    <title>The Zen of Python</title>
    <published>2009-02-09T21:39:06Z</published>
    <updated>2009-02-12T21:03:57Z</updated>
    <category term="python"/>
    <category term="программинг"/>
    <lj:music>Lyriel - The Autumn Days</lj:music>
    <content type="html">&lt;img src="http://www.picamatic.com/show/2009/02/13/12/04/2134842_200x200.gif" width="200" height="200" border="0" style="float: right" vspace="10px" hspace="10px" alt="The Zen of Python" /&gt;     Beautiful is better than ugly.&lt;br /&gt;    Explicit is better than implicit.&lt;br /&gt;    Simple is better than complex.&lt;br /&gt;    Complex is better than complicated.&lt;br /&gt;    Flat is better than nested.&lt;br /&gt;    Sparse is better than dense.&lt;br /&gt;    Readability counts.&lt;br /&gt;    Special cases aren't special enough to break the rules.&lt;br /&gt;    Although practicality beats purity.&lt;br /&gt;    Errors should never pass silently.&lt;br /&gt;    Unless explicitly silenced.&lt;br /&gt;    In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;    There should be one &lt;b&gt;and preferably only one&lt;/b&gt; obvious way to do it.&lt;br /&gt;    Although that way may not be obvious at first unless you're Dutch.&lt;br /&gt;    Now is better than never.&lt;br /&gt;    Although never is often better than &lt;b&gt;right&lt;/b&gt; now.&lt;br /&gt;    If the implementation is hard to explain, it's a bad idea.&lt;br /&gt;    If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;    Namespaces are one honking great idea — let's do more of those!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:11377</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/11377.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=11377"/>
    <title>Qt becomes LGPL licensed</title>
    <published>2009-01-14T21:34:57Z</published>
    <updated>2009-03-18T20:25:20Z</updated>
    <category term="программинг"/>
    <category term="delphi"/>
    <content type="html">&lt;img src="http://www.picamatic.com/show/2009/02/13/12/08/2134924_200x200.gif" width="200" height="200" border="0" style="float: right" vspace="10px" hspace="10px" alt="Qt becomes LGPL licensed" /&gt;Компания Nokia &lt;a href="http://www.qtsoftware.com/about/news/lgpl-license-option-added-to-qt"&gt;объявила&lt;/a&gt;, что начиная с версии 4.5 (ориентировнчно март 2009) платформа Qt будет доступна также под лицензией LGPL 2.1. &lt;br /&gt;Это означает что разработчики могут использовать более либеральную, по сравнению с GPL, схему лицензирования. Другими словами, это даcт возможность &lt;u&gt;бесплатно&lt;/u&gt; использовать библиотеку Qt для коммерческого ПО.&lt;br /&gt;&lt;br /&gt;За столь щедрым жестом компании стоит тот факт, что в отличии от Trolltech, Nokia не ставит целью заработать на Qt. Ее стратегия продолжает линию «10х», анонсированную в прошлом году, суть которой сводится к десятикратному увеличению количества разработчиков и пользователей библиотеки. Такая популяризация позволит компании расширить клиентскую базу именно за счет большего числа коммерческих разработчиков и является заключительным этапом кампании «Qt повсюду» ("Qt Everywhere").&lt;br /&gt;____&lt;br /&gt;&lt;br /&gt;Бесплатно — это хорошо, но что дальше? Дальше есть надежада, что Embarcadero все же сможет включить поддержку Linux в следующей версии Delphi (Comodore, середина 2010-го года). Ну или в следующей.&lt;br /&gt;&lt;br /&gt;На самом деле, это может означать, мы, наконец, сможем получить основательно преработанную и "подчищенную" &lt;a href="http://en.wikipedia.org/wiki/Component_Library_for_Cross_Platform"&gt;CLX&lt;/a&gt; позволяющую писать кроссплатформенные программы, в нативном для платформы коде. Это означает, что заброшенный &lt;a href="http://ru.wikipedia.org/wiki/Kylix"&gt;Kylix&lt;/a&gt; может возродится.&lt;br /&gt;&lt;br /&gt;Но пойдем дальше. Если архитектура компонентов Delphi будет пересмотрена в пользу  возможности создания настоящих Qt виджетов, то выиграют все. Embarcadero сможет расширить свою базу клиентов за счет компоненто-писателей для Qt. А те тоже будут плодится как грибы в благоприятных условиях — это как освоение целины: Qt не имеет большого выбора из сторонних компонентов, и такие компании как DevExpress или ТМС, смогут сделать неплохой апгрейд к ее базе виджетов. Ну и по понятным причинам выиграет сама Qt.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:11164</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/11164.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=11164"/>
    <title>first meet...</title>
    <published>2008-12-07T20:33:05Z</published>
    <updated>2009-03-18T20:44:37Z</updated>
    <category term="игры"/>
    <content type="html">...&lt;br /&gt;&lt;b&gt;Lt. Sarah Kerrigan:&lt;/b&gt; &lt;i&gt;Captain Raynor, I've finished scouting out the area, and... you pig!&lt;/i&gt; &lt;br /&gt;&lt;b&gt;Jim Raynor:&lt;/b&gt; &lt;i&gt;What! I haven't even said anything to you yet.&lt;/i&gt; &lt;br /&gt;&lt;b&gt;Lt. Sarah Kerrigan:&lt;/b&gt; &lt;i&gt;Yeah, but you were thinking it. &lt;/i&gt;&lt;br /&gt;&lt;b&gt;Jim Raynor:&lt;/b&gt; &lt;i&gt;Oh, yeah! you're a telepath.&lt;/i&gt;&lt;br /&gt;...</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:10872</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/10872.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=10872"/>
    <title>Дзен</title>
    <published>2008-12-02T11:47:11Z</published>
    <updated>2009-02-12T20:44:35Z</updated>
    <category term="wtf"/>
    <content type="html">Читать нужно быстро:&lt;br /&gt;&lt;br /&gt;&lt;i style="display: block; padding-left: 2em"&gt;Мандатное управление доступом(англ. Mandatory access control, MAC) — разграничение доступа субъектов к объектам, основанное на назначении метки конфиденциальности для информации, содержащейся в объектах, и выдаче официальных разрешений (допуска) субъектам на обращение к информации такого уровня конфиденциальности.&lt;br /&gt;&lt;a href="http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%BD%D0%B4%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BE%D0%BC"&gt;© Wikipedia&lt;/a&gt;&lt;/i&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:10160</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/10160.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=10160"/>
    <title>Здравствуй, мир!</title>
    <published>2008-11-25T17:24:33Z</published>
    <updated>2009-02-12T21:07:56Z</updated>
    <category term="всякое"/>
    <category term="программинг"/>
    <content type="html">&lt;a href="http://www.roesler-ac.de/wolfram/hello.htm"&gt;Hello world на трехстах языках программирования&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:9915</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/9915.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=9915"/>
    <title>Забавный спам</title>
    <published>2008-11-24T18:54:28Z</published>
    <updated>2009-03-18T20:01:26Z</updated>
    <category term="web"/>
    <content type="html">&lt;img src="http://www.picamatic.com/show/2009/02/12/11/50/2134615_200x166.jpg" border="0" alt="spam.jpg" title="spam.jpg" width="200" height="166" vspace="10px" hspace="10px" style="float: right" /&gt;

&lt;p&gt;Полезно вести логи. Полезно вести логи всего и вся что происходит с сервером. Также полезно их просматривать... Хотябы изредка :).&lt;/p&gt;
&lt;p&gt;... Никогда не думал что банальный спам, отфильтрованный фильтрами, может быть таким забавным! Среди сотен предложений  революционных средств по увеличению мужского достоинства попадаются и настоящие перлы:&lt;/p&gt;

&lt;p&gt;От уныло-похвальных...
&lt;div style="margin: 0 2em 0 2em; font-style:italic"&gt;
  Very nice design ;) Good work,webmaster!&lt;br /&gt;
  It's a very good site !! Very nice work, admin :) Good luck !&lt;br /&gt;
  Thanks for all you do in helping me fulfill my dreams.&lt;br /&gt;
  Yo have nice site, admin! keep up good work man!&lt;br /&gt;
  Wow!! It's getting better and better. Keep it up man.&lt;br /&gt;
  I think your site is very good and complete, but the information you have here&lt;br /&gt;
  Wow!! It's getting better and better.&lt;br /&gt;
  I love this site so so so much :) Cool site!!&lt;br /&gt;
  I love you so much! Great place to visit!&lt;br /&gt;
&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Весьма забавных...
&lt;div style="margin: 0 2em 0 2em; font-style:italic"&gt;
  Grant you just made yourself something to do with it&lt;br /&gt;
  Yep you are jack our maniac in my chat box and your mental here&lt;br /&gt;
  I love the great insight!&lt;br /&gt;
  we better get on the tinatic because sinking is rising on saturday morning!&lt;br /&gt;
  Not much on my mind worth mentioning. What can I say? I haven't been up to much lately. It's not important. Oh well.&lt;br /&gt;
  I've just been sitting around waiting for something to happen.&lt;br /&gt;
  Greetings! and test of guestbook, coming up here to show love to the site.&lt;br /&gt;
  Not bad... Not bad.&lt;br /&gt;
  Not bad... Not bad.&lt;br /&gt;
&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;До просто настоящих приколов:
&lt;div style="margin: 0 2em 0 2em; font-style:italic"&gt;
DAESH ONOTOLE V PRAVITELI VSELENNOI!&lt;br /&gt;
DAESH ONOTOLE V PRAVITELI VSELENNOI!&lt;br /&gt;
Im nuts with big nuts, i love saying that XD&lt;br /&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;br /&gt;

Интересно еще то, что во многих случаях спам не рекламирует чего либо: там просто нету ссылки! Хотя, судя по введенному полю капчи и повторам, форму заполнял робот.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:9482</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/9482.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=9482"/>
    <title>Помним....</title>
    <published>2008-11-23T21:46:10Z</published>
    <updated>2008-11-25T07:21:10Z</updated>
    <category term="c&amp;apos;est la vie"/>
    <lj:music>L'Âme Immortelle - Will You</lj:music>
    <content type="html">&lt;a href="http://www.picamatic.com/view/1424960_candle/"&gt;&lt;img src="http://www.picamatic.com/show/2008/11/24/09/14/1424960_bigthumb.jpg" border="0" alt="candle.jpg" title="candle.jpg" width="210" height="240" vspace="10" hspace="10" style="float: right" /&gt;&lt;/a&gt;&lt;br /&gt;День памяти голодомора... 75 годовщина...&lt;br /&gt;...&lt;br /&gt;&lt;i&gt;«Голод 1932–1933 годов в Советском Союзе не был направлен на уничтожение какой-либо отдельной нации. Он стал следствием засухи и проводившихся в отношении всей страны, а не одной только Украины, насильственной коллективизации и раскулачивания»&lt;/i&gt; — это слова Медведева, и официальная позиция России. Ладно, фиг с ним, Медведевым: на то он и политик чтоб быть поуши в грязи (все политики такие). Но обычные граждане... почитать на форумах, то, что думают "рядовые" россияне...&lt;br /&gt;&lt;br /&gt;Ну как можно отрицать то, что было? Как можно отрицать очевидцев? Какое право "они" имеют решать за "нас"? "Они" там были? "Они" видели? У "них" есть среди родственников бабушки и дедушки, которые с ужасом вспоминают "&lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=2&amp;amp;url=http%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%9E%D0%B1_%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5_%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%B3%D0%BE%D1%81%D1%83%D0%B4%D0%B0%D1%80%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%B4%D0%BF%D1%80%D0%B8%D1%8F%D1%82%D0%B8%D0%B9%2C_%D0%BA%D0%BE%D0%BB%D1%85%D0%BE%D0%B7%D0%BE%D0%B2_%D0%B8_%D0%BA%D0%BE%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BE%D0%B2_%D0%B8_%D1%83%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8_%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;amp;ei=e4gpSc7KFJbe0gXtqfCyAQ&amp;amp;usg=AFQjCNHfK-Cqd9LaVXQBp5ntxgOgK0jyPA&amp;amp;sig2=6rodCI-TqL3K6dtQR_uEhw"&gt;закон о пяти колосках&lt;/a&gt;"? "Они" знают, что "не выполнившие план колхозы распускались или в &lt;i&gt;них менялось правление&lt;/i&gt;, имущество единоличников-контрактантов описывалось и продавалось, твердосдатчики &lt;i&gt;высылались на выселки&lt;/i&gt;, в ряде колхозов по местной инициативе &lt;i&gt;изымался посевной материал&lt;/i&gt;, на уровне районов проводилась замена руководства и &lt;i&gt;ограничение в поставке промышленных товаров&lt;/i&gt;". И это в самой "голодающей" стране. "Они" знают, как у крестьян отбиралось последнее?&lt;br /&gt;&lt;br /&gt;С каких это пор после далеко не самой сильной засухи (бывало и похуже, да) умирали с голоду МИЛЛИОНЫ? Почему если умирающий с голоду крестьянин подбирал "пять колосков" на (!!!) уже собранном поле его судили на расстрел, без возможности амнистии? Где такое видано?&lt;br /&gt;&lt;br /&gt;Россияне, у вас совесть есть? Какое вы имеете право решать за "нас"?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:9452</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/9452.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=9452"/>
    <title>Cинтаксис oO</title>
    <published>2008-11-04T19:58:19Z</published>
    <updated>2009-04-02T19:52:18Z</updated>
    <category term="программинг"/>
    <category term="delphi"/>
    <lj:music>Penumbra - Seclusion</lj:music>
    <content type="html">Нифига себе! Незнал что такая штука работает в дельфе:&lt;br /&gt;&lt;br /&gt;&lt;div style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; overflow: auto; display: block; white-space: nowrap;"&gt;&lt;pre&gt;&lt;b&gt;case&lt;/b&gt; i &lt;b&gt;of&lt;/b&gt;
 0: ;
 1: ;
 &lt;b&gt;else&lt;/b&gt;  &lt;i&gt;// Несколько операторов вне блока begin..end !!!!&lt;/i&gt;
   D:=SQRT(abs(sin(random)*cos(random)));
   D:=SQRT(abs(sin(random)*cos(random)));
   D:=SQRT(abs(sin(random)*cos(random)));
&lt;b&gt;end&lt;/b&gt;;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Работает как в Delphi7 так и в Delphi 2009</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:9197</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/9197.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=9197"/>
    <title>Pathological Interfaces III: счетчики ссылок</title>
    <published>2008-11-04T18:34:29Z</published>
    <updated>2009-02-12T21:59:33Z</updated>
    <category term="com"/>
    <category term="c++"/>
    <category term="программинг"/>
    <category term="delphi"/>
    <lj:music>The 69 Eyes - Never Say Die</lj:music>
    <content type="html">&lt;img src="http://www.picamatic.com/show/2009/02/13/12/57/2136067_200x200.gif" width="200" height="200" border="0" style="float: right" vspace="10px" hspace="10px" alt="WTF?" /&gt;Не совсем патология. Но знать полезно.&lt;br /&gt;&lt;br /&gt;Вопрос: с какой целью в реализациях IUnknown.Release используют  InterlockedDecrement? Наверное, для потокобезопасности. Но реализация Release вовсе не выглядит потокобезопасной: что будет если другой поток в этот момент вызовет IUnknown.AddRef? &lt;br /&gt;&lt;br /&gt;На пальцах:&lt;br /&gt;&lt;br /&gt;1. Поток 1 проверяет валидность и копирует указатель на интерфейс&lt;br /&gt;2. Выполняется переключение контекста. Управление передается потоку 2&lt;br /&gt;3. Поток 2 вызывает Release(). Счетчик ссылок достигает нуля. Объект уничтожается. Указатель зануливается&lt;br /&gt;4. Переключение контекста. Передача управления обратно в поток 1&lt;br /&gt;5. Поток 1 для скопированного указателя (уже невалидного) вызывает AddRef(). Бабах!!!&lt;br /&gt;&lt;br /&gt;Баг или фича? Решать вам.&lt;br /&gt;(Хм, наверное для устранения сей баго/фичи и придумали межпотоковый маршаллинг интерфейсов ☺)&lt;br /&gt;&lt;br /&gt;Ссылки:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/oldnewthing/archive/2008/11/03/9030246.aspx"&gt;If there's already a bug, it's not surprising that there's a possibility for error&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/oldnewthing/archive/2005/09/28/474855.aspx#474998"&gt;Avoiding double-destruction when an object is released&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://8vmr.livejournal.com/3848.html"&gt;&lt;b&gt;Pathological Interfaces I: QueryInterface&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://8vmr.livejournal.com/6787.html"&gt;&lt;b&gt;Pathological Interfaces II: маршалинг&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://8vmr.livejournal.com/9197.html"&gt;&lt;b&gt;Pathological Interfaces III: счетчики ссылок&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:8957</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/8957.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=8957"/>
    <title>Вот такая вот штука</title>
    <published>2008-10-24T20:02:57Z</published>
    <updated>2009-04-02T19:56:18Z</updated>
    <category term="программинг"/>
    <category term="delphi"/>
    <lj:music>Gothminister - Wish</lj:music>
    <content type="html">&lt;p&gt;Сегодня очередной раз, сидя  за отладкой, обнаружил интересную особенность дельфовского компилятора. Ну не то чтоб особенность, но данная штука для меня была не очевидной.&lt;/p&gt;

&lt;p&gt;Итак, код:&lt;/p&gt;&lt;div style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; overflow: auto; display: block; white-space: nowrap;"&gt;&lt;pre&gt;&lt;b&gt;procedure&lt;/b&gt; Foo;
  &lt;b&gt;function&lt;/b&gt; Bar: string;
  &lt;b&gt;var&lt;/b&gt;
    i: integer;
  &lt;b&gt;begin&lt;/b&gt;
    &lt;b&gt;for&lt;/b&gt; i := 1 &lt;b&gt;to&lt;/b&gt; 5 &lt;b&gt;do&lt;/b&gt;
      Result := Result + IntToStr(i);
  &lt;b&gt;end;&lt;/b&gt;
&lt;b&gt;var&lt;/b&gt;
  i: integer;
&lt;b&gt;begin&lt;/b&gt;
  &lt;b&gt;for&lt;/b&gt; i := 1 &lt;b&gt;to&lt;/b&gt; 5 &lt;b&gt;do&lt;/b&gt;
    Writeln(Bar);
&lt;b&gt;end;&lt;/b&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Что не так? Забыл инициализировать Result? &lt;/p&gt;

&lt;p&gt;Хех, менеджед-типы инициализируются автоматически при входе во scope (тем более что ни D7 ни D2009 даже не пискнули о неинициализированном &lt;i&gt;Result&lt;/i&gt;), ответил бы я, да не тут то было....&lt;/p&gt;

&lt;p&gt;Вот вывод:&lt;/p&gt;&lt;div style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; overflow: auto; display: block; white-space: nowrap;"&gt;&lt;pre&gt;12345
1234512345
123451234512345
12345123451234512345
1234512345123451234512345&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Оказывается, что для локальных процедур не создается отдельный фрейм стека, а используется  фрейм родителя. Потому &lt;i&gt;Result&lt;/i&gt; и хранила состояние от предыдущего вызова. Вот так вот.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:8049</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/8049.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=8049"/>
    <title>Адварь</title>
    <published>2008-09-30T20:19:23Z</published>
    <updated>2008-11-26T10:57:00Z</updated>
    <category term="жы-журнал"/>
    <lj:music>Theatre of Tragedy - The Masquerader and Phoenix</lj:music>
    <content type="html">Только что зашел незалогиненым на свой блог и....&lt;br /&gt;реклама уже и до басик-аккаунтов добралась...&lt;br /&gt;&lt;br /&gt;Вот так вот. Ничего не бывает забесплатно.&lt;br /&gt;&lt;br /&gt;Теперь обьясните мне, в чем тогда разница между басик и адвансед? В количестве рекламы? )</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:6999</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/6999.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=6999"/>
    <title>Software designed for the person who built it</title>
    <published>2008-09-10T21:32:44Z</published>
    <updated>2008-09-10T21:33:51Z</updated>
    <category term="wtf"/>
    <category term="программинг"/>
    <lj:music>Erben der Schöpfung - By My Side</lj:music>
    <content type="html">А как вы дизайните свой GUI?&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.picamatic.com/view/983680_modern_gui/"&gt;&lt;img src="http://www.picamatic.com/show/2008/09/11/12/33/983680_bigthumb.png" border="0" alt="modern_gui.png - image uploaded to Picamatic" title="modern_gui.png" width="307" height="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.picamatic.com/view/983713_wgetgui-screenshot/"&gt;&lt;img src="http://www.picamatic.com/show/2008/09/11/12/41/983713_bigthumb.png" border="0" alt="wgetgui-screenshot.png - image uploaded to Picamatic" title="wgetgui-screenshot.png" width="320" height="222" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.picamatic.com/view/983706_filterit-confusing/"&gt;&lt;img src="http://www.picamatic.com/show/2008/09/11/12/40/983706_bigthumb.gif" border="0" alt="filterit-confusing.gif - image uploaded to Picamatic" title="filterit-confusing.gif" width="149" height="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.picamatic.com/view/983859_NovellConfig/"&gt;&lt;img src="http://www.picamatic.com/show/2008/09/11/01/15/983859_bigthumb.gif" border="0" alt="NovellConfig.gif - image uploaded to Picamatic" title="NovellConfig.gif" width="174" height="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.picamatic.com/view/983865_form_for_developers/"&gt;&lt;img src="http://www.picamatic.com/show/2008/09/11/01/16/983865_bigthumb.gif" border="0" alt="form_for_developers.gif - image uploaded to Picamatic" title="form_for_developers.gif" width="320" height="177" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.picamatic.com/view/983866_mediacoder/"&gt;&lt;img src="http://www.picamatic.com/show/2008/09/11/01/16/983866_bigthumb.png" border="0" alt="mediacoder.png - upload images with Picamatic" title="mediacoder.png" width="277" height="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.picamatic.com/view/983869_win_wgetgui/"&gt;&lt;img src="http://www.picamatic.com/show/2008/09/11/01/17/983869_bigthumb.jpg" border="0" alt="win_wgetgui.jpg - Picamatic - upload your images" title="win_wgetgui.jpg" width="258" height="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.picamatic.com/view/983876_gentoo/"&gt;&lt;img src="http://www.picamatic.com/show/2008/09/11/01/18/983876_bigthumb.png" border="0" alt="gentoo.png - image uploaded to Picamatic" title="gentoo.png" width="196" height="240" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.picamatic.com/view/983874_vtooltip/"&gt;&lt;img src="http://www.picamatic.com/show/2008/09/11/01/17/983874_bigthumb.jpg" border="0" alt="vtooltip.jpg - Picamatic - upload your images" title="vtooltip.jpg" width="167" height="185" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.picamatic.com/view/983872_sat/"&gt;&lt;img src="http://www.picamatic.com/show/2008/09/11/01/17/983872_bigthumb.jpg" border="0" alt="sat.jpg - image uploaded to Picamatic" title="sat.jpg" width="108" height="102" /&gt;&lt;/a&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:6787</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/6787.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=6787"/>
    <title>Pathological Interfaces II: маршалинг</title>
    <published>2008-09-09T18:48:54Z</published>
    <updated>2009-10-02T19:10:14Z</updated>
    <category term="com"/>
    <category term="программинг"/>
    <category term="delphi"/>
    <lj:music>Stream of Passion - Calliopea</lj:music>
    <content type="html">&lt;img src="http://www.picamatic.com/show/2009/02/13/12/57/2136067_200x200.gif" width="200" height="200" border="0" style="float: right" vspace="10px" hspace="10px" alt="WTF?" /&gt;Для &lt;a href="http://ru.wikipedia.org/wiki/Маршалинг"&gt;маршаллинга&lt;/a&gt; COM-интерфейсов между потоками есть такой функционал системы COM, как CoMarshalInterThreadInterfaceInStream / CoGetInterfaceAndReleaseStream.&lt;br /&gt;&lt;br /&gt;Функции выполняют именно то, что указанно в названии. А именно работу по облегчению "обмена" информацией об интерфейсе между потоками: в одном потоке сохранили данные о интерфейсе в IStream, а в другом восстановили их из этого же IStream’а.&lt;br /&gt;Вроде ничего проще быть не может, все ясно, все понятно и очень удобно. Но разработчики подсунули свои грабли…&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;Дело в том, что, несмотря на то, что на выходе CoMarshalInterThreadInterfaceInStream  получаем IStream, использовать этот стрим кроме как для функции, которой он предназначен нельзя. Совсем нельзя. Даже менять счетчик ссылок.&lt;br /&gt;&lt;br /&gt;Оказывается, что CoGetInterfaceAndReleaseStream делает именно то, что написано в названии, а именно уничтожает стрим-объект, полностью игнорируя счетчик ссылок.&lt;br /&gt;&lt;br /&gt;И не сразу понятно, что этот стрим предназначен исключительно для использования в качестве параметра CoGetInterfaceAndReleaseStream — новички могут наступить на расставленные грабли. Тем более что в мануалах о таком поведении не написано (ну может где и есть, но точно не там где должно быть).&lt;br /&gt;&lt;br /&gt;Да что там новички! Ошибки делают и профессионалы из солидных контор. Например, во всех известных мне версиях Delphi функции объявлены как&lt;br /&gt;&lt;div style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; overflow: auto; display: block; white-space: nowrap;"&gt;&lt;pre&gt;&lt;b&gt;function&lt;/b&gt; CoMarshalInterThreadInterfaceInStream(&lt;b&gt;const&lt;/b&gt; iid: TIID; 
  unk: IUnknown; &lt;b&gt;out&lt;/b&gt; stm: IStream): HResult; &lt;b&gt;stdcall&lt;/b&gt;;

&lt;b&gt;function&lt;/b&gt; CoGetInterfaceAndReleaseStream(stm: IStream; &lt;b&gt;const&lt;/b&gt; 
  iid: TIID; &lt;b&gt;out&lt;/b&gt; pv): HResult; &lt;b&gt;stdcall&lt;/b&gt;;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Дело в том, что delphi по части интерфейсов ведет себя как managed-язык: автоматически наращивает/убавляет счетчик ссылок. Но поскольку &lt;i&gt;CoGetInterfaceAndReleaseStream&lt;/i&gt; этот счетчик игнорирует и сразу уничтожает объект, то получается ситуация, что делфи пытается вызвать Release для уже уничтоженного объекта. &lt;br /&gt;&lt;br /&gt;Обычно в таких случаях делают всяческие извращения, типа этого:&lt;br /&gt;&lt;div style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; overflow: auto; display: block; white-space: nowrap;"&gt;&lt;pre&gt;&lt;b&gt;var&lt;/b&gt;
  pStream : pointer; &lt;i&gt;// Чтоб дельфа не вела подсчет ссылок вместо IStream будет обычный указатель&lt;/i&gt;

&lt;i&gt;// В потоке 1: маршаллинг&lt;/i&gt;
CoMarshalInterThreadInterfaceInStream (IDispatch,  pObject1 &lt;b&gt;as&lt;/b&gt; IUnknown, IStream (pStream));

&lt;i&gt;// В потоке 2: демаршаллинг&lt;/i&gt;
CoGetInterfaceAndReleaseStream(IStream(pStream), IDispatch, pObject1);&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;А теперь вопрос: зачем сюда было тулить IStream? Чем обычный Cookie в виде DWORD не прокатил? &lt;br /&gt;&lt;br /&gt;Отдельное "спасибо" и Borland-у: ведь достаточно было правильно оформить интерес к этим функциям, и не пришлось бы выдумывать вышеописанные ужасы маршаллинга&lt;br /&gt;&lt;div style="padding:0.7em; border: 1px dashed #2f6fab; font-family: &amp;#39;Courier New&amp;#39;, Courier, monospace; font-weight: normal; background-color:#f9f9f9; overflow: auto; display: block; white-space: nowrap;"&gt;&lt;pre&gt;&lt;i&gt;// Интерфейс стирма заменили на куку&lt;/i&gt;
&lt;b&gt;function&lt;/b&gt; CoMarshalInterThreadInterfaceInStream(&lt;b&gt;const&lt;/b&gt; iid: TIID; 
  unk: IUnknown; &lt;b&gt;out&lt;/b&gt; cookie: DWORD): HResult; &lt;b&gt;stdcall&lt;/b&gt;;

&lt;b&gt;function&lt;/b&gt; CoGetInterfaceAndReleaseStream(cookie: DWORD; &lt;b&gt;const&lt;/b&gt; 
  iid: TIID; &lt;b&gt;out&lt;/b&gt; pv): HResult; &lt;b&gt;stdcall&lt;/b&gt;;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Документация по функциям-виновникам сего поста:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms693316(VS.85).aspx"&gt;1. CoMarshalInterThreadInterfaceInStream Function&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms691421(VS.85).aspx"&gt;2. CoGetInterfaceAndReleaseStream Function&lt;/a&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:6585</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/6585.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=6585"/>
    <title>8vmr @ 2008-09-08T15:39:00</title>
    <published>2008-09-08T12:38:01Z</published>
    <updated>2008-09-08T12:38:01Z</updated>
    <category term="офисное"/>
    <category term="c&amp;apos;est la vie"/>
    <category term="программинг"/>
    <content type="html">Не очень долго думал как написать:&lt;br /&gt;  * написать базовый класс, с общим функционалом&lt;br /&gt;  * или завести еще один класс путем откопипастчивания от имеющегося&lt;br /&gt;Выбрал второе&lt;br /&gt;&lt;br /&gt;Вот так из идеалиста, я потихоньку превращаюсь в говнокодера...</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:6250</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/6250.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=6250"/>
    <title>Что же случилось с OpenGL 3.0 ?</title>
    <published>2008-08-13T21:31:26Z</published>
    <updated>2009-02-12T21:28:00Z</updated>
    <category term="программинг"/>
    <content type="html">&lt;img src="http://www.opengl.org/img/opengl_logo.jpg" border="0" alt="OpenGL3" title="OpenGL3" width="220" height="97" vspace="10px" hspace="10px" style="float: right" /&gt;&lt;br /&gt;11 августа в публичном доступе появилась спецификация долгожданного OpenGL 3.0. Но, увы, ожидания не оправдались. В новой версии стандарта практически не добавилось ничего нового: только стандартизированы старые расширения, и введен раздел "The Deprecation Model". Это почти тот же облом что и с версией 2.0, когда по-сути ничего не изменилось. Вот и новую версию тоже следовало б назвать, скажем, OpenGL 2.2, а не так как сейчас.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;Хотя на официальном форуме полно матов и ругани в сторону Khronos'а, но считаю что не все так плохо, и хоронить OpenGL еще очень и очень рано.&lt;br /&gt;&lt;hr /&gt;&lt;i&gt;MPC: So, you said Rage is a 60Hz game. Is it an OpenGL or DirectX game?&lt;br /&gt;&lt;br /&gt;JC: It’s still OpenGL, although we obviously use a D3D-ish API [on the Xbox 360], and CG on the PS3. &lt;b&gt;It’s interesting how little of the technology cares what API you’re using and what generation of the technology you’re on. You’ve got a small handful of files that care about what API they’re on, and millions of lines of code that are agnostic to the platform that they’re on.&lt;/b&gt;&lt;/i&gt;&lt;hr /&gt;&lt;br /&gt;И действительно, с какой стати все начали ныть про толстый API? Да он таков. Но что с этого? Ведь точек соприкосновения (читай: кода) серьезного 3D-движка с этим API не так уж и много, а точнее совсем мало. Кармак прав: какая разница насколько кривой/прямой API? Главное — возможности! А они у OpenGL есть.&lt;br /&gt;&lt;br /&gt;Зачем люди так хотят современного API? Ну зачем? Что он им даст?&lt;br /&gt;Ничего кроме удобства.&lt;br /&gt;&lt;br /&gt;И ради этого &lt;i&gt;удобства&lt;/i&gt; ломать совместимость и переписывать имеющийся код? Ну, это будет по душе только таким идеалистам как я... :)&lt;br /&gt;&lt;br /&gt;Стадный эффект: кто-то начал ныть что нет удобного API, как сразу же началась массовая истерика. Ну не будет этого API в ближайшее время, ну и что? До этого жили ж как-то, и жили со старым, толстым, и сложным OpenGL, вместо красивого и гламурного DX10. Было сложно, да. Но OpenGL не был мертв. Живой он и сейчас, только стал немного лучше.&lt;br /&gt;&lt;br /&gt;Спрашивается, так чего же хоронить?&lt;br /&gt;(хотя комисию лишний раз поругать будет полезно, да)&lt;br /&gt;&lt;br /&gt;Новый API будет хорош для написания нового кода. Для изучения OpenGL с нуля. Для изучения новых фич. В случае, когда это все известно и все уже написано толку от нового стандарта не так уж и много. А еще хуже будет, если этот стандарт окажется непродуманным и сырым. Если опять появится "extention hell". Если придется снова делать linebreak. Так что пусть думают и не торопятся (хотя совесть тоже надо иметь, да)...&lt;br /&gt;&lt;br /&gt;Что сделал Khronos:&lt;ul&gt;&lt;li&gt;По возможностям, DX9 уже не конкурент. Прелести DX10 тоже меркнут (особенно в свете Vista Only)&lt;/li&gt;&lt;li&gt;API обратно совместим со старым&lt;/li&gt;&lt;li&gt;При этом есть хорошая "подготовка" к linebreak в API (Спецификация содержит раздел "The Deprecation Model", где подробно расписано, какая часть API будет отброшена в последующих версиях. Помимо этого с помощью расширения &lt;i&gt;ARB_create_context&lt;/i&gt; можно создать контекст, в котором весь устаревший функционал не будет работать, а только сообщать об ошибках.)&lt;/li&gt;&lt;li&gt;Драйвер может использовать отдельный codepath для forward-контекста&lt;/li&gt;&lt;/ul&gt;А что с новым API?&lt;br /&gt;А что с ним должно быть? Думают... Правда долго... Очень долго...&lt;br /&gt;Ведь следующая версия OpenGL должно прослужить до конца эры нынешних растеризаторов (Да, да, рейтрейсинг уже маячит на горизонте). &lt;br /&gt;А еще есть наполеоновские планы связать OpenGL с еще одним стандартом — OpenCL. И это вполне логично: использовать результаты вычислений OpenCL как входные данные для OpenGL (например, использовать расшаренные buffer objects)&lt;br /&gt;&lt;br /&gt;PS: OpenGL is not dead. Just Khronos did not bring it out of the coma!&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:6114</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/6114.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=6114"/>
    <title>Delphi 2009: Новвоведения в языке</title>
    <published>2008-07-28T21:57:23Z</published>
    <updated>2008-09-23T10:13:51Z</updated>
    <category term="программинг"/>
    <category term="delphi"/>
    <content type="html">Стали известны подробности долгожданных нововведений в языке Delphi&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;1. Долгожданные &lt;a href="http://blogs.codegear.com/davidi/2008/07/23/38915/"&gt;женерики&lt;/a&gt;:&lt;/h3&gt;&lt;br /&gt;&lt;div style="margin:15px; padding:13px; border: 1px solid slategray;background-color:#FAFAFC; overflow: auto"&gt;&lt;pre&gt;
  TList&amp;lt;t&amp;gt; = class
  private
    FItems: array of T;
    FCount: Integer;
    procedure Grow(ACapacity: Integer);
    function GetItem(AIndex: Integer): T;
    procedure SetItem(AIndex: Integer; AValue: T);
  public
    procedure Add(const AItem: T);
    procedure AddRange(const AItems: array of T);
    procedure RemoveAt(AIndex: Integer);
    procedure Clear;
    property Item[AIndex: Integer]: T
      read GetItem write SetItem; default;
    property Count: Integer read FCount;
  end;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Использование:&lt;br /&gt;&lt;div style="margin:15px; padding:13px; border: 1px solid slategray;background-color:#FAFAFC; overflow: auto"&gt;&lt;pre&gt;
var
  ilist: TList&amp;lt;integer&amp;gt;;
  slist: TList&amp;lt;string&amp;gt;;     

procedure PrintListInteger;
var
  i: Integer;
begin
  for i := 0 to ilist.Count - 1 do
    Write(ilist[i], ' ');
  Writeln;
end;         

procedure PrintListString;
var
  i: Integer;
begin
  for i := 0 to slist.Count - 1 do
    Write(slist[i], ' ');
  Writeln;
end;         

begin
  ilist := TList&amp;lt;integer&amp;gt;.Create;
  try
    ilist.AddRange([1, 2, 3]); // ['1', 'second', 'third']);
    PrintListInteger;
    ilist.Remove(1);
    PrintListInteger;
    ilist.Clear;
    PrintListInteger;
  finally
    ilist.Free;
  end;
  slist := TList&amp;lt;integer&amp;gt;.Create;
  try
    slist.AddRange(['one', 'two', 'three']); // ['first', 'second', 'third']);
    PrintListString;
    slist.Remove(1);
    PrintListString;
    slist.Clear;
    PrintListString;
  finally
    slist.Free;
  end;
  Readln;
end.&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;В "стандартный комплект"(юнит Generics.Collections) входят контейнеры TList, TQueue, TStack, TDictionary, TObjectList, TObjectQueue, TObjectStack, и TObjectDictionary.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;2. Анонимные методы (лямбды), с ними же и замыкания (closures):&lt;/h3&gt;&lt;br /&gt;Лямбда (псевдокод):&lt;br /&gt;&lt;div style="margin:15px; padding:13px; border: 1px solid slategray;background-color:#FAFAFC; overflow: auto; max-height:500px"&gt;&lt;pre&gt;
SomeArray.Sort(    
   function(a,b: Integer): Integer   // Инплейс функция-компаратор
   begin
      Result := a - b;
   end
);
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Замыкание(closure):&lt;br /&gt;&lt;div style="margin:15px; padding:13px; border: 1px solid slategray;background-color:#FAFAFC; overflow: auto; max-height:500px"&gt;&lt;pre&gt;type
  TProc = reference to function(x: Integer): function;

function Foo(a: Integer): TProc;
begin
  Foo := function(b: Integer): Integer;
  begin
    Result := a + b;
  end;     
end;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;В вышеприведенном коде функция Foo возвращает лямбда-функцию, складывающую a и b :) (возвращаемую функцию еще предстоит вычислить)&lt;br /&gt;&lt;br /&gt;Почему лябду назвали анонимным методом? Это связано с внутренней реализацией этой фичи: лямбда-функция является ничем иным как методом анонимного класса. &lt;br /&gt;Замыкание реализуется за счет того, что класс хранит в себе "контекст вызова". Т.е. полями класса будут "общие" для "окружения" и лямбды переменные (В случае вышеприведенного примера это "общая" &lt;b&gt;a&lt;/b&gt;). Помимо этого у класса есть счетчик ссылок, т.е, как полноценная closure, лябда-функция может жить вне "зоны вызова"&lt;br /&gt;&lt;font style="color: gray"&gt;&lt;i&gt;Замыкание — это когда в точке вызова функции доступны переменные, которые были в зоне видимости определения функции, но не видны в самой точке вызова)&lt;/i&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Интимные подробности на английском: &lt;br /&gt;&lt;a href="http://www.talios.com/pascal_gets_closures_before_java__why_hasnt_the_world_ende.htm"&gt;Pascal gets closures before java - why hasn't the world ended?&lt;/a&gt; + &lt;a href="http://www.reddit.com/r/programming/comments/6tp3i/pascal_gets_closures_before_java_why_hasnt_the/"&gt;выбранные комменты&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Для тех кто непонял что это такое &lt;a href="http://forum.vingrad.ru/topic-96077.html"&gt;Лябды и замыкания на пальцах&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;3. Новая конструкция для Exit:&lt;/h3&gt;&lt;br /&gt;&lt;div style="margin:15px; padding:13px; border: 1px solid slategray;background-color:#FAFAFC; overflow: auto"&gt;&lt;pre&gt;
function DoSomething(aInteger: integer): string;
begin
  if aInteger &amp;lt; 0 then
  begin
    Exit(‘Negative’);
  end;
  Result := ‘Positive’;
end;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Вместо&lt;br /&gt;&lt;div style="margin:15px; padding:13px; border: 1px solid slategray;background-color:#FAFAFC; overflow: auto"&gt;&lt;pre&gt;
function DoSomething(aInteger: integer): string;
begin
  if aInteger &amp;lt; 0 then
  begin
    Result := ‘Negative’;
    Exit;
  end;
  Result := ‘Positive’;
end;&lt;/pre&gt;&lt;/div&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:8vmr:5731</id>
    <link rel="alternate" type="text/html" href="http://8vmr.livejournal.com/5731.html"/>
    <link rel="self" type="text/xml" href="http://8vmr.livejournal.com/data/atom/?itemid=5731"/>
    <title>Rapidshare: Worst Captcha Ever</title>
    <published>2008-07-07T20:16:32Z</published>
    <updated>2009-03-18T20:27:36Z</updated>
    <category term="другое"/>
    <content type="html">&lt;img src="http://www.picamatic.com/show/2008/07/08/12/571836_443x153.png" style="display: block; float: right;" vspace="5px" hspace="5px" /&gt;&lt;br /&gt;Rapidshare, Worst Captcha Ever... Гугл говорит что у него в базе это словосочетание встречается чуть больше чем на 11 000 страницах. &lt;br /&gt;Прикинули сколько народу пожаловалось? И это только те, кто неполенился написать (как я :). А сколько тех кто не смог скачать такой нужный файл...&lt;br /&gt;Но к несчастью для владельцев этим дело не закончилось...&lt;br /&gt;После жалоб пошли насмешки, в виде &lt;a href="http://www.nilland.com/2008/06/18/rapidshare-captcha-code-to-be-made.html"&gt;програм ломающих сию мегафичу&lt;/a&gt; и беспрепятственной скачки контента.&lt;br /&gt;Смешно правда? Нормальный homo sapiens не может пройти защиту от ботов, в то  время как последние орудуют полным ходом.&lt;br /&gt;&lt;br /&gt;Но похоже владельцы хоста пристыдились терпеть такое надругательство, и все же убрали это порождение изощренной фантазии — теперь рапидшара без капчи. Вообще.&lt;br /&gt;&lt;br /&gt;Интересно, какое "творение" они разместят в ближайшее время?</content>
  </entry>
</feed>
