<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><!-- generator="wordpress/2.2.1" --><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Victor Laskin's Blog</title>
	<link>http://vitiy.info</link>
	<description>Блог посвящен программированию, в частности: С++, QT, .Net/WPF, SQL, ...</description>
	<pubDate>Fri, 30 Dec 2011 10:41:52 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/VictorLaskinsBlog" /><feedburner:info uri="victorlaskinsblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Новогодний скринсейвер-открытка 2012</title>
		<link>http://feedproxy.google.com/~r/VictorLaskinsBlog/~3/CJZcRk1oLI4/</link>
		<comments>http://vitiy.info/?p=52#comments</comments>
		<pubDate>Fri, 30 Dec 2011 10:41:52 +0000</pubDate>
		<dc:creator>Victor Laskin</dc:creator>
		
		<category><![CDATA[OpenGL]]></category>

		<category><![CDATA[QT]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vitiy.info/?p=52</guid>
		<description><![CDATA[
Давно я не писал в блог - но есть хороший повод! Чтобы качественно поздравить всех с новым годом, я написал новогодний скринсейвер-открытку (QT OpenGl). Для запуска необходима не древняя видеокарта и монитор побольше. Happy new year 2012!
Скачать ~10Mb
]]></description>
			<content:encoded><![CDATA[<p><img src="http://vitiy.info/Pics/screen400.jpg" onmouseout="undefined" onmouseover="undefined" title="undefined" height="252" width="400" alt="Happy ney year 2012 screensaver" /></p>
<p>Давно я не писал в блог - но есть хороший повод! Чтобы качественно поздравить всех с новым годом, я написал новогодний скринсейвер-открытку (QT OpenGl). Для запуска необходима не древняя видеокарта и монитор побольше. Happy new year 2012!</p>
<p><a href="http://vitiy.info/hny2012.exe">Скачать</a> ~10Mb</p>
]]></content:encoded>
			<wfw:commentRss>http://vitiy.info/?feed=rss2&amp;p=52</wfw:commentRss>
		<feedburner:origLink>http://vitiy.info/?p=52</feedburner:origLink></item>
		<item>
		<title>Защита от спама в блогах</title>
		<link>http://feedproxy.google.com/~r/VictorLaskinsBlog/~3/dWnvhR08DNY/</link>
		<comments>http://vitiy.info/?p=51#comments</comments>
		<pubDate>Sun, 14 Sep 2008 08:56:05 +0000</pubDate>
		<dc:creator>Victor Laskin</dc:creator>
		
		<category><![CDATA[Блог]]></category>

		<guid isPermaLink="false">http://vitiy.info/?p=51</guid>
		<description><![CDATA[&#8220;2$ за 13 комментов&#8221; вынудили поставить комментарии на премодерацию. Но когда стало приходить по спам 10 комментов в день пришлось еще подправить код блога.
Как же защититься от спама? Первый уровень защиты - против автоматических рассылок. Достаточно чуть-чуть модифицировать форму, в которой пользователь оставляет комментарий. Например, добавить галочку &#8220;Я не бот&#8221;, отключенную по умолчанию. Или поставить [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;<a href="http://blog.micromarketing.ru/uncategorised/spammers-suck/">2$ за 13 комментов</a>&#8221; вынудили поставить комментарии на премодерацию. Но когда стало приходить по спам 10 комментов в день пришлось еще подправить код блога.</p>
<p>Как же защититься от спама? Первый уровень защиты - против автоматических рассылок. Достаточно чуть-чуть модифицировать форму, в которой пользователь оставляет комментарий. Например, добавить галочку &#8220;Я не бот&#8221;, отключенную по умолчанию. Или поставить плагинчик с капчей. Это сразу отсечет весь автоматический спам, но не поможет против ручного спама.</p>
<p>Я решил вместо капчи поставить вопросик, на который быстро может ответить любой программер. Посмотрим насколько это поможет.</p>
<p>Интересно, что большинство владельцев сайтов даже не знают каким способом их раскручивают (<a href="http://habrahabr.ru/blogs/stand_alone/28506/">75% владельцев сайтов не знают, что их раскручивают спамом в блогах</a>). Бизнес, однако. И дальше будет только хуже&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://vitiy.info/?feed=rss2&amp;p=51</wfw:commentRss>
		<feedburner:origLink>http://vitiy.info/?p=51</feedburner:origLink></item>
		<item>
		<title>Курсы доллара и евро: гаджет для висты</title>
		<link>http://feedproxy.google.com/~r/VictorLaskinsBlog/~3/Ak_sgpO0knk/</link>
		<comments>http://vitiy.info/?p=50#comments</comments>
		<pubDate>Fri, 05 Sep 2008 10:30:57 +0000</pubDate>
		<dc:creator>Victor Laskin</dc:creator>
		
		<category><![CDATA[Полезные программы]]></category>

		<category><![CDATA[SilverLight]]></category>

		<category><![CDATA[WPF (.Net 3.0)]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vitiy.info/?p=50</guid>
		<description><![CDATA[Давненько хотел написать какой нить гаджет для висты. Изначально хотел сделать это на WPF, но выяснилось что к гаджетам у микрософта другой подход. Посути гаджет - это html веб страница со всеми вытекающим. Поэтому только xbap или silverlight можно засунуть в гаджет (причем стало это можно сделать относительно недавно).
Посмотрев в каталоге гаджетов, гаджеты, которые показывают [...]]]></description>
			<content:encoded><![CDATA[<p>Давненько хотел написать какой нить гаджет для висты. Изначально хотел сделать это на WPF, но выяснилось что к гаджетам у микрософта другой подход. Посути гаджет - это html веб страница со всеми вытекающим. Поэтому только xbap или silverlight можно засунуть в гаджет (причем стало это можно сделать относительно недавно).</p>
<p>Посмотрев в каталоге гаджетов, гаджеты, которые показывают курс валют, и не найдя там ничего интересного, я решил написать свой монитор курсов. У нашего центрабанка есть прекрасный веб сервис, который предоставляет всю информацию о курсах валют за любой период.</p>
<p>Попытка использовать сильверлайт закончилась неудачно. Во первых, под 64-битной вистой сильверлайт не работает в 64-битном сайдбаре. Это можно обойти, запуская 32-ух битную версию сайдбара, но это уже извращение. Во вторых, из сильверлайта в гаджете нельзя нормально обратиться к вебсервису. Это связано с тем, что сильверлайт в гаджете не видит конфигурационных xml файлов и не может получить доступ. Есть workaround, который передает данные в сильверлайт контрол через скрипт AJAX, но я считаю это не очень красивым. </p>
<p>В итоге я сделал проще - гаджет просто показывает картинку с вебсервера, обновляя ее раз в час. А на сервере работает php скрипт по крону, который запрашивает данные у центробанка. Гаджет показывает текущий курс бакса и евро, на сколько он изменился за день и за неделю и график динамики курсов за 3 недели. </p>
<p><img src="http://vitiy.info/Currency/currencyRates.png" onmouseout="undefined" onmouseover="undefined" alt="Гаджет курса валют ЦБ для висты" width="130" height="135" title="undefined" /></p>
<p><a href="http://vitiy.info/Currency/CurrencyRates.gadget">Скачать гаджет</a><a href="http://vitiy.info/Currency/CurrencyRates.gadget"></a></p>
<p>Просто запустите скаченный файл, и гаджет установится. Если этого не произойдет и он откроется как зип архив, то можно на гаджете нажaть Open with&#8230; Sidebar. Если и это не поможет, то можно создать папку C:\Users\Ваше имя\AppData\Local\Microsoft\Windows Sidebar\Gadgets\CurrencyRates.gadget\ и в нее скопировать содержимое архива. </p>
]]></content:encoded>
			<wfw:commentRss>http://vitiy.info/?feed=rss2&amp;p=50</wfw:commentRss>
		<feedburner:origLink>http://vitiy.info/?p=50</feedburner:origLink></item>
		<item>
		<title>Новый браузер от гуугла: Chrome</title>
		<link>http://feedproxy.google.com/~r/VictorLaskinsBlog/~3/dPAiLOMr8Uw/</link>
		<comments>http://vitiy.info/?p=49#comments</comments>
		<pubDate>Wed, 03 Sep 2008 09:36:40 +0000</pubDate>
		<dc:creator>Victor Laskin</dc:creator>
		
		<category><![CDATA[Полезные программы]]></category>

		<guid isPermaLink="false">http://vitiy.info/?p=49</guid>
		<description><![CDATA[ 
Гуугл порадовал выпуском нового браузера, который просто обязан потеснить осла и файрфокс на компьютерах продвинутых пользователей. 
Главное достоинство - скорость:
 
На графике скорость исполнения различных тестов JavaScript (источник). 
Кроме того приятный дизайн, удобные вкладки, запуск каждой страницы в песочнице, режим инкогнито, удобная стартовая страница как в опере. Стоит отметить, что бета уже достаточно стабильна. 
]]></description>
			<content:encoded><![CDATA[<p><img src="http://vitiy.info/Pics/chromeLogo.jpg" onmouseout="undefined" onmouseover="undefined" width="80" height="60" title="undefined" /> </p>
<p>Гуугл порадовал выпуском нового браузера, который просто обязан потеснить осла и файрфокс на компьютерах продвинутых пользователей. </p>
<p>Главное достоинство - скорость:</p>
<p><img src="http://vitiy.info/Pics/Chrome_test.jpg" onmouseout="undefined" onmouseover="undefined" title="undefined" /> </p>
<p>На графике скорость исполнения различных тестов JavaScript (<a href="http://www.astera.ru/software/?id=61084">источник</a>). </p>
<p>Кроме того приятный дизайн, удобные вкладки, запуск каждой страницы в песочнице, режим инкогнито, удобная стартовая страница как в опере. Стоит отметить, что бета уже достаточно стабильна. </p>
]]></content:encoded>
			<wfw:commentRss>http://vitiy.info/?feed=rss2&amp;p=49</wfw:commentRss>
		<feedburner:origLink>http://vitiy.info/?p=49</feedburner:origLink></item>
		<item>
		<title>Релиз .NET Framework 3.5SP1 и VS2008 SP1</title>
		<link>http://feedproxy.google.com/~r/VictorLaskinsBlog/~3/fqySZgzsRbc/</link>
		<comments>http://vitiy.info/?p=48#comments</comments>
		<pubDate>Thu, 14 Aug 2008 14:03:43 +0000</pubDate>
		<dc:creator>Victor Laskin</dc:creator>
		
		<category><![CDATA[WPF (.Net 3.0)]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vitiy.info/?p=48</guid>
		<description><![CDATA[Состоялся релиз сервис пака .NET Framework 3.5SP1 и VS2008 SP1.
Доступны они тут.
The .NET Framework 3.5 SP1 delivers:
* Performance increases between 20-45% for WPF-based applications – without having to change any code
* WCF improvements that give developers more control over the way they access data and services
* Streamlined installation experience for client applications
* Improvements in the [...]]]></description>
			<content:encoded><![CDATA[<p>Состоялся релиз сервис пака .NET Framework 3.5SP1 и VS2008 SP1.</p>
<p>Доступны они <a href="http://msdn.microsoft.com/en-us/vstudio/products/cc533447.aspx">тут</a>.</p>
<blockquote><p>The .NET Framework 3.5 SP1 delivers:<br />
* Performance increases between 20-45% for WPF-based applications – without having to change any code<br />
* WCF improvements that give developers more control over the way they access data and services<br />
* Streamlined installation experience for client applications<br />
* Improvements in the area of data platform, such as the ADO.NET Entity Framework, ADO.NET Data Services and support for SQL Server 2008’s new features</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://vitiy.info/?feed=rss2&amp;p=48</wfw:commentRss>
		<feedburner:origLink>http://vitiy.info/?p=48</feedburner:origLink></item>
		<item>
		<title>Как сделать чтоб WPF Popup был не поверх всех окон (или Win32 API живет до сих пор)</title>
		<link>http://feedproxy.google.com/~r/VictorLaskinsBlog/~3/P0oON-IiS8U/</link>
		<comments>http://vitiy.info/?p=47#comments</comments>
		<pubDate>Sat, 28 Jun 2008 08:21:15 +0000</pubDate>
		<dc:creator>Victor Laskin</dc:creator>
		
		<category><![CDATA[WPF (.Net 3.0)]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vitiy.info/?p=47</guid>
		<description><![CDATA[Уже несколько раз подряд за последние дни упираюсь в &#8220;пределы&#8221; WPF. Причём задачи были отнюдь не экзотические.
Класс Popup генерирует окно, которое располагается поверх всех окон в системе. Если вы хотите изменить это вам поможет только Win32 API:
[DllImport(&#8220;user32&#8243;, EntryPoint = &#8220;SetWindowPos&#8221;)]
private static extern int SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int cx, int cy, [...]]]></description>
			<content:encoded><![CDATA[<p>Уже несколько раз подряд за последние дни упираюсь в &#8220;пределы&#8221; WPF. Причём задачи были отнюдь не экзотические.</p>
<p>Класс <strong>Popup</strong> генерирует окно, которое располагается поверх всех окон в системе. Если вы хотите изменить это вам поможет только Win32 API:</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span>[</span><span style="color: #2b91af">DllImport</span><span>(</span><span style="color: #a31515">&#8220;user32&#8243;</span><span>, EntryPoint = </span><span style="color: #a31515">&#8220;SetWindowPos&#8221;</span><span>)]</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">private</span><span> </span><span style="color: #0000ff">static</span><span> </span><span style="color: #0000ff">extern</span><span> </span><span style="color: #0000ff">int</span><span> SetWindowPos(</span><span style="color: #2b91af">IntPtr</span><span> hwnd, </span><span style="color: #2b91af">IntPtr</span><span> hwndInsertAfter, </span><span style="color: #0000ff">int</span><span> x, </span><span style="color: #0000ff">int</span><span> y, </span><span style="color: #0000ff">int</span><span> cx, </span><span style="color: #0000ff">int</span><span> cy, </span><span style="color: #2b91af">UInt32</span><span> wFlags);</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">&nbsp;</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">const</span><span> </span><span style="color: #2b91af">UInt32</span><span> SWP_NOSIZE = 0&#215;0001;</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">const</span><span> </span><span style="color: #2b91af">UInt32</span><span> SWP_NOMOVE = 0&#215;0002;</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">const</span><span> </span><span style="color: #2b91af">UInt32</span><span> SWP_NOACTIVATE = 0&#215;0010;</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">static</span><span> </span><span style="color: #0000ff">readonly</span><span> </span><span style="color: #2b91af">IntPtr</span><span> HWND_BOTTOM = </span><span style="color: #0000ff">new</span><span> </span><span style="color: #2b91af">IntPtr</span><span>(1);</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">static</span><span> </span><span style="color: #0000ff">readonly</span><span> </span><span style="color: #2b91af">IntPtr</span><span> HWND_TOP = </span><span style="color: #0000ff">new</span><span> </span><span style="color: #2b91af">IntPtr</span><span>(0);</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">&nbsp;</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">public</span><span> </span><span style="color: #0000ff">static</span><span> </span><span style="color: #0000ff">void</span><span> Popup_SetZOrderTop(</span><span style="color: #2b91af">Popup</span><span> pop)</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">{</p>
<p style="margin: 0pt; text-indent: 20px; font-family: Courier New; font-size: 13.3333px"><span style="color: #2b91af">IntPtr</span><span> hwnd = ((</span><span style="color: #2b91af">HwndSource</span><span>)</span><span style="color: #2b91af">PresentationSource</span><span>.FromVisual(pop.Child)).Handle;</span></p>
<p style="margin: 0pt; text-indent: 20px; font-family: Courier New; font-size: 13.3333px">SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">}</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">&nbsp;</p>
<p>С помощью этой функции также можно регулировать какое из окон находиться наверху в данный момент.</p>
<p>Получение текущих координат мыши в WPF возможно только с указанием контрола, относительно которого вам нужны эти координаты. А что делать если этот самый контрол нужно двигать?</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">public</span><span> </span><span style="color: #0000ff">struct</span><span> </span><span style="color: #2b91af">POINT</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">{</p>
<p style="margin: 0pt; text-indent: 20px; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">public</span><span> </span><span style="color: #0000ff">int</span><span> x;</span></p>
<p style="margin: 0pt; text-indent: 20px; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">public</span><span> </span><span style="color: #0000ff">int</span><span> y;</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">};</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">&nbsp;</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">[<span style="color: #2b91af">DllImport</span><span>(</span><span style="color: #a31515">&#8220;user32.dll&#8221;</span><span>)]</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">static</span><span> </span><span style="color: #0000ff">extern</span><span> </span><span style="color: #0000ff">bool</span><span> GetCursorPos(</span><span style="color: #0000ff">out</span><span> </span><span style="color: #2b91af">POINT</span><span> point);</span></p>
<p>Еще пара полезных функций (поиск окна и получение его положения):</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span>[</span><span style="color: #2b91af">DllImport</span><span>(</span><span style="color: #a31515">&#8220;user32.dll&#8221;</span><span>, SetLastError = </span><span style="color: #0000ff">true</span><span>)]</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">static</span><span> </span><span style="color: #0000ff">extern</span><span> </span><span style="color: #2b91af">IntPtr</span><span> FindWindow(</span><span style="color: #0000ff">string</span><span> lpClassName, </span><span style="color: #0000ff">string</span><span> lpWindowName);</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">&nbsp;</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">[<span style="color: #2b91af">DllImport</span><span>(</span><span style="color: #a31515">&#8220;user32.dll&#8221;</span><span>)]</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">static</span><span> </span><span style="color: #0000ff">extern</span><span> </span><span style="color: #0000ff">bool</span><span> GetWindowRect(</span><span style="color: #2b91af">IntPtr</span><span> hWnd, </span><span style="color: #0000ff">out</span><span> </span><span style="color: #2b91af">RECT</span><span> lpRect);</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">&nbsp;</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">public</span><span> </span><span style="color: #0000ff">struct</span><span> </span><span style="color: #2b91af">RECT</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">{</p>
<p style="margin: 0pt; text-indent: 20px; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">public</span><span> </span><span style="color: #0000ff">int</span><span> left;</span></p>
<p style="margin: 0pt; text-indent: 20px; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">public</span><span> </span><span style="color: #0000ff">int</span><span> top;</span></p>
<p style="margin: 0pt; text-indent: 20px; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">public</span><span> </span><span style="color: #0000ff">int</span><span> right;</span></p>
<p style="margin: 0pt; text-indent: 20px; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">public</span><span> </span><span style="color: #0000ff">int</span><span> bottom;</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">};</p>
]]></content:encoded>
			<wfw:commentRss>http://vitiy.info/?feed=rss2&amp;p=47</wfw:commentRss>
		<feedburner:origLink>http://vitiy.info/?p=47</feedburner:origLink></item>
		<item>
		<title>Правильная локализация</title>
		<link>http://feedproxy.google.com/~r/VictorLaskinsBlog/~3/mbOCxMNMA6E/</link>
		<comments>http://vitiy.info/?p=46#comments</comments>
		<pubDate>Sat, 07 Jun 2008 15:45:21 +0000</pubDate>
		<dc:creator>Victor Laskin</dc:creator>
		
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vitiy.info/?p=46</guid>
		<description><![CDATA[Водится за мной такой недостаток, люблю изобрести велосипед&#8230; Временами это плохо отражается на результате, но ничего не могу с собой поделать. С другой стороны, иногда, велосипед дорабатывается до мощного мотоцикла&#8230;
Недавно делал локализацию (поддержку многих языков в приложении) и понял что делал ее неверно, даже несмотря на то что с самого начала разработки софта продумал как [...]]]></description>
			<content:encoded><![CDATA[<p>Водится за мной такой недостаток, люблю изобрести велосипед&#8230; Временами это плохо отражается на результате, но ничего не могу с собой поделать. С другой стороны, иногда, велосипед дорабатывается до мощного мотоцикла&#8230;</p>
<p>Недавно делал локализацию (поддержку многих языков в приложении) и понял что делал ее неверно, даже несмотря на то что с самого начала разработки софта продумал как она будет сделана. Казалось бы, что может быть проще, но только теперь для меня стало понятно как она должна выглядеть. Можно уложить это в небольшой список рекомендаций:</p>
<p>Структура:</p>
<ol>
<li>Локализованные (переведённые) строки должны храниться во внешнем файле открытого формата (txt или xml например)</li>
<li>Новый язык нужно мочь подключать без перекомпиляции кода</li>
<li>Приложение должно уметь на любом этапе исполнения переключать язык, перечитать строки из файла и &#8220;перерисовать&#8221; весь интерфейс</li>
<li>Любая функция по выводу текста должна вызывать функцию вида GetLocalText(string Token), где токен - идентификатор выводимой строчки</li>
<li><em>Необязательно</em>: Хорошо бы разбить строки по группам и написать маленькую утилитку для их быстрого редактирования и перевода.</li>
</ol>
<p>Для чего все это нужно, если есть стандартные методы локализации? Не вижу смысла в файлах ресурсов, в формате непонятном простым смертным пользователям, которые могут захотеть перевести ваш продукт на свой язык. Любой пользователь должен уметь перевести интерфейс и видеть изменения, которые он делает, сразу в интерфейсе, без перекомпиляции и перезапусков. Конечно лучше воспользоваться услугами профессиональных переводчиков, но это не всегда реально.</p>
<p>Актуальны еще рекомендации по языку ресурсных строчек, которые можно найти в MSDN.</p>
<p>Язык:</p>
<ol>
<li>Не разбивайте фразы на куски, переводчику будет трудно понять как именно эти куски переводить</li>
<li>Аналогично нельзя использовать отдельно многозначные термины или слова, которые могут быть глаголом и существительным одновременно</li>
<li>Учтите, что при переводе размер надписей может увеличиться процентов на 50-75%. Это самая существенная проблема в компактных интерфейсах.</li>
</ol>
<p>Эти проблемы как раз и призвана решить возможность оперативного просмотра результатов своей работы переводчиком.</p>
]]></content:encoded>
			<wfw:commentRss>http://vitiy.info/?feed=rss2&amp;p=46</wfw:commentRss>
		<feedburner:origLink>http://vitiy.info/?p=46</feedburner:origLink></item>
		<item>
		<title>Сортировка директорий на C#</title>
		<link>http://feedproxy.google.com/~r/VictorLaskinsBlog/~3/ZONHTEnr3kY/</link>
		<comments>http://vitiy.info/?p=45#comments</comments>
		<pubDate>Sun, 01 Jun 2008 12:18:30 +0000</pubDate>
		<dc:creator>Victor Laskin</dc:creator>
		
		<category><![CDATA[.Net 2.0]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vitiy.info/?p=45</guid>
		<description><![CDATA[Оказывается метод, который возвращает список директорий (GetDirectories) иногда может их не сортировать. Вроде как это происходит на винтах под FATом. Поэтому если Вы где-то визуализируете список директорий, то рекомендую Вам вставить туда алгоритм ручной сортировки, ибо сделать это легко с помощью Array.Sort:
DirectoryInfo[] dirs = dir.GetDirectories();
        
//Сортировочка:
Array.Sort(dirs, 0, dirs.Length, new DirectorySort());
Сам принцип сортировки нужно оформить ввиде класса [...]]]></description>
			<content:encoded><![CDATA[<p>Оказывается метод, который возвращает список директорий (<strong>GetDirectories</strong>) иногда может их не сортировать. Вроде как это происходит на винтах под FATом. Поэтому если Вы где-то визуализируете список директорий, то рекомендую Вам вставить туда алгоритм ручной сортировки, ибо сделать это легко с помощью <strong>Array.Sort</strong>:</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #2b91af">DirectoryInfo</span><span>[] dirs = dir.GetDirectories();</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span>        </span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #008000">//</span><span style="color: #008000">Сортировочка</span><span style="color: #008000">:</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #2b91af">Array</span><span>.Sort(dirs, 0, dirs.Length, </span><span style="color: #0000ff">new</span><span> </span><span style="color: #2b91af">DirectorySort</span><span>());</span></p>
<p>Сам принцип сортировки нужно оформить ввиде класса реализующего интерфейс IComparer:</p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span style="color: #0000ff">  </span><span style="color: #0000ff">class</span><span> </span><span style="color: #2b91af">DirectorySort</span><span> : System.Collections.</span><span style="color: #2b91af">IComparer</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span>  {</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span>    </span><span style="color: #0000ff">public</span><span> </span><span style="color: #0000ff">int</span><span> Compare(</span><span style="color: #0000ff">object</span><span> x, </span><span style="color: #0000ff">object</span><span> y)</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span>    {</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span>      </span><span style="color: #2b91af">DirectoryInfo</span><span> d1 = x </span><span style="color: #0000ff">as</span><span> </span><span style="color: #2b91af">DirectoryInfo</span><span>;</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span>      </span><span style="color: #2b91af">DirectoryInfo</span><span> d2 = y </span><span style="color: #0000ff">as</span><span> </span><span style="color: #2b91af">DirectoryInfo</span><span>;</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span>      </span><span style="color: #0000ff">return</span><span> </span><span style="color: #2b91af">String</span><span>.Compare(d1.Name, d2.Name, </span><span style="color: #0000ff">true</span><span>, </span><span style="color: #2b91af">CultureInfo</span><span>.CurrentCulture);</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span>    }</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px"><span>  }</span></p>
<p style="margin: 0pt; font-family: Courier New; font-size: 13.3333px">&nbsp;</p>
<p>Сортировка тут не различает заглавные-прописные буквы и учитывает <strong>CurrentCulture</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://vitiy.info/?feed=rss2&amp;p=45</wfw:commentRss>
		<feedburner:origLink>http://vitiy.info/?p=45</feedburner:origLink></item>
		<item>
		<title>Вышла бета Service Pack 1 к .NET 3.5 и Visual Studio 2008</title>
		<link>http://feedproxy.google.com/~r/VictorLaskinsBlog/~3/bQ41KyuQZq4/</link>
		<comments>http://vitiy.info/?p=44#comments</comments>
		<pubDate>Tue, 13 May 2008 19:29:15 +0000</pubDate>
		<dc:creator>Victor Laskin</dc:creator>
		
		<category><![CDATA[WPF (.Net 3.0)]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vitiy.info/?p=44</guid>
		<description><![CDATA[Вышла бета .NET 3.5 Service Pack 1 и Visual Studio 2008, скачать можно тут.
О нововведениях можно почитать тут. Обещаться большой прирост скорости холодной загрузки приложений, а также общей скорости работы WPF, рендеринга текста и битмап-эффектов. Также интересна прямая поддержка DirectX и шейдерных эффектов под WPF. Причём воспользоваться этими эффектами будет легко. Например, код

добавит под кнопку [...]]]></description>
			<content:encoded><![CDATA[<p>Вышла бета .NET 3.5 <strong>Service Pack 1</strong> и Visual Studio 2008, скачать можно <a href="http://msdn.microsoft.com/en-us/vstudio/products/cc533447.aspx">тут</a>.</p>
<p>О нововведениях можно почитать <a href="http://weblogs.asp.net/scottgu/archive/2008/05/12/visual-studio-2008-and-net-framework-3-5-service-pack-1-beta.aspx">тут</a>. Обещаться большой прирост скорости холодной загрузки приложений, а также общей скорости работы WPF, рендеринга текста и битмап-эффектов. Также интересна прямая поддержка DirectX и шейдерных эффектов под WPF. Причём воспользоваться этими эффектами будет легко. Например, код</p>
<p><img src="http://vitiy.info/Pics/WpfShaders1.png" /></p>
<p>добавит под кнопку аппаратную тень:</p>
<p><img src="http://vitiy.info/Pics/wpfShaders2.png" /></p>
<p>Еще одна новая возможность заслуживает особого внимания - New .NET Framework Client Profile Setup Package. Это возможность создать компактный дистрибутив для машин, на которых не установлен .Net Framework, в котором будут содержаться только нужные части фреймворка:</p>
<p><img src="http://vitiy.info/Pics/wpfPartialSetup.jpg" /></p>
<p>Также много чего нового для удобства разработки веб приложений и работы с данными (ADO.NEТ Entity framework и ADO.NET Data Services).</p>
<p>Обещано, что это последняя бета и релиз совсем скоро.</p>
]]></content:encoded>
			<wfw:commentRss>http://vitiy.info/?feed=rss2&amp;p=44</wfw:commentRss>
		<feedburner:origLink>http://vitiy.info/?p=44</feedburner:origLink></item>
		<item>
		<title>Новая CUDA и конкурс разработчиков</title>
		<link>http://feedproxy.google.com/~r/VictorLaskinsBlog/~3/20yTgwDHTEM/</link>
		<comments>http://vitiy.info/?p=43#comments</comments>
		<pubDate>Mon, 12 May 2008 07:59:27 +0000</pubDate>
		<dc:creator>Victor Laskin</dc:creator>
		
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://vitiy.info/?p=43</guid>
		<description><![CDATA[Оказалось, что совсем недавно вышла новая версия (Beta 2.0) технологии CUDA от NVIDIA. Эта технология позволяет использовать мощности графического ядра видеокарт серии geforce 8&#215;00 и выше для математических расчётов. При этом алгоритмы, которые допускают распараллеливание, могут показать огромный выигрышь в производительности.

До недавнего релиза эта технология проходила мимо меня, так как просто не работала под 64-х [...]]]></description>
			<content:encoded><![CDATA[<p>Оказалось, что совсем недавно вышла новая версия (Beta 2.0) технологии CUDA от NVIDIA. Эта технология позволяет использовать мощности графического ядра видеокарт серии geforce 8&#215;00 и выше для математических расчётов. При этом алгоритмы, которые допускают распараллеливание, могут показать огромный выигрышь в производительности.</p>
<p><img src="http://vitiy.info/Pics/cuda.jpg" title="Cuda" alt="Cuda" width="435" height="248" /></p>
<p>До недавнего релиза эта технология проходила мимо меня, так как просто не работала под 64-х битной Вистой. Но вот наконец она заработала и я поставил себе новые дровишки, cuda sdk и cuda toolkit. Я хотел прикрутить ее к своему проекту по обработке фото <a href="http://perfectphotos.ru/">PerfectPhotos</a>. Но, к сожалению, оказалось, что драйвера еще сыроваты и начали спонтанно перезапускаться в один прекрасный момент (когда я даже не работал с cuda), а потом дело дошло и до синего экрана, что под вистой является большой редкостью (лично у меня).</p>
<p>А тем временем NVIDIA и iXBT проводят <a href="http://cuda.ixbt.com/">конкурс</a> для разработчиков (об этом я узнал <a href="http://blog.lexa.ru/2008/05/06/cuda_konkurs_razrabotchikov.html">тут</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://vitiy.info/?feed=rss2&amp;p=43</wfw:commentRss>
		<feedburner:origLink>http://vitiy.info/?p=43</feedburner:origLink></item>
	</channel>
</rss>

