<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-5392432030185421171</id><updated>2010-03-17T05:42:01.248+06:00</updated><title type='text'>Software Development</title><subtitle type='html'>Статьи на тему разработки программного обеспечения</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default?start-index=26&amp;max-results=25'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-886906384590810368</id><published>2010-01-20T00:11:00.006+06:00</published><updated>2010-01-20T00:27:01.083+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>error C2061: syntax error : identifier '_DebugHeapTag_func'</title><content type='html'>This compile error take place in debug mode only. If you got this compile error - explore your code find redefinitions for the "new" operator. Remove these redefinitions and compilation will succeed.&lt;br /&gt;&lt;br /&gt;For example, in MFC application wizard insert following definition:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#ifdef _DEBUG&lt;br /&gt;#define new DEBUG_NEW&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Just remove these lines. That's all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-886906384590810368?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/886906384590810368/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=886906384590810368' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/886906384590810368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/886906384590810368'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2010/01/error-c2061-syntax-error-identifier.html' title='error C2061: syntax error : identifier &apos;_DebugHeapTag_func&apos;'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-3872357921308796062</id><published>2009-12-19T14:15:00.002+06:00</published><updated>2010-01-03T14:06:48.060+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Библиотеки'/><title type='text'>Библиотека cURL и Gene6 FTP Server</title><content type='html'>Долгое время пользуюсь cURL и вот столкнулся с ситуацией, когда моё приложение оказалось неспособно залить файл на FTP-сервер, причём раньше таких проблем не было. Проявляется это только для сервера Gene6 FTP Server, а на других, имеющихся у меня, всё работает нормально.&lt;br /&gt;&lt;br /&gt;После анализа ситуации выяснилось, что cURL, анализируя результат выполнения операции ожидает от сервера только один ответ, а Gene6 отвечает дважды. Вот лог:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;(001517) 12/19/2009 2:25:07 PM - user (192.168.2.12) &gt; APPE TPG.pdf&lt;br /&gt;(001517) 12/19/2009 2:25:07 PM - user (192.168.2.12) &gt; asked to upload 'TPG.pdf' in 'D:\ftp\user\test\ftp\' --&gt; Access allowed.&lt;br /&gt;(001517) 12/19/2009 2:25:07 PM - user (192.168.2.12) &gt; 150 Data connection accepted from 192.168.2.12:3147; transfer starting for TPG.pdf.&lt;br /&gt;(001517) 12/19/2009 2:25:07 PM - user (192.168.2.12) &gt; started uploading 'TPG.pdf' in 'D:\ftp\user\test\ftp\'.&lt;br /&gt;(001517) 12/19/2009 2:25:07 PM - user (192.168.2.12) &gt; 150 APPE supported. Ready to append file "TPG.pdf" at offset 202400.&lt;br /&gt;(001517) 12/19/2009 2:25:08 PM - user (192.168.2.12) &gt; 226 File received ok.&lt;br /&gt;(001517) 12/19/2009 2:25:08 PM - user (192.168.2.12) &gt; finished uploading 'TPG.pdf' in 'D:\ftp\user\test\ftp\' -  (00:00:02 - 197.656 KB - 98.828 KBytes/s).&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Сервер сначала шлёт сообщение с кодом 150, а потом 226, но cURL уже отфильтровал ответ и интерпретировал его как "предыдущая команда завершилась с ошибкой". После чего передача данных прекращается.&lt;br /&gt;&lt;br /&gt;Анализ кода ответа FTP-сервера находится в файле ftp.c (исходный код библиотеки cURL). в районе строки 3342.&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;if(!ftpc-&gt;dont_check) {&lt;br /&gt;    /* 226 Transfer complete, 250 Requested file action okay, completed. */&lt;br /&gt;    if((ftpcode != 226) &amp;&amp; (ftpcode != 250)) {&lt;br /&gt;        failf(data, "server did not report OK, got %d", ftpcode);&lt;br /&gt;        result = CURLE_PARTIAL_FILE;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Нехитрая правка в этом месте помогает решить проблему:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;if(!ftpc-&gt;dont_check) {&lt;br /&gt;    /* Some ftp servers send double response, so if we get response code equal to 150 - try to get response again. */&lt;br /&gt;    if(ftpcode == 150))&lt;br /&gt;        result = Curl_GetFTPResponse(&amp;nread, conn, &amp;ftpcode);&lt;br /&gt;&lt;br /&gt;    /* 226 Transfer complete, 250 Requested file action okay, completed. */&lt;br /&gt;    if((ftpcode != 226) &amp;&amp; (ftpcode != 250)) {&lt;br /&gt;        failf(data, "server did not report OK, got %d", ftpcode);&lt;br /&gt;        result = CURLE_PARTIAL_FILE;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-3872357921308796062?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/3872357921308796062/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=3872357921308796062' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/3872357921308796062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/3872357921308796062'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2009/12/curl-gene6-ftp-server.html' title='Библиотека cURL и Gene6 FTP Server'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-1527768488860374381</id><published>2009-12-14T23:04:00.002+06:00</published><updated>2010-01-03T14:05:47.081+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Базы данных'/><title type='text'>Проверка на существование таблиц и других объектов баз данных MS SQL</title><content type='html'>Проверка на существование таблиц, хранимых процедур, видов, функций и даже ключей основана на выборках из таблицы, а точнее вида (View), под названием sysobjects.&lt;br /&gt;&lt;br /&gt;Вот пример функции, проверяющей существование таблицы в базе данных:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;ALTER FUNCTION [dbo].[is_tbl_exists] &lt;br /&gt;(&lt;br /&gt; @tbl_name varchar(50)&lt;br /&gt;)&lt;br /&gt;RETURNS bit&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; IF EXISTS(SELECT name FROM sysobjects WHERE name = N'' + @tbl_name AND xtype='U')&lt;br /&gt;  RETURN 1&lt;br /&gt;&lt;br /&gt; RETURN 0&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Если в условии выборки по столбцу xtype значение 'U' заменить на 'V' - получим проверку на существование вида&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;ALTER FUNCTION [dbo].[is_view_exists] &lt;br /&gt;(&lt;br /&gt; @view_name varchar(50)&lt;br /&gt;)&lt;br /&gt;RETURNS bit&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; IF EXISTS(SELECT name FROM sysobjects WHERE name = N'' + @view_name AND xtype='V')&lt;br /&gt;  RETURN 1&lt;br /&gt;&lt;br /&gt; RETURN 0&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Далее, проверка на существование функций:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;ALTER FUNCTION [dbo].[is_function_exists] &lt;br /&gt;(&lt;br /&gt; @function_name varchar(50)&lt;br /&gt;)&lt;br /&gt;RETURNS bit&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; IF EXISTS(SELECT name FROM sysobjects WHERE name = N'' + @function_name AND xtype='FN')&lt;br /&gt;  RETURN 1&lt;br /&gt;&lt;br /&gt; RETURN 0&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Проверка на существование процедуры:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;ALTER FUNCTION [dbo].[is_procedure_exists] &lt;br /&gt;(&lt;br /&gt; @procedure_name varchar(50)&lt;br /&gt;)&lt;br /&gt;RETURNS bit&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; IF EXISTS(SELECT name FROM sysobjects WHERE name = N'' + @procedure_name AND xtype='P')&lt;br /&gt;  RETURN 1&lt;br /&gt;&lt;br /&gt; RETURN 0&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-1527768488860374381?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/1527768488860374381/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=1527768488860374381' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/1527768488860374381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/1527768488860374381'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2009/12/ms-sql.html' title='Проверка на существование таблиц и других объектов баз данных MS SQL'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-9007250897659497241</id><published>2009-12-14T22:13:00.002+06:00</published><updated>2010-01-03T14:05:47.082+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Базы данных'/><title type='text'>Конвертация даты в MS SQL из varchar в datetime и обратно</title><content type='html'>Иногда бывает необходимо реализовать конвертацию даты, записанной в виде строки в тип datetime или наоборот. В TSQL есть функция CONVERT, которая позволяет выполнить такое преобразование. Например, пользовательская функция преобразования значения типа datetime в строку вида YYYY-MM-DD HH:MM:SS, может выглядеть так:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;CREATE FUNCTION [dbo].[dt_to_str] &lt;br /&gt;(&lt;br /&gt;    @dt datetime&lt;br /&gt;)&lt;br /&gt;RETURNS varchar(19)&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;     RETURN CONVERT(varchar(19), @dt, 120)&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Однако использовать CONVERT для преобразования строки в datetime не безопасно, особенно если планируется теражировать базу. Может возникнуть ситуация, когда это преобразование будет завершаться с ошибкой из-за неверного формата записи даты.&lt;br /&gt;Более безопасный способ преобразования - использование функции dateadd. Известно, что datetime отсчитывается от 1 января 1900 года. Этой дате соответствует нулевое значение, проверьте:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;SELECT cast(0 as datetime)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Соответственно, находя разницу с этой нулевой датой и прибавляя её к ней мы можем получить представление строки в виде даты типа datetime. Для начала простой пример:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;ALTER FUNCTION [dbo].[make_date] &lt;br /&gt;(&lt;br /&gt; @day int,&lt;br /&gt; @month int,&lt;br /&gt; @year int&lt;br /&gt;)&lt;br /&gt;RETURNS datetime&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; DECLARE @dt datetime&lt;br /&gt; SET @dt = cast(0 as datetime)&lt;br /&gt;&lt;br /&gt; -- прибавляем года&lt;br /&gt; SELECT @dt = dateadd(year, (@year - 1900), @dt)&lt;br /&gt; -- прибавляем месяцы&lt;br /&gt; SELECT @dt = dateadd(month, (@month - 1), @dt)&lt;br /&gt; -- прибавляем дни&lt;br /&gt; SELECT @dt = dateadd(day, (@day - 1), @dt)&lt;br /&gt;&lt;br /&gt; RETURN @dt&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Эта функция получает в качестве целочисленных параметров день, месяц и год, а возвращает соответствующую им дату в формате datetime.&lt;br /&gt;&lt;br /&gt;Теперь рассмотрим комбинированный пример со строками и целыми числами. Теперь дата и время будут представлены в виде длинного целого формата YYYYMMDDHHII. Функция преобразования будет выглядеть так:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;ALTER FUNCTION [dbo].[int_to_datetime] &lt;br /&gt;(&lt;br /&gt; @val bigint&lt;br /&gt;)&lt;br /&gt;RETURNS datetime&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; DECLARE @str varchar(12)&lt;br /&gt; SET @str = CAST(@val AS varchar)&lt;br /&gt;&lt;br /&gt; IF LEN(@str) &lt; 12 -- Формат числа неверный&lt;br /&gt;  OR CAST(SUBSTRING(@str, 5, 2) AS int) &gt; 12 -- Месяц неверный&lt;br /&gt;  OR CAST(SUBSTRING(@str, 7, 2) AS int) &gt; 31 -- День&lt;br /&gt;  OR CAST(SUBSTRING(@str, 9, 2) AS int) &gt; 23 -- Час&lt;br /&gt;  OR CAST(SUBSTRING(@str, 11, 2) AS int) &gt; 60 -- Минута&lt;br /&gt;  RETURN NULL&lt;br /&gt;&lt;br /&gt; DECLARE @dt datetime&lt;br /&gt; SET @dt = cast(0 as datetime)&lt;br /&gt;&lt;br /&gt; -- извлечение года&lt;br /&gt; SELECT @dt = dateadd(year, (SUBSTRING(@str, 1, 4) - 1900), @dt)&lt;br /&gt; -- извлечение месяца&lt;br /&gt; SELECT @dt = dateadd(month, (SUBSTRING(@str, 5, 2) - 1), @dt)&lt;br /&gt; -- извлечение дня&lt;br /&gt; SELECT @dt = dateadd(day, (SUBSTRING(@str, 7, 2) - 1), @dt)&lt;br /&gt; -- извлечение часа&lt;br /&gt; SELECT @dt = dateadd(hour, CAST(SUBSTRING(@str, 9, 2) AS int), @dt)&lt;br /&gt; -- извлечение минуты&lt;br /&gt; SELECT @dt = dateadd(minute, CAST(SUBSTRING(@str, 11, 2) AS int), @dt)&lt;br /&gt;&lt;br /&gt; RETURN @dt&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Работает это преобразование быстро и вы не зависите от установок формата даты.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-9007250897659497241?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/9007250897659497241/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=9007250897659497241' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/9007250897659497241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/9007250897659497241'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2009/12/ms-sql-varchar-datetime.html' title='Конвертация даты в MS SQL из varchar в datetime и обратно'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-5651509937763859274</id><published>2009-09-26T18:20:00.002+07:00</published><updated>2009-10-09T11:02:30.318+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Полезные инструменты'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Boost Test. Настройка и использование</title><content type='html'>Недавно в своём блоге я делал краткий обзор инструментов юнит-тестирования и отмечал наличие короткой справки для быстрого старта с библиотекой UnitTest++. Сегодня я хочу предложить вариант такой справки для Boost Test, чего вы не найдёте в официальной документации к этому инструменту. Описание ориентировано на использование в Windows с Visual Studio 2005/2008.&lt;br /&gt;&lt;br /&gt;Для работы с примерами вам нужно скачать с сайта &lt;a href="http://www.boost.org/"&gt;www.boost.org&lt;/a&gt; пакет библиотек (на текущий момент версии 1.39). Распакуйте скачанный архив и мы можем начинать.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:180%;"&gt;Сборка библиотеки Boost.Test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Использовать Boost.Test можно в бинарном виде и в виде подключаемого заголовочного файла. Далее я буду описывать использование этой библиотеки в двоичном виде, подключаемой к тестовому проекту статически.&lt;br /&gt;&lt;br /&gt;В корневой директории скачанного дистрибутива Boost найдите файл bootstrap.bat и выполните его. В результате будет подготовлена к использованию утилита сборки Boost. В той же директории, где хранится только что запущенный bat-файл, появится файл bjam.exe.&lt;br /&gt;&lt;br /&gt;Теперь запустите из командной строки blam.exe с параметрами сборки Boost.Test:&lt;br /&gt;bjam --build-dir=..\boosttest\build_dir toolset=msvc --libdir=..\boosttest\lib --includedir=..\boosttest\include --with-test  variant=debug link=static threading=multi runtime-link=shared install&lt;br /&gt;&lt;br /&gt;В той же папке, куда вы распаковали архив Boost будет создана папка boosttest, содержащая 3 папки:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;build_dir, где хранятся промежуточные и результирующие файлы сборки Boost.Test&lt;/li&gt;&lt;li&gt;include, с заголовочными файлами всех утилит библиотеки Boost для использования в вашем проекте&lt;/li&gt;&lt;li&gt;lib, с lib-файлами для подключения к проекту&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;Создание тестового проекта&lt;/span&gt;&lt;br /&gt;Далее я опишу создание тестового проекта с юнит-тестами. Пользуясь этим описанием вы сможете по аналогии использовать тесты в своём проекте.&lt;br /&gt;&lt;br /&gt;Добавлять юнит-тесты мы будем прямо в основной проект. Можно также юнит-тесты поместить в отдельный проект, но в этом случае у вас могут возникнуть проблемы линковки. Для варианта с отдельным проектом для тестов необходимо экспортировать тестируемые функции и классы, а это может усложнить работу с сильно связанными классами, возможно как раз теми, которым остро необходим рефакторинг.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Итак, создадим пустой проект:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;New Project &amp;gt; Visual C++ &amp;gt; General &amp;gt; Empty Project&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Сначала напишем простую программу умножающую 2 целых числа и отображающую их произведение.&lt;br /&gt;Добавим в проект файл main.cpp со следующим содержанием:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;//! main.cpp&lt;br /&gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include "functions.h"&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;void main()&lt;br /&gt;{&lt;br /&gt;cout &amp;lt;&amp;lt; "Main Program" &amp;lt;&amp;lt; endl;&lt;br /&gt;cout &amp;lt;&amp;lt; "5 * 4 = " &amp;lt;&amp;lt; multiply(5, 4) &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Также добавим файл с реализацией функции умножения:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;//! functions.cpp&lt;br /&gt;#include "functions.h"&lt;br /&gt;&lt;br /&gt;int multiply(const int x, const int y)&lt;br /&gt;{&lt;br /&gt;return x * y;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;И заголовочный файл с описанием функции умножения:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;//! functions.h&lt;br /&gt;int multiply(const int x, const int y);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь добавим файлы с кодом тестирования. Сначала добавим файл maintest.cpp, в котором объявим константу BOOST_TEST_MAIN для того, чтобы Boost Test автоматически сгенерировал функцию main для тестов. Здесь же напишем первый тест, который всегда будет ошибочным. Я делаю это только для того, чтобы показать как использовать библиотеку для тестов, реализация которых находится в нескольких файлах.&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;//! maintest.cpp&lt;br /&gt;&lt;br /&gt;#define BOOST_TEST_MAIN&lt;br /&gt;&lt;br /&gt;#include &amp;lt;boost/test/unit_test.hpp&amp;gt;&lt;br /&gt;&lt;br /&gt;BOOST_AUTO_TEST_CASE(SimpleTestInMainTestingModule)&lt;br /&gt;{&lt;br /&gt;BOOST_CHECK(1 == 2);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь добавим ещё один файл functionsTest.cpp, который будет содержать тест для функции multiply из functions.cpp:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;//! functionsTest.cpp&lt;br /&gt;&lt;br /&gt;#include "functions.h"&lt;br /&gt;#include &amp;lt;boost/test/unit_test.hpp&amp;gt;&lt;br /&gt;&lt;br /&gt;BOOST_AUTO_TEST_CASE(Multiply)&lt;br /&gt;{&lt;br /&gt;BOOST_CHECK(multiply(4, 5) == 20);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Добавление тестовой конфигурации&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь необходимо решить проблему конфликта main, описанной в main.cpp и, той что будет сгенерирована Boost. Для этого добавим новую конфигурацию проекта для юнит-тестов, из сборки которой будет исключён модуль main.cpp, а в Debug и Release -конфигурациях нужно исключить из сборки mainTest.cpp&lt;br /&gt;&lt;br /&gt;Чтобы добавить новую конфигурацию проекта в меню Build выберите Configuration Manager.... В появившемся диалоговом окне выберите в списке Active solution configuration пункт New. Введите имя новой конфигурации UnitTests и сохраните изменения.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Сделайте активной конфигурацию UnitTests. В контекстном меню файла main.cpp выберите Properties и на вкладке General для свойства Excluded from build установите значение Yes. Сделайте активным конфигурацию Debug и для файлов maintest.cpp и functionsTest.cpp также установите опцию исключения из сборки. Аналогично Debug настройте Release конфигурацию.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Теперь нужно настроить тестовую конфигурацию проекта. Снова сделайте активной конфигурацию UnitTests и в свойствах проекта для этой конфигурации выполните следующие настройки:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;В настройках проекта C++ &amp;gt; General &amp;gt; Additional Include Directories вписать путь к заголовоным файлам boost.test&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Linker &amp;gt; General &amp;gt; Additional Library Directories путь к папке с библиотекой libboost_unit_test_framework-vc90-mt-gd-1_39.lib&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Linker &amp;gt; System &amp;gt; SubSystem выбрать из списка опцию Console (/SUBSYSTEM:CONSOLE)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Build Events &amp;gt; Post-Build Event &amp;gt; Command Line&lt;br /&gt;"$(TargetDir)\$(TargetName).exe" --result_code=no --report_level=short&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Build Events &amp;gt; Post-Build Event &amp;gt; Description&lt;br /&gt;==== Run unit tests ====&lt;div&gt;&lt;br /&gt;Настроить вывод результатов можно иначе. Описание параметров, для управления выводом, приведено в официальной документации в разделе &lt;a href="http://www.boost.org/doc/libs/1_39_0/libs/test/doc/html/utf/user-guide/runtime-config/reference.html"&gt;Runtime Parameters Reference&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Постройте и выполните проект в Debug или Release -конфигурациях. На экран будет выведено сообщение:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Main Program&lt;/div&gt;&lt;div&gt;5 * 4 = 20&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Затем соберите проект в конфигурации UnitTests. В окне Output помимо информации о ходе компиляции будет что-то вроде этого:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;==== Run unit tests ====&lt;/div&gt;&lt;div&gt;Running 2 test cases...&lt;/div&gt;&lt;div&gt;./maintest.cpp(13): error in "SimpleTestInMainTestingModule": check 1 == 2 failed&lt;/div&gt;&lt;div&gt;Test suite "Master Test Suite" failed with:&lt;/div&gt;&lt;div&gt;  1 assertion out of 2 passed&lt;/div&gt;&lt;div&gt;  1 assertion out of 2 failed&lt;/div&gt;&lt;div&gt;  1 test case out of 2 passed&lt;/div&gt;&lt;div&gt;  1 test case out of 2 failed&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Если выполнить файл SingleProject.exe собранный в конфигурации UnitTests вы увидите примерно то же сообщение.&lt;/div&gt;&lt;div&gt;Если вы видите это сообщение, значит проект настроен правильно. Вы можете также &lt;a href="http://www.yastrebkov.com/fileadmin/blog/SingleProject.zip"&gt;скачать исходники проекта&lt;/a&gt; и поработать с ним.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Надеюсь эта информация будет полезна. Исправления и дополнения приветствуются!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-5651509937763859274?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/5651509937763859274/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=5651509937763859274' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/5651509937763859274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/5651509937763859274'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2009/07/boost-test.html' title='Boost Test. Настройка и использование'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-1264052164160509098</id><published>2009-08-13T22:38:00.005+07:00</published><updated>2010-01-03T14:07:04.829+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Полезные инструменты'/><category scheme='http://www.blogger.com/atom/ns#' term='Библиотеки'/><title type='text'>Unit Testing Frameworks - Инструменты юнит-тестирования</title><content type='html'>&lt;div&gt;Сегодня юнит-тестирование применяется во всех серьёзных софтверных компаниях и инструментов для проведения такого рода тестов появилось очень много. Microsoft даже включила собственный механизм юнит-тестирования .Net приложений в Visual Studio 2008 Pro. Но раз уж я больше специализируюсь на так называемом unmanaged C++ и более интересуюсь свободным ПО, то и писать буду про открытые инструменты тестирования C++ кода. Большое количество ссылок с описанием таких инструментов можно найти на странице &lt;a href="http://www.opensourcetesting.org/unit_c.php"&gt;C/C++ unit testing tools&lt;/a&gt; проекта &lt;a href="http://www.opensourcetesting.org/"&gt;www.opensourcetesting.org&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Благодаря многочисленным книгам по разработке ПО, среди которых такие бестселлеры, как "Рефакторинг" Мартина Фаулера, пожалуй, наиболее известный инструмент юнит-тестирования - это xUnit (cppUnit для C++, JUnit для Java, phpUnit для PHP, ...). Надо сказать, что написан он был прежде всего для Java (JUnit), а потом уже появились версии для других языков. Довольно хороший инструмент, но не самый лучший, на мой взгляд, именно для C++. Лично мне не нравится то, что при написании тестов приходится много писать служебного кода (наследовать от базового класса и реализовывать методы setup и tear down. Хочется минимум лишнего, компактнее код. Так как инструмент портирован с Java, он не использует многих возможностей C++.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Последнее время всё популярнее становятся фреймворки, построенные на макросах, среди которых Boost Test, googletest и UnitTest++. Фраймворки google и boost имеют больше возможностей, чем UnitTest++ и продолжают развиваться, но большое достоинство UnitTest++ - возможность быстрого старта, благодаря простоте и подробному руководству по установке для Visual Studio.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Я думаю, для пользователей Visual Studio, желающих познакомиться с юнит-тестированием идеально подойдёт &lt;a href="http://unittest-cpp.sourceforge.net/"&gt;UnitTest++&lt;/a&gt;. Чтобы начать работать с этим фреймворком достаточно &lt;a href="http://sourceforge.net/projects/unittest-cpp/files/"&gt;скачать исходники&lt;/a&gt;, открыть солюшн в Visual Studio и запустить сборку. Готовый UnitTest++.vsnet2005.lib можно использовать в своём проекте. Для начинающих имеется &lt;a href="http://unittest-cpp.sourceforge.net/money_tutorial/"&gt;пошаговое руководство&lt;/a&gt; использования UnitTest++, на примере тестового приложения показывающее как настраивать проект и как применять инструменты тестирования. Скорее всего вы легко сможете разобраться с UnitTest++ за один вечер и сразу начать его использовать. Для получения информации об использовании фреймворка имеется &lt;a href="http://unittest-cpp.sourceforge.net/UnitTest++.html"&gt;краткая справка&lt;/a&gt;. Справка действительно очень короткая - на одну страницу. С одной стороны так проще начать работать, не утруждая себя утомительным чтением, а с другой стороны, чтобы сделать что-то выходящее за рамки описанного, придётся смотреть исходные коды и гуглить.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.boost.org/doc/libs/1_34_0/libs/test/doc/index.html"&gt;Boost Test&lt;/a&gt; не имеет такой удобной краткой справки по развёртыванию и, если вы не знакомы с boost, придётся сначала прочесть документацию о том как скомпилировать библиотеку и в какой конфигурации (статической или динамической), затем перейти к справке по подключению библиотеки к проекту и уж только разобравшись с этим начинать работать. Но разобравшись вы получите мощный инструмент юнит-тестирования с хорошей документацией и обширными возможностями, очень гибкий и переносимый.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Документация по сборке библиотек boost приводится в руководстве Getting Started для &lt;a href="http://www.boost.org/doc/libs/1_39_0/more/getting_started/windows.html"&gt;Windows&lt;/a&gt; и &lt;a href="http://www.boost.org/doc/libs/1_39_0/more/getting_started/unix-variants.html"&gt;Unix (Linux, MacOS)&lt;/a&gt;. Скачать исходники можно там же с официального сайта.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;В одной из следующих статей я подробно опишу процесс сборки и использования Boost Test в проекте Visual Studio.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Кроме перечисленных инструментов юнит-тестирования существуют и другие. Большой список бесплатных инструментов юнит-тестирования с описанием и ссылками вы можете найти на странице &lt;a href="http://www.opensourcetesting.org/unit_c.php"&gt;Open source C/C++ developer testing tools&lt;/a&gt;. На том же сайте есть ссылки на инструменты тестирования для других языков программирования.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-1264052164160509098?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/1264052164160509098/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=1264052164160509098' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/1264052164160509098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/1264052164160509098'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2009/08/unit-testing-frameworks.html' title='Unit Testing Frameworks - Инструменты юнит-тестирования'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-4954395987156571544</id><published>2009-07-21T11:20:00.005+07:00</published><updated>2009-07-21T11:55:16.234+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Полезные инструменты'/><title type='text'>Microsoft Terminology Translations - Перевод терминов Microsoft</title><content type='html'>При разработке пользовательского интерфейса всегда встаёт вопрос как правильно назвать элемент интерфеса. Особенно это важно, когда необходимо локализовать интерфейс.&lt;br /&gt;&lt;br /&gt;К Microsoft можно относится по разному, но мне определённо нравится их дивиз "мы устанавливаем стандарт", который в полной мере можно отнести и к именованию элементов интерфейса в их программах. Узнав, какую функцию выполняет кнопка Edit в одной программе уже ожидаешь схожего поведения в другой. Это очень удобно. И если на своём родном языке и на английском мы уже привыки к каким-то шаблонам, то подобрать подходящее название на малознакомом языке не так то просто.&lt;br /&gt;Microsoft открыто распространяет переводы наиболее часто используемых терминов на несколько языков мира. Например, со страницы &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=25018024-2DFD-4229-9763-05F78FEAF2FF&amp;amp;displaylang=en"&gt;Microsoft Terminology Translation Download&lt;/a&gt; можно скачать переводы терминов более чем на 40 языков. А здесь собраны ссылки на онлайн-ресурсы.  Вот прямая ссылка на языковой портал &lt;a href="http://www.microsoft.com/language/en/us/default.mspx"&gt;Microsoft Language Portal&lt;/a&gt; где можно в онлайн переводить термины и смотреть как они используются в контексте различных приложений. Там же собраны ссылки на другие инструменты.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-4954395987156571544?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/4954395987156571544/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=4954395987156571544' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/4954395987156571544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/4954395987156571544'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2009/07/microsoft-terminology-translations.html' title='Microsoft Terminology Translations - Перевод терминов Microsoft'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-4135851457212385700</id><published>2009-07-20T16:52:00.004+07:00</published><updated>2009-07-20T17:48:29.063+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Импорт и экспорт функций DLL</title><content type='html'>В MS Visual Studio экспортировать функции можно перечислением их имён в DEF файле, либо добавлением в коде к объявлениям функций ключевого слова &lt;span style="font-weight: bold;"&gt;__declspec(dllexport)&lt;/span&gt;.&lt;br /&gt;На эту тему можно почитать в MSDN в разделе &lt;a href="http://msdn.microsoft.com/ru-ru/library/9h658af8.aspx"&gt;Импортирование и Экспортирование&lt;/a&gt;.&lt;br /&gt;Для того, чтобы подключить и использовать функции DLL из другого исполняемого приложения, нужно объявить функцию со спецификатором __declspec(dllexport)&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;__declspec(dllexport) void func();&lt;br /&gt;__declspec(dllexport) int i;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Вообще говоря, экспортировать можно не только функции, но и переменные. Причём для использования импортируемых функций указывать __declspec(dllimport) не обязательно, а для переменных это необходимо.&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;__declspec(dllimport) void func(); //Необязательно использовать спецификатор импорта&lt;br /&gt;__declspec(dllimport) int i;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Каждый раз декларировать импортируемые функции неудобно. Для упрощения в коде DLL в заголовочном файле применяют макрос наподобие этого:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#ifdef _DLLAPI_&lt;br /&gt;    #define DLLAPI  __declspec( dllexport )&lt;br /&gt;#else&lt;br /&gt;    #define DLLAPI  __declspec( dllimport )&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Этот заголовочный файл подключается к модулям DLL и внешнего приложения, использующего эту DLL. Например:&lt;br /&gt;В файле MyDllApi.h определяем макрос:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;// Файл MyDllApi.h&lt;br /&gt;#pragma once&lt;br /&gt;#ifdef _DLLAPI_&lt;br /&gt;    #define DLLAPI  __declspec( dllexport )&lt;br /&gt;#else&lt;br /&gt;    #define DLLAPI  __declspec( dllimport )&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Дальше в заголовочном файле модуля, функцию которого нужно экспортировать, подключаем заголовочный файл с макросом и декларируем экспортируемую функцию:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;// Файл MyModule.h&lt;br /&gt;#include "MyDllApi.h"&lt;br /&gt;&lt;br /&gt;int DLLAPI intFunc();&lt;br /&gt;void DLLAPI voidFunc(int param);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В cpp файле модуля пишем реализацию функций. Здесь для простоты они будут пустыми:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;// Файл MyModule.cpp&lt;br /&gt;#include "MyModule.h"&lt;br /&gt;&lt;br /&gt;int intFunc()&lt;br /&gt;{&lt;br /&gt;    return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void voidFunc(int param)&lt;br /&gt;{&lt;br /&gt;    return;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь в приложении, использующем библиотеку, просто подключаем заголовочный файл MyModule.h и можно использовать экспортируемые из библиотеки функции.&lt;br /&gt;Явно подключить библиотеку (LIB-файл) для Visual Studio можно прямо в коде без редактирования настроек проекта. Для этого в файл MyDllApi.h нужно добавить следующий макрос:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#ifndef _NOAUTOLIB_&lt;br /&gt;#ifdef _DEBUG&lt;br /&gt;#pragma comment(lib, "mydll.lib")&lt;br /&gt;#else&lt;br /&gt;#pragma comment(lib, "mydll.lib")&lt;br /&gt;#endif&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Пользуясь этим же подходом можно экспортировать/импортировать классы. Объявление экспортируемого класса будет выглядеть так:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;class DLLAPI MyClass&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Рекомендую также почитать статью по теме на RSDN: &lt;a href="http://www.rsdn.ru/article/baseserv/dlluse.xml?print"&gt;Использование DLL в программе на Visual C++&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-4135851457212385700?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/4135851457212385700/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=4135851457212385700' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/4135851457212385700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/4135851457212385700'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2009/07/dll.html' title='Импорт и экспорт функций DLL'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-8386655827148650332</id><published>2009-07-17T17:02:00.006+07:00</published><updated>2009-07-21T11:56:51.952+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Полезные инструменты'/><title type='text'>Подсветка синтаксиса с Javascript code prettifier</title><content type='html'>Javascript code prettifier - средство для автоматического форматирования исходного кода на веб-страницах от компании Google. Поддерживает C-, Bash-, и XML-подобные языки. Может легко настраиваться для других языков. Скачать исходники (js и css) можно с &lt;a href="http://code.google.com/p/google-code-prettify/"&gt;официального сайта проекта&lt;/a&gt;. Для развёртывания на своём сайте воспользуйтесь &lt;a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html"&gt;руководством&lt;/a&gt;.&lt;br /&gt;А далее я хочу дополнить это руководство применительно к blogspot.com. Чтобы добавить эту фичу к своему блогу вместо относительных путей, указанных в руководстве введите абсолютные пути к prettify.css и prettify.js вот так:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" type="text/css" rel="stylesheet"&amp;gt;&lt;br /&gt;&amp;lt;script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;Теперь можно публиковать исходные коды, обрамляя их тегами&lt;br /&gt;&amp;lt;pre class="prettyprint"&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-8386655827148650332?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/8386655827148650332/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=8386655827148650332' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/8386655827148650332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/8386655827148650332'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2009/07/javascript-code-prettifier.html' title='Подсветка синтаксиса с Javascript code prettifier'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-7902663387960309877</id><published>2008-11-18T23:04:00.005+06:00</published><updated>2008-11-18T23:31:31.265+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Программное обеспечение'/><title type='text'>Araxis Merge - инструмент сравнения и слияния файлов и синхронизации папок</title><content type='html'>Давно собираюсь написать про эту замечательную программу, бесспорно заслуживающую внимания и похвалы.&lt;br /&gt;&lt;br /&gt;Приходилось ли вам сравнивать файлы по содержимому, чтобы, например, найти отличия каких-то важных частей файлов и синхронизировать изменения? Решать такую задачу визуально просматривая два или более файла достаточно утомительно и всегда есть опасность что-то пропустить. Нередко при использовании SVN разработчики сталкиваются с проблемой слияния изменений из branch с trunk. Механизм слияния SVN не всегда способен справиться с такой задачей. В этом случае разработчики нуждаются в средстве, облегчающем ручное слияние.&lt;br /&gt;&lt;br /&gt;Частично решить проблему может, например, функция сравнения файлов по содержимому в распространённом файловом менеджере Total Commander. Но она не позволяет редактировать файлы в режиме сравнения и не может сравнивать группы файлов.&lt;br /&gt;Araxis Merge напротив может сравнивать каталоги, удобно помечая отличия и сразу показывая отличия в одноимённых файлах. Выбрав нужные файлы, можно перейти в режим их сравнения и здесь же вносить правки. Araxis Merge автоматически выделяет отличающиеся участки файлов. Также доступна функция синхронизации изменений, когда вместо ручных правок можно выбирать отличающиеся блоки одного файла и переносить их в другой файл.&lt;br /&gt;&lt;br /&gt;Рекомендую всем Araxis Merge. Она значительно облегчает жизнь, когда нужно часто проводить сравнения файлов и папок, при проведении кастомизаций программных продуктов, обновления кастомизированных версий, решения ошибок слияния веток репозитория и других задач.&lt;br /&gt;&lt;br /&gt;Скачать Araxis Merge можно с сайта &lt;a href="http://www.araxis.com/"&gt;http://www.araxis.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-7902663387960309877?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/7902663387960309877/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=7902663387960309877' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/7902663387960309877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/7902663387960309877'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2008/11/araxis-merge.html' title='Araxis Merge - инструмент сравнения и слияния файлов и синхронизации папок'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-1251082669433480546</id><published>2008-06-19T12:32:00.010+07:00</published><updated>2008-12-09T19:19:01.826+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ИТ компании'/><title type='text'>Google office in Zurizh / Офис Google в Цюрихе</title><content type='html'>&lt;img id="BLOGGER_PHOTO_ID_5213461581708645010" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_sd6vsOQa3xU/SFnvr7vj0pI/AAAAAAAAAJU/zjtyZ6VTAfk/s320/google1.jpg" border="0" /&gt;&lt;a href="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnxmgVmy2I/AAAAAAAAANE/yS_a7NFSMSA/s1600-h/google31.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463687475940194" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnxmgVmy2I/AAAAAAAAANE/yS_a7NFSMSA/s320/google31.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnxm9cCR7I/AAAAAAAAANM/U1K4LzeJG64/s1600-h/google32.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463695287535538" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnxm9cCR7I/AAAAAAAAANM/U1K4LzeJG64/s320/google32.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnxm4H4ZLI/AAAAAAAAANU/FeZShmIbI98/s1600-h/google33.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463693860824242" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnxm4H4ZLI/AAAAAAAAANU/FeZShmIbI98/s320/google33.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnxc9SmT-I/AAAAAAAAAMk/Qd5gxtzE2e0/s1600-h/google27.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463523449262050" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnxc9SmT-I/AAAAAAAAAMk/Qd5gxtzE2e0/s320/google27.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnxdHUQ4PI/AAAAAAAAAMs/hgNRV1_u6CU/s1600-h/google28.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463526140600562" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnxdHUQ4PI/AAAAAAAAAMs/hgNRV1_u6CU/s320/google28.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnxdCIjRxI/AAAAAAAAAM0/D0d-9-EgyPU/s1600-h/google29.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463524749297426" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnxdCIjRxI/AAAAAAAAAM0/D0d-9-EgyPU/s320/google29.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnxdTtvPMI/AAAAAAAAAM8/qLWqpM6YMKU/s1600-h/google30.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463529468673218" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnxdTtvPMI/AAAAAAAAAM8/qLWqpM6YMKU/s320/google30.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnxOzCUAUI/AAAAAAAAAL8/bukMN2r9V64/s1600-h/google22.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463280178430274" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnxOzCUAUI/AAAAAAAAAL8/bukMN2r9V64/s320/google22.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnxO8QC4vI/AAAAAAAAAME/G6V81SdMggw/s1600-h/google23.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463282651947762" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnxO8QC4vI/AAAAAAAAAME/G6V81SdMggw/s320/google23.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_sd6vsOQa3xU/SFnxPK6yHJI/AAAAAAAAAMM/40jZhqbGOlQ/s1600-h/google24.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463286589299858" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_sd6vsOQa3xU/SFnxPK6yHJI/AAAAAAAAAMM/40jZhqbGOlQ/s320/google24.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_sd6vsOQa3xU/SFnxPJ7O8_I/AAAAAAAAAMU/5q5e-6KI9Ag/s1600-h/google25.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463286322754546" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_sd6vsOQa3xU/SFnxPJ7O8_I/AAAAAAAAAMU/5q5e-6KI9Ag/s320/google25.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnxPNgRMgI/AAAAAAAAAMc/xNKpD-RGqo8/s1600-h/google26.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463287283397122" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnxPNgRMgI/AAAAAAAAAMc/xNKpD-RGqo8/s320/google26.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnxAm_tWCI/AAAAAAAAALU/oiRTE2X3EtE/s1600-h/google17.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463036428113954" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnxAm_tWCI/AAAAAAAAALU/oiRTE2X3EtE/s320/google17.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnxAlu2cPI/AAAAAAAAALc/vrdhdkW5oW0/s1600-h/google18.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463036088971506" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnxAlu2cPI/AAAAAAAAALc/vrdhdkW5oW0/s320/google18.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnxA2vq-AI/AAAAAAAAALk/DI8fwBVZVHo/s1600-h/google19.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463040655816706" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnxA2vq-AI/AAAAAAAAALk/DI8fwBVZVHo/s320/google19.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnxA64MkeI/AAAAAAAAALs/VVx4PeY47f8/s1600-h/google20.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463041765315042" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnxA64MkeI/AAAAAAAAALs/VVx4PeY47f8/s320/google20.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_sd6vsOQa3xU/SFnxBEAWRMI/AAAAAAAAAL0/CZZ6sf-A5Jc/s1600-h/google21.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213463044215424194" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_sd6vsOQa3xU/SFnxBEAWRMI/AAAAAAAAAL0/CZZ6sf-A5Jc/s320/google21.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwyTjKJ5I/AAAAAAAAAKs/eOIzGH0rdTA/s1600-h/google12.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462790689925010" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwyTjKJ5I/AAAAAAAAAKs/eOIzGH0rdTA/s320/google12.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwyryZVNI/AAAAAAAAAK0/4Pen3slj2Cs/s1600-h/google13.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462797196285138" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwyryZVNI/AAAAAAAAAK0/4Pen3slj2Cs/s320/google13.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwyiRRaJI/AAAAAAAAAK8/07bsMwLkD8g/s1600-h/google14.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462794641434770" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwyiRRaJI/AAAAAAAAAK8/07bsMwLkD8g/s320/google14.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_sd6vsOQa3xU/SFnwy2w_8hI/AAAAAAAAALE/0g-ZsTFbGX0/s1600-h/google15.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462800143217170" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_sd6vsOQa3xU/SFnwy2w_8hI/AAAAAAAAALE/0g-ZsTFbGX0/s320/google15.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwyzkwsqI/AAAAAAAAALM/ieR3KcLTB60/s1600-h/google16.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462799286579874" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwyzkwsqI/AAAAAAAAALM/ieR3KcLTB60/s320/google16.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwbgUdIpI/AAAAAAAAAKE/QxV7_xwsNjU/s1600-h/google7.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462398980924050" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwbgUdIpI/AAAAAAAAAKE/QxV7_xwsNjU/s320/google7.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnwb4KpHSI/AAAAAAAAAKM/8Nglff9f3LI/s1600-h/google8.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462405382216994" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnwb4KpHSI/AAAAAAAAAKM/8Nglff9f3LI/s320/google8.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnwb51iwUI/AAAAAAAAAKU/vbbGHbHjWS0/s1600-h/google9.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462405830590786" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnwb51iwUI/AAAAAAAAAKU/vbbGHbHjWS0/s320/google9.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwcK_TGWI/AAAAAAAAAKc/v2y8pDFgwQQ/s1600-h/google10.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462410434910562" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwcK_TGWI/AAAAAAAAAKc/v2y8pDFgwQQ/s320/google10.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnwcMGsc4I/AAAAAAAAAKk/H9G3dGg631Y/s1600-h/google11.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462410734367618" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnwcMGsc4I/AAAAAAAAAKk/H9G3dGg631Y/s320/google11.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwEfruMOI/AAAAAAAAAJc/dSsEyVzX4K0/s1600-h/google2.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462003673084130" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_sd6vsOQa3xU/SFnwEfruMOI/AAAAAAAAAJc/dSsEyVzX4K0/s320/google2.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnwERxvPKI/AAAAAAAAAJk/P-fHP5PxSto/s1600-h/google3.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213461999940222114" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnwERxvPKI/AAAAAAAAAJk/P-fHP5PxSto/s320/google3.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnwEcBImkI/AAAAAAAAAJs/fSYk38qkmxE/s1600-h/google4.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462002689153602" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_sd6vsOQa3xU/SFnwEcBImkI/AAAAAAAAAJs/fSYk38qkmxE/s320/google4.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnwEi66jgI/AAAAAAAAAJ0/J2DaoYLR2Mo/s1600-h/google5.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462004542115330" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnwEi66jgI/AAAAAAAAAJ0/J2DaoYLR2Mo/s320/google5.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnwEqpCA5I/AAAAAAAAAJ8/9g5-xOLSUok/s1600-h/google6.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5213462006614590354" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_sd6vsOQa3xU/SFnwEqpCA5I/AAAAAAAAAJ8/9g5-xOLSUok/s320/google6.jpg" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-1251082669433480546?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/1251082669433480546/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=1251082669433480546' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/1251082669433480546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/1251082669433480546'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2008/06/google-office-in-zurizh-google.html' title='Google office in Zurizh / Офис Google в Цюрихе'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_sd6vsOQa3xU/SFnvr7vj0pI/AAAAAAAAAJU/zjtyZ6VTAfk/s72-c/google1.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-3423366375548033137</id><published>2008-06-05T15:18:00.004+07:00</published><updated>2008-06-05T16:02:35.717+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Базы данных'/><title type='text'>Использование распределенных запросов в MS SQL</title><content type='html'>Для того, чтобы сделать выборку из таблицы, расположенной на другом сервере или получить результат выполнения расположенной там функции или хранимой процедуры, в Microsoft SQL Server предусмотрен механизм распределенных запросов.&lt;br /&gt;&lt;br /&gt;Для использования этого механизма целевые сервера должны быть предварительно связаны.&lt;br /&gt;&lt;br /&gt;Связанный сервер - это виртуальный сервер, определенный в SQL Server. В определение связанного сервера входит вся информация, необходимая для доступа к источнику данных OLE DB. Настраивают связанный сервер с помощью Enterprise Manager или системной хранимой процедуры &lt;span style="color:#663300;"&gt;sp_addlinkedserver&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Хотя посредством определений связанных серверов обычно запрашивают данные из таких источников , как базы данных, существуют компоненты доступа OLE DB для широкого спектра файлов в различных форматах, в том числе текстовых файлов, данных электронных таблиц и полнотекстового поиска.&lt;br /&gt;&lt;br /&gt;После теоретического вступления немного попрактикуемся. Свяжем один MS SQL сервер (назовем его LinkedSRV) с другим (BasicSRV ). На сервере BasicSRV запустите SQL Server Management Studio, раскройте узел Server Objects. В контекстном меню узла Linked Servers выберите пункт New Linked Server.... На вкладке General нужно ввести имя связываемого сервера и выбрать тип сервера SQL Server. На вкладке Security. Выберите переключатель "Be made using the security context" и введите логин и пароль для доступа к удаленному серверу.&lt;br /&gt;&lt;br /&gt;После этого вы сможете выполнять запросы к таблицам удаленного сервера используя четырехкомпонентное имя:&lt;br /&gt;&lt;br /&gt;имя_связанного_сервера.каталог.схема.имя_объекта,&lt;br /&gt;где имя_связанного сервера - Связанный сервер, ссылающийся на источник данных OLE DB,&lt;br /&gt;каталог - Каталог источника данных OLE DB, в котором содержится объект (например, имя базы данных)&lt;br /&gt;схема - Схема в каталоге, в котором содержится объект (например, dbo)&lt;br /&gt;&lt;br /&gt;Вот пример запроса:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;SELECT&lt;/span&gt; * &lt;span style="color:#000099;"&gt;FROM&lt;/span&gt; LinkedSRV.remote_database.dbo.remote_table&lt;br /&gt;&lt;br /&gt;Обращаясь подобных образом к объектам удаленной базы данных можно вызывать хранимые процедуры, например:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;EXEC&lt;/span&gt; LinkedSRV.remote_database.dbo.remote_stored_procedure @param = 10&lt;br /&gt;&lt;br /&gt;Если при исполнении этой инструкции вы получите сообщение об ошибке &lt;span style="color:#ff0000;"&gt;"Server 'LinkedSRV' is not configured for RPC"&lt;/span&gt;, вам потребуется настроить сервер для исполнения удаленных процедур. По умолчанию эта возможность отключена. Все настройки вашего сервера вы можете просмотреть, исполнив следующий код T-SQL:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;exec&lt;/span&gt; &lt;span style="color:#663300;"&gt;sp_helpserver&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Если в полученной таблице для связанного сервера нет записи 'rpc,rpc out', значит сервер не настроен для RPC.&lt;br /&gt;&lt;br /&gt;Чтобы разрешить использование вызова удаленных процедур выполните следующий код:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;exec&lt;/span&gt; &lt;span style="color:#663300;"&gt;sp_serveroption&lt;/span&gt; @server='LinkedSRV', @optname='rpc', @optvalue='true'&lt;br /&gt;&lt;span style="color:#000099;"&gt;exec&lt;/span&gt; &lt;span style="color:#663300;"&gt;sp_serveroption&lt;/span&gt; @server='LinkedSRV', @optname='rpc out', @optvalue='true'&lt;br /&gt;&lt;br /&gt;Теперь вы сможете вызывать хранимые процедуры с других серверов.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-3423366375548033137?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/3423366375548033137/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=3423366375548033137' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/3423366375548033137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/3423366375548033137'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2008/06/ms-sql.html' title='Использование распределенных запросов в MS SQL'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-7980747305182651361</id><published>2008-04-09T11:19:00.005+07:00</published><updated>2008-04-09T12:05:40.772+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Базы данных'/><title type='text'>Выполнение команд операционной системы в MS SQL</title><content type='html'>MS SQL Server позволяет выполнять команды операционной системы и возвращать результат в виде текстовых строк. Например, прямо из SQL Server можно запустить bat-файл, любую программу и вообще использовать все возможности командной строки.&lt;br /&gt;&lt;br /&gt;Для этого используется системная хранимая процедура xp_cmdshell. Запуск этой процедуры по умолчанию запрещен. Чтобы включить эту возможность нужно выполнить следующий код:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;-- Включение разрешения изменения расширенных опций.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;EXEC&lt;/span&gt; sp_configure 'show advanced options', 1&lt;br /&gt;&lt;span style="color:#000099;"&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;-- Обновление текущих настроек расширенных опций.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;RECONFIGURE&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;-- Включение возможности запуска внешних программ.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;EXEC&lt;/span&gt; sp_configure 'xp_cmdshell', 1&lt;br /&gt;&lt;span style="color:#000099;"&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;-- Обновление текущих настроек для запуска внешних программ.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;RECONFIGURE&lt;br /&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Теперь для запуска bat-файла достаточно выполнить следующую команду:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;EXEC&lt;/span&gt; master..xp_cmdshell 'test.bat'&lt;br /&gt;&lt;br /&gt;Или эту, если вы хотите подавить вывод результатов:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;EXEC&lt;/span&gt; master..xp_cmdshell 'test.bat', NO_OUTPUT&lt;br /&gt;&lt;br /&gt;А вот пример вызова bat-файла с параметром:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;DECLARE&lt;/span&gt; @param &lt;span style="color:#000099;"&gt;varchar&lt;/span&gt;(50)&lt;br /&gt;&lt;span style="color:#000099;"&gt;DECLARE&lt;/span&gt; @cmd &lt;span style="color:#000099;"&gt;varchar&lt;/span&gt;(100)&lt;br /&gt;&lt;span style="color:#000099;"&gt;SET&lt;/span&gt; @param = 'blog.yastrebkov.com'&lt;br /&gt;&lt;span style="color:#000099;"&gt;SET&lt;/span&gt; @cmd = 'c:\test.bat ' + @param&lt;br /&gt;&lt;span style="color:#000099;"&gt;EXEC&lt;/span&gt; master..xp_cmdshell @cmd&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Другие примеры использования вы можете найти на сайте MSDN по &lt;a href="http://msdn2.microsoft.com/en-us/library/aa260689(SQL.80).aspx"&gt;этой ссылке&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-7980747305182651361?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/7980747305182651361/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=7980747305182651361' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/7980747305182651361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/7980747305182651361'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2008/04/ms-sql.html' title='Выполнение команд операционной системы в MS SQL'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-793093360224428033</id><published>2008-03-06T09:41:00.004+06:00</published><updated>2008-03-06T10:01:50.611+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMS'/><title type='text'>Установка расширения sr_feuser_register (регистрации пользователей) на сайте под управлением TYPO3</title><content type='html'>Кратко опишу процесс установки расширения регистрации FE-пользователей на сайте под управлением TYPO3.&lt;br /&gt;&lt;br /&gt;Предполагается, что вы пользуетесь css_styled_content для парсинга шаблонов и используете русскую локализацию. Если вам не нужна русская локализация, пропустите шаг 4. Если нужен перевод на другой язык, в шаге 4 выберите файл с нужным языком из архива локализации.&lt;br /&gt;&lt;br /&gt;1. Скачайте и установите расширение sr_feuser_register&lt;br /&gt;2. В шаблон сайта в раздел Constants добавьте следующую строку:&lt;br /&gt;&lt;include_typoscript: source="FILE: typo3conf/ext/sr_feuser_register/static/css_styled/constants.txt"&gt;&lt;br /&gt;3. В шаблон сайта в раздел Setup добавьте следующую строку:&lt;br /&gt; &lt;include_typoscript: source="FILE: typo3conf/ext/sr_feuser_register/static/css_styled/setup.txt"&gt;&lt;br /&gt;4. Скачайте пакет локализации расширения &lt;a href="http://jambage.com/development/l10n.zip"&gt;отсюда&lt;/a&gt; и скопируйте ru.locallang.xml в typo3conf/l10n/ru/sr_feuser_register/pi1/ (если такой папки нет, создайте ее вручную).&lt;br /&gt;5. Откройте и отредактируйте значения констант в файле typo3conf/ext/sr_feuser_register/static/css_styled/constants.txt&lt;br /&gt;6. Добавьте новый элемент содержимого на страницу, измените его тип на "плагин" и выберите плагин "Регистрация пользователей на веб-сайте".&lt;br /&gt;&lt;br /&gt;Проверьте работу расширения. В месте вставки регистрации должна появиться ссылка с предложением регистрации.&lt;br /&gt;&lt;br /&gt;Инструкции по настройке плагина вы можете найти в руководстве для расширения.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-793093360224428033?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/793093360224428033/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=793093360224428033' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/793093360224428033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/793093360224428033'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2008/03/srfeuserregister-typo3.html' title='Установка расширения sr_feuser_register (регистрации пользователей) на сайте под управлением TYPO3'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-1065879939972685359</id><published>2008-03-06T09:08:00.002+06:00</published><updated>2008-03-06T09:37:27.067+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Программное обеспечение'/><title type='text'>Microsoft Office Binary (doc, xls, ppt) File Formats</title><content type='html'>15 февраля 2008 года на официальном сайте Microsoft были &lt;a href="http://www.microsoft.com/interop/docs/OfficeBinaryFormats.mspx"&gt;опубликованы спецификации форматов&lt;/a&gt; файлов Word 97-2007, PowerPoint 97-2007, Excel 97-2007.&lt;br /&gt;&lt;br /&gt;Что может нам дать этот ход Microsoft?&lt;br /&gt;&lt;br /&gt;Уверен многие из любопытства пролистают эти немаленькие (более 300 страниц) спецификации. Но на практике эта информация мало кому будет полезна. Из экономических соображений гораздо выгоднее пользоваться старыми приемами взаимодействия с Excel или Word посредством COM и внедрения их компонент посредством OLE. Это быстрее и привычнее. И это работает!&lt;br /&gt;&lt;br /&gt;Сложность формата Excel описывается одним из его разработчиков - Джоэлом Спольски. Вы можете прочитать его статью, опубликованную после открытия Microsoft форматов файлов - &lt;a href="http://www.joelonsoftware.com/items/2008/02/19.html"&gt;Why are the Microsoft Office file formats so complicated? (And some  workarounds)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Но информация от Microsoft может быть полезна тем, кто обеспечивает совместимость своих продуктов с Office на платформах, отличных от Windows. Я очень надеюсь, что поддержка приложений Microsoft Office в OpenOffice качественно улучшиться, чтобы без проблем работать с документами Word под Linux+OpenOffice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-1065879939972685359?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/1065879939972685359/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=1065879939972685359' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/1065879939972685359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/1065879939972685359'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2008/03/microsoft-office-binary-doc-xls-ppt.html' title='Microsoft Office Binary (doc, xls, ppt) File Formats'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-4662730677714245324</id><published>2008-01-11T13:51:00.000+06:00</published><updated>2008-01-11T14:42:31.654+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Программное обеспечение'/><title type='text'>Microsoft все меньше заботится об обратной совместимости</title><content type='html'>Несколько лет назад я разработал на основе SharePoint Portal Server 2001 архив документации по проектам Национального ядерного центра Республики Казахстан. Меня привлекла простота работы с этой системой, минимальные затраты на обучение персонала и наличие необходимого функционала.&lt;br /&gt;&lt;br /&gt;В этой версии продукта была замечательная штука - категории. Категории позволяли тематически группировать ссылки на реальные документы. Сами документы имели собственную структуру хранения. Категории позволили мне спроектировать замечательную схему тематического разбиения громадного числа файлов, накопившихся в результате деятельности предприятия по нескольким международным проектам за 8 лет. Добавьте к этому полнотекстовый поиск по документам, плюс атрибутивный поиск, плюс возможность добавлять документы через проводник!&lt;br /&gt;&lt;br /&gt;Я написал целый пакет программного обеспечения для резервного копирования базы данных, импорта/экспорта документов с их учетными карточками, веб-интерфейс с функциями поиска и администрирования архива.&lt;br /&gt;&lt;br /&gt;Все было замечательно, за исключением медленной базы данных, основанной на хранилище MS Exchange и отсутствием возможности поиска с учетом морфологии русского языка.&lt;br /&gt;&lt;br /&gt;Когда вышел MS SharePoint Portal Server 2003 я ожидал увидеть значительно доработанный продукт с новыми возможностями и исправленными недостатками.&lt;br /&gt;&lt;br /&gt;На самом деле оказалось, что это уже другой продукт. Нет замечательного механизма категорий, нет поддержки кодов, разработанных для версии 2001 года. Полностью изменился API. Более того, Microsoft заявила, что собирается прекратить поддержку версии 2001 года.&lt;br /&gt;&lt;br /&gt;Когда вышла версия 2007 года, было заявлено, что это продукт нового поколения и что он также не полностью поддерживает функциональность Portal Server 2003.&lt;br /&gt;&lt;br /&gt;После появления .NET и Windows Vista я стал еще настороженнее относится к новинкам от Microsoft. С другой стороны это помогло мне лучше познакомиться с продуктами Google и Linux. Конечно Microsoft крупная компания и может позволить себе  допускать крупные просчеты, но, пожалуй, это отличный шанс для Linux заявить о себе.&lt;br /&gt;&lt;br /&gt;Мне нравится как охарактеризовал различие Linux и Windows &lt;a href="http://www.joelonsoftware.com"&gt;Джоэл Спольски&lt;/a&gt;. По его словам Linux - эо ОС для программистов, а Windows - для домохозяек. Последние тенденции мира Linux показывают, что в этом отношении начинают происходить изменения. ОС &lt;a href="http://www.mandriva.ru/"&gt;Mandriva&lt;/a&gt;, которой я пользуюсь достаточно проста для выполнения повседневных задач. Моя любимая жена без особых проблем пользуется ей. Проблемы возникают только при необходимости подключения устройств, не имеющих оригинальных драйверов для Linux от производителя.&lt;br /&gt;&lt;br /&gt;В отличие от Microsoft, сообщество разработчиков Linux прилагают большие усилия для обеспечения обратной совместимости.Уже одно только это обстоятельство привлекает меня в Linux.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-4662730677714245324?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/4662730677714245324/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=4662730677714245324' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/4662730677714245324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/4662730677714245324'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2008/01/microsoft.html' title='Microsoft все меньше заботится об обратной совместимости'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-3091491677100895168</id><published>2008-01-11T09:05:00.000+06:00</published><updated>2008-01-11T13:52:08.266+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><title type='text'>Расширение inline-edit для Mootools</title><content type='html'>В статье о моем &lt;a href="http://blog.yastrebkov.com/2007/07/ajax-mootools.html"&gt;опыте использования Mootools&lt;/a&gt; я кратко рассказал об этой библиотеке и описал способ решения проблемы перетаскивания объектов, имеющейся в библиотеке Mootools. А теперь я хотел бы рассказать о расширении для этой библиотеки под названием &lt;a href="http://dev.justinmaier.com/inlineEdit/"&gt;inlineEdit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;inlineEdit - это скрипт, который позволяет добавить на ваши страницы возможность редактирования текста без использования каких либо редакторов. Разумеется таким образом можно редактировать только обычный текст, без смешанного форматирования.&lt;br /&gt;&lt;br /&gt;Я применял этот скрипт при разработке онлайнового календаря аля &lt;a href="http://google.com/calendar"&gt;Google Calendar&lt;/a&gt;. В соответствии с заданием заказчика для календарной сетки необходимо было реализовать переключение между режимами редактирования и создания заметок - popup-окно (как это реализовано в Google) и inline-редактирование.&lt;br /&gt;&lt;br /&gt;Использовать этот код достаточно просто. Нужно подключить код библиотеки Mootools и скрипт inlineEdit к своей странице. Я не буду приводить здесь свой код, потому что он достаточно сложен для примера, а вот пример из документации будет очень кстати:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;div id=&lt;span style="color: rgb(153, 51, 153);"&gt;"editarea"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;I am Justin&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Hello World&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;br /&gt;     &lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;var&lt;/span&gt; inlineEditor = &lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;new&lt;/span&gt; inlineEdit(&lt;span style="color: rgb(153, 51, 153);"&gt;'editarea'&lt;/span&gt;,{indicatorText: &lt;span style="color: rgb(153, 51, 153);"&gt;'edit this'&lt;/span&gt;}); &lt;span style="color: rgb(0, 153, 0);"&gt;//Makes text inside 'editarea' inline editable&lt;/span&gt;&lt;br /&gt;     inlineEditor.deactivate(); &lt;span style="color: rgb(0, 153, 0);"&gt;//Deactivates the ability to edit the text&lt;/span&gt;&lt;br /&gt;     inlineEditor.toggle(); &lt;span style="color: rgb(0, 153, 0);"&gt;//Toggles the ability to edit the text (in this situation it would turn it back on since we just turned it off)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;При наступлении события редактирования на месте расположения редактируемого текста появляется элемент HTML input или textarea, со стилями, настроенными таким образом, чтобы самих элементов редактирования видно не было. Для пользователя все выглядит так, будто прямо в тексте появился курсор и теперь текст можно редактировать.&lt;br /&gt;&lt;br /&gt;Если у вас возникнут проблемы со стилями, возможно придется править исходный код inlineEdit, как это пришлось делать мне. Свои стилистические правки вы можете сделать в функции setAllStyles. В не сложных проектах этого делать не потребуется.&lt;br /&gt;&lt;br /&gt;Использование inline-редактирования удобный способ правки простого текста, который обязательно оценят ваши пользователи.&lt;br /&gt;&lt;br /&gt;Мне осталось только сказать, что автор этого расширения inlineEdit для Mootools - Justin Maier. Скачать последнюю версию скрипта вы можете &lt;a href="http://justinmaier.com/"&gt;на его сайте&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-3091491677100895168?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/3091491677100895168/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=3091491677100895168' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/3091491677100895168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/3091491677100895168'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2008/01/inline-edit-mootools.html' title='Расширение inline-edit для Mootools'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-5751523806085120261</id><published>2008-01-08T15:45:00.000+06:00</published><updated>2008-01-10T11:54:45.092+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Указатель на функцию-член класса</title><content type='html'>Для уменьшения объема кода и повышения гибкости бывает полезно использовать указатели на функции. Примеров масса, их можно найти, например, у Страуструпа. А вот для указателей на функции-члены мне примеры встречались крайне редко. Чтобы как-то исправить эту ситуацию я предлагаю свой пример использования такого указателя. Надеюсь это поможет вам в вашей работе.&lt;br /&gt;&lt;br /&gt;Объявление класса в упрощенном виде выглядит следующим образом:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;class&lt;/span&gt; MyClass&lt;br /&gt;{&lt;br /&gt;  ...&lt;br /&gt;  &lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;void&lt;/span&gt; setPointer(&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;int&lt;/span&gt; funcNumber);&lt;br /&gt;  ...&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;public:&lt;/span&gt;&lt;br /&gt;  ...&lt;br /&gt;  &lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;void&lt;/span&gt; function1();&lt;br /&gt;  &lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;void&lt;/span&gt; function2();&lt;br /&gt;  &lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;void&lt;/span&gt; (MyClass::*pFunction) ();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Функция, присваивающая указателю адрес нужной функции может выглядеть так:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;void&lt;/span&gt; MyClass::setPointer(&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;int&lt;/span&gt; funcNumber)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;switch&lt;/span&gt; (funcNumber) {&lt;br /&gt;        &lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;case&lt;/span&gt; 1 :&lt;br /&gt;            pFunction = &amp;amp;MyClass::function1;&lt;br /&gt;            &lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;case&lt;/span&gt; 2:&lt;br /&gt;            pFunction = &amp;amp;MyClass::function2;&lt;br /&gt;            &lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;break&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;А сами функции пишем как обычно:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;void&lt;/span&gt; MyClass::function1()&lt;br /&gt;{&lt;br /&gt;    ...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;void&lt;/span&gt; MyClass::function2()&lt;br /&gt;{&lt;br /&gt;    ...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-5751523806085120261?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/5751523806085120261/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=5751523806085120261' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/5751523806085120261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/5751523806085120261'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2008/01/blog-post.html' title='Указатель на функцию-член класса'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-3519529550985346694</id><published>2008-01-08T15:17:00.000+06:00</published><updated>2008-01-08T15:36:00.054+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Базы данных'/><title type='text'>Связь Access с MS SQL</title><content type='html'>Часто бывает удобно использовать Access как интерфейс к серверной базе данных под управлением СУБД MS SQL. Я уже как-то &lt;a href="http://blog.yastrebkov.com/2007/08/ms-sql-server-ms-access.html"&gt;рассказывал&lt;/a&gt; о способе наладить программное взаимодействие Access и MS SQL. Сегодня я расскажу о другом способе организации такого взаимодействия, не требующем программирования.&lt;br /&gt;&lt;br /&gt;В Access 2002 и выше (про более поздние не знаю) имеется возможность создать так называемый проект Access или ADP-файл. Для этого в меню Файл нужно выбрать Создать &gt; Проект с имеющимися данными. Указать имя или адрес сервера MS SQL, название базы данных.&lt;br /&gt;&lt;br /&gt;Access подключится к базе данных и выведет список имеющихся там объектов (таблиц, видов, хранимых процедур и функций). Все эти объекты теперь можно будет редактировать прямо из Access и использовать при построении форм.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-3519529550985346694?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/3519529550985346694/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=3519529550985346694' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/3519529550985346694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/3519529550985346694'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2008/01/access-ms-sql.html' title='Связь Access с MS SQL'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-7780563937600276391</id><published>2007-08-20T10:25:00.000+07:00</published><updated>2007-08-20T10:39:41.563+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Материалы'/><title type='text'>Российские Интернет-технологии 2007</title><content type='html'>Весной, как я понял в Москве, проходила первая (?) профессиональная конференция веб-разработчиков  "РИТ-2007". Подробное описание приводить не буду, прочтите его из &lt;a href="http://www.rit2007.ru/news/2521.html"&gt;официального пресс-релиза&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;На сайте &lt;a href="http://www.rit2007.ru"&gt;www.rit2007.ru&lt;/a&gt; опубликованы &lt;a href="http://www.rit2007.ru/org.html"&gt;материалы конференции&lt;/a&gt; в тезисах, а также видеозаписи выступлений по следующим разделам:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Разработка больших Интернет-сайтов&lt;/li&gt;   &lt;li&gt;Серверное программирование&lt;/li&gt;   &lt;li&gt;Клиентское программирование&lt;/li&gt;   &lt;li&gt;Качество&lt;/li&gt;   &lt;li&gt;Технологии будущего&lt;/li&gt;   &lt;li&gt;Управление проектами&lt;/li&gt;   &lt;li&gt;Бизнес на веб-разработках&lt;/li&gt;   &lt;li&gt;Базы данных&lt;/li&gt; &lt;/ul&gt; Надо сказать, что материалы хорошие, а фамилии докладчиков вам вероятно тоже покажутся знакомыми.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-7780563937600276391?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/7780563937600276391/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=7780563937600276391' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/7780563937600276391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/7780563937600276391'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2007/08/2007.html' title='Российские Интернет-технологии 2007'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-6227297331928365376</id><published>2007-08-15T18:11:00.000+07:00</published><updated>2007-08-15T19:02:12.138+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMS'/><title type='text'>Выделение пунктов меню в TYPO3</title><content type='html'>Сегодня заказчик, для которого я делал сайта на базе TYPO3, задал мне вопрос: "можно ли некоторые пункты меню выделить цветом?"&lt;br /&gt;&lt;br /&gt;Возможно для кого-то это также будет интересно.&lt;br /&gt;&lt;br /&gt;Откройте страницу для редактирования и измените ее тип с "Обычный" на "Продвинутый" (в переводе csh_ru). Появятся дополнительные поля. Мы будем использовать поле "Название для меню". С его помощью можно, в частности, задавать для пункта меню страницы отличное название от загаловка страницы.&lt;br /&gt;&lt;br /&gt;Чтобы выделить пункт меню для этой страницы красным цветом введите в этом поле следующую строку:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;font color="red"&amp;gt;&lt;/span&gt;Название страницы&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;/font&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Добавить выделение жирным шрифтом можно так:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;b&amp;gt;&lt;/span&gt;Название страницы&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;/b&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Чтобы добавить картинку к тексту, например, пометку New, подойдет следующий код:&lt;br /&gt;&lt;br /&gt;Название страницы &lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;img src="http://www.blogger.com/URL_картинки" border="0" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Но лучше всего вынести оформление таких ссылок в CSS, тогда в поле "Название для меню" достаточно задать:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;div class="marked_item"&amp;gt;&lt;/span&gt;Название страницы&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;а в таблице стилей добавить описание класса marked_item, например:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.marked_item&lt;/span&gt; &lt;span style="color: rgb(153, 51, 153);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 51, 153);"&gt;font-color:&lt;/span&gt; red;&lt;br /&gt;&lt;span style="color: rgb(153, 51, 153);"&gt;weight:&lt;/span&gt; bold;&lt;br /&gt;&lt;span style="color: rgb(153, 51, 153);"&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-6227297331928365376?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/6227297331928365376/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=6227297331928365376' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/6227297331928365376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/6227297331928365376'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2007/08/typo3.html' title='Выделение пунктов меню в TYPO3'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-8417009579234042977</id><published>2007-08-08T16:39:00.000+07:00</published><updated>2007-08-08T18:13:18.671+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ИТ компании'/><title type='text'>Работа и трудоустройство в Google</title><content type='html'>Продолжаем собирать досье на компанию Google.&lt;br /&gt;&lt;br /&gt;По сведениям &lt;a href="http://www.googlemon.ru"&gt;www.googlemon.ru&lt;/a&gt; за 2006 год компания получила более 1000000 уникальных резюме.&lt;br /&gt;&lt;br /&gt;Далее. &lt;a href="http://www.shmula.com/31/my-interview-job-offer-from-google"&gt;Рассказ&lt;/a&gt; человека (&lt;a href="http://www.googlemon.ru/google/google_job_interview_programmer/#more-101"&gt;перевод на русский&lt;/a&gt;) о том как он устраивался в Google.&lt;br /&gt;Еще один &lt;a href="http://seo-library.com/2007/02/google.html"&gt;рассказ&lt;/a&gt; веб-оптимизатора из Харькова о интервью в Google (с текстами тестовых заданий).&lt;br /&gt;&lt;a href="http://voodoo.bawue.com/blogs/?p=104"&gt;Опыт трудоустройства админа&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://kitya.livejournal.com/188574.html"&gt;Длинная статья&lt;/a&gt; программиста о интервью в Google.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;На одном &lt;a href="http://forums.somethingawful.com/showthread.php?s=&amp;threadid=1892424"&gt;форуме&lt;/a&gt;, программист под ником ZorbaTHut рассказал о работе в компании Гугл.&lt;/p&gt;  &lt;ul&gt; &lt;li&gt;Основные языки программирования в Google - это C++, Java и Python&lt;/li&gt;&lt;li&gt;Очень много автоматизированных юнит-тестов&lt;/li&gt;&lt;li&gt;На вопрос “Волнуется ли Гугл по поводу ворованных кликов” он ответил, что “проблема с ворованными кликами - очень и очень тяжело решаемая”&lt;/li&gt;&lt;li&gt;Прием на работу очень долгий. Кто реально заитересова работать на Гугл лучше найти какого-нибудь Гугловского работника и чтоб он порекомендовал вас. Интервью основывается на ваших знаниях, а не на вашем образовании или дипломе&lt;/li&gt;&lt;li&gt;Никто не контроллирует 20% вашего времени, которые вы можете посвятить своим проектам. Менеджеры и тех. лидеры предполагают, что программист умеет управлять своим временем. Если программист не может управлять - значит вероятно он не подходит для работы в Гугле.&lt;/li&gt;&lt;li&gt;Как Гугловский работник, он имеет ограничение в 1 террабайт на Gmail почтовом ящике. Почти что - без лимита.&lt;/li&gt;&lt;li&gt;Гибкий рабочий график. Ты можешь спать/отсутствовать всю неделю, а потом все закончить работу за пару дней&lt;/li&gt;&lt;li&gt;Работники получают доступ к бета-продуктам задолго до выхода в мир. Например, он получил доступ к Google Maps за две недели, начал использовать, но не мог распечатать маршрут своей поездки, так как это уже была конфидециальная информация.&lt;/li&gt;&lt;li&gt;Если работнику не нравиться работать на текущим проектом, то он может перейти в другой. ZorbaTHut был в команде Google Desktop, но эта работа ему не нравилась и он перешел в Google Video.&lt;/li&gt;&lt;li&gt;Zorba написал, что у него всего лишь одно совещание в месяц&lt;/li&gt;&lt;li&gt;Структура компании: программист - тех. лидер - менеджер - лидер отдела - призеденты&lt;/li&gt;&lt;li&gt;В основном в Гугле компьютеры на основе Linux. Гугл предоставляет ноутбук и можно выбрать из Mac Powerbook или IBM Thinkpad. Покупают все необходимые инструменты/программы нужные в работе.&lt;/li&gt;&lt;li&gt;Большенство программистов - линуксоидов&lt;/li&gt;&lt;li&gt;Гугл использует единый source control сервер. Это позволяет использовать внутренние библиотеки в разных проектах.&lt;/li&gt; &lt;/ul&gt; По &lt;a href="http://www.googlemon.ru/?page_id=55"&gt;этой ссылке&lt;/a&gt; вы можете просмотреть рекламный ролик Google (интервью с сотрудниками компании). Здесь же можно посмотреть как они там работают.&lt;br /&gt;&lt;br /&gt;Еще несколько ссылок:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;&lt;a href="http://xooglers.blogspot.com/"&gt;Блог бывших гугловцев&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://google.blogspace.com/"&gt;Google Weblog&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://googleblog.blogspot.com/"&gt;The official Google blog&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://news.google.com/news?hl=en&amp;amp;ned=us&amp;q=google&amp;amp;btnG=Search+News"&gt;The latest news about Google&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://google.weblogsinc.com/"&gt;Inside Google&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://google.blognewschannel.com/"&gt;The Unofficial Google Weblog&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-8417009579234042977?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/8417009579234042977/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=8417009579234042977' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/8417009579234042977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/8417009579234042977'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2007/08/google.html' title='Работа и трудоустройство в Google'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-1148263622649904696</id><published>2007-08-03T15:24:00.000+07:00</published><updated>2008-01-08T15:16:47.781+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Базы данных'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Basic'/><title type='text'>Программное взаимодействие с MS SQL Server из MS Access</title><content type='html'>Недавно для одной из рабочих задач встала необходимость создания клиентского приложения для работы с базой данных на платформе MS SQL Server 2000. По условиям ТЗ клиент должен был быть выполнен в MS Access.&lt;br /&gt;&lt;br /&gt;Ниже я привожу код, который позволяет создать подключение к SQL Server без предварительного создания DSN и создать ссылки на серверные таблицы в Access.&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;' Функция проверки существования таблицы в Access&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;'&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;' Parameters&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;' tblName - название таблицы&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;'&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;' Return Value&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;' True - если таблица с заданным именем существует, False - в противном случае&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Public Function&lt;/span&gt; isTableExist(tblName) &lt;span style="color: rgb(0, 0, 153);"&gt;As Boolean&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;On Error Resume Next&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;Dim&lt;/span&gt; td &lt;span style="color: rgb(0, 0, 153);"&gt;As&lt;/span&gt; TableDef&lt;br /&gt;&lt;br /&gt;    isTableExist = &lt;span style="color: rgb(0, 0, 153);"&gt;False&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;Set&lt;/span&gt; td = currentDB.TableDefs(tblName)&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;If&lt;/span&gt; Err.Number = 0 &lt;span style="color: rgb(0, 0, 153);"&gt;Then&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 153);"&gt;If&lt;/span&gt; td.Connect &lt;&gt; "" &lt;span style="color: rgb(0, 0, 153);"&gt;Then&lt;/span&gt;&lt;br /&gt;            isTableExist = &lt;span style="color: rgb(0, 0, 153);"&gt;True&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 153);"&gt;End If&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 153);"&gt;Set&lt;/span&gt; td = &lt;span style="color: rgb(0, 0, 153);"&gt;Nothing&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;End If&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;    Err.Clear&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;End Function&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;' Функция создания ссылки в Access на таблицу в базе данных MS SQL Server&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;'&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;' Parameters&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;' &lt;/span&gt;serverName - имя или IP сервера&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;' serverDBName - название серверной базы данных&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;' tblName - название таблицы&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;' makeHidden - сделать таблицу скрытой (Boolean)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Public Sub&lt;/span&gt; linkTable(serverName, serverDBName , tblName, makeHidden)&lt;br /&gt;   &lt;span style="color: rgb(0, 102, 0);"&gt; ' Если в Access уже существует таблица с таким именем ее необходимо удалить&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;If&lt;/span&gt; (isTableExist(tblName) = &lt;span style="color: rgb(0, 0, 153);"&gt;True&lt;/span&gt;) &lt;span style="color: rgb(0, 0, 153);"&gt;Then&lt;/span&gt;&lt;br /&gt;        DoCmd.DeleteObject acTable, tblName&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;End If&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span style="color: rgb(0, 102, 0);"&gt; ' Создание ссылки на серверную таблицу в Access&lt;/span&gt;&lt;br /&gt;    DoCmd.TransferDatabase acLink, "ODBC", _&lt;br /&gt;                        "ODBC;DRIVER=SQL Server;" &amp; _&lt;br /&gt;                        "DATABASE=" &amp; serverDBName &amp;amp; ";" &amp; _&lt;br /&gt;                        "APP=Microsoft Office 2003;" &amp; _&lt;br /&gt;                        "SERVER=" &amp; serverName &amp;amp; ";" &amp; _&lt;br /&gt;                        "Trusted_Connection=Yes;" &amp; _&lt;br /&gt;                        "", acTable, tblName, tblName, False, True&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 102, 0);"&gt;' Если makeHidden = True таблица будет скрытой&lt;/span&gt;&lt;br /&gt;    Application.SetHiddenAttribute acTable, tblName, makeHidden&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;End Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;В процессе выполнения предыдущей процедуры (создания ссылки), если серверная таблица не имеет ключевых полей, будет показано диалоговое окно, с предложением создания ключевых полей. Если отказаться от выбора ключевых полей редактирование и создание новых записей будет невозможно. Доступ к таблицам будет осуществляться только в режиме чтения.&lt;br /&gt;&lt;br /&gt;Если необходимо предоставить доступ к серверным таблицам только для чтения и в подключаемых серверных таблицах нет ключевых полей, например, при создании ссылок на серверные представления (View), удобно воспользоваться следующей функцией. При создании ссылок на серверные таблицы предложений о выборе ключевых полей появляться не будет.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;' Функция создания ссылки в Access на таблицу в базе данных MS SQL Server&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 102, 0);"&gt;'&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 102, 0);"&gt;' Parameters&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;' &lt;/span&gt;serverName - имя или IP сервера&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 102, 0);"&gt;' serverDBName - название серверной базы данных&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 102, 0);"&gt;' tblName - название таблицы&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 102, 0);"&gt;' makeHidden - сделать таблицу скрытой (Boolean)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Public Sub&lt;/span&gt; linkView(serverName, serverDBName , tblName, makeHidden)&lt;br /&gt;    &lt;span style="color: rgb(0, 102, 0);"&gt;' Если в Access уже существует таблица с таким именем ее необходимо удалить&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;If&lt;/span&gt; (isTableExist(tblName) = &lt;span style="color: rgb(0, 0, 153);"&gt;True&lt;/span&gt;) &lt;span style="color: rgb(0, 0, 153);"&gt;Then&lt;/span&gt;&lt;br /&gt;        DoCmd.DeleteObject acTable, tblName&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;End If&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;    &lt;span style="color: rgb(0, 102, 0);"&gt;' Создание подключения к серверу&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;Set&lt;/span&gt; NewTableDef = currentDB.CreateTableDef(tblName)&lt;br /&gt;    NewTableDef.Connect = "ODBC;DRIVER=SQL Server;" &amp; _&lt;br /&gt;                        "UID=;" &amp; _&lt;br /&gt;                        "DATABASE=" &amp; serverDBName &amp;amp; ";" &amp; _&lt;br /&gt;                        "SERVER=" &amp; serverName &amp;amp; ";" &amp; _&lt;br /&gt;                        "PWD="&lt;br /&gt;    NewTableDef.SourceTableName = tblName&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 102, 0);"&gt;' Создание ссылки на серверную таблицу в Access&lt;/span&gt;&lt;br /&gt;    currentDB.TableDefs.Append NewTableDef&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 102, 0);"&gt;' Если makeHidden = True таблица будет скрытой&lt;/span&gt;&lt;br /&gt;    Application.SetHiddenAttribute acTable, tblName, makeHidden&lt;br /&gt;       &lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;Set&lt;/span&gt; NewTableDef = &lt;span style="color: rgb(0, 0, 153);"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;End Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;И, наконец, следующая функция иллюстрирует создание подключения к MS SQL Server без необходимости предварительного ручного или программного создания DSN.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Public Sub&lt;/span&gt; ExecSomeStoredProcedure(serverName, serverDBName)&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;Dim&lt;/span&gt; cnn &lt;span style="color: rgb(0, 0, 153);"&gt;As&lt;/span&gt; ADODB.Connection&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;Set&lt;/span&gt; cnn= &lt;span style="color: rgb(0, 0, 153);"&gt;New&lt;/span&gt; ADODB.Connection&lt;br /&gt;    cnn.Provider = "MSDataShape"&lt;br /&gt;    cnn.Properties("Data Provider") = "SQLOLEDB.1"&lt;br /&gt;    cnn.Properties("Initial Catalog") = serverDBName&lt;br /&gt;    cnn.Properties("Persist Security Info") = False&lt;br /&gt;    cnn.Properties("Data Source") = serverName&lt;br /&gt;    cnn.Properties("Integrated Security") = "SSPI"&lt;br /&gt;    cnn.Open&lt;br /&gt;    cnn.CommandTimeout = 90000&lt;br /&gt;&lt;br /&gt;    cnn.Execute "some_stored_procedure"&lt;br /&gt;&lt;br /&gt;    cnn.Close&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 153);"&gt;Set&lt;/span&gt; cnn = &lt;span style="color: rgb(0, 0, 153);"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;End Sub&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-1148263622649904696?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/1148263622649904696/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=1148263622649904696' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/1148263622649904696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/1148263622649904696'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2007/08/ms-sql-server-ms-access.html' title='Программное взаимодействие с MS SQL Server из MS Access'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-7490564957542684163</id><published>2007-08-03T13:20:00.000+07:00</published><updated>2007-08-03T13:28:43.976+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ИТ компании'/><title type='text'>Особенности работы в Google и вопросы при устройстве на работу в Microsoft</title><content type='html'>Некоторые особенности Google (взято с блога некого Cogito):&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;there are managers, sort of, but most of them code at least half-time, making  them more like tech leads.&lt;/li&gt;   &lt;li&gt;developers can switch teams and/or projects any time they want, no questions asked; just say the word and the movers will show up the next day to put you in your new office with your new team.&lt;/li&gt;   &lt;li&gt;Google  has a philosophy of not ever telling developers what to work on, and they take  it pretty seriously.&lt;/li&gt;   &lt;li&gt;developers are strongly encouraged to spend 20% of their time (and I mean their M-F, 8-5 time, not weekends or personal time) working on whatever they want, as long as it’s not their main project.&lt;/li&gt;   &lt;li&gt;there aren’t very many meetings. I’d say an average developer attends perhaps 3 meetings a week, including their 1:1 with their lead.&lt;/li&gt;   &lt;li&gt;it’s quiet. Engineers  are quietly focused on their work, as individuals or sometimes in little groups  or 2 to 5.&lt;/li&gt;   &lt;li&gt;there aren’t Gantt charts or date-task-owner spreadsheets or any other visible project-management artifacts in evidence, not that I’ve ever seen.&lt;/li&gt;   &lt;li&gt;even during the relatively rare crunch periods, people still go get lunch and dinner, which are (famously) always free and tasty, and they don’t work insane hours unless they want to.&lt;/li&gt; &lt;/ul&gt; &lt;a href="http://cogito.blogthing.com/2007/01/20/the-google-development-algorithm/"&gt;Оригинал&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;А вот еще и &lt;a href="http://allbesthumor.nnm.ru/ofis_google"&gt;фотографии&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;И в дополнение &lt;a href="http://www.sellsbrothers.com/fun/msiview"&gt;забавный сайт&lt;/a&gt;, на котором собраны вопросы на интервью при устройстве на работу в Microsoft.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-7490564957542684163?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/7490564957542684163/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=7490564957542684163' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/7490564957542684163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/7490564957542684163'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2007/08/google-microsoft.html' title='Особенности работы в Google и вопросы при устройстве на работу в Microsoft'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5392432030185421171.post-1127876306227413861</id><published>2007-07-27T10:59:00.000+07:00</published><updated>2008-01-08T15:15:43.836+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Базы данных'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>ZeosDBO vs Native MySQL library</title><content type='html'>&lt;div&gt;Год-два назад парни из нашей команды разработчиков озадачились поиском библиотеки для работы с MySQL из CBuilder 6.0. Они протестировали несколько freware и shareware библиотек и в результате остановились на библиотеке ZeosDBO.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Компоненты ZeosDBO - это BDE-подобные компоненты аля TTable, TQuery и т.п.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Библиотека была успешно использована при создании обработчика данных для установки переработки натриевого теплоносителя реактора БН-350 (г. Актау, Казахстан). Объемы данных небольшие, скорость выборки достаточно высокая.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Спустя некоторое время на осонове того же класса работы с MySQL, использующего ZeosDBO, была начата разработка системы группового анализа данных регистрации физических параметров экспериментов. Объем данных превышает объем данных предыдущего проекта в десятки и сотни раз. Кроме всего прочего необходимо было организовать построение графиков и фильтрацию сигналов от помех.&lt;br /&gt;&lt;br /&gt;Время, затрачиваемое на выборку данных составляло от нескольких секунд, до минуты и более на один тег, в зависимости от объема данных.&lt;br /&gt;&lt;br /&gt;Так как визуальные компоненты ZeosDBO не использовались, я решил заменить библиотеку ZeosDBO на "родную" си-шную библиотеку MySQL от разработчиков СУБД.&lt;br /&gt;&lt;br /&gt;Прирост производительности превзошел все ожидания. Для особенно больших объемов данных время выборки и обработки данных сократилось в сотни раз.&lt;br /&gt;&lt;br /&gt;Учитывая, что я никогда не пользовался возможностями компонент TTable и лишь частично использовал возможности TQuery, отныне и впредь мой выбор за "родной" библиотекой MySQL.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5392432030185421171-1127876306227413861?l=blog.yastrebkov.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.yastrebkov.com/feeds/1127876306227413861/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5392432030185421171&amp;postID=1127876306227413861' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/1127876306227413861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5392432030185421171/posts/default/1127876306227413861'/><link rel='alternate' type='text/html' href='http://blog.yastrebkov.com/2007/07/zeosdbo-vs-native-mysql-library.html' title='ZeosDBO vs Native MySQL library'/><author><name>Dmitry I Yastrebkov</name><uri>http://www.blogger.com/profile/14332265550257998996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13151254820690435075'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry></feed>