<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msug.vn.ua/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Human-programmer beeing</title><subtitle type="html" /><id>http://msug.vn.ua/blogs/lexremablog/atom.aspx</id><link rel="alternate" type="text/html" href="http://msug.vn.ua/blogs/lexremablog/default.aspx" /><link rel="self" type="application/atom+xml" href="http://msug.vn.ua/blogs/lexremablog/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.30929.2835">Community Server</generator><updated>2009-03-25T17:56:00Z</updated><entry><title>Слежение за объектом по его цвету с использованием Aforge.NET</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2010/06/29/aforge-net.aspx" /><id>/blogs/lexremablog/archive/2010/06/29/aforge-net.aspx</id><published>2010-06-29T14:53:00Z</published><updated>2010-06-29T14:53:00Z</updated><content type="html">&lt;p&gt;Здравствуйте. В этом посте хочу вам рассказать о своем небольшом проекте по отслеживанию объекта по его цвету. Сейчас это имеет довольно широкую область применения, например те же джойстики от Wii и Playstation 3. Основой для работы послужила разработка Андрея Кириллова Aforge.NET &amp;ndash; довольно мощная штука для самопальной обработки изображений.&lt;/p&gt;
&lt;div class="content"&gt;&lt;/div&gt;
&lt;p&gt;Код не претендует на &amp;laquo;истину в последней инстанции&amp;raquo;, многое было упрощено (в одном месте, в некотором смысле даже допущено дублирование &amp;ndash; для быстрого доступа к пикселам я создал свой класс, хотя аналогичные наработки были и в Aforge). Но тем не менее, код работает, отслеживает объект, выдает информацию о местоположении, позволяет динамически вычислять оттенок объекта (на случай изменения освещения).&lt;/p&gt;
&lt;h3 class="content"&gt;&lt;b&gt;Небольшой экскурс в AForge&lt;/b&gt;&lt;/h3&gt;
&lt;p class="content"&gt;Фреймворк представляет собой набор библиотек, каждая из которых предназначена для решения определенного рода задач:&lt;/p&gt;
&lt;h3 class="content"&gt;
&lt;/h3&gt;
&lt;div class="content"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;AForge.Imaging&lt;/b&gt;&amp;nbsp;&amp;ndash; библиотека с фильтрам и расчетами для обработки изображений;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AForge.Vision&lt;/b&gt;&amp;nbsp;&amp;ndash; библиотека машинного зрения;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AForge.Neuro&lt;/b&gt;&amp;nbsp;&amp;ndash; библиотека для работы с нейронными сетями;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AForge.Geneti&lt;/b&gt;c &amp;ndash; библиотека для работы с генетическими алгоритмами;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AForge.Fuzzy&lt;/b&gt;&amp;nbsp;&amp;ndash; библиотека нечетких вычислений;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AForge.MachineLearning&lt;/b&gt;&amp;nbsp;&amp;ndash; библиотека для машинного обучения;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AForge.Robotics&lt;/b&gt;&amp;nbsp;&amp;ndash; библиотека, предоставляющая подержу некоторых Robotics kits;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AForge.Video&lt;/b&gt;&amp;nbsp;&amp;ndash; набор библиотек для обработки видео.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="content"&gt;
В комплекте с библиотеками идет набор примеров. &lt;/div&gt;
&lt;h3 class="content"&gt;Пользовательский интерфейс
&lt;/h3&gt;
&lt;p&gt;Свой проект я не писал с нуля, за основу взял пример Vision\MotionDetector. Он уже умеет подключаться к веб камере, удаленной веб камере (через JPEG, MJPEG url), а так же открывать определенные видео файлы (с чем, признаюсь, не экспериментировал):&lt;/p&gt;
&lt;p class="content"&gt;&lt;img src="http://img375.imageshack.us/img375/5395/image1t.png" alt="image" /&gt;&lt;/p&gt;
&lt;p class="content"&gt;Оригинальный пример умеет идентифицировать движение на потоке по нескольким алгоритмам, простейшим из которых является нахождение разницы между двумя последовательными кадрами.&lt;/p&gt;
&lt;p&gt;Код формы был обработан напильником, и заточен конкретно под задачу. На вкладке Motion нужно выбрать алгоритм поиска объекта:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img710.imageshack.us/img710/2408/image2zd.png" alt="image" /&gt;&lt;/p&gt;
&lt;p&gt;После чего выбрать объект через Define color tracking object форму:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img63.imageshack.us/img63/9282/image3bq.png" alt="image" /&gt;&lt;/p&gt;
&lt;p&gt;Информация о объекте будет отображаться в статус баре главной формы:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img20.imageshack.us/img20/160/image4rv.png" alt="image" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Как дополнительная настройка предусмотрен color difference threshold &amp;ndash; возможность не отслеживать единый цвет, а учитывать его вариации:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img819.imageshack.us/img819/3656/image5p.png" alt="image" /&gt;&lt;/p&gt;
&lt;p&gt;Также дополнительно пользователь может указать, хочет ли он, чтобы цвет объекта также отслеживался во время обработки (то есть не только сам объект отслеживается по цвету, но и новый цвет объекта вычисляется в процессе обработки):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img156.imageshack.us/img156/6403/image6gt.png" alt="image" /&gt;&lt;/p&gt;
&lt;p&gt;Следующая плюшка идет в стандартной поставке от Aforge Motion Detector. Объект можно по разному подсвечивать на изображении:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img256.imageshack.us/img256/9784/image7tg.png" alt="image" /&gt;&lt;/p&gt;
&lt;h3 class="content"&gt;
&lt;/h3&gt;
&lt;h3&gt;Реализация&lt;/h3&gt;
&lt;p&gt;AForge.Vision.Motion.&lt;b&gt;IMotionDetector&lt;/b&gt;&amp;nbsp;&amp;ndash; интерфейс, позволяющий искать разницу между изображениями. От него унаследован&amp;nbsp;&lt;i&gt;ColorDetection&amp;nbsp;&lt;/i&gt;класс, выполняющий обработку.&lt;/p&gt;
&lt;p&gt;Для взаимодействия с интерфейсом пользователя был добавлен метод&amp;nbsp;&lt;i&gt;Initialize&lt;/i&gt;(Image image, Rectangle rect), который инициализирует процесс обработки последующих кадров. Здесь происходит сбор информации о целевом объекте (выделенным прямоугольником на изображении). Собирается информация о доминирующем цвете в избранной области (это свойство и будет в дальнейшем служить основой для слежения). Также запоминается позиция целевого объекта.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;IMotionDetector&lt;/b&gt;&amp;nbsp;имеет следующие методы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;i&gt;ProcessFrame&lt;/i&gt;(AForge.Imaging.UnmanagedImage) &amp;ndash; передает в объект следующий кадр, полученный от устройства захвата изображений. Следующий кадр &amp;ndash; объект типа AForge.Imaging.UnmanagedImage, класса, позволяющего подступаться к пикселам намного быстрее, чем&amp;nbsp;&lt;i&gt;Bitmap.GetPixel(x,y)&lt;/i&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;i&gt;Reset&lt;/i&gt;() &amp;ndash; сбрасывает содержимое класса.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Свойства:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AForge.Vision.Motion.IMotionDetector.&lt;i&gt;MotionFrame&amp;nbsp;&lt;/i&gt;&amp;ndash; свойство типа AForge.Imaging.&lt;i&gt;UnmanagedImage&lt;/i&gt;, которое отвечает за подсветку региона с объектом.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AForge.Vision.Motion.IMotionDetector.&lt;i&gt;MotionLevel&amp;nbsp;&lt;/i&gt;&amp;ndash; &amp;laquo;уровень движения&amp;raquo; (от 0 до 1) &amp;ndash; эфимерная величина. Не имплементировал.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для обновления информации в строке состояния приложения, добавлены Get Properties:&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Point Center&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rectangle BoundsBox&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Color ObjectColor&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для того, чтобы использовалось не только целевой цвет, но и некоторые оттенки, используется Set Property&amp;nbsp;&lt;i&gt;DifferenceThreshold&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Основная обработка кадра происходит в функции&amp;nbsp;&lt;i&gt;ProcessFrame&lt;/i&gt;. Алгоритм можно разделить на такие шаги:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Расширение региона присутствия объекта. Новое положение будем искать не по всему экрану, а лишь в области, смежной с предыдущим положением. Это делает поиск точнее с той точки зрения, что целевой объект не будет перепутан с другим объектом такого же цвета (в другой части изображения).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Вычисление границ объекта в вышеописанной области через определение крайних точек того цвета, который является доминирующим для объекта (здесь также учитывается возможное цветовое отклонение &amp;mdash; DifferenceThreshold).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Создание &amp;laquo;маски&amp;raquo;&amp;nbsp;&lt;i&gt;MotionFrame&lt;/i&gt;, которая позволит MotionDetector-у подсветить целевой объект на изображении.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Далее вычисляется &amp;laquo;средний цвет&amp;raquo; и размер нового объекта.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Если объект слишком мал (например, на следующем кадре наш целевой объект полностью был закрыт другим объектом) &amp;ndash; мы не меняем информации о положении и цвете, которые остались в наследство от обработки предыдущего кадра.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Иначе &amp;ndash; запоминается новое положение и границы объекта, и, если алгоритм следит за изменением цвета, что устанавливается с помощью свойства bool DynamicColorTracking, то также запоминается и новый вычисленный цвет.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;На этом обработка изображения заканчиваетcя.&lt;/p&gt;
&lt;h3&gt;Возможные улучшения&lt;/h3&gt;
&lt;p&gt;Так как уже говорилось о контроллерах к игровым приставкам, то их цвет обычно контрастно отличается от любых других объектов в кадре. Поэтому можно сделать первичный поиск целевого цвета по всему кадру (а не только по смежной области). Это позволит отслеживать объект при более быстром движении.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Полезные ссылки по теме&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/aforge/"&gt;Сайт проекта Aforge&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/recipes/aforge.aspx"&gt;Aforge &amp;ndash; статья на CodeProject&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;P.S.&amp;nbsp;&lt;a href="http://depositfiles.com/files/xadwm7ihp"&gt;Ссылка на исходник на depositfiles&lt;/a&gt;, &lt;a href="https://docs.google.com/leaf?id=0B1J52wcxzQF8MWFhNDMzNWMtMjgzNC00ZDA2LWJjNmUtMGJmNmU1NzNhZDhk&amp;amp;hl=en"&gt;ссылка на исходник в Google Docs&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=5329" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="color tracking" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/color+tracking/default.aspx" /><category term="Aforge.NET" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/Aforge.NET/default.aspx" /></entry><entry><title>Кто несет ответственность, или написание связанных программ и обработка исключений</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2010/06/03/4876.aspx" /><id>/blogs/lexremablog/archive/2010/06/03/4876.aspx</id><published>2010-06-03T11:45:00Z</published><updated>2010-06-03T11:45:00Z</updated><content type="html">&lt;p&gt;Последнее время часто задумывался о том, как правильно обрабатывать и генерировать исключения в двоих модулях одной программы.&lt;/p&gt;
&lt;p&gt;Скажем, у нас есть модуль вычислительных операций, который является независимым от вызывающей программы и есть вызывающий код, который находиться, например, в обработчиках нажатия клавиш UI.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Рассмотрим такие ситуации, когда вызываемая подпрограмма выполняет следующие операции:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Вычисление корня отрицательного числа;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Вычисление атрибутов файла на диске, которого не существует;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Выход за границы массива.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Предположим, мы разрабатываем сами библиотеки (а не используем уже существующие), которые обрабатывают данные задачи. Скажу сразу, что каждый подход является субъективным и наверняка решаемым отдельно для каждой отдельной ситуации. Варианты решения:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Бросаем ArgumentException&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Возвращаем -1, null, идентифицируем результат как некорректный и т.п.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Итак, вычисление корня отрицательного числа&lt;/h3&gt;
&lt;p&gt;&lt;i&gt;ArgumentException&lt;/i&gt; &amp;ndash; довольно очевиден. Передано отрицательное число, но на вход может подаваться только положительное. Но является ли ситуация абсолютно исключительной? Зависит от конкретного варианта имплементации и языка программирования.&lt;/p&gt;
&lt;p&gt;В С# функция Math.Sqrt принимает на вход значения типа double. Этот тип данных предполагает как положительные так и отрицательные значения. То есть если функция может получить отрицательное значение, значит этот вариант уже не являеться абсолютно исключительным, и следовательно &amp;ndash; генерация исключения может и не происходить.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;double sqrt = Math.Sqrt(-4); // sqrt == double.NaN&lt;br /&gt;double sum = sqrt + 2; // sum == double.NaN&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Если сделать проверку то получим значение &lt;strong&gt;NaN&lt;/strong&gt;, что обозначает &lt;strong&gt;Not A Number&lt;/strong&gt; &amp;ndash;double константа как для Java так и для C#. Тоесть .NET проидентифицировал результат как некорректный, но при этом не прервал выполнения. С этим числом возможны дальнейшие арифметические операции, но уже каждая из них будет возвращать NaN как результат. То есть машинное время будет съедаться программой для продолжения выполнения некорректных рассчетов, что не совсем логично. Почему так &amp;ndash; смотрите &lt;strong&gt;Пояснение&lt;/strong&gt; в конце статьи.&lt;/p&gt;
&lt;p&gt;Если же мы определим собственную функцию Math1.Sqrt, которая будет принимать на вход только uint (так определим только положительные числа) значения, то передать отрицательное значение внутрь такой конструкции вы не сможете изза ошибки на этапе компиляции.&lt;/p&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;Вычисление атрибутов файла на диске, которого не существует&lt;/h3&gt;
&lt;p&gt;Аналогично первым делом на ум приходит ArgumentException. Файла не существует, но как ни странно, следующая строка кода не генерирует исключение:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DateTime dt = File.GetLastAccessTime(&amp;quot;C:\\I_warn_you_there_is_no_such_file.txt&amp;quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Хм&amp;hellip; Строка корректна, имя файла тоже. И возвращаемый результат &amp;ndash; также корректен (относительно). Это дата: 12:00 полночь, 1 Января, 1601 н.э.То есть в принципе, программа может продолжать работать, но не факт что она не свалиться на следующем шаге. Значит ситуация, когда на вход функции передается несуществующий файл &amp;ndash; не является исключительной.&lt;/p&gt;
&lt;p&gt;Но вот примечательный момент &amp;ndash; следующая строка сгенерирует &lt;i&gt;ArgumentException&lt;/i&gt; исключение:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DateTime dt = File.GetLastAccessTime(&amp;quot;&amp;quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Здесь можно объяснить ситуацию следующим образом. Если на вход данной функции передается пустая строка, значит ранее в программе существует другое место, которое, например, неправильно генерирует имя файла. То есть исключение дает возможность пересмотреть ход выполнения сначала. (Этот вывод не претендует на абсолютную точность, это мои собственные предположения).&lt;/p&gt;
&lt;h3&gt;Выход за границы массива&lt;/h3&gt;
&lt;p&gt;Следующий код имеет нечто общее с предыдущими случаями.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int[] array = new[] { 10, 12, 13 };&lt;br /&gt;int val = array[4];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Индекс 4 также является просто неправильным параметром. И, возможно, есть смысл вернуть default для данного элемента массива? Почему бросается исключение (&lt;i&gt;IndexOutOfRangeException&lt;/i&gt;)?&lt;/p&gt;
&lt;h3&gt;Пояснение&lt;/h3&gt;
&lt;p&gt;Эндрю Хант и Дэвид Томас, авторы книги &lt;a target="_blank" href="http://www.rsdn.ru/res/book/prog/The_Pragmatic_Programmer.xml"&gt;&amp;laquo;Программист - прагматик&amp;raquo;&lt;/a&gt;, советуют внутри подпрограммы генерировать исключение только в том случае, если ситуация является частью контекста подпрограммы. Это хорошо объясняться на последнем примере, когда в случае с обращением к несуществующему элементу массива мы непосредственно находимся в контексте существования данного массива. Или же в случае, если мы вычисляем корень &amp;ndash; и алгоритм не срабатывает корректно, или результат выходит за границы погрешности. В других же случаях, когда в подпрограму передается некорректное значение, его контролем должна заниматься вызывающая программа. То есть перед тем как передать в Math.Sqrt негативное значение, сначала вызывающая программа должна проверить его и правильно обработать. Например, сгенерировать то же исключение.&lt;/p&gt;
&lt;p&gt;Через такой подход обеспечивается отсутствие дублирования исключений (когда некорректность аргумента будет приводить к исключению и в вызывающей и вызываемой программах).&lt;/p&gt;
&lt;p&gt;В любом случае, &amp;nbsp;снова же решение такого рода задач является индивидуальным. Основное, что поможет разобраться в дебрях логики вашей подпрограммы является документирование. Например в случае с &lt;i&gt;Math.Sqrt&lt;/i&gt; мы можем прочитать в &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.math.sqrt.aspx"&gt;документации &lt;/a&gt;следующую информацию:&lt;/p&gt;
&lt;p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;p&gt;Parameter&lt;/p&gt;
&lt;/th&gt;&lt;th&gt;
&lt;p&gt;Return value&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Zero, or positive&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The positive square root of&amp;nbsp;&lt;span class="parameter"&gt;d&lt;/span&gt;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Negative&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.double.nan.aspx"&gt;NaN&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Equals&amp;nbsp;&lt;span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.double.nan.aspx"&gt;NaN&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.double.nan.aspx"&gt;NaN&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Equals&amp;nbsp;&lt;span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.double.positiveinfinity.aspx"&gt;PositiveInfinity&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.double.positiveinfinity.aspx"&gt;PositiveInfinity&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; Спасибо коллегам Сергею Е., Виктору П., Сергею З., благодаря дискуссии с которыми и появился данный очерк.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=4876" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="logging" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/logging/default.aspx" /><category term="Exceptions" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/Exceptions/default.aspx" /></entry><entry><title>Использование Dotfuscator Community Edition для обфускации .NET сборок</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2010/05/12/dotfuscator-community-edition-net.aspx" /><id>/blogs/lexremablog/archive/2010/05/12/dotfuscator-community-edition-net.aspx</id><published>2010-05-12T15:17:00Z</published><updated>2010-05-12T15:17:00Z</updated><content type="html">&lt;p&gt;Хотя релиз 2010 студии уже состоялся, многие и дальше будут еще около года бродить кругами возле этой лакомки. Ситуация обычная для тех, кто как и раньше ориентируеться на клиента с установленым фреймвороком 2.0.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;К таким программистам можно сказать отношусь и я. Не то чтобы я жалуюсь, просто как -то все руки не доходят перейти к использованию новой студии. И солюшены все поменяються, а у колег еще может и новая студия не стоять... Но не совсем об этом я хотел поведать в данном посте.&lt;/p&gt;
&lt;p&gt;Во время установки &lt;b&gt;2008&lt;/b&gt; студии в настраиваемом режиме, всегда выбирал для установки дополнительный компонент&amp;nbsp;Dotfuscator Community Edition, понимая, что он пригодиться для &lt;a target="_blank" href="http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%84%D1%83%D1%81%D0%BA%D0%B0%D1%86%D0%B8%D1%8F"&gt;обфускации&lt;/a&gt;. &amp;nbsp;Но так особо никогда продукт мне и не был нужен.&amp;nbsp;И вот настал тот час.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Когда не совсем понятному заказчику нужно было отослать демо продукта (в принципе полнофункционального, но с обрезаным UI), задумался о защите своего кода. Ведь любая .нет сборка являеться беззащитной в руках злоумышлеников :). Но как раз эта программа позволяет подпортить им нервы :).&lt;/p&gt;
&lt;p&gt;1. Для начала опрелелим местонахождение установленого обфускатора. Лично у меня оно выглядит:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;c:\Program Files\Microsoft Visual Studio 9.0\Application\PreEmptive Solutions\Dotfuscator Community Edition\&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;2. Создадим сборку некоторой апликации. Для примера, возьмем мою незащищенную сборку.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. Попробуем открыть сборку с помощью апликации &lt;b&gt;.NET Reflector&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://msug.vn.ua/cfs-file.ashx/__key/CommunityServer.Components.UserFiles/00.00.00.21.19/fuscator1.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Минимальный анализ показывает, что код читабельный. Все что относится к классам &amp;nbsp;(методы, свойства, поля) не были изменены. Единственное, что поменялось - имена локальных переменных.&lt;/p&gt;
&lt;p&gt;4. Теперь перейдем к использованию обфускатора. &lt;/p&gt;
&lt;p&gt;4.а. После запуска&amp;nbsp;&lt;b&gt;dotfuscator.exe &lt;/b&gt;приложение сразу хочет создать или открыть некоторый проект. Создадите новый.&lt;/p&gt;
&lt;p&gt;4.б. На вкладке &lt;b&gt;Input&lt;/b&gt; добавте те сборки, которые вы хотели бы обработать.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4.в. Перейдите на панель &lt;b&gt;Build&lt;/b&gt; и нажмите кнопку&amp;nbsp;&lt;b&gt;Build&lt;/b&gt;. Этих несложных манипуляций хватит для того, чтобы получить новую сборку, с уже измененными именами. Если ваша сборка ссылаеться на другие сборки (не системные), они должны быть доступны в папке с исходным файлом.&lt;/p&gt;
&lt;p&gt;Также вы можете обрабатывать целые кипы сборок, сразу изменяя как сборку вызваную, так и вызывающую.&lt;/p&gt;
&lt;p&gt;5. Вот такой результат получился например у меня:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://msug.vn.ua/cfs-file.ashx/__key/CommunityServer.Components.UserFiles/00.00.00.21.19/fuscator2.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Метод я смог найти только благодаря его сигнатуре. Имена классов, методов, свойств сильно изменились. Логику проследить в этом случае стало значительно труднее. Не скажу что невозможно, но в большой кипе эдакого хлама я бы долго поблудил.&lt;/p&gt;
&lt;p&gt;6. Дополнительные возможности (&lt;b&gt;Dotfuscator Professional Edition&lt;/b&gt;):&lt;/p&gt;
&lt;p&gt;&lt;b&gt;User String Encryption&lt;/b&gt; - приложение позволяет кодировать строки внутри кода для того чтобы скрыть важные сообщения (например место, где говориться о том что срок лицензии подходит к концу либо аналогичные).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pruning&lt;/b&gt; - вырезание тех типов данных и имен, которые не используються в конкретной апликации - являються в ней излишними. Это позволяет уменьшить размер исходной сборки.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Linking&lt;/b&gt; - возможность обьеденять разные сборки в одну результирующую.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Tamper Notification and Runtime Intelligence 
with SO-signal&lt;/b&gt; - также приложение позволяет встраивать в результирующий продукт даже почтовые нотификации для разработчиков на случай если в сборку попытаются внести изменения.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Watermarking&lt;/b&gt; - позволяет идентифицировать ваши сборки как лицензионные. Позволяет отследить нелицензионные копии програмы.&lt;/p&gt;
&lt;p&gt;Продукт продолжает развиваться и выпускаться. И бесплатная версия поставляется вместе с V&lt;b&gt;S 2010&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Больше деталей о самом приложении можно найти &lt;a href="http://www.preemptive.com/products/dotfuscator/see-it-work" target="_blank"&gt;здесь&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Быстрый Интернет просмотр дает еще много продуктов. Наиболее высоки в рейтинге Google:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.aspx" target="_blank"&gt;&lt;b&gt;Eazfuscator.NET&lt;/b&gt;&lt;/a&gt;&amp;nbsp;- судя по сайту, украинская разработка.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Поддерживает:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/netframework/default.aspx" target="_blank"&gt;.NET Framework&lt;/a&gt;&amp;nbsp;versions 2.0, 3.0, 3.5 and 4.0&lt;/li&gt;
&lt;li&gt;.NET Compact Framework versions 2.0, 3.5 and 4.0&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/SILVERLIGHT/"&gt;Silverlight&lt;/a&gt;&amp;nbsp;assemblies and XAP packages&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/xna/default.aspx" target="_blank"&gt;XNA&lt;/a&gt;&amp;nbsp;applications for Windows, Xbox 360 and Zune platforms&lt;/li&gt;
&lt;li&gt;Can obfuscate any 100% managed .NET assembly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Позволяет интегрироваться со студиями 2005 - 2010 (даже с Експрес).&lt;/p&gt;
&lt;p&gt;Прост в использовании благодаря революционной технологии drag-and-drop.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Images/Assistant%20DND.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://rustemsoft.com/freeware_obfuscator.htm" target="_blank"&gt;Skater .NET Obfuscator&lt;/a&gt;&amp;nbsp;- &lt;/b&gt;&lt;span&gt;позволяет в принципе тоже что и другие... Без того чтбы покопаться тяжело найти отличия. Имеет платную и бесплатную версию. Говорит, что после декомпиляции собрать сборку заново становиться обычно нереально (&amp;quot;Obfuscated application usually is not recompilable&amp;quot;).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.macrobject.com/en/obfuscator/" target="_blank"&gt;Obfuscator.NET&lt;/a&gt;&amp;nbsp;- &lt;/b&gt;то же что и предыдущие. Угрожает, что .NET Reflector упадет при декомпиляции. А если и нет, то получиться код такого типа:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.macrobject.com/images/obfuscator.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;И на закуску:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.smartassembly.com/" target="_blank"&gt;{Smartassembly}&lt;/a&gt;&amp;nbsp;,&amp;nbsp;&lt;span style="font-weight:normal;"&gt;&lt;a target="_blank"&gt;&lt;b&gt;Spices.Net Obfuscator&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Продуктов защиты .NET кода достаточно, а тем более достаточно их бесплатных версий, чтобы хотя бы по минимуму защитить вашу&amp;nbsp;интелектуальну собственность.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=4147" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term=".NET" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/.NET/default.aspx" /><category term="reflection" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/reflection/default.aspx" /><category term="обфускация" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/_3E0431044404430441043A043004460438044F04_/default.aspx" /></entry><entry><title>Default Editor в Visual Studio</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2010/01/15/default-editor-visual-studio.aspx" /><id>/blogs/lexremablog/archive/2010/01/15/default-editor-visual-studio.aspx</id><published>2010-01-15T07:16:00Z</published><updated>2010-01-15T07:16:00Z</updated><content type="html">&lt;p&gt;Когда я редактирую код формы в Visual Studio, намного чаще захожу в код формы, нежели в дизайнер форм. Н&lt;/p&gt;
&lt;p&gt;о по умолчанию в студии настроен именно дизайнер.&lt;/p&gt;
&lt;p&gt;Для того, чтобы изменить default editor нужно правой кнопкой щелкнуть на иконке формы -&amp;gt; Open With -&amp;gt; CSharp Editor (Click &amp;quot;Set as default&amp;quot;). Всеб теперь формы определенного типа открываться будут в&amp;nbsp;CSharp Editor&amp;nbsp;по умолчанию.&lt;/p&gt;
&lt;p&gt;Для ASP.NET страниц это же можно сделать так:&amp;nbsp;Tools -&amp;gt; Options -&amp;gt; HTML Designer -&amp;gt; Start pages in &amp;quot;Source view&amp;quot;. У Windows Forms Designer такой опции нет.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=2437" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="Visual Studio" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>Подготовка к собеседованию на должность программиста</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2009/09/14/1225.aspx" /><id>/blogs/lexremablog/archive/2009/09/14/1225.aspx</id><published>2009-09-14T11:20:00Z</published><updated>2009-09-14T11:20:00Z</updated><content type="html">&lt;p&gt;&lt;i&gt;Молодую девушку пригласили на свидание и она спрашивает маму - &amp;quot;Как вести беседу?&amp;quot; Мам отвечает - &amp;quot;Ну поговорите сначала о погоде, потом, к примеру, о музыке, а потом скажи что-нибудь остренькое&amp;quot;. Во время свидания сразу же после встречи девушка и говорит: &amp;quot;Какая чудная погода, училась музыке три года, бритва.&amp;quot;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;b&gt;Очень большой процент технических специалистов проходят собеседование откровенно неподготовленными и просто валят свой шанс. Поэтому, готовясь сам, я решил поделиться информацией, которую отгугливал, несколько - из личного.&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Первый совет: &lt;/b&gt;Узнайте о условиях проведения собеседования. Используйте при подготовке условия, какие будут аналогичны собеседованию. Если собеседование проходит с маркером в руке стоя у доски &amp;ndash; работайте дома с ручкой и бумажкой, так как без любимого компилятора и intellisence &amp;ndash;а можно запороться на базовой инициализации массива. Старайтесь вложиться в выделенное время. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Второй совет. &lt;/b&gt;Если проблемы с волнением и поведением на публике &amp;ndash; попросите близких (или не очень) людей, которые просто бы стояли у вас над головой &amp;ndash; как по мне в последствии на собеседовании будет проще справиться с аналогичным волнением из-за присутствия контролирующего лица. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Третий совет. &lt;/b&gt;Не парьтесь по поводу сделанных ошибок. Если ошибка допущена, на что доказывает вам рекрутер, ее можно легко исправить и объяснить природу ее появления. Однако если вы начнете нервничать, это может затуманить ваш мозг и повлиять на дальнейший процесс собеседования.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Четвертый совет. &lt;/b&gt;Будьте вежливыми. &lt;br /&gt;А) фильтруйте ремарки в сторону интервьюера. Не надо комплиментов, не надо указывать на недостатки, так как и то и другое может быть излишним.&lt;br /&gt;Б) не забудьте о мобильном телефоне, который может зазвонить не вовремя. Если же все таки вы ждете важного звонка &amp;ndash; предупредите интервьюера. &lt;br /&gt;В) Не ведите себя вызывающе, что может относиться как к тону в голосе, так и к одежде.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Пятый совет. &lt;/b&gt;Управляйте временем. Не останавливайтесь подолгу в ответах на простые вопросы, если только интервьюер не хочет услышать подробности. Предложите ему некоторую информацию о себе(своих хобби, проектах) в виде малой порции, а если ваш рекрутер захочет &amp;ndash; он уж расспросит поподробнее. Если вы занимаете много время распостраняясь на излишки, то у человека, который проводит с вами собеседование, просто не будет времени задать все вопросы и разглядеть в вас профессионала. Также он может подумать, что с вами будет очень тяжело работать. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Шестой совет.&lt;/b&gt; Сначала дайте точный ответ на вопрос. Предложите подробную информацию после.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Седьмой совет.&lt;/b&gt; Приходите на собеседование в удобной одежде. Если вы впервые надели костюм, идя на это собеседование &amp;ndash; это уже может вас морально расстроить. В некоторых компаниях это также может считаться излишеством.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Восьмой совет.&lt;/b&gt; Не юлите, при ответе на вопрос, требующий точной формулировки ответа на который вы не знаете. Иногда не зная ответа вы можете начать что то предполагать, и зайдя &amp;laquo;не в ту степь&amp;raquo; испортить о себе впечетление, которое сложилось на базе других вопросов. Как по мне лучше сказать&amp;nbsp; о незнании и предположить определенный вариант (без лишней информации), а решать уж интервьюеру. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Девятый совет.&lt;/b&gt; В случае отказа &amp;ndash; не расстраиваться. Вы получили полезный урок &amp;ndash; который поможет вам на следующем собеседовании. Да и отказ фактически не означает, что вы плохой специалист, может быть ситуация, когда ваш опыт является просто по-другому направленным. Например, даже при отличных навыках программиста могут отказать из-за плохого уровня английского языка.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;На конец приведу пару вопросов, которые можно задать интервьюеру при недостаточных знаниях о компании. Возможно, это также кому-то будет полезно, и после счастливого устройства не придется уходить с должности из-за несоответствия&amp;nbsp; уровня ЗП или графика роботы. &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Карьера и оплата&lt;/b&gt;&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Какие перспективы карьерного роста?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Что будет входить в мои обязанности?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Каковы самые важные умения и навыки необходимы сотруднику в данной должности?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Как строится рабочий день сотрудника на этой должности?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Сколько часов в неделю предстоит работать сотруднику, желающему достичь успеха в данной должности?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Как бы Вы описали культуру компании?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Что выгодно отличает вашу компанию от конкурентов?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Как Вы предпочитаете общаться с командой?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Через сколько времени повышается зарплата и на сколько?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Сколько времени длится испытательный срок и какая оплата в это время?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Есть ли бонусы и от чего зависит их получение?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Бывают ли корпоративные вечеринки?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Какие отношения в коллективе?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Сколько человек в отделе?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Условия работы?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Есть ли столовая (внутри компании) или приходится ходить есть куда-то?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Оплачиваются ли обеды и если да, то на какую сумму?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Оплачивается ли проезд?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Есть ли командировки? Если есть, то как часто? Сколько дней в месяц/в год?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Предоставляет ли фирма бесплатное посещение бассейна, спортзала?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Направляет ли фирма на какие-либо курсы?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Проводятся ли семинары, конференции?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Отгулы?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Больничные (оплачиваются или нет)?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Есть ли мед.страховки? Для сотрудника или для его семьи тоже?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Выплачивается ли вовремя зарплата или бывают задержки?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Зарплата &amp;laquo;чёрная&amp;raquo; или &amp;laquo;белая&amp;raquo;? Выдаётся наличными или в банке?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Зарплата(сумма)&lt;br /&gt;&lt;b&gt;Отпуск&lt;/b&gt;&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Продолжительность в год?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Через какой промежуток времени его можно взять?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Можно ли взять его сразу или только по частям?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Выплачивают ли отпускные?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Если не берёшь отпуск, то он прогорает? Можно ли взять деньгами и не ходить в него?&lt;br /&gt;&lt;b&gt;Рабочее время&lt;/b&gt;&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Со скольки до скольки?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Есть ли возможность работать по гибкому графику (раньше приходить и раньше уходить и наоборот)?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Если обедаешь не отрываясь от работы, можно ли уходить на 1 час раньше?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Бывают ли случаи работы в выходные (&amp;laquo;авралы&amp;raquo;), оплачивается ли такая работа и как?&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp; &amp;nbsp;Сколько рабочих дней в неделю?&lt;br /&gt;&lt;b&gt;Источники:&lt;/b&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; &amp;nbsp;http://estrabota.com.ua/content/programmers_interview.html&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; &amp;nbsp;http://www.meranetworks.ru/vacancies/vac_interview.php&lt;br /&gt;3.&amp;nbsp;&amp;nbsp; &amp;nbsp;http://www.it4business.ru/lib/116/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Полезно и интересно:&lt;/b&gt;&lt;br /&gt;&lt;a target="_blank" href="http://podlipensky.com/post/2008/06/23/how-to-pass-interview-in-google.aspx"&gt;Как пройти собеседование в Гугле?&lt;/a&gt;&lt;br /&gt;Немного полезностей из нашей вики &lt;a target="_blank" href="http://msug.vn.ua/wikis/work_education/default.aspx"&gt;тут&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=1225" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="Собеседование" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/_21043E04310435044104350434043E04320430043D0438043504_/default.aspx" /><category term="программист" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/_3F0440043E043304400430043C043C04380441044204_/default.aspx" /><category term="вопросы" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/_32043E043F0440043E0441044B04_/default.aspx" /></entry><entry><title>Бил Гейтс о Chrome OS</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2009/07/24/chrome-os.aspx" /><id>/blogs/lexremablog/archive/2009/07/24/chrome-os.aspx</id><published>2009-07-24T15:02:00Z</published><updated>2009-07-24T15:02:00Z</updated><content type="html">&lt;p&gt;&lt;br /&gt;По &lt;a target="_blank" href="http://news.cnet.com/2702-1023_3-163.html"&gt;мнению Билла Гейтса&lt;/a&gt;, Google Chrome OS по виду очень подобен близкому врагу: Linux.&lt;br /&gt;&lt;br /&gt;&amp;quot;Есть много, очень много форм операционных систем Linux, упакованых в различных способах и загружаемых в различных способах&amp;quot;, Гейтс сообщил в interview Новостям CNET на этой неделе. &amp;quot;Некоторым образом я удивлен, что люди ведут себя, как будто в этом всем есть что-нибудь новое. Я имею ввиду, вы имеете Андроид, работающий на нетбуках. Внутри есть браузер.&amp;quot;&lt;br /&gt;&lt;br /&gt;Гейтс сказал, что действительно трудно говорить о Chrome ОС, так как Google сообщил пока очень мало о том, как ОС будет фактически работать.&lt;br /&gt;&lt;br /&gt;&amp;quot;Чем более они неопределенны, тем большая заинтересованность есть у масс&amp;quot;, говорит он.&lt;br /&gt;&lt;br /&gt;Относительно утверждения, что браузеру нужно действовать больее подобно ОС, он отметил, что браузер уже стал чрезвычайно широким понятием, со всеми расширениями и другими вещами, которые сейчас делаются внутри браузера.&lt;br /&gt;&lt;br /&gt;&amp;quot;Это только показывает, что слово браузер стало по настоящему бессмысленным словом&amp;quot;,. &amp;quot;Что такое браузер? Что такое не браузер? Если вы проигрываете кинофильм, - это браузер или не браузер? Если вы делаете записи &amp;ndash; это браузер? Если вы редактируете текст - это браузер или не браузер? В большей степени, это больше злоупотребление терминологией, чем реальное изменение.&amp;quot;&lt;br /&gt;&lt;br /&gt;Тем временем, Стив Балмер предположил что Windows, в отличии от браузерной ОС, была более правильным подходом. Чтобы подкрепить этот аргумент, Балмер отметил, что половина использования ПК сегодня тратится на выполнение работы за пределами браузера.&lt;br /&gt;&lt;br /&gt;&amp;quot;Нам не нужна новая операционная система&amp;quot;, сообщил Балмер во вторник, как часть его лейтмотива на Всемирной конференции партнеров Microsoft в Новом Орлеане. &amp;quot;Что нам нужно делать - продолжать развивать Windows, Приложения Windows, IE (Internet Explorer), способ взаемодействия IE с Windows и тот подход, как мы строим приложения подобные Офису...и мы должны быть уверенны, что сможем повести своих клиентов и партнеров за собой.&amp;quot;&lt;br /&gt;&lt;br /&gt;Балмер и Гейтс также подчеркивают факт, что Google сейчас имеет две операционных системы - Хром ОС и Андроид. Балмер отметил, уже имея опыт отдельных Windows 95 для потребителей и Windows NT для бизнес-структур, что наличие двух операционных систем - не обязательно положительная вещь.&lt;br /&gt;&lt;br /&gt;&amp;quot;Мои последние исследования показали, что Вам не нужны две клиентских операционных системы&amp;quot;, говорит он. &amp;quot;Хорошо иметь одну.&amp;quot;&lt;br /&gt;&lt;br /&gt;Балмер и Гейтс также повторяют слова Президента Business Division Стефана Элопа -Microsoft действительно не знает, что будет напоминать Chrome OS.&lt;br /&gt;&lt;br /&gt;&amp;quot;Who knows what this thing is?&amp;quot; - говорит Балмер.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=965" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="Chrome OS" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/Chrome+OS/default.aspx" /></entry><entry><title>PartnerNet и с чем его едят. PartnerNet accounts</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2009/07/10/partnernet.aspx" /><id>/blogs/lexremablog/archive/2009/07/10/partnernet.aspx</id><published>2009-07-10T12:40:00Z</published><updated>2009-07-10T12:40:00Z</updated><content type="html">&lt;p&gt;PartnerNet - это&amp;nbsp; точная копия сети Xbox Live&amp;nbsp;для разработчиков, где&amp;nbsp;оные могут тестировать фичи Xbox Live&amp;nbsp;(Achivements, HighScores... и т.п.) в своих разрабатываемых продуктах.&amp;nbsp; Попадая в эту сеть, вы получаете доступ к&amp;nbsp;играм, которые только находяться в процесе&amp;nbsp;разработки, и о которых Microsoft возможно еще и не анонсировала :). Каждая компания разработчик подписывает NDA (non-disclosure agreement - соглашение о конфиденциальности), и за разглашение вам могут сделать БО-БО :).&lt;/p&gt;
&lt;p&gt;Так вот, сейчас фичи XboxLive также могут поддерживаться в так&amp;nbsp;называемых Games for Windows: &lt;a href="http://www.microsoft.com/games/en-US/index.aspx"&gt;http://www.microsoft.com/games/en-US/index.aspx&lt;/a&gt;. Для разработки вы также можете подключиться к этой сети.&lt;/p&gt;
&lt;p&gt;Но есть некоторые особенности. Подключение к обычной сети Windows Live Games происходит с помощью Live Id эккаунта. Если же вы хотите залогиниться в PartnerNet - вам нужны специальные&amp;nbsp;PartnerNet эккаунты. Их можно получить &lt;/p&gt;
&lt;p&gt;1) имея Xbox 360 development kit (QA или Dev консоли)&lt;/p&gt;
&lt;p&gt;2) Связавшись с Вашим менеджером из Microsoft&lt;/p&gt;
&lt;p&gt;Выдержка из документации по созданию нового эккаунта:&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;strong&gt;To set up a PartnerNet account with an Xbox 360 development kit:&lt;/strong&gt;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;Start up your Xbox 360 development kit to start at the Xbox 360 Launcher screen and press X to select the Tools menu. &lt;br /&gt;Select Xbox LIVE Tools-&amp;gt;Create a New Profile. &lt;br /&gt;When asked to select if your account will be LIVE-enabled, select Yes unless you only want a local profile. &lt;br /&gt;You will then be asked if you want to create a Gold-tiered account. If you respond with Yes, you will have a Gold PartnerNet account. Otherwise, a Silver PartnerNet account will be generated. &lt;br /&gt;The LiveID for an account with the gamertag &amp;quot;gfwl&amp;quot; will be: &lt;a href="mailto:gfwl@xboxtest.com"&gt;gfwl@xboxtest.com&lt;/a&gt;. The password for this account is always: &amp;quot;supersecret&amp;quot;.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;strong&gt;Note&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt; If you do not have access to an Xbox 360 Development Kit, Test Kit or Demo Kit and you need PartnerNet accounts, please contact your Microsoft representative.&lt;/p&gt;
&lt;p&gt;Все это возможно, если предварительно вы заключили контракт с Microsoft на разработку игры под&amp;nbsp;Windows и получили соответственные Program Tools - &lt;strong&gt;Microsoft Games for Windows - LIVE SDK&lt;/strong&gt;.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=886" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="XBOX" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/XBOX/default.aspx" /><category term="Games for Windows" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/Games+for+Windows/default.aspx" /><category term="Live SDK" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/Live+SDK/default.aspx" /><category term="PartnerNet" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/PartnerNet/default.aspx" /></entry><entry><title>XNA 3.1 - Видео поддержка</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2009/07/01/xna-3-1.aspx" /><id>/blogs/lexremablog/archive/2009/07/01/xna-3-1.aspx</id><published>2009-07-01T16:26:00Z</published><updated>2009-07-01T16:26:00Z</updated><content type="html">&lt;p&gt;Недавно была выпущена новая версия XNA Game Studio 3.1. &lt;/p&gt;
&lt;p&gt;Среди остальных прикольных нововведений (таких как рендеринг трехмерных аватаров) была также добавлена и поддержка видео. &lt;/p&gt;
&lt;p&gt;Теперь поподробнее. &lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Требования к исходному видео:&lt;/b&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;формат - Windows Media Video, Series 9. Енкодер можно найти &lt;a href="http://www.microsoft.com/windows/windowsmedia/forpros/encoder/default.mspx"&gt;здесь&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;максимальное разрешение экрана 1280x720 &lt;/li&gt;
&lt;li&gt;Видео и аудио должны быть закодированы с постоянным битрейтом (constant bit rate aka (CBR) &lt;/li&gt;
&lt;li&gt;Поддерживаеться незащищенное видео без DRM защиты&lt;/li&gt;
&lt;li&gt;Невозможно воспроизводить части видео файла - файл всегда воспроизводиться полностью.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Импортировать видео можно через стандартные средства Content Pipeline.&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Воспроизвидение видео&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;Обьекты,&amp;nbsp; с которыми нам надо работать, это Video (исходное видео) и VideoPlayer (непосредственно проигрыватель).&lt;/p&gt;
&lt;p&gt;Создадим и инициализируем их в конструкторе класса игры.&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;GraphicsDeviceManager &lt;/span&gt;graphics;&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;SpriteBatch &lt;/span&gt;spriteBatch;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// Create the variables needed to hold and play back my video.&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Video &lt;/span&gt;myVideoFile;&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;VideoPlayer &lt;/span&gt;videoPlayer;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;public &lt;/span&gt;Game1()&lt;br /&gt;{&lt;br /&gt;    graphics = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;GraphicsDeviceManager&lt;/span&gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt;);&lt;br /&gt;    Content.RootDirectory = &lt;span style="color:#a31515;"&gt;&amp;quot;Content&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:green;"&gt;// Create the VideoPlayer&lt;br /&gt;    &lt;/span&gt;videoPlayer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;VideoPlayer&lt;/span&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Для загрузки даных из contetnt pipeline используем:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;protected override void &lt;/span&gt;LoadContent()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:green;"&gt;// Create a new SpriteBatch, which can be used to draw textures.&lt;br /&gt;    &lt;/span&gt;spriteBatch = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SpriteBatch&lt;/span&gt;(GraphicsDevice);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:green;"&gt;// TODO: use this.Content to load your game content here&lt;br /&gt; &lt;br /&gt;    // Load in my video file (just like any other content!)&lt;br /&gt;    &lt;/span&gt;myVideoFile = Content.Load&amp;lt;&lt;span style="color:#2b91af;"&gt;Video&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;@&amp;quot;Bear&amp;quot;&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Теперь для проигрывания видео нужно нажать А на контролере, а для остановки - В. Эту функциональность дописываем в апдейт функцию.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;protected override void &lt;/span&gt;Update(&lt;span style="color:#2b91af;"&gt;GameTime &lt;/span&gt;gameTime)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:green;"&gt;// Allows the game to exit&lt;br /&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;if &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;GamePad&lt;/span&gt;.GetState(&lt;span style="color:#2b91af;"&gt;PlayerIndex&lt;/span&gt;.One).Buttons.Back == &lt;span style="color:#2b91af;"&gt;ButtonState&lt;/span&gt;.Pressed)&lt;br /&gt;        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Exit();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:green;"&gt;// TODO: Add your update logic here&lt;br /&gt;    &lt;br /&gt;    // Start the video playback when the user presses A&lt;br /&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;if &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;GamePad&lt;/span&gt;.GetState(&lt;span style="color:#2b91af;"&gt;PlayerIndex&lt;/span&gt;.One).Buttons.A == &lt;span style="color:#2b91af;"&gt;ButtonState&lt;/span&gt;.Pressed)&lt;br /&gt;    {&lt;br /&gt;        videoPlayer.Play(myVideoFile);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:green;"&gt;// Start the video playback if the user presses B&lt;br /&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;if &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;GamePad&lt;/span&gt;.GetState(&lt;span style="color:#2b91af;"&gt;PlayerIndex&lt;/span&gt;.One).Buttons.B == &lt;span style="color:#2b91af;"&gt;ButtonState&lt;/span&gt;.Pressed)&lt;br /&gt;    {&lt;br /&gt;        videoPlayer.Stop();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;base&lt;/span&gt;.Update(gameTime);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;В функции Draw рисуем картинку из нашего плеера:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;protected override void &lt;/span&gt;Draw(&lt;span style="color:#2b91af;"&gt;GameTime &lt;/span&gt;gameTime)&lt;br /&gt;{&lt;br /&gt;    GraphicsDevice.Clear(&lt;span style="color:#2b91af;"&gt;Color&lt;/span&gt;.CornflowerBlue);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:green;"&gt;// TODO: Add your drawing code here&lt;br /&gt;&lt;br /&gt;    // Render the video in it&amp;#39;s orginal resolution to the screen using SpriteBatch&lt;br /&gt;    &lt;/span&gt;spriteBatch.Begin();&lt;br /&gt;    &lt;span style="color:blue;"&gt;if &lt;/span&gt;(videoPlayer.State == &lt;span style="color:#2b91af;"&gt;MediaState&lt;/span&gt;.Playing)&lt;br /&gt;    {&lt;br /&gt;        spriteBatch.Draw(videoPlayer.GetTexture(), &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Rectangle&lt;/span&gt;(0, 0, myVideoFile.Width, myVideoFile.Height), &lt;span style="color:#2b91af;"&gt;Color&lt;/span&gt;.White);&lt;br /&gt;     &lt;br /&gt;    }&lt;br /&gt;    spriteBatch.End();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Дополнительно следует помнить о возможности отключить звук (свойство VideoPlayer.IsMuted) и возможности зациклить видео (свойство VideoPlayer.IsLooping). Их можно установить например в конструкторе.&lt;br /&gt;&lt;br /&gt;На что еще следует обратить внимание:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;поскольку воспроизводимая картинка являеться текстурой, вы можете применять к ней эффекты.&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#2b91af;"&gt;VideoSoundtrackType&lt;/span&gt;  позволит вам миксить ваш звук с видео (если в плеере установлено свойство IsMuted для родной дорожи видео файла)&lt;/li&gt;
&lt;li&gt;Высокое качество видео (с высоким разрешением и битрейтом) к сожалению приведет к тормозам во время воспроизведения.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Источники:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://klucher.com/blog/video-support-in-xna-game-studio-3-1/"&gt;Michael Klucher&amp;rsquo;s Blog
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://www.ziggyware.com/readarticle.php?article_id=269"&gt;ZiggyWare&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.ziggyware.com/newsimages/VideoPlayingSample.zip"&gt;Тестовый проект&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=825" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="Video" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/Video/default.aspx" /><category term="Видео" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/_12043804340435043E04_/default.aspx" /><category term="XNA 3.1" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/XNA+3.1/default.aspx" /></entry><entry><title>Курс "Введение в XNA"</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2009/06/19/quot-xna-quot.aspx" /><id>/blogs/lexremablog/archive/2009/06/19/quot-xna-quot.aspx</id><published>2009-06-19T14:10:00Z</published><updated>2009-06-19T14:10:00Z</updated><content type="html">&lt;p&gt;Как бы XNA постоянно развивается. Сидя за &amp;quot;коробкой 360&amp;quot; уже среди комьюнити геймс можно увидеть и интересные перлы, а не только кучу общественного мусора :). Завоевывая популярность, версия фреймворка для &amp;quot;студентов и хобби разработчиков игр&amp;quot; дает возможность заработать и для учреждений, которые занимаются просвещением - например &lt;a target="_blank" href="http://intuit.ru/"&gt;intuit.ru&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Информация о курсе:&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span class="course_info_title"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Данный курс описывает процесс
разработки высокопроизводительных графических приложений Windows Forms
на основе XNA Framework. Постепенно, шаг за шагом, читатель учится
создавать указанные приложения для платформы .NET начиная с простейшей
заливки формы константным цветом и заканчивая полноценным хранителем
экрана, использующим шейдеры. Чтобы не допустить типовых ошибок у
начинающих разработчиков, большое внимание уделено нюансам работы с
платформой .NET и XNA Framework.&lt;/b&gt;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;Microsoft XNA &amp;ndash; это базовый инструментарий Microsoft для разработки
кроссплатформенных игровых приложений. В первую очередь предназначен
для студентов, начинающих разработчиков и любителей. В основе XNA лежит
каркас XNA Framework, представляющий собой набор высокопроизводительных
библиотек для работы с графикой, звуком и устройствами ввода-вывода. В
качестве языка программирования используется C#, однако, в общем,
библиотеки являются обычными сборками .NET, что позволяет теоретически
писать код программы на любом .NET-совместимом языке программирования.
В данном курсе рассматриваются методы использования XNA Framework в
процессе разработки Windows-приложений, сочетающих богатый UI&amp;ndash;интерфейс
Windows Forms с высокой производительностью XNA. Особенное внимание
уделено программируемому графическому конвейеру и написанию шейдеров на
языке HLSL. Весь теоретический материал сопровождается примерами.&lt;/p&gt;
&lt;div style="padding-left:30px;" class="course_info_item"&gt;&lt;b&gt;&lt;span class="course_info_title"&gt;
Цель&lt;/span&gt;: &lt;/b&gt;Научить NET&amp;ndash;разработчика создавать высокопроизводительные графические приложения. 
&lt;br /&gt;&lt;/div&gt;
&lt;p style="padding-left:30px;"&gt;
&lt;b&gt;&lt;span class="course_info_title"&gt;Предварительные знания&lt;/span&gt;: &lt;/b&gt;Основы
C# и .NET Framework на уровне разработки простых GUI-приложений.
Каких&amp;ndash;либо специальных знаний в области графики не требуется.
&lt;/p&gt;
&lt;p&gt;Прошедшим выдадут чудесный сертификат &lt;img src="http://msug.vn.ua/emoticons/emotion-1.gif" alt="Smile" /&gt;.&lt;/p&gt;
&lt;div class="course_info_item"&gt;
&lt;span class="course_info_title"&gt;Диплом&lt;/span&gt;&lt;br /&gt;
&lt;div class="diplamas"&gt;
&lt;div class="diplama_course"&gt;
&lt;div class="image"&gt;
&lt;a target="_blank" href="http://www.intuit.ru/speciality/intuit/intxna/diplom/ru/"&gt;&lt;img src="http://www.intuit.ru/img/vuz_diploma/sm_6.jpg" width="72" border="0" height="106" alt="" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="name"&gt;
&lt;div class="vuz"&gt;(ИНТУИТ)&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="course_form_title"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="course_form_title"&gt;Записаться на курс можно по ссылке: &lt;a target="_blank" href="http://www.intuit.ru/department/se/intxna/"&gt;тут&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=798" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="XNA" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/XNA/default.aspx" /><category term="курсы" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/_3A044304400441044B04_/default.aspx" /></entry><entry><title>С#: Добавляем управляемые константы</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2009/06/03/740.aspx" /><link rel="enclosure" type="application/zip" length="15297" href="http://msug.vn.ua/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.07.40/ConsoleApplication1.zip" /><id>/blogs/lexremablog/archive/2009/06/03/740.aspx</id><published>2009-06-03T08:48:00Z</published><updated>2009-06-03T08:48:00Z</updated><content type="html">&lt;p&gt;Представте ситуацию, когда в вашем приложении есть наборы чисел,
представляющих собой некоторые константы. Они являються частью
конфигурационного класса.&lt;/p&gt;
&lt;p&gt;Какова стандартная реализация? &lt;/p&gt;
&lt;p&gt;Конечно что-то типа:&lt;/p&gt;
&lt;p&gt;class MyConstatInts&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static readonly int value1 = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static readonly int value2 = 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static readonly int value3 = 3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Ситуация
проста и хороша, но это если у нас будет только один файл констант. Все
новые значения придеться добавлять в него же. А если добавлять в другой
даже класс, нужно будет следить, чтобі значения констант не повторялись.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;И тут можно столкнуться с ситуацией, когда файл будет &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; а - ужасно переполнен.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; б - практически не структуризирован.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; в - можно случайно неправильно присвоить значение константе и будет value3 == value17.&lt;br /&gt;&lt;br /&gt;Такое часто достигаеться при архитектуре, построенной на сообщениях&lt;br /&gt;Теперь рассмотрим такой вариант:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;class MyConstatInts&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static int value1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static int value2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static int value3;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class MyConstatInts2&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static int value4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static int value5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static int value6;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;А значений внутри нету. Да, действительно нет. &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Для начала создадим некоторый атрибут...&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class MyAttribute : Attribute &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;и добавим этот атрибут к нашим константам: &amp;nbsp; &lt;/p&gt;
&lt;p&gt;[MyAttribute]&lt;/p&gt;
&lt;p&gt;class MyConstatInts&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static int value1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static int value2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static int value3;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Инициализация: &lt;/p&gt;
&lt;p&gt;Используем частично модифицированный хелпер, описаный &lt;a target="_blank" href="http://msug.vn.ua/blogs/lexremablog/archive/2009/05/19/reflection-c-type-string.aspx"&gt;здесь&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Добавлем к нему функцию Init:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;private static int _id;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; public static void Init()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; //iterate all assemblies&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; foreach (Assembly assembly in assemblies)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; Type[] types = assembly.GetTypes();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; foreach (Type type in types)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;br /&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; if (IsMyClass(type))&lt;br /&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; {&lt;br /&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; &amp;nbsp; FieldInfo[] fields = type.GetFields();&lt;br /&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; &amp;nbsp; foreach (FieldInfo fieldInfo in fields)&lt;br /&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; &amp;nbsp; {&lt;br /&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; if (fieldInfo.FieldType == typeof(int))&lt;br /&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;br /&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; int newID = System.Threading.Interlocked.Increment(ref _id);&lt;br /&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; fieldInfo.SetValue(null, _id);&lt;br /&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&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; &amp;nbsp; }&lt;br /&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; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; private static bool IsMyClass(Type type)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; object[] attributes = type.GetCustomAttributes(typeof(MyAttribute), true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; return (null != attributes &amp;amp;&amp;amp; attributes.Length &amp;gt; 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt;Для тестирования:&lt;/p&gt;
&lt;p&gt;static void Main(string[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ParseAssemblyList();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Init();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(MyConstatInts.value2.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ReadLine();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;На экране появиться 2 :). А кто не верит - смотрите приложеный файл ;).&lt;/p&gt;
&lt;p&gt;Таким образом в классах даже и имена переменых могут быть
одинаковыми (в разных классах), и... много еще чего... но значения
будут разные.&lt;/p&gt;
&lt;p&gt;
&lt;span style="color:white;"&gt;This is some text!&lt;/span&gt;
&lt;span style="color:white;"&gt;This is some text!&lt;/span&gt;
&lt;span style="color:white;"&gt;This is some text!&lt;/span&gt;
&lt;span style="color:white;"&gt;This is some text!&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=740" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="C#" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/C_2300_/default.aspx" /><category term="Essentials" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/Essentials/default.aspx" /><category term="hook" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/hook/default.aspx" /></entry><entry><title>Reflection C#. Типы данных в сборках запущеного проекта. Как получить тип (Type) по названию (string)</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2009/05/19/reflection-c-type-string.aspx" /><id>/blogs/lexremablog/archive/2009/05/19/reflection-c-type-string.aspx</id><published>2009-05-19T17:12:00Z</published><updated>2009-05-19T17:12:00Z</updated><content type="html">&lt;p&gt;Для того, чтобы узнать какие типы данных загружены в данный момент в приложении, можно использовать такой вариант.&lt;/p&gt;
&lt;p&gt;Исходные данные - файл с названием некоторого класа и именем сборки, где класс находиться, например:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;assamblyList.txt&lt;/b&gt;:&lt;/p&gt;
&lt;p&gt;MyAplicationDll.Class1, MyAplicationDll&lt;/p&gt;
&lt;p&gt;MyAplication2Dll.Class1, MyAplication2Dll&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;где первая часть - полное имя некоторого класса, который точно присутствует в сборке, а вторая - имя сборки.&lt;/p&gt;
&lt;p&gt;Для парсинга сборок - используем приведенную дальше функцию:&lt;/p&gt;
&lt;p&gt;&amp;nbsp; static Assembly[] assemblies;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; static void ParseAssemblyList()&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp; List&amp;lt;string&amp;gt; typeNames = new List&amp;lt;string&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp; StreamReader reader = new StreamReader(&amp;quot;assamblyList.txt&amp;quot;);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; string path = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp; while((path = reader.ReadLine()) != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(path != string.Empty)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typeNames.Add(path);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (typeNames.Count &amp;gt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; assemblies = new Assembly[typeNames.Count];&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0; i &amp;lt; assemblies.Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assemblies [ i ] = Type.GetType(typeNames[ i ], true).Assembly;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Имея данные о сборках, можно искать в них уже нужные типы данных.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; public static Type GetType(string typeName)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp; Type type = null;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; for(int i = 0; i &amp;lt; assemblies.Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; type = assemblies[ i ].GetType(typeName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(type != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; if(null == type)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; type = Type.GetType(typeName, false); //на случай, когда запрашиваеться системный тип, например &amp;quot;System.Boolean&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; return type;&lt;br /&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;Указав сбоки, доступные для парсинга, вы сможете получить доступ таким методом ко всем типам данных внутри этих сборок.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=687" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="C#" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/C_2300_/default.aspx" /><category term="reflection" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/reflection/default.aspx" /></entry><entry><title>До конца кризиса осталось....</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2009/04/25/641.aspx" /><id>/blogs/lexremablog/archive/2009/04/25/641.aspx</id><published>2009-04-25T19:50:00Z</published><updated>2009-04-25T19:50:00Z</updated><content type="html">&lt;p&gt;Последнее время все чаще хочеться отвлечься от тем технических и сказать пару слов о том, что близко каждому гражаднину страны.&lt;/p&gt;
&lt;p&gt;Украинский кризис - не простой, так как в нем наложились две разные причины&amp;nbsp; - мировой финансовый, и внутренний &lt;span style="text-decoration:line-through;"&gt;беспредельный&lt;/span&gt; политический.&amp;nbsp; Прогнозировать окончание такого знаменательного события очень даже приятно... Думаю, в некоторых букмекерских конторах даже ставки принимают;).&lt;/p&gt;
&lt;p&gt;Но если вы не азартный игрок, а просто вопиющий в пустыне, то можете свой голос присоединить к около 3000 проголосовавшим в таком интересном счётчике как этот:&lt;/p&gt;
&lt;a href="http://www.smoney.ru/tests/stopcrisis/"&gt;&lt;img src="http://www.smoney.ru/tests/stopcrisis/last.gif" alt="SmartMoney: Когда кончится кризис?" border="0" width="186" height="107" /&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=641" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="кризис" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/_3A0440043804370438044104_/default.aspx" /></entry><entry><title>Ищем работу? "Предохраняемся" от чудо - обьявлений</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2009/04/16/quot-quot.aspx" /><id>/blogs/lexremablog/archive/2009/04/16/quot-quot.aspx</id><published>2009-04-16T17:58:00Z</published><updated>2009-04-16T17:58:00Z</updated><content type="html">&lt;p&gt;Этот пост адресован не так IT специалистам, как молодым студентам 2-5 курсов, котрые в поиске зароботка на практику, на лето, а кто и на более длительный период, просматривают кучи обьявлений в газетах и на форумах.&lt;/p&gt;
&lt;p&gt;Хочу предостеречь от некоторых &amp;quot;шаблонных&amp;quot; предложений мошенников, на которые легко купиться, но уже побывав на собеседовании, жалеешь о потраченом времени. &lt;/p&gt;
&lt;p&gt;Наиболее распространенный вариант: &lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. &amp;quot;Работа в уютном офисе. Молодой коллектив. Ищем кадровиков, менеджеров по персоналу. Опыт значения не имеет. Гибкий график.&amp;quot;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Честно? Полный бред со стороны приличной коммерческой фирмы. &lt;/p&gt;
&lt;p&gt;Во первых - очень редко пишут что за уютный офис. Во вторых, - зачем куча таких вакансий, как менеджер по персоналу? В третьих, кому нужна куча кадровиков без опыта работы? И четвертое - какой гибкий график в нормальной коммерческой фирме?&lt;img src="http://msug.vn.ua/emoticons/emotion-3.gif" alt="Surprise" /&gt; Кстати, старики обычно не клюют, поэтому здесь не врут - коллектив действительно молодой &lt;img src="http://msug.vn.ua/emoticons/emotion-1.gif" alt="Smile" /&gt;.&lt;/p&gt;
&lt;p&gt;Объясняться все просто: сетевой маркетинг. Вы попадаете в касту таких же как и Вы (за что должны платить какие либо взносы и/или покупать продукцию своей фирмы), и попутно будете вербовать себе подобных с покупок которых и будете иметь уже некоторый заработок/процент. Честно скажу, как по мне, занятие жалкое и безперспективное.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. &amp;quot;Государственная компания. Работа на телефоне. Приличный заработок. Свободный график.&amp;quot;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Мечта для студента, не так ли? Ответ прост, как хорошо пропарена репа - страховая компания. Да, заработать можно... Но &lt;/p&gt;
&lt;p&gt;а) - застрахуйте сначала себя на приблизительно ххх у.е.(сума зависит от компании) &lt;/p&gt;
&lt;p&gt;б) потом ищите себе подобных, убеждайте, что в кризис им особенно нужно застраховать свои прекрасные... например ноги от брутального конца света или банального попадения под машину.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3. &amp;quot;Финансовая компания. Заработок от 500 у.е. Обучение. Ищем специалистов, готовых переехать к нам в город.&amp;quot;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Зарплата очень неплохая, опыта работы снова в требованиях не наблюдаем.... Где ж подвох?&lt;/p&gt;
&lt;p&gt;а) Обучение. Оно обычно платное (100-200 у.е. за пару часов неизвестно насколько полезной информации).&lt;/p&gt;
&lt;p&gt;б) сообщение про переезд подкупает, не так ли? Но по сути, ничего не значит... Вы можете приехать, поучитья, и потом спокойно валить на родину, обогатив своих незадачливых преподавателей.&lt;/p&gt;
&lt;p&gt;в) Зарабатывать будете сами... Как? ответ кроеться в названии &amp;quot;финансовая&amp;quot;. Обычно это брокерские конторы, купившие лицензии работать на форексе. К сожалению, большие зароботки для одних являються большими убытками для других. Тоесть после того, как вам даже дали возможность со своими кровными 50 баксами впервые выйти на рынок(за что вы также заплатите компании), велика вероятность потерять свои 50 баксов за первые 10 минут и уйти нисчем (компания обязательств обычно на себя также не возлагает).&lt;/p&gt;
&lt;p&gt;Хм... список явно этим не ограничиться, так что если есть опыт - делитесь им в коментах.&lt;/p&gt;
&lt;p&gt;Эпилог. Если у вас есть возможность поработать&amp;nbsp; - не столько важен заработок, сколько опыт, который Вы можете получить. Так что будьте бдительны и акуратны, устраивайтесь в компании с &amp;quot;понятным&amp;quot; для Вас родом деятельности. А еще - не забывайте учиться. Например, воспользуйтесь програмой DreamSpark и пройдите бесплатную сертификацию. Как вариант.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Удачи в поиске!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=617" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="вакансии" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/_320430043A0430043D04410438043804_/default.aspx" /><category term="Винница" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/_120438043D043D04380446043004_/default.aspx" /><category term="работа" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/_4004300431043E0442043004_/default.aspx" /></entry><entry><title>Отслеживаем Windows события в Вашем .NET приложении</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2009/04/02/net.aspx" /><id>/blogs/lexremablog/archive/2009/04/02/net.aspx</id><published>2009-04-02T13:16:00Z</published><updated>2009-04-02T13:16:00Z</updated><content type="html">&lt;p&gt;Возникла сегодня задача... Сделать возможность приложению реагировать на нажатие клавиш. Ничего сложного, если у вас одна форма(или контрол), для которой можна перегрузить OnKeyPress или добавить делегат обработчик события KeyPress.&lt;/p&gt;
&lt;p&gt; Вот только приложение у меня многоуровневое и вложеность контролов была довольно большая. Полазив в интернете нашел такое &lt;a target="_blank" href="http://support.microsoft.com/kb/815252"&gt;описание&lt;/a&gt;: Когда есть выбраная ячейка в DataGrid, событие нажатия клавиши не попадет в обработчик к DataGrid, его перехватит ячейка - сделано для того, чтобы можно было двигаться по таблице с помощью клавиш навигации. По аналогии сообразил, что и в моем приложении нельзя перехватить сообщения клавиш, так как они отлавливаються в контролах. Неудобно было бы лопатить весь свой код, а также код сторонних разработчиков контролов, который я использую, для добавления обработчиков нажатия клавиш и пересылки сообщений главной форме. Поэтому я продолжил поиск.&lt;/p&gt;
&lt;p&gt;И наиболее интересным мне представилась возможность отлавливать сообщения на уровне Windows. Для этого можно использовать вспомогательный функции WindowsHook. Они не являються управляемыми, однако довольно точно исполняют нужную задачу. &lt;/p&gt;
&lt;p&gt;Суть в том, что Вы практически подписываетесь через колбек на низкоуровневые сообщения Windows. Соответственно, обрабатывая их по своей логике, можете использовать информацию по назначению.&lt;/p&gt;
&lt;p&gt;Рассмотрим &lt;a target="_blank" href="http://blogs.msdn.com/toub/archive/2006/05/03/589423.aspx"&gt;пример&lt;/a&gt; консольного приложения, отлавливающего нажатие клавиш. Скопируйте в консольный проект, скомпилируйте и запустите.&lt;/p&gt;
&lt;p&gt;&lt;span id="lblPreview"&gt;&lt;code&gt;&lt;span style="font-size:x-small;font-family:Courier New;color:black;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Diagnostics;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; InterceptKeys&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; WH_KEYBOARD_LL = 13;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; WM_KEYDOWN = 0x0100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; LowLevelKeyboardProc _proc = HookCallback;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; _hookID = &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt;.Zero;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_hookID = SetHook(_proc);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Application.Run();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UnhookWindowsHookEx(_hookID);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; SetHook(LowLevelKeyboardProc proc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (Process curProcess = Process.GetCurrentProcess())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (ProcessModule curModule = curProcess.MainModule)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; SetWindowsHookEx(WH_KEYBOARD_LL, proc,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetModuleHandle(curModule.ModuleName), 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; LowLevelKeyboardProc(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; nCode, &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; wParam, &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; lParam);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; HookCallback(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; nCode, &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; wParam, &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; lParam)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (nCode &amp;gt;= 0 &amp;amp;&amp;amp; wParam == (&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt;)WM_KEYDOWN)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; vkCode = Marshal.ReadInt32(lParam);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Keys pressed = (Keys)vkCode;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (pressed == Keys.Space)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Write(&lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (pressed == Keys.Return || pressed == Keys.Tab)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Write(Environment.NewLine);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (pressed &amp;gt;= Keys.A &amp;amp;&amp;amp; pressed &amp;lt;= Keys.Z)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Write(pressed);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; CallNextHookEx(_hookID, nCode, wParam, lParam);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;[DllImport(&lt;span style="color:#a31515;"&gt;&amp;quot;user32.dll&amp;quot;&lt;/span&gt;, CharSet = CharSet.Auto, SetLastError = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; SetWindowsHookEx(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; idHook,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LowLevelKeyboardProc lpfn, &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; hMod, &lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt; dwThreadId);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;[DllImport(&lt;span style="color:#a31515;"&gt;&amp;quot;user32.dll&amp;quot;&lt;/span&gt;, CharSet = CharSet.Auto, SetLastError = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;: MarshalAs(UnmanagedType.Bool)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; UnhookWindowsHookEx(&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; hhk);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;[DllImport(&lt;span style="color:#a31515;"&gt;&amp;quot;user32.dll&amp;quot;&lt;/span&gt;, CharSet = CharSet.Auto, SetLastError = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; CallNextHookEx(&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; hhk, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; nCode,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; wParam, &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; lParam);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;[DllImport(&lt;span style="color:#a31515;"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;, CharSet = CharSet.Auto, SetLastError = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt; GetModuleHandle(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; lpModuleName);&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Теперь вы подписаны на нажатие клавишь на клавиатуре. Список сообщений, на которые вы можете подписатся можно найти &lt;a target="_blank" href="http://www.pinvoke.net/default.aspx/Enums/WindowsMessages.html"&gt;здесь&lt;/a&gt;.Так можно просто прятать ваше приложение или востанавливать, реализовывать hotkeys.&lt;/p&gt;
&lt;p&gt;П.С. Если запустить это приложение невидимо в фоне вы практически можете записывать все свои(и не только;) ) действия на компьютере. А если тут еще и добавить отправку через интернет.... &lt;/p&gt;
&lt;p&gt;Пользуйтесь на здоровье.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=511" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="Essentials" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/Essentials/default.aspx" /><category term="С#" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/_21042300_/default.aspx" /><category term="hook" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/hook/default.aspx" /></entry><entry><title>Материалы по веб-технологиям Microsoft.</title><link rel="alternate" type="text/html" href="/blogs/lexremablog/archive/2009/03/25/microsoft.aspx" /><id>/blogs/lexremablog/archive/2009/03/25/microsoft.aspx</id><published>2009-03-25T15:56:00Z</published><updated>2009-03-25T15:56:00Z</updated><content type="html">&lt;p&gt;В этом сообщении собраны основные ресурсы на которых можно найти материалы по веб-технологиям Microsoft.&lt;/p&gt;
&lt;p&gt;Прежде всего, рекомендуем обратить внимание на портал &lt;a href="http://www.microsoft.com/Rus/Msdnaa/Curricula/Default.mspx"&gt;http://www.microsoft.com/Rus/Msdnaa/Curricula/Default.mspx&lt;/a&gt;, где собрано большое количество бесплатных материалов курсов по технологиям Microsoft.  &lt;/p&gt;
&lt;p&gt;Помимо этого рекомендуем следующие материалы (англоязычные помечены &lt;b&gt;EN&lt;/b&gt;):  &lt;/p&gt;
&lt;h2&gt;Технические доклады&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Разработка веб-приложений на ASP.NET: &lt;a href="http://www.techdays.ru/Category.aspx?Tag=ASP.NET"&gt;http://www.techdays.ru/Category.aspx?Tag=ASP.NET&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Разработка веб-приложений с использованием ASP.NET MVC Framework: &lt;a href="http://www.techdays.ru/Category.aspx?Tag=MVC"&gt;http://www.techdays.ru/Category.aspx?Tag=MVC&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Установка и администрирование веб-сервера IIS 7: &lt;a href="http://www.techdays.ru/Category.aspx?Tag=IIS+7"&gt;http://www.techdays.ru/Category.aspx?Tag=IIS+7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Учебные курсы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Видеокурс знакомство с ASP.NET: &lt;a href="http://www.asp.net/learn/moving-to-asp.net-2.0/"&gt;http://www.asp.net/learn/moving-to-asp.net-2.0/&lt;/a&gt; (EN)  &lt;/li&gt;
&lt;li&gt;Видео курс об основых безопасности в ASP.NET: &lt;a href="http://www.asp.net/learn/security/"&gt;http://www.asp.net/learn/security/&lt;/a&gt; (EN)  &lt;/li&gt;
&lt;li&gt;Технология разработки веб-приложений ASP.NET 2.0: &lt;a href="http://www.intuit.ru/department/se/aspdotnet/"&gt;http://www.intuit.ru/department/se/aspdotnet/&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Разработка Веб-приложений ASP .NET с использованием Visual Studio .NET: &lt;a href="http://www.intuit.ru/department/internet/aspnetvsnet/"&gt;http://www.intuit.ru/department/internet/aspnetvsnet/&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Разработка интерактивных сайтов с помощью Microsoft Visual Web Developer: &lt;a href="http://www.intuit.ru/department/internet/msvwdev/"&gt;http://www.intuit.ru/department/internet/msvwdev/&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Администрирование веб-серверов в IIS: &lt;a href="http://www.intuit.ru/department/internet/websadmin/"&gt;http://www.intuit.ru/department/internet/websadmin/&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Безопасность IIS: &lt;a href="http://www.intuit.ru/department/internet/iissecurity/"&gt;http://www.intuit.ru/department/internet/iissecurity/&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Конфигурирование и настройка Microsoft ASP.NET: &lt;a href="http://www.intuit.ru/department/internet/aspnetsetup/"&gt;http://www.intuit.ru/department/internet/aspnetsetup/&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Поддержка разработки распределенных приложений в Microsoft .NET Framework: &lt;a href="http://www.intuit.ru/department/se/msfdev/"&gt;http://www.intuit.ru/department/se/msfdev/&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Программирование для веб-сервера IIS: &lt;a href="http://www.intuit.ru/department/internet/progiis/"&gt;http://www.intuit.ru/department/internet/progiis/&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Microsoft .NET Framework SDK QuickStart Tutorials: &lt;a href="http://quickstarts.asp.net/QuickStartv20/default.aspx"&gt;http://quickstarts.asp.net/QuickStartv20/default.aspx&lt;/a&gt; (EN)  &lt;/li&gt;
&lt;li&gt;Visual Web Developer Express 2005 Guided Tour: &lt;a href="http://www.asp.net/guidedtour2/"&gt;http://www.asp.net/guidedtour2/&lt;/a&gt; (EN)  &lt;/li&gt;
&lt;li&gt;Видео курс по использованию Ajax Control Toolkit для создания веб-приложений на технологии Ajax: &lt;a href="http://www.asp.net/learn/ajax-control-toolkit/"&gt;http://www.asp.net/learn/ajax-control-toolkit/&lt;/a&gt; (EN)  &lt;/li&gt;
&lt;li&gt;Видео курс о технологии Microsoft Ajax: &lt;a href="http://www.asp.net/learn/ajax/"&gt;http://www.asp.net/learn/ajax/&lt;/a&gt; (EN)  &lt;/li&gt;
&lt;li&gt;Видео курс о подходе к разработке веб-приложений с использованием ASP.NET MVC Framework: &lt;a href="http://www.asp.net/learn/mvc/"&gt;http://www.asp.net/learn/mvc/&lt;/a&gt; (EN)  &lt;/li&gt;
&lt;li&gt;Видео курс по работе с данными: &lt;a href="http://www.asp.net/learn/data-access/"&gt;http://www.asp.net/learn/data-access/&lt;/a&gt; (EN)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Статьи&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Документация MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/ms644563.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms644563.aspx&lt;/a&gt; (EN)  &lt;/li&gt;
&lt;li&gt;Раздел ASP.NET @ GotDotNet: &lt;a href="http://www.gotdotnet.ru/LearnDotNet/ASPNET/default.aspx"&gt;http://www.gotdotnet.ru/LearnDotNet/ASPNET/default.aspx&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Раздел веб-службы @ GotDotNet: &lt;a href="http://www.gotdotnet.ru/LearnDotNet/XMLWebServices/default.aspx"&gt;http://www.gotdotnet.ru/LearnDotNet/XMLWebServices/default.aspx&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Раздел Silverlight @ GotDotNet: &lt;a href="http://www.gotdotnet.ru/LearnDotNet/Silverlight/default.aspx"&gt;http://www.gotdotnet.ru/LearnDotNet/Silverlight/default.aspx&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Статьи по ASP.NET @ AspNetMania: &lt;a href="http://aspnetmania.com/Articles/default.aspx"&gt;http://aspnetmania.com/Articles/default.aspx&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;Раздел ASP.NET @ RSDN: &lt;a href="http://rsdn.ru/summary/1927.xml"&gt;http://rsdn.ru/summary/1927.xml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a target="_blank" href="http://blogs.msdn.com/rusweb/archive/2009/03/25/9507543.aspx"&gt;Источник&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msug.vn.ua/aggbug.aspx?PostID=495" width="1" height="1"&gt;</content><author><name>LexRema</name><uri>http://msug.vn.ua/members/LexRema/default.aspx</uri></author><category term="Microsoft" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/Microsoft/default.aspx" /><category term="web" scheme="http://msug.vn.ua/blogs/lexremablog/archive/tags/web/default.aspx" /></entry></feed>