пятница, 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.

воскресенье, 28 ноября 2010 г.

LaTeX и шрифт 14 пунктов

Чтобы использовать шрифт размером больше 12 пунктов, необходимо установить пакет extsizes. Размер шрифта указывается при объявлении класса документа.

\documentclass[14pt]{extarticle}

При использовании нестандартных шрифтов рекомендуется использовать нестандарные классы, такие как extarticle.

При трасляции может быть выдано предупреждение
Package ExtSizes Warning: It is better to use one of the extsizes classes, if you can.

Оно означает, что где-то в прамбуле явно через usepackage подключается пакет extsizes. Эту команду нужно убрать. Подробности можно найти здесь.

суббота, 27 ноября 2010 г.

BibTeX, utf8 и стили gost

У BibTeX из TeX Live возникает проблема с кодировкой utf8 при использовании стиля gost78s, которая может касаться и других стилей gost: вместо инициалов авторов подставляются неюникодные символы, что приводит к ошибке трансляции.
! Package inputenc Error: Unicode char \u8:�. not set up for use with LaTeX.

Это можно решить тем же способом, что и проблему с MiKTeX: необходимо заменить f. (f с точкой) на ff (две f). В файле /usr/share/texmf-texlive/bibtex/bst/gost/gost780s.bst эта подстрока встречается два раза. Чтобы не менять системный файл, этот файл можно скопировать в рабочую папку, сменив имя, чтобы LaTeX не спутал его с системным.

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

вторник, 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) .

...

суббота, 6 ноября 2010 г.

Установка PSCyr под TeX Live

Google на вопрос об установке PSCyr под linux отвечает массой странных ссылок, предлагающих превратить Убунту в Слаку. Самая адекватная, на мой взгляд, инструкция находится здесь. Позволю себе ее скопировать, приведя ее в соответствие тому, что есть сейчас.

  1. Нужно достать PSCyr. На данный момент последняя версия, доступная тут — 0.4d-beta9. Скачиваем файлы pscyr-0.4-beta9exp2-tex.tar.gz и pscyr-0.4-beta9exp2-type1.tar.gz.
  2. В домашнем каталоге необходимо создать директорию с именем .texmf-var. В этом каталоге будут храниться пользовательские настройки, что довольно удобно: дополнительные пакеты может ставить и простой пользователь, не только root.
  3. Теперь извлекаем из скачанных архивов в ~/.texmf-var/ каталоги fonts и tex. Каталог dvips извлекать не нужно!
  4. В каталоге ~/.texmf-var/fonts/ необходимо создать два каталога: map и enc. Здесь хранится информация осоответствии имен файлов и имен шрифтов, а также о кодировках шрифтов.
  5. Теперь настал черед директории dvips из архивов. Необходимо распаковать файл dvips/pscyr/pscyr.map в каталог ~/.texmf-var/fonts/map/, а файлы dvips/pscyr/t2a.enc и dvips/pscyr/t2d.enc в каталог ~/.texmf-var/fonts/enc/. Тем самым, необходимые для работы PSCyr файлы оказываются на нужных местах. Остается только указать xdvi и dvips, чтобы они их использовали.
  6. Изменение конфигурационных файлов. Увы, тут без прав root не обойтись. В файл /etc/texmf/xdvi/xdvi.cfg нужно добавить строку dvipsmap pscyr.map. А в файл /etc/texmf/dvips/config/config.ps строку p +pscyr.map. После чего от имени пользователя выполнить команду texhash. PSCyr должен работать с этого момента.

Проверено на Ubuntu 10.10 Maverick Meerkat, texlive версии 2009-10.

Update: лучше пользоваться этим.

Ubuntu 10.10 Maverick Meerkat. Настройка grub

Адаптируем заметку Ubuntu Karmic. Настройка Grub к последней версии дистрибутива — Maverick Meerkat.

Касательно файла /etc/default/grub все осталось без изменений, необходимо изменить указанные ниже настройки:
  • GRUB_TIMEOUT=5 — время показа меню, 5 секунд.
  • раскомментировать GRUB_DISABLE_LINUX_RECOVERY="true" для отключения recovery пунктов меню.

Для отключения вызова memtest'а с выводом на последовательную консоль необходимо привести файл /etc/grub.d/20_memtest86+ в следующий вид:
#!/bin/sh
set -e

if [ -f /usr/lib/grub/grub-mkconfig_lib ]; then
  . /usr/lib/grub/grub-mkconfig_lib
  LX=linux16
elif [ -f /usr/lib/grub/update-grub_lib ]; then
  . /usr/lib/grub/update-grub_lib
  LX=linux
else
  # no grub file, so we notify and exit gracefully
  echo "Cannot find grub config file, exiting." >&2
  exit 0
fi

# We can't cope with loop-mounted devices here.
case ${GRUB_DEVICE_BOOT} in
  /dev/loop/*|/dev/loop[0-9]) exit 0 ;;
esac

prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")"

if test -e /boot/memtest86+.bin ; then
  MEMTESTPATH=$( make_system_path_relative_to_its_root "/boot/memtest86+.bin" )
  echo "Found memtest86+ image: $MEMTESTPATH" >&2
  cat << EOF
menuentry "Memory test (memtest86+)" {
EOF
  printf '%s\n' "${prepare_boot_cache}"
  cat << EOF
    $LX $MEMTESTPATH
}
EOF
fi
На закомментированные строки в конце файла (начинающиеся с #) можно не обращать внимания. Код, который следует поместить в файл /etc/grub.d/08_windows_7, представлен ниже. Новый файл должен иметь исполняемый бит.
#! /bin/sh
set -e

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib

. ${libdir}/grub/grub-mkconfig_lib

if [ -z "`which os-prober 2> /dev/null`" -o -z "`which linux-boot-prober 2> /dev/null`" ] ; then
  # missing os-prober and/or linux-boot-prober
  exit 0
fi

OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`"
if [ -z "${OSPROBED}" ] ; then
  # empty os-prober output, nothing doing
  exit 0
fi

for OS in ${OSPROBED} ; do
  DEVICE="`echo ${OS} | cut -d ':' -f 1`"
  LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
  LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`"

  if [ -z "${LONGNAME}" ] ; then
    LONGNAME="${LABEL}"
  fi

  if [ "x${LONGNAME}" = "xWindows 7 (loader)"  ]; then
    echo "Found Windows 7" >&2
    cat << EOF
menuentry "Windows 7" {
EOF
    save_default_entry | sed -e "s/^/\t/"
    prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
    cat << EOF
  chainloader +1
}
EOF
  fi
done
Теперь необходимо внести изменения в файл /etc/grub.d/30_os-prober, что он не находил Windows 7. Файл большой, поэтому приведем только часть кода, начинающуюся со 149 строки. Необходимо добавить в файл последние 4 приведенные здесь строки:
for OS in ${OSPROBED} ; do
  DEVICE="`echo ${OS} | cut -d ':' -f 1`"
  LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
  LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`"
  BOOT="`echo ${OS} | cut -d ':' -f 4`"

  if [ -z "${LONGNAME}" ] ; then
    LONGNAME="${LABEL}"
  fi

  if [ "x${LONGNAME}" = "xWindows 7 (loader)"  ]; then
    echo "Found Windows 7, skipping" >&2
    continue
  fi
После внесения все изменений необходимо отдать команду sudo update-grub:
user@host:/etc/grub.d$ sudo update-grub
Generating grub.cfg ...
Found Windows 7
Found linux image: /boot/vmlinuz-2.6.35-22-generic
Found initrd image: /boot/initrd.img-2.6.35-22-generic
Found memtest86+ image: /memtest86+.bin
Found Windows 7, skipping
done
После этого загрузочное меню должно принять вид
  • Windows 7
  • Ubuntu
  • Memtest

По умолчанию будет загружаться Windows 7.

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

LaTeX: добавить библиографию в оглавление

Чтобы в классе article добавить библиографию в огравление нужно успользовать следующий код:
\addcontentsline{toc}{section}{\refname}
  \bibliography{bib_name}
где bib_name — имя файла с BibTeX'овской базой. Для других классов стоит попробовать \bibname вместо \refname

Подробнее смотреть здесь и здесь.

Пропадающие инициалы авторов в 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 г.

Bash: как сделать trim()?

Q: Как сделать trim() в bash?


A:
~$ echo " test" | tr -d " "

Linux: изменить локаль запускаемого приложения

Q: Как запустить некоторое приложение так, чтобы вместо локали по умолчанию, например, русской, использовалась английская?


A:
~$ LANG=C command

Сборка 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 г.

Eclipse: не добавляется слово в пользовательский словарь

Свежеустановленный Eclipse с CDT не знает слова destructor и подчеркивает его как неправильное. Если навести на слово мышь, то появляется всплывающее окно, предлагающее варианты действий. Один из вариантов — добавить слово в пользовательский словарь. Открывается окошко, в поле «User defined dictionary» которого можно указать путь к словарю. Однако это не работает, слово по-прежнему подчеркивается красным.

Ключевой момент — выпадающий список «Select spelling engine to use». В нем должно быть выбрано C/C++ spelling engine.

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

понедельник, 9 августа 2010 г.

Как программно отключить bluetooth

rfkill block bluetooth

Управление цветом в KDE

Стандарных средств для настройки яркости и контрастности в KDE нет, поэтому придется использовать гномовский gnome-color-manager, который есть в репозиториях Ubuntu 10.04. После установки программа будет доступна в по адресу K-menu -> Приложения -> Настройка -> Цветовые профили.

Перед запуском необходимо открыть gconf-editor (через меню найти не удалось, можно запустить из командной строки Alt+F2). В нем установить в true ключ /apps/gnome-color-manager/show_fine_tuning. После запуска приложения на вкладке устройства выбрать монитор и открыть группу "Уточнение параметров", там будут ползунки яркости, контрастности и гаммы.


Чтобы восстановить настройки после запуска нового сеанса, необходимо добавить gcm-apply в автозагрузку.

Как в Ubuntu убрать стандартные папки из домашнего каталога

За стандартные папки типа "Загрузки", "Документы" отвечает пакет xdg-user-dirs. Для его настройки необходимо отредактировать файл ~/.config/user-dirs.dirs.

XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/"
XDG_TEMPLATES_DIR="$HOME/"
XDG_PUBLICSHARE_DIR="$HOME/"
XDG_DOCUMENTS_DIR="$HOME/"
XDG_MUSIC_DIR="$HOME/"
XDG_PICTURES_DIR="$HOME/"
XDG_VIDEOS_DIR="$HOME/"

Для того, чтобы папка не создавалась при загрузке, нужно чтобы соответствующая переменная указывала на $HOME. "Desktop" вместо "Рабочий стол" удобнее в консоли. После изменения файла можно удалять папки, больши они появиться не должны.

среда, 4 августа 2010 г.

Простой скрипт для настройки iptables

Создаем файл /etc/network/if-up.d/iptables и назначаем ему права на выполнение. Скрипт рассчитан на машину, подключаемую к сети по локалке и wi-fi.

#!/bin/sh
echo "Setting iptables rules"

IPTABLES="/sbin/iptables"

# delete rules and chains
$IPTABLES -F
$IPTABLES -X

# enable everything on lo
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

for iface in eth0 wlan0
do
 # enable all established input connections
 $IPTABLES -A INPUT -i $iface -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
 $IPTABLES -A INPUT -i $iface -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
 $IPTABLES -A INPUT -i $iface -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT

 # enable outgoing traffic
 $IPTABLES -A OUTPUT -o $iface -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
 $IPTABLES -A OUTPUT -o $iface -p udp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
 $IPTABLES -A OUTPUT -o $iface -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
done

# block all other input connections
$IPTABLES -A INPUT -p tcp -j REJECT --reject-with tcp-reset
$IPTABLES -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
 
# default policies
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

#protect from spoofing
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

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

Иерархия директорий для разработки библиотеки на C++

Предположим, мы разрабатываем на C++ библиотеку и программу, ее использующую. Библиотека должна предоставлять заголовочные файлы для использования ее классов, но эти файлы не должны раскрывать внутренней иерархии директорий проекта библиотеки.

Можно использовать следующую структуру папок (проект описан в другом посте):
D:\PROJECTS\SIMPLE-THINGS\TRUNK\CMAKE_TEST
│   CMakeLists.txt
│
├───cli
│   │   CMakeLists.txt
│   │
│   └───src
│           main.cpp
│
└───core
    │   CMakeLists.txt
    │
    ├───include
    │       core.hpp
    │
    └───src
            core.cpp
            core.hpp
Примем соглашение, по которому клиент библиотеки вправе обращаться только к заголовочным файлам из папки include, а файлы в этой папке будут ссылаться на другие файлы из каталога библиотеки. Таким образом поставленная задача инкапсуляции будет решена.

Но возникает другая проблема: include guard в одноименных файлах (core.hpp в примере) может совпадать, в этом случае целевой файл не будет заинклюжен. Для этого придется принять еще одно соглашение, по которому guard во внешних файлах будет называться, например, CLASS_NAME_HPP, а во внутренних _CLASS_NAME_HPP_.

CMake: консольная программа и статическая библиотека

Необходимо написать программу с консольным интерфейсом, которая будет линковаться со статической библиотекой. Для сборки будет использован CMake.

Сначала создадим необходимую иерархию директорий:
D:\PROJECTS\SIMPLE-THINGS\TRUNK\CMAKE_TEST
│   CMakeLists.txt
│
├───cli
│   │   CMakeLists.txt
│   │
│   └───src
│           main.cpp
│
└───core
    │   CMakeLists.txt
    │
    ├───include
    │       core.hpp
    │
    └───src
            core.cpp
            core.hpp
CMAKE_TEST - главный каталог проекта. Библиотека находится в папке core, сама программа - в папке cli. В каждой из упомянутых папок есть файл CMakeLists.txt, описывающий их содержимое.

CMakeLists.txt в корневой директории проекта:
cmake_minimum_required(VERSION 2.6)
project(CMAKE_TEST)

add_subdirectory(core)
add_subdirectory(cli)
Минимально необходимой для сборки проекта версией CMake является 2.6, проект называется CMAKE_TEST, это имя будет использоваться для обращения к корневой папке из подпроектов. Две команды add_subdirectory, аргументом которых являются имена папок, необходимы для указания подпроектов.

Библиотека core состоит из единственного класса, имеющего следующий вид:
#ifndef _CORE_HPP_
#define _CORE_HPP_

class Core
{
public:
  const char * say();
};

#endif

##include "Core.hpp"

const char * Core::say()
{
  return "hello";
}

Файл проекта библиотеки такой:
set(SRC src/core.cpp)
add_library(core ${SRC})

Первая строка — список исходников, вторая строка — команда на обработку библиотеки под названием core.

Основной класс библиотеки доступен с помощью заголовочного файла:
#ifndef CORE_HPP
#define CORE_HPP

#include "../src/core.hpp"

#endif

Код самой программы предельно прост:
#include <iostream>
#include "core.hpp"

int main(int argc, char **argv)
{
  Core core;
  std::cout << core.say() << std::endl;

  return 0;
}

Особый интерес представляет CMakeLists.txt этого подпроекта:
include_directories(${CMAKE_TEST_SOURCE_DIR}/core/include)
link_directories(${CMAKE_TEST_BINARY_DIR}/core)

set(SRC src/main.cpp)

add_executable(cli ${SRC})
target_link_libraries(cli core)
Команда include_directories определяет папку, где компилятор будет искать заголовочные файлы, подключаемые с помощью include, при этом переменная CMAKE_TEST_SOURCE_DIR указывает на корневую папку проекта. link_directories определяет, где искать библиотеки для линковки, CMAKE_TEST_BINARY_DIR - директория для сборки проекта. 4-ая строка задает список исходников, add_executable говорит, что будет собираться приложение cli.exe, target_link_libraries перечисляет библиотеки, с которым его нужно слинковать. Библиотека core по умолчанию будет статической.

Для сборки в корневой папки проекта необходимо создать директорию build и в ней отдать следующие команды:
cmake ..
msbuild CMAKE_TEST.sln /t:Rebuild /p:Configuration=Release

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

Установка Ubuntu 10.04 на LVM

В CD версиях дистрибутива отсутствует поддержка LVM, поэтому для установки необходим ряд дополнительных действий.

После загрузки с LiveCD необходимо установить соответствующий пакет:
sudo aptitude update
sudo aptitude install lvm2

Затем необходимо активировать группу томов (vg00):
sudo vgchange -a y vg00
Если диск не размечен под LVM, придется использовать утилиты vgcreate, lvcreate и т.д., поскольку установщик не поддерживает управление томами LVM.

После активации группы томов необходимо установить дистрибутив. Тома LVM будут доступны под именами вида /dev/<имя группы томов>/<имя тома> (например, /dev/vg00/lvhome). При этом для каталога /boot необходимо создать отдельный раздел, не находящийся под управлением LVM, иначе система на сможет загрузиться. Предположим, что этим разделом будет /dev/sda5.

В установленной на жесткий диск системе пакет LVM отсутствует, его необходимо поставить в chroot'е. Для этого необходимо подмонтировать соответствующие разделы (будем считать, что / находится на разделе /dev/vg00/lvroot)
sudo mkdir /mnt/target
sudo mount /dev/vg00/lvroot /mnt/target
sudo mount /dev/sda5 /mnt/target/boot
sudo mount -o bind /dev /mnt/target/dev
sudo mount -o bind /dev/pts /mnt/target/dev/pts
sudo mount -o bind /dev/shm /mnt/target/dev/shm
sudo mount -o bind /proc /mnt/target/proc
sudo mount -o bind /sys /mnt/target/sys

После установить пакет:
sudo chroot /mnt/target
sudo aptitude update
sudo aptitude install lvm2

Затем необходимо отмонтировать разделы в порядке, обратном порядку монтирования:
sudo umount /mnt/target/sys
sudo umount /mnt/target/proc
sudo umount /mnt/target/dev/shm
sudo umount /mnt/target/dev/pts
sudo umount /mnt/target/dev
sudo umount /mnt/target/boot
sudo umount /mnt/target/

После этого установленная система должна загружаться.

понедельник, 28 июня 2010 г.

Внедрение номера ревизии SVN в документ LaTeX

Допустим, мы разрабатываем с использованием LaTeX некоторый документ, исходники которого хранятся в системе контроля версий Subversion. Необходимо сделать так, чтобы по документу можно было определить, из какой ревизии он был собран. Для этого следует внедрить номер ревизии в текст документа, например, с помощью сноски:

Разведение слонопотамов%
\footnote{Собрано из ревизии \input{revision.tex}.}

Вместо команды \input{revision.tex} при трансляции документа подставляется содержимое указанного файла. Комментарий в конце первой строки убирает пробел, на который заменяется символ перевода строки. Файл revision.tex будет содержать номер ревизии, например 366. При каждой сборке документа необходимо просмотреть все рабочую копию, сравнить сохраненный номер ревизии с текущим и при наличии несоответствия обновить revision.tex и пересобрать документ.

Содержимое Makefile:

BUILD_DIR = build
MAIN_TEX = svnversion.tex
REVISION_TEX = revision.tex
TEX = $(MAIN_TEX) $(REVISION_TEX)
PDF = $(BUILD_DIR)/svnversion.pdf

Объявляются необходимые переменные. BUILD_DIR - директория для результатов сборки, MAIN_TEX - основной документ, имя которого будет передаваться транслятору LaTeX, REVISION_TEX - файл с номером ревизии, TEX - список файлов-зависимостей, PDF - файл-цель.

MKDIR = mkdir
RM = rm
SED = sed
SED_COMMAND = "s/\([0-9]\+:\)\?\([0-9]\+[A-Z]*\)/\2/"
REVISION_BAT = revision.bat
SVNVERSION = svnversion
SVNVERSION_OPTIONS = -n
LATEX = pdflatex
LATEX_OPTIONS = -output-directory=$(BUILD_DIR)

MKDIR, RM, SED, REVISION_BAT, SVNVERSION, LATEX - программы и команды, использующиеся в процессе сборки цели, SVNVERSION_OPTIONS - опции svnversion, LATEX_OPTIONS - опции интерпретатора LaTeX.

Номер версии рабочей копии будем определять с помощью утилиты svnversion, которая для Windows доступна в составе пакета CollabNet Subversion Command-Line Client. Утилита выдает номер версии в формате [ver1:]ver2[X], где ver1 - самая ранняя ревизия файла из рабочей копии, ver2 - самая поздняя, X - кратная характеристика рабочей копии (например, есть ли локальные изменения). Если рабочая копия не содержит файлов с разными номерами ревизий, то формат вывода ver[X]. В первом случае нас будет интересовать только часть строки после двоеточия, а во втором - вся строка. SED_COMMAND содержит команду потокового редактора sed, выделяющую необходимую часть строки.


WC_VERSION = $(shell $(SVNVERSION) $(SVNVERSION_OPTIONS) . | $(SED) $(SED_COMMAND))

В переменную WC_VERSION заносится необходимая информация о рабочей копии.

all: rev $(PDF)

rev:
  $(REVISION_BAT) $(WC_VERSION) $(REVISION_TEX)

$(PDF) : $(TEX)
  if not exist $(BUILD_DIR) $(MKDIR) $(BUILD_DIR)
  $(LATEX) $(LATEX_OPTIONS) $(MAIN_TEX)

Это цели и правила их сборки. all - главная цель. Цель rev обновляет файл с ревизией, цель $(PDF) запускает сборку. Вспомогательный файл revision.bat выглядит следующим образом:

@echo off

rem %1 is working copy resivion
rem %2 is name of file with revision

if not exist %2 goto update_file

set /p wc_rev_file= <%2
if not %1==%wc_rev_file% goto update_file

goto :EOF

:update_file
echo %1 > %2

Содержимое файла revision.txt сравнивается с переменной WC_VERSION, если будут обнаружены отличия, файл обновится.

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

вторник, 22 июня 2010 г.

GNU make on Windows

  • На 64-х битной Windows при использовании 32-х битных утилит GnuWin переменная окружения PROCESSOR_ARCHITECTURE в Makefile имеет значение x86.
  • Команды cmd.exe, имеющиеся в Makefile'е, выполняются успешно. Например, if not exist $(BUILD_DIR) mkdir $(BUILD_DIR) в командах цели работает так, как и ожидалось: создает папку при ее отсутствии. Такая проверка нужна из-за того, что при попытке создать существующую папку mkdir возвращает ненулевой код возврата, make принимает это за ошибку и прекращает сборку цели.

понедельник, 21 июня 2010 г.

MiKTeX 2.9 и PSCyr 0.4d

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

Скачиваем MiKTeX отсюда, выбрав вариант "Basic MiKTeX 2.8" Installer. Ставим, как описано в блоге сурового челябинского программиста, указав решим установки отсутствующих пакетов "Ask me first", что предлагается установщиком по умолчанию. Будем работать с общесистемными настройками (Пуск --> Программы --> MiKTeX 2.8 --> Maintenance (Admin)). После установки обновляем дистрибутив (Update (Admin) в меню), указав в качестве источника обновлений nearest package repository.

Следующий шаг - установка PSCyr, дистрибутив которого нужно скачать отсюда и отсюда. Оба архива распаковываем в одну папку, в которой получим папку PSCyr. Затем где-то, например, в своей домашней директории (%USERPROFILE%) создаем папку texmf, в которую скидываем содержимое папки PSCyr (файлы типа install.sh можно пропустить и скопировать только директории). После этого через меню Пуск запускаем программу Settings и переходим на вкладку Roots. Там нажимаем кнопку Add и выбираем папку texmf. Нажимаем OK. Теперь MiKTeX будет знать, где лежат пользовательские LaTeX-файлы.

Теперь нужно сделать так, чтобы MiKTex узнал о новых шрифтах. Для этого следует:

  1. Выполнить команду initexmf --edit-config-file dvips и ввести в открывшийся блокнот p +pscyr.map
  2. выполнить команду initexmf --edit-config-file pdftex и ввести в открывшийся блокнот +pscyr.map
  3. выполнить команду initexmf --edit-config-file updmap и ввести в открывшийся блокнот Map pscyr.map
  4. выполнить команду updmap
  5. выполнить команду initexmf --edit-config-file dvipdfm и ввести в открывшийся блокнот f pscyr2.map
  6. выполнить команду initexmf -u
  7. запустить из меню Пуск программу "Settings" и на вкладке General нажать кнопку Refresh FNDB
  8. выполнить команду mkfntmap
После этих действий файл с преамбулой
\documentclass[a4paper,russian]{article}
\usepackage[T2A]{fontenc}
\usepackage[cp1251]{inputenc}
\usepackage[russian]{babel}
\usepackage{pscyr}
должен собираться командой pdflatex file.tex. При первой сборке будет выведен запрос на скачивание отсутствующих пакетов.

Возможные ошибки:

  • LaTeX Error: File `pscyr.sty' not found. Не выполнен пункт 7.
  • pdfTeX error: pdflatex (file faqr6a): Font faqr6a at 420 not found. Не выполнен пункт 8.

Update: используется правка пользовательских конфигов вместо общесистемных, поскольку изменения в последних будут утеряны при обновлении.

Update 2: переносы в русском тексте в MiKTeX 2.9 работают «из коробки».

Update 3: из инструкции удалены все действия, требующие прав администратора.