Показаны сообщения с ярлыком windows. Показать все сообщения
Показаны сообщения с ярлыком windows. Показать все сообщения

пятница, 10 декабря 2010 г.

Установка boost под Windows. Сборка из исходников

Новый пост из серии «Простой проект с использованием CMake, log4cxx, boost».

В предыдущей записи было рассказано, как установить boost с помощью Boost Installer. Данный подход оказался неудачным, поскольку сервера, с которых инсталлятор скачивал необходимые файлы, часто оказывались недоступны. Поэтому рассмотрим второй способ установки — сборку из исходников.

Последнюю версии архива с необходимыми файлами можно скачать здесь. Необходимо распаковать архив, запустить cmd и перейти в папку с содержимым архива.

Сборка осуществляется за два шага. Сначала нужно собрать bjam, утилиту, управляющую процессом компиляции и установки. Для этого предназначена команда bootstrap. После ее запуска необходимо собрать и установить сам boost.
bjam --prefix="C:\Program Files (x86)\boost\boost_1_44_0" --build-type=complete --with-system --with-filesystem install

Ключи имеют следующие значения:
  • prefix — директория, куда будет установлена библиотека;
  • build-type определяет варианты сборки (статические/динимические, многопоточность, наличие отладочной информации, способ линковки с run-time'ом). complete осуществляет сборку всех возможных вариантов;
  • with-system — собирать библиотеку system;
  • with-filesystem — собирать библиотеку filesystem.

вторник, 9 ноября 2010 г.

WCF: аутентификация по логину и паролю. Ссылки

http://codebetter.com/blogs/peter.van.ooijen/archive/2010/03/22/a-simple-wcf-service-with-username-password-authentication-the-things-they-don-t-tell-you.aspx

http://codebetter.com/blogs/peter.van.ooijen/archive/2010/04/09/a-simple-wcf-service-with-username-password-authentication-the-things-you-told-me.aspx

Как запустить просмотр pdf из Makefile в Windows

Q: Как сделать так, чтобы цель Makefile'а под Windows запускала pdf'ку в программе по умолчанию?

A:
view: $(PDF)
  cmd /c start $(PDF)

LaTeX: единый Makefile для Windows и Linux

Бывает необходимо собирать документы LaTeX и на Windows и на Linux. За счет использования MiKTeX и GnuWin можно не беспокоится о платформозависимости, но остается один мелкий нюанс: создание директории для сборки командой mkdir. В linux'е она принимает ключ -p, позволяя создать несколько вложенных директорий за раз и не падать с ошибкой, если директория уже существует. В винде этот ключ рассматривается как имя папки и повторный запуск make'а прерывает сборку с ошибкой, что папка уже существует. Для решения этой проблемы нужно реализовать ветвление по типу ОС.

...

UNAME = $(shell uname)
ifeq ($(UNAME), windows32)
  MKDIR_COMMAND = if not exist $(BUILD_DIR) mkdir $(BUILD_DIR)
else
  MKDIR_COMMAND = mkdir -p $(BUILD_DIR)
endif

all: $(PDF)

$(PDF): $(TEX) $(STYLE)
  $(MKDIR_COMMAND)
  pdflatex -output-directory=$(BUILD_DIR) $(TEX)
  pdflatex -output-directory=$(BUILD_DIR) $(TEX)
  mv $(BUILD_DIR)/$(PDF) .

...

четверг, 14 октября 2010 г.

Пропадающие инициалы авторов в BibTeX из MiKTeX 2.9 со стилем gost780s

При использовании стиля gost780s в MiKTeX 2.9 не отображаются инициалы авторов, хотя место для них выделяется. Для исправления этого бага необходимо в файле [MIKTEX_INSTALL_FOLDER]\bibtex\bst\gost\gost780s.bst в строке 523 исправить
#1 "{vv~}{ll}{~jj}{,~f.}" format.name$
на
#1 "{vv~}{ll}{~jj}{,~ff}" format.name$
а в строке 534
"{f.}{~vv}{~ll}{, jj}"
на
"{ff}{~vv}{~ll}{, jj}"
то есть f. (с точкой) поменять на ff (без точки). Это может касаться и других стилей gost.

Найдено здесь.

четверг, 30 сентября 2010 г.

MEX endpoint и ошибка 400

Пусть есть некоторая WCF служба, у которой определен MEX endpoint:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="GeneralBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
      <service name="WcfTest.Core.TalkingService" behaviorConfiguration="GeneralBehavior">
        <endpoint address="" binding="basicHttpBinding" contract="WcfTest.Core.ITalkingService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <directoryBrowse enabled="true" />
  </system.webServer>

</configuration>

Служба хостится в IIS по адресу http://localhost/WcfTest.IISHost/TalkingService.svc. Заходим браузером на этот адрес и видим сообщение, поясняющее, что мы можем сделать с этой службой. В сообщение предлагается получить WSDL, перейдя по ссылке http://localhost/WcfTest.IISHost/TalkingService.svc?wsdl. Это работает, именно для этого был использован httpGetEnabled.

Однако при попытке перейти по адресу http://localhost/WcfTest.IISHost/TalkingService.svc/mex, указанному в MEX endpoint, мы получим от сервера ошибку HTTP 400 Bad request. Почему, мы же разрешили MEX? Плюс WCFTestClient нормально работает с этим адресом.

Дело в том, что mexHttpBinding использует SOAP и ожидает POST запрос, поэтому к нему нельзя обратиться через браузер. Единственный способ получить браузером WSDL - использовать параметр ?wsdl.

Найдено здесь и здесь.

вторник, 21 сентября 2010 г.

Использование WSE в Windows 7 x64

WSE поддерживается только 2005 студией. Установщик WSE терпит неудачу при обновлении конфига студии, в результате чего она неверно генерирует прокси-классы. Для решения этой проблемы необходимо добавить в файл C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\IDE\devenv.exe.config следующий код:

<configuration>
  <system.web>
    <webServices>
      <soapExtensionImporterTypes>
        <add type="Microsoft.Web.Services3.Description.WseExtensionImporter, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </soapExtensionImporterTypes>
    </webServices>
  </system.web>
</configuration>

Найдено здесь.

среда, 15 сентября 2010 г.

Установка boost под Windows

Второй пост из серии «Простой проект с использованием CMake, log4cxx, boost». Рассмотрим установку библиотек boost под Windows.

Существует два способа:
  1. собрать из исходников
  2. использовать инсталлятор

Выберем второй, как более простой. Boost Installer находится здесь, последняя на данный момент версия 1.44.0. Для работы установщика необходимо соединение с Интернет.

После запуска и принятия лицензии будет предложено выбрать зеркало, следует оставить значение по умолчанию (Nearest SourceForge Mirror). Затем требуется указать варианты конфигурации бинарников.


Данное окно позволяет выбрать вариант установки библиотеки. Например, если выбрать Visual C++ 2010, Multithread Debug DLL, то будут загружены все компоненты boost'а, собранные под 10-ую студию в динамически загружаемую библиотеку с отладочной информацией. Нам все компоненты не нужны, поэтому никаких галочек здесь не ставим, вместо этого выбираем отдельные компоненты.


Для текущего проекта понадобится Boost Filesystem, Boost System и все заголовочные файлы. Выбираем варианты Multithread Debug DLL и Multithread DLL под vs10.0. В PATH (Add to path чекбокс) ничего добавлять не нужно. Destination Folder оставляем по умолчанию. Затем следует процесс скачивания выбранных компонентов. Если возникают проблемы с доступностью серверов и соединение рвется, следует перезапустить установщик с теми же параметрами.

На вопрос об обновлении PATH отвечаем отрицательно, это действие выполним вручную. Поскольку мы будем линковаться с динамически загружаемыми библиотеками, они должны быть доступны нашей программе при запуске. Для этого в PATH добавляем C:\Program Files\boost\boost_1_44\lib, т.е. папку с бинарными файлами boost'а.

На этом установку можно считать законченной.

ReSharper: имена обработчиков событий UI

По умолчанию VS генерирует имена методов, подписанных на события UI, по шаблону
объект_событие, однако решарпер подчеркивает эти имена как имеющие неверный стиль. Для исправления открываем его настройки (ReSharper --> Options) и на странице Languages --> C# --> C# Naming Style выбираем опцию Override Common Settings. В таблице выделяем Methods, Properties and Events и нажимаем Advanced Settings. В поле Event subscriptions on fields вместо $object$_On$event$ пишем $object$_$event$.



Взято здесь.

вторник, 7 сентября 2010 г.

MS SQL CE 3.5: Список файлов

Полезная статья, содержащая списки бинарных файлов MS SQL CE 3.5 для разных сценариев частного развертывания.

четверг, 2 сентября 2010 г.

Сборка log4cxx 0.10.0 в Visual Studio 2010. Детали

Первый пост из серии «Простой проект с использованием CMake, log4cxx, boost». Рассмотрим сборку log4cxx из исходников под Windows с использованием Visual Studio 2010. Соответствующий пост с отдельными деталями здесь.

log4cxx — библиотека от Apache, предназначенная для организации логирования в проектах на C++. Создается впечатление, что разработка заглохла, но библиотека довольно фичаста, плюс семейство библиотек log4-что-то является одним из стандартов в своей области. Поэтому будет использовать ее, хотя стоит обратить внимание и на Boost.Log, и на google-glog.

В качестве базы использована официальная инструкция по сборке. Начнем со скачивания исходников. Необходима сама библиотека (apache-log4cxx-0.10.0.zip) и две вспомогательных для нее: Apache Portable Runtime (apr) и APR-util (там же). Последние версии на момент написания статьи 0.10.0, 1.4.2 и 1.3.9 соответственно. На странице с библиотеками нужно скачивать версии Win32 Source, чтобы использовались правильные символы конца строки.

После скачивания архивов распаковываем их в одну папку. Директории вспомогательных библиотек нужно переименовать в apr и apr-util, убрав из названия номер версии.

После этого необходимо запустить два bat-файла из папки apache-log4cxx-0.10.0, configure.bat и configure-aprutil.bat. Можно использовать проводник, но я предпочитаю консоль. Второй батник использует sed, который должен быть доступен в $PATH. Скачать его можно здесь. Подробности установки sed рассматривать не будем, если нужно, можно задать вопрос в комментарии.

Итак, запускаем батники:

После этого необходимо пропатчить исходники, чтобы они собирались 2010-ой студией. Заходим в Jira проекта и скачиваем прикрепленный к талону патч. Для его применения можно использовать TortoiseSVN: щелкаем по файлу правой кнопкой и выбираем пункт TortoiseSVN --> Apply patch. Черепаха спросит, к файлам из какой папки должен быть применен этот патч. Укажем папку, куда были распакованы архивы. После этого в маленьком окошке со списком файлов выберем все cpp-файлы и все h-файлы кроме log4cxx.h и log4cxx_private.h


Щелкаем по ним правой кнопкой и выбираем пункт Patch Selected. Применение изменений должно пройти без ошибок, никакой файл из приведенных в списке не должен стать красным.

После применения патча запускаем VS и открываем в ней apache-log4cxx-0.10.0\projects\log4cxx.dsw. Соглашаемся со всеми предложениями, связанными с конвертацией в проект нового формата. Во время этого процесса студия потеряет данные о зависимости log4cxx.dll от других вспомогательных библиотек, поэтому проект соберется, но не слинкуется. Восстановим зависимости, как указано в другом посте, упомянутом выше.

В Solution Explorer'е выбираем проект log4cxx и открываем его свойства. Открываем страницу свойств Configuration Properties --> Linker --> General и для конфигурации Debug в пункте Additional Library Directories указываем следующее, говоря тем самым линковщику, где искать дополнительные библиотеки:
..\..\apr\LibD
..\..\apr-util\LibD
..\..\apr-util\xml\expat\lib\LibD



Затем необходимо указать с какими именно дополнительными библиотеками нужно осуществлять линковку. Для этого в том же окне на странице Configuration Properties --> Linker --> Input выбираем пункт Additional Library Dependencies. Там указываем дополнительные библиотеки к уже имеющимся:
apr-1.lib
aprutil-1.lib
xml.lib

Для конфигурации Relese нужно сделать все тоже самое, с тем лишь исключением, что вместо папки LibD нужно будет указывать LibR. Сохраняем изменения и запускаем компиляцию, щелкнув по проекту log4cxx правой кнопкой и выбрав пункт Build.

После компиляции в папках apache-log4cxx-0.10.0\projects\Debug и apache-log4cxx-0.10.0\projects\Release появятся бинарные файлы. Нас интересует log4cxx.dll и log4cxx.lib, позже будем ссылаться на них как на дебажные и релизные версии log4cxx.

Update: VS 2010 на XP почему-то может не собрать проект, ссылаясь на ошибку, связанную с mt.exe. Помогает сборка по частям: aprutil, xml, apr и log4cxx.

Простой проект с использованием CMake, log4cxx, boost

Планируется серия постов, посвященных разработке простого проекта на C++, использующего библиотеки boost, log4cxx, и собираемого CMake. Будет рассмотрена интеграция с Visual Studio 2010 и Eclipse Helios CDT, соответственно проект будет собираться под Windows и Linux. Отдельные детали уже были описаны в предыдущих постах, сейчас же рассмотрим все в подробностях.

Примерный план такой:

  1. Сборка log4cxx под Windows

  2. Установка boost под Windows
  3. Разработка структуры проекта
  4. Написание кода
  5. Конфигурация log4cxx
  6. Сборка CMake'ом под Windows
  7. Интеграция с Visual Studio 2010
  8. Установка библиотек и сборка CMake'ом под Linux
  9. Интеграция с Eclipse Helios CDT
Больше внимания будет уделено Windows, поскольку для нее все оказалось сложнее и не так прямолинейно, как для Linux.

среда, 1 сентября 2010 г.

MS SQL Server: прочитать вывод хранимой процедуры

Q: Как сделать так, чтобы при запуске хранимой процедуры с помощью SqlCommand.ExecuteNonQuery() можно было получить то, что она выводит через print?

A: Использовать событие SqlConnection.InfoMessage.

private void RunProcedure()
{
  using (SqlConnection connection = new SqlConnection(…))
  {
    connection.InfoMessage += OnSqlConnectionInfoMessage;
    connection.Open();

    …

    connection.Close();
    connection.InfoMessage -= OnSqlConnectionInfoMessage;
  }
}

private void OnSqlConnectionInfoMessage(object sender, SqlInfoMessageEventArgs eventArgs)
{
  log.InfoFormat("Message from SQL Server: {0}", eventArgs.Message);
}

вторник, 24 августа 2010 г.

Отображение непечатаемых символов в SQL Server Management Studio

Чтобы включить в Management Studio отображение непечатаемых символов (пробел, табуляция), нужно присвоить значение 1 следующему ключу реестра:
HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\xx\Tools\Shell\Text Editor\Visible Whitespace

Здесь xx — версия SSMS. Для 2008-ого SQL сервера имеет значение 100.

В VS, кстати, это делается комбинацией клавиш Ctrl+R, Ctrl+W.

Найдено здесь.

суббота, 21 августа 2010 г.

Visual Studio 2010: Clean command line, переменные среды

При выполнении команды Clean в C++ проекте типа Makefile project команды запускаются в некорректном окружении: cmake ругается на отсутствие необходимых переменных, nmake не доступен в PATH. Проблема известна, но предложенный workaround с ключом useenv не работает, неправильное окружение получают и команды Build и Rebuild.


Update: решение найдено. Необходимо в Clean command line добавить вызов bat-файла, устанавливающего необходимые переменные среды. Этот bat-файл используется в ярлыке Visual Studio Command Prompt (2010).

call "$(VCInstallDir)vcvarsall.bat"

set BUILD_DIR="$(ProjectDir)$(Configuration)"
set PROJECT_DIR="$(ProjectDir)..\..\.."
 
if not exist %BUILD_DIR% mkdir %BUILD_DIR%
cd %BUILD_DIR%
cmake -DCMAKE_BUILD_TYPE=$(ConfigurationName) -G "NMake Makefiles" %PROJECT_DIR%
nmake clean

Сборка log4cxx 0.10.0 в Visual Studio 2010

log4cxx версии 0.10.0, скачанный с сайта Apache, не собирается. Проблема известная и отмечена в issue tracker'е проекта. В талоне указан патч, который вносит необходимые исправления в код. В него входят некоторые лишние, на мой взгляд, файлы (log4cxx.h, log4cxx_private.h и два xml системы сборки), которые патчить не нужно. После внесения модификаций проект скомпилируется, но не слинкуется. Причина в том, что при конвертации файла проекта в новый формат были утеряны сведения о зависимостях log4cxx.dll от других библиотек.

Для конфигурации Release необходимо внести следующие изменения:

log4cxx Properties --> Configuration Properties --> Linker --> General --> Additional Library Directories


log4cxx Properties --> Configuration Properties --> Linker --> Input --> Additional Library Dependencies


Для конфигурации Debug имена директорий LibR нужно поменять на LibD.

PS: Процесс сборки описан здесь.

вторник, 17 августа 2010 г.

CMake, Visual Studio, отладка

Чтобы отлаживать проект CMake'а в студии, необходимо указать следующее в поле Command страницы Debugging свойств проекта:
$(TargetDir)$(ConfigurationName)\$(TargetName)\$(TargetFileName)

Update:Для Visual Studio 2010 путь будет другой.

$(ProjectDir)$(Configuration)\$(ProjectName)\$(ProjectName).exe

Так же имеет смысл указать Working Directory, использовав путь к исполняемому файлу. Для VS 2010:

$(ProjectDir)$(Configuration)\$(ProjectName)\

Update2: эти установки сохраняются не в файле проекта, а файле *.vcxproj.user

пятница, 13 августа 2010 г.

Исправление бага в развернутом ASP.NET приложении

Есть ASP.NET приложение, которое развернуто у заказчика. В приложении баг, развернуть новую версию быстро нельзя. Баг можно обойти, если изменить свойство наследника HttpApplication, которое задается в обработчике события Application.Start.

К счастью, у наследника оказался виртуальный метод, который можно было переопределить:
protected virtual void OnApplicationEnd(object sender, EventArgs e)
{
  Log.Debug("Application End");
}

Для этого нужно отредактировать Global.axax:
<%@ Application Codebehind="Global.asax.cs" Inherits="Triad.Server.QueryService.QueryServiceApplication" Language="C#" %>

<script runat="server">
protected override void OnApplicationStart(object sender, EventArgs e)
{
  base.OnApplicationStart(sender, e);
  // set property
}
</script>

Идея была подсказана на форуме.

вторник, 10 августа 2010 г.

CMake: интеграция с Visual Studio

Есть проект, описанный здесь, нужно интегрировать его с VS.

Структура директорий следующая:
C:\DOCUMENTS AND SETTINGS\user\DESKTOP\CMAKE_TEST
│   CMakeLists.txt
│
├───cli
│   │   CMakeLists.txt
│   │
│   └───src
│           main.cpp
│
├───core
│   │   CMakeLists.txt
│   │
│   ├───include
│   │       core.hpp
│   │
│   └───src
│           core.cpp
│           core.hpp
│
└───ide_files
    └───vs
        │   CMake_test.sln
        │
        ├───cli
        │       cli.vcproj
        │
        └───core
                core.vcproj

В студии нужно создать солюшен и добавить в него два проекта, соответствующие подпроектам CMake, подробно это описано здесь. В каждый из проектов нужно добавить соответствующие исходные файлы (правой кнопкой по проекту --> Add --> Existing Item). Но команды для сборки проекта будут другие:
set BUILD_DIR="$(TargetDir)$(ConfigurationName)"
set PROJECT_DIR="$(TargetDir)..\..\.."

if not exist %BUILD_DIR% mkdir %BUILD_DIR%
cd %BUILD_DIR%
cmake -DCMAKE_BUILD_TYPE=$(ConfigurationName) -G "NMake Makefiles" %PROJECT_DIR%
nmake all

set BUILD_DIR="$(TargetDir)$(ConfigurationName)"
set PROJECT_DIR="$(TargetDir)..\..\.."

if not exist %BUILD_DIR% mkdir %BUILD_DIR%
cd %BUILD_DIR%
cmake -DCMAKE_BUILD_TYPE=$(ConfigurationName) -G "NMake Makefiles" %PROJECT_DIR%
nmake clean all

set BUILD_DIR="$(TargetDir)$(ConfigurationName)"
set PROJECT_DIR="$(TargetDir)..\..\.."

if not exist %BUILD_DIR% mkdir %BUILD_DIR%
cd %BUILD_DIR%
cmake -DCMAKE_BUILD_TYPE=$(ConfigurationName) -G "NMake Makefiles" %PROJECT_DIR%
nmake clean

В поле Output должно быть написано core.lib для проекта core и cli.exe для проекта cli.

Исходный код здесь.

Update: Выше указаны команды сборки для проекта cli. Для проекта core необходимо изменить вторую строку:

set PROJECT_DIR="$(TargetDir)..\..\..\core"

Update1: для Visual Studio 2010 первые две и 6-ая строки должны быть другими, поскольку изменились имена встроенных переменных (пример для проекта cli):
set BUILD_DIR="$(ProjectDir)$(Configuration)"
set PROJECT_DIR="$(ProjectDir)..\..\.."
 
if not exist %BUILD_DIR% mkdir %BUILD_DIR%
cd %BUILD_DIR%
cmake -DCMAKE_BUILD_TYPE=$(Configuration) -G "NMake Makefiles" %PROJECT_DIR%
nmake all