<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss version="2.0"><channel><title>.NET: Записки программиста о работе в команде, управлении проектами и новых технологиях</title><link>http://developernotes.net/</link><description></description><language>ru-RU</language><managingEditor>noemail@noemail.org (Сергей Мысливый)</managingEditor><generator>BlogEngine.NET 1.4.5.0</generator><blogChannel:blogRoll xmlns:blogChannel="http://backend.userland.com/blogChannelModule">http://developernotes.net/opml.axd</blogChannel:blogRoll><dc:title xmlns:dc="http://purl.org/dc/elements/1.1/">.NET: Записки программиста о работе в команде, управлении проектами и новых технологиях</dc:title><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/developernotes/rss" type="application/rss+xml" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdevelopernotes%2Frss" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdevelopernotes%2Frss" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdevelopernotes%2Frss" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/developernotes/rss" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdevelopernotes%2Frss" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fdevelopernotes%2Frss" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdevelopernotes%2Frss" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fdevelopernotes%2Frss" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Как обойти IIS 7.0 и все-таки вернуть сообщение 404</title><link>http://developernotes.net/post.aspx?id=3545a2b0-c37e-42a4-a8a4-3f071350d952</link><category>Web development</category><author>host.nospam@nospam.developernotes.net (Felix)</author><pubDate>Sat, 23 May 2009 16:59:00 PDT</pubDate><guid isPermaLink="true">http://developernotes.net/post.aspx?id=3545a2b0-c37e-42a4-a8a4-3f071350d952</guid><description>&lt;p&gt;
&lt;img style="padding: 0pt 10px 10px 0pt; float: left" src="/img/art/404-not-found.jpg" alt="IIS 7.0 404" /&gt;
В своем посте &amp;quot;&lt;a href="http://developernotes.net/post/page-not-found-404.aspx"&gt;Как правильно создать страницу 404 или один слуга для двух хозяев&lt;/a&gt;&amp;quot;
я писал, что правильная страница &amp;quot;404&amp;quot; должна не только содержать сообщение, понятное пользователю, но и действительно возвращать 404 код ошибки.
Подробно об этом можно почитать в самом сообщении, но если в двух словах, то 404 код ошибки нужен поисковым серверам. Пока поисковики не научились
распознавать текст, им нужно явно указывать, что запрошенной страницы нет. Иначе такие ссылки будут долго болтаться в индексе, а сам сервер будет жаловаться,
что у нескольких страниц вашего сайта не только одинаковые заголовок и мета-теги, но еще и все содержимое.
&lt;/p&gt;
&lt;p&gt;
Все было хорошо до тех пор, пока я случайно не увидел, что происходит на рабочем сервере. В ответ на ошибочный url браузер отобразил
стандартную страницу IIS 7.0 &amp;quot;Page not found&amp;quot;.
&lt;img style="padding: 15px 0pt 10px 10px; float: right" src="/img/art/PageNotFound404.png" alt="IIS 7.0 page not found" /&gt;
&lt;/p&gt;
&lt;p&gt;
Полез разбираться. На моем компьютере с Windows Vista и IIS 7.0 все работает отлично - возвращается именно моя страница, прием код возврата - 404.
А вот на рабочем сервере с Windows Server 2008 и IIS 7.0 возвращается стандартная страница IIS.
&lt;/p&gt;
&lt;p&gt;
В результате получается, что сначала ASP.NET приложение корректно обрабатывает 404 ошибку и возвращает ответ браузеру. После чего этот ответ перехватывает
IIS, видит 404 код и заменяет его на на свое стандартное сообщение. Я не скажу точно, было ли это изначально в Windows Server 2008 или, скажем, появилось
вместе с Service Pack 2 - но налицо вот такой неприятный сюрприз. Проявляется он только в IIS Integrated mode, в Classic mode все работает как и раньше.
Кстати, это заставляет задуматься о том, что для качественного тестирования желательно иметь среду, аналогичную production server,
а не Windows 2000 с IIS 6.0 :)
&lt;/p&gt;
&lt;p&gt;
К счастью, решение нашлось благодаря MS MVP &lt;a rel="nofollow" href="http://www.west-wind.com/Weblog/default.aspx"&gt;Rick Strah&lt;/a&gt;
(у него вобще можно найти достаточно много интересных статей по ASP.NET). У Рика были похожие проблемы с кодом 500,
который он хотел возвращать клиентскому сервису. В один прекрасный момент, вместо собщения об ошибке и кода 500
сервис стал получать ... правильно, стандартную страницу IIS &amp;quot;Internal server error&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
Решить проблему позволило свойство &amp;quot;&lt;a rel="nofollow" href="http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx"&gt;HttpResponse.TrySkipIisCustomErrors&lt;/a&gt;&amp;quot;.
Оно появилось в ASP.NET 3.5 и как раз позволяет запретить обработку ошибок IIS 7.0 по умолчанию. Что делать, если ваш сайт работает под .NET 2.0? Сам Рик вежливо пишет,
что в этом случае &amp;quot;you&amp;rsquo;re out of luck&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
В результате, чтобы сформировать правильный ответ, мы можем создать PageNotFound.aspx с необходимым текстом &amp;quot;Вот незадача, бла-бла-бла...&amp;quot; и примерно таким вот кодом:
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;code&gt;&lt;font face="Courier New" size="2" color="black"&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt; &lt;font color="#0000ff"&gt;override&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; OnLoad(&lt;font color="#2b91af"&gt;EventArgs&lt;/font&gt; e)&lt;br /&gt;
	{&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;base&lt;/font&gt;.OnLoad(e);&lt;br /&gt;
	&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;Response.StatusCode = (&lt;font color="#2b91af"&gt;Int32&lt;/font&gt;)HttpStatusCode.NotFound;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;Response.TrySkipIisCustomErrors = &lt;font color="#0000ff"&gt;true&lt;/font&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;//&amp;nbsp;&amp;nbsp;Иначе IIS 7.0 возвращает стандартную 404 страницу&lt;/font&gt;&lt;br /&gt;
	}&lt;/font&gt;&lt;/code&gt;
&lt;/blockquote&gt;
&lt;p&gt;
В последствии, эту страницу можно будет отдавать вызовом 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;code&gt;&lt;font face="Courier New" size="2" color="black"&gt;&lt;font color="#2b91af"&gt;HttpContext&lt;/font&gt; ctx = &lt;font color="#2b91af"&gt;HttpContext&lt;/font&gt;.Current;&lt;br /&gt;
	&lt;font color="#0000ff"&gt;if&lt;/font&gt; (ctx == &lt;font color="#0000ff"&gt;null&lt;/font&gt;) &lt;font color="#0000ff"&gt;throw&lt;/font&gt; &lt;font color="#0000ff"&gt;new&lt;/font&gt; NullReferenceException(&lt;font color="#a31515"&gt;&amp;quot;HttpContext.Current&amp;quot;&lt;/font&gt;);&lt;br /&gt;
	ctx.Server.Execute(&amp;quot;PageNotFound.aspx&amp;quot;, &lt;font color="#0000ff"&gt;false&lt;/font&gt;);&lt;br /&gt;
	ctx.Response.End();&lt;br /&gt;
	ctx.ApplicationInstance.CompleteRequest();&lt;br /&gt;
	&lt;/font&gt;&lt;/code&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Вот как-то так. Мне кажется, было бы логичнее, чтобы .NET по умолчанию считал, что TrySkipIisCustomErrors = True, но ... спасибо, что эту проблему можно решить хотя бы так :)
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=8CfehmZO-tA:3iIqYS5Mljg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=8CfehmZO-tA:3iIqYS5Mljg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=8CfehmZO-tA:3iIqYS5Mljg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=8CfehmZO-tA:3iIqYS5Mljg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=8CfehmZO-tA:3iIqYS5Mljg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=8CfehmZO-tA:3iIqYS5Mljg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=8CfehmZO-tA:3iIqYS5Mljg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=8CfehmZO-tA:3iIqYS5Mljg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=8CfehmZO-tA:3iIqYS5Mljg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=8CfehmZO-tA:3iIqYS5Mljg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Felix</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/post.aspx?id=3545a2b0-c37e-42a4-a8a4-3f071350d952</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">4</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://developernotes.net/trackback.axd?id=3545a2b0-c37e-42a4-a8a4-3f071350d952</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/post/file-not-found-iis-7.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/syndication.axd?post=3545a2b0-c37e-42a4-a8a4-3f071350d952</wfw:commentRss></item><item><title>Свой Visual Search провайдер для IE 8 - задача на два помидора</title><link>http://developernotes.net/post.aspx?id=4ea9f05e-bd93-4769-88f1-ee7945461d86</link><category>IE 8</category><category>Web development</category><author>host.nospam@nospam.developernotes.net (Felix)</author><pubDate>Fri, 24 Apr 2009 16:45:00 PDT</pubDate><guid isPermaLink="true">http://developernotes.net/post.aspx?id=4ea9f05e-bd93-4769-88f1-ee7945461d86</guid><description>&lt;b&gt;Visual Search Suggestions&lt;/b&gt; - одна из новых возможностей поиска в IE 8.0. 

Она позволит пользователям искать что-нибудь на вашем сайте, не переходя на его страницы.
А если вы добавите к провайдеру favicon, ваш бренд (скорее брендик 16 на 16) всегда будет вместе с пользователем. 

&lt;a href="http://play2game.ru" title="Мини игры на Play2Game.ru"&gt;
   &lt;img src="http://developernotes.net/img/art/play2game.png" style="float:right; padding:0 0 5px 5px;" alt="Мини игры на Play2Game.ru"/&gt;
&lt;/a&gt;

А главное, она позволит разбавить сухой текст результатов поиска симпатичными картинками, например вот так:

&lt;br/&gt;&lt;br/&gt;
А еще, вы сможете рассказать о своем провайдере, выложив его в &lt;a rel="nofollow" href="http://www.ieaddons.com/ru/searchproviders/"&gt;галерею расширений IE 8.0&lt;/a&gt;.
Или выиграть плазменный телевизор, поучавствовав в &lt;a rel="nofollow" href="http://remix.ru/ie8"&gt;конкурсе дополнений к IE 8.0&lt;/a&gt;,
который проводится в рамках конференции ReMIX09.

&lt;img src="http://developernotes.net/img/art/tv.jpg" style="float:left; padding:5px 10px 5px 0;" alt="конкурс расширений для IE 8.0"/&gt;
&lt;br/&gt;&lt;br/&gt;

Между прочим, сейчас там зарегистрировано всего 3 визуальных провайдера, а сам конкурс продлится до 31 мая 2009.
Так что если у вас есть что искать, а еще лучше - сайт с верной аудиторией, готовой поддержать его в конкурсе - давайте попробуем? 
&lt;br/&gt;&lt;br/&gt; 

Сразу предупрежу, что от вас потребуется метод, который будет возвращать найденные по запросу данные.
Как он будет выглядеть, зависит от ваших любимых технологий и размера сайта. В примере, показанном выше
(&lt;a href="http://play2game.ru" title="мини игры на Play2Game.ru"&gt;сайт с мини играми&lt;/a&gt;,
который был написан на .NET), это было простое строковое стравнение в LINQ запросе. Кто-то посерьезнее настроит full text search в MS SQL Server,
ну а приверженцы PHP и MySQL наверняка тоже смогут подобрать что-нибудь эффективное в своем арсенале.
&lt;br/&gt;&lt;br/&gt;

Если у нас будет такой метод, все остальное - это задача на два помидора&lt;a title="ref1" href="#notice1" name="ref1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;.
Причем, в отличие от &lt;a title="web slices в IE 8.0" href="http://developernotes.net/post/web-slices-ie-8-scrolling.aspx"&gt;web slices&lt;/a&gt;,
простой вариант решения будет одновременно и хорошим, без всяких оговорок и нюансов.
&lt;br/&gt;&lt;br/&gt;

Итак, в лучших традициях кулинарных программ, для успешного приготовления провайдера нам понадобится:

&lt;ul&gt;
   &lt;li&gt;
      Сайт с картинками и текстом, которые мы сможем искать - 1 шт
      &lt;br/&gt;&lt;br/&gt;
   &lt;/li&gt;
   &lt;li&gt;
      Метод, который примет на вход строку, введенную пользователем в строке поиска
      и вернет нам немножко текста и картинок - 1 шт.
      &lt;br/&gt;&lt;br/&gt;
   &lt;/li&gt;
   &lt;li&gt;
      Модуль, к которому будет обращаться браузер, чтобы получить найденные результаты в xml формате - 1 шт
      &lt;br/&gt;&lt;br/&gt;
   &lt;/li&gt;
   &lt;li&gt;
      Еще немножко xml, чтобы описать наш провайдер - 1 шт
      &lt;br/&gt;&lt;br/&gt;
   &lt;/li&gt;
   &lt;li&gt;
      И для завершения - щепотка html, чтобы рассказать браузерам, какой чудесный провайдер мы приготовили
   &lt;/li&gt;
&lt;/ul&gt;

Ну что, продукты готовы, вода кипит - приступаем ...

Сначала займемся основой нашего блюда - методом поиска, который собственно и будет выполнять всю реальную работу. Как мы и договаривались,
его реализация полностью на вас. Абсолютно не важно, как это будет сделано, главное, чтобы он:

&lt;ol&gt;
   &lt;li&gt;
      &lt;img src="http://developernotes.net/img/art/search-string.png" style="float:right; padding:0px 0px 0 5px;" alt="Поиск на Play2Game.ru"/&gt;
      Принимал на вход текст, которую пользователь набрал в строке поиска:&lt;br/&gt;
      Причем учтите, браузер будет обращатся к вашему сайту после каждой введенной буквы, так что искать лучше побыстрее.
      &lt;br/&gt;&lt;br/&gt;
   &lt;/li&gt;
   &lt;li&gt;
      Для каждого найденного элемента возвращал:&lt;br/&gt;&lt;br/&gt;
      &lt;ul&gt;
         &lt;li&gt;Заголовок&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
         &lt;li&gt;Краткое описание&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
         &lt;li&gt;URL страницы, на которую мы попадем выбрав этот элемент при поиске&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
         &lt;li&gt;URL картинки&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
      &lt;/ul&gt;
      В принципе, достаточно возвращать только заголовок или url. Но если мы хотим получить красивый результат,
      нам понадобятся все элементы.
   &lt;/li&gt;
&lt;/ol&gt;

Переходим ко второй части: модулю вашего сайта, к которому будет обращаться браузер, чтобы получить xml с вариантами поиска.
Формат вызова вы сможете задать сами, браузер всего лишь добавит к нему несколько параметров, описывающих запрос. Обязательно, нам
понадобится только один параметр, в котором и будет передана строка поиска. Запрос может выглядеть примерно так:

&lt;div class="code"&gt;
   http://{домен вашего сайта}/search.aspx?q={searchTerms}
&lt;/div&gt;

Модуль может быть реализован по разному, например как IHttpModule или WebService. Я предпочел самый простой вариант - обычную html
страницу:

&lt;div class="code"&gt;
&amp;lt;%@ Page Language="C#" CodeBehind="visual.aspx.cs" Inherits="Play2game.VisualProvider" %&amp;gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br/&gt;
&amp;lt;SearchSuggestion xmlns="http://schemas.microsoft.com/Search/2008/suggestions"&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Query&amp;gt;&amp;lt;asp:Literal ID="ltKeyword" runat="server"/&gt;&amp;lt;/Query&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Section title="Варианты Play2Game.ru"&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;asp:Literal ID="ltItems" runat="server"/&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/Section&amp;gt;&lt;br/&gt;
&amp;lt;/SearchSuggestion&amp;gt;
&lt;/div&gt;

Это xml, который нужно будет вернуть браузеру. Он содержит два placeholders (в виде простейших элементов управления ASP.NET Literal control).
Вместо первого нам нужно будет вставить строку, которую искал пользователь. Браузер проверит ее и выведет результаты, только
если эта строка совпадет со строкой, которую он передал в запросе.
&lt;br/&gt;&lt;br/&gt;

Вместо второго placeholder мы подставим xml с описаниями найденных элементов. Перед тем как перейти к описанию этого xml, обратите внимание еще на две вещи:

&lt;ol&gt;
   &lt;li&gt;
      Строка &amp;lt;?xml version="1.0"?&amp;gt; находится в одной строке с декларацией страницы не случайно. Если вы напишите ее с новой строки
      (как сделал это я, так как ненавижу криво отформатированный текст), результирующий xml будет начинатся с символа перевода каретки
      и не будет распознан браузером (а вы увидите сообщение "ошибка", которое значит "у вас какие-то проблемы, попробуйте как-то изменить ваш код
      и попробовать снова")
      &lt;br/&gt;&lt;br/&gt;
   &lt;/li&gt;
   &lt;li&gt;
      В теге Section мы передали название заголовка, которое будет выведено в самом начале, вместе с серой линией - разделителем.
      Если бы мы этого не сделали, IE сформировал его сам как "{Название вашего провайдера} вариантов", а это может выглядеть
      достаточно криво.
   &lt;/li&gt;
&lt;/ol&gt;

Теперь переходим к формату xml с самими результатами (который вставится на место второго placeholder). Он довольно простой:

&lt;div class="code"&gt;
&amp;lt;Item&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;!-- Заголовок элемента --&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Text&amp;gt;То, не знаю что&amp;lt;/Text&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;!-- Описание элемента --&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Description&amp;gt;Это именно то, что ты искал.&amp;lt;/Description&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;!-- Url, на который мы перейдем, выбрав этот элемент --&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Url&amp;gt;/something.html&amp;lt;/Url&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;!-- Url картинки --&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Image source="/something.gif" alt="то, что ты искал" width="45" height="45" /&amp;gt;&lt;br/&gt;
&amp;lt;/Item&amp;gt;&lt;br/&gt;
...&lt;br/&gt;
&amp;lt;Separator title="Еще один список не знаю чего"/&amp;gt;&lt;br/&gt;
&amp;lt;Item&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;...&lt;br/&gt;
&amp;lt;/Item&amp;gt;
&lt;/div&gt;

Тут тоже стоит обратить внимание на два момента. Первый - это размеры картинки. Если их указать - все будет работать отлично.
Но если ваши изображения немного отличаются по размеру - это может стать проблемой. Если в обычном html в теге img вы указываете только
один размер - ваше изображение будет пропорционально смасштабировано. Тут такой фокус не пройдет - картинки просто перестают
показываться (когда я попробовал вообще не указывать размер, изображения нормально выводились при первом запросе после
подключения провайдера, а потом все таки исчезли). Так что вам придется придумать, как правильно вычислять размеры. 
&lt;br/&gt;&lt;br/&gt;
В этом примере мне повезло - все иконки были одинакового размера 44 на 44. В другой раз было хуже, картинки попались
разные и если указать что-то типа 45x45 - масштабировались в квадрат и безжалостно искажались. В конце концов,
я добавил метод, который находил физический файл, определял его размеры и корректно проставлял аттрибуты width и height.
Вопреки опасениям, работало это достаточно шустро - благодаря второму моменту, о котором мы сейчас поговорим. 
&lt;br/&gt;&lt;br/&gt;

&lt;img src="http://developernotes.net/img/art/visual-search-results.png" style="float:left; padding:0 10px 0 0;" alt="Поиск игр на Play2Game.ru"/&gt;

Дело в том, что размер списка ограничен - в нем будет выведено не более 10 элементов (поэтому проверить размеры максимум 10
файло было достаточно легко). Эти элементы можно выделять разделителями - тег &amp;lt;Separator title="Еще один список не знаю чего"/&amp;gt;
в нашем xml. Однако резделители так же занимают одно из 10 мест. Так что вам нужно будет решить, выводить ли разделители, чтобы
красиво сгруппировать найденные элементы или отобразить побольше результатов поиска.
&lt;br/&gt;&lt;br/&gt;

XML с результатами поиска я создавал при помощи простого StringBuilder и вставлял на место placeholder. Если же вы сторонник сложных,
но правильных решений, обязательно прочтите пост
"&lt;a rel="nofollow" href="http://blogs.microsoft.co.il/blogs/bursteg/archive/2008/12/17/building-an-ie8-visual-search-suggestion-provider-for-my-twitter-friends.aspx"&gt;
Building an IE8 Visual Search Provider for my Twitter Friends&lt;/a&gt;"
в котором Guy Burstein рассказывает, как правильно создавать такой модуль при помощи WCF REST service и XML serialization.
&lt;br/&gt;&lt;br/&gt;

Почти все готово, осталось две мелочи. Первая - создать xml файл с описанием нашего провайдера:

&lt;div class="code"&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br/&gt;
&amp;lt;OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:ie="http://schemas.microsoft.com/Search/2008/"&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;ShortName&amp;gt;{Название вашего провайдера}&amp;lt;/ShortName&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Image height="16" width="16" type="image/icon"&amp;gt;http://{доменное имя сайта}/favicon.ico&amp;lt;/Image&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Url type="text/html" template="http://{доменное имя сайта}/search-page.aspx?q={searchTerms}"/&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Url type="application/x-suggestions+xml" template="http://{доменное имя сайта}/search.aspx?q={searchTerms}"/&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;ie:PreviewUrl type="text/html" template="http://suggestions.example.com/search.aspx?q={searchTerms}"/&amp;gt;&lt;br/&gt;
&amp;lt;/OpenSearchDescription&amp;gt;
&lt;/div&gt;

На что стоит обратить внимание здесь:

&lt;ol&gt;
   &lt;li&gt;
      Тег &amp;lt;Url type="text/html" определяет url, который будет вызван, если пользователь просто нажмет ввод в строке поиска, так и не выбрав ни
      одного из вариантов в предложенном списке. Url вы можете указать произвольный, главное, чтобы он включал placeholder {searchTerms}, вместо
      которого браузер подставит введенную пользователем строку.&lt;br/&gt;
      Если на вашем сайте уже реализован поиск - направьте этот url туда. Если нет - доверьте это вашему любимому поисковому серверу, например вот так:
      &lt;div class="code"&gt;
         &amp;lt;Url type="text/html" template="http://www.google.com/search?q={searchTerms}"/&amp;gt;
      &lt;/div&gt;
   &lt;/li&gt;
   &lt;li&gt;
      Тег &amp;lt;Url type="application/x-suggestions+xml" определяет url нашего модуля, который должен вернуть xml с результатами. Условия те же:
      произвольный url с обязательным placeholder {searchTerms}, вместо которого браузер подставит строку для поиска. Кроме этого, в можете
      использовать еще несколько placeholders и тогда браузер передаст вам немного дополнительной полезной информации. Так, например, запрос вида:
      &lt;div class="code"&gt;
         &amp;lt;Url type="text/html" template="http://www.google.com/search?q={searchTerms}&amp;amp;language={Language}"/&amp;gt;
      &lt;/div&gt;
      позволит вам узнать язык, установленный у пользователя (user's system's locale). А при помощи запроса:
      &lt;div class="code"&gt;
         &amp;lt;Url type="text/html" template="http://www.google.com/search?q={searchTerms}&amp;amp;maxwidth={maxWidth}&amp;amp;rowheight={rowHeight}&amp;amp;sectionHeight={sectionHeight}"/&amp;gt;
      &lt;/div&gt;
      вы сможете получить точные размеры выпадающего окошка и лучше сформировать xml с результатами поиска.
      Подробное описание дополнительных параметров вы сможете найти в документации, ссылка на которую приведена в конце статьи.
      &lt;br/&gt;&lt;br/&gt;
   &lt;/li&gt;
   &lt;li&gt;
      Все установленные поисковые провайдеры автоматически добавляются и как IE Accelerators (ускорители поиска, еще одна новинка IE 8.0).
      Поэтому, если пользователь выделит какой-то текст на странице сайта и вызовет список ускорителей - ваш поисковый провайдер тоже будет в этом списке.
      Строка:
      &lt;div class="code"&gt;
         &amp;lt;ie:PreviewUrl type="text/html" template="http://suggestions.example.com/search.aspx?q={searchTerms}"/&amp;gt;
      &lt;/div&gt;
      позволяет указать url вашего сайта, который вернет html для отображения в preview окне ускорителя. Подробнее об ускорителях поиска вы
      сможете узнать в статье "&lt;a rel="nofollow" href="http://msdn.microsoft.com/en-us/library/cc287851(VS.85).aspx"&gt;OpenService Accelerators Developer Guide&lt;/a&gt;"
      из документации MSDN.    
   &lt;/li&gt;
&lt;/ol&gt;

Последний штрих художника - добавим html тег с описанием провайдера в head нашего сайта. Выглядит он вот так:

&lt;div class="code"&gt;
   &amp;lt;link rel="search" type="application/opensearchdescription+xml" href="http://developernotes.net/opensearch.xml" title="Play2Game.ru" /&amp;gt; 
&lt;/div&gt;

&lt;img src="http://developernotes.net/img/art/add-visual-provider.png" style="float:right; padding:0 0px 5px 5px;" alt="Добавление поисквого провайдера"/&gt;

Найдя его на нашем сайте, IE станет оранжевым от нетерпения и предложит добавить наш провайдер к уже зарегистрированным в нем поисковым провайдерам.

Обратите внимание, значение аттрибута "Title" должно точно совпадать с аналогичным названием в теге "ShortName" описания провайдера.
Если эти строки будут различатся, браузер не поверит, что уже добавил этот провайдер и будет предлагать добавить его снова.
&lt;br/&gt;&lt;br/&gt;

Ну что, прошу к столу, вскипело!
&lt;br/&gt;&lt;br/&gt;

А напоследок еще один совет, который поможет сделать приготовление провайдера более приятным. Браузер кеширует полученный xml,
так что постоянно меняйте вводимые во время тестирования слова. Какое-то время я безуспешно пытался понять под отладчиком,
почему же не вызывается мой модуль, когда я набираю классическое "sdfsdf" (еще варианты "йцукен" или "qwerty").

А если вам захочется разобраться во всех деталях - загляните в главную поваренную книгу Microsoft:
&lt;a rel="nofollow" href="http://msdn.microsoft.com/en-us/library/cc848862(VS.85).aspx"&gt;Search Provider Extensibility in Internet Explorer&lt;/a&gt; и
&lt;a rel="nofollow" href="http://msdn.microsoft.com/en-us/library/cc848863(VS.85).aspx"&gt;XML Search Suggestions Format Specification&lt;/a&gt;, а так же
прочтите статью Себастьяна Циммермана (основного разработчика функции Visual Search)
&lt;a rel="nofollow" href="http://www.thevista.ru/page.php?id=10345"&gt;Hello, World или начинаем работать с IE8 Visual Search&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;

Приятной вам готовки и победы в конкурсе!
&lt;br/&gt;&lt;br/&gt;

&lt;hr/&gt;

&lt;div class="note"&gt;
   &lt;a title="notice1" name="notice1"&gt;
      &lt;sup&gt;
         &lt;strong&gt;1&lt;/strong&gt;
      &lt;/sup&gt;
   &lt;/a&gt;  
   В XP время может измеряться в произвольных единицах, например баллах или Мишках Гамми. Мартин Фаулер как-то рассказывал о Франческо Чирилло,
   который купил и принес на работу тридцатиминутный кухонный таймер в форме помидора. С тех пор в команде появилось выражение «задачка на шесть помидоров».
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=P5GFqCZBT8Q:dOheRYigoyc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=P5GFqCZBT8Q:dOheRYigoyc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=P5GFqCZBT8Q:dOheRYigoyc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=P5GFqCZBT8Q:dOheRYigoyc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=P5GFqCZBT8Q:dOheRYigoyc:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=P5GFqCZBT8Q:dOheRYigoyc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=P5GFqCZBT8Q:dOheRYigoyc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=P5GFqCZBT8Q:dOheRYigoyc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=P5GFqCZBT8Q:dOheRYigoyc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=P5GFqCZBT8Q:dOheRYigoyc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Felix</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/post.aspx?id=4ea9f05e-bd93-4769-88f1-ee7945461d86</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://developernotes.net/trackback.axd?id=4ea9f05e-bd93-4769-88f1-ee7945461d86</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/post/visual-search-provider-ie8.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/syndication.axd?post=4ea9f05e-bd93-4769-88f1-ee7945461d86</wfw:commentRss></item><item><title>robots.txt - небольшое продолжение</title><link>http://developernotes.net/post.aspx?id=01d32f21-f78b-4185-b46f-da12ed20253e</link><category>SEO</category><category>Web development</category><author>host.nospam@nospam.developernotes.net (Felix)</author><pubDate>Thu, 02 Apr 2009 14:44:00 PDT</pubDate><guid isPermaLink="true">http://developernotes.net/post.aspx?id=01d32f21-f78b-4185-b46f-da12ed20253e</guid><description>&lt;img style="margin: 0pt 0pt 10px; float: left" src="http://developernotes.net/img/art/bender.png" alt="формат robots.txt" /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Я читал, что поисковый сервер перебирает все правила в robots.txt и останавливается на первом подходящем.
Поэтому, я наивно полагал, что если разместить блок &amp;quot;User-agent: *&amp;quot; в начале файла, его правила будут использоваться в любом случае.
То есть, мой robots.txt выглядел так:
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code"&gt;
#	Общие правила для всех поисковиков: служебные страницы для логина и пр.&lt;br /&gt;
User-agent: *&lt;br /&gt;
Disallow: /login&lt;br /&gt;
Disallow: /signup&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
# Указание на файл с картой сайта&lt;br /&gt;
Sitemap: http://{доменное имя}/sitemap.xml 
&lt;br /&gt;
&lt;br /&gt;
# Дополнительные правила для Google (используя расширенный синтаксис)&lt;br /&gt;
User-agent: Googlebot&lt;br /&gt;
Disallow: /*/edit$
&lt;br /&gt;
&lt;br /&gt;
# То же самое для Yandex&lt;br /&gt;
User-agent: Yandex&lt;br /&gt;
Disallow: /*/edit$
&lt;/div&gt;
Однако, случайно я обнаружил, что страница &amp;quot;/login&amp;quot; вполне доступна для индексирования (проверял в инструментах веб-мастера Google и Yandex).
Оказалось, что если в robots.txt есть секция для конкретного поискового севера (например, &amp;quot;User-agent: Yandex&amp;quot;),
этот сервер вообще не обращает внимания на остальные секции, в том числе и на &amp;quot;User-agent: *&amp;quot;. Единственное правило, которое они обнаруживают в любом месте,  
это &amp;quot;Sitemap:&amp;quot; - он доступен всем и везде не смотря на строки &amp;quot;User-agent:&amp;quot;.
В результате мне пришлось скопировать общие правила во все остальные разделы, вот так:
&lt;div class="code"&gt;
#	Общие правила для всех поисковиков: служебные строницы для логина и пр.&lt;br /&gt;
User-agent: *&lt;br /&gt;
Disallow: /login&lt;br /&gt;
Disallow: /signup&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
# Указание на файл с картой сайта&lt;br /&gt;
Sitemap: http://fannet.org/sitemap_index.xml 
&lt;br /&gt;
&lt;br /&gt;
# Правила для Google (используя расширенный синтаксис)&lt;br /&gt;
User-agent: Googlebot&lt;br /&gt;
Disallow: /login&lt;br /&gt;
Disallow: /signup&lt;br /&gt;
Disallow: /*/edit$
&lt;br /&gt;
&lt;br /&gt;
# То же самое для Yandex&lt;br /&gt;
User-agent: Yandex&lt;br /&gt;
Disallow: /login&lt;br /&gt;
Disallow: /signup&lt;br /&gt;
Disallow: /*/edit$
&lt;/div&gt;
Такое поведение относится как к Google, так и к Yandex. Имейте это ввиду, когда будете составлять robots.txt для ваших сайтов.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=M1TrzC4Lg-Y:AmAtAwL3DRQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=M1TrzC4Lg-Y:AmAtAwL3DRQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=M1TrzC4Lg-Y:AmAtAwL3DRQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=M1TrzC4Lg-Y:AmAtAwL3DRQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=M1TrzC4Lg-Y:AmAtAwL3DRQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=M1TrzC4Lg-Y:AmAtAwL3DRQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=M1TrzC4Lg-Y:AmAtAwL3DRQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=M1TrzC4Lg-Y:AmAtAwL3DRQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=M1TrzC4Lg-Y:AmAtAwL3DRQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=M1TrzC4Lg-Y:AmAtAwL3DRQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Felix</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/post.aspx?id=01d32f21-f78b-4185-b46f-da12ed20253e</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://developernotes.net/trackback.axd?id=01d32f21-f78b-4185-b46f-da12ed20253e</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/post/robots-txt-again.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/syndication.axd?post=01d32f21-f78b-4185-b46f-da12ed20253e</wfw:commentRss></item><item><title>Robots.txt или Кое что о роботах</title><link>http://developernotes.net/post.aspx?id=f34b4d8e-405f-4b41-922e-aaeea7e15ce1</link><category>SEO</category><category>Web development</category><author>host.nospam@nospam.developernotes.net (Felix)</author><pubDate>Sat, 14 Mar 2009 15:51:00 PDT</pubDate><guid isPermaLink="true">http://developernotes.net/post.aspx?id=f34b4d8e-405f-4b41-922e-aaeea7e15ce1</guid><description>&lt;img style="margin: 0pt 0pt 10px; float: left" src="/img/art/robots.txt.gif" alt="формат robots.txt" /&gt;
Файлы &lt;strong&gt;robots.txt&lt;/strong&gt; просты как угол дома и используются со времен, когда 3&amp;quot; дискеты считались прорывом в технологии :)
Именно по этому я думал, что в них нечего и разбираться. Так что обходился копи-пастом какого-то образца,
который переходил у меня из проекта в проект уже несколько лет.
&lt;br /&gt;
&lt;br /&gt;
Но вот однажды, затеял я эксперимент с индексацией сайта. Выложил его в инет, добавил в &amp;quot;Инструменты для веб-мастеров&amp;quot; Google и ...
увидел сообщение &amp;quot;Страницы вашего сайта недоступны для Google из-за огранчений в robots.txt&amp;quot;. А файл-то был простейший,
создавался он ради одной строчки &amp;quot;Sitemap: http://доменное имя/sitemap.xml&amp;quot;, чтобы лишний раз указать поисковикам где
искать карту сайта.
&lt;br /&gt;
&lt;br /&gt;
Между прочим, robots.txt кешируется Google примерно на день, так что после исправления пришлось ждать более суток.
Вобщем я вздохнул и полез разбираться с темой.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Robots.txt&lt;/strong&gt; был придуман в далеком 1994 году и был предназначен для того, чтобы указать поисковикам, что &lt;strong&gt;не&lt;/strong&gt;
следует индексировать на вашем сайте.
&lt;br /&gt;
&lt;br /&gt;
Его формат действительно очень простой: записи, разделенные пустыми строками. Каждая запись состоит из директив,
к каким поисковикам она относится (одна или несколько строк &lt;strong&gt;User-agent:&lt;/strong&gt;) и операторов &lt;strong&gt;Disallow:&lt;/strong&gt;
(один или несколько), которые указывают, что именно запрещается индексировать.
Если в файле встречается символ &amp;quot;#&amp;quot;, то все остальное до конца строки считается комментарием.
&lt;br /&gt;
&lt;br /&gt;
Например:
&lt;div class="code"&gt;
#	Самый простой вариант, разрешает индексировать все (или, точнее, запрещает ничего :)&lt;br /&gt;
User-agent: *&lt;br /&gt;
Disallow:
&lt;br /&gt;
&lt;br /&gt;
# Всем роботам запрещена индексация файлов в каталоге &amp;quot;/tmp&amp;quot;&lt;br /&gt;
# Кроме того, роботам Slurp (Yahoo) и MSNbot (MSN) запрещена индексация файлов в каталоге &amp;quot;/map&amp;quot;&lt;br /&gt;
User-agent: *&lt;br /&gt;
Disallow: /tmp/
&lt;br /&gt;
&lt;br /&gt;
User-Agent: Slurp&lt;br /&gt;
User-agent: MSNbot&lt;br /&gt;
Disallow: /map/
&lt;/div&gt;
Проблема этого формата в том, что с 1994 года он официально не менялся.
А вот сложность сайтов и иерархии их urls менялась да еще как. Если эти правила устраивали сайты, состоящие
из нескольких десятков статических страниц, то для &lt;strike&gt;доров, говносай&lt;/strike&gt; современных сайтов с динамическим
контентом этого явно не хватает.
&lt;br /&gt;
&lt;br /&gt;
Вы же не думали, что в стандартных правилах можно использовать хоть какие-то шаблоны? Формат &amp;quot;Disallow:&amp;quot; очень прост:
запрещается индексация любых urls, которые начинаются с указанной строки. 
&lt;br /&gt;
&lt;br /&gt;
То есть, &amp;quot;Disallow: /map/&amp;quot; запрещает все файлы в каталоге &amp;quot;/map&amp;quot;, но не запрещает &amp;quot;/map.html&amp;quot;.
А вот &amp;quot;Disallow: /map&amp;quot; запрещает и то и другое.
&lt;br /&gt;
&lt;br /&gt;
Проблема часто возникает, если вы используете url rewriting. Например, у вас есть сайт со описаниями товаров.
Url страницы с описанием:
&lt;div class="code"&gt;
/{категория}/{название товара}-{id товара} 
&lt;/div&gt;
(id товара обычно используется, если нельзя придумать уникальные строковые названия для каждого товара).&lt;br /&gt;
&lt;br /&gt;
И есть страница с отзывами покупателей, ее url:
&lt;div class="code"&gt;
/{категория}/{название товара}-{id товара}/comments
&lt;/div&gt;
А так же есть страница, на которой пользователи могут добавлять новые отзывы, ее url:
&lt;div class="code"&gt;
/{категория}/{название товара}-{id товара}/comments/add
&lt;/div&gt;
Эта страница доступна только залогиненным пользователям, так что нужно запретить ее индексацию.
Без шаблонов или регулярных выражений тут просто не обойдешься.
&lt;br /&gt;
&lt;div class="code"&gt;
Тут вы могли подумать &amp;quot;А зачем для служебных страниц использовать friendly urls? Создай себе одну страницу
и запрети ее в robots.txt&amp;quot;. Да это выход, но не всегда. Будет удобно, если страница добавления отзыва будет
выглядеть так же, как и остальные страницы с описанием, в том числе с той же шапкой и боковыми модулями.
Так как модули независимы, они могут рассчитывать на url определенного формата
(например на то, что он включает в себя категорию товара).
Так что проще использовать такой же формат url, чем добавлять везде проверки &amp;quot;если категория есть в url - взять ее оттуда,
иначе - определить по id товара&amp;quot;.
&lt;/div&gt;
&lt;img style="margin: 0pt 0pt 10px 10px; float: right" src="/img/art/robots_txt_format.jpg" alt="расширения формата robots.txt" /&gt;
Крупные поисковые сервисы пошли привычным путем - стали вводить свои уникальные расширения. Так, Yahoo добавило возможность
использования символов &lt;strong&gt;*&lt;/strong&gt; и &lt;strong&gt;$&lt;/strong&gt;. Символ &lt;strong&gt;*&lt;/strong&gt; обозначает любую (в том числе и пустую)
последовательность символов, а &lt;strong&gt;$&lt;/strong&gt; - конец строки.
То есть, в нашей ситуации с товарами, мы сможем запретить индексацию страниц с добавлением при помощи оператора:
&lt;div class="code"&gt;
Disallow: /*/comments/add$
&lt;/div&gt;
Правда, этот пример не поможет, если у вас используются еще и параметры query string, тогда нужно писать так:
&lt;div class="code"&gt;
Disallow: /*/comments/add$&lt;br /&gt;
Disallow: /*/comments/add?
&lt;/div&gt;
Обратите внимание, что по умолчанию ко всем правилам приписывается &lt;strong&gt;*&lt;/strong&gt;, поэтому нам можно не писать: 
&lt;div class="code"&gt;
Disallow: /*/comments/add?*
&lt;/div&gt;
Основные моменты, на которые стоит обратить внимание:
&lt;ul&gt;
	&lt;li&gt;
	В стандарте robots.txt (тут расположена последняя версия
	&lt;a rel="nofollow" href="http://www.robotstxt.org/orig.html#examples"&gt;стандарта robots .txt&lt;/a&gt;)
	существуют только операторы &amp;quot;User-agent:&amp;quot;, &amp;quot;Disallow:&amp;quot; и комментарии. Все. Шаблоны не поддерживаются.
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
	Существуют расширения, которые поддерживаются основными поисковыми серверами. Это:
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;ol&gt;
		&lt;li&gt;
		Шаблоны &lt;strong&gt;*&lt;/strong&gt; и &lt;strong&gt;$&lt;/strong&gt;. Признаются как минимум Google, Yandex, Yahoo! и MSN.
		&lt;br /&gt;
		&lt;br /&gt;
		&lt;/li&gt;
		&lt;li&gt;
		&lt;strong&gt;Sitemap&lt;/strong&gt; - для указания url с картой сайта. Эта строка обнаруживается поисковыми серверами вне зависимости от операторов &amp;quot;User-agent:&amp;quot;.
		Признается как минимум Google, Yandex, Yahoo! и MSN.
		&lt;br /&gt;
		&lt;br /&gt;
		&lt;/li&gt;
		&lt;li&gt;
		&lt;strong&gt;Allow&lt;/strong&gt; - синтаксис аналогичен Disallow, смысл - прямо противоположный. То есть, если среди сотен документов
		нам нужно запретить почти все, то удобнее разрешить оставшиеся документы, а следующим оператором запретить все остальное:
		&lt;div class="code"&gt;
		User-agent: *&lt;br /&gt;
		Allow: /post/page1&lt;br /&gt;
		Allow: /post/page2&lt;br /&gt;
		Allow: /post/page3&lt;br /&gt;
		Disallow: /
		&lt;/div&gt;
		Признается как минимум Google, Yandex, Yahoo! и MSN.
		&lt;br /&gt;
		&lt;br /&gt;
		&lt;/li&gt;
	&lt;/ol&gt;
	&lt;/li&gt;
	&lt;li&gt;
	У каждого поискового сервера могут существовать свои полезные расширения.&lt;br /&gt;
	Так, например, Yandex поддерживает операторы
	&lt;strong&gt;Host&lt;/strong&gt; (позволяет указать основной сайт среди нескольких зеркал), &lt;strong&gt;Crawl-delay&lt;/strong&gt;
	(позволяет снизить интенсивность обращений поисковика к страницам сайта, если он и так загружен) и &lt;strong&gt;Clean-param&lt;/strong&gt;
	(позволяет указать, какие параметры query string не влияют на уникальность страницы; тогда Yandex не будет загружать все
	urls с различными вариантами этих параметров).
	&lt;/li&gt;
&lt;/ul&gt;
И еще несколько полезных советов ...
&lt;br /&gt;
&lt;br /&gt;
Не старайтесь экспериментировать со структурой robots.txt, будьте проще :) Безобидное, на ваш взгляд, изменение строки
или слова может привести к тому, что какой-то поисковик перестанет индексировать ваши страницы.
&lt;br /&gt;
&lt;br /&gt;
Лучше начинать комментарии с новой строки (хотя стандарт допускает использование их в конце оператора),
использовать большие буквы точно как в примерах (Sitemap, а не SITEMAP), четко указывать, к какому серверу 
относятся конкретные операторы.
&lt;br /&gt;
&lt;br /&gt;
Знаете, из-за чего Google решил, что в robots.txt я блокирую весь сайт? Файл состоял всего из двух строчек:
&lt;div class="code"&gt;
User-agent: *&lt;br /&gt;
Sitemap: http://{доменное имя}/sitemap.xml
&lt;/div&gt;
Считается, что оператор Disallow должен присутствовать в каждой записи. Тут он был пропущен и Google воспринял его как &amp;quot;Disallow: /&amp;quot;.
Возможно это был какой-то сбой, так как на странице &amp;quot;Анализ robots.txt&amp;quot; в инструментах
для веб-мастеров, Google сообщил, что все ок. Но стоит ли рисковать, если от этого зависит индексация ваших страниц. 
&lt;br /&gt;
&lt;br /&gt;
Для крупных поисковых серверов, вы можете проверить какую-либо из ваших конструкций в инструментах веб-мастера.&lt;br /&gt;
Так, для Google это страница &amp;quot;Панель инструментов &amp;gt; Инструменты &amp;gt; Анализ Robots.txt&amp;quot; (url не указываю, так как он зависит от
залогиненного пользователя \ адреса вашего веб-сайта).&lt;br /&gt;
Robots.txt (кстати, называть его так - тоже ошибка, файл нужно создавать имено с маленькой буквы :) для Yandex можно проверить
на странице &lt;a rel="nofollow" href="http://webmaster.yandex.ru/wmconsole/public_robots_txt.xml"&gt;Анализ robots.txt&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;img style="margin: 0pt 0pt 10px 10px; float: right" src="/img/art/robots_txt_info.gif" alt="формат robots.txt" /&gt;
Внимательно изучите описание &lt;strong&gt;robots.txt&lt;/strong&gt; и его расширений для разных поисковых серверов:&lt;br /&gt;
&lt;a rel="nofollow" href="http://www.google.com/support/webmasters/bin/answer.py?answer=40360&amp;amp;cbid=-1timttqfmwj8v&amp;amp;src=cb&amp;amp;lev=answer"&gt;robots.txt для Google&lt;/a&gt;&lt;br /&gt;
&lt;a rel="nofollow" href="http://help.yandex.ru/webmaster/?id=996567"&gt;robots.txt для Yandex.ru&lt;/a&gt;&lt;br /&gt;
&lt;a rel="nofollow" href="http://help.yahoo.com/l/us/yahoo/search/webcrawler/;_ylt=AioUc7V1u7DLhf4IiorwU40FOSd4"&gt;Yahoo!&amp;#39;s Web Crawler&lt;/a&gt; - описание поискового бота Yahoo!, в том числе описан и формат robots.txt для Slurp (поисковый бот Yahoo!)&lt;br /&gt;
&lt;a href="http://robotstxt.org.ru/"&gt;Все о файле robots.txt по-русски&lt;/a&gt; (отсюда я &lt;strike&gt;спи&lt;/strike&gt;
позаимствовал картинку с роботом, надеюсь ссылка на их сайт компенсирует моральные потери :)
&lt;br /&gt;
&lt;br /&gt;
И да будут поисковые сервера к вам благосклонны :)&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=bd03J-6CD70:EAeIL8ItgYo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=bd03J-6CD70:EAeIL8ItgYo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=bd03J-6CD70:EAeIL8ItgYo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=bd03J-6CD70:EAeIL8ItgYo:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=bd03J-6CD70:EAeIL8ItgYo:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=bd03J-6CD70:EAeIL8ItgYo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=bd03J-6CD70:EAeIL8ItgYo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=bd03J-6CD70:EAeIL8ItgYo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=bd03J-6CD70:EAeIL8ItgYo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=bd03J-6CD70:EAeIL8ItgYo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Felix</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/post.aspx?id=f34b4d8e-405f-4b41-922e-aaeea7e15ce1</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://developernotes.net/trackback.axd?id=f34b4d8e-405f-4b41-922e-aaeea7e15ce1</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/post/robots-txt.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/syndication.axd?post=f34b4d8e-405f-4b41-922e-aaeea7e15ce1</wfw:commentRss></item><item><title>Web Slices для IE 8 или "легко ли сластить писиками"</title><link>http://developernotes.net/post.aspx?id=7bd4b738-e310-464a-9780-0c2bdf3f4327</link><category>Web development</category><category>IE 8</category><author>host.nospam@nospam.developernotes.net (Felix)</author><pubDate>Sat, 14 Feb 2009 14:31:00 PST</pubDate><guid isPermaLink="true">http://developernotes.net/post.aspx?id=7bd4b738-e310-464a-9780-0c2bdf3f4327</guid><description>&lt;img src="http://developernotes.net/img/art/webslice_icon.gif" alt="Web Slices IE 8" style="float:left; margin: 0px 10px 0px 0px;" /&gt;

Если вы слушали доклады или читали статьи о новинках IE 8, то должны помнить, что добвить web slices (веб-фрагменты)
к своему сайту проще простого. Легкий взмах руки (добавление 2-3 аттрибутов в html) - и вы смело можете утверждать,
что ваш сайт по полной использует возможности новой версии браузера!
&lt;br /&gt;&lt;br /&gt;

Но так ли все просто на самом деле? Конечно, в наше время верить в чудеса стало легче. Кто-то еще помнит, сколько
усилий и времени нужно было потратить, чтобы заставить общаться клиентскую и серверную части кода по DCOM? Чувствуете
разницу, реализуя все то же сейчас на WPF? (кстати, намного больше усилий приходилось тратить не на реализацию, а на
поддержку этого рершения в локальных сетях заказчиков; в десяти случаях все нормально, в одиннадцатом - нет; и сеть
такая же, и руки админ мыл - а не работает. Ладно, это так, лирика :)
&lt;br /&gt;&lt;br /&gt;

Знаете, в программировании, да и в любой другой высокотехнологичной среде, вместо ответов "да" и "нет" практически всегда
звучит "да, но ..." и "нет, хотя ...". И это правильно, ведь для того, чтобы правильно задать вопрос, нужно знать большую
часть ответа. Вот и сейчас, можно смело сказать, "да, легко, но ...".
&lt;br /&gt;&lt;br /&gt;

Ну что, посмотрим, что скрывается за этим многоточием?
&lt;br /&gt;&lt;br /&gt;

Для наглядности возьмем пример, на котором я разбирался с web slices сам: модуль, выводящий
&lt;a href="http://fannet.org/live"&gt;последние результаты футбольных матчей&lt;/a&gt;. Для web slices это практически идеальный кандидат -
часть страницы с постоянно обновляющейся информацией, которая интересна многим пользователям.
&lt;br /&gt;&lt;br /&gt;

В лучших традициях инкапсуляции сам модуль выглядит у нас так:

&lt;div class="code"&gt;
	&amp;lt;common:LiveResults ID="lr" runat="server"/&amp;gt;
&lt;/div&gt;

Итак ...
&lt;br /&gt;&lt;br /&gt;

&lt;h2&gt;Web slices - взгляд первый&lt;/h2&gt;

&lt;img src="http://developernotes.net/img/art/Web-Slices.png" alt="Web Slices FanNet.org" style="float:right; margin: 0 0px 10px 10px;" /&gt;

Легкий взмах руки:
&lt;ul&gt;
	&lt;li&gt;
		Выделяем нужную нам область тегом div, отмечаем его классом "hslice" и придумываем какой-нибудь id
		(это обязательное условие для web slices, не важно какой, но id нужен)
		&lt;br /&gt;&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Внутрь div-а добавляем тег, помеченный классом "entry-title". Он нужен для того, чтобы IE мог определить название
		нашего веб-фрагмента. Устанавливаем ему стиль "display:none", чтобы сделать невидимым для пользователя.
		&lt;br /&gt;&lt;br /&gt;
		Кончно, можно прекрасно использовать и тег с заголовком внутри нашего модуля. Я вынес заголовок,
		чтобы полностью изолировать логику web slice от user control и оставить ему только отрисовку результатов.
		А будут они отображаться на странице или как web slices - не user control-ного ума дело.
	&lt;/li&gt;
&lt;/ul&gt;

Получаем вот что:

&lt;div class="code"&gt;
	&amp;lt;div id="liveRes" class="hslice"&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;span class="entry-title" style="display:none"&gt;Online-результаты&amp;lt;/span&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;common:LiveResults ID="lr" runat="server"/&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;
&lt;/div&gt;

И все действительно работает. Наводим на модуль мышкой, выбираем "Добавить на панель избранного" и получаем симпатичную
кнопку с последними матчами. 
&lt;br /&gt;&lt;br /&gt;

Часть ответа со словом "да" мы честно отработали. Теперь посмотрим, что у нас означает "но".
&lt;br /&gt;&lt;br /&gt;

&lt;h2&gt;Web slices - взгляд второй&lt;/h2&gt;

Изучаем описание web slices в MSDN и сразу расстраиваемся от неэффективности нашего решения. Всякий раз, когда
браузеру нужно обновить содержимое web slice, он запрашивает нашу страницу целиком и выбирает из нее нужные данные.
Логично, а откуда он их еще возьмет? И если на ваш сайт заходит пара сотен человек в день - на это можно смело не обращать внимание.
А вот для тысяч посещений - это уже расточительство, по крайней мере, если вместе с web slices на странице выводится и другая информация
(а значит и идут обращения к базе, выполняется серверный код и т.д.). Кроме того, размер страницы может быть очень большой и все
это &lt;strike&gt;барахло&lt;/strike&gt; содержимое браузеру приходится перетаскивать с сервера, чтобы просто понять, что данные изменились
или отрисовать ваш фрагмент в выпадающем окне.
&lt;br /&gt;&lt;br /&gt;

Для решения этой проблемы существует такая штука как "Alternative Update Source". Это указание браузеру запрашивать для обновления
другой url, а не тот, на котором был найден web slice. То есть, мы добавляем к нашему фрагменту еще одну строку:

&lt;div class="code"&gt;
	&amp;lt;a rel="feedurl" style="display:none" href="http://developernotes.net/WebSlices/LiveResultsUpdate.aspx"&amp;gt;&amp;lt;/a&amp;gt;
&lt;/div&gt;

которая так же невидима для пользователя. LiveResultsUpdate.aspx - это страница, которая отдает только содержимое web slice, ее и будет
запрашивать браузер для обновления.
&lt;br /&gt;&lt;br /&gt;

Разбираемся дальше. Так как web slices являются частью "Windows RSS Platform", то по сути браузер воспринимает указанный url как RSS поток.
То, что там расположен наш html с разметкой - удобная абстракция, которая позволяет программистам не заботиться о формировании XML с обновлениями.
На самом деле страница LiveResultsUpdate.aspx может возвращать XML примерно такого вида:

&lt;div class="code"&gt;
	&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;
	&amp;lt;rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005"&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;lt;channel xmlns:cfi="http://www.microsoft.com/schemas/rss/core/2005/internal" cfi:lastdownloaderror="None"&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title cf:type="text"&gt;Online-рузультаты футбольных матчей&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;link&amp;gt;http://fannet.org/WebSlices/LiveResultsUpdate.aspx&amp;lt;/link&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ttl&amp;gt;15&amp;lt;/ttl&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" cf:type="text"&gt;Online-результаты&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;link&amp;gt;http://fannet.org/live&amp;lt;/link&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;guid isPermaLink="false"&gt;c465d0e169db3b4eb0db5e1898224134&amp;lt;/guid&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;description&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Тут расположено содержимое нашего web slice.&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/description&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/item&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;lt;/channel&amp;gt;&lt;br /&gt;
	&amp;lt;/rss&amp;gt;
&lt;/div&gt;

И это будет лучше, так как в XML мы сможем явно указать различные параметры и избавим браузер от необходимости преобразования html в XML.
&lt;br /&gt;&lt;br /&gt;

Из тегов канала (channel) нас интересует только "ttl", указывающий частоту обновления нашего фрагмента в минутах. 15 минут - минимальная частота,
по умолчанию она равна 1 дню.
&lt;br /&gt;&lt;br /&gt;

Значения остальных тегов:

&lt;img src="http://developernotes.net/img/art/web-slice-bar.png" alt="Результаты футбольных матчей FanNet.org" style="float:right; margin: 10px 0 10px 10px;" /&gt;

&lt;ul&gt;
	&lt;li&gt;
		title - название web slice, будет отображаться на кнопке панели "Избранное"
		&lt;br /&gt;&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
		link - url, на который мы перейдем, если кликнем на самую левую кнопку внизу окошка с web slice (вторая кнопка обновляет сдержимое самого окошка)
		&lt;br /&gt;&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
		guid - значение, на основании которого браузер будет определять, изменилось ли содержимое web slice. Если оно обновилось,
		текст на кнопке с web slice должен стать жирным (хотя это можно отключить в настройках вашего браузера)
		&lt;br /&gt;&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
		description - собственно содержимое web slice
	&lt;/li&gt;
&lt;/ul&gt;	

Продолжаем разбираться с тонкостями. Кроме "Alternative Update Source" существует еще такая вещь как "Alternative Display Source".
По сути, это еще один url вашего сайта. Если вы его зададите, в окошке с web slice будет отображаться содержимое именно этой страницы.
&lt;br /&gt;&lt;br /&gt;

Перед тем как объяснить, зачем он нужен, хочу уточнить, что "alternative update source" и "alternative display source" не зависят друг от друга. Вы можете
использовать только "alternative update source" или только "alternative display source" или оба вместе.
&lt;br /&gt;&lt;br /&gt;

Так вот, "alternative display source" может оказаться полезным сразу по нескольким причинам:

&lt;ul&gt;
	&lt;li&gt;
		Во-первых, по нажатию кнопки на панели web slice отобразиться в маленьком окне. Оно маленькое (по умолчанию 320 x 240), поэтому вы можете захотеть
		выводить содержимое web slice не так, как он выводиться на страницах вашего сайта. Например, убрать большой заголовок,
		сделать поменьше шрифт, убрать отступы. Поэтому "alternative display source" нужно использовать, когда вы хотите
		формировать html для web slice, заточенный для отображения в маленьком окошке.
		&lt;br /&gt;&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Во-вторых, если мы используем "alternative display source", то в preview окне выводятся текущие, а не закешированные данные. Иначе там
		будет отображаться закешированная информация, которая обновляется с указаной вами периодичностью. И, в любом случае, этот период не может быть меньше 15 минут.
		Иногда это очень неудобно. Возьмем наш пример с результатами матчей. Данные на сайте обновляются примерно раз в две минуты. Если вы следите
		за ходом матча, то узнавать новости раз в 15 минут не совсем то, что вы хотели, верно? К сожалению, с ограниченим в 15 минут мы ничего не сделаем,
		но, по крайней мере, у нас будет возможность просматривать текущие результаты в preview окне, не открывая всю страницу.
		&lt;br /&gt;&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Есть еще одна полезность "alternative display source". Мы помним, что содержимое web slice 
		(неважно, взят он со страницы или формируется при помощи "alternative update source") воспринимается как RSS. Соответственно на содержимое такого
		web slice накладываются ограничения: в нем не поддерживаются скрипты, ActiveX компоненты, формы и кнопки с post-запросами.
		А вот в html от "alternative display source" все это использоваnm можно. Конечно, какие-то ограничния есть и там, но они мягче.
		Например, нельзя использовать всплывающие диалоги и не поддерживается инсталляция ActiveX (если он уже проставлен в браузере, использовать его можно).
	&lt;/li&gt;
&lt;/ul&gt;

Есть еще один момент, на который стоит обратить внимание. Если вы одновременно используете "alternative update source" и "alternative display source",
то содержимое web slice, которое передается в "alternative update source" становиться ненужным. Для определения, обновились ли данные,
лучше использовать guid в "alternative update source", а отображаться в окошке все равно будет html, который запрашивается у "alternative display source".
&lt;br /&gt;&lt;br /&gt;

Таким образом, если вы хотите реализовать web slice совсем-совсем оптимально, лучше всего поступить так:

&lt;ul&gt;
	&lt;li&gt;
		Выделяем участок страницы, который мы хотим отображать как web slice. Указываем там заголовок и ссылку на "alternative update source":
		&lt;div class="code"&gt;
			&amp;lt;div id="liveRes" class="hslice"&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;lt;div style="display:none"&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;span class="entry-title"&gt;Online-результаты&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a rel="feedurl" href="http://developernotes.net/WebSlices/LiveResultsUpdate.aspx"&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;lt;common:LiveResults ID="lr" runat="server"/&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;
		&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Страница LiveResultsUpdate.aspx формирует RSS без самого контента, но с ссылкой на "alternative display source":
		&lt;div class="code"&gt;
			&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;
			&amp;lt;rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005"&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;lt;channel xmlns:cfi="http://www.microsoft.com/schemas/rss/core/2005/internal" cfi:lastdownloaderror="None"&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title cf:type="text"&gt;Online-рузультаты футбольных матчей&amp;lt;/title&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;link&amp;gt;http://fannet.org/WebSlices/LiveResultsUpdate.aspx&amp;lt;/link&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ttl&amp;gt;15&amp;lt;/ttl&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" cf:type="text"&gt;Online-результаты&amp;lt;/title&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;link&amp;gt;http://fannet.org/live&amp;lt;/link&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;guid isPermaLink="false"&gt;c465d0e169db3b4eb0db5e1898224134&amp;lt;/guid&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="http://fannet.org/WebSlices/LiveResultsDisplay.aspx" rel="entry-content"/&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="http://fannet.org/WebSlices/LiveResultsUpdate.aspx" rel="alternate"/&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/item&amp;gt;&lt;br /&gt;
			&amp;nbsp;&amp;nbsp;&amp;lt;/channel&amp;gt;&lt;br /&gt;
			&amp;lt;/rss&amp;gt;
		&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Страница LiveResultsDisplay.aspx отдает html, оптимизированный для отображения в preview окне для web slice.
		&lt;br /&gt;&lt;br /&gt;
	&lt;/li&gt;
&lt;/ul&gt;	

В результате, для автоматического обновления браузер будет запрашивать отдельный RSS, содержащий только guid и параметры web slice,
а при нажатии кнопки в "Избранном" будет отображаться актуальный (незакешированный) html,
который специально оптимизирован для отображения в маленьком окне.
&lt;br /&gt;&lt;br /&gt;

Уф, мы почти добрались до конца, осталась пара изюминок, которые позволят довести ваш web slice до безумного совершенства :)
&lt;br /&gt;&lt;br /&gt;

&lt;h2&gt;Web slices - взгляд третий&lt;/h2&gt;

&lt;h3&gt;Scrolling&lt;/h3&gt;

В документации по web slices рекомендуется создавать их таким образом, чтобы они нормально отображались в окошке размером 320 на 240 px.
Именно в таком окне выведется web slice, когда пользователь нажмет кнопку на панели "Избранное" первый раз. Размер окна не подстраивается
под размер web slice. Пользователь может растянуть его сам до определенных размеров, но сами вы никак не можете этим управлять.
&lt;br /&gt;&lt;br /&gt;

&lt;img src="http://developernotes.net/img/art/valuta-online.png" alt="Валюта online" style="float:left; margin: 0px 10px 10px 0;" /&gt;

Мало того, это preview окно имеет одно неприятное свойство - если html в нем не помещаеться, вертикальной прокрутки (scrolling) в нем все равно не будет.
Я так и не понял, объясняется ли это какими-то причинами или является просто ошибкой, но - прокрутки там нет. Т.е. если один и тот
же html вы отобразите просто в IE - прокрутка есть, а в preview окне - нет.
&lt;br /&gt;&lt;br /&gt;

Конечно, некоторые web slices имеют фиксированный размер, так что такое ограничение для них не проблема.
Хороший пример - лоты на eBay. Фрагмент с описанием лота легко отобразить в небольшой зоне, которая прекрасно выводиться в preview.
&lt;br /&gt;&lt;br /&gt;

Однако часто web slices представляют собой списки: последние новости, анонсы, музыка, товары, да мало ли.
Иногда можно обойтись и тут - например отображать последние три анонса, выводя не более 300 символов текста для каждого + картинка
фиксированного размера.  
&lt;br /&gt;&lt;br /&gt;

Но есть случаи, когда это не удобно. Например, нам нужно выводить весь текст, длину которого заранее мы не знаем.
Или мы хотим вывести все элементы списка, а их количество постоянно меняется. Вот попробуйте зайти на страницу
&lt;a href="http://valuta.online.ua/" rel="nofollow"&gt;http://valuta.online.ua&lt;/a&gt; и добавить web slice с курсами валют.
А теперь откройте окошко. Что, тоже крутите скроллер на мыши и ничего не получается, да? Мало того, если растянуть окно по максимуму,
все строки все равно не влезут (ну разве что у вас о-очень большой дисплей).
&lt;br /&gt;&lt;br /&gt;

Scrolling был нужен и для результатов матчей. Дело в том, что их количество постоянно меняется. Сегодня играют 10 - 15 игр,
а завтра - одну или вообще ни одной. Выводить первых три не хотелось - даже основных матчей бывает много и выбирать из них
только несколько - значить превратить web slice в простой баннер, а-ля "а вот у нас есть результаты матчей, заходите к нам!".
Поэтому пришлось немного поэкспериментировать со стилями.
&lt;br /&gt;&lt;br /&gt;

Сразу предупрежу, в верстке я разбираюсь "по-программистски", т.е. как-то конечно разбираюсь, но не в совершенстве :) Так что
это только пример реализации, возможно опытный верстальщик посмотрит и скажет "ха, да тут все можно сделать одним аттрибутом".
В этом случае мне будет приятно, если он поделиться своими мыслями в комментариях :)
&lt;br /&gt;&lt;br /&gt;

Итак, html, который будет возвращаться в preview окне панели "Избранное", может выглядеть так:

&lt;div class="code"&gt;
	&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;Online-рузультаты футбольных матчей&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html { height: 100% }&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body { padding: 0px; margin: 0px; height: 100% !important; overflow: hidden; }&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#outer { overflow-x: hidden; overflow-y: auto; height: 100% }&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#inner { padding: 10px; }&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/style&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div id="outer"&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div id="inner"&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Тут у нас размещен html нашего web slice --&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;br /&gt;
	&amp;lt;/html&amp;gt;
&lt;/div&gt;

&lt;img src="http://developernotes.net/img/art/web-slices-scrolling.png" alt="Web slice with scrolling" style="float:right; margin: 0px 0px 10px 10px;" /&gt;

В результате наш html выводится с padding 10px от границ окна и при необходимости в нем появляется вертикальный скроллинг.
Аттрибуты "overflow-x" и "overflow-y" уникальны для IE, но и web slices уникальны только для него же, так что проблемы не возникнет.

&lt;h3&gt;Ссылки в окне preivew&lt;/h3&gt;

Если вы кликнете по какой-то ссылке в окне preivew, новая страница отобразиться там же. Вряд ли это то, что вы хотели, так как
остальные страницы вашего сайта не предназначены для отображения в маленьком окошке. Для того, чтобы страница открылась в нормальном
окне браузера, вам нужно добавить аттрибут target="_blank" ко всем вашим ссылкам (это, кстати, еще один повод использовать "alternative display source".
Когда вы отображаете web slice на странице сайта такое поведение вам ни к чему).

&lt;h3&gt;Favorite icon&lt;/h3&gt;

&lt;img src="http://developernotes.net/img/art/FanNet-favicon.png" alt="FanNet.org favorite icon" style="float:left; margin: 0px 10px 0px 0px;" /&gt;

Возможно это был какой-то локальный сбой, но! Добавляю web slice, он добавляется, но на кнопке выводиться картинка по умолчанию, а не
favirite icon сайта. Мелочь - а неприятно. Причем, если web slice задан только при помощи html аттрибутов, без "alternative update source" -
все ок, иконка есть. А если с "update source" - нет. 
&lt;br /&gt;&lt;br /&gt;

Прошелся по сайтам с web slices, у кого-то добавляется, у кого-то нет, но разницы понять не смог. После нескольких часов экспериментов получилось -
для этого нужно было поместить favorite icon в корень сайта и назвать его стандартно "favicon.ico". В принципе, так и рекомендуется делать, но
мне было приятнее собирать все изображения в папке "img", так что favicon жил у меня там. После этого иконка стала нормально отбражаться.
&lt;br /&gt;&lt;br /&gt;

Возможно, сбой был из-за какой-то другой причины, которая исправилась незаметно от меня. Или это - ошибка беты IE и она будет исправлена
в release. В любом случае, если у вас возникнут те же проблемы, проверьте сначала этот вариант.
&lt;br /&gt;&lt;br /&gt;

Уф, вроде бы все. Естественно, любое описание не сможет заменить
 &lt;a href="http://msdn.microsoft.com/en-us/library/cc956158(VS.85).aspx" rel="nofollow"&gt;документации MSDN&lt;/a&gt;. И удачи вам в разработке!
&lt;br /&gt;&lt;br /&gt;

&lt;h2&gt;P.S.&lt;/h2&gt;

На сайте IE 8 есть &lt;a href="http://www.ieaddons.com/ru/webslices/" rel="nofollow"&gt;галерея расширений&lt;/a&gt;,
в том числе и web slices. А в RC1 на панели IE появилась кнопка "Get more Add-ons".
Многие пользователи, проставившие IE (особенно после выхода релиза), заглянут на эту страницу,
так что если вы добавите ваш web slice в галерею - это даст дополнительный трафик на ваш сайт.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=PHaWtnMb1Z0:mtmaMTjVfbA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=PHaWtnMb1Z0:mtmaMTjVfbA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=PHaWtnMb1Z0:mtmaMTjVfbA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=PHaWtnMb1Z0:mtmaMTjVfbA:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=PHaWtnMb1Z0:mtmaMTjVfbA:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=PHaWtnMb1Z0:mtmaMTjVfbA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=PHaWtnMb1Z0:mtmaMTjVfbA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=PHaWtnMb1Z0:mtmaMTjVfbA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=PHaWtnMb1Z0:mtmaMTjVfbA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=PHaWtnMb1Z0:mtmaMTjVfbA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Felix</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/post.aspx?id=7bd4b738-e310-464a-9780-0c2bdf3f4327</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://developernotes.net/trackback.axd?id=7bd4b738-e310-464a-9780-0c2bdf3f4327</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/post/web-slices-ie-8-scrolling.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/syndication.axd?post=7bd4b738-e310-464a-9780-0c2bdf3f4327</wfw:commentRss></item><item><title>Браузеры, кнопка "Back" и кеширование страниц</title><link>http://developernotes.net/post.aspx?id=cd4bcf2c-5a8e-4671-8111-8c342e8b7dfd</link><category>Web development</category><author>host.nospam@nospam.developernotes.net (Felix)</author><pubDate>Fri, 23 Jan 2009 09:10:00 PST</pubDate><guid isPermaLink="true">http://developernotes.net/post.aspx?id=cd4bcf2c-5a8e-4671-8111-8c342e8b7dfd</guid><description>&lt;img style="margin: 0px 10px 10px 0px; float: left" src="http://developernotes.net/img/art/BrowserCache.gif" alt="Браузеры, кнопка Back и кеширование страниц" /&gt; Это - браузеры. Они отображают наши станицы.&lt;br /&gt;
А это - кеш браузера. Он старается, чтобы наши страницы отображались быстрее.&lt;br /&gt;
А это - AJAX. Он тоже старается, чтобы наши страницы отображались быстрее.&lt;br /&gt;
Но иногда, приходится стараться, чтобы они так не старались. Об одном таком случае и пойдет речь.&lt;br /&gt;
&lt;br /&gt;
Итак, представте, что на вашем сайте есть страница, которая сама периодически обновляет список с online-информацией. Да через тот же AJAX. Чтобы представлять было проще, возьмем конкретный пример - текущие &lt;a href="http://fannet.org/live" title="Online-результаты футбольных матчей на FanNet.org"&gt;результаты футбольных матчей&lt;/a&gt;, которые обновляются примерно раз в две минуты. &lt;a href="http://fannet.org/live" title="Online-результаты футбольных матчей на FanNet.org"&gt;&lt;img style="border-width: 0px; margin: 10px 0px 10px 10px; float: right" src="http://developernotes.net/img/art/FanNetLive.jpg" alt="Online-результаты футбольных матчей на FanNet.org" /&gt; &lt;/a&gt;Болельщик открывает страницу - и на ней всегда актуальная информация. Теперь, он уходит на другую страницу, скажем, посмотреть описание какого-то матча. А потом ему хочется вернуться и он нажимает кнопку &amp;quot;Back&amp;quot;. И видит, что последний раз результаты матчей обновлялись в момент, когда он уходил с этой страницы.&lt;br /&gt;
&lt;br /&gt;
На первый взгляд - ничего страшного. Ясное дело, браузер взял страницу из кеша и поправить это - дело минуты.&lt;br /&gt;
&lt;br /&gt;
Как вы уже догадались, все немного сложнее, иначе бы этого поста просто не было.&lt;br /&gt;
&lt;br /&gt;
Первым делом, я решил запретить кеширование страницы. Результат был несколько странным - под IE все работало нормально, под FF - ничего не изменилось.&lt;br /&gt;
&lt;br /&gt;
Ну вот, опять приходится читать документацию, вздохнул я и начал читать. В результате оказалось, что разработчики разных браузеров оптимизируют логику работы &amp;quot;Back&amp;quot; каждый по своему:&lt;br /&gt;
&lt;ul&gt;
	&lt;li&gt;IE 8.x\7.x обращает внимание на настройки кеширования и берет страницу из кеша только если кеширование разрешено&lt;/li&gt;
	&lt;li&gt;FF 3.x просто берет страницу из кеша, даже если кешировать ее нельзя&lt;/li&gt;
	&lt;li&gt;Opera 9.x тоже берет страницу из кеша&lt;/li&gt;
&lt;/ul&gt;
Причем каждая команда как-то объясняет свой вариант и естественно считает его самым лучшим.&lt;br /&gt;
&lt;br /&gt;
Порывшись в сети, я нашел простое решение:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code"&gt;
// Refrech page after back button&lt;br /&gt;
function reloadIfBack()&lt;br /&gt;
{&lt;br /&gt;
var e = document.getElementById(&amp;quot;refreshed&amp;quot;);&lt;br /&gt;
if (e.value==&amp;quot;no&amp;quot;)&lt;br /&gt;
{ e.value=&amp;quot;yes&amp;quot;; }&lt;br /&gt;
else&lt;br /&gt;
{ e.value=&amp;quot;no&amp;quot;; location.reload(); }&lt;br /&gt;
}&lt;br /&gt;
$(document).ready(reloadIfBack);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;refreshed&amp;quot; value=&amp;quot;no&amp;quot; /&amp;gt; 
&lt;/div&gt;
&lt;br /&gt;
Тут есть чуть jQuery, но даже, если вы с ней не знакомы, код должен быть понятен:&lt;br /&gt;
&lt;ol&gt;
	&lt;li&gt;Добавляем на страницу hidden поле, в котором сохранено состояние страницы &amp;quot;не обновлялась&amp;quot;&lt;/li&gt;
	&lt;li&gt;На событие &amp;quot;страница загружена&amp;quot; вешаем метод &amp;quot;reloadIfBack&amp;quot;&lt;/li&gt;
	&lt;li&gt;Этот метод проверяет, значение hidden поля. Если значение &amp;quot;no&amp;quot; - станица взята с сервера, тогда просто меняем его на &amp;quot;yes&amp;quot;. Если &amp;quot;yes&amp;quot; - значит страница взята из кеша, сбрасываем поле и перезагружаем страницу&lt;/li&gt;
&lt;/ol&gt;
После этого под IE и FF все заработало, а вот под Opera осталось как и прежде. Оказалось, что у Opera система кеширования сильно переработана и отличается от IE и FF. Они очень гордятся тем, что страницы после &amp;quot;Back&amp;quot; открываются почти мгновенно, в минусах - идеи как обновить страницу я так и не нашел. Вернее я встретил &lt;a rel="nofollow" href="http://my.opera.com/rb79/blog/2008/03/22/force-reload-refresh-when-pressing-the-back-button"&gt;одно описание&lt;/a&gt;, но мне настолько не понравилась его суть (это решение выбрасывало исключения под IE и FF, так что его приходилось брать в мертвый catch {}), что даже не стал ее проверять.&lt;br /&gt;
&lt;br /&gt;
Потратив еще немного времени, я решил оставить все как есть, успокоив себя тем, что Opera распространена не так сильно, да и проблема не большая - все равно страница вскоре обновится. Но если у вас будут идеи, как заставить работать и Opera - пишите, буду рад это обсудить.
&lt;div style="display:none"&gt;f0ab5ee797a220fa2d0252805722395f&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=iXt_e1sa7UA:K5YZ5N93GYs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=iXt_e1sa7UA:K5YZ5N93GYs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=iXt_e1sa7UA:K5YZ5N93GYs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=iXt_e1sa7UA:K5YZ5N93GYs:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=iXt_e1sa7UA:K5YZ5N93GYs:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=iXt_e1sa7UA:K5YZ5N93GYs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=iXt_e1sa7UA:K5YZ5N93GYs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=iXt_e1sa7UA:K5YZ5N93GYs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=iXt_e1sa7UA:K5YZ5N93GYs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=iXt_e1sa7UA:K5YZ5N93GYs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Felix</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/post.aspx?id=cd4bcf2c-5a8e-4671-8111-8c342e8b7dfd</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://developernotes.net/trackback.axd?id=cd4bcf2c-5a8e-4671-8111-8c342e8b7dfd</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/post/back-button-page-reload.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/syndication.axd?post=cd4bcf2c-5a8e-4671-8111-8c342e8b7dfd</wfw:commentRss></item><item><title>Видео с Дней разработчиков 2008 в Украине</title><link>http://developernotes.net/post.aspx?id=0f83d615-a8b0-4149-9bf9-aefef9eb2bfc</link><category>Web development</category><author>host.nospam@nospam.developernotes.net (Felix)</author><pubDate>Wed, 24 Dec 2008 13:09:00 PST</pubDate><guid isPermaLink="true">http://developernotes.net/post.aspx?id=0f83d615-a8b0-4149-9bf9-aefef9eb2bfc</guid><description>&lt;img style="margin: 0pt 15px 15px 0pt; float: left" src="http://developernotes.net/img/art/EntityFramework.png" alt="Entity Framework" /&gt;
Сегодня Сергей Байдачный начал выкладывать &lt;a href="http://blogs.msdn.com/sbaidachni/archive/2008/12/24/9251576.aspx"&gt;видео докладов с Дней разработчиков 2008&lt;/a&gt; в Украине.
&lt;br /&gt;
&lt;br /&gt;
В том числе и мой - &lt;a href="http://silverlight.services.live.com/52153/ADO_NET_Entity_Framework_Mislivskiy/video.wmv"&gt;Введение в ADO.NET Entity Framework&lt;/a&gt;
(я писал о нем в одном из предыдущих сообщений &amp;quot;&lt;a href="http://developernotes.net/post/ado-net-entity-framework.aspx"&gt;Мой доклад на Developer Days 2008&lt;/a&gt;&amp;quot;).
&lt;br /&gt;
&lt;br /&gt;
Жалко, что в ролики не вошли вопросы и ответы - обычно это самая живая часть докладов. А еще, пересматривая видео, я понял, почему доклад прошел минут за 40,
хотя дома, когда я рассказывал его своей стенке, на это уходил положенный час. Если бы мой темп немного замедлить - получилось бы и спокойнее и понятнее.
Но тем не менее, если выставить громкость на полную - смотеть его вполне можно :)
&lt;br /&gt;
&lt;br /&gt;
Приятного!&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=Y7Joiaj38os:f2j4OXZCBIo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=Y7Joiaj38os:f2j4OXZCBIo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=Y7Joiaj38os:f2j4OXZCBIo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=Y7Joiaj38os:f2j4OXZCBIo:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=Y7Joiaj38os:f2j4OXZCBIo:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=Y7Joiaj38os:f2j4OXZCBIo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=Y7Joiaj38os:f2j4OXZCBIo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=Y7Joiaj38os:f2j4OXZCBIo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=Y7Joiaj38os:f2j4OXZCBIo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=Y7Joiaj38os:f2j4OXZCBIo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Felix</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/post.aspx?id=0f83d615-a8b0-4149-9bf9-aefef9eb2bfc</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://developernotes.net/trackback.axd?id=0f83d615-a8b0-4149-9bf9-aefef9eb2bfc</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/post/video-developer-days-2008-ukraine.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/syndication.axd?post=0f83d615-a8b0-4149-9bf9-aefef9eb2bfc</wfw:commentRss></item><item><title>Как правильно создать страницу 404 или один слуга для двух хозяев</title><link>http://developernotes.net/post.aspx?id=29dd6c1a-f923-4ddc-8c96-c1069e4b8cab</link><category>SEO</category><category>Web development</category><author>host.nospam@nospam.developernotes.net (Felix)</author><pubDate>Sat, 20 Dec 2008 09:22:00 PST</pubDate><guid isPermaLink="true">http://developernotes.net/post.aspx?id=29dd6c1a-f923-4ddc-8c96-c1069e4b8cab</guid><description>&amp;quot;А что тут сложного?&amp;quot; удивитесь вы. А потом, подумав &amp;quot;вряд ли он ответит &amp;#39;ничего&amp;#39;
и этим закончит статью&amp;quot;, спросите - &amp;quot;а в чем подвох?&amp;quot;.
&lt;p&gt;
Подвох конечно есть. Но давайте сначала посмотрим, что вообще можно сделать. Самый
просто вариант - ничего. Ваш сайт честно отошлет пользователю код
возврата 404 и тот увидит в браузере что-то вроде:&lt;br /&gt;
&lt;br /&gt;
&lt;img style="border: 1px solid Gray" src="http://developernotes.net/img/art/404.png" alt="страница 404" /&gt;&lt;br /&gt;
&lt;br /&gt;
Внешний вид зависит от конкретного браузера и настроек провайдера пользователя.
Например, вместо страницы по умолчанию, пользователю могут показывать какую-то рекламу,
а это еще обиднее :)
&lt;/p&gt;
&lt;p&gt;
Разработчики сайтов конечно понимают, что так поступать нельзя. Если это
не ваш постоянный посетитель
- после такого ответа вы его потеряли. Поэтому на сайте создается специальная страница, которая выводится, когда никто не знает
что делать с этом странным адресом. Она имеет такой же внешний вид как и остальные страницы сайта и должна сказать посетителю &amp;quot;Все замечательно и под контролем! Да, вот этой информации
у нас нет, но вы можете поискать здесь, или перейти вот сюда&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
Вот так это, например, выглядит на сайте &amp;quot;сами знаете кого&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&lt;img style="border: 1px solid Gray" src="http://developernotes.net/img/art/artlebedev404.png" alt="страница 404" /&gt;
&lt;/p&gt;
&lt;p&gt;
А теперь, посмотрим чуть дальше. Да, с пользователем мы разобрались. А вот что будет
с поисковыми серверами?
&lt;/p&gt;
&lt;p&gt;
Небольшой следственный эксперимент. Создаем пустой ASP.NET проект и добавляем к
нему стандартную обработку страниц, которых нет. Это делается очень просто:
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Создается новая страница, допустим PageNotFound.aspx, на которой вы отображаете
	все что хотите сказать пользователю.&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
	Вносим изменение в web.config:
	&lt;div class="code"&gt;
	&amp;lt;customErrors mode=&amp;quot;On&amp;quot; defaultRedirect=&amp;quot;GenericErrorPage.htm&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;nbsp; &amp;nbsp; &amp;lt;error statusCode=&amp;quot;404&amp;quot; redirect=&amp;quot;PageNotFound.aspx&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/customErrors&amp;gt;
	&lt;/div&gt;
	&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Пробуем. Открываем наш сайт, запршиваем какую-нибудь &amp;quot;bla-bla-bla.aspx&amp;quot; - вуаля,
мы видим нашу, только что созданную страницу. Все работает?
&lt;/p&gt;
&lt;p&gt;
А теперь заглянем чуть глубже. С красивого уровня графики нырнем сразу на два уровня
ниже -на уровень HTTP протокола. Открываем ваш любимый &amp;quot;сниффер&amp;quot; (у меня это - HttpWatcher)
и еще раз запрашиваем &amp;quot;bla-bla-bla.aspx&amp;quot;. Что мы видим:&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://developernotes.net/img/art/trace302.png" alt="HttpWatcher redirect" /&gt;
&lt;/p&gt;
&lt;p&gt;
То есть, кода 404 у нас вообще нет, вместо него есть редирект 302 (&amp;quot;ресурс был временно
перемещен&amp;quot;) на нашу PageNotFound.aspx.
&lt;/p&gt;
&lt;p&gt;
А теперь представьте, что в кеше поисковика есть какое-то количество ваших несуществующих
urls. Причины могут быть разные:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Самая распространенная - для SEO оптимизации вы изменили структуру url. Конечно,
	вы позаботились о перенаправлении старых адресов, но что-то просто могли упустить
	или немного запутались в большом количестве правил.&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;Еще вариант - изменилась физическая структура сайта и часть страниц действительно
	исчезла. У меня так случилось при смене движка этого блога. О перенаправлении статей
	я позаботился, но часть страниц, которые создавал старый движок, пропала, а подходящего
	аналога в новой версии не было. Тупо перебрасывать эти запросы на главную страницу
	я не хотел, чтобы не смущать поисковик.&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;У вас большой сайт с сотнями тысяч страниц и сложной структурой. Этот сайт периодически
	меняется, так что поисковики постоянно накапливают какие-то, уже несуществующие
	адреса. Их может быть совсем немного, но при умножении на размер сайта и продолжительность
	его жизни - величина получится вполне приличная.&lt;/li&gt;
&lt;/ul&gt;
В результате, с точки зрения поисковика все эти страницы продолжают существовать
и&amp;nbsp; ведут на одну и ту же страницу вашего сайта. Если вы пользуетесь Google
\ Yandex Web Master, то увидите их в списках с ошибками. Ничего серьезного скорее
всего не произойдет, но:&lt;br /&gt;
&lt;ul&gt;
	&lt;li&gt;Они могут оставаться в кеше поисковика достаточно долго, так как 404 кода (&amp;quot;страница
	не существует&amp;quot;)
	ему никто не отсылал.&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;Существует мнение (и мне оно кажется вполне логичным), что поисковики больше любят (читай,
	чаще индексируют, больше доверяют и т.д.) сайты, которые не создают им проблем с
	индексацией (т.е. раздел &amp;quot;Диагностика&amp;quot; в инструментах веб-мастера не содержит описание ошибок.&lt;/li&gt;
&lt;/ul&gt;
В результате я решил, что страница &amp;quot;404&amp;quot; должна формироваться для пользователя,
но вовращаться с кодом &amp;quot;404&amp;quot;. Для этого потребовалось внести несколько простых изменений:&lt;br /&gt;
&lt;ol&gt;
	&lt;li&gt;
	Убираем из web.config перенаправление на PageNotFound.aspx, чтобы отключить 302 редирект:
	&lt;div class="code"&gt;
	&amp;lt;customErrors mode=&amp;quot;On&amp;quot; defaultRedirect=&amp;quot;GenericErrorPage.htm&amp;quot; /&amp;gt;
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;Передаем управление странице PageNotFound.aspx сами. Для этого в файле Global.asax добавляем следующий
	код в обработчик ошибок уровня приложения:
	&lt;div class="code"&gt;
	void Application_Error(object sender, EventArgs e)&lt;br /&gt;
	{&lt;br /&gt;
	&amp;nbsp; &amp;nbsp; HttpException ex = Server.GetLastError() as HttpException;&lt;br /&gt;
	&amp;nbsp; &amp;nbsp; if (ex != null &amp;amp;&amp;amp; ex.GetHttpCode() == (Int32)HttpStatusCode.NotFound)&lt;br /&gt;
	&amp;nbsp; &amp;nbsp; {&lt;br /&gt;
	&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Server.Execute(&amp;quot;PageNotFound.aspx&amp;quot;, false); Server.ClearError();&lt;br /&gt;
	&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
	}
	&lt;/div&gt;
	То есть, если ошибка, это - &amp;quot;страница не найдена&amp;quot;, нужно на самом деле выполнить
	PageNotFound.aspx и очистить стек ошибок (так как мы обработали
	эту ситуацию сами).&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
	На самой странице PageNotFound.aspx добавляем следующий код, возвращающий статус 404 браузеру:
	&lt;div class="code"&gt;
	protected override void OnLoad(EventArgs e)&lt;br /&gt;
	{&lt;br /&gt;
	&amp;nbsp; &amp;nbsp; base.OnLoad(e);&lt;br /&gt;
	&amp;nbsp; &amp;nbsp; Response.StatusCode = (Int32)HttpStatusCode.NotFound;&lt;br /&gt;
	}
	&lt;/div&gt;
	&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Все, теперь можно смотреть, что получилось:&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://developernotes.net/img/art/trace404.png" alt="HttpWatcher 404" /&gt;
&lt;/p&gt;
&lt;p&gt;
Вот теперь совсем другое дело, нам вернулась наша страница, но уже с 404 кодом возврата.
Теперь и пользователь и поисковик получат то, что мы хотим: один - &amp;quot;этого мы не
нашли, но вы можете попробовать поискать что-то другое&amp;quot;, второй - &amp;quot;такой страницы
не существует&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
И напоследок еще один совет. На вашей &amp;quot;404&amp;quot; странице кроме сообщения &amp;quot;Эта страница
не найдена&amp;quot; вы можете разместить специальный &amp;quot;&lt;a rel="nofollow" href="http://www.google.com/support/webmasters/bin/answer.py?answer=93644"&gt;Google виджет&lt;/a&gt;
для улучшения страницы 404&amp;quot;. Это java script, который будет отображать примерно следующее:&lt;br /&gt;
&lt;img src="http://developernotes.net/img/art/Google404.png" alt="Google виджет 404" /&gt;
&lt;/p&gt;
&lt;p&gt;
Если вы можете поделиться своим опытом борьбы со списками ошибок, которые выводятся
в инструментах веб-мастера - пишите, буду рад это с вами обсудить. И да будут к
вам благосконны поисковые сервера! :)
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=UjV8bmL0ukw:H3MXSkPrlEI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=UjV8bmL0ukw:H3MXSkPrlEI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=UjV8bmL0ukw:H3MXSkPrlEI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=UjV8bmL0ukw:H3MXSkPrlEI:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=UjV8bmL0ukw:H3MXSkPrlEI:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=UjV8bmL0ukw:H3MXSkPrlEI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=UjV8bmL0ukw:H3MXSkPrlEI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=UjV8bmL0ukw:H3MXSkPrlEI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=UjV8bmL0ukw:H3MXSkPrlEI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=UjV8bmL0ukw:H3MXSkPrlEI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Felix</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/post.aspx?id=29dd6c1a-f923-4ddc-8c96-c1069e4b8cab</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">11</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://developernotes.net/trackback.axd?id=29dd6c1a-f923-4ddc-8c96-c1069e4b8cab</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/post/page-not-found-404.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/syndication.axd?post=29dd6c1a-f923-4ddc-8c96-c1069e4b8cab</wfw:commentRss></item><item><title>Microsoft Chart Control</title><link>http://developernotes.net/post.aspx?id=67dbe241-cf9f-4351-af47-d4af6111e236</link><category>Web development</category><author>host.nospam@nospam.developernotes.net (Felix)</author><pubDate>Sun, 14 Dec 2008 09:03:00 PST</pubDate><guid isPermaLink="true">http://developernotes.net/post.aspx?id=67dbe241-cf9f-4351-af47-d4af6111e236</guid><description>&lt;img style="margin-right: 30px; float: left" src="http://developernotes.net/img/art/MicrosoftChart.png" alt="Microsoft Chart" /&gt;
Есть несколько типов элементов управления, которые очень часто используются в интерфейсе веб-приложений, но не входят в Visual Studio.
Кто из вас не искал &amp;quot;симпатичный, но простенький календарик&amp;quot;? Или текстовое поле с минимальными возможностями форматирования (bold, italic, alignment)?
Да, в сети полно таких компонент, многие бесплатны, многие являются OpenSource проектами, но их нужно искать ... выбирать ... проверять.
Среди таких компонент попадаются отличные варианты, но за решениями от Microsoft стоят сотни и тысячи часов усилий по реализации и поддержке.
А это значит - функциональность, все преимущества VS и IntelliSense и надежность (да-да, что бы там не говорили, у Microsoft очень жесткая политика разработки и тестирования; если вы пользовались сторонними компонентами
Sheridan, Components Arts или Stingray то можете сравнить bug-листы и скорость их исправления).
&lt;br /&gt;
&lt;br /&gt;
Вот поэтому я всегда радуюсь, когда узнаю, что в составе VS появилось что-то новенькое.
Хороший пример - библиотека jQuery. Она будет поставляться с 10-й версией Visual Studio и уже входит в инсталляцию ASP.NET MVC Beta.
А недавно, семейство элементов управления от VS пополнилось еще одним очень полезным компонентом
- Microsoft Chart Control.
&lt;br /&gt;
&lt;br /&gt;
Узнать об этом подробнее вы сможете в &lt;a rel="nofollow" href="http://code.msdn.microsoft.com/mschart"&gt;примерах от Microsoft&lt;/a&gt;.
В использовании этой библиотеки может быть одно но: обязательное наличие .NET Framework 3.5 SP1. Если вас это не пугает, дальше идут
сплошные достоинства, про комплектацию библиотеки можно смело сказать &amp;quot;полный фарш&amp;quot;:
&lt;ul&gt;
	&lt;li&gt;
	25 основных типов диаграмм с возможностью полной кастомизации (тьфу, звучит то как ... Но смысл вы же поняли? :)
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
	куча поддерживаемых возможностей при выводе данных (больше 20 пунктов со сложными &amp;quot;диаграммными&amp;quot; терминами в документации)
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
	интерактивность и поддержка AJAX
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;a rel="nofollow" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=EE8F6F35-B087-4324-9DBA-6DD5E844FD9F&amp;amp;displaylang=en"&gt;документация&lt;/a&gt;.
	Она содержит только подробное описание классов, за &amp;quot;getting started&amp;quot; нужно смотреть 
	следующий пункт&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
	Более 200
	&lt;a rel="nofollow" href="http://code.msdn.microsoft.com/mschart/Release/ProjectReleases.aspx?ReleaseId=1591"&gt;подробных примеров&lt;/a&gt;
	с исходными кодами на C# и Visual Basic
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
	локализация (нужно загрузить
	&lt;a rel="nofollow" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=581FF4E3-749F-4454-A5E3-DE4C463143BD&amp;amp;displaylang=en#Overview"&gt;Language Pack&lt;/a&gt;)
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
	интеграция в Visual Studio (Toolbox, IntelliSense). Для этого опять таки нужно загрузить специальный
	&lt;a rel="nofollow" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=1D69CE13-E1E5-4315-825C-F14D33A303E9&amp;amp;displaylang=en"&gt;Add-on для VS 2008&lt;/a&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;a rel="nofollow" href="http://social.msdn.microsoft.com/Forums/en-US/MSWinWebChart/threads/"&gt;форум&lt;/a&gt;, посвященный Microsoft Chart Control.
	Причем форум, который мониторится сотрудниками Microsoft, так что вопросы здесь действительно закрываются конкретными ответами.
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;/li&gt;
&lt;/ul&gt;
&lt;img style="margin-left: 10px; float: right" src="http://developernotes.net/img/art/BollingerChart.png" alt="Bollinger Chart" /&gt;
Если вы установите Chart компонент и он покажется вам до боли знакомым - не удивляйтесь :) Дело в том, что 
по сути - это Dundas Data Visualization controls. Microsoft взяла за основу исходные коды Dundas,
и потратила кучу времени на доводку и адаптацию к своим стандартам. Правда при этом под ASP.NET 
мы лишились таких возможностей оригинала как скроллинг \ масштабирование,
некоторых компонент UI (Toolbar, Context Menu, Property Pages) и Falsh анимации и ренедринга.
&lt;br /&gt;
&lt;br /&gt;
Microsoft Chart Control доступен в виде отдельной
&lt;a rel="nofollow" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=130F7986-BF49-4FE5-9CA8-910AE6EA442C&amp;amp;displaylang=en"&gt;инсталляции&lt;/a&gt;
для .NET Framework 3.5 и будет поставляться вместе с .NET Framework 4.0.
&lt;br /&gt;
&lt;br /&gt;
Так что на первый взгляд все выглядит очень привлекательно, ну а настоящее положение дел можно проверить
только добавив этот компонент в свое приложение.
Так что я буду рад услышать от вас отзывы о реальном использовании Microsoft Chart, пишите!&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=-9b4u7_fnic:Y6NTrR8QviM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=-9b4u7_fnic:Y6NTrR8QviM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=-9b4u7_fnic:Y6NTrR8QviM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=-9b4u7_fnic:Y6NTrR8QviM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=-9b4u7_fnic:Y6NTrR8QviM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=-9b4u7_fnic:Y6NTrR8QviM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=-9b4u7_fnic:Y6NTrR8QviM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=-9b4u7_fnic:Y6NTrR8QviM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=-9b4u7_fnic:Y6NTrR8QviM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=-9b4u7_fnic:Y6NTrR8QviM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Felix</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/post.aspx?id=67dbe241-cf9f-4351-af47-d4af6111e236</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://developernotes.net/trackback.axd?id=67dbe241-cf9f-4351-af47-d4af6111e236</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/post/microsoft-chart-control.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/syndication.axd?post=67dbe241-cf9f-4351-af47-d4af6111e236</wfw:commentRss></item><item><title>ADO.NET Entity Framework: мой доклад на Developer Days 2008</title><link>http://developernotes.net/post.aspx?id=b0be42c7-f906-4a8c-bb5b-f209837d81fc</link><category>Web development</category><author>host.nospam@nospam.developernotes.net (Felix)</author><pubDate>Sat, 06 Dec 2008 15:22:00 PST</pubDate><guid isPermaLink="true">http://developernotes.net/post.aspx?id=b0be42c7-f906-4a8c-bb5b-f209837d81fc</guid><description>&lt;div style="text-align: right"&gt;
&lt;a href="http://developernotes.net/data/zip/EntityFrameworkOnDevDays2008.zip"&gt;Презентция &amp;quot;ADO.NET Entity Framework&amp;quot; на Developer Days 2008&lt;/a&gt; (zip, 2.4Mb)
		&lt;/div&gt;
		&lt;br /&gt;
		&lt;img style="margin-right: 10px; float: left" src="http://developernotes.net/img/art/Microsoft.jpg" alt="Microsoft" /&gt;
Это событие произошло еще в сентябре. Но в то время блог пребывал во временно-вечном
состоянии &amp;quot;не пишу, потому что еще чуть-чуть - и будет новая версия, а новой версии
нет - потому что нужно пусть и чуть-чуть, но времени&amp;quot; :) А &lt;strike&gt;похва&lt;/strike&gt; рассказать очень
хочется ...
&lt;br /&gt;
&lt;br /&gt;
Дело в том, что мне предложили прочитать один из докладов на &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?culture=UK-UA&amp;amp;eventid=1032387858&amp;amp;flag=3"&gt;
Киевском Developer Days 2008&lt;/a&gt;, которые периодически устраивает Microsoft. Можно
было даже выбрать одну из тем, всего их было 4:
&lt;ul&gt;
	&lt;li&gt;
	Internet Explorer 8: нові можливості для розробників&lt;/li&gt;
	&lt;li&gt;
	Розробка застосувань за допомогою Windows Presentation Foundation 3.5 SP1 (из
	двух частей)&lt;/li&gt;
	&lt;li&gt;
	SilverLight 2: архітектура застосувань, створення елементів керування&lt;/li&gt;
	&lt;li&gt;
	.NET Framework 3.5 SP1: ADO.NET Entity Framework&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Ближе всего мне была последняя - Entity Framework. Дело в том, что до недавнего
времени все мои проекты были по сути интернет порталами. А значит новинки IE 8.0
там использовать пока бесмысленно - очень важно, чтобы приложение одинаково хорошо
работало под всеми браузерами (а в случае IE - с целой линейкой, начиная с 6-й версии)
Кстати, подружить 6-ю и 7-ю версии на одном компьютере мне так и не удалось,
так что о существовании 6-й я вспоминаю только когда слышу фразу &amp;quot;да у вас весь дизайн
поехал&amp;quot; :(. WPF к веб-приложениям прикручивать вроде некуда, а SilverLight не
прикрутишь именно к порталам - поисковые сервера до сих пор не могут найти, что же
там можно проиндексировать :)
&lt;/p&gt;
&lt;p&gt;
А вот Entity Framework вполне можно использовать для создания объектной модели.
Так что я запустил Power Point и набрал на первой странице &amp;quot;ADO.NET Entity Framework&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
А вот дальше начались проблемы. Как-то так получилось, что c Power Point я раньше
ничего не делал. &amp;quot;Не беда&amp;quot;, подумал я, &amp;quot;есть масса презентаций, что-то, а copy-paste
за долгие годы разработки я освоил профессионально&amp;quot;. Но коварный PP всячески надо
мной издевался: красивые и большие заголовки при копировании становились едва заметными,
а
яркие и сочные оранжевые блоки катастрофически бледнели (угу, потом я понял, что
есть такое понятие - палитра). Вобщем на борьбу с PP времени я потратил может и
не больше, чем на доклад, но очень прилично.
&lt;/p&gt;
&lt;p&gt;
Но вот наконец презентация готова и есть даже текстовка доклада, разбитая по слайдам!
Доклад на мероприяттии такого уровня с точным регламентом я делал впервые, так что,
слава богу, решил замерять время, которое я собираюсь все это рассказывать.
&lt;/p&gt;
&lt;p&gt;
На доклад отводился час. Я засек время, запустил презентацию и глупо улыбаясь стене
произнес &amp;quot;День добрый! Меня зовут Сергей Мысливый и мы поговорим с вами об Entity
Framework&amp;quot; ...
&lt;/p&gt;
&lt;p&gt;
Хм, вобщем в первый раз это заняло больше двух часов. Я схватился за голову и начал
безжалостно кромсать текст доклада. Сначала чуть-чуть, потом еще чуть-чуть ... Вобщем
через некоторое время, когда я произносил финальную для доклада (но к сожалению,
не для выступления :) фразу &amp;quot;Ну, а теперь вопросы?&amp;quot; я укладывался минут в 45.
&lt;/p&gt;
&lt;p&gt;
Сама конференция проводилась в новом офисе Microsoft на ул. Жилянской (добиратся
туда можно как от м. Университет, так и от Вокзальной, причем в обоих случаях придется
пройтись). Моя презентация начинался после обеда, так что пока можно было не волноваться
и спокойно слушать других докладчиков. Но всему хорошему приходит конец и вот -
я лихорадочно пережевываю обед, паралельно обдумывая сразу несколько вещей:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;не слишком ли заметно, как я волнуюсь?&lt;/li&gt;
	&lt;li&gt;может бросить обед, подключить свой ноутбук к проектору и только убедившись что
	все работает - доесть?&lt;/li&gt;
	&lt;li&gt;как не растеряться и не забыть первую фразу (а за ней и все остальные)? &lt;/li&gt;
&lt;/ul&gt;
&lt;img style="margin-left: 10px; float: right" src="http://developernotes.net/img/art/Barselona.jpg" alt="Barselona" /&gt;
&lt;p&gt;
Но все обошлось (по крайней мере, пока мне так кажется). После стольких повторений
перед стенкой, доклад я протарабанил не сильно сбиваясь и даже смог ответить на все
вопросы. Из забавного ... когда я подключил свой ноутбук к проектору, до начала
доклада оставалось еще минут 20. Их я провел пытаясь непринужденно общаться с друзьями,
а на самом деле постоянно повторяя про себя как попугай &amp;quot;День добрый! Меня зовут ...&amp;quot; ну и дальше.
В это время мой ноутбук заскучал и включил хранитель экрана, все это естественно
выводилось на проектор. Хранитель у меня безобидный - просто выводит фотографии
из указанной папки в произвольном порядке (есть такая стандартная штука в Windows
Vista). Первые пару секунд я лихорадочно вспоминал, на какую именно папку он настроен
в этот раз?! но уф, пронесло, это были нейтральные (и очень мне симпатичные)
фотографии из Барселоны :)
&lt;/p&gt;
&lt;p&gt;
Ну а потом, уже после доклада, я забыл отцепить и выключить микрофон. Так как доклад
был последним, его у меня забрали не сразу. Поэтому друзья рассказали,
что мои разговоры еще минут 10 транслировались пустеющему залу.
&lt;/p&gt;
&lt;p&gt;
Кстати, в первый раз по другому отнесся к заполнению анкет, которые обычно раздаются
перед мероприятием. Еще бы, ведь докладам ставят оценки и мне было чертовски любопытно, что же там пишут! Но если у первых докладов еще были шансы
на какую-то объективность, оценки моего доклада зависели только от щедрости слушателей.
Он был последним, а так как анкеты меняли на футболки ... ну, вобщем вы поняли.
Самые нетерпеливые оценили все доклады ее до 12 (перерыв и кофе), а остальные (кстати,
и я тоже :) - до обеда.
&lt;/p&gt;
&lt;p&gt;
Так что перед самим докладом вышел Сергей Байдачный и поблагодарил всех за хорошие
прогнозы. Из зала пошутили, что мол теперь докладчику придется постараться, чтобы
не обмануть ожидания. Я затравленно улыбнулся, запустил презентацию и произнес &amp;quot;День
добрый! Меня зовут ...&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
Вобщем все это снималось на видео. Потом Байдачный сказал, что после того, как семинары
пройдут во всех городах, из видеозаписей сформируют диск и разошлют его всем,
кто оставил свой адрес в анкете. Так что теперь я с нетерпением жду этого момента
(хотя одновременно и боюсь - со стороны все выглядит не так, как тебе
кажется).
&lt;/p&gt;
&lt;p&gt;
В начале статьи я разместил ссылку на файл с презентацией моего доклада. Обратите
внимание на текстовки к каждому слайду. Чтобы было немного понятнее, я раскидал
по ним текст своего доклада. Конечно, это скорее памятка о чем нужно сказать, но
все равно, с ними немного понятнее.
&lt;/p&gt;
&lt;p&gt;
Еще в текстовки включены куски, которые я опустил в реальном докладе из-за огрничений
по времени (они отделены текстом &amp;quot;[Вырезано из финальной версии, чтобы уложится
вовремя]&amp;quot;). Так что эту версию презентации смело можно назвать авторской :)
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=QmSsQBch8qM:fxopxAFQVGI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=QmSsQBch8qM:fxopxAFQVGI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=QmSsQBch8qM:fxopxAFQVGI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=QmSsQBch8qM:fxopxAFQVGI:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=QmSsQBch8qM:fxopxAFQVGI:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=QmSsQBch8qM:fxopxAFQVGI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=QmSsQBch8qM:fxopxAFQVGI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=QmSsQBch8qM:fxopxAFQVGI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?i=QmSsQBch8qM:fxopxAFQVGI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/developernotes/rss?a=QmSsQBch8qM:fxopxAFQVGI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/developernotes/rss?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Felix</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://developernotes.net/post.aspx?id=b0be42c7-f906-4a8c-bb5b-f209837d81fc</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://developernotes.net/trackback.axd?id=b0be42c7-f906-4a8c-bb5b-f209837d81fc</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/post/ado-net-entity-framework.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://developernotes.net/syndication.axd?post=b0be42c7-f906-4a8c-bb5b-f209837d81fc</wfw:commentRss></item></channel></rss>
