tag:blogger.com,1999:blog-58721218290294106222024-03-14T05:58:38.308+03:00ПотерянныйAnonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.comBlogger93125tag:blogger.com,1999:blog-5872121829029410622.post-32715076478132943902012-08-21T22:57:00.000+04:002012-08-21T22:59:11.490+04:00Показываем иконки для Tortoise SVN x64 под Total Commander под Windows 7<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: justify;">
</div>
<div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: justify;">
</div>
<div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: justify;">
</div>
<div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: justify;">
</div>
<div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: justify;">
</div>
<div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: justify;">
</div>
<div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: justify;">
<span style="font-size: large;"><b style="color: red;">З</b></span>аметил, что Total Commander под Windows 7 x64 не отображает иконки для Tortoise SVN x64, решается путем настройки самого Total Commander: Tools -> Options -> Icons -> Show overlay icons - после этого жизнь становится значительно проще;</div>
<div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: justify;">
<a href="http://1.bp.blogspot.com/-eDw_ZQBn75k/UDPZA-3tVxI/AAAAAAAATv0/uUYTJN0S-JU/s1600/show+overlay+icons.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-eDw_ZQBn75k/UDPZA-3tVxI/AAAAAAAATv0/uUYTJN0S-JU/s1600/show+overlay+icons.png" /></a></div>
<div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Verdana,sans-serif; text-align: justify;">
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-69105415514474974672012-07-11T11:09:00.001+04:002012-07-11T11:36:36.455+04:00VirtualBox машина, доступная по WiFi снаружи (VirtualBox machine available outside using WiFi connection)<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;"><b><span style="color: #e06666; font-size: x-large;">Д</span></b>анный пост - больше как заметка для себя, чтобы не забыть :)</span><br />
<br />
</div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;">Потребовалось расшарить VirtualBox машину таким образом, чтобы можно было к ней достучаться через WiFi, скажем, с iPad или с телефона. Необходимость возникла в удаленной отладке приложения на iPad, но на самом деле сценарии могут быть различные, вплоть до тестирования web-сайта в мобильных приложениях.</span><br />
<br />
</div>
<div style="text-align: justify;">
<b><span style="font-family: verdana,geneva;">Моя конфигурация: </span></b></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;"><span style="white-space: pre;"> </span>Хост - Windows 7 SP1 64bit</span></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;"><span style="white-space: pre;"> </span>Гостевая - Windows XP </span></div>
<div style="text-align: justify;">
<br />
<br /></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;">Итак, в моем случае порядок действий был следующий:</span></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;">На хосте настроено wifi-подключение, чтобы посмотреть все доступные сетевые подключения, идем в </span></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;"><b>Network and Sharing Center</b></span><br />
</div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;"><img alt="" height="385" src="http://lh3.ggpht.com/-fCm5TUHwnEQ/T_0gEwd2PeI/AAAAAAAATuw/B-K07KiDktE/%25255BUNSET%25255D.jpg" width="512" /></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;">Выбираем наше беспроводное соединение, смотрим Details, тут важно обратить внимание, к какой сетевой карте осуществлена привязка, также видим ip-адрес нашего хоста - в принципе по данному адресу можно достучаться как снаружи к нашему хосту, так и из гостевой ОС (если только файрволл не режет ваши запросы).</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;"><img alt="" height="377" src="http://lh3.ggpht.com/-dejjdrOioNs/T_0gLrfHpDI/AAAAAAAATu4/MbQqqekLu-k/%25255BUNSET%25255D.jpg" width="512" /></span></div>
<div style="text-align: justify;">
<br />
<span style="font-family: verdana,geneva;">Тот же самый IP мы можем увидеть, используя <b>ipconfig </b>и рассмотрев подключение Wireless LAN adapter.</span></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;">Предыдущий шаг важен лишь для того, чтобы увидеть имя сетевой карты, которое мы будем использовать для настройки виртуальной машины.</span><br />
</div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;"><img alt="" height="254" src="http://lh6.ggpht.com/-4gchDLZh9Lc/T_0gPduDauI/AAAAAAAATvA/a1SPize1n6k/%25255BUNSET%25255D.jpg" width="512" /></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;">Теперь самое главное - идем в VirtualBox Gui, выбираем нашу виртуальную машину и в ее настройках выбираем Network Adapters.</span></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;">Выбираем мост, Bridged Adapter, и здесь важно выбрать <b>ту же сетевую карту</b>, которая использована для беспроводного сетевого подключения на хосте - в данном случае IP адрес для гостевой ОС будет выделен из того же диапозона, в котором и хостовая ОС, с той же самой маской подсети, то есть физически и хост и гостевая ОС будут находиться в одной беспроводной сети:</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;"><img alt="" height="327" src="http://lh3.ggpht.com/-v5AFkj-518A/T_0gS7o-woI/AAAAAAAATvI/HG3DZmNtvFw/%25255BUNSET%25255D.jpg" width="458" /></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;">Запускаем виртуальную машину, смотрим новый присвоенный IP адрес (в моем случае это был ровно следующий выделенный адрес 104), убеждаемся, что и маска и шлюз подсети одни и теже, что и на хосте:</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;"><img alt="" height="253" src="http://lh3.ggpht.com/-aeKp7k82dgA/T_0gZFmZLzI/AAAAAAAATvQ/Ote7Sj8iiY0/%25255BUNSET%25255D.jpg" style="font-family: verdana, geneva;" width="512" /></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br />
<span style="font-family: verdana,geneva;">Потребуется настроить файрволл на гостевой ОС, в простейшем случае его можно просто отключить, и пробуем пропинговать нашу виртуалку, используя WiFi. В случае с iOS я установил бесплатную утилиту Free Ping, пингуем:</span><br />
<br />
</div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;"><img alt="" height="383" src="http://lh6.ggpht.com/-akIUUhadowY/T_0g2fnz0fI/AAAAAAAATvY/OL5dtYi4i5Y/%25255BUNSET%25255D.jpg" style="font-family: verdana, geneva;" width="512" /></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: verdana,geneva;">На этом все, надеюсь кому-то еще, кроме меня, пригодится данная инструкция.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
</div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-9254524813095556812012-03-29T17:17:00.000+04:002012-03-29T17:17:28.326+04:00Верх насилия над собой (или как отпилить сук, на котором сидишь) - 2<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="font-family: Verdana,sans-serif;">
</div>
<div style="font-family: Verdana,sans-serif;">
</div>
<div style="font-family: Verdana,sans-serif;">
</div>
<div style="font-family: Verdana,sans-serif;">
</div>
<div style="font-family: Verdana,sans-serif;">
</div>
<div style="font-family: Verdana,sans-serif;">
</div>
<div style="font-family: Verdana,sans-serif;">
</div>
<div style="font-family: Verdana,sans-serif;">
</div>
<div style="color: red; font-family: Verdana,sans-serif;">
</div>
<div style="font-family: Verdana,sans-serif;">
<span style="font-size: x-large;"><b style="color: red;">А</b></span> usability настройки сетевой карты так и осталось на уровне 5ти летней давности, никакого confirmation dialog при клике на Disable вы не получите :) ... просто так вот тут вспомнилось, на тему создания проблем самому себе любимому</div>
<div style="font-family: Verdana,sans-serif;">
<br /></div>
<div style="font-family: Verdana,sans-serif;">
<a href="http://guid-empty.blogspot.com/2008/07/blog-post.html">Верх насилия над собой (или как отпилить сук, на котором сидишь) </a></div>
<div style="font-family: Verdana,sans-serif;">
<br /></div>
<div style="font-family: Verdana,sans-serif;">
<br /></div>
<div style="font-family: Verdana,sans-serif;">
<br /></div>
<div style="font-family: Verdana,sans-serif;">
<img alt="" src="data:image/png;base64,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" /> </div>
<div style="font-family: Verdana,sans-serif;">
<br /></div>
</div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-82079284483056049142011-11-11T12:38:00.001+04:002011-11-11T12:41:02.159+04:00iPad 2 Тихий звук в наушниках<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: verdana, geneva;">Я <span style="font-size: x-large;"><strong><span style="color: red;">п</span></strong></span>рофан в плане работы со всякого рода apple девайсами, но вот захотел посмотреть кино на iPad 2 и был разочарован совершенно неприемлемым тихим звуком в наушниках, причем самое странное то, что без наушников орет мама не горюй...</span><br />
<br />
<span style="font-family: verdana, geneva;">Уже подумал было, что возможен производственный брак (тем более, есть оказывается и у девайсов от такого известного производителя дефекты, о чем можно убедиться немного погуглив), как нарыл решение - оно оказалось простым и наверняка о нем знает каждый уверенный пользователь iPad:</span><br />
<br />
<strong><span style="color: #660000; font-family: verdana, geneva;">Идем в настройки, раздел Музыка, видим там чекбокс на ограничение громкости, снимаем его и выставляем в слайдере максимальное значение, которое хотим - далее можно глохнуть в наушниках настолько насколько мы этого хотим :)</span></strong><br />
</div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com8tag:blogger.com,1999:blog-5872121829029410622.post-16629685760109085022011-10-07T18:28:00.004+04:002011-10-07T18:34:49.543+04:00Regex для распарсивания выражений с форматирующей маской {name: formatMask, formatLength}<div dir="ltr" style="text-align: left;" trbidi="on"><span style="font-family: verdana, geneva;"><span style="color: #cc0000; font-size: x-large;"><b>П</b></span>онадобилось недавно написать regex-выражение для распарсивания строк вида {name: formatMask, formatLength}, при этом форматирующая маска или длина могут присутствовать или отсутствовать.</span><br />
<br />
<span style="font-family: verdana, geneva;">Привожу код такого regex:</span><br />
<span style="font-family: verdana, geneva;"><br />
</span><br />
<pre class="xml" name="code">\{\s*(?<FieldExpression>\s*(?<FieldName>\w{1,}){1}\s*(?<FormatExpression>(\s*(?<ColonSeparator>[:])|(?<CommaSeparator>[,]))\s*(?(ColonSeparator)(?<FormatMask>\w*)|)[,]*\s?(?<Length>\d+)*)*)\s?\}
</pre><br />
<br />
<span style="font-family: verdana, geneva;">В группах имеем возможность получить сам fieldName, его маску fieldMask и длину length. Еще хочу отметить, что при работе с regex очень помогает такой инструмент как Rad Software Regular Expressions Designer -<a href="http://www.radsoftware.com.au/?from=RegexDesigner" target="_blank" title="http://www.radsoftware.com.au/?from=RegexDesigner">http://www.radsoftware.com.au/?from=RegexDesigner</a>.</span><br />
<br />
<br />
<span style="font-family: verdana, geneva;"><img alt="" height="652" src="http://lh3.ggpht.com/-AfmUXsrPmRs/To8MgaECfYI/AAAAAAAAKQs/WFLO6dTxhKs/%25255BUNSET%25255D.png" width="886" /><br />
</span></div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-33274068905460310972011-10-07T13:00:00.008+04:002011-10-08T23:39:39.416+04:00Пишем ajax available user control<div dir="ltr" style="text-align: left;" trbidi="on"><span style="font-size: x-small;"><a href="https://sites.google.com/site/guidempty/Guid.Empty.AjaxAvailableUserControlsProject.zip" target="_blank" title="Исходные коды к статье">Исходные коды к статье</a></span><br />
<span style="font-family: verdana,geneva;"><span style="color: #e06666; font-size: x-large;"><b>П</b></span>ривет.</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<div style="text-align: justify;"><span style="font-family: verdana,geneva;">Сегодня хотелось бы поделиться одной вкусной штукой, которая может оказаться полезной во многих сценариях в работе с asp.net web forms, возможно, в SharePoint тоже окажется полезной. </span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Вкратце, суть идеи в следующем: хочется со стороны клиента, из клиентского сценария, вызвать серверный метод....но....естественно, все это делается через коллбеки и реализацию <b>ICallbackEventHandler</b>....хочется сделать это один раз для всех возможных сценариев и не думать каждый раз о реализации указанного интерфейса, думать о сериализации/десериализации аргументов и результатов от сервера в строку и прочими делами.... хочу просто тупо вызвать серверный метод по его имени, получить ответ, причем ответ хочу получить в объектном виде, не хочу получать строки и потом парсить их на стороне сервера. Вот такое желание. Чтобы сразу увидеть результат того, что получится, приведу в начале статьи кусочек кода.</span></div><div style="text-align: justify;"><br />
</div><span style="font-family: verdana,geneva;">Итак, объявляем серверный user control:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<pre class="c#" name="code">public partial class DemoUserControl : AjaxWebModule
{
#region demo methods here
public AjaxResponse MyDemoMethod1(string arg1, string arg2, int arg3, bool arg4)
{
AjaxResponse result = new AjaxResponse
{
AdditionalSettings = String.Format("This is response to callback with parameters {0}/{1}/{2}/{3} from server side", arg1, arg2, arg3, arg4),
CurrentPage = 0,
Records = new List<object>()
{
new
{
Date = DateTime.Now,
Data = int.MinValue
}
},
TotalRecords = 1,
TotalPages = 1
};
return result;
}
public AjaxResponse MyDemoMethod2(int arg1, bool arg2)
{
AjaxResponse result = new AjaxResponse
{
AdditionalSettings = String.Format("This is response to callback with parameters {0}/{1} from server side", arg1, arg2),
Records = new List<object>()
{
new
{
Date = DateTime.Now,
Data = int.MinValue,
OtherProperties = new List<object>{1, 2, 3}
}
}
};
return result;
}
#endregion
}
</pre><div style="text-align: justify;"><b><span style="font-family: verdana,geneva;">И его серверный маркап:</span></b><br />
<b><span style="font-family: verdana,geneva;"><br />
</span></b></div><pre class="xml" name="code"><%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DemoUserControl.ascx.cs" Inherits="AjaxAvailableUserControls.Application.AjaxUserControls.DemoUserControl" %>
<input type="button" onclick="click_handler();" value="click me to call server side method 1" id="btnDemo1"/><br />
<input type="button" onclick="click_handler();" value="click me to call server side method 2" id="btnDemo2"/><br />
<script language="javascript" type="text/javascript">
$(document).ready(function()
{
$("#btnDemo1").click(function()
{
jQuery.execute("MyDemoMethod1",
{ "arg1": "test string 1", "arg2": "test strign 2", "arg3": 2, "arg4": false },
{
onSuccess: function (data) {
debugger;
alert("settings:" + data.AdditionalSettings + ";currentPage:" + data.CurrentPage.toString());
},
onError: function (exception) { alert(exception); }
});
});
$("#btnDemo2").click(function () {
jQuery.execute("MyDemoMethod2",
{ "arg1": 1, "arg2": false },
{
onSuccess: function (data) {
debugger;
alert("settings:" + data.AdditionalSettings + ";currentPage:" + data.CurrentPage.toString());
},
onError: function (exception) { alert(exception); }
});
});
});
</script>
</pre><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Как видите, все достаточно просто. При разработке code-behind класса нашего .ascx контрола нам всего лишь нужно отнаследоваться от <b>AjaxWebModule </b>и объявить те методы, которые мы хотим использовать на стороне клиента. </span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;">При этом сохраняется сигнатура вызова метода со стороны клиента. Важно только то, что данный метод должен быть объявлен как public и должен возвращать результат в виде объекта класса <b>AjaxResponse</b>. В вышеприведенном коде мы производим вызов двух серверных методов - <b>MyDemoMethod1 </b>и </span><span style="font-family: verdana,geneva;"><b>MyDemoMethod2 </b>- передача параметров происходит поименновано путем указания имени аргумента и его значения:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;">{ "<b>arg1</b>": "test string 1", "<b>arg2</b>": "test strign 2", "<b>arg3</b>": 2, "<b>arg4</b>": false } - (string <b>arg1</b>, string <b>arg2</b>, int <b>arg3</b>, bool <b>arg4</b>)</span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">{ "<b>arg1</b>": 1, "<b>arg2</b>": false } - (int <b>arg1</b>, bool <b>arg2</b>)</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Подробнее о классе <b>AjaxResponse</b> немного попозже, его интерфейс может быть изменен вами, для данного примера он разработан, чтобы отвечать наиболее общему варианту использования в таблицах с постраничным пейджингом.</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Итак, в вышеприведенном клиентском сценарии я умышленно оставил вставки debugger, чтобы продемонстировать в конечном итоге результат.</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Кликаем по первой кнопке:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><img alt="" height="594" src="http://lh5.ggpht.com/-aUuCLA-HiuI/To6qN72z9WI/AAAAAAAAKQg/mwCXfWAHeSs/%25255BUNSET%25255D.png" width="793" /><br />
<div style="text-align: justify;"><span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Как видно, со стороны клиента мы вызываем серверный метод <b>MyDemoMetho1 </b>и получаем результат в объектном виде, без всяких преобразований - магия :), более того, мы имеем возможность обработать как нормальное выполнение метода, так и его ошибку в случае какой-либо исключительной ситуации.</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Вызов со стороны клиента подробнее:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><pre class="js" name="code">jQuery.execute("MyDemoMethod1",
{ "arg1": "test string 1", "arg2": "test strign 2", "arg3": 2, "arg4": false },
{
onSuccess: function (data) {
debugger;
alert("settings:" + data.AdditionalSettings + ";currentPage:" + data.CurrentPage.toString());
},
onError: function (exception) { alert(exception); }
});
</pre><span style="font-family: verdana,geneva;"><br />
</span><br />
<div style="text-align: justify;"><span style="font-family: verdana,geneva;">Как видите, в данном случае вызов серверного метод обернут в jquery-плагин .execute, код которого доступен в исходном коде, сделано это исключительно просто ради удобства.</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Результат вызова мы уже видели на скриншоте выше, вот что мы получим на клиентской стороне в javascript путем обращения к переменной data в <b>onSuccess </b>обработчике:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><span style="font-family: verdana,geneva;"><img alt="" height="247" src="http://lh3.ggpht.com/-rD4ploV89pM/To6ry8vdY4I/AAAAAAAAKQk/k_gmKWQQIfQ/%25255BUNSET%25255D.png" width="363" /><br />
</span><br />
<div style="text-align: justify;"><span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Как видно, результат нормально десериализован, мы имеем на руках как обычные свойства объекта data, так и коллекцию вложенных объектов Records.</span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Кликаем по второй кнопке, в принципе здесь картина ничем не отличается, просто возвращаемый результат немного посложнее, значение переменной data в onSuccess обработчике будет выглядеть так:</span><br />
<br />
</div><img alt="" height="352" src="http://lh6.ggpht.com/-EqQRothm3LI/To6sdMRXBiI/AAAAAAAAKQo/33tM9t2tSEs/%25255BUNSET%25255D.png" width="364" /><br />
<div style="text-align: justify;"><span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Собственно, все, надеюсь вам понравилась идея? Далее идет объяснение некоторых моментов.</span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Итак, в первую очередь нам важно, как реализован класс <b>AjaxWebModule</b>, именно он предоставляет возможность вызова серверного метода со стороны клиента. </span></div><span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Итак, его сигнатура:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<pre class="c#" name="code">///
/// Base class for all modules contained ajax logic
///
public class AjaxWebModule : UserControl, ICallbackEventHandler
{
..................
}
</pre><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Здесь все знакомо, данный класс реализует интерфейс <b>ICallbackEventHandler</b>, подробнее о нем останавливаться не буду, о нем уже писал достаточно подробно ранее. Важно, что в реализации текущего интефейса мы можем получить со стороны клиента строку, распарсить ее, выполнить действия, и вернуть строковый результат клиенту. Собственно, само распарсивание строки запроса выполняется в методе:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><pre class="c#" name="code">/// <summary>
/// Обрабатывает запрос со стороны клиента, вызывает соотвествующий метод из текущего модуля, формирует ответ, json-сериализует его в строку и
/// отправляет обратно на клиента
/// </summary>
/// <param name="e"></param>
private void ProcessRequest(ClientDataReceivedEventArgs e)
{
e.Cancel = false;
// Данные со стороны клиента, передаваемые в качестве параметров в наш ajax метод
// Параметры должны соотвествовать структуре класса AjaxRequestParameters
// e.ClientData
AjaxRequestParameters parameters = this.ParseParameters(e.ClientData);
// вызов серверного ajax-метода
AjaxResponse response = this.MethodInvoke(parameters);
// Сериализованное состояние ответа от сервера, отправляемое клиенту в качестве ответа
// e.ServerResponse
// формируем ответ клиенту
JavaScriptSerializer serializer = new JavaScriptSerializer();
e.ServerResponse = serializer.Serialize(response);
}
</pre><br />
<div style="text-align: justify;"><span style="font-family: verdana,geneva;">Вот здесь мы и встречаем наш <b>AjaxResponse </b>- объект данного класса мы получаем от метода <b>MethodInvoke</b>, который принимает объект класса </span><b><span style="font-family: monospace; white-space: pre;">AjaxRequestParameters</span></b><span style="font-family: verdana,geneva;">, полученный путем распарсивания строки со стороны клиента. </span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Мы пока рассматриваем только серверную логику, до клиентской еще дойдем. Класс AjaxRequestParameters представляет собой следующее:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><pre class="c#" name="code">/// <summary>
/// Параметры, передаваемый в ajax метод со стороны клиента
/// </summary>
public class AjaxRequestParameters
{
/// <summary>
/// Имя вызываемого метода
/// </summary>
public string MethodName
{
get;
set;
}
/// <summary>
/// Список ЗНАЧЕНИЙ параметров, которые должны соотвествовать соотвествующим аргументам указанного метода - передаются со стороны клиента в виед пар Ключ-Значение
/// </summary>
public Dictionary<string, object> Parameters
{
get;
set;
}
}
</pre><br />
<div style="text-align: justify;"><span style="font-family: verdana,geneva;">Здесь мы уже видим название метода, и список параметров/значений, которые будут переданы на выполнение указанному методу. Надеюсь, уже становится понятным, что делает метод <b>MethodInvoke</b>(AjaxRequestParameters parameters) - его задача просто найти указанный метод в текущем объекте юзер-контрола, вызвать его и обернуть результат выполнения в заданный формат. </span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Код его приводить наверно нет смысла, он использует рефлексию для поиска метода с заданной сигнатурой, важно то,что возвращаемый результат искомого метода должен быть <b>AjaxResponse</b>. </span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Почему нам важна сигнатура возвращаемого результата? Только потому, что нам придется данный результат передавать на клиента, а чтобы его передать, нам нужно его сериализовать в строку, потому ответ от сервера должен отвечать определенным требованиям, а именно, он должен отвечать правилам сериализации. В данном примере я просто использовал простые типы данных для объвления интерфейса AjaxResponse, вы можете использовать другой интерфейс. </span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Итак, мы дошли до вызова серверного метода, получения результата его выполнения. Далее этот результат сериализуется в строку и уходит на клиента:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><pre class="c#" name="code">// Сериализованное состояние ответа от сервера, отправляемое клиенту в качестве ответа
// e.ServerResponse
// формируем ответ клиенту
JavaScriptSerializer serializer = new JavaScriptSerializer();
e.ServerResponse = serializer.Serialize(response);
</pre><span style="font-family: verdana,geneva;"><br />
</span><br />
<br />
<div style="text-align: justify;"><span style="font-family: verdana,geneva;">По серверному коду вопросов остаться не должно, теперь можно рассмотреть клиентскую реализацию. Сразу приведу исходный код jquery плагина - execute:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><pre class="js" name="code">// core. client scripts library
// created on 20111007 by smirnov andrey - duШes
// #region execute extension method
$.execute = function (methodName, parameters, options) {
/// <summary>
/// Вызывает серверный public-Метод текущего AjaxWebModule
/// </summary>
/// <param name="methodName" type="Object">
/// Аргумент methodName представляет собой имя вызываемого серверного метода, например,
/// "DemoMethod2"
/// </param>
/// <param name="parameters" type="Object">
/// Объект parameters представляет собой хеш с указанием списка параметров в виде хеш - Имя параметра - Значение, например,
/// { "id", 1 }, { "name", "test" }
/// </param>
/// <param name="options" type="Object">
/// Объект options представляет собой хеш с указанием OnSuccess handler в случае успешного завершения вызова и OnErrorHandler в случае ошибки, например
/// {
/// onSuccess: function(data) {
/// alert(deserialized_request.AdditionalSettings);
/// }
/// onError: function(data) {
/// alert("Exception thrown");
/// }
/// </param>
/// <returns type="undefined">
var settings = jQuery.extend({
control_id: null,
onSuccess: function (data) { },
onError: function (data) { alert("Exception thrown ->" + data); }
}, options || {});
var localOnSuccessHandler = function (data) {
/// <summary>
/// Данная функция является callback функцией, которая вызывается в случае успешного завершения внутреннего вызова ajaxRequest
/// </summary>
/// <param name="data" type="String">
/// Результат в виде строки - сериализованное состояние объекта-ответа со стороны серверной части
/// </param>
/// <returns type="undefined" />
var deserialized_request = $.JSON.decode(data);
settings.onSuccess(deserialized_request);
}
var localOnErrorHandler = function (exception) {
/// <summary>
/// Данная функция является callback функцией, которая вызывается в случае НЕуспешного завершения внутреннего вызова ajaxRequest
/// </summary>
/// <param name="data" type="String">
/// Результат ошибки в виде строки
/// </param>
/// <returns type="undefined" />
settings.onError(exception);
}
var arrayParameters = [];
$.each(parameters, function (name, value) {
var wrapperParameter =
{ "Key": name,
"Value": value
};
arrayParameters.push(wrapperParameter);
});
var request = {
MethodName: methodName,
Parameters: arrayParameters
};
ajaxRequest(settings.control_id, request, localOnSuccessHandler, localOnErrorHandler);
}
// #endregion
</pre><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Что мы здесь видим. Первое - <b>settings </b>для нашего плагина, как нам рекоментует делать jQuery Framework.</span></div><span style="font-family: verdana,geneva;"><span style="font-family: verdana,geneva;"><a href="http://docs.jquery.com/Plugins/Authoring#Defaults_and_Options" target="_blank" title="http://docs.jquery.com/Plugins/Authoring#Defaults_and_Options">http://docs.jquery.com/Plugins/Authoring#Defaults<i>and</i>Options</a></span></span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<pre class="js" name="code">var settings = jQuery.extend({
control_id: null,
onSuccess: function (data) { },
onError: function (data) { alert("Exception thrown ->" + data); }
}, options || {});
</pre><br />
<div style="text-align: justify;"><span style="font-family: verdana,geneva;">Далее, локальный обработчик успешного вызова Callback со стороны клиента, как видим, здесь локальный обработчик делегирует вызов нашему обработчику <b>onSuccess </b>из <b>settings</b>, предварительно десериализовав результат:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><pre class="js" name="code">var localOnSuccessHandler = function (data) {
/// <summary>
/// Данная функция является callback функцией, которая вызывается в случае успешного завершения внутреннего вызова ajaxRequest
/// </summary>
/// <param name="data" type="String">
/// Результат в виде строки - сериализованное состояние объекта-ответа со стороны серверной части
/// </param>
/// <returns type="undefined" />
var deserialized_request = $.JSON.decode(data);
settings.onSuccess(deserialized_request);
}
</pre><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Аналогично, локальный обработчик <b>не</b>успешного вызова Callback со стороны клиента, здесь десериализовать ничего не нужно, нам нужно получить только сообщение об ошибке со стороны сервера.</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><pre class="js" name="code">var localOnErrorHandler = function (exception) {
/// <summary>
/// Данная функция является callback функцией, которая вызывается в случае НЕуспешного завершения внутреннего вызова ajaxRequest
/// </summary>
/// <param name="data" type="String">
/// Результат ошибки в виде строки
/// </param>
/// <returns type="undefined" />
settings.onError(exception);
}
</pre><div style="text-align: justify;"><span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Теперь уже осталось немного, мы дошли до подготовки наших данных для отправки на сервер, здесь подгатавливаем объект request, в котором мы указали имя метода и список его параметров. </span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Помните класс <b>AjaxRequestParameters </b>на серверной стороне? да, это именно его представление, в объект класса <b>AjaxRequestParameters </b>может быть преобразован данный объект со стороны клиента.</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><pre class="js" name="code">var arrayParameters = [];
$.each(parameters, function (name, value) {
var wrapperParameter =
{ "Key": name,
"Value": value
};
arrayParameters.push(wrapperParameter);
});
var request = {
MethodName: methodName,
Parameters: arrayParameters
};
</pre><span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Все готово, вызываем <b>ajaxRequest</b>:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<pre class="js" name="code">ajaxRequest(settings.control_id, request, localOnSuccessHandler, localOnErrorHandler);
</pre><div style="text-align: justify;"><span style="font-family: verdana,geneva;"><b><br />
</b></span><br />
<span style="font-family: verdana,geneva;"><span class="Apple-style-span" style="color: #cc0000;"><b>Стоп, что это !!!</b> </span>что это за <b><span class="Apple-style-span" style="color: red;">ajaxRequest </span></b>такой?!!</span></div><br />
<div style="text-align: justify;"><span style="font-family: verdana,geneva;">Не волнуйтесь, <b>ajaxRequest </b>- это само ядро callback вызова. Где оно формируется? </span><br />
<span style="font-family: verdana,geneva;">А формируется оно в уже рассмотренном нами классе <b>AjaxWebModule</b>:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><pre class="c#" name="code">/// <summary>
/// Имя функции, которая будет использоваться для вызова серверного сценария со стороны клиента, принимает один аргумент ARG в виде строки
/// </summary>
[Browsable(true)]
[Category("Callback Handlers")]
[DefaultValue("serverCall")]
[Description("Имя функции, которая будет использоваться для вызова серверного сценария со стороны клиента, принимает один аргумент ARG в виде строки ")]
public string ServerCallFunctionName
{
get
{
return "ajaxRequest";
}
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
#region регистрация server callback function со стороны клиента - здесь формируем wrapper на функцией WebFormdoCallback
if (!this.Page.ClientScript.IsClientScriptBlockRegistered(this.Page.GetType(), "AjaxRequestWebFormDoCallbackScript"))
{
string webFormDoCallbackScript = this.Page.ClientScript.GetCallbackEventReference("control_id", "serialized_request", "localOnSuccessHandler", null, "localOnErrorHandler", true);
string serverCallScript = "function " + this.ServerCallFunctionName + "(control_id, arg, localOnSuccessHandler, localOnErrorHandler){" +
"\r\n" +
"var serialized_request = $.JSON.encode(arg);\r\n" +
"if (typeof(control_id) == 'undefined' || control_id == null)\r\n" +
String.Format("{{ control_id='{0}';}}\r\n", this.UniqueID) +
webFormDoCallbackScript +
";\n}\n";
this.Page.ClientScript.RegisterClientScriptBlock(this.Page.GetType(), "AjaxRequestWebFormDoCallbackScript", serverCallScript, true);
}
#endregion
#region WebformDoCallback script registration
// fix проблемы описанной http://www.codeproject.com/KB/aspnet/pendingcallbacks.aspx
// регистрируем функцию WebForm_CallbackComplete_SyncFixed, в которой нет ошибки с обращение к переменной i в цикле for
string callbackCompleteFixScriptName = "WebForm_CallbackComplete_SyncFixed";
string callbackCompleteFixScript = @"
function WebForm_CallbackComplete_SyncFixed() {
// the var statement ensure the variable is not global
for (var i = 0; i < __pendingCallbacks.length; i++) {
callbackObject = __pendingCallbacks[i];
if (callbackObject && callbackObject.xmlRequest &&
(callbackObject.xmlRequest.readyState == 4)) {
if (!__pendingCallbacks[i].async) {
__synchronousCallBackIndex = -1;
}
__pendingCallbacks[i] = null;
var callbackFrameID = '__CALLBACKFRAME' + i;
var xmlRequestFrame = document.getElementById(callbackFrameID);
if (xmlRequestFrame) {
xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);
}
WebForm_ExecuteCallback(callbackObject);
}
}
}
";
if (!this.Page.ClientScript.IsClientScriptBlockRegistered(this.Page.GetType(), callbackCompleteFixScriptName))
{
this.Page.ClientScript.RegisterClientScriptBlock(this.Page.GetType(), callbackCompleteFixScriptName, callbackCompleteFixScript, true);
}
// заменяем функцию WebForm_CallbackComplete на нашу WebForm_CallbackComplete_SyncFixed и регистрируем ее на момент
// полной загрузки страницы
string onloadScriptName = "pageload_callback_complete_fix";
string onloadScript = @"
if (typeof (WebForm_CallbackComplete) == 'function') {
WebForm_CallbackComplete = WebForm_CallbackComplete_SyncFixed;
}
";
if (!this.Page.ClientScript.IsStartupScriptRegistered(callbackCompleteFixScriptName))
{
this.Page.ClientScript.RegisterStartupScript(this.GetType(), onloadScriptName, onloadScript, true);
}
#endregion
}
</pre><br />
<div style="text-align: justify;"><span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Если мы посмотрим исходный код нашей страницы, то увидим результат выполнения <b>OnPrerender</b>:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><pre class="js" name="code">function ajaxRequest(control_id, arg, localOnSuccessHandler, localOnErrorHandler){
var serialized_request = $.JSON.encode(arg);
if (typeof(control_id) == 'undefined' || control_id == null)
{ control_id='ctl00$Content$DemoUserControl1';}
WebForm_DoCallback(control_id,serialized_request,localOnSuccessHandler,null,localOnErrorHandler,true);
}
</pre><div style="text-align: justify;"><span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Собственно, здесь как раз и происходит "заворачивание" нашего "объектного" вызова в строку и передача его в <b>WebForm_DoCallback</b>. </span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Сигнатура данного метода подробно описана как в msdn, так и у меня в статьях по выполнения cakkback со стороны клиента ранее. </span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Надеюсь, магии и не рассмотренных вопросов тут не осталось, вызов со стороны клиента по прежнему остался прежним, реализуется он через <b>ICallbackEventHandler</b>. </span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Передача параметров туда и обратно осталось такой же - а именно - только путем передачи строковых значений. </span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Мы же просто обернули все это в красивую оболочку, которой будет приятно пользоваться, но понимание того, как это все работает, важно. Вы можете расширить возможности данного подхода, например, для поддержки какого-то jQuery ui-контрола, например, грида и прочее.</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;">Чуть не забыл....если вы внимательно посмотрели на код реализации ajaxRequest не смогли не заметить такой параметр, как <b>controlid </b>(по умолчанию его значение null). Зачем оно? </span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;">Нужен этот параметр только для того, чтобы разделить вызовы из разных user controls, т.е. в том случае, когда на странице есть несколько user controls, из клиенских скриптов которых осуществляется вызов серверных методов, причем, сигнатура их может быть совпадать. Или, в том случае, когда на странице два инстанса нашего ajax available user control - тут нам и пригодится controlid, чтобы разделить вызовы, идущие к конкретному инстансу user control. Делается это так:</span><br />
<span style="font-family: verdana,geneva;"><br />
</span><br />
<span style="font-family: verdana,geneva;"><br />
</span></div><pre class="js" name="code">jQuery.execute("DemoMethod1", { "id": 1, "name": "testName" },
{
control_id: '<%= UniqueID %>',
onSuccess: function(data) {
alert("settings:" + data.AdditionalSettings + ";currentPage:" + data.CurrentPage.toString());
},
onError: function(exception) { alert(exception); }
});
</pre><br />
<div style="text-align: justify;"><span style="font-family: verdana,geneva;">Спасибо за то, что осилили так "много букав", надеюсь статья будет полезной в использовании. В начале статьи приведена ссылка на пример данного решения. </span></div><div style="text-align: justify;"><span style="font-family: verdana,geneva;"><br />
</span></div></div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-35150300554749366102011-09-28T10:47:00.001+04:002011-09-28T10:47:06.983+04:00SharePoint 2010 unit testing in Visual Studio 2010<p style="text-align: justify;"><span style="font-family: verdana, geneva;"><span style="color: #ff0000;"><strong><span style="font-size: xx-large;">Б</span></strong></span>ля ну что за лажа с шарпоинт, точнее даже не с ним :) (не кидайте камнями, решение внизу)</span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;">Вдруг выяснилось, что нельзя написать ms test targeted to .net 3.5 в Visual Studio 2010, </span><span style="font-family: verdana, geneva;">чтобы написать парочку тестов, связанных с sharepoint 2010.</span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;">В конечном итоге так и придется использовать какие-нить тулзы типа nUnit...</span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;">Ладно, в любом случае в процессе гуглинга надыбал интересную фишку, а именно, все же можно заставить ms test выполняться в x64 mode.</span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;"><strong>Подробности здесь</strong></span><br /> <span style="font-family: verdana, geneva;"><a href="http://msdn.microsoft.com/en-us/library/ee782531.aspx">http://msdn.microsoft.com/en-us/library/ee782531.aspx</a></span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;">что удивительно, описание в картинках, вот так бы почаще :)</span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;">Достучаться до этого диалога можно, находясь в контексте ms тестового проекта:</span></p><p style="text-align: justify;"> </p><p style="text-align: justify;"><span style="font-family: verdana, geneva;"><img src="http://lh5.ggpht.com/-TcrggMyioBc/ToK6mdqRoqI/AAAAAAAAKKc/joGY3bQm9ek/%25255BUNSET%25255D.png" alt="" width="597" height="262" /><br /> </span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;"><span style="font-size: large;"><strong><span style="color: #ff0000;">Как выяснилось</span></strong></span>, решение все же есть:</span></p><p style="text-align: justify;"> </p><p style="text-align: justify;"><span style="font-family: verdana, geneva;"><a title="http://msdn.microsoft.com/en-us/library/gg601487.aspx" href="http://msdn.microsoft.com/en-us/library/gg601487.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/gg601487.aspx</a></span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;"><strong>Testing SharePoint 2010 Applications</strong></span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;">The capabilities listed above also enable you to write unit tests and integration tests for SharePoint 2010 applications using Visual Studio 2010 Service Pack 1. For more information about how to develop SharePoint 2010 applications using Visual Studio 2010, see SharePoint Development in Visual Studio, Building and Debugging SharePoint Solutions and Verifying and Debugging SharePoint Code by Using ALM Features.</span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;"><strong>Limitations</strong></span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;">The following limitations apply when you re-target your test projects to use the .NET Framework 3.5:</span></p><blockquote><p><span style="font-size: x-small; font-family: verdana, geneva;">In the .NET Framework 3.5, multitargeting is supported for test projects that contain only unit tests. The .NET Framework 3.5 does not support any other test type, such as coded UI or load test. The re-targeting is blocked for test types other than unit tests.</span></p><p><span style="font-size: x-small; font-family: verdana, geneva;">Execution of .NET Framework 3.5 tests is supported only in the default host adapter. It is not supported in the ASP.NET host adapter. ASP.NET applications that have to run in the ASP.NET Development Server context must be compatible with the .NET Framework 4.</span></p><p><span style="font-size: x-small; font-family: verdana, geneva;">Data collection support is disabled when you run tests that support .NET Framework 3.5 multitargeting. You can run code coverage by using the Visual Studio command-line tools.</span></p><p><span style="font-size: x-small; font-family: verdana, geneva;">Unit tests that use .NET Framework 3.5 cannot run on a remote machine. </span></p></blockquote><p> </p><p><span style="font-family: verdana, geneva;"><strong>В описании сервис-пака:</strong></span><br /> <span style="font-family: verdana, geneva;"><a title="http://support.microsoft.com/kb/983509" href="http://support.microsoft.com/kb/983509" target="_blank">http://support.microsoft.com/kb/983509</a></span></p><blockquote><p style="text-align: justify;"><span style="font-family: verdana, geneva;"><a title="http://support.microsoft.com/kb/983509" href="http://support.microsoft.com/kb/983509" target="_blank"></a><span style="font-size: x-small;">Basic Unit Testing support for the .NET Framework 3.5</span></span><br /> <span style="font-size: x-small; font-family: verdana, geneva;">In Visual Studio 2010 SP1, you now have the functionality to test your applications that target the .NET </span></p></blockquote><p style="text-align: justify;"><span style="font-family: verdana, geneva;">Итак, поехали, сервиспак радостно качаем отсюда:</span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;"><a title="http://www.microsoft.com/download/en/confirmation.aspx?id=23691" href="http://www.microsoft.com/download/en/confirmation.aspx?id=23691" target="_blank">http://www.microsoft.com/download/en/confirmation.aspx?id=23691</a></span></p><p style="text-align: justify;"><img src="http://lh5.ggpht.com/-qbcVGlXntj8/ToK6q5T7m0I/AAAAAAAAKKg/UUYkQd1Pbck/%25255BUNSET%25255D.png" alt="" width="503" height="467" /></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;">Теперь выставляем targetting framwework в .net 3.5, хост выполнения теста в x64 mode:</span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;">Наслаждаемся:</span></p><p style="text-align: justify;"><span style="font-family: verdana, geneva;"><img src="http://lh3.ggpht.com/-s8gDXDXW5VU/ToLCYgnKp_I/AAAAAAAAKKk/gUggEjRNKH0/%25255BUNSET%25255D.png" alt="" width="680" height="258" /><br /></span></p><p style="text-align: justify;">Будут вопросы, пишите :) Будет время, отвечу :)</p><p style="text-align: justify;"> </p><p style="text-align: justify;"> </p><p style="text-align: justify;"> </p><p style="text-align: justify;"><span style="font-family: verdana, geneva;"><br /></span></p><p> </p><p style="text-align: justify;"><span style="font-family: verdana, geneva;"><br /> </span></p>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-82536919716867474822011-07-21T15:18:00.002+04:002011-07-21T15:18:58.925+04:00В мемориз<div dir="ltr" style="text-align: left;" trbidi="on"><a href="http://visualstudiogallery.msdn.microsoft.com/15055544-fda0-42db-a603-6dc32ed26fde/">CAML.NET Intellisense for Visual Studio 2010</a> </div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-774615754572948102011-07-08T12:23:00.004+04:002011-07-08T12:40:52.757+04:00[Window Server 2008, SharePoint 2010, Visual Studio, TFS] How to connect to TFS with different user credentials<p style="text-align: justify;"><span style="color: #ff0000; font-size: xx-large;"><strong>С</strong></span>обственно, потребовалось подключиться к TFS под другим аккаунтом, оказалось, это достаточно проблематично, если сама студия уже сохранила user credentials.</p><p style="text-align: justify;">Никакого диалога в студии вы не найдете, попытки disconnect в team viewer и обратный connect ничего не дадут, вы будете работать под предыдущим аккаунтом.</p><p style="text-align: justify;">Проблема рассматривалась также вот здесь:</p><p style="text-align: justify;"><a href="http://stackoverflow.com/questions/1971316/connect-to-tfs-with-different-user-credentials">Connect to TFS with different user credentials</a></p><p style="text-align: justify;">но мне как-то это не сильно помогло, итак мой рецепт, как это лечить:</p><p style="text-align: justify;"> </p><p style="text-align: justify;">1.<span style="white-space: pre;"> </span>Идем в control panel, фильтруем по manage passwords:</p><p style="text-align: justify;"><img src="http://lh4.ggpht.com/-dNNnVQFbL5E/Tha8VLOpokI/AAAAAAAAG50/5w85C_JwsOs/%25255BUNSET%25255D.png" alt="" width="853" height="466" /></p><p style="text-align: justify;"> </p><p style="text-align: justify;">2.<span style="white-space: pre;"> </span>Далее, manage windows credentials:</p><p style="text-align: justify;">Здесь видим тот аккаунт, который windows будет использовать по умолчанию для доступа к TFS:</p><p style="text-align: justify;"><img src="http://lh5.ggpht.com/-FvaDObw7yoA/Tha9BvKgVnI/AAAAAAAAG6E/VAYr-ji5OcM/%25255BUNSET%25255D.png" alt="" width="853" height="600" /></p><p style="text-align: justify;"> </p><p style="text-align: justify;">Делаем Remove from vault, перегружаем студию, в следующей попытке сделать connect to TFS студия запросит новый аккаунт.</p><p style="text-align: justify;">Кеширование аккаунта происходит по той причине, что мы сами его и сохраняем, когда выбираем чекбокс Remember my credentials:</p><p style="text-align: justify;"><img src="http://lh6.ggpht.com/-TB9HgZvLjAA/ThbCjYUWZlI/AAAAAAAAG6Y/8Kp2kbsZkuE/%25255BUNSET%25255D.png" alt="" width="432" height="246" /></p><p style="text-align: justify;"> </p><p style="text-align: justify;"> </p>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com1tag:blogger.com,1999:blog-5872121829029410622.post-3065361554243032262010-03-31T23:44:00.005+04:002010-03-31T23:54:07.990+04:00Тесты и Exception вида "System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used"....<div style="font-family: Verdana,sans-serif; text-align: justify;"><b style="color: red;"><span style="font-size: x-large;">В</span></b> проекте используется com interrop,вкратце, создается COM-инстанс и обращение к нему происходит через singletone-объект;</div><div style="font-family: Verdana,sans-serif; text-align: justify;"><br />
</div><div style="font-family: Verdana,sans-serif; text-align: justify;">Необходимо было покрыть тестами часть данной функциональности, связанной с обращением к COM, и вот тут-то при запуске нескольких тестов и стало возникать исключение:</div><div style="font-family: Verdana,sans-serif; text-align: justify;"><br />
</div><div style="font-family: Verdana,sans-serif; text-align: justify;"><i><b>"System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used"</b></i></div><div style="font-family: Verdana,sans-serif; text-align: justify;"><br />
</div><div style="font-family: Verdana,sans-serif; text-align: justify;"></div><div style="font-family: Verdana,sans-serif; text-align: justify;">Проблема связана с тем, что каждый тест по умолчанию запускается в отдельном потоке, или даже домене (подробнее не разбирался), и доступ к инстансу COM-server происходил из другого потока...</div><div style="font-family: Verdana,sans-serif; text-align: justify;"><br />
</div><div style="font-family: Verdana,sans-serif; text-align: justify;">Проблему пофиксил пока путем настройки не паралельного запуска тестов, а их последовательного выполнения. </div><div style="font-family: Verdana,sans-serif; text-align: justify;"><br />
</div><div style="font-family: Verdana,sans-serif; text-align: justify;">Настраивается такое поведение путем внесения изменений в Local.testsettings файл, а именно, путем указания количества одновременно выполняемых тестов в </div><span style="font-family: Verdana,sans-serif;"><br />
<br />
<br />
<Execution <b>parallelTestCount</b>=""<вставить нужное="" значение=""></span><br />
<br />
<br />
<br />
<span style="font-family: Verdana,sans-serif;"> если parallelTestCount == 0, то тесты выполняются параллельно, количество тестов в пуле выбирается самой студией...</span><br />
<br />
<br />
<br />
<span style="font-family: Verdana,sans-serif;"> Мне же был нужен следующий вариант:</span><br />
<br />
<pre class="xml" name="code"> <TestSettings name="Local" id="38863d1e-30b7-4b4a-a629-4add84f4982e" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<Description>These are default test settings for a local test run.</Description>
<Execution parallelTestCount="1">
<TestTypeSpecific />
<Timeouts runTimeout="900000" testTimeout="900000" />
<ExecutionThread apartmentState="MTA"/>
<AgentRule name="Execution Agents">
</AgentRule>
</Execution>
</TestSettings></pre><br />
<br />
<span style="font-family: Verdana,sans-serif;"><b style="color: red;">Важно: </b>чтобы ваши изменения вступили в силу, нужно перегрузить проект/решение;</span><br />
<br />
<span style="font-family: Verdana,sans-serif;"><b style="color: #f4cccc;">ps:</b> попутно читал следующие ресурсы:</span><br />
<span style="font-family: Verdana,sans-serif;"><br />
<a href="http://connect.microsoft.com/VisualStudio/feedback/details/534124/exception-running-tests-that-use-waithandle-waitall-waithandles">http://connect.microsoft.com/VisualStudio/feedback/details/534124/exception-running-tests-that-use-waithandle-waitall-waithandles</a><br />
<br />
VS2010 tip: How to run unit tests in parallel<br />
<a href="http://blogs.microsoft.co.il/blogs/dhelper/archive/2010/03/02/vs2010-tip-how-to-run-unit-tests-in-parallel.aspx">http://blogs.microsoft.co.il/blogs/dhelper/archive/2010/03/02/vs2010-tip-how-to-run-unit-tests-in-parallel.aspx</a><br />
<br />
Parallel Test Execution in Visual Studio 2010<br />
<a href="http://msmvps.com/blogs/p3net/pages/parallel-test-execution-in-visual-studio-2010.aspx">http://msmvps.com/blogs/p3net/pages/parallel-test-execution-in-visual-studio-2010.aspx</a><br />
<br />
Executing Unit Tests in parallel on a multi-CPU/core machine<br />
<a href="http://blogs.msdn.com/vstsqualitytools/archive/2009/12/01/executing-unit-tests-in-parallel-on-a-multi-cpu-core-machine.aspx">http://blogs.msdn.com/vstsqualitytools/archive/2009/12/01/executing-unit-tests-in-parallel-on-a-multi-cpu-core-machine.aspx</a></span>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com1tag:blogger.com,1999:blog-5872121829029410622.post-61038741611013629912010-03-25T10:25:00.004+03:002010-03-31T23:47:41.973+04:00Конфигурация WCF Service без app.config<div style="font-family: Verdana,sans-serif; text-align: justify;"><span style="font-size: small;"><span style="color: red; font-size: x-large;"><b>Н</b></span>едавно столкнулся с такой задачей - потребовалось произвести настройку WCF службы напрямую из кода, т.е. без использования .config файла приложения. Потребовалось немало времени, чтобы выгуглить вменяемые примеры, потому ту часть решения, которая получилась у</span></div><div style="font-family: Verdana,sans-serif; text-align: justify;"><span style="font-size: small;">меня, выкладываю сюда, надеюсь пригодится кому в качестве отправной точки...</span></div><div style="font-family: Verdana,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Verdana,sans-serif;"><span style="font-size: small;"><br />
</span></div><div style="font-family: Verdana,sans-serif;"><span style="font-size: small;">Итак, исходный конфиг:</span></div><div style="font-family: Verdana,sans-serif;"><span style="font-size: small;"><br />
</span></div><pre class="xml" name="code"><system.servicemodel>
<!-- диагностика - включим трассировку сообщений, который будут сохраняться в файлах, указанных листенерах -->
<diagnostics>
<messagelogging logmalformedmessages="true" logmessagesattransportlevel="true">
</messagelogging>
<behaviors>
<servicebehaviors>
<behavior name="SampleService.Behavior.Service">
<!-- отдаем пока исключение в процесс отдладки -->
<servicedebug includeexceptiondetailinfaults="true">
<!-- разрешаем сервису отдавтать описание - wsdl -->
<servicemetadata httpgetenabled="true">
</servicemetadata >
</servicedebug>
</behavior>
<!-- привязки и их настройки -->
<bindings>
<webhttpbinding>
<binding name="SampleService.EndPointConfiguration.Web">
allowCookies="true"
closeTimeout="00:10:00"
openTimeout="00:10:00"
receiveTimeout="00:10:00"
sendTimeout="00:10:00"
bypassProxyOnLocal="false"
maxBufferPoolSize="10000000"
useDefaultWebProxy="true"
maxReceivedMessageSize="4096">
<security mode="None"></security>
</binding>
</webhttpbinding>
</bindings>
<services>
<!-- указываем сервис -->
<service name="SampleService">
behaviorConfiguration="SampleService.Behavior.Service">
<endpoint address="http://127.0.0.1:9999/">
binding="webHttpBinding"
behaviorConfiguration="SampleService.Behavior.EndPointBehavior"
bindingConfiguration="SampleService.EndPointConfiguration.Web"
contract="SampleService.IServiceContract">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange">
<host>
<baseaddresses>
<add baseaddress="http://127.0.0.1:9999/">
</add>
</baseaddresses>
</host>
</endpoint>
</service >
</system.servicemodel>
</pre><br />
<div style="font-family: Verdana,sans-serif;">превращается в пару строку из ini файла:</div><br />
<pre class="xml" name="code">[sample_service]
host=127.0.0.1
port=9999
</pre><br />
<div style="font-family: Verdana,sans-serif; text-align: justify;">c# код программного создания конечной точки и описанных поведений, аналогичных тем, которые были ранее в .config, приведен ниже:</div><br />
<pre class="c#" name="code"> #region binding
WebHttpBinding binding = new WebHttpBinding();
binding.AllowCookies = true;
binding.CloseTimeout = TimeSpan.FromMinutes(10);
binding.SendTimeout = TimeSpan.FromMinutes( 10 );
binding.OpenTimeout = TimeSpan.FromMinutes( 10 );
binding.ReceiveTimeout = TimeSpan.FromMinutes( 10 );
binding.BypassProxyOnLocal = false;
binding.UseDefaultWebProxy = true;
binding.MaxBufferPoolSize = 1000000;
binding.MaxReceivedMessageSize = 1000000;
binding.Security.Mode = WebHttpSecurityMode.None;
#endregion
#region endpoint adress
Uri endpointUri = GlobalConfiguration.SETTINGS_SAMPLE_SERVICE_BASE_ADDRESS;
Uri mexEndpointUri = new Uri(String.Format("{0}/mex", endpointUri.ToString()));
#endregion
SampleServiceHost.Instance = new ServiceHost(typeof(SampleService), endpointUri);
#region wcf behaviour setup
// behoviours
SampleServiceHost.Instance.Description.Behaviors.Clear();
ServiceBehaviorAttribute behaviour = new ServiceBehaviorAttribute();
behaviour.InstanceContextMode = InstanceContextMode.Single;
behaviour.ConcurrencyMode = ConcurrencyMode.Single;
SampleServiceHost.Instance.Description.Behaviors.Add(behaviour);
ServiceMetadataBehavior serviceMetadataBehavior = new ServiceMetadataBehavior();
serviceMetadataBehavior.HttpGetEnabled = true;
SampleServiceHost.Instance.Description.Behaviors.Add(serviceMetadataBehavior);
ServiceDebugBehavior serviceDebugBehavior = new ServiceDebugBehavior();
serviceDebugBehavior.HttpHelpPageEnabled = true;
serviceDebugBehavior.HttpsHelpPageEnabled = true;
serviceDebugBehavior.IncludeExceptionDetailInFaults = true;
SampleServiceHost.Instance.Description.Behaviors.Add(serviceDebugBehavior);
#endregion
// listening end point
SampleServiceHost.Instance.AddServiceEndpoint(typeof(SampleService.IServiceContract), binding, endpointUri.ToString()).Behaviors.Add(new WebHttpBehavior());
// and mex endpoint
SampleServiceHost.Instance.AddServiceEndpoint(typeof(IMetadataExchange), binding, mexEndpointUri.ToString());
// start service
SampleServiceHost.Instance.Open();
</pre>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com2tag:blogger.com,1999:blog-5872121829029410622.post-8992222859982461522010-01-19T14:50:00.003+03:002010-01-19T15:06:38.235+03:00Просто в архив ссылок<div style="text-align: justify;"><span style="font-weight: bold; color: rgb(102, 102, 102);font-family:verdana;" >COMMON</span><br /></div><p style="text-align: justify;" face="verdana"> <span style="font-family: verdana;">How to: Install and Configure WCF Activation Components</span><br /><span style="font-family: verdana;">0. </span><a style="font-family: verdana;" href="http://msdn.microsoft.com/en-us/library/ms731053.aspx">http://msdn.microsoft.com/en-us/library/ms731053.aspx</a> </p><p face="verdana" style="font-family: verdana; text-align: justify;">0. A Guide to Designing and Building RESTful Web Services with WCF 3.5<br /><a href="http://msdn.microsoft.com/en-us/library/dd203052.aspx">http://msdn.microsoft.com/en-us/library/dd203052.aspx</a><br /><br />документация по WCF REST Services<br /><a href="http://msdn.microsoft.com/en-us/library/ee391967.aspx">http://msdn.microsoft.com/en-us/library/ee391967.aspx</a><br /><br />1. javascript class, расширяющий object методами расширения для сериализации/десериализации из json<br /><a href="http://www.json.org/json.js">http://www.json.org/json.js</a><br /><br />2. json-сериализация в javascript<br /><a href="http://www.onegeek.com.au/articles/programming/javascript-serialization.php">http://www.onegeek.com.au/articles/programming/javascript-serialization.php</a><br /><br />3. как реализовать enum в javascript<br /><a href="http://www.javascriptkata.com/2007/03/22/how-to-do-enumerations-enum-in-javascript/">http://www.javascriptkata.com/2007/03/22/how-to-do-enumerations-enum-in-javascript/</a></p><div style="text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;">3.1 OOP в javascript - интересная статья<br /><a href="http://www.webmonkey.com/tutorial/Make_OOP_Classes_in_JavaScript">http://www.webmonkey.com/tutorial/Make_OOP_Classes_in_JavaScript</a><br /><br />3.2 Классическое наследование в javascript<br /><a href="http://www.crockford.com/javascript/inheritance.html">http://www.crockford.com/javascript/inheritance.html</a><br /><br />4. Использование custom-templates во flex project<br /><a href="http://www.hemtalreja.com/?p=136">http://www.hemtalreja.com/?p=136</a><br /><a href="http://www.morearty.com/blog/2006/05/19/customizing-flex-builders-html-templates/">http://www.morearty.com/blog/2006/05/19/customizing-flex-builders-html-templates/</a><br /><br /><br />5. Библиотека для работы с JSON в Action Script<br /><a href="http://code.google.com/p/as3corelib/source/browse/trunk/tests/src/com/adobe/serialization/json/JSONTest.as?r=82">http://code.google.com/p/as3corelib/source/browse/trunk/tests/src/com/adobe/serialization/json/JSONTest.as?r=82</a><br /><br />Использвание JSON<br /><a href="http://www.mikechambers.com/blog/2006/03/28/tutorial-using-json-with-flex-2-and-actionscript-3/">http://www.mikechambers.com/blog/2006/03/28/tutorial-using-json-with-flex-2-and-actionscript-3/</a><br /><a href="http://summitprojectsflashblog.wordpress.com/2008/11/06/json-and-nested-objects/">http://summitprojectsflashblog.wordpress.com/2008/11/06/json-and-nested-objects/</a><br /><a href="http://www.actionscript.org/resources/articles/516/1/JSON-Communication-with-Flash-Loading-Data/Page1.html">http://www.actionscript.org/resources/articles/516/1/JSON-Communication-with-Flash-Loading-Data/Page1.html</a><br /><br />6. Настройка WCF as WEB Service<br />Интересная статья о том как настросить WCF Как WebService<br /><a href="http://kjellsj.blogspot.com/2006/12/how-to-expose-wcf-service-also-as-asmx.html">http://kjellsj.blogspot.com/2006/12/how-to-expose-wcf-service-also-as-asmx.html</a><br /><a href="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/03/19/WCF-Integration-in-Silverlight-2-Beta-1.aspx">http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/03/19/WCF-Integration-in-Silverlight-2-Beta-1.aspx</a><br /><br />7. Настройка WCF<br />CrossDomain & Clientaccesspolicy XML<br /><a href="http://msdn.microsoft.com/en-us/library/cc197955%28VS.95%29.aspx">http://msdn.microsoft.com/en-us/library/cc197955(VS.95).aspx</a><br /><br />Hosting<br />WCF Services and ASP.NET<br /><a href="http://msdn.microsoft.com/en-us/library/aa702682.aspx">http://msdn.microsoft.com/en-us/library/aa702682.aspx</a><br /><br /><br />8. Настройка прокси<br /><a href="http://support.microsoft.com/kb/318140">http://support.microsoft.com/kb/318140</a><br /><br /><br />9. Интересная статья про появление злосчастной "d" в результатх json сериализации<br /><a href="http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/83f486af-8249-461e-9d28-2a2df539c63e">http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/83f486af-8249-461e-9d28-2a2df539c63e</a><br /><br /><br />10. ASP.NET Compatibility Mode<br /><a href="http://blogs.msdn.com/wenlong/archive/2006/01/23/516041.aspx">http://blogs.msdn.com/wenlong/archive/2006/01/23/516041.aspx</a><br /><br /><br />11. Compress your javascript and css files<br /><a href="http://www.scriptalizer.com/">http://www.scriptalizer.com/</a><br /><br /><br />12. Экранная типографика<br /><a href="http://www.artlebedev.ru/kovodstvo/sections/62/">http://www.artlebedev.ru/kovodstvo/sections/62/</a><br /><br /><br />13. Шрифты диапозоны и специальные символы<br /><a href="http://www.unicode.org/charts/">http://www.unicode.org/charts/</a></p><br /><br /><span style="font-weight: bold; color: rgb(51, 51, 51);font-family:verdana;" >DevExpress</span><br /><br /><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;">Последние версии AspxExperience<br /><a href="http://www.devexpress.com/Downloads/NET/DXperience/">http://www.devexpress.com/Downloads/NET/DXperience/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;">Клиентский центр DX<br /><a href="http://www.devexpress.com/Support/Center/">http://www.devexpress.com/Support/Center/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;">community & Blogs<br /><a href="http://community.devexpress.com/">http://community.devexpress.com/</a><br /><a href="http://community.devexpress.com/blogs/">http://community.devexpress.com/blogs/</a> </p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;">On-line Tutorials с исходным кодом<br /><a href="http://demos.devexpress.com/Tutorials/">http://demos.devexpress.com/Tutorials/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> </p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;">ajax toolkit tab container customization:<br /><a href="http://mattberseth.com/blog/2007/09/creating_a_yui_tabview_style_t.html">http://mattberseth.com/blog/2007/09/creating_a_yui_tabview_style_t.html</a> </p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"><br />html colors charts:<br /><a href="http://www.tayloredmktg.com/rgb/">http://www.tayloredmktg.com/rgb/</a><br /><a href="http://www.febooti.com/products/iezoom/online-help/html-color-names-16-color-chart.html">http://www.febooti.com/products/iezoom/online-help/html-color-names-16-color-chart.html</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"><br />SubVersion<br />Написание hook-ов<br /><a href="http://eugene.muzychenko.net/articles/software/numeric.txt">http://eugene.muzychenko.net/articles/software/numeric.txt</a><br /><a href="http://icons4swrus.com/subversion-na-svoem-kompyutere.php">http://icons4swrus.com/subversion-na-svoem-kompyutere.php</a><br /><br />release notes<br /><a href="http://subversion.tigris.org/svn_1.5_releasenotes.html">http://subversion.tigris.org/svn_1.5_releasenotes.html</a><br /><br />Интеграция с системами отслеживания ошибок/проблем<br /><a href="http://tortoisesvn.net/docs/nightly/TortoiseSVN_ru/tsvn-dug-bugtracker.html">http://tortoisesvn.net/docs/nightly/TortoiseSVN_ru/tsvn-dug-bugtracker.html</a><br /><br />Консультант по Subversion - его блог и интересные заметки<br /><a href="http://rocksun.cn/about/">http://rocksun.cn/about/</a><br /><br />Настройка прав доступа на отдельные каталоги:<br />Path-Based Authorization<br /><a href="http://svnbook.red-bean.com/en/1.5/svn.serverconfig.pathbasedauthz.html">http://svnbook.red-bean.com/en/1.5/svn.serverconfig.pathbasedauthz.html</a><br /></p><p style="font-family: verdana; text-align: justify;"><span style="font-weight: bold; color: rgb(102, 102, 102);">Flex Links</span></p><div style="text-align: justify; font-family: verdana;"><br /></div><p style="font-family: verdana; text-align: justify;">0. Explorers</p><p style="font-family: verdana; text-align: justify;"> <a href="http://www.jamesward.com/easingFunctionFun/easingFunctionFun.html">http://www.jamesward.com/easingFunctionFun/easingFunctionFun.html</a><br /><a href="http://www.madeinflex.com/img/entries/2007/05/customeasingexplorer.html">http://www.madeinflex.com/img/entries/2007/05/customeasingexplorer.html</a><br /><a href="http://www.merhl.com/flex2_samples/filterExplorer/">http://www.merhl.com/flex2_samples/filterExplorer/</a><br /><a href="http://examples.adobe.com/flex2/consulting/styleexplorer/Flex2StyleExplorer.html">http://examples.adobe.com/flex2/consulting/styleexplorer/Flex2StyleExplorer.html</a><br /><a href="http://www.flexonrails.net/stylescreator/public/">http://www.flexonrails.net/stylescreator/public/</a><br /><br /><a href="http://www.alex-uhlmann.de/flash/adobe/blog/distortionEffects/effectCube/">http://www.alex-uhlmann.de/flash/adobe/blog/distortionEffects/effectCube/</a></p><p style="font-family: verdana; text-align: justify;">0. Performing object introspection - Аналог технологии Reflection<br /><a href="http://livedocs.adobe.com/flex/3/html/help.html?content=usingas_8.html">http://livedocs.adobe.com/flex/3/html/help.html?content=usingas_8.html</a><br /><br />0. Flex Internals<br /><a href="http://www.docsultant.com/site2/articles/flex_internals.html">http://www.docsultant.com/site2/articles/flex_internals.html</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;">1. Flex 3 Essential Training with David Gassner<br />video lessons<br /><a href="http://www.lynda.com/home/DisplayCourse.aspx?lpk2=438">http://www.lynda.com/home/DisplayCourse.aspx?lpk2=438</a><br /><br /><br />2. Load External CSS File<br /><a href="http://grfxguru.wordpress.com/2008/05/28/load-an-external-css-file-using-actionscript-3-sample-code/">http://grfxguru.wordpress.com/2008/05/28/load-an-external-css-file-using-actionscript-3-sample-code/</a><br /><br />3. Использование откомпилированных таблиц стилей<br /><a href="http://livedocs.adobe.com/flex/3/html/help.html?content=styles_10.html">http://livedocs.adobe.com/flex/3/html/help.html?content=styles_10.html</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;">4. Flex Component Kit Alpha for Flex 2.0.1<br /><a href="http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&loc=en_us&extid=1273018">http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&loc=en_us&extid=1273018</a><br />The Flex Component Kit for Flash CS3 allows you to create interactive,<br />animated content in Flash, and use it in Flex as a Flex component.<br />This is an Alpha version that was built for Flex 2.0.1.<br />The final version will be included as part of the Flex 3 SDK.<br />You can watch the presentation at <a href="http://adobedev.adobe.acrobat.com/p75214263/">http://adobedev.adobe.acrobat.com/p75214263/</a> to learn more about the component kit.<br />It includes the steps required to prepare your Flash content for Flex, and examples of various interaction possibilities....</p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> SUPPORT INFORMATION<br />None, the Flex 3 version will be supported. ZIP as updated on 10/10 to avoid corruption. </p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;">5. Flex Resources<br />Flex Components Flexbox<br />The Advanced Form component provides Reset, Undo and Redo functionality. Undo and Redo are accessed by pressing “ctrl-Z” and “ctrl-Y” respectively.<br />This component is part of flexlib (which is an awesome project). The source link above will download the whole flexlib library, you can get more information on using the flexlib components here<br />fle[ks]ray</p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Adobe Flex Components<br />Adobe Flex is a still young Developer Framework. For that reason there are not so many Open Source Projects out there like for other topics. Anyway, there are a few jewels. Components here</p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> FlexLib<br />FlexLib is a source code repository for Flex components under an MIT license. The repository contains there open source components: ConvertibleTreeList, Draggable Slider, PromptingTextInput, Scrollable Menu Controls, SuperTabNavigator, Alternative Scrolling Canvases, Horizontal Accordion</p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> FlexBox<br />FlexBox is a directory of 101 Flex components in a Flex RIA. It is a great source for locating various Flex components scattered all over the Internet.</p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> FlexComponents Discussion List<br />If you are making components or extending Flex this is the mother of all lists. Backed by some of the framework engineers and packed with great devs, FlexComponents is a great resource.</p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Flex Exchange<br />Flex Exchange at Adobe.com is a directory of Flex components submitted by developers.</p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Adobe Flex cookbook beta<br /><a href="http://www.tiny.cc/VbU44">http://www.tiny.cc/VbU44</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> AnimatedGIfLoader Flex Component<br />Allows you to load animated gif files into your Flex applications<br /><a href="http://dougmccune.com/blog/animatedgifloader-flex-component/">http://dougmccune.com/blog/animatedgifloader-flex-component/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Asdia<br />Provides an easy way to integrate flowcharts, uml or any other diagrams in flash tools.<br /><a href="http://code.google.com/p/asdia/">http://code.google.com/p/asdia/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> as3flexunitlib<br />ActionScript 3.0 framework for unit testing.<br /><a href="http://code.google.com/p/as3flexunitlib/">http://code.google.com/p/as3flexunitlib/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> AsWing A3<br />Allows programmers to make their flash application(or RIA) UI easily<br /><a href="http://www.aswing.org/">http://www.aswing.org/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Cairngorm<br /><a href="http://labs.adobe.com/wiki/index.php/Cairngorm">http://labs.adobe.com/wiki/index.php/Cairngorm</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> DisplayShelf Component<br />Provides a rich, templatable control to display a faux-3d view of a list of items<br /><a href="http://www.quietlyscheming.com/blog/components/tutorial-displayshelf-component/">http://www.quietlyscheming.com/blog/components/tutorial-displayshelf-component/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> flex2treemap<br />Treemap Component for Adobe Flex 2<br /><a href="http://code.google.com/p/flex2treemap/">http://code.google.com/p/flex2treemap/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> flex4filemaker<br />Flex4FileMaker is an Adobe Flex 2 FileMaker API modeled after the FileMaker PHP library.<br /><a href="http://code.google.com/p/flex4filemaker/">http://code.google.com/p/flex4filemaker/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> FlexBook<br />Flex flip book component. Supports transparantcy.<br /><a href="http://www.quietlyscheming.com/blog/components/flexbook/">http://www.quietlyscheming.com/blog/components/flexbook/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> flexbox<br />Directory of Flex Components<br /><a href="http://flexbox.mrinalwadhwa.com/">http://flexbox.mrinalwadhwa.com/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> flexcalendar<br />Flex Calendar Components<br /><a href="http://code.google.com/p/flexcalendar/">http://code.google.com/p/flexcalendar/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> flexedtoolkit<br />Flexed Toolkit<br /><a href="http://code.google.com/p/flexedtoolkit/">http://code.google.com/p/flexedtoolkit/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> FlexLib<br />community effort to create open source user interface components for Adobe Flex 2.<br /><a href="http://code.google.com/p/flexlib/">http://code.google.com/p/flexlib/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> flexservicelocator<br />ServiceLocator for flex to use web service<br /><a href="http://code.google.com/p/flexservicelocator/">http://code.google.com/p/flexservicelocator/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> flextube<br />FlexTube is an flex UI front end for youtube<br /><a href="http://code.google.com/p/flextube/">http://code.google.com/p/flextube/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Flex 2 Basic Email Form<br />Cut and dry example using an HTTP Service to send an email in Adobe Flex 2 via a simple PHP email script.<br /><a href="http://augiemarcello.com/flex-2-basic-email-form/">http://augiemarcello.com/flex-2-basic-email-form/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Flex 2 Debug Component<br /><a href="http://www.mikenimer.com/index.cfm/2006/7/5/FlexDebugPanel">http://www.mikenimer.com/index.cfm/2006/7/5/FlexDebugPanel</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Flex 2 Primitive Explorer<br /><a href="http://www.3gcomm.fr/Flex/PrimitiveExplorer/Flex2PrimitiveExplorer.html">http://www.3gcomm.fr/Flex/PrimitiveExplorer/Flex2PrimitiveExplorer.html</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Flex Developers Journal<br />The first and only independent magazine serving Adobe Flex developers worldwide.<br /><a href="http://flex.sys-con.com/">http://flex.sys-con.com/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Flex Style Explorer<br /><a href="http://examples.adobe.com/flex2/consulting/styleexplorer/Flex2StyleExplorer.html">http://examples.adobe.com/flex2/consulting/styleexplorer/Flex2StyleExplorer.html</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Fluorine<br />FLUORINE is an open source .NET Flash Remoting Gateway.<br /><a href="http://fluorine.thesilentgroup.com/">http://fluorine.thesilentgroup.com</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Free Visual Reflection Component for Flex 2<br /><a href="http://blog.benstucki.net/?id=20">http://blog.benstucki.net/?id=20</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Granite Data Services<br />Free, open source (LGPL’d), alternative to AdobeA® Flex 2 Data Services for J2EE application servers.<br /><a href="http://www.graniteds.org/confluence/display/INTRO/Granite+Data+Services">http://www.graniteds.org/confluence/display/INTRO/Granite+Data+Services</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> JAM - Just ActionScript and MXML<br /><a href="http://www.onflex.org/code/">http://www.onflex.org/code/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Live reflectiona component<br /><a href="http://www.rictus.com/muchado/2006/07/05/live-reflection-component/">http://www.rictus.com/muchado/2006/07/05/live-reflection-component/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> osflash-xray<br />Open Source Flash Debugger for AS2/AS3/Flex1.5/Flex2<br /><a href="http://code.google.com/p/osflash-xray/">http://code.google.com/p/osflash-xray/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> scale nine<br />themes for flex and apollo/AIR<br /><a href="http://www.scalenine.com/">http://www.scalenine.com/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> SpringGraph<br />Adobe Flex 2.0 component that displays a set of items that are linked to each other.<br /><a href="http://mark-shepherd.com/blog/springgraph-flex-component/">http://mark-shepherd.com/blog/springgraph-flex-component/</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> The Flex Show<br />Jeffry Houser and Ryan Stewart’s Poscast covering Flex related topics.<br /><a href="http://www.theflexshow.com/blog">http://www.theflexshow.com/blog</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> The ServeBox Foundry<br />Based on several design patterns, and includes tools built to resolve some of the recurrent Flex 2 development challenges.<br /><a href="http://sourceforge.net/projects/sbasfoundry">http://sourceforge.net/projects/sbasfoundry</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Yahoo Astra Components<br />Tree, Menu, TabBar, AutoComplete, and Charts<br /><a href="http://developer.yahoo.com/flash/astra-flash">http://developer.yahoo.com/flash/astra-flash</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Yahoo! Maps Web Services - Flexa„? API<br /><a href="http://developer.yahoo.com/maps/flash/flexGettingStarted.html">http://developer.yahoo.com/maps/flash/flexGettingStarted.html</a></p><div style="font-family: verdana; text-align: justify;"><br /></div><p style="text-align: justify;"><span style="font-family:verdana;"> ZoomFrame</span><br /><span style="font-family:verdana;"> </span><a style="font-family: verdana;" href="http://www.zeuslabs.us/2007/08/14/open-source-flex-component-zoomframe/">http://www.zeuslabs.us/2007/08/14/open-source-flex-component-zoomframe/</a><br /><span style="font-family:verdana;"> </span><br /><span style="font-family:verdana;"> </span><br /><span style="font-family:verdana;">6. Eclipse & Subversion</span><br /><span style="font-family:verdana;"> </span><a style="font-family: verdana;" href="http://subclipse.tigris.org/servlets/ProjectProcess;jsessionid=94A3F7DC2D06438DF2CB9C249CF2A1D8?pageID=p4wYuA">http://subclipse.tigris.org/servlets/ProjectProcess;jsessionid=94A3F7DC2D06438DF2CB9C249CF2A1D8?pageID=p4wYuA</a><br /><span style="font-family:verdana;"> </span><br /><span style="font-family:verdana;"> </span><br /><span style="font-family:verdana;">7. Загрузка шрифтов и их внедрение runtime</span><br /><span style="font-family:verdana;"> </span><a style="font-family: verdana;" href="http://www.flashmorgan.com/index.php/2007/06/18/runtime-font-embedding-in-as3-there-is-no-need-to-embed-the-entire-fontset-anymore/">http://www.flashmorgan.com/index.php/2007/06/18/runtime-font-embedding-in-as3-there-is-no-need-to-embed-the-entire-fontset-anymore/</a><br /><span style="font-family:verdana;"> </span><a style="font-family: verdana;" href="http://nochump.com/blog/?p=20">http://nochump.com/blog/?p=20</a><br /><span style="font-family:verdana;"> </span><br /><span style="font-family:verdana;"> * Uppercase : U+0020,U+0041-U+005A</span><br /><span style="font-family:verdana;"> * Lowercase : U+0020,U+0061-U+007A</span><br /><span style="font-family:verdana;"> * Numerals : U+0030-U+0039,U+002E</span><br /><span style="font-family:verdana;"> * Punctuation : U+0020-U+002F,U+003A-U+0040,U+005B-U+0060,U+007B-U+007E</span><br /><span style="font-family:verdana;"> * Basic Latin : U+0020-U+002F, U+0030-U+0039, U+003A-U+0040, U+0041-U+005A, U+005B-U+0060, U+0061-U+007A, U+007B-U+007E</span><br /><span style="font-family:verdana;"> </span></p><p style="text-align: justify;"><br /></p><p style="text-align: justify; font-family: verdana; font-weight: bold; color: rgb(102, 102, 102);">Flex Tips</p>0. Reducing module size<br /><p style="font-family: verdana; text-align: justify;"> ___________________________________________________________________<br /> <a href="http://livedocs.adobe.com/flex/3/html/modular_4.html">http://livedocs.adobe.com/flex/3/html/modular_4.html</a><br /><br /> Module size varies based on the components and classes that are used in the module.<br /> By default, a module includes all framework code that its components depend on,<br /> which can cause modules to be large by linking classes that overlap with the application's classes.<br /> To reduce the size of the modules, you can optimize the module by instructing it to externalize classes<br /> that are included by the application.<br /> This includes custom classes and framework classes.<br /> The result is that the module includes only the classes it requires,<br /> while the framework code and other dependencies are included in the application.<br /> To externalize framework classes with the command-line compiler,<br /> you generate a linker report from the application that loads the modules.<br /> You then use this report as input to the module's load-externs compiler option.<br /> The compiler externalizes all classes from the module for which the application contains definitions.<br /> This process is also necessary if your modules are in a separate project from your main application in Flex Builder.</p><div style="text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> Create and use a linker report with the command-line compiler</p><div style="text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> 1. Generate the linker report and compile the application:</p><div style="text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> mxmlc -link-report=report.xml MyApplication.mxml</p><div style="text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"><br /> The default output location of the linker report is the same directory as the compiler. In this case, it would be in the bin directory.<br /> 2. Compile the module and pass the linker report to the load-externs option:</p><div style="text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> mxmlc -load-externs=report.xml MyModule.mxml</p><div style="text-align: justify;"><br /></div><p style="font-family: verdana; text-align: justify;"> </p>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-60396623185793088562010-01-19T14:26:00.001+03:002010-01-19T14:29:05.935+03:00Microsoft.ACE.OLEDB.12.0 & 2007 Office System Driver: Data Connectivity Components<span style="font-family: verdana;"><span style="font-weight: bold; color: rgb(255, 0, 0);font-size:180%;" >Н</span>ужно брать здесь:</span><br /><a href="http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=7554f536-8c28-4598-9b72-ef94e038c891&displayLang=en"><span style="font-family: verdana;">http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=7554f536-8c28-4598-9b72-ef94e038c891&displayLang=en</span><br /></a>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-9150294099423716422010-01-17T22:21:00.006+03:002010-01-17T23:26:38.900+03:00CallbackHandlerControl - серверный контрол для выполнения callback-запроса своими руками :)<div style="text-align: justify;"><br /><a href="http://guid.empty.googlepages.com/CallbackHandlerControl.zip"><span style="font-size:78%;">исходные коды</span></a><br /><br /><span style="font-family:verdana;"><span style="font-weight: bold; color: rgb(255, 0, 0);font-size:180%;" >П</span>о мотивам темы </span><a style="font-family: verdana;" href="http://guid-empty.blogspot.com/2008/11/callback-aspnet.html">Как выполнить callback со стороны клиента на сервер в ASP.NET</a><br /><br /><span style="font-family:verdana;">Итак, чтобы каждый раз не писать/дублировать код - создаем контрол, обязанностями которого будет выполнение Callback-запроса на сервер и возврат ответа со стороны сервера и возврат его на клиента ...</span><br /><br /><span style="font-family:verdana;">При создании такого запроса был использован именно третий подход, который и описан в статье выше... </span><br /><span style="font-family:verdana;">При размещении контрола на странице нам необходимо будет указать имя-клиентского сценария для обработки результата в случае успешного завершения callback, имя клиентского сценария для обработки ситуации в случае неуспешного завершения, и<span style="font-weight: bold;"> самое важное</span> - <span style="font-weight: bold;">имя сгенерированной javascript функции</span>, которую мы будем использовать для выполнения самого запроса на сервер со стороны клиентского javascript. </span><br /><span style="font-family:verdana;">Последняя функция будет принимать в качестве единственного параметра строку, которую мы сможем обработать на серверной стороне.</span><br /><br /><span style="font-family:verdana;">Итак, все сказанное может выглядеть в разметке страницы или вашего user-control следующим образом:</span><br /></div><br /><br /><pre name="code" class="html"><br /><%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="CallbackHandlerControl._Default" %><br /><br /><%@ Register assembly="CallbackHandlerControl" namespace="CallbackHandlerControl.Controls" tagprefix="cc1" %><br /><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br /><br /><html xmlns="http://www.w3.org/1999/xhtml" ><br /><head runat="server"><br /><title>This is a Callback Handle Control Test Page</title><br /><br /><script language="javascript" type="text/javascript"><br />function btnCallServer_clientHandler() {<br /> callServerHandler("argument");<br />}<br /><br />function onSuccessfullHandler(result) {<br /> alert(result);<br />}<br /><br />function onErrorClientHandler(result) {<br />}<br /></script><br /><br /></head><br /><body><br /><form id="form1" runat="server"><br /><div><br /><br /><h1>This is a Callback Handle Control Test Page</h1><br /><br /><asp:button ID="btnCallServer"<br /> runat="server" text="Script service method invocation"<br /> OnClientClick="btnCallServer_clientHandler();return false;"><br /></asp:button><br /><br /><cc1:CallbackEventHandler ID="callbackHandler" runat="server"<br /> OnClientDataReceived="callbackHandler_ClientDataReceived"<br /> OnSuccessfullClientHandler="onSuccessfullHandler"<br /> OnErrorClientHandler="onErrorClientHandler"<br /> ServerCallFunctionName="callServerHandler"/><br /><br /></div><br /></form><br /></body><br /></html><br /><br /><br /></pre><br /><br /><br /><div style="text-align: justify;"><span style="font-family:verdana;">Обращаем внимание на серверный обработчик серверного события <span style="font-weight: bold;">ClientDataReceived </span>- <span style="font-weight: bold;">OnClientDataReceived </span>- </span><br /><span style="font-family:verdana;">данный обработчик будет использован на стороне сервера при получении данных со стороны клиента, </span><br /><span style="font-family:verdana;">а также для формирования данных, которые будут отправлены на клиента в качестве ответа.</span><br /></div><br /><br /><br /><span style="font-weight: bold;font-family:verdana;" >Сам code-behind класс страницы:</span><br /><br /><pre name="code" class="c#"><br />using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br /><br />namespace CallbackHandlerControl<br />{<br />/// <summary><br />/// This is a Callback Handle Control Test Page<br />/// </summary><br />public partial class _Default : System.Web.UI.Page<br />{<br />protected void Page_Load(object sender, EventArgs e)<br />{<br /><br />}<br /><br />#region event handlers<br />protected void callbackHandler_ClientDataReceived(object sender, CallbackHandlerControl.Controls.ClientDataReceivedEventArgs e)<br />{<br /> string clientData = e.ClientData;<br /> e.Cancel = false;<br /> e.ServerResponse = DateTime.Now.ToString();<br />}<br /> #endregion<br />}<br />}<br /><br /></pre><br /><br /><br /><span style="font-family:verdana;">Итак, сам текст нашего контрола:</span><br /><br /><pre name="code" class="c#"><br />using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.ComponentModel;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br /><br />namespace CallbackHandlerControl.Controls<br />{<br /><br />/// <summary><br />/// Кконтрол выполняет callback обращение на серверную сторону со стороны клиента<br />/// </summary><br />[ToolboxData("<{0}:CallbackEventHandler ID=\"callbackHandler\" runat=\"server\"> </{0}:CallbackEventHandler>")]<br />public partial class CallbackEventHandler : System.Web.UI.WebControls.WebControl, ICallbackEventHandler<br />{<br />#region events<br />/// <summary><br />/// Данное событие будет подниматься в случае получения данных со стороны клиента<br />/// на сервеной стороне в контроле <see cref="WebSite.WebModules.Common.Callbacks.CallbackEventHandler"/><br />/// </summary><br />[Browsable(true)]<br />[Category("Callback Handlers")]<br />[Description("Данное событие будет подниматься в случае получения данных со стороны клиента на сервеной стороне в контроле WebSite.WebModules.Common.Callbacks.CallbackEventHandler")]<br />public event EventHandler<ClientDataReceivedEventArgs> ClientDataReceived;<br /><br />/// <summary><br />/// Данные, полученные со стороны клиента, а также отправляемые со стороны сервера клиенту<br />/// </summary><br />private ClientDataReceivedEventArgs Arguments = null;<br />#endregion<br /><br />#region fields & properties<br /><br />/// <summary><br />/// ViewState ключи<br />/// </summary><br />private string SuccessfullClientHandlerViewStateID<br />{<br /> get<br /> {<br /> return this.ID + "_SuccessfullClientHandler";<br /> }<br />}<br /><br />/// <summary><br />/// ViewState ключи<br />/// </summary><br />private string ErrorClientHandlerViewStateID<br />{<br /> get<br /> {<br /> return this.ID + "_ErrorClientHandler";<br /> }<br />}<br /><br />/// <summary><br />/// ViewState ключи<br />/// </summary><br />private string ServerCallFunctionNameViewStateID<br />{<br /> get<br /> {<br /> return this.ID + "_ServerCallFunctionName";<br /> }<br />}<br /><br />/// <summary><br />/// Имя сценария, который будет вызван в случае успешного обращения на сервер<br />/// </summary><br />[Browsable(true)]<br />[Category("Callback Handlers")]<br />[DefaultValue("onSuccessfullClientHandler")]<br />[Description("Имя сценария, который будет вызван в случае успешного обращения на сервер")]<br />public string OnSuccessfullClientHandler<br />{<br /> get<br /> {<br /> if (ViewState[SuccessfullClientHandlerViewStateID] != null)<br /> return (String)ViewState[SuccessfullClientHandlerViewStateID];<br /> else<br /> return "";<br /> }<br /> set<br /> {<br /> ViewState[SuccessfullClientHandlerViewStateID] = value;<br /> }<br />}<br /><br />/// <summary><br />/// Имя сценария, который будет вызван в случае неудачного обращения на сервер<br />/// </summary><br />[Browsable(true)]<br />[Category("Callback Handlers")]<br />[DefaultValue("onErrorClientHandler")]<br />[Description("Имя сценария, который будет вызван в случае неудачного обращения на сервер")]<br />public string OnErrorClientHandler<br />{<br /> get<br /> {<br /> if (ViewState[ErrorClientHandlerViewStateID] != null)<br /> return (String)ViewState[ErrorClientHandlerViewStateID];<br /> else<br /> return "";<br /> }<br /> set<br /> {<br /> ViewState[ErrorClientHandlerViewStateID] = value;<br /> }<br />}<br /><br />/// <summary><br />/// Имя функции, которая будет использоваться для вызова серверного сценария со стороны клиента, принимает один аргумент ARG в виде строки<br />/// </summary><br />[Browsable(true)]<br />[Category("Callback Handlers")]<br />[DefaultValue("serverCall")]<br />[Description("Имя функции, которая будет использоваться для вызова серверного сценария со стороны клиента, принимает один аргумент ARG в виде строки ")]<br />public string ServerCallFunctionName<br />{<br /> get<br /> {<br /> if (ViewState[ServerCallFunctionNameViewStateID] != null)<br /> return (String)ViewState[ServerCallFunctionNameViewStateID];<br /> else<br /> return "";<br /> }<br /> set<br /> {<br /> ViewState[ServerCallFunctionNameViewStateID] = value;<br /> }<br />}<br />#endregion<br /><br />protected override void OnLoad(EventArgs e)<br />{<br /> base.OnLoad(e);<br /> string webFormDoCallbackScript = this.Page.ClientScript.GetCallbackEventReference(this, "arg", this.OnSuccessfullClientHandler, null, true);<br /> string serverCallScript = "function " + this.ServerCallFunctionName + "(arg){" + webFormDoCallbackScript + ";\n}\n";<br /><br /> if (!this.Page.ClientScript.IsClientScriptBlockRegistered(this.ServerCallFunctionName))<br /> {<br /> this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.ServerCallFunctionName, serverCallScript, true);<br /> }<br />}<br /><br />protected override void OnPreRender(EventArgs e)<br />{<br /> base.OnPreRender(e);<br /><br />}<br /><br />#region ICallbackEventHandler Members<br /><br />public string GetCallbackResult()<br />{<br /> // прошла обработка данных в Argumets на стороне сервера, отправляем результат на клиента<br /> if (this.Arguments != null)<br /> {<br /> return this.Arguments.ServerResponse;<br /> }<br /> else<br /> return "";<br />}<br /><br />public void RaiseCallbackEvent(string eventArgument)<br />{<br /> this.OnClientArgumentReceived(eventArgument);<br />}<br /><br />#endregion<br /><br />#region event handlers<br /><br />public virtual void OnClientArgumentReceived(string eventArgument)<br />{<br /> if (this.ClientDataReceived != null)<br /> {<br /> this.Arguments = new ClientDataReceivedEventArgs<br /> {<br /> ClientData = eventArgument<br /> };<br /><br /> this.ClientDataReceived(this, this.Arguments);<br /> }<br /><br />}<br />#endregion<br /><br />}<br />}<br /></pre><br /><br /><div style="text-align: justify;"><span style="font-family:verdana;">Обратите внимание на реализацию интерфейса ICallbackEventHandler, смысл которого был описан ранее в статье </span><a style="font-family: verdana;" href="http://guid-empty.blogspot.com/2008/11/callback-aspnet.html">Как выполнить callback со стороны клиента на сервер в ASP.NET</a><br /><br /><br /><span style="font-family:verdana;">Обращаем также внимание на код обработчика <span style="font-weight: bold;">callbackHandler_ClientDataReceived</span> в коде нашего code-behind класса страницы, </span><br /><span style="font-family:verdana;">который был декларативно указан в разметке страницы в обработке контрола в строке</span><br /><span style="font-weight: bold;font-family:verdana;" >OnClientDataReceived="callbackHandler_ClientDataReceived".</span><br /></div><br /><pre name="code" class="c#"><br />protected void callbackHandler_ClientDataReceived(object sender, CallbackHandlerControl.Controls.ClientDataReceivedEventArgs e)<br />{<br /> string clientData = e.ClientData;<br /> e.Cancel = false;<br /> e.ServerResponse = DateTime.Now.ToString();<br />}<br /></pre><br /><br /><div style="text-align: justify;"><span style="font-family:verdana;">Именно в нем мы получаем данные со стороны клиента, и подготавлиаем данные, отправляемые на клиента со стороны сервера</span><br /><br /><br /><br /><span style="font-family:verdana;">Данный обработчик принимает аргумент класса-наследника EventArgs - <span style="font-weight: bold;">ClientDataReceivedEventArgs</span>, которое содержит как данные, полученные со стороны клиента, так и данные, которые</span><br /><span style="font-family:verdana;">будут отправлены клиентской стороне в качестве ответа от сервера. Нужно помнить также о том, что мы всегда можем отправить как со стороны сервера, так и со стороны клиента сложные объекты, использую сериализацию в строку -</span><br /><span style="font-family:verdana;">потому вполне достаточно ограничиться строковоыми типами данных.</span><br /><br /><br /><br /><br /><br /><span style="font-family:verdana;">Само событие в коде нашего контрола выглядит следущим образом:</span><br /></div><br /><pre name="code" class="c#">/// <summary><br />/// Данное событие будет подниматься в случае получения данных со стороны клиента<br />/// на сервеной стороне в контроле <see cref="WebSite.WebModules.Common.Callbacks.CallbackEventHandler"/><br />/// </summary><br />[Browsable(true)]<br />[Category("Callback Handlers")]<br />[Description("Данное событие будет подниматься в случае получения данных со стороны клиента на сервеной стороне в контроле WebSite.WebModules.Common.Callbacks.CallbackEventHandler")]<br />public event EventHandler<ClientDataReceivedEventArgs> ClientDataReceived;<br /></pre><br /><br /><br /><br /><div style="text-align: justify;"><span style="font-family:verdana;">Как видите, обработчик события <span style="font-weight: bold;">ClientDataReceived </span>должен принимать аргумент класса <span style="font-weight: bold;">ClientDataReceivedEventArgs</span>, код которого представлен ниже:</span><br /></div><br /><br /><pre name="code" class="c#"><br />using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Web;<br /><br />namespace CallbackHandlerControl.Controls<br />{<br />/// <summary><br />/// Параметры события ClientDataReceivedEvent, которое будет подниматься в случае получения данных со стороны клиента<br />/// на сервеной стороне в контроле <see cref="WebSite.WebModules.Common.Callbacks.CallbackEventHandler"/><br />/// </summary><br />public class ClientDataReceivedEventArgs : EventArgs<br />{<br /><br />/// <summary><br />/// Строка, отправленная со стороны клиента на сервер - это может быть как простой аргумент, так и<br />/// серилиазованное состояние объекта<br />/// </summary><br />public string ClientData = "";<br /><br />/// <summary><br />/// Ответ от сервера, отправляемый на клиента - это может быть сериализованное состояние объекта или просто строка;<br />/// Логика по обработке данной строки лежит на стороне клиента<br />/// </summary><br />public string ServerResponse = "";<br /><br />/// <summary><br />/// Данный флаг определяет, завершить цепочку выполнения Callback или нет<br />/// </summary><br />public bool Cancel = false;<br />}<br />}<br /><br /></pre><div style="text-align: justify;"><br /><br /><br /><span style="font-family:verdana;">Ну и пара скриншотов:<br /><br />результат выполнения callback по клику на кнопке на странице, разметка которого приведена в начале страницы:<br /><br /><table style="width: auto;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/R3BCkNe-NHG2X5bgcW-PvA?feat=embedwebsite"><img src="http://lh6.ggpht.com/_t1w9TWZeeLQ/S1NjhgmcIrI/AAAAAAAABKU/pNKSNXIO0LM/s800/test_ie_window.jpg" /></a></td></tr><tr><td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"><a href="http://picasaweb.google.com/guid.empty/Blog?feat=embedwebsite"></a><br /></td></tr></tbody></table><br /><br /><br /><br />Контрол в режиме редактирования на странице<br /><br /><table style="width: auto;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/v8PtPMK-hJdVSo5woo44EA?feat=embedwebsite"><img src="http://lh4.ggpht.com/_t1w9TWZeeLQ/S1NkCXpXixI/AAAAAAAABKY/qfiHLau6IK8/s800/asp_page.jpg" /></a></td></tr><tr><td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"><a href="http://picasaweb.google.com/guid.empty/Blog?feat=embedwebsite"></a><br /></td></tr></tbody></table><br /><br /></span><br /><span style="font-family:verdana;">Удачи в использовании</span>.<br /><br /><span style="font-family:verdana;"><span style="font-weight: bold; color: rgb(255, 102, 102);">ps:</span> возможно, получилось сумбурно, но мне кажется, разобравшись с принципом проведения Callback-запроса третьим описанным способом из статьи </span><a style="font-family: verdana;" href="http://guid-empty.blogspot.com/2008/11/callback-aspnet.html">Как выполнить callback со стороны клиента на сервер в ASP.NET</a><br /><span style="font-family:verdana;"> код (доступен по ссылке в начале статьи ) и принцип работы самого контрола становится понятным.</span></div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-13104939545635636102010-01-13T01:55:00.004+03:002010-01-13T08:09:43.476+03:00<div style="text-align: justify;"><span style="font-family:verdana;"><span style="color: rgb(0, 0, 0);font-size:180%;" ><span style="font-weight: bold;">У</span></span> меня погиб сегодня кот...не думал что так будет тяжело осознавать, что его я больше не увижу, моего первого кота, того который приходил утром топтаться на мне, который постоянно просился на улицу погулять, который был мудр для своего прожитого года, который меня любил....Дуэша прости меня что не уберег, прости</span>...<br /></div><br /><table style="width: auto;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/mF_DrSidJUHP2F5GOUOUfQ?feat=embedwebsite"><img src="http://lh4.ggpht.com/_t1w9TWZeeLQ/S0z9fRpmmLI/AAAAAAAABKI/LfA112rf-IQ/s400/IMG_1708.JPG" /></a></td></tr><tr><td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"><br /></td></tr></tbody></table><br /><span style="font-family:verdana;">и это сообщение - дань твоей памяти</span>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.comtag:blogger.com,1999:blog-5872121829029410622.post-51706917421271563502009-10-20T14:27:00.005+04:002010-01-20T14:50:04.379+03:00РодственныЕ сайты<span style="font-family:verdana;"><span style="color: rgb(255, 0, 0); font-weight: bold;font-size:180%;" >С</span>кажи мне кто твой друг...</span><br /><br /><table style="width: auto; font-family: verdana;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/OLFtPSkD7Y2ud3-swXUzhQ?feat=embedwebsite"><img src="http://lh4.ggpht.com/_t1w9TWZeeLQ/S1brpFhBr2I/AAAAAAAABLA/JwWXkD2wzIU/s800/weblancer_ru.png" /></a></td></tr><tr><td style="font-size: 11px; text-align: right;"><a href="http://picasaweb.google.com/guid.empty/Blog?feat=embedwebsite"></a><br /></td></tr></tbody></table><br /><br /><span style="font-family:verdana;"><span style="font-weight: bold; color: rgb(255, 102, 102);">ps: </span>и ведь не поспоришь<br /><br /><br /></span>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-60959094084859953392009-07-30T10:36:00.003+04:002009-07-30T10:37:07.738+04:00<div style="text-align: justify;"><span style="font-family: verdana;"><span style="color: rgb(255, 102, 102);font-size:180%;" ><span style="font-weight: bold;">М</span></span>не стыдно в этом признаться, но с недавних пор я пью безалкогольное пиво</span> :(<br /></div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com3tag:blogger.com,1999:blog-5872121829029410622.post-60871799068488856112009-06-29T10:11:00.004+04:002009-06-29T14:37:39.105+04:00Народ, скажите мне что ЭТО?<div style="text-align: justify;"><span style="font-family:verdana;"><span style="font-weight: bold; color: rgb(255, 0, 0);font-size:180%;" >В </span>картинках сорри за качество:</span><br /><br /></div><table style="width: auto; font-family: verdana; text-align: left; margin-left: 0px; margin-right: 0px;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/AierGcx20MmIWp-FCCScGA?feat=embedwebsite"><img src="http://lh6.ggpht.com/_t1w9TWZeeLQ/SkhapGjNs9I/AAAAAAAABG4/n2lSvIs3Gqk/s400/1.png" /></a></td></tr><tr><td style="font-size: 11px; text-align: right;"><br /></td></tr></tbody></table><div style="text-align: justify;"><br /><br /></div><table style="width: auto; font-family: verdana; text-align: left; margin-left: 0px; margin-right: 0px;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/L0nEGlJAoep-K-nxrTr31g?feat=embedwebsite"><img src="http://lh6.ggpht.com/_t1w9TWZeeLQ/SkhapCt9M5I/AAAAAAAABG8/OD8iEhdQ9P0/s400/2.png" /></a></td></tr><tr><td style="font-size: 11px; text-align: right;"><br /></td></tr></tbody></table><div style="text-align: justify;"><br /><br /><span style="font-family:verdana;">прилагаю также видео:</span><br /><br /><br /><object height="344" width="425"><param name="movie" value="http://www.youtube.com/v/hdP2IjqasYY&hl=en&fs=1&"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/hdP2IjqasYY&hl=en&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed></object><br /><br /><br /><span style="font-family:verdana;"><span style="font-weight: bold; color: rgb(255, 102, 102);"><br />ps</span>: увидел в луже на грунтовой дороге по дороге на дачу, в размерах около 5 см, зарываются глубоко в грунт, постоянно плавают брюхом вверх к поверхности...впереди на панцире пара рядом посаженных глаз :) явно хищник :) от хвоста пара усиков, спереди по бокам по паре усиков</span><br /><br /><br /><br /><span style="font-family:verdana;"><span style="font-weight: bold; color: rgb(255, 204, 204);">pps</span>: сразу предупреждаю, деревня не рядом с припятью :-D</span><br /><br /><br /><br /></div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com2tag:blogger.com,1999:blog-5872121829029410622.post-2289114885888628252009-06-07T18:13:00.003+04:002009-06-07T18:27:18.831+04:00джоли джампинг<div style="text-align: justify;">Попробовал, хочу еще :))) :<br /><br /><table style="width: auto;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/4ceSTqdx8WFxnfEWBY9eZg?feat=embedwebsite"><img src="http://lh4.ggpht.com/_t1w9TWZeeLQ/SivLm1CxpMI/AAAAAAAABE8/7pgRQOohlmE/s400/74.jpg" /></a></td></tr><tr><td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"><a href="http://picasaweb.google.com/guid.empty/Blog?feat=embedwebsite"></a><br /></td></tr></tbody></table><br /><br /><table style="width: auto;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/G_74rXN57jpxVDmoZ43kGg?feat=embedwebsite"><img src="http://lh3.ggpht.com/_t1w9TWZeeLQ/SivLnJnLAYI/AAAAAAAABFA/klHFpbXL7LA/s400/75.jpg" /></a></td></tr><tr><td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"><a href="http://picasaweb.google.com/guid.empty/Blog?feat=embedwebsite"></a><br /></td></tr></tbody></table><br /><br /><table style="width: auto;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/JO0mlBEFcqxIIyagmYWgjg?feat=embedwebsite"><img src="http://lh6.ggpht.com/_t1w9TWZeeLQ/SivLnDLakUI/AAAAAAAABFE/QDtq2I6OY24/s400/76.jpg" /></a></td></tr><tr><td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"><a href="http://picasaweb.google.com/guid.empty/Blog?feat=embedwebsite"></a><br /></td></tr></tbody></table><br /><br />Побегал, хотя наверно все таки походил :), буквально минут 15-20, но масса ощущений, ужасно устают ноги, но как сказали, просто с непривычки, люди, которые не первый раз уже встают на "прыгунки" бегают со скоростью до 30 км в час, заявленная :) максимальная высота прыжка порядка 2х метров...но это пока не для меня :)<br /><br /><br />а вообще, стал выбор между приобретением велосипеда и jollyjamper девайса, причем цена вопроса у обоих приблизительно одинаковая и выходит за рамки 10 тыс. рублей что за велосипед, что за взрослый комплект jolly jumper<br /><br /><br /></div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-43736576879761112462009-06-05T22:04:00.004+04:002009-06-05T22:14:34.837+04:00ЛабрадойЛЕР<div style="text-align: justify;"><span style="color: rgb(255, 0, 0);font-family:verdana;font-size:180%;" ><span style="font-weight: bold;">О</span></span><span style="font-family:verdana;">дин из фильмов, которые обязательно стоит посмотреть и можно поставить в один ряд с фильмом "В погоне за щастьем" с Вилл Смитом - название фильма конечно не "лабрадойлер" - фильм "Марли и Я"</span><br /><br /><span style="font-family:verdana;">фильм конкретно меняет мировозрение, однозначно в видиотеку....<br /><br /><span style="font-weight: bold; color: rgb(255, 102, 102);">ps:</span><span style="color: rgb(255, 102, 102);"> </span>как я смог проиграть спор своей девушке о том, как назвал один из героев фильма породу собаки лабрадойлером, а не лабрадойЗЕРом, понятия не имею :)<br /></span><br /></div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-6240760257457527752009-06-05T21:49:00.002+04:002009-06-05T21:54:22.616+04:00Само...<div style="text-align: justify;"><span style="font-family: verdana;"><span style="color: rgb(255, 0, 0);font-size:180%;" ><span style="font-weight: bold;">В</span></span>от скажите мне, ну есть же <span style="font-weight: bold;">само</span>клеющиеся обои, всякие там пленки, <span style="font-weight: bold;">само</span>клеющиеся этикетки, есть <span style="font-weight: bold;">само</span>выравнивающиеся полы, есть <span style="font-weight: bold;">само</span>затягивающиеся краски, <span style="font-weight: bold;">само</span>наборные печати, есть даже <span style="font-weight: bold;">само</span>ходные артилерийские установки, <span style="font-weight: bold;">само</span>зарядные карабины и винтовки, аппараты по производству водки и то <span style="font-weight: bold;">само</span>гонные, ну какого лешего нет <span style="font-weight: bold;">само</span>моющейся посуды аааа?...ну почему...?</span></div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-7480506575297335212009-06-04T10:29:00.002+04:002009-06-04T10:32:08.257+04:00На сайте уже зарегистрировано максимально допустимое количество пользователей. Попробуйте зарегистрироваться позже.<table style="width: auto; font-family: verdana;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/y55BWNIS9oAapm4cRRK8fg?feat=embedwebsite"><img src="http://lh5.ggpht.com/_t1w9TWZeeLQ/Sidgg1q-XJI/AAAAAAAABEg/bsmmRf0V61M/s800/galant_club_registration.png" /></a></td></tr><tr><td style="font-size: 11px; text-align: right;"><a href="http://picasaweb.google.com/guid.empty/Blog?feat=embedwebsite"></a><br /></td></tr></tbody></table><br /><span style="font-family: verdana;"><span style="color: rgb(255, 102, 102);font-size:180%;" ><span style="font-weight: bold;">В</span></span>инт закончился или что? Тихий писец... :)))</span>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com1tag:blogger.com,1999:blog-5872121829029410622.post-66706704989950640062009-03-25T10:10:00.003+03:002009-03-25T10:26:02.556+03:00Удивительный мир шахмат<div style="text-align: justify;"><span style="font-family:verdana;"><span style="color: rgb(255, 0, 0);font-size:180%;" ><span style="font-weight: bold;">В</span></span>от уже третий год подсел на шахматы, реально подсел, другими словами это не назовешь, когда так сильно затягивает игра ...</span><br /><br /><span style="font-family:verdana;">Сижу на <a href="http://freechess.org">http://freechess.org</a>/, из всех клиентов использую <span style="font-weight: bold;">BabasChess</span> (<a href="http://www.babaschess.net/">http://www.babaschess.net/</a>) - самый продвинутый клиент, с очень богатым GUI, очень шустрый и удобный, так что если кто решится войти в мир шахмат, лучше начать сразу же с него :)</span><br /><br /><span style="font-family:verdana;">Поводом для написания темы послужили те игры и ситуации, пару скриншотов которых выкладываю сейчас - впредь хочу "коллекционировать" интересные ситуации в шахматах и заливать сюда :) просто чтобы похвастаться :) ... иногда, рассматривая какие то ситуации на шазматном поле, понимаешь что вообщем-то безвыходные ситуации существуют :)</span><br /><br /><span style="font-family:verdana;">итак, для затравки:</span><br /><br /><table style="width: auto;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/aksrtUnPwK6dsBJ8NWAcig?feat=embedwebsite"><img src="http://lh4.ggpht.com/_t1w9TWZeeLQ/ScnYeMXygXI/AAAAAAAABDw/LoNNpKogH-Y/s800/chess_party01.png" /></a></td></tr><tr><td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"><a href="http://picasaweb.google.com/guid.empty/Blog?feat=embedwebsite"></a><br /></td></tr></tbody></table><br /><br /><table style="width: auto;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/2qM5O67oHC7jHrIgKBEAIQ?feat=embedwebsite"><img src="http://lh5.ggpht.com/_t1w9TWZeeLQ/ScnYearq7rI/AAAAAAAABEA/RhbeWMzOZJ8/s800/chess_party03.png" /></a></td></tr><tr><td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"><a href="http://picasaweb.google.com/guid.empty/Blog?feat=embedwebsite"></a><br /></td></tr></tbody></table><br /><br /><br />Вот тоже интересная ситуация, когда ход белых, т.е. просто реально почти физическое давление на противника:<br /><br /><table style="width: auto;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/JTbZkQGyHSuLm7kp4fQNmQ?feat=embedwebsite"><img src="http://lh6.ggpht.com/_t1w9TWZeeLQ/ScnYeRd3NjI/AAAAAAAABD4/53tKltA30OE/s800/chess_party02.png" /></a></td></tr><tr><td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"><a href="http://picasaweb.google.com/guid.empty/Blog?feat=embedwebsite"></a><br /></td></tr></tbody></table><br /><br /><br /><span style="font-family:verdana;"><span style="font-weight: bold; color: rgb(255, 0, 0);">ps:</span> если кто захочет со мной сыграть, welcom, мой </span><span style="font-weight: bold;font-family:verdana;" >fics username - dushes</span><br /><span style="font-family:verdana;"><span style="font-weight: bold; color: rgb(255, 102, 102);">pps:</span> в основном специализируюсь :) на суперблитцах 3-0, когда дается всего 3 минуты каждому игроку на проведение игры, или 2-12, 2 минуты времени, с каждым ходом дается 12 секунд. </span><br /><span style="color: rgb(0, 0, 102);font-family:verdana;" > </span><br /><br /><br /><br /></div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com0tag:blogger.com,1999:blog-5872121829029410622.post-51781350557824270402009-03-24T16:43:00.009+03:002009-03-25T09:49:44.585+03:00Кастомизация стандартных валидаторов<div style="text-align: justify;"><span style="color: rgb(102, 102, 102);font-size:78%;" ><a href="http://guid.empty.googlepages.com/Validators.zip">исходные коды</a></span><br/><span style="font-family:verdana;">Вообщем-то, пришлось столкнуться с такой задачей: есть разметка с использованием стандартных валидаторов, нужно изменить работу валидаторов таким образом, чтобы вместо вывода сообщений об ошибках подсвечивать соотвествующий контрол рамкой или вообще менять стиль css.<br /><br /><br />В результате родился <span style="font-weight: bold;">скрипт</span>, текст которого <span style="font-weight: bold;">приведен в конце топика</span>.<br /><br /><br /><br /><br /><br />В качестве примера покажу, как выглядит страница с использованием стандартных валидаторов:<br /><br /><br /><br /><table style="width: auto;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/bINfQyfIbGlDBBmtjRaLOA?feat=embedwebsite"><img src="http://lh3.ggpht.com/_t1w9TWZeeLQ/ScjeyLf2N6I/AAAAAAAABDo/nT_rrPmEXUg/s800/validators_fw.png" /></a></td></tr><tr><td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"><a href="http://picasaweb.google.com/guid.empty/Blog?feat=embedwebsite"></a><br /></td></tr></tbody></table><br /><br />И после применения javascript:<br /><br /><br /><br /><table style="width: auto;"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/TzQIEfFKULpbbabgFDbdzQ?feat=embedwebsite"><img src="http://lh4.ggpht.com/_t1w9TWZeeLQ/ScjexpVFEXI/AAAAAAAABDg/CKlOVQ8BOW0/s800/validators_hooked.png" /></a></td></tr><tr><td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"><a href="http://picasaweb.google.com/guid.empty/Blog?feat=embedwebsite"></a><br /></td></tr></tbody></table><br /><br /><br /><br /><br />Чтобы добиться такого эффекта, мне требуется дописать в конце страницы или на событие pageLoaded (если использую на странице ScriptManager & PageRequestManager) следующий javascript-код:<br /><br /><br /><br /><pre class="js" name="code"><br /> <script language="javascript" type="text/javascript"><br /> Web.Customization.validatorsStylingApply();<br /> Web.Customization.invalidatedControlStyleName = "invalidatedControl";<br /> Web.Customization.invalidatedSelectControlStyleName = "invalidatedSelectControl";<br /> </script><br /><br /></pre><br /><br /><br /><br />Свойство <span style="font-weight: bold;">invalidatedControlStyleName </span>используется для указания, какой стиль будет применен к валидируемому контролу в случае, если сам валидатор <span style="font-weight: bold;">!isvalid</span>; После того, как валидатор стал валидным - восстанавливается тот класс контрола, который был до применения стиля; <br /><br />И описать соотвествующий стиль:<br /><pre class="js" name="code"><br /> <style type="text/css"><br /> <br /> .invalidatedControl {<br /> border: 2px solid #DD0000;<br /> }<br /><br /> </style><br /></pre><br /><br /><br />Также поддерживается та ситуация, когда к контролу применяется несколько валидаторов, например:<br /><br /><pre class="c#" name="code"><br /> <td><br /> <asp:TextBox ID="txtAdministrativeEmail" runat="server" Text="" Columns="40" MaxLength="40" Width="240px"></asp:TextBox><br /> <asp:RequiredFieldValidator ID="rfvEmail" runat="server"<br /> ControlToValidate="txtAdministrativeEmail"<br /> SetFocusOnError="false"<br /> EnableClientScript="true"<br /> Display="Dynamic"<br /> ErrorMessage="Enter the correct administrative email"<br /> Font-Size="12pt"></asp:RequiredFieldValidator><br /> <br /> <asp:RegularExpressionValidator ID="revEmail"<br /> runat="server"<br /> ControlToValidate="txtAdministrativeEmail"<br /> Display="Dynamic"<br /> SetFocusOnError="false"<br /> EnableClientScript="true"<br /> ErrorMessage="Invalid administrative email, please enter correct value..."<br /> ValidationExpression=".*@.*\..*" ></asp:RegularExpressionValidator><br /> </td><br /></pre><br /><br /><br /><br /><br /><br />Собственно, сам код javascript-класса <span style="font-weight: bold;">Web.Customization</span>:<br /><br /><br /><pre class="js" name="code"><br />/* customization of validation controls */<br />var Web = {};<br />Web.Customization = function() {<br /> ///<summary><br /> ///Helper class for the standart asp.net validators styling<br /> ///</summary><br /> this.invalidatedControlStyleName = "invalidatedControl";<br /> this.invalidatedSelectControlStyleName = "invalidatedControl";<br />}<br /><br />Web.Customization.prototype.validate = function() {<br /> ///<summary><br /> ///Custom Validation proxy method<br /> ///</summary><br /> var hooked_result = false;<br /> if (typeof Page_Validators != 'undefined' &&<br /> Page_Validators != null) {<br /><br /> if (this["fwvalidator"] != null) {<br /><br /> var validator = this["fwvalidator"];<br /> var fwevaluationfunction_object = eval("hooked_validator = " + this["fwevaluationfunction"]);<br /> eval("hooked_result = hooked_validator(validator);")<br /> validator.isvalid = hooked_result;<br /> var object = $get(this["controltovalidate"]);<br /> var controlstyle = "";<br /><br /> if (hooked_result) {<br /> for (var i = 0; i < Page_Validators.length; i++) {<br /> var previousValidator = Page_Validators[i];<br /><br /> if (previousValidator.controltovalidate == this.controltovalidate) {<br /> if (previousValidator.id != this.id) {<br /> hooked_result = previousValidator.isvalid;<br /> }<br /> else if (previousValidator.id == this.id) {<br /> break;<br /> }<br /> }<br /> }<br /> }<br /><br /> if (hooked_result) {<br /> if (this["controlstyle"] != null) {<br /> controlstyle = this["controlstyle"];<br /> object.className = controlstyle;<br /><br /> }<br /> else<br /> object.removeAttribute("className");<br /><br /> if (object.tagName == 'SELECT') {<br /> var parentObj = object.parentElement;<br /> if (parentObj.tagName == 'DIV') {<br /> parentObj.removeAttribute("className");<br /> }<br /> }<br /><br /> }<br /> else {<br /> if (object.tagName == 'SELECT') {<br /> var parentObj = object.parentElement;<br /> if (parentObj.tagName == 'DIV') {<br /> parentObj.className = Web.Customization.invalidatedSelectControlStyleName;<br /> }<br /> }<br /> else {<br /> object.className = Web.Customization.invalidatedControlStyleName;<br /> }<br /> }<br /> }<br /> }<br /><br /> return hooked_result;<br />};<br /><br />Web.Customization.prototype.validatorsStylingApply = function() {<br /> ///<summary><br /> ///Applies the custom styling logic into the all validators on the current page<br /> ///</summary> <br /> if (typeof Page_Validators != 'undefined' &&<br /> Page_Validators != null) {<br /> var validators = Page_Validators;<br /><br /> for (var i = 0; i < validators.length; i++) {<br /> if (validators[i].attributes["evaluationfunction"] != null) {<br /><br /> if (validators[i].attributes["display"] != null) {<br /> validators[i].attributes.removeNamedItem("display");<br /> }<br /><br /> var displayAttribute = document.createAttribute("display");<br /> displayAttribute.value = "None";<br /> validators[i].attributes.setNamedItem(displayAttribute);<br /><br /> if (validators[i]["fwvalidator"] == null) {<br /> validators[i]["fwvalidator"] = validators[i];<br /> validators[i]["fwevaluationfunction"] = validators[i].attributes["evaluationfunction"].value;<br /> validators[i]["controltovalidate"] = validators[i].attributes["controltovalidate"].value;<br /><br /> var control = $get(validators[i]["controltovalidate"]);<br /> if (control != null &&<br /> control.className != null &&<br /> control.className != '')<br /> validators[i]["controlstyle"] = control.className;<br /><br /> validators[i].attributes["evaluationfunction"].nodeValue = Web.Customization.validate;<br /> }<br /> }<br /> }<br /> }<br />}<br /><br />/* global objects initialization */<br />Web.Customization = new Web.Customization();<br /><br /></pre><br /><br /><br /><br />удачи в использовании, надеюсь, сама идея решения кому-нить пригодится...<br /><br /><br /></span><br /></div>Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com1tag:blogger.com,1999:blog-5872121829029410622.post-48361593810007242362009-03-24T14:34:00.002+03:002009-03-24T14:36:39.988+03:00Так и не нашел полный текст - Это я, добрый ЭЭх, а это мое ээхо...<hr /><br /><div style="text-align: justify;"><span style="font-family:verdana;">...<br />- <span style="font-weight: bold; color: rgb(255, 0, 0);font-size:180%;" >К</span>ТО ТАМ?</span><br /><span style="font-family:verdana;">- Это я, добрый Ээх. Я здесь.</span><br /><span style="font-family:verdana;">- И я здесь!</span><br /><span style="font-family:verdana;">- А ты кто такой? Откуда взялся?</span><br /><span style="font-family:verdana;">- С того берега моря.</span><br /><span style="font-family:verdana;">- На чем приехал?</span><br /><span style="font-family:verdana;">- Оседлал хромую блоху, сел и приехал.</span><br /><span style="font-family:verdana;">- Море, что, лужа?</span><br /><span style="font-family:verdana;">- Может и лужа, да только ту лужу орел не перелетел.</span><br /><span style="font-family:verdana;">- Значит, орел - птенец!</span><br /><span style="font-family:verdana;">- Наверно, птенец. Да только тень от его крыльев город закрывает, в городе ночь настает.</span><br /><span style="font-family:verdana;">- Город-то, небось, крооохотный!</span><br /><span style="font-family:verdana;">- Через тот город заяц бежал - не перебежал.</span><br /><span style="font-family:verdana;">- Выходит, заяц маааленький!</span><br /><span style="font-family:verdana;">- Заяц – как заяц. Из его шкуры тулуп вышел.</span><br /><span style="font-family:verdana;">- Куда вышел?</span><br /><span style="font-family:verdana;">- Вышел из того города, где заяц бежал, на который тень от орла упала, и пошел, куда глаза глядят.</span><br /><span style="font-family:verdana;">- Чьи глаза???</span><br /><span style="font-family:verdana;">- Глаза того тулупа, который из шкуры зайца вышел, в городе, где ночь настает, когда над ним птенец пролетает верхом на хромой блохе.</span><br /><span style="font-family:verdana;">- ЧЕГО?!!!!</span><br /><span style="font-family:verdana;">- Чего-чего. На хромой блохе с того берега моря, которое зайцу не перелететь, орлу не перебежать, хоть море - не море, а так - лужа посреди города, где тень от блохи на зайца упала и насмерть убила, а из шкуры зайца тулуп вышел и пошел, куда глаза глядят. Тут заяц кааак прыгнет!</span><br /><span style="font-family:verdana;">- КАКОЙ ЗАЯЦ???</span><br /><span style="font-family:verdana;">- Насмерть убитый – как прыгнет, куда глаза глядят, аж на тот берег моря, которое ни перелететь, ни перебежать, из которого тулуп вышел, на который тень от блохи упала и зайца убила, хоть заяц – не заяц, а орел!</span><br /><span style="font-family:verdana;">- КАКОЙ ЗАЯЦ??? КАКОЙ ОРЕЛ??? КАКАЯ БЛОХА?????</span><br /><span style="font-family:verdana;">- Повторить? Ну, значит, та самая блоха с того берега лужи…<br /></span><span style="font-family:verdana;">...</span><br /></div><br /><hr /><br /><span style="font-weight: bold; color: rgb(255, 102, 102);">ps:</span> Какие мульты мы смотрели :)... ностальгия..Anonymoushttp://www.blogger.com/profile/03007552718585100098noreply@blogger.com5