<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
<script type="text/javascript">(function() { var a=window;function c(b){this.t={};this.tick=function(b,i,d){d=void 0!=d?d:(new Date).getTime();this.t[b]=[d,i]};this.tick("start",null,b)}var f=new c;a.jstiming={Timer:c,load:f};try{var g=null;a.chrome&&a.chrome.csi&&(g=Math.floor(a.chrome.csi().pageT));null==g&&a.gtbExternal&&(g=a.gtbExternal.pageT());null==g&&a.external&&(g=a.external.pageT);g&&(a.jstiming.pt=g)}catch(h){};a.tickAboveFold=function(b){var e=0;if(b.offsetParent){do e+=b.offsetTop;while(b=b.offsetParent)}b=e;750>=b&&a.jstiming.load.tick("aft")};var j=!1;function k(){j||(j=!0,a.jstiming.load.tick("firstScrollTime"))}a.addEventListener?a.addEventListener("scroll",k,!1):a.attachEvent("onscroll",k);
 })();</script>
<meta content='true' name='MSSmartTagsPreventParsing'/>
<meta content='blogger' name='generator'/>
<link href='http://blog.team23.ru/favicon.ico' rel='icon' type='image/x-icon'/>
<link href='http://blog.team23.ru/' rel='canonical'/>
<link rel="alternate" type="application/atom+xml" title=".NET на практике - Atom" href="http://blog.team23.ru/feeds/posts/default" />
<link rel="alternate" type="application/rss+xml" title=".NET на практике - RSS" href="http://blog.team23.ru/feeds/posts/default?alt=rss" />
<link rel="service.post" type="application/atom+xml" title=".NET на практике - Atom" href="http://www.blogger.com/feeds/6660959344014943110/posts/default" />
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://www.blogger.com/rsd.g?blogID=6660959344014943110" />
<link rel="me" href="https://plus.google.com/103609747718915414367" />
<link rel="openid.server" href="http://www.blogger.com/openid-server.g" />
<link rel="openid.delegate" href="http://blog.team23.ru/" />
<link href='https://plus.google.com/103609747718915414367' rel='publisher'/>
<itemscopetag itemscope='itemscope' itemtype='http://schema.org/Blog'>
<meta content='.NET на практике' itemprop='name'/>
</itemscopetag>
<!--[if IE]> <script> (function() { var html5 = ("abbr,article,aside,audio,canvas,datalist,details," + "figure,footer,header,hgroup,mark,menu,meter,nav,output," + "progress,section,time,video").split(','); for (var i = 0; i < html5.length; i++) { document.createElement(html5[i]); } try { document.execCommand('BackgroundImageCache', false, true); } catch(e) {} })(); </script> <![endif]-->
<title>.NET на практике</title>
<link href='http://team23.ru/favicon.ico' rel='icon' type='image/x-icon'/>
<link href='http://team23.ru/favicon.ico' rel='shortcut icon' type='image/x-icon'/>
<meta content='6c797197b360b7fb' name='yandex-verification'/>
<meta content='5f9a86c7a0743c66' name='y_key'/>
<meta content='3943e85c22f39587' name='y_key'/>
<meta content='d1jc9DPvBXDaHJAjO0BoKBtsW8GsTJSrIHzCrwQiN7E=' name='verify-v1'/>
<link type='text/css' rel='stylesheet' href='http://www.blogger.com/static/v1/widgets/3432093398-widget_css_bundle.css' />
<link type='text/css' rel='stylesheet' href='http://www.google.com/uds/css/gsearch.css' />
<link type="text/css" rel="stylesheet" href="http://www.blogger.com/dyn-css/authorization.css?targetBlogID=6660959344014943110&zx=3c7e9511-1608-4f8a-8282-25f8ed3fce05"/>
<style type="text/css">
#navbar-iframe { display:block }
</style>
<style id='page-skin-1' type='text/css'><!--
/*
-----------------------------------------------
Blogger Template Style
Name:     Minima Stretch
Date:     26 Feb 2004
----------------------------------------------- */
/* Variable definitions
====================
<Variable name="bgcolor" description="Page Background Color"
type="color" default="#fff">
<Variable name="textcolor" description="Text Color"
type="color" default="#333">
<Variable name="linkcolor" description="Link Color"
type="color" default="#58a">
<Variable name="pagetitlecolor" description="Blog Title Color"
type="color" default="#666">
<Variable name="descriptioncolor" description="Blog Description Color"
type="color" default="#999">
<Variable name="titlecolor" description="Post Title Color"
type="color" default="#c60">
<Variable name="bordercolor" description="Border Color"
type="color" default="#ccc">
<Variable name="sidebarcolor" description="Sidebar Title Color"
type="color" default="#999">
<Variable name="sidebartextcolor" description="Sidebar Text Color"
type="color" default="#666">
<Variable name="visitedlinkcolor" description="Visited Link Color"
type="color" default="#999">
<Variable name="bodyfont" description="Text Font"
type="font" default="normal normal 100% Georgia, Serif">
<Variable name="headerfont" description="Sidebar Title Font"
type="font"
default="normal normal 78% 'Trebuchet MS',Trebuchet,Arial,Verdana,Sans-serif">
<Variable name="pagetitlefont" description="Blog Title Font"
type="font"
default="normal normal 200% Georgia, Serif">
<Variable name="descriptionfont" description="Blog Description Font"
type="font"
default="normal normal 78% 'Trebuchet MS', Trebuchet, Arial, Verdana, Sans-serif">
<Variable name="postfooterfont" description="Post Footer Font"
type="font"
default="normal normal 78% 'Trebuchet MS', Trebuchet, Arial, Verdana, Sans-serif">
<Variable name="startSide" description="Start side in blog language"
type="automatic" default="left">
<Variable name="endSide" description="End side in blog language"
type="automatic" default="right">
*/
/* Use this with templates/template-twocol.html */
body {
background:#ffffff;
margin:0;
color:#333333;
font:x-small Georgia Serif;
font-size/* */:/**/small;
font-size: /**/small;
text-align: center;
}
a:link {
color:#5588aa;
text-decoration:none;
}
a:visited {
color:#999999;
text-decoration:none;
}
a:hover {
color:#cc6600;
text-decoration:underline;
}
a img {
border-width:0;
}
/* Header
-----------------------------------------------
*/
#header-wrapper {
margin:0 2% 10px;
border:1px solid #cccccc;
}
#header {
margin: 5px;
border: 1px solid #cccccc;
text-align: center;
color:#666666;
}
#header-inner {
background-position: center;
margin-left: auto;
margin-right: auto;
}
#header h1 {
margin:5px 5px 0;
padding:15px 20px .25em;
line-height:1.2em;
text-transform:uppercase;
letter-spacing:.2em;
font: normal normal 200% Georgia, Serif;
}
#header a {
color:#666666;
text-decoration:none;
}
#header a:hover {
color:#666666;
}
#header .description {
margin:0 5px 5px;
padding:0 20px 15px;
text-transform:uppercase;
letter-spacing:.2em;
line-height: 1.4em;
font: normal normal 78% 'Trebuchet MS', Trebuchet, Arial, Verdana, Sans-serif;
color: #999999;
}
#header img {
margin-left: auto;
margin-right: auto;
}
/* Outer-Wrapper
----------------------------------------------- */
#outer-wrapper {
margin:0;
padding:10px;
text-align:left;
font: normal normal 100% Georgia, Serif;
}
#main-wrapper {
margin-left: 2%;
width: 67%;
float: left;
display: inline;       /* fix for doubling margin in IE */
word-wrap: break-word; /* fix for long text breaking sidebar float in IE */
overflow: hidden;      /* fix for long non-text content breaking IE sidebar float */
}
#sidebar-wrapper {
margin-right: 2%;
width: 25%;
float: right;
display: inline;       /* fix for doubling margin in IE */
word-wrap: break-word; /* fix for long text breaking sidebar float in IE */
overflow: hidden;      /* fix for long non-text content breaking IE sidebar float */
}
/* Headings
----------------------------------------------- */
h2 {
margin:1.5em 0 .75em;
font:normal normal 78% 'Trebuchet MS',Trebuchet,Arial,Verdana,Sans-serif;
line-height: 1.4em;
text-transform:uppercase;
letter-spacing:.2em;
color:#999999;
}
/* Posts
-----------------------------------------------
*/
h2.date-header {
margin:1.5em 0 .5em;
}
.post {
margin:.5em 0 1.5em;
border-bottom:1px dotted #cccccc;
padding-bottom:1.5em;
}
.post h3 {
margin:.25em 0 0;
padding:0 0 4px;
font-size:140%;
font-weight:normal;
line-height:1.4em;
color:#cc6600;
}
.post h3 a, .post h3 a:visited, .post h3 strong {
display:block;
text-decoration:none;
color:#cc6600;
font-weight:normal;
}
.post h3 strong, .post h3 a:hover {
color:#333333;
}
.post-body {
margin:0 0 .75em;
line-height:1.6em;
}
.post-body blockquote {
line-height:1.3em;
}
.post-footer {
margin: .75em 0;
color:#999999;
text-transform:uppercase;
letter-spacing:.1em;
font: normal normal 78% 'Trebuchet MS', Trebuchet, Arial, Verdana, Sans-serif;
line-height: 1.4em;
}
.comment-link {
margin-left:.6em;
}
.post img, table.tr-caption-container {
padding:4px;
border:1px solid #cccccc;
}
.tr-caption-container img {
border: none;
padding: 0;
}
.post blockquote {
margin:1em 20px;
}
.post blockquote p {
margin:.75em 0;
}
/* Comments
----------------------------------------------- */
#comments h4 {
margin:1em 0;
font-weight: bold;
line-height: 1.4em;
text-transform:uppercase;
letter-spacing:.2em;
color: #999999;
}
#comments-block {
margin:1em 0 1.5em;
line-height:1.6em;
}
#comments-block .comment-author {
margin:.5em 0;
}
#comments-block .comment-body {
margin:.25em 0 0;
}
#comments-block .comment-footer {
margin:-.25em 0 2em;
line-height: 1.4em;
text-transform:uppercase;
letter-spacing:.1em;
}
#comments-block .comment-body p {
margin:0 0 .75em;
}
.deleted-comment {
font-style:italic;
color:gray;
}
.feed-links {
clear: both;
line-height: 2.5em;
}
#blog-pager-newer-link {
float: left;
}
#blog-pager-older-link {
float: right;
}
#blog-pager {
text-align: center;
}
/* Sidebar Content
----------------------------------------------- */
.sidebar {
color: #666666;
line-height: 1.5em;
}
.sidebar ul {
list-style:none;
margin:0 0 0;
padding:0 0 0;
}
.sidebar li {
margin:0;
padding-top:0;
padding-right:0;
padding-bottom:.25em;
padding-left:15px;
text-indent:-15px;
line-height:1.5em;
}
.sidebar .widget, .main .widget {
border-bottom:1px dotted #cccccc;
margin:0 0 1.5em;
padding:0 0 1.5em;
}
.main .Blog {
border-bottom-width: 0;
}
/* Profile
----------------------------------------------- */
.profile-img {
float: left;
margin-top: 0;
margin-right: 5px;
margin-bottom: 5px;
margin-left: 0;
padding: 4px;
border: 1px solid #cccccc;
}
.profile-data {
margin:0;
text-transform:uppercase;
letter-spacing:.1em;
font: normal normal 78% 'Trebuchet MS', Trebuchet, Arial, Verdana, Sans-serif;
color: #999999;
font-weight: bold;
line-height: 1.6em;
}
.profile-datablock {
margin:.5em 0 .5em;
}
.profile-textblock {
margin: 0.5em 0;
line-height: 1.6em;
}
.profile-link {
font: normal normal 78% 'Trebuchet MS', Trebuchet, Arial, Verdana, Sans-serif;
text-transform: uppercase;
letter-spacing: .1em;
}
/* Footer
----------------------------------------------- */
#footer {
width:660px;
clear:both;
margin:0 auto;
padding-top:15px;
line-height: 1.6em;
text-transform:uppercase;
letter-spacing:.1em;
text-align: center;
}

--></style>
<script type="text/javascript">(function(){if(-1!=navigator.userAgent.indexOf("Mobile")&&-1!=navigator.userAgent.indexOf("WebKit")&&-1==navigator.userAgent.indexOf("iPad")||-1!=navigator.userAgent.indexOf("Opera Mini")){var a;a:{var b=window.location.href,c=b.split("?");switch(c.length){case 1:a=b+"?m=1";break a;case 2:a=0<=c[1].search("(^|&)m=")?null:b+"&m=1";break a;default:a=null}}a&&window.location.replace(a)};})();
</script><script type="text/javascript">
if (window.jstiming) window.jstiming.load.tick('headEnd');
</script></head>
<body>
<div class='navbar section' id='navbar'><div class='widget Navbar' id='Navbar1'><script type="text/javascript">
    function setAttributeOnload(object, attribute, val) {
      if(window.addEventListener) {
        window.addEventListener("load",
          function(){ object[attribute] = val; }, false);
      } else {
        window.attachEvent('onload', function(){ object[attribute] = val; });
      }
    }
  </script>
<iframe src="http://www.blogger.com/navbar.g?targetBlogID=6660959344014943110&amp;blogName=.NET+%D0%BD%D0%B0+%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B5&amp;publishMode=PUBLISH_MODE_HOSTED&amp;navbarType=LIGHT&amp;layoutType=LAYOUTS&amp;searchRoot=http://blog.team23.ru/search&amp;blogLocale=ru&amp;homepageUrl=http://blog.team23.ru/&amp;vt=-7917893933356055582" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" height="30px" width="100%" id="navbar-iframe" allowtransparency="true" title="Blogger Navigation and Search"></iframe>
<div></div><script type="text/javascript">
(function() {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = '//pagead2.googlesyndication.com/pagead/js/google_top.js';
var head = document.getElementsByTagName('head')[0];
if (head) {
head.appendChild(script);
}})();
</script>
</div></div>
<div id='outer-wrapper'><div id='wrap2'>
<!-- skip links for text browsers -->
<span id='skiplinks' style='display:none;'>
<a href='#main'>skip to main </a> |
      <a href='#sidebar'>skip to sidebar</a>
</span>
<div id='header-wrapper'>
<div class='header section' id='header'><div class='widget Header' id='Header1'>
<div id='header-inner'>
<div class='titlewrapper'>
<h1 class='title'>
.NET на практике
</h1>
</div>
<div class='descriptionwrapper'>
<p class='description'><span>
</span></p>
</div>
</div>
</div></div>
</div>
<div id='content-wrapper'>
<div id='crosscol-wrapper' style='text-align:center'>
<div class='crosscol section' id='crosscol'></div>
</div>
<div id='main-wrapper'>
<div class='main section' id='main'><div class='widget Blog' id='Blog1'>
<div class='blog-posts hfeed'>
<!-- google_ad_section_start(name=default) -->

          <div class="date-outer">
        
<h2 class='date-header'><span>вторник, 24 мая 2011&#160;г.</span></h2>

          <div class="date-posts">
        
<div class='post-outer'>
<div class='post hentry'>
<a name='6209418196454670086'></a>
<h3 class='post-title entry-title'>
<a href='http://blog.team23.ru/2011/05/blog-post.html'>Сводка используемых в последнее время технологий и библиотек</a>
</h3>
<div class='post-header'>
<div class='post-header-line-1'></div>
</div>
<div class='post-body entry-content' id='post-body-6209418196454670086'>
<br />
<ol>
<li>Всё также незаменима библиотека <a href="http://dotnetopenauth.net/">DotNetOpenAuth</a>. OpenID и OAuth в одном флаконе, клиент и сервер.<br />Разнообразные сервисы начинают предоставлять API и авторизацию часто делают именно через OAuth (разных версий, 1.0 и 2.0). Всё покрывает DNOA.</li>
<li>Продолжая тему API - большинство вендоров предоставляют доступ на основе идеологии REST.<br />Мой новый конёк для взаимодействия с такими сервисами - <a href="http://restsharp.org/">RestSharp</a>.</li>
<li>А данные через REST гоняются&nbsp;преимущественно&nbsp;в формате JSON. <a href="http://json.codeplex.com/">Json.NET</a> всё также хорош.</li>
<li>Протокол REST - stateless. Асинхронное взамодействие великолепно кладется на эту парадигму и позволяет на том-же железе обрабатывать бо&#769;льшое количество запросов.<br />Но делать это - сложно и муторно. <a href="http://msdn.microsoft.com/en-us/data/gg577609">Reactive&nbsp;Extensions</a>&nbsp;спешат на помощь!</li>
<li>Да, данные-то надо хранить у себя. Приходят они к нам в JSON, зачем их во что-то конвертировать? Так и будем хранить! Новый тренд - NoSQL, документоориентированные базы данных. Я выбрал <a href="http://www.mongodb.org/">MongoDB</a> и библиотеку <a href="http://normproject.org/">NoRM</a> для доступа из C# (поддержка LINQ в коробке). До сих пор до конца не всё понятно и идеолоигически ясно, но определенно, за этим будущее.</li>
</ol>
А для чего весь этот набор библиотек? Я попробовал и поигрался с разными API сервисов (так ничего практичного и не вышло пока :) ). Весь этот арсенал позволяет свести все технические сложности (большинство ;) ) к минимуму и сосредоточитсья именно на идее/задаче.<br />
<div>
<br /></div>
<div>
Вот лишь небольшой список сервисов, я с которыми я работал:</div>
<div>
<ul>
<li><a href="http://developers.facebook.com/">Facebook</a></li>
<li><a href="http://vkontakte.ru/developers.php">ВКонтакте</a></li>
<li><a href="http://api.mail.ru/docs/guides/restapi/">Мой Мир</a></li>
<li><a href="http://help.yandex.ru/moikrug/?id=1116057">Мой Круг</a></li>
<li><a href="http://api.yandex.ru/fotki/">Яндекс.Фотки</a></li>
<li><a href="http://www.evernote.com/about/developer/api/">Evernote</a></li>
<li><a href="http://wiki.kinobaza.tv/API">Kinobaza</a></li>
</ul>
<br /></div>
<div style='clear: both;'></div>
</div>
<div class='post-footer'>
<div class='post-footer-line post-footer-line-1'><span class='post-author vcard'>
Автор:
<span class='fn'>Vyacheslav Trenogin</span>
</span>
<span class='post-timestamp'>
на
<a class='timestamp-link' href='http://blog.team23.ru/2011/05/blog-post.html' rel='bookmark' title='permanent link'><abbr class='published' title='2011-05-24T15:32:00+04:00'>15:32</abbr></a>
</span>
<span class='post-comment-link'>
<a class='comment-link' href='http://www.blogger.com/comment.g?blogID=6660959344014943110&postID=6209418196454670086' onclick=''>3
коммент.</a>
</span>
<span class='post-icons'>
<span class='item-control blog-admin pid-64611826'>
<a href='http://www.blogger.com/post-edit.g?blogID=6660959344014943110&postID=6209418196454670086&from=pencil' title='Изменить сообщение'>
<img alt='' class='icon-action' height='18' src='http://img2.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/>
</a>
</span>
</span>
<span class='post-backlinks post-comment-link'>
</span>
</div>
<div class='post-footer-line post-footer-line-2'><span class='post-labels'>
Ярлыки:
<a href='http://blog.team23.ru/search/label/.NET' rel='tag'>.NET</a>,
<a href='http://blog.team23.ru/search/label/API' rel='tag'>API</a>,
<a href='http://blog.team23.ru/search/label/Development' rel='tag'>Development</a>,
<a href='http://blog.team23.ru/search/label/libs' rel='tag'>libs</a>
</span>
</div>
<div class='post-footer-line post-footer-line-3'><span class='post-location'>
</span>
</div>
</div>
</div>
</div>

            </div></div>
          

          <div class="date-outer">
        
<h2 class='date-header'><span>четверг, 8 июля 2010&#160;г.</span></h2>

          <div class="date-posts">
        
<div class='post-outer'>
<div class='post hentry'>
<a name='3857979193207719636'></a>
<h3 class='post-title entry-title'>
<a href='http://blog.team23.ru/2010/07/evermap.html'>Evermap &#8212; фотокарта вашего путешествия</a>
</h3>
<div class='post-header'>
<div class='post-header-line-1'></div>
</div>
<div class='post-body entry-content' id='post-body-3857979193207719636'>
<a href="http://evermap.ru">Evermap</a> &#8212; фотокарта вашего путешествия.
<div style='clear: both;'></div>
</div>
<div class='post-footer'>
<div class='post-footer-line post-footer-line-1'><span class='post-author vcard'>
Автор:
<span class='fn'>Vyacheslav Trenogin</span>
</span>
<span class='post-timestamp'>
на
<a class='timestamp-link' href='http://blog.team23.ru/2010/07/evermap.html' rel='bookmark' title='permanent link'><abbr class='published' title='2010-07-08T22:44:00+04:00'>22:44</abbr></a>
</span>
<span class='post-comment-link'>
<a class='comment-link' href='http://www.blogger.com/comment.g?blogID=6660959344014943110&postID=3857979193207719636' onclick=''>0
коммент.</a>
</span>
<span class='post-icons'>
<span class='item-control blog-admin pid-64611826'>
<a href='http://www.blogger.com/post-edit.g?blogID=6660959344014943110&postID=3857979193207719636&from=pencil' title='Изменить сообщение'>
<img alt='' class='icon-action' height='18' src='http://img2.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/>
</a>
</span>
</span>
<span class='post-backlinks post-comment-link'>
</span>
</div>
<div class='post-footer-line post-footer-line-2'><span class='post-labels'>
Ярлыки:
<a href='http://blog.team23.ru/search/label/Team23' rel='tag'>Team23</a>,
<a href='http://blog.team23.ru/search/label/%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B' rel='tag'>Последние работы</a>
</span>
</div>
<div class='post-footer-line post-footer-line-3'><span class='post-location'>
</span>
</div>
</div>
</div>
</div>

            </div></div>
          

          <div class="date-outer">
        
<h2 class='date-header'><span>пятница, 30 апреля 2010&#160;г.</span></h2>

          <div class="date-posts">
        
<div class='post-outer'>
<div class='post hentry'>
<a name='7315769188149716504'></a>
<h3 class='post-title entry-title'>
<a href='http://blog.team23.ru/2010/04/id-openid.html'>ВКонтактеID = ВКонтакте + OpenID</a>
</h3>
<div class='post-header'>
<div class='post-header-line-1'></div>
</div>
<div class='post-body entry-content' id='post-body-7315769188149716504'>
<a href="http://VKontakteID.ru">OpenID провайдер</a> на основе социальной сети <a href="http://vkontakte.ru">ВКонтакте</a>.
<div style='clear: both;'></div>
</div>
<div class='post-footer'>
<div class='post-footer-line post-footer-line-1'><span class='post-author vcard'>
Автор:
<span class='fn'>Vyacheslav Trenogin</span>
</span>
<span class='post-timestamp'>
на
<a class='timestamp-link' href='http://blog.team23.ru/2010/04/id-openid.html' rel='bookmark' title='permanent link'><abbr class='published' title='2010-04-30T18:59:00+04:00'>18:59</abbr></a>
</span>
<span class='post-comment-link'>
<a class='comment-link' href='http://www.blogger.com/comment.g?blogID=6660959344014943110&postID=7315769188149716504' onclick=''>1 коммент.</a>
</span>
<span class='post-icons'>
<span class='item-control blog-admin pid-64611826'>
<a href='http://www.blogger.com/post-edit.g?blogID=6660959344014943110&postID=7315769188149716504&from=pencil' title='Изменить сообщение'>
<img alt='' class='icon-action' height='18' src='http://img2.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/>
</a>
</span>
</span>
<span class='post-backlinks post-comment-link'>
</span>
</div>
<div class='post-footer-line post-footer-line-2'><span class='post-labels'>
Ярлыки:
<a href='http://blog.team23.ru/search/label/OpenId' rel='tag'>OpenId</a>,
<a href='http://blog.team23.ru/search/label/Team23' rel='tag'>Team23</a>,
<a href='http://blog.team23.ru/search/label/%D0%92%D0%9A%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D0%B5' rel='tag'>ВКонтакте</a>,
<a href='http://blog.team23.ru/search/label/%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B' rel='tag'>Последние работы</a>
</span>
</div>
<div class='post-footer-line post-footer-line-3'><span class='post-location'>
</span>
</div>
</div>
</div>
</div>

            </div></div>
          

          <div class="date-outer">
        
<h2 class='date-header'><span>суббота, 24 октября 2009&#160;г.</span></h2>

          <div class="date-posts">
        
<div class='post-outer'>
<div class='post hentry'>
<a name='8830451037498874270'></a>
<h3 class='post-title entry-title'>
<a href='http://blog.team23.ru/2009/10/amazon-aws-service-wcf-mutual.html'>Amazon AWS Service WCF Mutual Certificate authentication - fail</a>
</h3>
<div class='post-header'>
<div class='post-header-line-1'></div>
</div>
<div class='post-body entry-content' id='post-body-8830451037498874270'>
Придется пользоваться старым вариантом, на WSE 3.0
<div style='clear: both;'></div>
</div>
<div class='post-footer'>
<div class='post-footer-line post-footer-line-1'><span class='post-author vcard'>
Автор:
<span class='fn'>Vyacheslav Trenogin</span>
</span>
<span class='post-timestamp'>
на
<a class='timestamp-link' href='http://blog.team23.ru/2009/10/amazon-aws-service-wcf-mutual.html' rel='bookmark' title='permanent link'><abbr class='published' title='2009-10-24T13:06:00+04:00'>13:06</abbr></a>
</span>
<span class='post-comment-link'>
<a class='comment-link' href='http://www.blogger.com/comment.g?blogID=6660959344014943110&postID=8830451037498874270' onclick=''>0
коммент.</a>
</span>
<span class='post-icons'>
<span class='item-control blog-admin pid-64611826'>
<a href='http://www.blogger.com/post-edit.g?blogID=6660959344014943110&postID=8830451037498874270&from=pencil' title='Изменить сообщение'>
<img alt='' class='icon-action' height='18' src='http://img2.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/>
</a>
</span>
</span>
<span class='post-backlinks post-comment-link'>
</span>
</div>
<div class='post-footer-line post-footer-line-2'><span class='post-labels'>
Ярлыки:
<a href='http://blog.team23.ru/search/label/Development' rel='tag'>Development</a>
</span>
</div>
<div class='post-footer-line post-footer-line-3'><span class='post-location'>
</span>
</div>
</div>
</div>
</div>

            </div></div>
          

          <div class="date-outer">
        
<h2 class='date-header'><span>воскресенье, 14 июня 2009&#160;г.</span></h2>

          <div class="date-posts">
        
<div class='post-outer'>
<div class='post hentry'>
<a name='3710963217449916146'></a>
<h3 class='post-title entry-title'>
<a href='http://blog.team23.ru/2009/06/t4.html'>Кодогенерация T4</a>
</h3>
<div class='post-header'>
<div class='post-header-line-1'></div>
</div>
<div class='post-body entry-content' id='post-body-3710963217449916146'>
Нет, это не про Терминатора :)<br />
Это про использование T4 Text Template Transformation Toolkit, встроенного в Visual Studio 2008 для автоматической генерации кода.<br />
Кратко задача &#8211; есть исходники. Опять-то таки сгенерированные, но другим инструментом, <a href="http://incubator.apache.org/thrift/">Thrift</a>.     <br />
Код на C#, публичные поля и свойства в классах с одинаковым именем, только различаются регистром.     <br />
Код необходимо использовать из VB.NET. Упс! VB.NET нечувствителен к регистру! Приплыли.<br />
Исходники конечно есть, но они регулярно обновляются &#8211; так что их исправлять нельзя.    <br />
Классы не помечены partial &#8211; расширить напрямую тоже нельзя. <br />
Но у нас же есть extension методы &#8211; спасибо .NET 3.5! Можно понаписать методов (эх&#8230; пока только методы, эктеншен свойств нет) с названием совпадающим со свойствами, но с каким-нибудь префиксом, подчеркиванием например. <br />
Ок, хорошо. Но вручную писать обертки на 20 классов?! Да они еще, как я сказал, могут обновиться в будущем. Тут нужна автоматизация&#8230; И в VS 2008 она уже встроена &#8211; движок кодогенерации T4.<br />
Файлы с расширением tt. Синтаксис очень похож на ASP.NET, только исполняются внутри Visual Studio (и не только, хостом может выступать любое приложение, и ваше в том числе).<br />
И вот всё волшебство:<br />
<div class="wlWriterEditableSmartContent" id="scid:2EC9848E-067D-4e79-BAB7-06CA927DB962:d3eb45f9-2c38-4499-b0a0-7733d996ee1d" style="display: inline; float: none; margin: 0; padding: 0;">
<div style="font-family: consolas,lucida console,courier,monospace;">
<br />
&lt;#@&nbsp;template&nbsp;language=<span style="color: #a31515;">"C#v3.5"</span>&nbsp;hostspecific=<span style="color: #a31515;">"true"</span>&nbsp;#&gt;<br />
&lt;#@&nbsp;assembly&nbsp;name=<span style="color: #a31515;">"EDAM.dll"</span>&nbsp;#&gt;<br />
&lt;#@&nbsp;assembly&nbsp;name=<span style="color: #a31515;">"System.Core"</span>&nbsp;#&gt;<br />
&lt;#@&nbsp;import&nbsp;namespace=<span style="color: #a31515;">"System.CodeDom"</span>&nbsp;#&gt;<br />
&lt;#@&nbsp;import&nbsp;namespace=<span style="color: #a31515;">"System.CodeDom.Compiler"</span>&nbsp;#&gt;<br />
&lt;#@&nbsp;import&nbsp;namespace=<span style="color: #a31515;">"System.IO"</span>&nbsp;#&gt;<br />
&lt;#@&nbsp;import&nbsp;namespace=<span style="color: #a31515;">"System.Linq"</span>&nbsp;#&gt;<br />
&lt;#@&nbsp;import&nbsp;namespace=<span style="color: #a31515;">"System.Reflection"</span>&nbsp;#&gt;<br />
&lt;#@&nbsp;import&nbsp;namespace=<span style="color: #a31515;">"Evernote.EDAM.Type"</span>&nbsp;#&gt;<br />
<br />
<span style="color: green;">//&nbsp;Autogenerated&nbsp;by&nbsp;&lt;#=&nbsp;Host.GetType()&nbsp;#&gt;<br />
//&nbsp;&lt;#=&nbsp;DateTime.Now&nbsp;#&gt;<br />
//&nbsp;DO&nbsp;NOT&nbsp;EDIT&nbsp;UNLESS&nbsp;YOU&nbsp;ARE&nbsp;SURE&nbsp;THAT&nbsp;YOU&nbsp;KNOW&nbsp;WHAT&nbsp;YOU&nbsp;ARE&nbsp;DOING<br />
</span><br />
<span style="color: blue;">namespace</span>&nbsp;Evernote.EDAM.Type<br />
<span style="color: blue;">{</span><br />
&lt;#&nbsp;<span style="color: blue;">foreach</span>&nbsp;(var&nbsp;@class&nbsp;<span style="color: blue;">in</span>&nbsp;Assembly.GetAssembly(BaseClass)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.GetExportedTypes()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Where(type&nbsp;=&gt;&nbsp;!type.IsNested)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Where(type&nbsp;=&gt;&nbsp;type.Namespace&nbsp;==&nbsp;BaseClass.Namespace))&nbsp;<span style="color: blue;">{</span>&nbsp;#&gt;<br />
&nbsp;&nbsp;<span style="color: blue;">public</span>&nbsp;<span style="color: blue;">static</span>&nbsp;<span style="color: blue;">class</span>&nbsp;&lt;#=&nbsp;<span style="color: #2b91af;">@class</span>.Name&nbsp;#&gt;Ex<br />
&nbsp;&nbsp;<span style="color: blue;">{</span><br />
&nbsp;&nbsp;&lt;#&nbsp;<span style="color: blue;">foreach</span>&nbsp;(var&nbsp;prop&nbsp;<span style="color: blue;">in</span>&nbsp;@class.GetProperties())&nbsp;<span style="color: blue;">{</span>&nbsp;#&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">public</span>&nbsp;<span style="color: blue;">static</span>&nbsp;&lt;#=&nbsp;PrintType(prop.PropertyType)&nbsp;#&gt;&nbsp;_&lt;#=&nbsp;prop.Name&nbsp;#&gt;(<span style="color: blue;">this</span>&nbsp;&lt;#=&nbsp;prop.DeclaringType&nbsp;#&gt;&nbsp;<span style="color: blue;">value</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">return</span>&nbsp;<span style="color: blue;">value</span>.&lt;#=&nbsp;prop.Name&nbsp;#&gt;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">}</span><br />
&nbsp;&nbsp;&lt;#&nbsp;<span style="color: blue;">}</span>#&gt;<br />
&nbsp;&nbsp;<span style="color: blue;">}</span><br />
&lt;#&nbsp;<span style="color: blue;">}</span>&nbsp;#&gt;<br />
<span style="color: blue;">}</span><br />
&lt;#+&nbsp;Type&nbsp;BaseClass&nbsp;=&nbsp;<span style="color: blue;">typeof</span>(Note);&nbsp;#&gt;<br />
&lt;#+<br />
<span style="color: blue;">public</span>&nbsp;<span style="color: #2b91af;">string</span>&nbsp;PrintType(Type&nbsp;type)<br />
<span style="color: blue;">{</span><br />
&nbsp;&nbsp;var&nbsp;typeExpr&nbsp;=&nbsp;<span style="color: blue;">new</span>&nbsp;CodeTypeReferenceExpression(type);<br />
&nbsp;&nbsp;var&nbsp;csProvider&nbsp;=&nbsp;Microsoft.CSharp.CSharpCodeProvider.CreateProvider(<span style="color: #a31515;">"C#"</span>);<br />
&nbsp;&nbsp;var&nbsp;writer&nbsp;=&nbsp;<span style="color: blue;">new</span>&nbsp;StringWriter();<br />
&nbsp;&nbsp;csProvider.GenerateCodeFromExpression(typeExpr,&nbsp;writer,&nbsp;<span style="color: blue;">new</span>&nbsp;CodeGeneratorOptions());<br />
&nbsp;&nbsp;<span style="color: blue;">return</span>&nbsp;writer.ToString();<br />
<span style="color: blue;">}</span>&nbsp;#&gt;</div>
<br /></div>
<br />
Вкратце, по шагам:<br />
<ol>
<li>Перебираем все классы из сборки, из нужного пространства имен. </li>
<li>Для каждого класса генерируем статический класс с таким-же именем и суффиксом Ex. </li>
<li>Перебираем все свойства класса. </li>
<li>Генерируем экстеншен-метод нужного типа с именем как оригинальное ствойство, но с префиксом _. </li>
<li>Для генерация имени нужного типа используется маленькая хитрость. Так как по простому дженерики будут выводиться в IL-нотации, т.е. например System.Generic.List&#8217;1[System.String]. И это не будет компилироваться. Надо System.Generic.List&lt;System.String&gt; (для C#). Что и делается через CodeDom. Так как сборка на C# &#8211; то и провайдер для C# используется. Можно генерировать и в VB. Как в CodeDom, так и в самом T4 кстати. </li>
</ol>
Всё, теперь при сборке будет генерироваться набор расширений для каждого нужного класса с методами дублирующими все свойства, которые уже без проблем можно использовать в VB.NET. Кстати, в VB можно опускать скобки при вызове метода, если он не принимает параметров, что делает код еще более изящным (насколько вообще можно говорить об изящности в этой ситуации):<br />
<div class="wlWriterEditableSmartContent" id="scid:2EC9848E-067D-4e79-BAB7-06CA927DB962:e238fdcf-d975-4f06-92b8-0272810f9f0b" style="display: inline; float: none; margin: 0; padding: 0;">
<div style="font-family: consolas,lucida console,courier,monospace;">
<br />
C#&nbsp;note.Attributes.Lattitude</div>
<br /></div>
<div class="wlWriterEditableSmartContent" id="scid:2EC9848E-067D-4e79-BAB7-06CA927DB962:54c7692f-84fa-4c6e-8906-fa5768c8f99f" style="display: inline; float: none; margin: 0; padding: 0;">
<div style="font-family: consolas,lucida console,courier,monospace;">
<br />
VB.NET&nbsp;note._Attributes._Lattitude</div>
<br /></div>
<br />
Полезные ссылки:<br />
<ul>
<li><a href="http://www.olegsych.com/2007/12/text-template-transformation-toolkit/">T4: Text Template Transformation Toolkit</a> </li>
<li><a href="http://msdn.microsoft.com/en-us/library/bb126445(v=vs.80).aspx">Generating Artifacts By Using Text Templates</a> (раздел в MSDN) </li>
<li><a href="http://www.visualt4.com/">Visual T4</a> (плагин для редактирования файлов tt с подсветкой) </li>
</ul>
<div style='clear: both;'></div>
</div>
<div class='post-footer'>
<div class='post-footer-line post-footer-line-1'><span class='post-author vcard'>
Автор:
<span class='fn'>Vyacheslav Trenogin</span>
</span>
<span class='post-timestamp'>
на
<a class='timestamp-link' href='http://blog.team23.ru/2009/06/t4.html' rel='bookmark' title='permanent link'><abbr class='published' title='2009-06-14T00:56:00+04:00'>0:56</abbr></a>
</span>
<span class='post-comment-link'>
<a class='comment-link' href='http://www.blogger.com/comment.g?blogID=6660959344014943110&postID=3710963217449916146' onclick=''>0
коммент.</a>
</span>
<span class='post-icons'>
<span class='item-control blog-admin pid-64611826'>
<a href='http://www.blogger.com/post-edit.g?blogID=6660959344014943110&postID=3710963217449916146&from=pencil' title='Изменить сообщение'>
<img alt='' class='icon-action' height='18' src='http://img2.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/>
</a>
</span>
</span>
<span class='post-backlinks post-comment-link'>
</span>
</div>
<div class='post-footer-line post-footer-line-2'><span class='post-labels'>
Ярлыки:
<a href='http://blog.team23.ru/search/label/.NET' rel='tag'>.NET</a>,
<a href='http://blog.team23.ru/search/label/.NET%203.5' rel='tag'>.NET 3.5</a>,
<a href='http://blog.team23.ru/search/label/Code%20Generation' rel='tag'>Code Generation</a>,
<a href='http://blog.team23.ru/search/label/CodeDom' rel='tag'>CodeDom</a>,
<a href='http://blog.team23.ru/search/label/Development' rel='tag'>Development</a>,
<a href='http://blog.team23.ru/search/label/evernote' rel='tag'>evernote</a>,
<a href='http://blog.team23.ru/search/label/T4' rel='tag'>T4</a>,
<a href='http://blog.team23.ru/search/label/VB.NET' rel='tag'>VB.NET</a>,
<a href='http://blog.team23.ru/search/label/%D0%9A%D0%BE%D0%B4%D0%BE%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F' rel='tag'>Кодогенерация</a>
</span>
</div>
<div class='post-footer-line post-footer-line-3'><span class='post-location'>
</span>
</div>
</div>
</div>
</div>

            </div></div>
          

          <div class="date-outer">
        
<h2 class='date-header'><span>пятница, 15 мая 2009&#160;г.</span></h2>

          <div class="date-posts">
        
<div class='post-outer'>
<div class='post hentry'>
<a name='7887576813881970750'></a>
<h3 class='post-title entry-title'>
<a href='http://blog.team23.ru/2009/05/api.html'>Яндекс.Фотки API</a>
</h3>
<div class='post-header'>
<div class='post-header-line-1'></div>
</div>
<div class='post-body entry-content' id='post-body-7887576813881970750'>
<a href="http://fotki.yandex.ru">Яндекс.Фотки</a> наконец-то открыли официальный <a href="http://api.yandex.ru/fotki/">API</a>. Базирован на AtomPub.<br/>Решил перевести существующие решения для Яндекс.Фоток на него (<a href="http://team23.ru/picasa.html" title="Яндекс.Фотки для Picasa">Picasa</a>, <a href="http://team23.ru/yaArchive.html" title="Яндекс.Фотки Архив">Архив</a>, <a href="http://team23.ru/fotki.html" title="Яндекс.Фотки для Windows Live Writer">WLW</a>, <a href="http://team23.ru/PhotoGallery.html" title="Яндекс.Фотки для Фотоальбома Windows Live">WLPG</a>).<br/><br/>Для работы с AtomPub в .NET попробовал несколько вариантов:<br/><ol><br/>	<li>System.ServiceModel.Syndication из .NET 3.5<br/>Базовые сущности ServiceDocument, AtomFeed, AtomEntry.<br/>Но все изменяющие операции (Insert, Update, Delete) приходится делать врукопашную, через WebRequest.<br/></li><br/>	<li>Microsoft.Web.AtomPub<br/>Небольшая надстройка над первым пунктом из <a href="http://dev.live.com/liveframework/">Live Framework SDK</a>. Негибкая, на некоторых операциях с сервером от Яндекса давится.<br/></li><br/>	<li><a href="http://atomsite.net/">AtomSite</a><br/>Как оказалось, это серверная имплементация AtomPub, не клиент.<br/></li><br/>	<li><a href="http://code.google.com/p/google-gdata/">GData .NET Client Library</a><br/>Предназначается для работы с сервисами Гугла, но есть базовая библиотека для работы с AtomPub, непривязанная к особенностям Гугла. Немного перегружена, но довольна гибкая и в исходниках!<br/></li><br/></ol><br/><br/>После экспериментов остановился на последнем. Очень мне нравится конвергенция в современном мире - я объединяю двух непримиримых конкурентов.<br/><br/><div style="background-color:#f4f4f4;font-family:Consolas, 'Courier New', Courier, Monospace;font-size:8pt;line-height:12pt;border:solid 1px gray;cursor:text;max-height:200px;overflow:auto;width:97.5%;margin:20px 0 10px;padding:4px;"><div style="background-color:#f4f4f4;font-family:Consolas, 'Courier New', Courier, Monospace;font-size:8pt;line-height:12pt;color:black;overflow:visible;width:100%;border-style:none;padding:0;"><br/><pre style="font-family:Consolas, 'Courier New', Courier, Monospace;font-size:8pt;line-height:12pt;color:black;overflow:visible;width:100%;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">namespace</span> Team23.YandexFotki</pre><pre style="background-color:#f4f4f4;font-family:Consolas, 'Courier New', Courier, Monospace;font-size:8pt;line-height:12pt;color:black;overflow:visible;width:100%;border-style:none;margin:0;padding:0;">{</pre><pre style="font-family:Consolas, 'Courier New', Courier, Monospace;font-size:8pt;line-height:12pt;color:black;overflow:visible;width:100%;background-color:white;border-style:none;margin:0;padding:0;">  <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> YaDataRequest : GDataRequest</pre><pre style="background-color:#f4f4f4;font-family:Consolas, 'Courier New', Courier, Monospace;font-size:8pt;line-height:12pt;color:black;overflow:visible;width:100%;border-style:none;margin:0;padding:0;">  {</pre><pre style="font-family:Consolas, 'Courier New', Courier, Monospace;font-size:8pt;line-height:12pt;color:black;overflow:visible;width:100%;background-color:white;border-style:none;margin:0;padding:0;">    ...</pre><pre style="background-color:#f4f4f4;font-family:Consolas, 'Courier New', Courier, Monospace;font-size:8pt;line-height:12pt;color:black;overflow:visible;width:100%;border-style:none;margin:0;padding:0;">  }</pre><pre style="font-family:Consolas, 'Courier New', Courier, Monospace;font-size:8pt;line-height:12pt;color:black;overflow:visible;width:100%;background-color:white;border-style:none;margin:0;padding:0;">}</pre></div></div>
<div style='clear: both;'></div>
</div>
<div class='post-footer'>
<div class='post-footer-line post-footer-line-1'><span class='post-author vcard'>
Автор:
<span class='fn'>Vyacheslav Trenogin</span>
</span>
<span class='post-timestamp'>
на
<a class='timestamp-link' href='http://blog.team23.ru/2009/05/api.html' rel='bookmark' title='permanent link'><abbr class='published' title='2009-05-15T03:06:00+04:00'>3:06</abbr></a>
</span>
<span class='post-comment-link'>
<a class='comment-link' href='http://www.blogger.com/comment.g?blogID=6660959344014943110&postID=7887576813881970750' onclick=''>0
коммент.</a>
</span>
<span class='post-icons'>
<span class='item-control blog-admin pid-64611826'>
<a href='http://www.blogger.com/post-edit.g?blogID=6660959344014943110&postID=7887576813881970750&from=pencil' title='Изменить сообщение'>
<img alt='' class='icon-action' height='18' src='http://img2.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/>
</a>
</span>
</span>
<span class='post-backlinks post-comment-link'>
</span>
</div>
<div class='post-footer-line post-footer-line-2'><span class='post-labels'>
Ярлыки:
<a href='http://blog.team23.ru/search/label/.NET' rel='tag'>.NET</a>,
<a href='http://blog.team23.ru/search/label/.NET%203.5' rel='tag'>.NET 3.5</a>,
<a href='http://blog.team23.ru/search/label/API' rel='tag'>API</a>,
<a href='http://blog.team23.ru/search/label/AtomPub' rel='tag'>AtomPub</a>,
<a href='http://blog.team23.ru/search/label/Development' rel='tag'>Development</a>,
<a href='http://blog.team23.ru/search/label/Team%2023' rel='tag'>Team 23</a>,
<a href='http://blog.team23.ru/search/label/%D0%AF%D0%BD%D0%B4%D0%B5%D0%BA%D1%81.%D0%A4%D0%BE%D1%82%D0%BA%D0%B8' rel='tag'>Яндекс.Фотки</a>
</span>
</div>
<div class='post-footer-line post-footer-line-3'><span class='post-location'>
</span>
</div>
</div>
</div>
</div>

            </div></div>
          

          <div class="date-outer">
        
<h2 class='date-header'><span>воскресенье, 3 мая 2009&#160;г.</span></h2>

          <div class="date-posts">
        
<div class='post-outer'>
<div class='post hentry'>
<a name='4551218060658887891'></a>
<h3 class='post-title entry-title'>
<a href='http://blog.team23.ru/2009/05/blog-post_9352.html'>Визуальный поиск по книгам с учетом русской морфологии.</a>
</h3>
<div class='post-header'>
<div class='post-header-line-1'></div>
</div>
<div class='post-body entry-content' id='post-body-4551218060658887891'>
<a href="http://book23.ru">Вся информация</a>: название, обложка, издательство, год выпуска, цены - не отрываясь от поля поиска.
<div style='clear: both;'></div>
</div>
<div class='post-footer'>
<div class='post-footer-line post-footer-line-1'><span class='post-author vcard'>
Автор:
<span class='fn'>Vyacheslav Trenogin</span>
</span>
<span class='post-timestamp'>
на
<a class='timestamp-link' href='http://blog.team23.ru/2009/05/blog-post_9352.html' rel='bookmark' title='permanent link'><abbr class='published' title='2009-05-03T20:59:00+04:00'>20:59</abbr></a>
</span>
<span class='post-comment-link'>
<a class='comment-link' href='http://www.blogger.com/comment.g?blogID=6660959344014943110&postID=4551218060658887891' onclick=''>1 коммент.</a>
</span>
<span class='post-icons'>
<span class='item-control blog-admin pid-64611826'>
<a href='http://www.blogger.com/post-edit.g?blogID=6660959344014943110&postID=4551218060658887891&from=pencil' title='Изменить сообщение'>
<img alt='' class='icon-action' height='18' src='http://img2.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/>
</a>
</span>
</span>
<span class='post-backlinks post-comment-link'>
</span>
</div>
<div class='post-footer-line post-footer-line-2'><span class='post-labels'>
Ярлыки:
<a href='http://blog.team23.ru/search/label/books' rel='tag'>books</a>,
<a href='http://blog.team23.ru/search/label/Team23' rel='tag'>Team23</a>,
<a href='http://blog.team23.ru/search/label/%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8' rel='tag'>книги</a>,
<a href='http://blog.team23.ru/search/label/%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B' rel='tag'>Последние работы</a>
</span>
</div>
<div class='post-footer-line post-footer-line-3'><span class='post-location'>
</span>
</div>
</div>
</div>
</div>

        </div></div>
      
<!-- google_ad_section_end -->
</div>
<div class='blog-pager' id='blog-pager'>
<span id='blog-pager-older-link'>
<a class='blog-pager-older-link' href='http://blog.team23.ru/search?updated-max=2009-05-03T20:59:00%2B04:00&max-results=7' id='Blog1_blog-pager-older-link' title='Предыдущие'>Предыдущие</a>
</span>
<a class='home-link' href='http://blog.team23.ru/'>Главная страница</a>
</div>
<div class='clear'></div>
<div class='blog-feeds'>
<div class='feed-links'>
Подписаться на:
<a class='feed-link' href='http://blog.team23.ru/feeds/posts/default' target='_blank' type='application/atom+xml'>Сообщения (Atom)</a>
</div>
</div>
</div></div>
</div>
<div id='sidebar-wrapper'>
<div class='sidebar section' id='sidebar'><div class='widget CustomSearch' id='CustomSearch1'>
<h2 class='title'>Поиск</h2>
<div class='widget-content'>
<div id='CustomSearch1_form'>
<span class='cse-status'>Загрузка...</span>
</div>
</div>
<style type='text/css'>
      #uds-searchControl .gs-result .gs-title,
      #uds-searchControl .gs-result .gs-title *,
      #uds-searchControl .gsc-results .gsc-trailing-more-results,
      #uds-searchControl .gsc-results .gsc-trailing-more-results * {
        color:#5588aa;
      }

      #uds-searchControl .gs-result .gs-title a:visited,
      #uds-searchControl .gs-result .gs-title a:visited * {
        color:#999999;
      }

      #uds-searchControl .gs-relativePublishedDate,
      #uds-searchControl .gs-publishedDate {
        color: #999999;
      }

      #uds-searchControl .gs-result a.gs-visibleUrl,
      #uds-searchControl .gs-result .gs-visibleUrl {
        color: #cc6600;
      }

      #uds-searchControl .gsc-results {
        border-color: #cccccc;
        background-color: #ffffff;
      }

      #uds-searchControl .gsc-tabhActive {
        border-color: #cccccc;
        border-top-color: #cc6600;
        background-color: #ffffff;
        color: #333333;
      }

      #uds-searchControl .gsc-tabhInactive {
        border-color: #cccccc;
        background-color: transparent;
        color: #5588aa;
      }

      #uds-searchClearResults {
        border-color: #cccccc;
      }

      #uds-searchClearResults:hover {
        border-color: #cc6600;
      }

      #uds-searchControl .gsc-cursor-page {
        color: #5588aa;
      }

      #uds-searchControl .gsc-cursor-current-page {
        color: #333333;
      }
    </style>
<div class='clear'></div>
<span class='widget-item-control'>
<span class='item-control blog-admin'>
<a class='quickedit' href='http://www.blogger.com/rearrange?blogID=6660959344014943110&widgetType=CustomSearch&widgetId=CustomSearch1&action=editWidget&sectionId=sidebar' onclick='return _WidgetManager._PopupConfig(document.getElementById("CustomSearch1"));' target='configCustomSearch1' title='Изменить'>
<img alt='' height='18' src='http://img1.blogblog.com/img/icon18_wrench_allbkg.png' width='18'/>
</a>
</span>
</span>
<div class='clear'></div>
</div><div class='widget Gadget' id='Gadget1'>
<div class='widget-content'>
<script type="text/javascript">
        if (!window.gadgets || !gadgets.rpc) {
          document.write('<script type="text/javascript"' +
                  'src="//www-blogger-opensocial.googleusercontent.com/gadgets/js/rpc.js?container\x3dblogger\x26nocache\x3d0\x26debug\x3d0\x26c\x3d1\x26v\x3dea8289bd3846c57bd64db8aa8a3f2928\x26sv\x3d9">' +
                  '</scr' + 'ipt>');
        }
      </script>
<script type="text/javascript">
    
    function registerGetBlogUrls() {
      gadgets.rpc.register('getBlogUrls', function() {
        var holder = {};
        
          
          
          
            holder.postFeed = "http://www.blogger.com/feeds/6660959344014943110/posts/default";
          
          
          
            holder.commentFeed = "http://www.blogger.com/feeds/6660959344014943110/comments/default";
          
          holder.currentBlogUrl = "http://blog.team23.ru/";
          holder.currentBlogId = "6660959344014943110";
        
        return holder;
      });
    }
  </script>
<script type="text/javascript">
  if (!window.registeredCommonBloggerCallbacks) {
    window.registeredCommonBloggerCallbacks = true;

    gadgets.rpc.register('resize_iframe', function(height) {
      var el = document.getElementById(this['f']);
      if (el) {
        el.style.height = height + 'px';
      }
    });

    
    gadgets.rpc.register('set_pref', function() {});

    registerGetBlogUrls();
  }
  </script>
<iframe src="//www-blogger-opensocial.googleusercontent.com/gadgets/ifr?url=http://addthis-widget.googlecode.com/svn/trunk/addthis-share.xml&amp;container=blogger&amp;view=default&amp;lang=ru&amp;country=ALL&amp;sanitize=0&amp;v=b6b997c283318ba6&amp;libs=core:dynamic-height&amp;parent=http://blog.team23.ru/&amp;up_pubid=derigel&amp;up_fbtw=0&amp;up_clickback=1&amp;up_size=32&amp;mid=1#up_fbtw=0&amp;up_clickback=1&amp;up_copytracking=false&amp;up_size=32&amp;up_pubid=derigel&amp;st=e%3DAFlCd0WZeMWz%252FZwzp%252FIgCIq7ZREb3IWS4T1TOI8Hdns2C%252FdKcv3KrTPi%252FMjmkJ0WP%252Fim5JSgKf%252FqY6vbSGp2%252FSO48IS%252BwrVb0FxlD2w9mnGwqEfqJwdteUJOA%252BTRXIW1d4rrzWW6Q4DR%26c%3Dblogger&amp;rpctoken=-6762960758276058882" frameborder="0" style="width: 100%; display: block" height="200" id="sidebar-gadget1" name="sidebar-gadget1"></iframe>
<script type="text/javascript">
        gadgets.rpc.setRelayUrl("sidebar-gadget1", '//www-blogger-opensocial.googleusercontent.com/gadgets/files/container/rpc_relay.html');
        gadgets.rpc.setAuthToken("sidebar-gadget1", "-6762960758276058882");
      </script>
</div>
<div class='clear'></div>
<span class='widget-item-control'>
<span class='item-control blog-admin'>
<a class='quickedit' href='http://www.blogger.com/rearrange?blogID=6660959344014943110&widgetType=Gadget&widgetId=Gadget1&action=editWidget&sectionId=sidebar' onclick='return _WidgetManager._PopupConfig(document.getElementById("Gadget1"));' target='configGadget1' title='Изменить'>
<img alt='' height='18' src='http://img1.blogblog.com/img/icon18_wrench_allbkg.png' width='18'/>
</a>
</span>
</span>
<div class='clear'></div>
</div><div class='widget Subscribe' id='Subscribe1'>
<div style='white-space:nowrap'>
<h2 class='title'>Подпишитесь</h2>
<div class='widget-content'>
<div class='subscribe-wrapper subscribe-type-POST'>
<div class='subscribe expanded subscribe-type-POST' id='SW_READER_LIST_Subscribe1POST' style='display:none;'>
<div class='top'>
<span class='inner' onclick='return(_SW_toggleReaderList(event, "Subscribe1POST"));'>
<img class='subscribe-dropdown-arrow' src='http://img2.blogblog.com/img/widgets/arrow_dropdown.gif'/>
<img align='absmiddle' alt='' border='0' class='feed-icon' src='http://img1.blogblog.com/img/icon_feed12.png'/>
Сообщения
</span>
<div class='feed-reader-links'>
<a class='feed-reader-link' href='http://www.google.com/ig/add?source=bstp&feedurl=http%3A%2F%2Fblog.team23.ru%2Ffeeds%2Fposts%2Fdefault' target='_blank'>
<img src='http://img1.blogblog.com/img/widgets/subscribe-google.png'/>
</a>
<a class='feed-reader-link' href='http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fblog.team23.ru%2Ffeeds%2Fposts%2Fdefault' target='_blank'>
<img src='http://img1.blogblog.com/img/widgets/subscribe-netvibes.png'/>
</a>
<a class='feed-reader-link' href='http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fblog.team23.ru%2Ffeeds%2Fposts%2Fdefault' target='_blank'>
<img src='http://img1.blogblog.com/img/widgets/subscribe-newsgator.png'/>
</a>
<a class='feed-reader-link' href='http://add.my.yahoo.com/content?url=http%3A%2F%2Fblog.team23.ru%2Ffeeds%2Fposts%2Fdefault' target='_blank'>
<img src='http://img1.blogblog.com/img/widgets/subscribe-yahoo.png'/>
</a>
<a class='feed-reader-link' href='http://blog.team23.ru/feeds/posts/default' target='_blank'>
<img align='absmiddle' class='feed-icon' src='http://img1.blogblog.com/img/icon_feed12.png'/>
                Atom
              </a>
</div>
</div>
<div class='bottom'></div>
</div>
<div class='subscribe' id='SW_READER_LIST_CLOSED_Subscribe1POST' onclick='return(_SW_toggleReaderList(event, "Subscribe1POST"));'>
<div class='top'>
<span class='inner'>
<img class='subscribe-dropdown-arrow' src='http://img2.blogblog.com/img/widgets/arrow_dropdown.gif'/>
<span onclick='return(_SW_toggleReaderList(event, "Subscribe1POST"));'>
<img align='absmiddle' alt='' border='0' class='feed-icon' src='http://img1.blogblog.com/img/icon_feed12.png'/>
Сообщения
</span>
</span>
</div>
<div class='bottom'></div>
</div>
</div>
<div class='subscribe-wrapper subscribe-type-COMMENT'>
<div class='subscribe expanded subscribe-type-COMMENT' id='SW_READER_LIST_Subscribe1COMMENT' style='display:none;'>
<div class='top'>
<span class='inner' onclick='return(_SW_toggleReaderList(event, "Subscribe1COMMENT"));'>
<img class='subscribe-dropdown-arrow' src='http://img2.blogblog.com/img/widgets/arrow_dropdown.gif'/>
<img align='absmiddle' alt='' border='0' class='feed-icon' src='http://img1.blogblog.com/img/icon_feed12.png'/>
Все комментарии
</span>
<div class='feed-reader-links'>
<a class='feed-reader-link' href='http://www.google.com/ig/add?source=bstp&feedurl=http%3A%2F%2Fblog.team23.ru%2Ffeeds%2Fcomments%2Fdefault' target='_blank'>
<img src='http://img1.blogblog.com/img/widgets/subscribe-google.png'/>
</a>
<a class='feed-reader-link' href='http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fblog.team23.ru%2Ffeeds%2Fcomments%2Fdefault' target='_blank'>
<img src='http://img1.blogblog.com/img/widgets/subscribe-netvibes.png'/>
</a>
<a class='feed-reader-link' href='http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fblog.team23.ru%2Ffeeds%2Fcomments%2Fdefault' target='_blank'>
<img src='http://img1.blogblog.com/img/widgets/subscribe-newsgator.png'/>
</a>
<a class='feed-reader-link' href='http://add.my.yahoo.com/content?url=http%3A%2F%2Fblog.team23.ru%2Ffeeds%2Fcomments%2Fdefault' target='_blank'>
<img src='http://img1.blogblog.com/img/widgets/subscribe-yahoo.png'/>
</a>
<a class='feed-reader-link' href='http://blog.team23.ru/feeds/comments/default' target='_blank'>
<img align='absmiddle' class='feed-icon' src='http://img1.blogblog.com/img/icon_feed12.png'/>
                Atom
              </a>
</div>
</div>
<div class='bottom'></div>
</div>
<div class='subscribe' id='SW_READER_LIST_CLOSED_Subscribe1COMMENT' onclick='return(_SW_toggleReaderList(event, "Subscribe1COMMENT"));'>
<div class='top'>
<span class='inner'>
<img class='subscribe-dropdown-arrow' src='http://img2.blogblog.com/img/widgets/arrow_dropdown.gif'/>
<span onclick='return(_SW_toggleReaderList(event, "Subscribe1COMMENT"));'>
<img align='absmiddle' alt='' border='0' class='feed-icon' src='http://img1.blogblog.com/img/icon_feed12.png'/>
Все комментарии
</span>
</span>
</div>
<div class='bottom'></div>
</div>
</div>
<div style='clear:both'></div>
</div>
</div>
<div class='clear'></div>
<span class='widget-item-control'>
<span class='item-control blog-admin'>
<a class='quickedit' href='http://www.blogger.com/rearrange?blogID=6660959344014943110&widgetType=Subscribe&widgetId=Subscribe1&action=editWidget&sectionId=sidebar' onclick='return _WidgetManager._PopupConfig(document.getElementById("Subscribe1"));' target='configSubscribe1' title='Изменить'>
<img alt='' height='18' src='http://img1.blogblog.com/img/icon18_wrench_allbkg.png' width='18'/>
</a>
</span>
</span>
<div class='clear'></div>
</div><div class='widget Feed' id='Feed1'>
<h2>Последние работы</h2>
<div class='widget-content' id='Feed1_feedItemListDisplay'>
<span style='filter: alpha(25); opacity: 0.25;'>
<a href='http://feeds.feedburner.com/Team23'>Загрузка...</a>
</span>
</div>
<div class='clear'></div>
<span class='widget-item-control'>
<span class='item-control blog-admin'>
<a class='quickedit' href='http://www.blogger.com/rearrange?blogID=6660959344014943110&widgetType=Feed&widgetId=Feed1&action=editWidget&sectionId=sidebar' onclick='return _WidgetManager._PopupConfig(document.getElementById("Feed1"));' target='configFeed1' title='Изменить'>
<img alt='' height='18' src='http://img1.blogblog.com/img/icon18_wrench_allbkg.png' width='18'/>
</a>
</span>
</span>
<div class='clear'></div>
</div><div class='widget Label' id='Label1'>
<h2>Теги</h2>
<div class='widget-content list-label-widget-content'>
<ul>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Team23'>Team23</a>
<span dir='ltr'>(28)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/%D0%AF%D0%BD%D0%B4%D0%B5%D0%BA%D1%81.%D0%A4%D0%BE%D1%82%D0%BA%D0%B8'>Яндекс.Фотки</a>
<span dir='ltr'>(26)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/%D0%9F%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD'>Плагин</a>
<span dir='ltr'>(21)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Development'>Development</a>
<span dir='ltr'>(16)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Picasa'>Picasa</a>
<span dir='ltr'>(11)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B'>Последние работы</a>
<span dir='ltr'>(11)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/%D0%AF%D0%BD%D0%B4%D0%B5%D0%BA%D1%81.%D0%A4%D0%BE%D1%82%D0%BA%D0%B8%20%D0%B4%D0%BB%D1%8F%20Picasa'>Яндекс.Фотки для Picasa</a>
<span dir='ltr'>(10)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/.NET%203.5'>.NET 3.5</a>
<span dir='ltr'>(7)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Windows%20Live'>Windows Live</a>
<span dir='ltr'>(7)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Windows%20Live%20Writer'>Windows Live Writer</a>
<span dir='ltr'>(6)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/.NET'>.NET</a>
<span dir='ltr'>(5)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Team%2023'>Team 23</a>
<span dir='ltr'>(5)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/%D0%AF%D0%BD%D0%B4%D0%B5%D0%BA%D1%81.%D0%A4%D0%BE%D1%82%D0%BA%D0%B8%20%D0%B4%D0%BB%D1%8F%20WLW'>Яндекс.Фотки для WLW</a>
<span dir='ltr'>(5)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/FilmOnline'>FilmOnline</a>
<span dir='ltr'>(3)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Plugin'>Plugin</a>
<span dir='ltr'>(3)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/%D0%A4%D0%BE%D1%82%D0%BE%D0%B0%D0%BB%D1%8C%D0%B1%D0%BE%D0%BC%20Windows%20Live'>Фотоальбом Windows Live</a>
<span dir='ltr'>(3)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/API'>API</a>
<span dir='ltr'>(2)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/ASP.NET'>ASP.NET</a>
<span dir='ltr'>(2)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/General'>General</a>
<span dir='ltr'>(2)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/OpenId'>OpenId</a>
<span dir='ltr'>(2)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/RSS'>RSS</a>
<span dir='ltr'>(2)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Windows%207'>Windows 7</a>
<span dir='ltr'>(2)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Windows%20Live%20Photo%20Gallery'>Windows Live Photo Gallery</a>
<span dir='ltr'>(2)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/%D0%A1%D0%B0%D0%B9%D1%82%D1%8B'>Сайты</a>
<span dir='ltr'>(2)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/%D0%AF%D0%BD%D0%B4%D0%B5%D0%BA%D1%81.%D0%A4%D0%BE%D1%82%D0%BA%D0%B8%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%BE%D1%82%D0%BE%D0%B0%D0%BB%D1%8C%D0%B1%D0%BE%D0%BC%D0%B0%20Windows%20Live'>Яндекс.Фотки для Фотоальбома Windows Live</a>
<span dir='ltr'>(2)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/ANTLR'>ANTLR</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/ASP.NET%20MVC'>ASP.NET MVC</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/AtomPub'>AtomPub</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/BLToolkit'>BLToolkit</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Code%20Generation'>Code Generation</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/CodeDom'>CodeDom</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/GeoRSS'>GeoRSS</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Math'>Math</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/OpenSocial'>OpenSocial</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Security'>Security</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/T4'>T4</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/Trac'>Trac</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/VB.NET'>VB.NET</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/VKontakte'>VKontakte</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/XML-RPC'>XML-RPC</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/books'>books</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/evernote'>evernote</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/libs'>libs</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/%D0%92%D0%9A%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D0%B5'>ВКонтакте</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/%D0%9A%D0%BE%D0%B4%D0%BE%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F'>Кодогенерация</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/%D0%AF%D0%BD%D0%B4%D0%B5%D0%BA%D1%81.%D0%92%D0%B8%D0%B4%D0%B5%D0%BE'>Яндекс.Видео</a>
<span dir='ltr'>(1)</span>
</li>
<li>
<a dir='ltr' href='http://blog.team23.ru/search/label/%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8'>книги</a>
<span dir='ltr'>(1)</span>
</li>
</ul>
<div class='clear'></div>
<span class='widget-item-control'>
<span class='item-control blog-admin'>
<a class='quickedit' href='http://www.blogger.com/rearrange?blogID=6660959344014943110&widgetType=Label&widgetId=Label1&action=editWidget&sectionId=sidebar' onclick='return _WidgetManager._PopupConfig(document.getElementById("Label1"));' target='configLabel1' title='Изменить'>
<img alt='' height='18' src='http://img1.blogblog.com/img/icon18_wrench_allbkg.png' width='18'/>
</a>
</span>
</span>
<div class='clear'></div>
</div>
</div><div class='widget BlogArchive' id='BlogArchive1'>
<h2>Архив блога</h2>
<div class='widget-content'>
<div id='ArchiveList'>
<div id='BlogArchive1_ArchiveList'>
<ul class='flat'>
<li class='archivedate'>
<a href='http://blog.team23.ru/2011_05_01_archive.html'>Май 2011</a> (1)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2010_07_01_archive.html'>Июль 2010</a> (1)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2010_04_01_archive.html'>Апрель 2010</a> (1)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2009_10_01_archive.html'>Октябрь 2009</a> (1)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2009_06_01_archive.html'>Июнь 2009</a> (1)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2009_05_01_archive.html'>Май 2009</a> (4)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2009_03_01_archive.html'>Март 2009</a> (1)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2009_01_01_archive.html'>Январь 2009</a> (2)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2008_12_01_archive.html'>Декабрь 2008</a> (2)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2008_11_01_archive.html'>Ноябрь 2008</a> (1)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2008_10_01_archive.html'>Октябрь 2008</a> (5)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2008_09_01_archive.html'>Сентябрь 2008</a> (10)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2008_07_01_archive.html'>Июль 2008</a> (6)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2008_06_01_archive.html'>Июнь 2008</a> (11)
      </li>
<li class='archivedate'>
<a href='http://blog.team23.ru/2007_07_01_archive.html'>Июль 2007</a> (2)
      </li>
</ul>
</div>
</div>
<div class='clear'></div>
<span class='widget-item-control'>
<span class='item-control blog-admin'>
<a class='quickedit' href='http://www.blogger.com/rearrange?blogID=6660959344014943110&widgetType=BlogArchive&widgetId=BlogArchive1&action=editWidget&sectionId=sidebar' onclick='return _WidgetManager._PopupConfig(document.getElementById("BlogArchive1"));' target='configBlogArchive1' title='Изменить'>
<img alt='' height='18' src='http://img1.blogblog.com/img/icon18_wrench_allbkg.png' width='18'/>
</a>
</span>
</span>
<div class='clear'></div>
</div>
</div><div class='widget HTML' id='HTML2'>
<script type='text/javascript'>
                var disqus_shortname = 'blog-team23-ru';
                var disqus_blogger_current_url = "http://blog.team23.ru/";
                if (!disqus_blogger_current_url.length) {
                    disqus_blogger_current_url = "http://blog.team23.ru/";
                }
                var disqus_blogger_homepage_url = "http://blog.team23.ru/";
                var disqus_blogger_canonical_homepage_url = "http://blog.team23.ru/";
            </script>
<style type='text/css'>
                    .post-comment-link { visibility: hidden; }
                </style>
<script type='text/javascript'>
                (function() {
                    var bloggerjs = document.createElement('script');
                    bloggerjs.type = 'text/javascript';
                    bloggerjs.async = true;
                    bloggerjs.src = 'http://'+disqus_shortname+'.disqus.com/blogger_index.js';
                    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(bloggerjs);
                })();
                </script>
</div></div>
</div>
<!-- spacer for skins that want sidebar and main to be the same height-->
<div class='clear'>&#160;</div>
</div>
<!-- end content-wrapper -->
<div id='footer-wrapper'>
<div class='footer section' id='footer'></div>
</div>
</div></div>
<!-- end outer-wrapper -->
<script type='text/javascript'>
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-993908-13']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>
<!-- Yandex.Metrika counter -->
<div style='display:none;'><script type='text/javascript'>
(function(w, c) {
    (w[c] = w[c] || []).push(function() {
        try {
            w.yaCounter6382459 = new Ya.Metrika({id:6382459});
        }
        catch(e) { }
    });
})(window, 'yandex_metrika_callbacks');
</script></div>
<script defer='defer' src='//mc.yandex.ru/metrika/watch.js' type='text/javascript'></script>
<noscript><div><img alt='' src='//mc.yandex.ru/watch/6382459' style='position:absolute; left:-9999px;'/></div></noscript>
<!-- /Yandex.Metrika counter -->
<script type="text/javascript">
if (window.jstiming) window.jstiming.load.tick('widgetJsBefore');
</script><script type="text/javascript" src="http://www.blogger.com/static/v1/widgets/4159131143-widgets.js"></script>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type='text/javascript'>
if (typeof(BLOG_attachCsiOnload) != 'undefined' && BLOG_attachCsiOnload != null) { window['blogger_templates_experiment_id'] = "templatesV1";window['blogger_blog_id'] = '6660959344014943110';BLOG_attachCsiOnload(''); }_WidgetManager._Init('http://www.blogger.com/rearrange?blogID\x3d6660959344014943110','http://blog.team23.ru/','6660959344014943110');
_WidgetManager._SetPageActionUrl('http://www.blogger.com/display?blogID\x3d6660959344014943110','APq4FmAKkiZkvXPzVpYz5bNAAEYyUdu5CaK8yq4qVTQhKaEj8FxG9BkviisQghojZaPKIMpk1Yi7suO6Kjx80UUocOq9zp2UHNinYgYVRQXMiLFOtUx9Oqo\x3d','AOuZoY6BIBkIQZksDfOEzNgG0dQTxKzz1A:1334089901003');
_WidgetManager._SetDataContext([{'name': 'blog', 'data': {'bloggerUrl': 'http://www.blogger.com', 'title': '.NET на практике', 'pageType': 'index', 'url': 'http://blog.team23.ru/', 'canonicalUrl': 'http://blog.team23.ru/', 'canonicalHomepageUrl': 'http://blog.team23.ru/', 'homepageUrl': 'http://blog.team23.ru/', 'blogspotFaviconUrl': 'http://blog.team23.ru/favicon.ico', 'enabledCommentProfileImages': true, 'searchLabel': '', 'searchQuery': '', 'pageName': '', 'pageTitle': '.NET на практике', 'encoding': 'UTF-8', 'locale': 'ru', 'isPrivate': false, 'isMobile': false, 'mobileClass': '', 'languageDirection': 'ltr', 'feedLinks': '\74link rel\75\42alternate\42 type\75\42application/atom+xml\42 title\75\42.NET на практике - Atom\42 href\75\42http://blog.team23.ru/feeds/posts/default\42 /\76\n\74link rel\75\42alternate\42 type\75\42application/rss+xml\42 title\75\42.NET на практике - RSS\42 href\75\42http://blog.team23.ru/feeds/posts/default?alt\75rss\42 /\76\n\74link rel\75\42service.post\42 type\75\42application/atom+xml\42 title\75\42.NET на практике - Atom\42 href\75\42http://www.blogger.com/feeds/6660959344014943110/posts/default\42 /\76\n\74link rel\75\42EditURI\42 type\75\42application/rsd+xml\42 title\75\42RSD\42 href\75\42http://www.blogger.com/rsd.g?blogID\0756660959344014943110\42 /\076', 'meTag': '\74link rel\75\42me\42 href\75\42https://plus.google.com/103609747718915414367\42 /\76\n', 'openIdOpTag': '\74link rel\75\42openid.server\42 href\75\42http://www.blogger.com/openid-server.g\42 /\76\n\74link rel\75\42openid.delegate\42 href\75\42http://blog.team23.ru/\42 /\76\n', 'googleProfileUrl': 'https://plus.google.com/103609747718915414367', 'imageSrcTag': '', 'latencyHeadScript': '\74script type\75\42text/javascript\42\76(function() { var a\75window;function c(b){this.t\75{};this.tick\75function(b,i,d){d\75void 0!\75d?d:(new Date).getTime();this.t[b]\75[d,i]};this.tick(\42start\42,null,b)}var f\75new c;a.jstiming\75{Timer:c,load:f};try{var g\75null;a.chrome\46\46a.chrome.csi\46\46(g\75Math.floor(a.chrome.csi().pageT));null\75\75g\46\46a.gtbExternal\46\46(g\75a.gtbExternal.pageT());null\75\75g\46\46a.external\46\46(g\75a.external.pageT);g\46\46(a.jstiming.pt\75g)}catch(h){};a.tickAboveFold\75function(b){var e\0750;if(b.offsetParent){do e+\75b.offsetTop;while(b\75b.offsetParent)}b\75e;750\76\75b\46\46a.jstiming.load.tick(\42aft\42)};var j\75!1;function k(){j||(j\75!0,a.jstiming.load.tick(\42firstScrollTime\42))}a.addEventListener?a.addEventListener(\42scroll\42,k,!1):a.attachEvent(\42onscroll\42,k);\n })();\74/script\076', 'mobileHeadScript': '', 'analyticsAccountNumber': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/f75e48f708466c7f/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/5490e68b8618e708'}}, {'name': 'skin', 'data': {'vars': {'sidebartextcolor': '#666666', 'linkcolor': '#5588aa', 'visitedlinkcolor': '#999999', 'textcolor': '#333333', 'headerfont': 'normal normal 78% \47Trebuchet MS\47,Trebuchet,Arial,Verdana,Sans-serif', 'pagetitlefont': 'normal normal 200% Georgia, Serif', 'bgcolor': '#ffffff', 'descriptioncolor': '#999999', 'titlecolor': '#cc6600', 'bordercolor': '#cccccc', 'postfooterfont': 'normal normal 78% \47Trebuchet MS\47, Trebuchet, Arial, Verdana, Sans-serif', 'pagetitlecolor': '#666666', 'bodyfont': 'normal normal 100% Georgia, Serif', 'endSide': 'right', 'startSide': 'left', 'descriptionfont': 'normal normal 78% \47Trebuchet MS\47, Trebuchet, Arial, Verdana, Sans-serif', 'sidebarcolor': '#999999'}, 'override': ''}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '/?view\75classic'}, 'flipcard': {'name': 'flipcard', 'url': '/?view\75flipcard'}, 'magazine': {'name': 'magazine', 'url': '/?view\75magazine'}, 'mosaic': {'name': 'mosaic', 'url': '/?view\75mosaic'}, 'sidebar': {'name': 'sidebar', 'url': '/?view\75sidebar'}, 'snapshot': {'name': 'snapshot', 'url': '/?view\75snapshot'}, 'timeslide': {'name': 'timeslide', 'url': '/?view\75timeslide'}}}]);
_WidgetManager._RegisterWidget('_CustomSearchView', new _WidgetInfo('CustomSearch1', 'sidebar', null, document.getElementById('CustomSearch1'), {'title': 'Поиск', 'includeBlog': true, 'includePostLinks': false, 'includeWeb': false, 'linkLists': [], 'blogUrl': 'http://blog.team23.ru/', 'loadingMsg': 'Загрузка...', 'thisBlogMsg': 'Этот блог', 'linkedFromHereMsg': 'Страницы, связанные ссылками с этой страницей', 'theWebMsg': 'Интернет', 'backgroundColor': '#ffffff', 'textColor': '#333333', 'dateColor': '#999999', 'linkColor': '#5588aa', 'urlColor': '#cc6600', 'visitedLinkColor': '#999999', 'borderColor': '#cccccc', 'activeBorderColor': '#cc6600'}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_GadgetView', new _WidgetInfo('Gadget1', 'sidebar', null, document.getElementById('Gadget1'), {}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_SubscribeView', new _WidgetInfo('Subscribe1', 'sidebar', null, document.getElementById('Subscribe1'), {}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_FeedView', new _WidgetInfo('Feed1', 'sidebar', null, document.getElementById('Feed1'), {'title': 'Последние работы', 'showItemDate': false, 'showItemAuthor': false, 'feedUrl': 'http://feeds.feedburner.com/Team23', 'numItemsShow': 5, 'loadingMsg': 'Загрузка...', 'openLinksInNewWindow': false}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_LabelView', new _WidgetInfo('Label1', 'sidebar', null, document.getElementById('Label1'), {}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar', null, document.getElementById('BlogArchive1'), {'languageDirection': 'ltr'}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML2', 'sidebar', null, document.getElementById('HTML2'), {}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header'));
_WidgetManager._RegisterWidget('_NavbarView', new _WidgetInfo('Navbar1', 'navbar'));
_WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', null, document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'lightboxEnabled': true, 'lightboxModuleUrl': 'http://www.blogger.com/static/v1/jsbin/3865777996-lbx_ru.js', 'lightboxCssUrl': 'http://www.blogger.com/static/v1/v-css/3397631820-lightbox_bundle.css'}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_PageListView', new _WidgetInfo('PageList1', 'null', null, document.getElementById('PageList1'), {'title': 'Страницы', 'links': [{'href': 'http://blog.team23.ru/', 'title': 'Главная страница', 'isCurrentPage': true}], 'mobile': false}, 'displayModeFull'));
</script>
</body>
</html>