<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4973083673024356794</id><updated>2024-03-05T20:28:42.638+02:00</updated><category term="coding"/><category term="gamedev"/><category term="XNA"/><category term="fun"/><category term="универ"/><category term=".net"/><category term="ASP.NET"/><category term="Java"/><category term="gamedesign"/><category term="javascript"/><category term="физика"/><category term="ASP.NET MVC"/><category term="Backbone.js"/><category term="C++"/><category term="HLSL"/><category term="MSI"/><category term="WebAPI"/><category term="Wix"/><category term="app"/><category term="cycloid"/><category term="debugging"/><category term="gadget"/><category term="graffity"/><category term="iTunes"/><category term="linux"/><category term="liqpay"/><category term="mongodb"/><category term="php"/><category term="resharper"/><category term="reverse engineering"/><category term="silverlight"/><category term="sitecore"/><category term="uml"/><category term="windows phone"/><category term="xbox"/><category term="вконтакте"/><category term="интеллектуальные_системы"/><category term="сетевое программирование"/><category term="структуры данных"/><title type='text'>Jack Spektor&#39;s blog</title><subtitle type='html'>Life by .NET Developer</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-3080075426905669461</id><published>2016-12-06T05:11:00.001+02:00</published><updated>2016-12-06T05:21:40.675+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="debugging"/><category scheme="http://www.blogger.com/atom/ns#" term="resharper"/><category scheme="http://www.blogger.com/atom/ns#" term="reverse engineering"/><title type='text'>Not Just My Code: How to debug third party libraries without decompiling them</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;b&gt;Intro&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div&gt;
So I&#39;m back... writing another blogpost. Hope this would be good one.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Problem&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
If you are using any third party library you probably know the pain you are getting if something works not as you expected... &lt;br /&gt;
&lt;br /&gt;
Imagine the most common scenario - you have a website which uses third party library. Basically it&#39;s DLL which provides some integration points for you. You try to integrate with it, it doesn&#39;t work but you have no idea why. If it was your code you could have debugged it, but what if you don&#39;t have the code? Usually in my case this meant reverse engineering and decompiling using tools like ILSpy, and replacing OOTB code to be able to debug it step by step.... But is it really the only way to do it?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;b&gt;Solution&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Fortunately there is a better way.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Step 1 -&amp;nbsp;Generate symbols using decompiling tool dotPeek.&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
When library is built in Visual Studio it&#39;s it&#39;s also supplied with *.PDB files which contains all the information about how to debug it. Unfortunately if you are using third party dlls you are most likely not supplied with symbol files. Developers don&#39;t expect you to debug their code! (probably because they think there is no bugs there?)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;Offtop note: PDB files are not only used for debugging, but also they are used to show detailed information about exception source in stack trace (like code line numbers).&amp;nbsp;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Fortunately there is great tools like JetBrains dotPeek that allow to not only decompile third party .NET libraries (which is also handy), but also generate that .PDB files.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://www.jetbrains.com/decompiler/&quot;&gt;https://www.jetbrains.com/decompiler/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6mbglI4N2KDF2yzImC76FpEitutOqgTzsk7p8JuYhEYPabySgwoCSIoHmbD8DBF1EhKMboAbMNvl_4oKE_MrN7MZ3xLsTv45yAJCrlTNAKtAsOzAM7XaC8AzpfWZpVZGmxuiaLk8wxl-J/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6mbglI4N2KDF2yzImC76FpEitutOqgTzsk7p8JuYhEYPabySgwoCSIoHmbD8DBF1EhKMboAbMNvl_4oKE_MrN7MZ3xLsTv45yAJCrlTNAKtAsOzAM7XaC8AzpfWZpVZGmxuiaLk8wxl-J/s1600/Capture.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So now we have generated debug database files which we can use... but this is not all.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
We can also host our own &lt;b&gt;symbol server&lt;/b&gt; using dotPeek. I will show later what it does and how much power we can get from this debugging tool!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilecERmaVXrhE29lac6SlDzbyu7aZo4cFgnHHW96vnOvKgNENTmrcP2bRuIjTvcgFtr2n4YrJVgk0I7C-Frj4cB2msUDN2PimsL87HAYNNJupXx-Aq4oTJaxoAVNrsaRXt7Jxs1Jh3K_Ls/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;251&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilecERmaVXrhE29lac6SlDzbyu7aZo4cFgnHHW96vnOvKgNENTmrcP2bRuIjTvcgFtr2n4YrJVgk0I7C-Frj4cB2msUDN2PimsL87HAYNNJupXx-Aq4oTJaxoAVNrsaRXt7Jxs1Jh3K_Ls/s320/Capture.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoL3cl1FhXio_5lFInKgN5mG_gcdiqaOnLr2KAjH9zMjHw0YADZcS6lB4gs4grWIqV7TuFIWyWhfSu2ciOQvAAK8YJvmyOpJ1ga-nHV3v6XQ6OrrGZQE3IGImbZeCLzmfogs4V7BHHFlBX/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;69&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoL3cl1FhXio_5lFInKgN5mG_gcdiqaOnLr2KAjH9zMjHw0YADZcS6lB4gs4grWIqV7TuFIWyWhfSu2ciOQvAAK8YJvmyOpJ1ga-nHV3v6XQ6OrrGZQE3IGImbZeCLzmfogs4V7BHHFlBX/s320/Capture.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;i&gt;Note: For performance reasons I&#39;d advise to host symbol information only for assemblies in Assembly Explorer.&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;b&gt;Step 2 - Configure Visual Studio with new symbol source&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Now when our symbol server is running we need to add it in Visual Studio. Then Visual Studio will know where to search symbols when we are debugging process.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
We also need to disable &quot;Just My Code&quot; to enable debugging of third party libraries. As well as we need to enable &quot;Source Server Support&quot;.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgivO2xXxoSbzF6lVp54VdrEbyAWbrr9S7RTYwV-9rFcaGflP7_Wc60GZmKA9B1YRhMzIZh4C8OkRKhtQyqRBFV6I_kMBxpRkF6hnNDojAUqpO4TYiNqjF6BQjai0w_mebaN3w29rglDeG/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;256&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgivO2xXxoSbzF6lVp54VdrEbyAWbrr9S7RTYwV-9rFcaGflP7_Wc60GZmKA9B1YRhMzIZh4C8OkRKhtQyqRBFV6I_kMBxpRkF6hnNDojAUqpO4TYiNqjF6BQjai0w_mebaN3w29rglDeG/s320/Capture.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
We also need to add new symbol source in Symbols tab.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;i&gt;Note: For perfomance reasons I&#39;d advise to specify the symbol cache directory, as well as explicitly specify modules which should be loaded from symbol server. This will speed up the loading of symbols from the symbol server.&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXf6urlVVbv6JILN_wflNwtTNmsucXcIJ2rYAGE2g4Qn7PunpMoojgNr4rbGwpAPGsRdtaSgcDfOdkfJGAq_tW72YZba0-IwjOVMFVJzjL18TXUEgpFmDLs4omI9qsGGsv75NpTDRwFWo9/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;253&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXf6urlVVbv6JILN_wflNwtTNmsucXcIJ2rYAGE2g4Qn7PunpMoojgNr4rbGwpAPGsRdtaSgcDfOdkfJGAq_tW72YZba0-IwjOVMFVJzjL18TXUEgpFmDLs4omI9qsGGsv75NpTDRwFWo9/s320/Capture.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;b&gt;Step 3 - Loading symbols&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
So now all set up and we can actually debug our third party DLLs. But we have no access to their source code - how can we debug them?&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
We have several options depending on the fact do you have Resharper or not. But first let&#39;s start debugging.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
For an example I&#39;ve took the code which is integrated into &lt;a href=&quot;http://sitecore.net/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Sitecore &lt;/a&gt;(.NET CMS).&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9UwjaAGICTp7hWNEonzwcuY2USED4BEp3Vfp0Fe3VU8ArgSa2uX7yRXCwMe-fvKVJngmeVPHx0aG0PDoWm9VSMRctd3VzHgJqP-97w8kGwmIJ0RGaVvGDjng5L9paNjaFlqSJEIwNj1tD/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;147&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9UwjaAGICTp7hWNEonzwcuY2USED4BEp3Vfp0Fe3VU8ArgSa2uX7yRXCwMe-fvKVJngmeVPHx0aG0PDoWm9VSMRctd3VzHgJqP-97w8kGwmIJ0RGaVvGDjng5L9paNjaFlqSJEIwNj1tD/s640/Capture.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9UwjaAGICTp7hWNEonzwcuY2USED4BEp3Vfp0Fe3VU8ArgSa2uX7yRXCwMe-fvKVJngmeVPHx0aG0PDoWm9VSMRctd3VzHgJqP-97w8kGwmIJ0RGaVvGDjng5L9paNjaFlqSJEIwNj1tD/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;br /&gt;&lt;/a&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
As you can see this class is inherited from OpenExperienceEditor class which is third party Sitecore library - Sitecore.ExperienceEditor.dll.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
I&#39;ve added the Sitecore.ExperienceEditor.dll to dotPeek to decompile the source code. This will also mean that it symbols will be available in symbol server.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgphUjWRRMozMVTluBo6ckZsh75FEv14SJvA_sj5aQFMKBQ3cQ_T5YNw3d3ZopzE4F1JGxwl4d1czoJL1TCYAu-LcUbkgLLU3lb67oKNJB5x438blxeJSqjCevgwT6EjxeYsfH4hTx2wUm7/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;228&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgphUjWRRMozMVTluBo6ckZsh75FEv14SJvA_sj5aQFMKBQ3cQ_T5YNw3d3ZopzE4F1JGxwl4d1czoJL1TCYAu-LcUbkgLLU3lb67oKNJB5x438blxeJSqjCevgwT6EjxeYsfH4hTx2wUm7/s400/Capture.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Now lets debug!&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
I&#39;ll attach to w3wp.exe which is IIS process that hosts my website.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Now we&#39;ll go to Debug -&amp;gt; Windows -&amp;gt; Modules to list modules we are using in our solution.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
In order to be able to debug the module we need to &lt;u&gt;load the symbols&lt;/u&gt;. This will tell Visual Studio to go through &lt;b&gt;symbol sources &lt;/b&gt;and locate the library symbols.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigPDLvTvxTwVVchMahFUh1RXnsXXy17sFQzDbEim0lrHLtWV2CkgzdJyBx6Rf6VlfPFlQGFAkq47jw7EhhNaS3oJPBvDA1CETogX3flZIpvNN4KgeArUx3NSuJwPsOfByMofcL2xlBjNyo/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;152&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigPDLvTvxTwVVchMahFUh1RXnsXXy17sFQzDbEim0lrHLtWV2CkgzdJyBx6Rf6VlfPFlQGFAkq47jw7EhhNaS3oJPBvDA1CETogX3flZIpvNN4KgeArUx3NSuJwPsOfByMofcL2xlBjNyo/s400/Capture.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;i&gt;Note: If symbols were loaded successfully we&#39;ll see &quot;Symbol Status&quot; changed to &quot;Symbols loaded&quot;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;b&gt;Step 4 -&amp;nbsp;Where all the fun begins&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Ok... So let&#39;s summarise. Symbol server running. Visual Studio know where to find it and we successfully loaded symbols we need to debug third party code.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now we need to add a breakpoint.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;Option 1 - Without Resharper.&lt;/u&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Open Debug -&amp;gt; Windows -&amp;gt; Breakpoints and create a new &quot;Function Breakpoint&quot;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA9S0dI2Db06qTdaOodTfF_up3bHWXaTTWj8qqouzK8dp-5WeRUaNOnAaw_tZr_zR0LI6uMPtz7_ZSkbHhIRPfh3SO_Lpbuy1O8B57m0gyGl0TUiNesZMcsMiwtMQAb0yxZ5RZ-r-BfmRR/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;106&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA9S0dI2Db06qTdaOodTfF_up3bHWXaTTWj8qqouzK8dp-5WeRUaNOnAaw_tZr_zR0LI6uMPtz7_ZSkbHhIRPfh3SO_Lpbuy1O8B57m0gyGl0TUiNesZMcsMiwtMQAb0yxZ5RZ-r-BfmRR/s400/Capture.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA9S0dI2Db06qTdaOodTfF_up3bHWXaTTWj8qqouzK8dp-5WeRUaNOnAaw_tZr_zR0LI6uMPtz7_ZSkbHhIRPfh3SO_Lpbuy1O8B57m0gyGl0TUiNesZMcsMiwtMQAb0yxZ5RZ-r-BfmRR/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
We&#39;ll need to provide full path including namespace, class name and function name in the dialog.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU7cAnDta7Ee0YX_Nc5GwwgOBAhidUWiZG3yZ7MVaiyHDUeIDI4ZUb2J1CBzxUndUmtt_UnAHA8kec2A5mFRAEaYu83p9TUWwfejPNxg_OdYWVR0HoG0pwXGDzjXEeUBdejl-iKAKPNBDr/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;83&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU7cAnDta7Ee0YX_Nc5GwwgOBAhidUWiZG3yZ7MVaiyHDUeIDI4ZUb2J1CBzxUndUmtt_UnAHA8kec2A5mFRAEaYu83p9TUWwfejPNxg_OdYWVR0HoG0pwXGDzjXEeUBdejl-iKAKPNBDr/s320/Capture.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Now anytime this function is called we&#39;ll hit breakpoint!&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;u&gt;Option 2 - With Resharper&lt;/u&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
That&#39;s an easy one. Configure Resharper to navigate to source instead of declaration.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUew1_v1mexn6JQycMEuaYtqc1otKnR4LhgvPZ5678kBJXowRrJBPSjJiNoLbUuDg-Z6CEAOzXaOQejdOJiscaiY6oCbahXRoLemGnuR3BxoVGcWyEHOXwXsaolBEFzqS14p6yQf6ELvym/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;252&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUew1_v1mexn6JQycMEuaYtqc1otKnR4LhgvPZ5678kBJXowRrJBPSjJiNoLbUuDg-Z6CEAOzXaOQejdOJiscaiY6oCbahXRoLemGnuR3BxoVGcWyEHOXwXsaolBEFzqS14p6yQf6ELvym/s320/Capture.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Now you can just navigate to class decompiled code and put a breakpoint as usual.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwzEQvfZ8vITZw9PV8jiVugmHQxApl4gNOx71EuONqiy6jqFL-q6ROUBL09o0sidCgtkLb2kjxXvK3RsJL2afxvWzau3hZeNcts7EnP9fhyphenhyphenomKCnC6TmQ0MfIvsClsyrRueJgEv0Vy2YbS/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;90&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwzEQvfZ8vITZw9PV8jiVugmHQxApl4gNOx71EuONqiy6jqFL-q6ROUBL09o0sidCgtkLb2kjxXvK3RsJL2afxvWzau3hZeNcts7EnP9fhyphenhyphenomKCnC6TmQ0MfIvsClsyrRueJgEv0Vy2YbS/s320/Capture.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;b&gt;Happy debugging!&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA9S0dI2Db06qTdaOodTfF_up3bHWXaTTWj8qqouzK8dp-5WeRUaNOnAaw_tZr_zR0LI6uMPtz7_ZSkbHhIRPfh3SO_Lpbuy1O8B57m0gyGl0TUiNesZMcsMiwtMQAb0yxZ5RZ-r-BfmRR/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA9S0dI2Db06qTdaOodTfF_up3bHWXaTTWj8qqouzK8dp-5WeRUaNOnAaw_tZr_zR0LI6uMPtz7_ZSkbHhIRPfh3SO_Lpbuy1O8B57m0gyGl0TUiNesZMcsMiwtMQAb0yxZ5RZ-r-BfmRR/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/3080075426905669461/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2016/12/not-just-my-code-how-to-debug-third.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/3080075426905669461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/3080075426905669461'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2016/12/not-just-my-code-how-to-debug-third.html' title='Not Just My Code: How to debug third party libraries without decompiling them'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6mbglI4N2KDF2yzImC76FpEitutOqgTzsk7p8JuYhEYPabySgwoCSIoHmbD8DBF1EhKMboAbMNvl_4oKE_MrN7MZ3xLsTv45yAJCrlTNAKtAsOzAM7XaC8AzpfWZpVZGmxuiaLk8wxl-J/s72-c/Capture.PNG" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Торанга, Новая Зеландия</georss:featurename><georss:point>-37.687797499999988 176.16512950000003</georss:point><georss:box>-38.089866499999985 175.51968250000004 -37.285728499999991 176.81057650000002</georss:box></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-7709461600388287306</id><published>2014-03-23T11:36:00.000+02:00</published><updated>2016-12-03T06:47:16.385+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="app"/><category scheme="http://www.blogger.com/atom/ns#" term="graffity"/><category scheme="http://www.blogger.com/atom/ns#" term="windows phone"/><title type='text'>Graffity for Windows Phone</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I would like to advertise an application that I done in my spare time.&lt;br /&gt;
&lt;br /&gt;
The idea behind the app is to create painting using the phone and share them on the web. Currently the number of features is limited, but if the user base will grow I&#39;ll extend the functionality. There are a lot of ideas how to make app more useful.&lt;br /&gt;
&lt;br /&gt;
Video:&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
.badge
{
background: url(&quot;http://graffity.cloudapp.net/Content/badge.png&quot;) no-repeat;
width: 462px;
height: 120px;
left: 20px;
position: relative;
display: block !important;
margin-left: auto;
margin-right: auto;
}
&lt;/style&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
            
            function resize() {
                var video = document.getElementById(&quot;graffityVideo&quot;);
var divGraffityPost = document.getElementById(&quot;divGraffityPost&quot;);
                var coef = 560.0 / 315.0;

                var width = divGraffityPost.clientWidth;

                video.width = width;
                video.height = width * 1/coef;
            }

            window.onresize = resize;

            document.addEventListener(&#39;DOMContentLoaded&#39;, function () {
                resize();                
            });


        &lt;/script&gt;

&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; id=&quot;graffityVideo&quot; src=&quot;//www.youtube.com/embed/_krj05eOSao&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;If you have Windows Phone I&#39;ll be happy to recieve feedback, if not please share :)
&lt;br /&gt;
&lt;br /&gt;
You can learn more about the app here:
&lt;a href=&quot;http://graffity.cloudapp.net/&quot;&gt;http://graffity.cloudapp.net&lt;/a&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a class=&quot;badge&quot; href=&quot;http://www.windowsphone.com/s?appid=0b28c207-e6ff-4873-b129-df6156ccddcf&quot;&gt;
&lt;/a&gt;

&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/7709461600388287306/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2014/03/graffity-for-windows-phone.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/7709461600388287306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/7709461600388287306'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2014/03/graffity-for-windows-phone.html' title='Graffity for Windows Phone'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Одесса, Одесская область, Украина</georss:featurename><georss:point>46.482526 30.723309500000028</georss:point><georss:box>46.132503 30.077862500000027 46.832549 31.368756500000028</georss:box></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-1403952931410075923</id><published>2013-10-13T16:28:00.000+03:00</published><updated>2013-11-18T16:51:10.344+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="Backbone.js"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="WebAPI"/><title type='text'>Backbone.JS + ASP.NET WebAPI</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;Introduction&lt;/b&gt;&lt;/h3&gt;
&lt;b&gt;Backbone.js&lt;/b&gt; is a powerful JS library built on top of &lt;b&gt;Underscore.js&lt;/b&gt; library. It enables to create one page javascript applications using &lt;b&gt;MVC &lt;/b&gt;pattern.&lt;br /&gt;
&lt;br /&gt;
Backbone.js could be downloaded from&amp;nbsp;&lt;a href=&quot;http://backbonejs.org/&quot;&gt;http://backbonejs.org/&lt;/a&gt;, also there exists plenty of examples and tutorials.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ASP.NET WebAPI&lt;/b&gt; is newest Microsoft framework, which is a part &amp;nbsp;of &lt;b&gt;ASP.NET MVC 4&lt;/b&gt;. It provides developers with abilitity to quickly create &lt;b&gt;REST &lt;/b&gt;services, which could be available from any device and client.&lt;br /&gt;
&lt;br /&gt;
More information about &lt;b&gt;WebAPI &lt;/b&gt;could be found on&amp;nbsp;&lt;a href=&quot;http://www.asp.net/web-api/overview&quot;&gt;http://www.asp.net/web-api/overview&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;Goal&lt;/b&gt;&lt;/h3&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
In this post I would like to describe how to create basic &lt;b&gt;Backbone.js&lt;/b&gt; application, which is using &lt;b&gt;WebAPI &lt;/b&gt;as a storage.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;Step 1 Create WebAPI REST service&lt;/b&gt;&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.congesta.cz/Images/MVC3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;131&quot; src=&quot;http://www.congesta.cz/Images/MVC3.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
First lets create a &lt;b&gt;REST &lt;/b&gt;service which will provide and modify all data in our app.&lt;br /&gt;
&lt;br /&gt;
Our service will be able to provide a list of skills, which we&#39;ll be defined by id, title and description.
Also service will be able to add new skill to list.&lt;br /&gt;
&lt;br /&gt;
We&#39;ll create new &lt;b&gt;WebAPI &lt;/b&gt;project (New Project -&amp;gt; Web -&amp;gt; ASP.NET MVC 4 App -&amp;gt; WebAPI) and define a controller and model.&lt;br /&gt;
&lt;br /&gt;
Model definition:

&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; Skill&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;        [Required]&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; title { &lt;span class=&quot;kwrd&quot;&gt;get&lt;/span&gt;; &lt;span class=&quot;kwrd&quot;&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;        [Required]&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; description { &lt;span class=&quot;kwrd&quot;&gt;get&lt;/span&gt;; &lt;span class=&quot;kwrd&quot;&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; id { &lt;span class=&quot;kwrd&quot;&gt;get&lt;/span&gt;; &lt;span class=&quot;kwrd&quot;&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Then let&#39;s define a controller. Since it&#39;s &lt;b&gt;WebAPI &lt;/b&gt;service the controller is derived from &lt;b&gt;ApiController &lt;/b&gt;class.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; SkillsController : ApiController&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
For easy of implementation we&#39;ll store our data in a static variable. Later it could be any other storage, for example&lt;b&gt; Entity Framework&lt;/b&gt; with &lt;b&gt;MSSQL &lt;/b&gt;database.
&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; List&amp;lt;Skill&amp;gt; skills = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; List&amp;lt;Skill&amp;gt;();&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; skillId = 0;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Let&#39;s fill our collection with some test data, so it&#39;ll be available right after &lt;b&gt;REST &lt;/b&gt;service is started.
&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; SkillsController()&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;            skills = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; List&amp;lt;Skill&amp;gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;                &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Skill() { id = 1, title = &lt;span class=&quot;str&quot;&gt;&quot;Skill1&quot;&lt;/span&gt;, description = &lt;span class=&quot;str&quot;&gt;&quot;Desc1&quot;&lt;/span&gt; },&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;                &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Skill() { id = 2, title = &lt;span class=&quot;str&quot;&gt;&quot;Skill2&quot;&lt;/span&gt;, description = &lt;span class=&quot;str&quot;&gt;&quot;Desc2&quot;&lt;/span&gt; },&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;                &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Skill() { id = 3, title = &lt;span class=&quot;str&quot;&gt;&quot;Skill3&quot;&lt;/span&gt;, description = &lt;span class=&quot;str&quot;&gt;&quot;Desc3&quot;&lt;/span&gt; }&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;            };&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
And now finally &lt;b&gt;REST &lt;/b&gt;methods. In this app only 2 methods will be implemented - &lt;b&gt;PUT&lt;/b&gt;, &lt;b&gt;GET&lt;/b&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;        [HttpGet]&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; IEnumerable&amp;lt;Skill&amp;gt; GetSkills()&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; skills;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;        [HttpPut]&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; HttpResponseMessage AddSkill(Skill skill)&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:  &lt;/span&gt;            &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (ModelState.IsValid)&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:  &lt;/span&gt;            {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:  &lt;/span&gt;                skill.id = skillId++;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:  &lt;/span&gt;                skills.Add(skill);&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:  &lt;/span&gt;                &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; HttpResponseMessage(HttpStatusCode.OK);&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:  &lt;/span&gt;            }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  18:  &lt;/span&gt;            &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  19:  &lt;/span&gt;            {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  20:  &lt;/span&gt;                &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; HttpResponseMessage(HttpStatusCode.ExpectationFailed);&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  21:  &lt;/span&gt;            }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  22:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Now the service is almost ready to use - you can host it on &lt;b&gt;IIS &lt;/b&gt;(for example on &lt;b&gt;localhost:8080&lt;/b&gt;) and try to call its methods from the browser, but if you&#39;ll try to access it from another domain you&#39;ll  get an error. 
&lt;br /&gt;
It&#39;s happening because cross-domain requests are a potential security vulnerability and by default are disabled for web server.&lt;br /&gt;
&lt;br /&gt;
So the finishing stroke would be to enable requests from other domains.&lt;br /&gt;
&lt;br /&gt;
We could do it in &lt;b&gt;web.config&lt;/b&gt;:
&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;system.webServer&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;    &lt;span class=&quot;rem&quot;&gt;&amp;lt;!-- Enable cross-domain requests --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;httpProtocol&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;      &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;customHeaders&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Access-Control-Allow-Origin&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;*&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Access-Control-Allow-Methods&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;GET, POST, PUT, DELETE, OPTIONS&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Access-Control-Allow-Headers&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Content-Type, X-Requested-With&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;      &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;customHeaders&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;httpProtocol&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Here we enable requests from any domain, enable &lt;b&gt;REST &lt;/b&gt;methods and enable requests headers.&lt;br /&gt;
&lt;br /&gt;
By the way may be you noticed that response content type is not defined anywhere - that&#39;s because &lt;b&gt;WebAPI &lt;/b&gt;webservice is returning response in format that is defined in &lt;b&gt;Content-Type&lt;/b&gt; header property. It could be &lt;b&gt;XML&lt;/b&gt;, &lt;b&gt;JSON &lt;/b&gt;or other format.
&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;Step 2 Create a Backbone.js application&lt;/b&gt;&lt;/h3&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;http://backbonejs.org/docs/images/backbone.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Backbone.js&quot; border=&quot;0&quot; height=&quot;71&quot; src=&quot;http://backbonejs.org/docs/images/backbone.png&quot; title=&quot;&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
Now our webservice is available from anywhere, so let&#39;s create a &lt;b&gt;Backbone.js&lt;/b&gt; app.&lt;br /&gt;
&lt;br /&gt;
For this we&#39;ll add additional web project which will host this app and add required &lt;b&gt;Backbone.js&lt;/b&gt; libraries:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;jQuery (&lt;a href=&quot;http://jquery.com/&quot;&gt;http://jquery.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Underscore.js (&lt;a href=&quot;http://underscorejs.org/&quot;&gt;http://underscorejs.org/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;json2.js (&lt;a href=&quot;https://raw.github.com/douglascrockford/JSON-js/master/json2.js&quot;&gt;https://raw.github.com/douglascrockford/JSON-js/master/json2.js&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Backbone.js itself (&lt;a href=&quot;http://backbonejs.org/&quot;&gt;http://backbonejs.org/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
First we need to define &lt;b&gt;Backbone.js&lt;/b&gt; model:&lt;br /&gt;
&lt;br /&gt;
In &lt;b&gt;backbone.js&lt;/b&gt; all models should extend from &lt;b&gt;Backbone.Model&lt;/b&gt; class.&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;$(function () {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;    Item = Backbone.Model.extend({&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;        defaults: function () {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;            return {&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;                id: -1,&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;                title: null,&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;                description: null&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;            }&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:  &lt;/span&gt;    });&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:  &lt;/span&gt;    ItemSet = Backbone.Collection.extend({&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:  &lt;/span&gt;        url: &quot;http://localhost:8080/api/Skills&quot;,&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:  &lt;/span&gt;        model: Item&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:  &lt;/span&gt;    });&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  18:  &lt;/span&gt;});&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Here I define Item model with id, title and description fields, and also I define collection of Item as &lt;b&gt;ItemSet&lt;/b&gt;. &lt;br /&gt;
&lt;br /&gt;
In &lt;b&gt;ItemSet &lt;/b&gt;we need to define the address where the model resource is available, which is the address of our &lt;b&gt;REST &lt;/b&gt;service. In my case it&#39;s hosted on &lt;b&gt;localhost:8080&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Now when the model is defined we could define the markup for our application:
&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;app&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;skillsTab&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;            &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;Skills:&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;            &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;skillList&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;            &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;            &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;addSkill&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;                &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;Add skill:&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;                &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;text&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;skillName&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:  &lt;/span&gt;                &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;text&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;skillDescription&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:  &lt;/span&gt;                &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;addSkill&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;button&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Add&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:  &lt;/span&gt;            &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
This would be the sceleton of our application:

&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;skillList would contain a list of Item&lt;/li&gt;
&lt;li&gt;addSkill contains UI for adding of the new item.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Now we need to define &lt;b&gt;JS &lt;/b&gt;template for the presentation of the Item:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;script&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;text/template&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;skill-template&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;    &amp;lt;div &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;str&quot;&gt;&quot;view item skill&quot;&lt;/span&gt;&amp;gt;      &lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;      &amp;lt;label&amp;gt;&amp;lt;%- title %&amp;gt;&amp;lt;/label&amp;gt;           &lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;      &amp;lt;div &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;str&quot;&gt;&quot;skill-description&quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;        &amp;lt;%= description %&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;      &amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;    &amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;  &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Now when markup is defined we could create &lt;b&gt;Backbone.js&lt;/b&gt; view: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;$(function () {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;    SkillView = Backbone.View.extend({&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;        template: _.template($(&#39;#skill-template&#39;).html()),&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;        initialize: function () {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;            this.listenTo(this.model, &#39;change&#39;, this.render);&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;            this.listenTo(this.model, &#39;destroy&#39;, this.remove);&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;        },&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:  &lt;/span&gt;        render: function () {&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:  &lt;/span&gt;            this.$el.html(this.template(this.model.toJSON()));&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:  &lt;/span&gt;            return this;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:  &lt;/span&gt;    });&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:  &lt;/span&gt;});&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
All &lt;b&gt;backbone.js &lt;/b&gt;views are derived from &lt;b&gt;Backbone.View&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Here we subscribe to model &quot;&lt;b&gt;change&lt;/b&gt;&quot; and &quot;&lt;b&gt;destroy&lt;/b&gt;&quot; events. They are fired when view model is changed or deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Render&lt;/b&gt; function defines how model is presented in the UI. In this case we are using defined before template for &lt;b&gt;Item&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Now when Item view is ready we need to define view for the whole &lt;b&gt;Backbone.js&lt;/b&gt; app:&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;$(function () {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    // Our overall **AppView** is the top-level piece of UI.&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;    AppView = Backbone.View.extend({&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;        // Instead of generating a new element, bind to the existing skeleton of&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;        // the App already present in the HTML.&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;        el: $(&quot;#app&quot;),&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:  &lt;/span&gt;        events: {&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:  &lt;/span&gt;            &quot;click #addSkill&quot;: &quot;addSkill&quot;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:  &lt;/span&gt;        },&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:  &lt;/span&gt;        addSkill: function () {&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:  &lt;/span&gt;            var item = {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:  &lt;/span&gt;                title: this.newSkillName.val(),&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:  &lt;/span&gt;                description: this.newSkillDescription.val()&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  18:  &lt;/span&gt;            };&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  19:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  20:  &lt;/span&gt;            skillsList.create(item);&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  21:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  22:  &lt;/span&gt;            this.newSkillName.val(&#39;&#39;);&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  23:  &lt;/span&gt;            this.newSkillDescription.val(&#39;&#39;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  24:  &lt;/span&gt;        },&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Here since we already defined markup for the application we are retrieving the &lt;b&gt;DOM &lt;/b&gt;element using &lt;b&gt;jQuery &lt;/b&gt;and using later in our view.&lt;br /&gt;
Next we are binding to &lt;b&gt;addSkill &lt;/b&gt;button click event by adding &lt;b&gt;addSkill &lt;/b&gt;method as subscriber.&lt;br /&gt;
&lt;br /&gt;
At last in &lt;b&gt;addSkill &lt;/b&gt;we are calling &lt;b&gt;skillList.create&lt;/b&gt; method which is the Backbone.js method that creates the item in the collection. &lt;br /&gt;
&lt;br /&gt;
This is the most interesting part, because underneath it&#39;s calling &lt;b&gt;Backbone.js&lt;/b&gt; &lt;b&gt;&lt;a href=&quot;http://backbonejs.org/#Model-sync&quot;&gt;sync &lt;/a&gt;&lt;/b&gt;method which is syncing the state of the application with the &lt;b&gt;REST &lt;/b&gt;service (in fact by calling the &lt;b&gt;PUT &lt;/b&gt;method).&lt;br /&gt;
&lt;br /&gt;
Now when views, models and markup is defined we only need to write several lines of code to run our backbone.js app:&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;$(function () {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    skillsList = new ItemSet();&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;    skillsList.fetch({ data: { page: &#39;no&#39; } });&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;    var app = new AppView({ model: skillsList });&lt;/pre&gt;
&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;    app.render();&lt;/pre&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;});&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
In this code we are defining &lt;b&gt;skillList &lt;/b&gt;variable, then &lt;a href=&quot;http://backbonejs.org/#Model-fetch&quot;&gt;fetching &lt;/a&gt;it&#39;s data from the server, and at last create &lt;b&gt;AppView &lt;/b&gt;with it as a model.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
Vuola!&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.seriouscat.com/serious_cat_is_serious.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Vuola!&quot; border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://www.seriouscat.com/serious_cat_is_serious.jpg&quot; title=&quot;&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we have a backbone.js app which sync with our WebAPI webservice.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Sources:&amp;nbsp;&lt;/h3&gt;
Sources could be downloaded from GitHub:&lt;br /&gt;
&lt;a href=&quot;https://github.com/JackTheHack/Samples/tree/master/BackboneAndWebApiSample&quot;&gt;https://github.com/JackTheHack/Samples/tree/master/BackboneAndWebApiSample&lt;/a&gt;&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Useful books:&lt;/h3&gt;
&lt;div&gt;
Here you can find some useful books on Backbone.js and WebAPI&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/1430242361/ref=as_li_tf_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1430242361&amp;amp;linkCode=as2&amp;amp;tag=mrkodyblogspo-20&quot;&gt;Pro ASP.NET MVC 4 by Adam Freeman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/1449328253/ref=as_li_tf_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1449328253&amp;amp;linkCode=as2&amp;amp;tag=mrkodyblogspo-20&quot;&gt;Developing Backbone.js Applications&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ir-na.amazon-adsystem.com/e/ir?t=mrkodyblogspo-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1449328253&quot; style=&quot;border: none !important; margin: 0px !important;&quot; width=&quot;1&quot; /&gt;\&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/1403952931410075923/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2013/10/backbonejs-aspnet-webapi-love.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/1403952931410075923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/1403952931410075923'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2013/10/backbonejs-aspnet-webapi-love.html' title='Backbone.JS + ASP.NET WebAPI'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-5753153903981016293</id><published>2013-03-16T21:36:00.004+02:00</published><updated>2013-03-17T10:07:35.742+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><title type='text'>6 interesting facts about garbage collection.</title><content type='html'>
&lt;h3 style=&quot;text-align: left;&quot;&gt;
1. Don&#39;t create big objects with short lifetime&lt;/h3&gt;
&lt;div&gt;
Any object in CLR that is more than 85 000 KB in size are stored in the special heap for big objects. Also they are marked as 2nd generation objects from the start. Creating big objects with small lifetime is bad practice. Why? Garbage collector will need to collect 2nd generation objects more often, and this could lead to&amp;nbsp;performance&amp;nbsp;issues.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
&lt;b&gt;2. When GC collects garbage it pauses all managed threads&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
When garbage collection starts CLR hijacks all managed threads and pauses them. But in fact it doesn&#39;t affect coding, so... nevermind :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
3. You can predict OutOfMemoryException&amp;nbsp;&lt;/h3&gt;
&lt;div&gt;
In some cases if application consume a lot of resources there is a&amp;nbsp;probability&amp;nbsp;of OutOfMemoryException. Not good, yeah? But... you can predict for operations with big memory consumption by using MemoryFailPoint.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Usage example:&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp;using(MemoryFailPoint mfp = new MemoryFailPoint(1500))&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp;{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; //Run code which uses lots of memory.&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
catch(InsufficientMemoryExpection)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Console.WriteLine(&quot;Not enough memory.&quot;);&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But be aware. Even if MemoryFailPoint didn&#39;t thrown exception and memory is reserved it&#39;s physically still not allocated. So you only increased a probability of successful memory allocation.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
4. Garbage collection takes less than 1ms in zero generation&lt;/h3&gt;
&lt;div&gt;
Yes, it&#39;s so fast.&amp;nbsp;&lt;/div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
5. Developers could create immortal objects&amp;nbsp;&lt;/h3&gt;
&lt;div&gt;
Of course it&#39;s only just for fun and&amp;nbsp;definitely&amp;nbsp;bad practice, but these objects will never die (read as not collected by GC).&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
6. You can manage unmanaged resources.&lt;/h3&gt;
&lt;div&gt;
Sometimes a small managed object could contain a lot of unmanaged resources. For these cases there are 2 methods in GC class.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- AddMemoryPressure&lt;/div&gt;
&lt;div&gt;
- RemoveMemoryPressure&lt;br /&gt;
&lt;br /&gt;
Using them you can hint how much unmanaged memory is used by object and this will affect when garbage collection will be started.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Want to know more?&amp;nbsp;&lt;/h3&gt;
You can find more interesting facts about garbage collection in Richter&#39;s &lt;a href=&quot;http://www.amazon.com/gp/product/0735667454/ref=as_li_tf_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735667454&amp;amp;linkCode=as2&amp;amp;tag=mrkodyblogspo-20&quot;&gt;CLR via C#&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/5753153903981016293/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2013/03/6-interesting-facts-about-garbage.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/5753153903981016293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/5753153903981016293'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2013/03/6-interesting-facts-about-garbage.html' title='6 interesting facts about garbage collection.'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-6149608084918679257</id><published>2013-02-10T16:36:00.001+02:00</published><updated>2013-03-11T10:31:28.237+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="sitecore"/><title type='text'>Мой год c Sitecore CMS</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Более года я не писал в блог не одного поста. В основном из-за отсутствия времени или желания, или просто от банальной лени.&lt;br /&gt;
&lt;br /&gt;
В этом посте я хочу написать о Sitecore CMS. Это та система с которой я работал более года, по которой получил сертификацию и по которой теперь думаю могу составить осмысленный обзор.&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;О Sitecore&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
Sitecore(www.sitecore.net) - датская компания с главным офисом в Копенгагене и центром разработке в Украине (Днепропетровск).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Sitecore занимается разработкой своего продукта - Sitecore CMS, а также сопутствующих к нему расширений:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Sitecore Intranet Portal - решение для созданий Интранет-вебсайтов&lt;/li&gt;
&lt;li&gt;Sitecore Azure - расширение для публикации Sitecore CMS в облако&lt;/li&gt;
&lt;li&gt;Web Forms For Marketeers - упрощает создание опросников и форм в Sitecore CMS&lt;/li&gt;
&lt;li&gt;Sharepoint Integration - расширение для интеграции с Microsoft Sharepoint&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Sitecore CMS&lt;/h2&gt;
&lt;div&gt;
Sitecore CMS основывается на следующих технологиях:&lt;/div&gt;
&lt;div&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;ASP.NET&lt;/li&gt;
&lt;li&gt;MSSQL - используется для хранения данных и может быть заменено MySQL/Oracle БД.&lt;/li&gt;
&lt;li&gt;Lucene - используется для поиска в CMS&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;b&gt;Хранение контента в CMS&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Данные в Sitecore представлены в иерархическом виде.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQn8w20BQMGgg5_-NUrwXaQKUk7K-zM_RchlLGRKOJbRQs1R3AI4esq7hUUgiXL_Cj80f8Xwg9TD0JEI0RvsxVjfMaK_skLnf-kELr7zWwFvxjcjkow3s7ipBCk6uWM-fceOJJL3Z-7VsB/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQn8w20BQMGgg5_-NUrwXaQKUk7K-zM_RchlLGRKOJbRQs1R3AI4esq7hUUgiXL_Cj80f8Xwg9TD0JEI0RvsxVjfMaK_skLnf-kELr7zWwFvxjcjkow3s7ipBCk6uWM-fceOJJL3Z-7VsB/s320/Capture.PNG&quot; width=&quot;178&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Каждый элемент дерева (Item) основан на шаблоне, который описывается списком полей.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbDBtGpT_p9LGBgiRkmvbVsXZDwh1p_3bgK2KlYm4kL8gxnGioxc09jGeKWFgyjU7lBn1LmqkjpQyxiNBmd37Wltb_h4Fu7hdTeR2pUa8yz5kbuOV-OzADCPzDIk1Ah3XqlCwe3vo83BU3/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;146&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbDBtGpT_p9LGBgiRkmvbVsXZDwh1p_3bgK2KlYm4kL8gxnGioxc09jGeKWFgyjU7lBn1LmqkjpQyxiNBmd37Wltb_h4Fu7hdTeR2pUa8yz5kbuOV-OzADCPzDIk1Ah3XqlCwe3vo83BU3/s320/Capture.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Поле описывается именем и типом поля. Sitecore CMS включает большой список полей которые покрывает все базовые типы. К слову можно с лёгкостью добавлять собственные типы для полей.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
На каждый элемент накладывается представление, которое может быть как:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;ASP.NET User Control-ом&lt;/li&gt;
&lt;li&gt;XSLT&lt;/li&gt;
&lt;li&gt;WebControl-ом&lt;/li&gt;
&lt;li&gt;или даже ASP.NET MVC view, поддержка которого добавлена в последнюю версию CMS&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;Backend&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
После доступа в админку Sitecore многих разработчиков посетит приятное дежа-вю. :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitGEJc_BLaJCWSLFAG4yl89bpR8Ss120HlH0C1L3yM-cwJ_-pmShyphenhyphenXElRhQIAWM8dprMSwknhH0Vfgkjxi_6SIElToFgZNCUX-DScMnnfzaKedL3fMpz5djuC-BMwqwrDeWxN5-zQxkiLU/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;288&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitGEJc_BLaJCWSLFAG4yl89bpR8Ss120HlH0C1L3yM-cwJ_-pmShyphenhyphenXElRhQIAWM8dprMSwknhH0Vfgkjxi_6SIElToFgZNCUX-DScMnnfzaKedL3fMpz5djuC-BMwqwrDeWxN5-zQxkiLU/s640/Capture.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Иногда складывается впечатление что работаешь в RDP. Админ-панель содержит множество полезных утилит:&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Редактор пользователей&lt;/li&gt;
&lt;li&gt;Редактор разрешений доступа к контенту&lt;/li&gt;
&lt;li&gt;Редактор контента&lt;/li&gt;
&lt;li&gt;Инструменты разработчика&lt;/li&gt;
&lt;li&gt;И др.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Кроме того разработчик может&amp;nbsp;создавать&amp;nbsp;свои расширения и утилиты к CMS с помощью Package Designer-а.&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Наряду с обычной админкой Sitecore включает Page Editor который позволяет пользователям редактировать контент прямо на сайте.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Производительность&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
В основном работа с данными в Sitecore идёт не через БД, а через API.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Отсюда возникает закономерный вопрос. Насколько он быстрый?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Не вдаваясь глубоко в детали скажу что Sitecore под капотом кеширует и индексирует данные таким образом что издержки сведены к минимуму.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
http://adeneys.wordpress.com/2010/09/17/sitecore-api-vs-sql/ - Здесь можно посмотреть очень интересное сравнение по скорости импорта данных в Sitecore по сравнению с SQL.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Расширяемость и поддержка IDE&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Почти любой компонент системы можно расширить или подменить. Большинство базовых типов системы определены в config-файлах и их можно подменить своими.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Кроме того расширение Visual Studio Sitecore Rocks упрощает создание Sitecore вебсайтов.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Выводы&lt;/h2&gt;
&lt;div&gt;
Для меня&amp;nbsp;знакомство&amp;nbsp;с Sitecore CMS было крайне приятным.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Из плюсов:&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Разработка очень схожа с разработкой ASP.NET приложения&lt;/li&gt;
&lt;li&gt;Простое в изучении API и обилие документации в Sitecore Developer Network&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Из минусов:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Множество техник разработки на укладываются в процесс написания вебсайта на Sitecore (юнит-тестирование, CI, и др.)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/6149608084918679257/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2013/02/c-sitecore-cms.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/6149608084918679257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/6149608084918679257'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2013/02/c-sitecore-cms.html' title='Мой год c Sitecore CMS'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQn8w20BQMGgg5_-NUrwXaQKUk7K-zM_RchlLGRKOJbRQs1R3AI4esq7hUUgiXL_Cj80f8Xwg9TD0JEI0RvsxVjfMaK_skLnf-kELr7zWwFvxjcjkow3s7ipBCk6uWM-fceOJJL3Z-7VsB/s72-c/Capture.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-2619510728189723400</id><published>2011-09-04T18:10:00.001+03:00</published><updated>2013-02-10T20:22:21.263+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mongodb"/><title type='text'>MongoDB + NoRM - первые впечатления</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Решил сегодня разобраться с MongoDB.&lt;br /&gt;
&lt;br /&gt;
Т.к. ставить локально сервер не хотелось начал издалека. Нашёл бесплатный сервер MongoDB - MongoHQ. Хостинг обладает вполне адекватными ценовыми планами(16 МБ данных отдаётся в полном распоряжение разработчику бесплатно).&lt;br /&gt;
&lt;br /&gt;
Итого после регистрации я получил полнофункциональный instance MongoDB.&lt;br /&gt;
&lt;br /&gt;
Начал с поиска удобных GUI для просмотра БД. Вначале скачал MongoExplorer, однако тот наотрез отказался подключатся к удалённому серверу, поэтому выбор пал на MongoVUE. Последний подключился вполне успешно.&lt;br /&gt;
&lt;br /&gt;
Далее я следуя советам статьи:&lt;br /&gt;
&lt;a href=&quot;http://weblogs.asp.net/shijuvarghese/archive/2010/04/16/nosql-with-mongodb-norm-and-asp-net-mvc.aspx&quot;&gt;http://weblogs.asp.net/shijuvarghese/archive/2010/04/16/nosql-with-mongodb-norm-and-asp-net-mvc.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Скачал NoRM, добавил в солюшн. Впрочем это было необязательно, т.к. в &amp;nbsp;NuGet уже есть пакет с последней версией NoRM.&lt;br /&gt;
&lt;br /&gt;
Итак, написав скромненький сайтик я решил поэксперементировать с Mongo, и какое же было моё разочарование, когда NoRM не захотел подключатся к MongoHQ. Вначале я подумал что я неправильно составил класс. Возможно использовал запрещённые типы, но на самом деле всё оказалось гораздо проще.&lt;br /&gt;
&lt;br /&gt;
Главной причиной проблем была версия Монго. На сервере MongoHQ стояла 1.8.1,а последняя &amp;nbsp;(и очевидно единственно поддерживаемая) есть 1.8.3, в результате чего операции добавления не работали. Поэтому как только я поставил сервер локально всё магическим образом заработало и обьекты были добавлены в БД.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Итого:&lt;/b&gt;&lt;br /&gt;
Плюсы:&lt;br /&gt;
- Классы автоматически сериализуются в JSON &amp;nbsp;и добавляются в БД. Писать слой доступа к данным крайне удобно&lt;br /&gt;
- БД обладает вполне достойным фреймворком для доступа из .NET (NoRM)&lt;br /&gt;
&lt;br /&gt;
Минусы:&lt;br /&gt;
- Всё таки невозможность поддержки 1.8.1 мне непонятна.&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/2619510728189723400/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2011/09/mongodb-norm.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/2619510728189723400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/2619510728189723400'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2011/09/mongodb-norm.html' title='MongoDB + NoRM - первые впечатления'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-6136829493653228994</id><published>2011-08-12T21:21:00.000+03:00</published><updated>2011-08-12T21:21:49.121+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cycloid"/><category scheme="http://www.blogger.com/atom/ns#" term="gamedev"/><category scheme="http://www.blogger.com/atom/ns#" term="xbox"/><category scheme="http://www.blogger.com/atom/ns#" term="XNA"/><title type='text'>Cycloid release</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Не прошло и года как игра дошла до своего финального состояние - а именно нахождения в Xbox Marketplace.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://marketplace.xbox.com/en-GB/Product/Cycloid/66acd000-77fe-1000-9115-d80258550917&quot;&gt;http://marketplace.xbox.com/en-GB/Product/Cycloid/66acd000-77fe-1000-9115-d80258550917&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Случилось это ровно 11 августа - какраз на мой ДР. Вот такой подарок.&lt;br /&gt;
&lt;br /&gt;
Теперь остаётся ждать результатов продаж и надеятся что они окупят вложенные усилия :)&lt;br /&gt;
&lt;br /&gt;
PS: Счастливые владельцы Xbox могут бесплатно скачать триальную версию, а если понравится я с удовольствием поделюсь ключиком на полную версию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/6136829493653228994/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2011/08/cycloid-release.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/6136829493653228994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/6136829493653228994'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2011/08/cycloid-release.html' title='Cycloid release'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-3515180578459925320</id><published>2011-07-04T23:52:00.000+03:00</published><updated>2011-07-04T23:52:32.779+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="fun"/><title type='text'>Осторожно, Фиддлер</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Сегодня наткнулся на неприятную проблему - не работал ТФС, Online Services Sign In, что конечно не могло не расстраивать.&lt;br /&gt;
&lt;br /&gt;
2 перезагрузки компьютера не привели к результату.&lt;br /&gt;
&lt;br /&gt;
Вначале я подумал что всему виной смена пароля утром, но потом по подсказке коллеги узнал что всему виной ни кто иной как Fiddler. Который по непонятной причине не дружит с TFS, Online Services Sign In &amp;nbsp;и даже после закрытия не даёт возможности пользоваться благами цивилизации.&lt;br /&gt;
&lt;br /&gt;
Поэтому всё что оставалось это открыть фиддлер и снять флажок с Capture Traffic. После чего магическим образом всё заработало.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/3515180578459925320/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2011/07/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/3515180578459925320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/3515180578459925320'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2011/07/blog-post.html' title='Осторожно, Фиддлер'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-646479647628688076</id><published>2011-03-27T19:11:00.001+03:00</published><updated>2011-03-27T19:11:47.724+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><category scheme="http://www.blogger.com/atom/ns#" term="MSI"/><category scheme="http://www.blogger.com/atom/ns#" term="Wix"/><title type='text'>Создание msi инсталлятора с использованием Wix</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;В этом посте я хотел бы описать свой опыт использования инструментария Wix для создания инсталляционных пакетов.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Wix &lt;/b&gt;- это библиотека которая упрощает создание MSI пакетов. Wix интегрируется в Visual Studio и содержит несколько типов проектов. Я не хочу полностью описывать процесс создания инсталляционного пакета, а кратко опишу сложности с которыми я столкнулся.&lt;br /&gt;
&lt;br /&gt;
Полный туториал для изучения Wix можно легко найти например здесь: http://www.tramontana.co.hu/wix/&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Deploy Database project output SQL script&lt;/b&gt;&lt;br /&gt;
Несмотря на то что что Wix содержит готовое расширение для установки БД в задаче пришлось делать по своему. Причиной тому послужило использование Visual Studio Database Project.&lt;br /&gt;
&lt;br /&gt;
Итак сам процесс занял следующие шаги:&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;1.Настройка Database Project&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;По умолчанию Database Project самостоятельно задаёт переменную БД, в  результате чего даже если передать название БД в параметры sqlcmd в  скрипте она будет переопределена. Для того чтобы это предотвратить  необходимо задать в настройках Database Project  (Database.sqlDeployment) CommentOutSetVarDeclarations в false.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;u&gt;2.Создание CustomAction-а&lt;/u&gt;&lt;/div&gt;&lt;br /&gt;
Database project генерирует sql скрипт, для выполнения которого необходимо пользоваться утилитой sqlcmd. Поэтому для установки БД&amp;nbsp; необходимо вызывать sqlcmd из CustomAction-а, передавая в качестве параметра имя создаваемой БД.&lt;br /&gt;
&lt;br /&gt;
Сам CustomAction всего лишь запускает процесс sqlcmd.exe через Process.Start. Аргументы получаются через CustomActionData.&lt;br /&gt;
&lt;br /&gt;
В качестве аргументов задаются параметры подключения к SQL Server, а также имя БД. &lt;br /&gt;
Более полную информация о параметрах sqlcmd можно найти на http://msdn.microsoft.com/en-us/library/ms162773.aspx&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;3.Использование CustomAction-а&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
Добавим компонент который будет содержат сгенерированный SQL скрипт. Для того чтобы скрипт автоматически подтягивался из Database Project-а последний добавим в References.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;SomeDatabase.sql&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;DiskId&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;1&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Guid&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;E1B7D00A-D6D8-4694-B4E0-E9AF67877119&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;File&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;SomeDatabase.sql&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Source&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;$(var.SomeDatabase.TargetDir)SomeDatabase.sql&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;KeyPath&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;yes&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;
Для того чтобы использовать созданный CustomAction добавляем в References в Setup Project, после чего обьявляем CustomAction в коде Wix&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Binary&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;DeploySQLDll&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;SourceFile&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;$(var.DeploySQL.TargetDir)DeploySQL.CA.dll&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;CustomAction&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;action&lt;/span&gt;&quot;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;BinaryKey&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;DeploySQLDll&lt;/span&gt;&quot;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;DllEntry&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;Deploy&lt;/span&gt;&quot;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Return&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;ignore&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Execute&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;deferred&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;CustomAction&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;SetDeploySQLArguments&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Return&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;check&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Property&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;action&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;-U&amp;nbsp;[SQLLOGIN]&amp;nbsp;-P&amp;nbsp;[SQLPASSWORD]&amp;nbsp;-S&amp;nbsp;[SQLSERVER]&amp;nbsp;-i&amp;nbsp;&quot;[#SomeDatabase.sql]&quot;&amp;nbsp;-v DatabaseName=&quot;[DATABASENAME]&quot;&amp;nbsp;&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt; &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;
Естественно переменные SQLLOGIN, SQLPASSWORD, SQLSERVER должны быть обьявлены ранее в файле проекта Wix.&lt;br /&gt;
&lt;br /&gt;
Последний штрих - вызов CustomAction в InstallSequence&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Custom&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Action&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;SetDeploySQLArguments&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;After&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;InstallFiles&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;NOT&amp;nbsp;Installed&lt;span style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Custom&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Custom&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Action&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;action&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;After&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;SetDeploySQLArguments&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;NOT&amp;nbsp;Installed&lt;span style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Custom&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;NOT Installed говорит о том, что данные действия будут запущенны только при установке программы. В случае удаления действия будут пропущены. Если же после удаления программы необходимо удалить БД, можно пользоваться уже созданным CustomAction-ом, но вместа скрипта создания БД выполнять скрипт удаления. Например приведённый ниже:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-attachment: scroll; background-clip: initial; background-color: white; background-image: none; background-origin: initial; background-position: 0% 0%; background-repeat: repeat repeat; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;EXEC&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: teal;&quot;&gt;msdb&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;dbo&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;sp_delete_database_backuphistory&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;@database_name&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: grey;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;N&#39;$(DatabaseName)&#39;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;GO&lt;/span&gt;
 
&lt;span style=&quot;color: blue;&quot;&gt;USE&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: teal;&quot;&gt;[master]&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;GO&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;ALTER&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;DATABASE&lt;/span&gt;&amp;nbsp;$&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;DatabaseName&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;SET&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;SINGLE_USER&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;WITH&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;ROLLBACK&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;IMMEDIATE&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;GO&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;USE&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: teal;&quot;&gt;[master]&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;GO&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;DROP&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;DATABASE&lt;/span&gt;&amp;nbsp;$&lt;span style=&quot;color: grey;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;DatabaseName&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;GO&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;2. Сохранить значение Property для использования во время Uninstall-а&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Допустим в процессе установки пользователь ввёл настройки подключения к БД для её установки,а во время удаления программы необходимо ими воспользоваться, чтобы БД удалить. К сожалению MSI не сохраняет данные значения, поэтому это придётся сделать самостоятельно.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Для этого необходимо:&lt;/u&gt;&lt;br /&gt;
1. Добавить сохранение свойства в реестр при установке:&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;RegistryValue&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Root&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;HKLM&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Key&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;SOFTWARE\OurApp\SetupUninstall&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;SQLSERVER&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;[SQLSERVER]&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;
2. При старте установщика искать в реестре значение свойства:&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Property&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;SQLSERVER&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;localhost&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;RegistrySearch&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;RememberProperty1&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Root&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;HKLM&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Key&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;SOFTWARE\OurApp\SetupUninstall&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;SQLSERVER&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;raw&lt;/span&gt;&#39;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Property&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;/pre&gt;&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;/pre&gt;&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;/pre&gt;Теперь установщик будет сохранять введённые параметры установки. Не самый чистый способ, т.к. мусорит реестр, однако быстрый и надёжный.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. Deploy Web-Site&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Т.к. Web-Site добавить в Reference нельзя ( в отличии от Web-Application),&amp;nbsp; и к тому же он обычно содержит много файлов удобнее пользоваться входящий в комплект Wix инструментом heat. Данная тулза позволяет собирать из папки все файлы и организовать их как Wix Fragment File.&lt;br /&gt;
&lt;br /&gt;
В моём случае тулза запускалась чтобы собрать сайт в файл фрагмента и далее добавить файлы в проект установщика. Для автоматической сборки в Pre-Build event добавлено событие:&lt;br /&gt;
&lt;br /&gt;
&quot;$(WIX)bin\heat.exe&quot; dir &quot;$(SolutionDir)\ABC\UI&quot; -gg -ke -template Fragment -out &quot;$(ProjectDir)UI.wxs&quot; -sfrag -srd -sreg -dr UIRef -cg UI -wixvar -var&amp;nbsp; wix.UI&lt;br /&gt;
&lt;br /&gt;
$(SolutionDir)\ABC\UI - путь к сайту&lt;br /&gt;
&lt;br /&gt;
Файл с фрагментом создаётся в файле UI.wxs, для и&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;спользования его в проекте Wix следует&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;добавить файл в проект, а в главный Wix файл продукта ссылку на со&lt;/span&gt;зданную директорию&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Directory&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;UIRef&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Directory&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;/pre&gt;&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;/pre&gt;Кроме того необходимо определить Wix-переменную&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif; font-size: x-small;&quot;&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;WixVariable&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Id&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;UI&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;$(var.SolutionDir)\ABC\UI&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif; font-size: x-small;&quot;&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-attachment: scroll; background-clip: initial; background-color: white; background-image: none; background-origin: initial; background-position: 0% 0%; background-repeat: repeat repeat; color: black;&quot;&gt;&lt;span style=&quot;color: blue; font-family: Arial, Helvetica, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/pre&gt;Как можно заметить Id директории задаётся в параметрах heat.exe. Более подробную информацию о параметрах&lt;br /&gt;
heat можно найти на http://wix.sourceforge.net/manual-wix3/heat.htm&lt;br /&gt;
&lt;br /&gt;
Для создания веб-сайта в IIS можно воспользоваться готовыми расширениями Wix (WebApplication, WebDirectory и др.)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt; Плюсы:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Легко интегрируется в Visual Studio, проект установщика хранится в TFS&lt;/li&gt;
&lt;li&gt;Возможна интеграция в MSBuild. Удобно для continuous integration.&lt;/li&gt;
&lt;li&gt;Имеет множество возможностей для конфигурации&lt;/li&gt;
&lt;li&gt;Open-source&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Минусы:&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Процесс написания инсталляционного пакета занимает больше времени чем для автоматических утилит ( InnoSetup например).&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;В целом Wix очень удобен для инсталляции приложений, требующих сложной конфигурации и настройки ( deploy DB, Website, etc.).&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/646479647628688076/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2011/03/msi-wix.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/646479647628688076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/646479647628688076'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2011/03/msi-wix.html' title='Создание msi инсталлятора с использованием Wix'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-61052474252542991</id><published>2010-10-09T14:41:00.001+03:00</published><updated>2010-10-09T14:53:53.572+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="XNA"/><category scheme="http://www.blogger.com/atom/ns#" term="физика"/><title type='text'>2D Физика для игр - Separate Axis Theorem - Вектор сдвига</title><content type='html'>&lt;i&gt;Как и обещал продолжаю перевод серии статей про игровую физику. Сегодня я напишу как получить вектор сдвига и разьединить 2 столкнувшихся многоугольника.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Как было точно подмечено анонимным комментатором метод отделяющей оси работает только для выпуклых многоугольников.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
&lt;b&gt;Итак, дано: &lt;/b&gt;2 столкнувшихся многоугольника&lt;br /&gt;
&lt;b&gt;Задача: &lt;/b&gt;Разьединить 2 многоугольника, причём минимальным сдвигом.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
В прошлом посте я писал как узнать пересекаются ли 2 многоугольника, это полезная информация, однако мы можем узнать больше. В случае если 2 многоугольника пересекаются хотелось бы сдвинуть их от друг друга, чтобы они не пересекались.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Для решения данной задачи может быть применён описанный ранее метод, только немного доработанный. Мы будем возвращать глубину проникновения и вектор, указывающий в какую сторону следует сдвинуть полигоны, чтобы они перестали пересекаться. Подобная комбинация называется MTD ( Minimum Translation Distance ), или минимальное расстояние сдвига.&lt;br /&gt;
&lt;br /&gt;
Вычислять MTD можно в процессе вычисления отделяющей оси.&lt;br /&gt;
&lt;br /&gt;
Когда 2 обьекта пересекаются, мы знаем интервал, вычисленный на каждой отделяющей оси для каждого обьекта. Интервал полученный пересечением двух интервалов есть вектор сдвига, который следует приложить к обьектам, чтобы их проэкции перестали пересекаться по отделяющей оси.&lt;br /&gt;
&lt;br /&gt;
&lt;span id=&quot;goog_72194188&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_72194189&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoDUU9aRaGYsYFpFsDT7TBSrHovoFnnQnjojC18TwgltIlB1GzAU2-H0PL0b3BT2ycpGhJv6ab1tJu6b7beBVt-1Hq13SRKeuZYubldftYA7PgeHyeJuBAVm3mZeDi-CsVXBhfuo_iyU8S/s1600/image002a.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;265&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoDUU9aRaGYsYFpFsDT7TBSrHovoFnnQnjojC18TwgltIlB1GzAU2-H0PL0b3BT2ycpGhJv6ab1tJu6b7beBVt-1Hq13SRKeuZYubldftYA7PgeHyeJuBAVm3mZeDi-CsVXBhfuo_iyU8S/s320/image002a.gif&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, что можно сдвигать обьекты вектором сдвига по любой оси, но следует выбрать ту ось, на которой пересечение проекций обьектов минимально. Найденный вектор сдвига и является минимальным расстоянием сдвига ( MTD ).&lt;br /&gt;
&lt;br /&gt;
Получив вектор сдвига мы можем легко отделить 2 обьекта:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;A.position+=MTD*0.5f;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;B.position-=MTD*0.5f;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Код проверки пересечения с нахождением MTD:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// Проверяет на пересечение 2-х полигонов&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;a&quot;&amp;gt;Первый многоугольник&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;b&quot;&amp;gt;Второй многоугольник&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; Intersect(Polygon a, Polygon b,&lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; Vector2 pushV)
        {
            pushV = Vector2.Zero;
            &lt;span class=&quot;rem&quot;&gt;//Если один из многоугольников пустой - то не пересекаются&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (a == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt; || b == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;)
                &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;

            Vector2 pushAxis=Vector2.Zero;
            &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; mindepth = &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt;.MaxValue;

            &lt;span class=&quot;rem&quot;&gt;//Вычисляем отступ между многоугольниками для приведения к центру координат&lt;/span&gt;
            Vector2 offset = a.Offset - b.Offset;

            &lt;span class=&quot;rem&quot;&gt;//В данной переменной храним ось на которую будет проецировать&lt;/span&gt;
            Vector2 xAxis = Vector2.Zero ;
            &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; depth;

            &lt;span class=&quot;rem&quot;&gt;//Проходим по всем сторонам первого многоугольника и используем их как ось&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; j = a.VertexCount-1,i=0; i &amp;lt; a.VertexCount;j=i,i++)
            {
                &lt;span class=&quot;rem&quot;&gt;//Вычисляем вектор стороны многоугольника&lt;/span&gt;
                Vector2 E = Vector2.Subtract(a[j], a[i]);
                &lt;span class=&quot;rem&quot;&gt;//Вычисляем вектор нормали к стороне многоугольника&lt;/span&gt;
                xAxis = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Vector2(-E.Y, E.X);

                &lt;span class=&quot;rem&quot;&gt;//Если проекции многоугольников не пересекаются - то по теореме многоугольники не пересекаются&lt;/span&gt;
                &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (!IntervalIntersect(a, b, &lt;span class=&quot;kwrd&quot;&gt;ref&lt;/span&gt; xAxis, offset, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; depth))
                    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;
                &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;
                {
                    &lt;span class=&quot;rem&quot;&gt;//Находим ось по которой будем брать ось сдвига как ось минимального сдвига&lt;/span&gt;
                    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (depth &amp;lt; mindepth)
                    {
                        pushAxis = xAxis;
                        mindepth = depth;
                    }
                }
            }

            &lt;span class=&quot;rem&quot;&gt;//Если пока не нашли нужной оси - проходим по всем сторонам второго многоугольника&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; j = b.VertexCount - 1, i = 0; i &amp;lt; b.VertexCount; j = i, i++)
            {
                &lt;span class=&quot;rem&quot;&gt;//Вычисляем вектор стороны и нормаль&lt;/span&gt;
                Vector2 E = Vector2.Subtract(b[j], b[i]);
                xAxis = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Vector2(-E.Y, E.X); &lt;span class=&quot;rem&quot;&gt;//Getting normal vector&lt;/span&gt;

                &lt;span class=&quot;rem&quot;&gt;//И проверяем на пересечение проекций&lt;/span&gt;
                &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (!IntervalIntersect(a, b, &lt;span class=&quot;kwrd&quot;&gt;ref&lt;/span&gt; xAxis, offset, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; depth))
                    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;
                &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;
                {
                        &lt;span class=&quot;rem&quot;&gt;//Ищем ось сдвига&lt;/span&gt;
                        &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (depth &amp;lt; mindepth)
                        {
                            pushAxis = xAxis;
                            mindepth = depth;
                        }
                }
            }

            &lt;span class=&quot;rem&quot;&gt;//Вычисляем вектор сдвига&lt;/span&gt;
            pushV = pushAxis;
            mindepth /= pushV.Length();

            &lt;span class=&quot;rem&quot;&gt;//Нормируем вектор сдвига и умножаем на длину пересечения&lt;/span&gt;
            pushV.Normalize();
            pushV *= (mindepth*1.01f);

            &lt;span class=&quot;rem&quot;&gt;//Если вектор сдвига указывает в неправильно направлении - отражаем его&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (Vector2.Dot(pushV, offset) &amp;lt; 0)
                pushV = Vector2.Negate(pushV);

            &lt;span class=&quot;rem&quot;&gt;//Если ни одна из осей не нашла не пересекающихся проекций, то очевидно по теореме&lt;/span&gt;
            &lt;span class=&quot;rem&quot;&gt;//многоугольники пересекаются - возвращаем тру.&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;;
        }


        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// Проверяет на пересечение проекций многоугольников&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;a&quot;&amp;gt;Первый многоугольник&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;b&quot;&amp;gt;Второй многоугольник&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;xAxis&quot;&amp;gt;Ось проекции&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;offset&quot;&amp;gt;Отступ&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; IntervalIntersect(Polygon a, Polygon b,&lt;span class=&quot;kwrd&quot;&gt;ref&lt;/span&gt; Vector2 xAxis, Vector2 offset,&lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; depth)
        {
            depth = 0;
            
            &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; min0, max0, min1, max1; &lt;span class=&quot;rem&quot;&gt;//проекции на ось первого и второго многоугольника&lt;/span&gt;
            GetInterval(a, xAxis, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; min0, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; max0);&lt;span class=&quot;rem&quot;&gt;//получаем первую проекцию&lt;/span&gt;
            GetInterval(b, xAxis, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; min1, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; max1);&lt;span class=&quot;rem&quot;&gt;//получаем вторую проекцию&lt;/span&gt;

  

            &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; h = Vector2.Dot(offset, xAxis); &lt;span class=&quot;rem&quot;&gt;//получаем проекцию отступа &lt;/span&gt;
            min0 += h; max0 += h; &lt;span class=&quot;rem&quot;&gt;// и добавляем её к первому многоугольнику&lt;/span&gt;


            &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; d0 = min0 - max1; 
            &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; d1 = min1 - max0;

            &lt;span class=&quot;rem&quot;&gt;//если проекции не пересекаются то минимум первого больше максимума второго или&lt;/span&gt;
            &lt;span class=&quot;rem&quot;&gt;//минимум второго больше максимума первого.&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (d0 &amp;gt; 0 || d1 &amp;gt; 0)
                &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;
            &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;
            {
                depth = Math.Min(Math.Abs(d0), Math.Abs(d1));
                Trace.WriteLine(depth);
                &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;;
            }
        }&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;b&gt;Исходные файлы:&lt;/b&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;b&gt;
&lt;/b&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;a href=&quot;https://docs.google.com/leaf?id=0B6h7yaggRA4pOWFhYmE0MTgtYTgxZC00MGViLTgxNmQtZjU4NmE2YWRjMTRl&amp;amp;hl=en&quot;&gt;https://docs.google.com/leaf?id=0B6h7yaggRA4pOWFhYmE0MTgtYTgxZC00MGViLTgxNmQtZjU4NmE2YWRjMTRl&amp;amp;hl=en&lt;/a&gt;

&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/61052474252542991/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/10/2d-separate-axis-theorem_09.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/61052474252542991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/61052474252542991'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/10/2d-separate-axis-theorem_09.html' title='2D Физика для игр - Separate Axis Theorem - Вектор сдвига'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoDUU9aRaGYsYFpFsDT7TBSrHovoFnnQnjojC18TwgltIlB1GzAU2-H0PL0b3BT2ycpGhJv6ab1tJu6b7beBVt-1Hq13SRKeuZYubldftYA7PgeHyeJuBAVm3mZeDi-CsVXBhfuo_iyU8S/s72-c/image002a.gif" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-7283743872119795959</id><published>2010-10-01T21:31:00.003+03:00</published><updated>2010-10-09T14:54:46.556+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gamedev"/><category scheme="http://www.blogger.com/atom/ns#" term="XNA"/><category scheme="http://www.blogger.com/atom/ns#" term="физика"/><title type='text'>2D Физика для игр - Separate Axis Theorem</title><content type='html'>&lt;i&gt;Нашёл в интернете очень интересную подборку статей и кода, которая описывает написание физики для игр. Я подумал что было бы полезно перевести серию тех статей и портировать код на XNA. Как для себя, так и для интересующихся игровой физикой.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Первая статья будет посвящена &lt;b&gt;Separete Axis Theorem&lt;/b&gt;&amp;nbsp;( &lt;b&gt;теорема о разделяющей оси&lt;/b&gt; )- методу проверки столкновений между многоугольниками. Данный метод является наиболее быстрым на данный момент и используется повсеместно во всех 2D физических библиотеках.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Итак, задача&lt;/b&gt;: Нам даны два многугольника в виде массива координат вершин. Необходимо проверить их на пересечение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Separeta Axis Theorem &lt;/b&gt;утверждает, что если два обьекта не пересекаются, то существует прямая которая разделяет эти обьекты, т.е. проекции на нормаль этой прямой не пересекаются.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2pGk6l7styJ_w-dYc94uPmRFzBCWjp8-0yknDD8r4YkKCx1w7I-vBJFphyphenhyphenuU00BC4JSHitwm_vo4NPEKutfeFLpaXwRwtMCwB86-8OpnuJpgoSHaeAfvC2DAT0M_rBBnTQHdR-Nf40fPg/s1600/image001a.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;238&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2pGk6l7styJ_w-dYc94uPmRFzBCWjp8-0yknDD8r4YkKCx1w7I-vBJFphyphenhyphenuU00BC4JSHitwm_vo4NPEKutfeFLpaXwRwtMCwB86-8OpnuJpgoSHaeAfvC2DAT0M_rBBnTQHdR-Nf40fPg/s320/image001a.gif&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Заметим что таких прямых может быть несметное количество, однако к счастью в нашем случае мы их ограничим. Доказано что для многоугольников &amp;nbsp;одна из таких осей является сторона одного из многоугольников. Если ни одна из 4-х сторон прямоугольников не подходит, то очевидно прямоугольники пересекаются.&lt;br /&gt;
&lt;br /&gt;
Аналогично происходит с треугольниками, пятиугольниками и т.д.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQhTMb3dpYGjavSgFd2xre8-AMw_z4LO7fAbGC5lxX_sWBYmaqtqdG9UR2oQJnWSkfDARMColZSZtjw22yr0cUBvgsykH5C7GuessSPj3kxKzVz7d4fO7cR25jXo7iEsFchyphenhyphenkG23jfUrT6/s1600/image001b.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;248&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQhTMb3dpYGjavSgFd2xre8-AMw_z4LO7fAbGC5lxX_sWBYmaqtqdG9UR2oQJnWSkfDARMColZSZtjw22yr0cUBvgsykH5C7GuessSPj3kxKzVz7d4fO7cR25jXo7iEsFchyphenhyphenkG23jfUrT6/s320/image001b.gif&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
На данном рисунке мы видим, что проекции на красную ось пересекаются, что не даёт нам возможности утверждать, что треугольники разделены. В то время выбрав в качестве оси нормаль одного из треугольников ( синяя ось) проекции не пересекаются, т.е. треугольники&lt;b&gt; не пересекаются.&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
Таким образом алгоритм состоит из трёх частей:&lt;br /&gt;
1. Поиск оси, которая разделяет многоугольники. (фактически проверка каждой стороны многоугольников)&lt;br /&gt;
2. Получение проекций многоугольников на ось.&lt;br /&gt;
3. Проверка на пересечение интервалов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;br /&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; Intersect(Polygon a, Polygon b)
        {
            &lt;span class=&quot;rem&quot;&gt;//Если один из многоугольников пустой - то не пересекаются&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (a == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt; || b == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;)
                &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;

            &lt;span class=&quot;rem&quot;&gt;//Вычисляем отступ между многоугольниками для приведения к центру координат&lt;/span&gt;
            Vector2 offset = a.Offset - b.Offset;

            &lt;span class=&quot;rem&quot;&gt;//В данной переменной храним ось на которую будет проецировать&lt;/span&gt;
            Vector2 xAxis = Vector2.Zero ;

            &lt;span class=&quot;rem&quot;&gt;//Проходим по всем сторонам первого многоугольника и используем их как ось&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; j = a.VertexCount-1,i=0; i &amp;lt; a.VertexCount;j=i,i++)
            {
                &lt;span class=&quot;rem&quot;&gt;//Вычисляем вектор стороны многоугольника&lt;/span&gt;
                Vector2 E = Vector2.Subtract(a[j], a[i]);
                &lt;span class=&quot;rem&quot;&gt;//Вычисляем вектор нормали к стороне многоугольника&lt;/span&gt;
                xAxis = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Vector2(-E.Y, E.X); 

                &lt;span class=&quot;rem&quot;&gt;//Если проекции многоугольников не пересекаются - то по теореме многоугольники не пересекаются&lt;/span&gt;
                &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (!IntervalIntersect(a, b, xAxis, offset))
                    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;
            }

            &lt;span class=&quot;rem&quot;&gt;//Если пока не нашли нужной оси - проходим по всем сторонам второго многоугольника&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; j = b.VertexCount - 1, i = 0; i &amp;lt; b.VertexCount; j = i, i++)
            {
                &lt;span class=&quot;rem&quot;&gt;//Вычисляем вектор стороны и нормаль&lt;/span&gt;
                Vector2 E = Vector2.Subtract(b[j], b[i]);
                xAxis = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Vector2(-E.Y, E.X); &lt;span class=&quot;rem&quot;&gt;//Getting normal vector&lt;/span&gt;

                &lt;span class=&quot;rem&quot;&gt;//И проверяем на пересечение проекций&lt;/span&gt;
                &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (!IntervalIntersect(a, b, xAxis, offset))
                    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;
            }

            &lt;span class=&quot;rem&quot;&gt;//Если ни одна из осей не нашла не пересекающихся проекций, то очевидно по теореме&lt;/span&gt;
            &lt;span class=&quot;rem&quot;&gt;//многоугольники пересекаются - возвращаем тру.&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;;
        }&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Код функций нахождения проэкции и пересечения интервалов:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// Проверяет на пересечение проекций многоугольников&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;a&quot;&amp;gt;Первый многоугольник&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;b&quot;&amp;gt;Второй многоугольник&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;xAxis&quot;&amp;gt;Ось проекции&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;offset&quot;&amp;gt;Отступ&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; IntervalIntersect(Polygon a, Polygon b, Vector2 xAxis, Vector2 offset)
        {
            &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; min0, max0, min1, max1; &lt;span class=&quot;rem&quot;&gt;//проекции на ось первого и второго многоугольника&lt;/span&gt;
            GetInterval(a, xAxis, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; min0, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; max0);&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;rem&quot;&gt;//получаем первую проекцию&lt;/span&gt;
            GetInterval(b, xAxis, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; min1, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; max1);&lt;span class=&quot;rem&quot;&gt;
//получаем вторую проекцию&lt;/span&gt;

            &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; h = Vector2.Dot(offset, xAxis); &lt;span class=&quot;rem&quot;&gt;//получаем проекцию отступа &lt;/span&gt;
            min0 += h; max0 += h; &lt;span class=&quot;rem&quot;&gt;// и добавляем её к первому многоугольнику&lt;/span&gt;

            &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; d0 = min0 - max1; 
            &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; d1 = min1 - max0;

            &lt;span class=&quot;rem&quot;&gt;//если проекции не пересекаются то минимум первого больше максимума второго или&lt;/span&gt;
            &lt;span class=&quot;rem&quot;&gt;//минимум второго больше максимума первого.&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (d0 &amp;gt; 0.0f || d1 &amp;gt; 0.0f)
                &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;
            &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;;
        }

        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// Получает проекцию на ось&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;a&quot;&amp;gt;Многоугольник&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;xAxis&quot;&amp;gt;Ось&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;min0&quot;&amp;gt;Начало проекции&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;max0&quot;&amp;gt;Конец проекции&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; GetInterval(Polygon a, Vector2 xAxis, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; min0, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; max0)
        {
            min0 = max0 = Vector2.Dot(a[0],xAxis);
            &lt;span class=&quot;rem&quot;&gt;//Проходимся по всем вершинам и проецируем их на ось&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; i = 1; i &amp;lt; a.VertexCount; i++)
            {
                &lt;span class=&quot;rem&quot;&gt;//проецируем вершину на ось&lt;/span&gt;
                &lt;span class=&quot;kwrd&quot;&gt;float&lt;/span&gt; dot = Vector2.Dot(a[i], xAxis); 
                &lt;span class=&quot;rem&quot;&gt;//Устанавливаем минимум и максимум&lt;/span&gt;
                &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (dot &amp;lt; min0)
                    min0 = dot;
                &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (dot &amp;gt; max0)
                    max0 = dot;
            }
        }&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;b&gt;Полные исходные коды можно скачать здесь:&lt;/b&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://sites.google.com/site/jackdevolpment/files/physicsTutorial.7z?attredirects=0&amp;amp;d=1&quot;&gt;https://sites.google.com/site/jackdevolpment/files/physicsTutorial.7z?attredirects=0&amp;amp;d=1&lt;/a&gt;&lt;/b&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;или здесь&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;a href=&quot;https://docs.google.com/leaf?id=0B6h7yaggRA4pNDg1M2Y1ODUtNDYyMC00Yjg2LTlhMWUtMWNlYWNlYTFlNjJl&amp;amp;hl=en&quot;&gt;https://docs.google.com/leaf?id=0B6h7yaggRA4pNDg1M2Y1ODUtNDYyMC00Yjg2LTlhMWUtMWNlYWNlYTFlNjJl&amp;amp;hl=en&lt;/a&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;b&gt;Ссылки на другие ресурсы по SAT:&lt;/b&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://www.metanetsoftware.com/technique/tutorialA.html&quot;&gt;http://www.metanetsoftware.com/technique/tutorialA.html&lt;/a&gt;&lt;/b&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;a href=&quot;http://www.sevenson.com.au/actionscript/sat/&quot;&gt;http://www.sevenson.com.au/actionscript/sat/&lt;/a&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;a href=&quot;http://www.gamedev.ru/code/terms/SAT&quot;&gt;http://www.gamedev.ru/code/terms/SAT&lt;/a&gt;&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;a href=&quot;http://noregret.org/tutor/n/collision/&quot;&gt;http://noregret.org/tutor/n/collision/&lt;/a&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/7283743872119795959/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/10/2d-separate-axis-theorem.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/7283743872119795959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/7283743872119795959'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/10/2d-separate-axis-theorem.html' title='2D Физика для игр - Separate Axis Theorem'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2pGk6l7styJ_w-dYc94uPmRFzBCWjp8-0yknDD8r4YkKCx1w7I-vBJFphyphenhyphenuU00BC4JSHitwm_vo4NPEKutfeFLpaXwRwtMCwB86-8OpnuJpgoSHaeAfvC2DAT0M_rBBnTQHdR-Nf40fPg/s72-c/image001a.gif" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-3774438892251960277</id><published>2010-09-25T21:27:00.003+03:00</published><updated>2010-10-09T14:55:16.937+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="вконтакте"/><title type='text'>Vkontakte Merchant API</title><content type='html'>Сегодня был свободный день и почти всё время провёл дома. Но решил не тратить его попусту и сделать небольшой сайт-магазин для моей игры, попутно немного изучив &lt;b&gt;Vkontakte Merchant API&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
В принципе что меня удивило - это простота установки данного API. Сам процесс вставки в сайт кнопки покупки действительно занимает минуты,а большинство времени было потрачено на написание заглушек для Callback-страниц.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Т.к. к сожалению Callback страница обязательна должна быть в интернете пришлось зарегистрировать аккаунт на бесплатном пхп хостинге. Тут мне был в помощь сервис &lt;a href=&quot;http://0fees.net/&quot;&gt;0fees.net&lt;/a&gt;. Данный сервис предложил вполне адекватных пхп хостинг и включал в себя БД, поддержку отправки почты через &amp;nbsp;mail, и наверно единственным его минусом было то что в нём было ограничение на макс.размер файлов. Прямым текстом это нигде не написано, но архив с моей игрой удалялся сразу после закачки на сервер. К счастью на процесс тестирования АПИ это ограничение никак не влияло.&lt;br /&gt;
&lt;br /&gt;
Как оно всегда бывает заглушка-пример не работала и примерно через попыток 10 ковыряния я решил подойти к вопросу кардинально и начал писать с нуля. Кстати, замечу что сервис довольно гибкий, включает обратные вызовы для списков методов доставки и т.д. Мне же нужен был только один обратный вызов - оповещение сервера об оплате пользователем товара. Поэтому реализовывал я только 1 заглушку, а другие отключил.&lt;br /&gt;
&lt;br /&gt;
В принципе вся работа заглушки сводится к обработке входящих через ПОСТ переменных, проверки хэша и вывода в случае успеха ХМЛ следующего вида:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&amp;gt;
&amp;lt;success&amp;gt;
  &amp;lt;order-id&amp;gt;идентификатор заказа в платёжной системе&amp;lt;/order-id&amp;gt;
  &amp;lt;merchant-order-id&amp;gt;идентификатор заказа в системе продавца&amp;lt;/merchant-order-id&amp;gt;
&amp;lt;/success&amp;gt; &lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Вообщем хочется подытожить свои ощущения от использования:&lt;br /&gt;
+ скрипт легко устанавливает и конфигурируется&lt;br /&gt;
&lt;b&gt;+ &lt;/b&gt;пользователь получает инструменты управления магазином и заказами. если заглушки не писать можно обрабатывать заказы вручную&lt;br /&gt;
- не описаны методы как сделать нестандартный дизайн кнопки&lt;br /&gt;
- немного раздражает факт наличия всплывающих окон&lt;br /&gt;
&lt;br /&gt;
Всё моё художество можно увидеть на&amp;nbsp;&lt;a href=&quot;http://jackthehack.0fees.net/&quot;&gt;http://jackthehack.0fees.net/&lt;/a&gt;&lt;br /&gt;
Кстати походу упал сервер userapi.com на который ссылаются виджеты комментариев и &quot;мне нравится&quot; =(&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/3774438892251960277/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/09/vkontakte-merchant-api.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/3774438892251960277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/3774438892251960277'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/09/vkontakte-merchant-api.html' title='Vkontakte Merchant API'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-2257558526168681354</id><published>2010-08-27T13:03:00.001+03:00</published><updated>2010-10-09T14:55:58.698+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gamedev"/><category scheme="http://www.blogger.com/atom/ns#" term="HLSL"/><category scheme="http://www.blogger.com/atom/ns#" term="XNA"/><title type='text'>RadialBlur HLSL Shader - 3 сэмпла</title><content type='html'>Решил добавить в игру простенький &lt;b&gt;эффект радиальной размытия&lt;/b&gt;. В нете к счастью нашёл много информации, в результате скомпонованный шейдер получился следующего вида:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sampler ColorMapSampler : register(s0);&lt;br /&gt;
&lt;br /&gt;
float4 radialBlur(float2 vTex:TEXCOORD0):COLOR&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float4 result=float4(1,0,0,1);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//массив с сэмплами. тут их 3 для производительности&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float samples[3] = {0.05 ,0.03, &amp;nbsp;0.01};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;// 0.5,0.5 центр экранных координат&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;// т.е. отнимая от (0.5,0.5) текстурные координаты&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;// мы получаем вектор указывающий на центр экрана&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float2 dir = 0.5 - vTex;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;// вычисляем расстояние до центра&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float dist = length(dir);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;// нормализуем&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;dir = dir/dist;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;// получаем цвет текущего пикселя&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float4 color = tex2D(ColorMapSampler,vTex);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float4 sum = color;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;// берём ещё 3 сэмпла из пикселей противоположных центру экрана&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;sum += tex2D( ColorMapSampler, vTex + dir * samples[i] * dist );&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;// всего взяли 4 сэмпла ( 3 соседних и 1 текущий)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;sum *= 0.25f;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;// коэффициент 0.7 указывается силу эффекта&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float t = dist * 0.7f;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;t = clamp( t ,0.0,1.0);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//интерполируем текущий цвет с рассчитанным по расстоянию до центра&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;result = lerp( color, sum, t );&lt;br /&gt;
&lt;br /&gt;
return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
technique PostProcess&lt;br /&gt;
{&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;pass P1&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;{&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;// A post process shader only needs a pixel shader.&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;PixelShader = compile ps_2_0 radialBlur();&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;}&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
}&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/2257558526168681354/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/08/radialblur-hlsl-shader-3.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/2257558526168681354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/2257558526168681354'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/08/radialblur-hlsl-shader-3.html' title='RadialBlur HLSL Shader - 3 сэмпла'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-383210759552526212</id><published>2010-08-19T13:20:00.000+03:00</published><updated>2010-08-19T13:20:47.034+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><category scheme="http://www.blogger.com/atom/ns#" term="XNA"/><title type='text'></title><content type='html'>Убрал баг с Alt-Tab, который возникал в полноэкранном режиме игры. Оказывается теперь XNA сама заботиться об восстановлении графического устройства после его потери. Я же думал что его нужно восстанавливать вручную по событию DeviceLost, что конечно неправильно.&lt;br /&gt;
&lt;br /&gt;
Слава богу существует класс Trace который позволяет сделать быстрый лог того что происходит и значительно упростил отладку и поиск ошибки.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/383210759552526212/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/08/alt-tab.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/383210759552526212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/383210759552526212'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/08/alt-tab.html' title=''/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-1099151537087970975</id><published>2010-07-23T21:37:00.000+03:00</published><updated>2010-07-23T21:37:11.512+03:00</updated><title type='text'>Диплом в Шаге - 12/12</title><content type='html'>Наконец-то сдал диплом в Шаге на оценку 5+. Процесс защиты длился 12 часов с часовым перерывом, но и студенты и преподаватели выдержали этот экзамен =)&lt;br /&gt;
На радостях выкладываю видео дипломного проекта и арканоида. Разработка не прекращается,а продолжается и как я обещал скоро будет новое оформление и релиз.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;br /&gt;
&lt;iframe frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;http://vkontakte.ru/video_ext.php?oid=3667736&amp;amp;id=147283521&amp;amp;hash=c1662caafea85eb9&quot; width=&quot;500&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;/center&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/1099151537087970975/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/07/1212.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/1099151537087970975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/1099151537087970975'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/07/1212.html' title='Диплом в Шаге - 12/12'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-2574134415582491421</id><published>2010-07-18T13:20:00.002+03:00</published><updated>2010-07-18T13:29:30.951+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gamedev"/><category scheme="http://www.blogger.com/atom/ns#" term="XNA"/><title type='text'>HLSL шейдеры для чайников</title><content type='html'>&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Шейдерная графика сейчас наиболее популярна. Большинство игр так и пестрят системными требованиями Shader 2.0, что&amp;nbsp;конечно&amp;nbsp;разочаровывает владельцев стареньких ПК, и радует картинкой современных геймеров. В этой статье я попытаюсь рассказать вкратце о том как писать HLSL шейдеры на XNA и в результате получить шейдер радиальной градиентной заливки.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Итак. Нам понадобяться следующие инструменты:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;XNA Game Studio&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Видеокарта с поддержкой шейдеров&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Итак для начала мы создадим &quot;Windows Game&quot; проект в студии. Далее нам необходимо создать небольшую текстурку. Неважно её содержимое, сколько само её существование. Поэтому добавляем к Content новый элемент - текстуру 2*2.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Далее нам необходимо нарисовать её, поэтому добавляем в класс Game переменную Texture2D и загружаем её в LoadContent&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;Texture2D texture;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;protected override void LoadContent()&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Create a new SpriteBatch&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spriteBatch = new SpriteBatch(GraphicsDevice);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;texture = Content.Load&lt;texture2d&gt;(&quot;tex&quot;);&lt;/texture2d&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;и далее отрисовываем её, например так:&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected override void Draw(GameTime gameTime)&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GraphicsDevice.Clear(Color.CornflowerBlue);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spriteBatch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.SaveState);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spriteBatch.Draw(texture,&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new Rectangle(0, 0,&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;400, 300), Color.White);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spriteBatch.End();&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;base.Draw(gameTime);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Если всё сделано правильно, то запустив мы увидим белый прямоугольник на голубом фоне.&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Кстати советую spriteBatch.Begin написать &amp;nbsp;именно так как описано выше, т.к иначе шейдер может не сработать.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Наконец можно приступить к написанию шейдера =)&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Добавляем к Content новый шейдер (Effect file). Студия автоматически создаст шаблон шейдера, однако мы далее его переделаем, т.к он содержит много лишнего.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Далее добавим переменную в класс Game -&amp;nbsp;Effect effect;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Загружаем шейдер в LoadContent&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;effect = Content.Load&lt;effect&gt;(&quot;gradient&quot;);&lt;/effect&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;И переписываем процедуру рисования:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;protected override void Draw(GameTime gameTime)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GraphicsDevice.Clear(Color.CornflowerBlue);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spriteBatch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.SaveState);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;effect.Begin();&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (EffectPass pass in effect.Techniques[0].Passes)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pass.Begin();&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spriteBatch.Draw(texture,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new Rectangle(0, 0,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;400, 300), Color.White);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt; &amp;nbsp;pass.End();&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;effect.End();&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spriteBatch.End();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;base.Draw(gameTime);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Теперь не спешите запускать проект. Последний мазок - переписываем шейдер:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;sampler ColorMapSampler : register(s0);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;// Grayscale&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;float4 PixelShader(float2 Tex: TEXCOORD0) : COLOR&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;{&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;return float4(1,0,0,1);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;technique PostProcess&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;pass P0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;PixelShader = compile ps_2_0 PixelShader();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;Здесь я удалил вершинный шейдер и лишние переменные. Для простоты оставил только пиксельный. Теперь если запустить проект то должен получится красный квадратик&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVNPlRhEo611CZVCcLgH3y7AMm3LLbvgyiAegIKnYSYBSyFi3GptDdaqEwjuxUtYLsTfLKLn-GILZO81bvjOoFzEb2_YNL7fHbvZ7EnZeMhKE5M7Nt0YvCIkeJXOhorVLVyi5ZGy8gjVFS/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;249&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVNPlRhEo611CZVCcLgH3y7AMm3LLbvgyiAegIKnYSYBSyFi3GptDdaqEwjuxUtYLsTfLKLn-GILZO81bvjOoFzEb2_YNL7fHbvZ7EnZeMhKE5M7Nt0YvCIkeJXOhorVLVyi5ZGy8gjVFS/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Не очень впечатляет, но это ведь только начало ;)&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Давайте посмотрим ближе на шейдер. Шейдер - это программа которая выполняется на видеоадаптере компьютера. Как известно видеоадаптер в разы быстрее обрабатывает информацию, поэтому шейдеры так удобны. Существуют различные виды шейдеров:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Пиксельный&lt;/li&gt;
&lt;li&gt;Вершинный&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Пиксельный обрабатывает пиксели,а вершинный соотвественно вершины. Так вот у нас пиксельный. На вход мы получаем текстурные координаты пикселя ( его положение в пространстве). Они изменяется от [0..1]. А на выход пиксельный шейдер ( по сути это функция) должна возвращать float4 - вектор из 4 компонент, который указывает выходной цвет пикселя.&lt;/div&gt;&lt;div&gt;В нашем шейдере мы всем пикселям указали цвет (1,0,0,1), т.е красный по цветовой модели RGBA.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Теперь давайте поиграемся с текстурными координатами. Попробуем визуализировать их. И перепишем строчку возвращения цвета в шейдере как:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;float4 PixelShader(float2 Tex: TEXCOORD0) : COLOR&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;return float4(Tex.x,Tex.y,0,1);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIMmvNXWINhqsLJHmX9zDinnbTzKW9XWgp-QRZXqMaIyd16gK-ffOp25oivKbGT3nDZDPOyix0FlspQHkShEudEI6o4AjxETkU-NIo9JrmWmNm-lMVgpCp9Mlru_25Mqu25X-o8PF07pN0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;249&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIMmvNXWINhqsLJHmX9zDinnbTzKW9XWgp-QRZXqMaIyd16gK-ffOp25oivKbGT3nDZDPOyix0FlspQHkShEudEI6o4AjxETkU-NIo9JrmWmNm-lMVgpCp9Mlru_25Mqu25X-o8PF07pN0/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;Помойму смотрится уже лучше =) Как видим там где x текстурная координата ближе к 1 мы видим больше красного,а где ближе к 1 y координата больше зелёного. Что в принципе и должен был делать наш шейдер.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Давайте двигаться дальше. Конечной целью статьи было написание градиентной круговой заливки. В качестве параметров заливка должна иметь:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Радиус градиента&lt;/li&gt;
&lt;li&gt;Центр градиента&lt;/li&gt;
&lt;li&gt;Начальный и конечный цвет&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;Итак, начнём:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;float4 PixelShader(float2 Tex: TEXCOORD0) : COLOR&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;float2 Center=float2(0.5f,0.5f);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;float &amp;nbsp;Radius=0.2f;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;float4 start=(1,0,0,1);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;float4 end=(0,1,0,1);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;float dist=distance(Center,Tex);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;return float4(dist,0,0,1);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Мы добавили в шейдер переменные центра, радиуса, начального и конечного цвета градиента. Кроме того здесь мы вычисляем с помощью встроенной функции в HLSL расстояние между центром и текстурными координатами пикселя. А далее мы расстояние визуализируем. Получаем:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf1ejlljcK5CuOB8c4QpSzneHN30XmuMlw_KAhLS75wI_xOTRgXsQ9xEKhhZqraVL6KXkoXhhIWQBxRGiKyaOZzfZOGGykZtwLNEknYrH7Ieo0OhPEXjxvXMUc3DAAOPzL2BTlQfYaSPHm/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;249&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf1ejlljcK5CuOB8c4QpSzneHN30XmuMlw_KAhLS75wI_xOTRgXsQ9xEKhhZqraVL6KXkoXhhIWQBxRGiKyaOZzfZOGGykZtwLNEknYrH7Ieo0OhPEXjxvXMUc3DAAOPzL2BTlQfYaSPHm/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Получили красный градиент с центром в (0.5,0.5). Нам однако всё ещё нужно чтобы были начальные и конечные цвета,а также радиус градиента. Поэтому переписываем шейдер:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;float4 PixelShader(float2 Tex: TEXCOORD0) : COLOR&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;float2 Center=float2(0.5f,0.5f);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;float &amp;nbsp;Radius=0.6f;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;float4 start=float4(0,0,1,1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;float4 end=float4(0,1,0,1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;float dist=min(1,distance(Center,Tex)/Radius);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;float4 realcolor=smoothstep(start,end,dist);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;return realcolor;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Теперь помедленней:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;distance - возвращает float - расстояние между двумя векторами&lt;/li&gt;
&lt;li&gt;smoothstep - делает переход на основе 3-го параметра между двумя векторами. В данном случае это делает переход из одного цвета в другой.&lt;/li&gt;
&lt;li&gt;min - функция минимума&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Теперь если запустим всё будет по честному, только одно но... Хочется все параметры задавать из программы. Поэтому можете запускать посмотреть результат... а я дальше пойду. Опять переписываем шейдер:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;float2 Center;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;float &amp;nbsp;Radius;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;float4 start;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;b&gt;float4 end;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;float4 PixelShader(float2 Tex: TEXCOORD0) : COLOR&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;float dist=min(1,distance(Center,Tex)/Radius);&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;float4 realcolor=smoothstep(start,end,dist);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;return realcolor;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;И также переписываем метод рисования:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: inherit;&quot;&gt;&lt;div&gt;spriteBatch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.SaveState);&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;effect.Parameters[&quot;Radius&quot;].SetValue(0.9f);&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;effect.Parameters[&quot;Center&quot;].SetValue(new Vector2(0.5f, 0.5f));&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;effect.Parameters[&quot;start&quot;].SetValue(Color.White.ToVector4());&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;effect.Parameters[&quot;end&quot;].SetValue(Color.Red.ToVector4());&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;effect.CommitChanges();&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;effect.Begin();&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Что получилось?&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAOEJdJvlM1H50hfHgCAnDDO49UHh4yKawl7wL8NqLRDZ_qMakP8KFXcSDrKiz7DCinDay5ZXkhnx-WqZBxYFomHsfiAQkZDssuEkLWxxb9YRUJ6XLPq6MeckszRU0wQbKv6rTZWTNxl2f/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;249&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAOEJdJvlM1H50hfHgCAnDDO49UHh4yKawl7wL8NqLRDZ_qMakP8KFXcSDrKiz7DCinDay5ZXkhnx-WqZBxYFomHsfiAQkZDssuEkLWxxb9YRUJ6XLPq6MeckszRU0wQbKv6rTZWTNxl2f/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Довольно симпатично. Что поменялось? Мы вынесли переменные из функции шейдера, таким образом сделали их глобальными параметрами шейдера. А в процедуре рисования мы присваивали им значения. Таким образом шейдер управляется из программы.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;На этом пока что всё. Статья получилось немного длинная, но надеюсь суть ясна. Исходники можно скачать по адресу:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://docs.google.com/leaf?id=0B6h7yaggRA4pZGIzNzU1NzMtZWY1MC00MWMzLTk4NDMtNjE5ZWNiN2ZhMmMw&amp;amp;hl=en&quot;&gt;https://docs.google.com/leaf?id=0B6h7yaggRA4pZGIzNzU1NzMtZWY1MC00MWMzLTk4NDMtNjE5ZWNiN2ZhMmMw&amp;amp;hl=en&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://sites.google.com/site/jackdevolpment/files/shadertest.7z?attredirects=0&amp;amp;d=1&quot;&gt;http://sites.google.com/site/jackdevolpment/files/shadertest.7z?attredirects=0&amp;amp;d=1&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/2574134415582491421/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/07/hlsl.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/2574134415582491421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/2574134415582491421'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/07/hlsl.html' title='HLSL шейдеры для чайников'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVNPlRhEo611CZVCcLgH3y7AMm3LLbvgyiAegIKnYSYBSyFi3GptDdaqEwjuxUtYLsTfLKLn-GILZO81bvjOoFzEb2_YNL7fHbvZ7EnZeMhKE5M7Nt0YvCIkeJXOhorVLVyi5ZGy8gjVFS/s72-c/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-8009769942777604593</id><published>2010-07-16T01:03:00.000+03:00</published><updated>2010-07-16T01:03:26.450+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gamedev"/><category scheme="http://www.blogger.com/atom/ns#" term="XNA"/><title type='text'>Cycloid. Новости</title><content type='html'>Рад сообщить что разработка игры под XNA идёт полным ходом. Почти все&amp;nbsp;предполагаемые&amp;nbsp;фичи реализованы, так что работа переходит в стадию тестирования и допиливания.&lt;br /&gt;
&lt;br /&gt;
Кроме того я договорился с художником о создании оформления для игры. Конечно переоформление&amp;nbsp;займет&amp;nbsp;некоторое время, но оно того стоит. Могу только сказать что предварительные эскизы я уже видел и выглядит всё это очень даже неплохо.&lt;br /&gt;
&lt;br /&gt;
К сожалению бинарников и эскизов показать не могу, и в&amp;nbsp;ближайшем&amp;nbsp;времени их&amp;nbsp;вряд ли&amp;nbsp;кто то&amp;nbsp;увидит. Buissness is buissness.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/8009769942777604593/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/07/cycloid.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/8009769942777604593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/8009769942777604593'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/07/cycloid.html' title='Cycloid. Новости'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-554244853485578332</id><published>2010-07-11T11:10:00.000+03:00</published><updated>2010-07-11T11:10:23.977+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gamedev"/><category scheme="http://www.blogger.com/atom/ns#" term="XNA"/><title type='text'>Farseer Physics и XNA</title><content type='html'>Решил переделать свой арканоид и вместо собственной физики использовать 2D физический движок&lt;b&gt; Farseer Physics&lt;/b&gt;. Это наиболее распространённый физический движок для &lt;b&gt;C#&lt;/b&gt; ( в частности под &lt;b&gt;XNA&lt;/b&gt;). Подключить был довольно просто - в комплекте идёт готовый пример использования, однако сразу столкнулся с первыми трудностями.&lt;br /&gt;
&lt;br /&gt;
Основная проблема с которой я столкнулся - это появление исключения &lt;b&gt;ArithmeticException&lt;/b&gt; в методе вычисления угловой скорости (&lt;b&gt;AngularVelocity&lt;/b&gt;). Что самое обидное было - это то, что исключения возникало не сразу, а в процессе игры. Долгие поиски причины не привели к решению проблемы, однако путём тыка ( самый действенный метод ) ошибка была устранена.&lt;br /&gt;
&lt;br /&gt;
Причиной такого поведения был факт того, что я не устанавливал &lt;b&gt;MomentOfInertia&lt;/b&gt; для создаваемых тел. В результате данный параметр вычислялся автоматически движком и очевидно его значение превышало возможности движка. В результате я выставил вручную данный параметр в 1 и ошибка больше не появлялась. Данный параметр показывает насколько будет закручиваться обьект при ударении с другим обьектом. Для моей игры этот параметр не является существенным и поэтому я не сильно заботился его правильным значением.&lt;br /&gt;
&lt;br /&gt;
В общем данный движок довольно удобный. В комплект входит визуализатор физики - он конкретно упрощает жизнь в процессе дебага. Кроме того движок постоянно развивается - на данный момент стабильная версия 2.1.3, но уже в ближайщем будующем обещают появление 3-й версии движка с новыми плюшками и фишками.&lt;br /&gt;
&lt;br /&gt;
Так что если нужна физика для Silverlight, XNA или WPF - рекомендую&amp;nbsp;&lt;a href=&quot;http://farseerphysics.codeplex.com/&quot;&gt;http://farseerphysics.codeplex.com/&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/554244853485578332/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/07/farseer-physics-xna.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/554244853485578332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/554244853485578332'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/07/farseer-physics-xna.html' title='Farseer Physics и XNA'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-4757426154732714718</id><published>2010-05-13T22:24:00.008+03:00</published><updated>2010-05-13T23:26:11.703+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gamedev"/><category scheme="http://www.blogger.com/atom/ns#" term="XNA"/><category scheme="http://www.blogger.com/atom/ns#" term="универ"/><title type='text'>XNA - продолжая тему диплома</title><content type='html'>Итак.... Я не знаю говорил ли я что я пишу 2 диплома? Если нет то теперь вы знаете.&lt;br /&gt;Один в универе и один в Шаг. Довольно весёлое занятие - попеременно забивать болт то на один, то на другой....&lt;br /&gt;&lt;br /&gt;Сегодня я хочу написать о том что у меня получается с Шаговским дипломом. В Шаге я занимаюсь разработкой игры под платформу XNA. В качестве игры я решил переделать стандартную под iPod игру - Vortex. Это аналог арканоида, с отличием в том, что бита движется по кругу,и задача игрока не выпустить мяч за пределы круга.&lt;br /&gt;&lt;br /&gt;Собственно первая часть работы - организовать процесс игры, движение шарика и биты. Она у меня прошла довольно гладко. &lt;br /&gt;&lt;br /&gt;И вот сейчас я решил взяться за вторую - рефакторинг, организация игрового движка и наконец использования шейдеров. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Небольшой тизер :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmJ1nBK5Lmf_lmBcfe3P_tpPxAWzVCH17ZaQpngB8p46798haL2nKHZrsULfrv4fWfxwSe2Cg_aiPMZJsUp9g1cVQo4FxwsS0N3-UKCF_7HhRhEUA32r1DTtrzP29I51nRc2XDTkEcuCxA/s1600/teaser.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 349px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmJ1nBK5Lmf_lmBcfe3P_tpPxAWzVCH17ZaQpngB8p46798haL2nKHZrsULfrv4fWfxwSe2Cg_aiPMZJsUp9g1cVQo4FxwsS0N3-UKCF_7HhRhEUA32r1DTtrzP29I51nRc2XDTkEcuCxA/s400/teaser.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5470840191877281842&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Основной идеей рефакторинга было создание классов для разделения функций между движком и логикой игры.&lt;br /&gt;&lt;br /&gt;Т.к игра двумерная я создал классы спрайтов,на основе которых позже создал классы анимированных спрайтов и анимаций.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Краткая диаграмма классов игры&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFNJmUM-hixYHF7LEdCmA1f3X-x0FqYjf68kiTuxL2KOYVsPR0c2npQfiH2RgEpH7LJ8ivUquitoCPR2fJUhUghLIir4ZTpYx0OytVkvvUPqWEy26hzZxxocicuLZ2J-gMEjVb5n8NLKua/s1600/classes.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 373px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFNJmUM-hixYHF7LEdCmA1f3X-x0FqYjf68kiTuxL2KOYVsPR0c2npQfiH2RgEpH7LJ8ivUquitoCPR2fJUhUghLIir4ZTpYx0OytVkvvUPqWEy26hzZxxocicuLZ2J-gMEjVb5n8NLKua/s400/classes.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5470842455046292434&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;GameView &lt;/span&gt;- класс состояния игры. Т.к игра фактически состоит из дискретных состояний, то я решил написать класс StateManager который управляет состояниями. И каждый раз вызывая метод StateManager.SetView мы меняем состояние игры. Это очень удобно, т.к отдаёт большую часть работы относительно игровой логики и рисования реализациям состояний. Подобный подход не новый и используется почти во всех игровых движках в разных ипостасях.&lt;br /&gt;&lt;br /&gt;В результате после выделения состояний я очень удобно прикрутил шейдер  &lt;a target=&quot;_blank&quot; href=&quot;http://digierr.spaces.live.com/blog/cns!2B7007E9EC2AE37B!667.entry?wa=wsignin1.0&amp;sa=599119843&quot;&gt;Transition&lt;/a&gt; который делает слайдовый переход. Получилась очень достойная анимация смены состояний.&lt;br /&gt;&lt;br /&gt;Что касается спрайтов то - это типичное решение для помойму всех двумерных игровых движков. Скажу только что AnimatedSprite - это спрайт с нескольким числом состояний и нужен в игре чтобы отображать кирпичи ( разбитые и не разбитые)&lt;br /&gt;&lt;br /&gt;Что ещё буду делать:&lt;br /&gt;- Подсчёт очков за разбитые кирпичи,комбо&lt;br /&gt;- Пост-обработка шейдерами при попадании на кирпичи&lt;br /&gt;- При закрытии игры процесс остаётся в памяти - нужно пофиксить.&lt;br /&gt;- Иногда(довольно редко) некорректно отбивается шарик от биты или от кирпичей&lt;br /&gt;&lt;br /&gt;Вообщем не буду томить и кидаю ссылку на сборку игрушки. Пока что только 1 уровень и нету очков - но всё впереди ( я просто решил похвастатся )))&lt;br /&gt;&lt;br /&gt;Google docs:&lt;br /&gt;&lt;a href=&quot;https://docs.google.com/leaf?id=0B6h7yaggRA4pZGRjZGNlNzktYjBmNS00M2RjLWExNWYtY2I2NWY4NzhhMDli&amp;hl=en&quot;&gt;https://docs.google.com/leaf?id=0B6h7yaggRA4pZGRjZGNlNzktYjBmNS00M2RjLWExNWYtY2I2NWY4NzhhMDli&amp;hl=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Google sites:&lt;br /&gt;&lt;a href=&quot;http://sites.google.com/site/jackdevolpment/files/Release.7z?attredirects=0&amp;d=1&quot;&gt;http://sites.google.com/site/jackdevolpment/files/Release.7z?attredirects=0&amp;d=1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Faq:&lt;/span&gt;&lt;br /&gt;1.Для запуска необходима XNA 3.1 &lt;a target=&quot;_blank&quot; href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=53867a2a-e249-4560-8011-98eb3e799ef2&amp;displaylang=en&quot;&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=53867a2a-e249-4560-8011-98eb3e799ef2&amp;displaylang=en&lt;/a&gt; &lt;br /&gt;2.Пасхальные яйца - F1,F2,F3,F4 во время игры&lt;br /&gt;3.Если что-то не работает - отписываемся :)&lt;br /&gt;&lt;/blockquote&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/4757426154732714718/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/05/xna.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/4757426154732714718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/4757426154732714718'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/05/xna.html' title='XNA - продолжая тему диплома'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmJ1nBK5Lmf_lmBcfe3P_tpPxAWzVCH17ZaQpngB8p46798haL2nKHZrsULfrv4fWfxwSe2Cg_aiPMZJsUp9g1cVQo4FxwsS0N3-UKCF_7HhRhEUA32r1DTtrzP29I51nRc2XDTkEcuCxA/s72-c/teaser.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-1582951841576023060</id><published>2010-04-25T00:34:00.008+03:00</published><updated>2010-05-14T00:06:42.895+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="универ"/><title type='text'>Севастополь. Информатика-2010</title><content type='html'>Завтра уезжаю в Севастополь. Посмотрю город и заодно буду участвовать в конференции.&lt;br /&gt;Обожаю ехать куда то, особенно за казённый счёт. &lt;br /&gt;&lt;br /&gt;Как говорится на шару и уксус сладкий.&lt;br /&gt;&lt;br /&gt;Update:&lt;br /&gt;Фотоотчёт можно найти на &lt;br /&gt;&lt;a href=&quot;http://picasaweb.google.com/jack.spektor/DuYLZ?feat=directlink&quot;&gt;http://picasaweb.google.com/jack.spektor/DuYLZ?feat=directlink&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:center&quot;&gt;&lt;br /&gt;&lt;embed type=&quot;application/x-shockwave-flash&quot; src=&quot;http://picasaweb.google.com/s/c/bin/slideshow.swf&quot; width=&quot;400&quot; height=&quot;267&quot; flashvars=&quot;host=picasaweb.google.com&amp;hl=ru&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fjack.spektor%2Falbumid%2F5465824991505444689%3Falt%3Drss%26kind%3Dphoto%26hl%3Dru&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot;&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/1582951841576023060/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/04/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/1582951841576023060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/1582951841576023060'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/04/blog-post.html' title='Севастополь. Информатика-2010'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-7980804836772019040</id><published>2010-03-15T23:35:00.007+02:00</published><updated>2010-03-15T23:58:19.141+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><category scheme="http://www.blogger.com/atom/ns#" term="fun"/><category scheme="http://www.blogger.com/atom/ns#" term="gadget"/><title type='text'>Наваял гаджет</title><content type='html'>Чтото меня потянуло на гаджеты. Решил сделать небольшой гаджет для души.&lt;br /&gt;Смысл - жмём на кнопку и снизу вылетают воздушные шарики.&lt;br /&gt;Долго мучался с COM регистрацией и вызовом, но слава яйцам всё получилось.&lt;br /&gt;&lt;br /&gt;Встречайте - &lt;span style=&quot;font-weight:bold;&quot;&gt;Bubble gadget&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZd8dTuW-LXPuu4B4HVlK7-4OcRwxxsmhyH3n142ZrzgS_Rn5EAGO2BYnxEgnhHs4d_8u-S-GoqGFtuSoCPWOU3d2_8OexVw9lnV9nSeB4j-9DGbC2JfSpZf2KEE7j8fvtO3lVzY5mTgAx/s1600-h/screen.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZd8dTuW-LXPuu4B4HVlK7-4OcRwxxsmhyH3n142ZrzgS_Rn5EAGO2BYnxEgnhHs4d_8u-S-GoqGFtuSoCPWOU3d2_8OexVw9lnV9nSeB4j-9DGbC2JfSpZf2KEE7j8fvtO3lVzY5mTgAx/s400/screen.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5448979062337821234&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://docs.google.com/leaf?id=0B6h7yaggRA4pYzI3Mjc1OGEtNWYzNy00ZThlLWIwMzAtNWU4ZmJhYTdmYzJk&amp;hl=en&quot;&gt;https://docs.google.com/leaf?id=0B6h7yaggRA4pYzI3Mjc1OGEtNWYzNy00ZThlLWIwMzAtNWU4ZmJhYTdmYzJk&amp;hl=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Альтернативная ссылка на загрузку:&lt;br /&gt;&lt;a href=&quot;http://sites.google.com/site/jackdevolpment/files/gadget.gadget?attredirects=0&amp;d=1&quot;&gt;http://sites.google.com/site/jackdevolpment/files/gadget.gadget?attredirects=0&amp;d=1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Более подробно о том как это всё было и какие мне встретились проблемы напишу позже. Сейчас спать.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/7980804836772019040/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/03/blog-post_15.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/7980804836772019040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/7980804836772019040'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/03/blog-post_15.html' title='Наваял гаджет'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZd8dTuW-LXPuu4B4HVlK7-4OcRwxxsmhyH3n142ZrzgS_Rn5EAGO2BYnxEgnhHs4d_8u-S-GoqGFtuSoCPWOU3d2_8OexVw9lnV9nSeB4j-9DGbC2JfSpZf2KEE7j8fvtO3lVzY5mTgAx/s72-c/screen.png" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-6127673807004439473</id><published>2010-03-13T11:45:00.005+02:00</published><updated>2010-03-13T11:56:09.658+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="iTunes"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><title type='text'>Играемся с iTunes через Javascript</title><content type='html'>Довольно классна штука - этот айТюнс. И плеер хороший, и подкасты качает и вообще красавец. Ладна, к чему это я? Случайно узнал, что оказывается у него есть API. Работает через COM и позволяет получить полный доступ к функционалу плеера. &lt;br /&gt;&lt;br /&gt;Так что например вот такой нехитрый Javascript код &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;iTunesApp = new ActiveXObject(&quot;iTunes.Application&quot;); &lt;br /&gt;iTunesApp.NextTrack();&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;поменяет песню в плеере на следующую, а вот например&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;var iTunesApp = new ActiveXObject(&quot;iTunes.Application&quot;); &lt;br /&gt;var currentTrackName=iTunesApp.CurrentTrack.Name;&lt;br /&gt;var currentArtist=iTunesApp.CurrentTrack.Artist;&lt;br /&gt;alert(currentArtist+&quot; - &quot;+currentTrackName);&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;покажет название текущей песни. У меня это например сейчас &lt;span style=&quot;font-style:italic;&quot;&gt;&quot;Vampire Weekend - Oxford Comma&quot;&lt;/span&gt;. Вот такие пироги. Кстати чуть не забыл - вся это красота работает только в случае Internet Explorer. Так что имейте ввиду :)&lt;br /&gt;&lt;br /&gt;Думаю как будет скучно - сделать парочку гаджетов для рабочего стола, чтобы управлял плеером,показывал текущую песню, плейлист и т.д :)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/6127673807004439473/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/03/itunes-javascript.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/6127673807004439473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/6127673807004439473'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/03/itunes-javascript.html' title='Играемся с iTunes через Javascript'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-2912779572556518653</id><published>2010-03-11T16:53:00.003+02:00</published><updated>2010-03-11T17:01:30.654+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gamedev"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="универ"/><title type='text'>Диплом. Черновик 3D рендера. Java</title><content type='html'>Диплом в самом разгаре... Я не сильно писал чем я занимаюсь в рамках диплома. А занимаюсь я проблемой параллельных вычислений. А именно - системой распаралеливания алгоритмов.Так уж сложилось что занимаюсь именно этой темой, а точнее продолжаю работу студента Виктора Бурдейного. &lt;br /&gt;&lt;br /&gt;Написал небольшой черновик 3D рисования на Java - думаю внедрить поддержки 3Д визуализации в систему - это даст возможность рисовать графики, которые будут упрощать понимание результатов работы алгоритма на кластере.&lt;br /&gt;&lt;br /&gt;В принципе я уже сделал визуализацию в 2Д для фреймворка, но алгоритм, который необходимо реализовать должен будет рисовать поверхность в 3Д, так что приходится разбиратся с 3Д костылями для Джавы. Вот такие пироги.&lt;br /&gt;&lt;br /&gt;Java Opengl (использует JOGL)&lt;br /&gt;&lt;a href=&quot;https://docs.google.com/leaf?id=0B6h7yaggRA4pZGVmMDMyYmMtZTYyYi00NmE1LWI2YjQtM2E4OGRhNWI2OGI1&amp;hl=en&quot;&gt;https://docs.google.com/leaf?id=0B6h7yaggRA4pZGVmMDMyYmMtZTYyYi00NmE1LWI2YjQtM2E4OGRhNWI2OGI1&amp;hl=en&lt;br /&gt;&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/2912779572556518653/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/03/3d-java.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/2912779572556518653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/2912779572556518653'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/03/3d-java.html' title='Диплом. Черновик 3D рендера. Java'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-8948676665532830718</id><published>2010-01-27T20:49:00.004+02:00</published><updated>2013-02-10T20:34:29.542+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="универ"/><title type='text'>Взлом алгоритма Эль-Гамаль( с помощью алгоритма Шенкса) </title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Данное задание мне выдавали по предмету криптология. Наверно один из немногих предметов, который мне кажется реально полезным и интересным. 
&lt;br /&gt;
&lt;br /&gt;
Реализовывал на Java т.к боялся что числа выйдут за пределы стандартных типов данных, а  в Java для этого есть удобный тип данных BigInteger. Такто.
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Итак условие:&lt;/span&gt;
&lt;br /&gt;
В следующих задачах зашифрован алгоритмом ЭльГамала текст, написанный на английском языке. Использован следующий алфавит: 
&lt;br /&gt;
&quot;A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z| |,|.|&quot;. 
&lt;br /&gt;
Блок &quot;подсказки&quot; расположен в начале криптотекста и является общим для всех его блоков. Его длина считается неизвестной. Найти секретный ключ и расшифровать текст. 
&lt;br /&gt;
&lt;br /&gt;
&quot;5148154611033774886049492438294008383372872853501067660147906401592062201450665781876473&quot;
&lt;br /&gt;
&lt;br /&gt;
Открытый ключ: p=89981741 g=2 h=76976449
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Часть первая - решение задачи целочисленного логарифмирования ( поиск секретного ключа a)&lt;/span&gt;
&lt;br /&gt;
На вход подаётся p,g,h
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
package Shenks;
&lt;br /&gt;
&lt;br /&gt;
import java.math.BigInteger;
&lt;br /&gt;
import java.util.Hashtable;
&lt;br /&gt;
import java.util.Iterator;
&lt;br /&gt;
import java.util.Map.Entry;
&lt;br /&gt;
&lt;br /&gt;
public final class Program {
&lt;br /&gt;
&lt;br /&gt;
/**
&lt;br /&gt;
* @param args
&lt;br /&gt;
*/
&lt;br /&gt;
public static void main(String[] args) {
&lt;br /&gt;
&lt;br /&gt;
if(args.length==3)
&lt;br /&gt;
{
&lt;br /&gt;
// TODO Auto-generated method stub
&lt;br /&gt;
System.out.println(&quot;y=a^x(mod n) x-?&quot;);
&lt;br /&gt;
&lt;br /&gt;
System.out.println(&quot;y= &quot;+args[0]);
&lt;br /&gt;
BigInteger y=new BigInteger(args[0]);
&lt;br /&gt;
&lt;br /&gt;
System.out.println(&quot;a= &quot;+args[1]);
&lt;br /&gt;
BigInteger a=new BigInteger(args[1]);
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
System.out.println(&quot;n= &quot;+args[2]);
&lt;br /&gt;
Integer n=new Integer(args[2]);
&lt;br /&gt;
&lt;br /&gt;
Shanks(y, a, n);
&lt;br /&gt;
&lt;br /&gt;
}else
&lt;br /&gt;
{
&lt;br /&gt;
System.out.println(&quot;Expecting 3 arguments to run&quot;);
&lt;br /&gt;
}
&lt;br /&gt;
}
&lt;br /&gt;
&lt;br /&gt;
public static int Shanks(BigInteger y,BigInteger a,int n)
&lt;br /&gt;
{ 
&lt;br /&gt;
&lt;br /&gt;
Hashtable&lt;integer iginteger=&quot;&quot;&gt; babySteps=new Hashtable&lt;integer biginteger=&quot;&quot;&gt;();
&lt;br /&gt;        Hashtable&lt;integer iginteger=&quot;&quot;&gt; giantSteps=new Hashtable&lt;integer biginteger=&quot;&quot;&gt;();
&lt;br /&gt;        // TODO: Prepare
&lt;br /&gt;        int result=0;
&lt;br /&gt;        
&lt;br /&gt;        int s=(int)Math.floor((( Math.sqrt(n))));
&lt;br /&gt;        
&lt;br /&gt;        BigInteger N=BigInteger.valueOf(n);
&lt;br /&gt;        
&lt;br /&gt;        System.out.print(&quot;s=&quot;);
&lt;br /&gt;        System.out.println(s);
&lt;br /&gt;        
&lt;br /&gt;        
&lt;br /&gt;        
&lt;br /&gt;        // TODO: Do baby step
&lt;br /&gt;        System.out.println(&quot;Starting baby steps,baby!:)&quot;);
&lt;br /&gt;        BigInteger temp=y;
&lt;br /&gt;        for(int i=0;i&lt;s br=&quot;&quot; i=&quot;&quot;&gt;        {
&lt;br /&gt;            BigInteger value=temp.mod(N);
&lt;br /&gt;            babySteps.put(i, value);
&lt;br /&gt;            temp=temp.multiply(a);
&lt;br /&gt;            //System.out.println(
&lt;br /&gt;                //    String.format(&quot;%d\\%d %s&quot;, i,s,value.toString()));
&lt;br /&gt;        }        
&lt;br /&gt;        
&lt;br /&gt;        
&lt;br /&gt;        // TODO: Do Giant steps
&lt;br /&gt;        System.out.println(&quot;Starting giant steps,oh my god!!!:)&quot;);
&lt;br /&gt;//        temp=a;
&lt;br /&gt;//        temp=temp.pow(s);
&lt;br /&gt;//        BigInteger temp2=temp;
&lt;br /&gt;        for(int i=0;i&lt;s br=&quot;&quot; i=&quot;&quot;&gt;        {
&lt;br /&gt;            //System.out.println(temp2.toString());
&lt;br /&gt;            temp=a.modPow(BigInteger.valueOf(s*(i+1)), N);
&lt;br /&gt;            //BigInteger value=temp;
&lt;br /&gt;            giantSteps.put((i+1)*s,temp);
&lt;br /&gt;            
&lt;br /&gt;            //temp2=temp2.multiply(temp);
&lt;br /&gt;            //System.out.println(
&lt;br /&gt;            //        String.format(&quot;%d\\%d %s&quot;, i,s,temp.toString()));
&lt;br /&gt;        }
&lt;br /&gt;        
&lt;br /&gt;        //TODO:Check giant and baby
&lt;br /&gt;        System.out.println(&quot;Comparing giant steps and baby steps&quot;);        
&lt;br /&gt;        
&lt;br /&gt;        Iterator&lt;entry iginteger=&quot;&quot; nteger=&quot;&quot;&gt;&amp;gt; set1=babySteps.entrySet().iterator();
&lt;br /&gt;        
&lt;br /&gt;        Boolean loop=true;
&lt;br /&gt;        int loopN=0;
&lt;br /&gt;        while(set1.hasNext()&amp;amp;&amp;amp; loop)
&lt;br /&gt;        {
&lt;br /&gt;            Entry&lt;integer iginteger=&quot;&quot;&gt; entry1=set1.next();
&lt;br /&gt;            Iterator&lt;entry iginteger=&quot;&quot; nteger=&quot;&quot;&gt;&amp;gt; set2=giantSteps.entrySet().iterator();
&lt;br /&gt;            //System.out.println(
&lt;br /&gt;                //    String.format(&quot;Loop %d\\%d&quot;, loopN,s)
&lt;br /&gt;                    //);
&lt;br /&gt;            while(set2.hasNext() &amp;amp;&amp;amp; loop)
&lt;br /&gt;            {
&lt;br /&gt;                
&lt;br /&gt;                Entry&lt;integer iginteger=&quot;&quot;&gt; entry2=set2.next();
&lt;br /&gt;                //BigInteger value1=entry1.getValue();
&lt;br /&gt;                //BigInteger value2=entry2.getValue();
&lt;br /&gt;                //System.out.println(
&lt;br /&gt;                //        String.format(&quot;%s - %s&quot;, value1,value2));
&lt;br /&gt;                if(entry1.getValue().equals(entry2.getValue()))
&lt;br /&gt;                {
&lt;br /&gt;                    System.out.print(&quot;Entry found:&quot;);
&lt;br /&gt;                    //System.out.println(
&lt;br /&gt;                            //String.format(&quot;r=%d st=%d&quot;, entry1.getKey(),entry2.getKey()));
&lt;br /&gt;                    result=entry2.getKey()-entry1.getKey();
&lt;br /&gt;                    System.out.println(result);
&lt;br /&gt;                    loop=false;
&lt;br /&gt;                }
&lt;br /&gt;            }
&lt;br /&gt;            loopN++;
&lt;br /&gt;        }
&lt;br /&gt;        
&lt;br /&gt;        
&lt;br /&gt;        //TODO:Testing
&lt;br /&gt;        System.out.print(&quot;Test:&quot;);
&lt;br /&gt;        if(y.equals(a.modPow(BigInteger.valueOf(result),BigInteger.valueOf(n))))
&lt;br /&gt;            System.out.println(&quot;OK&quot;);
&lt;br /&gt;        
&lt;br /&gt;        return result;
&lt;br /&gt;    }
&lt;br /&gt;}&lt;/integer&gt;&lt;/entry&gt;&lt;/integer&gt;&lt;/entry&gt;&lt;/s&gt;&lt;/s&gt;&lt;/integer&gt;&lt;/integer&gt;&lt;/integer&gt;&lt;/integer&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Часть вторая - дешифрация&lt;/span&gt;
&lt;br /&gt;
На вход подаётся найденный пароль, Р, с1, и остальные ci
&lt;br /&gt;
c1 - это первые 8 цифр из зашифрованного сообщения.
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
package Shenks;
&lt;br /&gt;
&lt;br /&gt;
import java.math.BigInteger;
&lt;br /&gt;
&lt;br /&gt;
public final class Decrypt {
&lt;br /&gt;
&lt;br /&gt;
public static String Alphabet=&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ ,.&quot;;
&lt;br /&gt;
&lt;br /&gt;
/**
&lt;br /&gt;
* @param args
&lt;br /&gt;
*/
&lt;br /&gt;
public static void main(String[] args) {
&lt;br /&gt;
System.out.println(
&lt;br /&gt;
String.format(&quot;Pass:%s&quot;, args[0])                );
&lt;br /&gt;
&lt;br /&gt;
System.out.println(
&lt;br /&gt;
String.format(&quot;c1:%s&quot;, args[2])                );
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
System.out.println(
&lt;br /&gt;
String.format(&quot;P:%s&quot;, args[1])                );
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Integer pass=new Integer(args[0]);
&lt;br /&gt;
&lt;br /&gt;
BigInteger p=new BigInteger(args[1]);
&lt;br /&gt;
&lt;br /&gt;
BigInteger c1=new BigInteger(args[2]);
&lt;br /&gt;
&lt;br /&gt;
for(int i=3;i&lt;args .length=&quot;&quot; br=&quot;&quot; i=&quot;&quot;&gt;            System.out.println(
&lt;br /&gt;                    String.format(&quot;ci:%s&quot;, args[i])                );
&lt;br /&gt;
&lt;br /&gt;        System.out.println(&quot;==DECRYPTION==&quot;);
&lt;br /&gt;        for(int i=3;i&lt;args .length=&quot;&quot; br=&quot;&quot; i=&quot;&quot;&gt;        {
&lt;br /&gt;            BigInteger c2=new BigInteger(args[i]);
&lt;br /&gt;            BigInteger m=DecryptGamal(pass,c1,c2,p);
&lt;br /&gt;            String msg=GetMessage(m.intValue());
&lt;br /&gt;            System.out.print(msg);
&lt;br /&gt;        }
&lt;br /&gt;    }
&lt;br /&gt;
&lt;br /&gt;    private static String GetMessage(Integer m) {
&lt;br /&gt;        Integer val=m;
&lt;br /&gt;        String result=&quot;&quot;;
&lt;br /&gt;        for(int i=0;i&lt;4 br=&quot;&quot; i=&quot;&quot;&gt;        {
&lt;br /&gt;            int index=val%100;
&lt;br /&gt;            result=Decrypt.Alphabet.charAt(index)+result;
&lt;br /&gt;            val=val/100;
&lt;br /&gt;        }
&lt;br /&gt;        return result;
&lt;br /&gt;    }
&lt;br /&gt;
&lt;br /&gt;    private static BigInteger DecryptGamal(Integer pass, BigInteger c1,BigInteger c2, BigInteger p) {
&lt;br /&gt;        BigInteger bigpass=p.subtract(
&lt;br /&gt;                BigInteger.valueOf((long)(pass+1)));
&lt;br /&gt;                
&lt;br /&gt;        BigInteger c1pow=c1.modPow(bigpass, p);
&lt;br /&gt;        
&lt;br /&gt;        BigInteger result=((c2.mod(p)).multiply(c1pow)).mod(p);
&lt;br /&gt;
&lt;br /&gt;        return result;
&lt;br /&gt;    }
&lt;br /&gt;}&lt;!--4--&gt;&lt;/4&gt;&lt;/args&gt;&lt;/args&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
Нахождение разшифрованного сообщения оставляю в качестве бонуса :D&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/8948676665532830718/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2010/01/blog-post.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/8948676665532830718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/8948676665532830718'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2010/01/blog-post.html' title='Взлом алгоритма Эль-Гамаль( с помощью алгоритма Шенкса) '/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4973083673024356794.post-765190405973214055</id><published>2009-12-17T14:28:00.005+02:00</published><updated>2009-12-17T14:55:50.992+02:00</updated><title type='text'>Моя работа - скандинавский аукцион :)</title><content type='html'>Всем привет :) Ни разу в блоге не писал о том, чем я занимался целых 3 месяца.&lt;br /&gt;Хотя я написал пост о интернет-коммерции, я не написал к чему он относился.&lt;br /&gt;На самом деле всё просто - я разрабатывал скандинавский аукцион.&lt;br /&gt;&lt;br /&gt;Вкратце об скандинавских аукционах:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Идея такова - есть товар. Пользователи покупают ставки допустим по рубль каждая и ставят ставки на товар. Каждый раз при ставке пользователя товар повышается в цене на 5 копеек и время до конца увеличивается на 15 секунд.Кстати начальная цена - 0 грн. Победитель аукциона - игрок, который поставил последнюю ставку. &lt;br /&gt;&lt;br /&gt;В чём выигрывает аукцион? Во первых на разнице стоимости покупки и продажи товара, как обычный магазин. Во вторых главный источник прибыли - товары, пользующие повышенным спросом. В них пользователи в сумме переплачивают за товар, т.к ставок в сумме больше, чем стоимость товара. &lt;br /&gt;&lt;br /&gt;В чём выигрывает пользователь? Во первых он не может переплатить за товар( при условии правильной игры). В случае если потрачено больше ставок, чем рыночная стоимость товара пользователь получает товар в качестве подарка. А если же пользователь выиграл - то получает товар со значительной скидкой. Так-то!&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Но теперь перейдём к тонкостям разработки. В аукционе были такие интересные мелочи как автоставки,дневной аукцион,и много чего другого. &lt;br /&gt;&lt;br /&gt;Проект был реализован на ASP.NET. Многие говорят что АСП пишет много лишнего кода в проект, но на мой взгляд это всё зависит от рук программиста. После того как я убрал Debug=&#39;true&#39; в конфиге в сайте осталось буквально 5-6 специфических АСП строк. Зато ASP.NET значительно упрощает использование AJAX-а. А в данном случае без AJAX обойтись было просто невозможно.&lt;br /&gt;&lt;br /&gt;Конкретно без AJAX-а нельзя было бы делать ставки, постоянно проверять обновление состоянния лотов. &lt;br /&gt;&lt;br /&gt;Для визуальных эффектов( как например подмигивание лота при изменении лидера ) была использована ныне популярная и мне любимая библиотека jQuery. &lt;br /&gt;&lt;br /&gt;В качестве БД аукциона использовалась MSSQL. Аукцион работает на выделенном сервере. К сожалению функционал ASP.NET не даёт аналога CRON-а. По крайней мере насколько мне известно. &lt;span style=&quot;font-weight:bold;&quot;&gt;Если аналог действительно существует - то очень, очень хотелось бы знать как реализовать на стандартном хостинге подобное.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Автоставка - ставка, которая выполняется автоматически если до конца аукциона осталось менее 10 секунд. Подобный функционал требовал создания скрипта, который проверял бы факт действия автоставки и делал бы автоставку автоматически. Именно изза скрипта пришлось использовать выделенный сервер.&lt;br /&gt;&lt;br /&gt;Аукцион был запущен уже 1 месяц назад,но я не хотел спешить писать в блоге. Чтоб не зглазили.:)&lt;br /&gt;Вообщем этим постом я просто хотел немного похвастатся и может услышать советы/критику по отношению к проделанной работе :)&lt;br /&gt;&lt;br /&gt;ЗЫ: Аукцион можно найти по адресу &lt;a href=&quot;http://www.tak-tik.com.ua&quot;&gt;www.tak-tik.com.ua&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;mr-kody.blogspot.com&quot;&gt;mr-kody.blogspot.com&lt;/a&gt;&lt;/div&gt;</content><link rel='enclosure' type='text/html' href='http://www.tak-tik.com.ua' length='0'/><link rel='replies' type='application/atom+xml' href='http://mr-kody.blogspot.com/feeds/765190405973214055/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://mr-kody.blogspot.com/2009/12/blog-post.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/765190405973214055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4973083673024356794/posts/default/765190405973214055'/><link rel='alternate' type='text/html' href='http://mr-kody.blogspot.com/2009/12/blog-post.html' title='Моя работа - скандинавский аукцион :)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/11177578010046735198</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry></feed>