Стеклянная луковица

Обо мне

Подписаться!Ленты RSS

Последние посты

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

Back to Basics

1 комментариев

«Вращающийся слэш» - едва ли не наиболее распространенный способ показать неопределенность прогресса в текстовом режиме. И, наверное, самый простой пример анимации. Вспоминаю полные штаны радости NN лет назад, когда на каком-то трипольском бейсике я воплотил этот неслабый прием в жизнь. И вот сейчас, в 2009 году, в эпоху 3D-ускоренных оконных элементов управления, объемных рабочих столов и градиентно-переливающихся прогресс-баров, не могу сдержать слез умиления на глазах, замечая в Microsoft-овских (графических!) инсталляторах такую вот крутяшку:

10

среда, декабря 03, 2008

MS Word 2007: Нумерация страниц по-взрослому

1 комментариев

Довольно часто возникают ситуации, когда страницы в документе Word необходимо нумеровать немного не так, как это хочет сам Word. К примеру, существует опция, позволяющая включать/отключать отображение номера на первой странице документа; но что делать, когда нужно пропустить нумерацию первых N страниц, или, что еще серьезнее, не нумеровать некоторые страницы в середине документа. Обычно для этого прибегают к использованию разрывов разделов (хотя в 75% просто прикрывают неугодный номер белым квадратиком). Другой подход – формулы автоматизации в так называемых полях (fields). В целом, они и так довольно широко применяются – например, при создании различного рода ссылок (содержание, список литературы и прочее). Чтобы убедиться в этом, достаточно нажать ALT-F9 при открытом документе, который использует какие-либо из приведенных выше примочек.

Итак, рассмотрим применение формул автоматизации Word на простейшем примере, когда нам нужно начать нумерацию страниц с 5-й включительно. Для этого входим в режим редактирования колонтитула, жмем CTRL-F9, и набираем следующее:


{ IF { PAGE } > "4" { PAGE } }

Здесь стоит обратить внимание на две вещи:
  • фигурные скобки нужно вводить не с клавиатуры, а при помощи комбинации клавиш CTRL-F9;
  • немного дико выглядит четверка в кавычках, но без них (по крайней мере, в Word 2007) мы получим вульгарщину вроде: Error! Unknown op code for conditional.
Естественно, что недостатком такого метода является то, что нужно заранее знать номера страниц, которые не требуют нумерации.

Ретушь портретов для ленивых

0 комментариев

Решил опробовать зарекламированную до дыр в American Photo программу для быстрой обработки портретных фотографий – Portrait Professional 8. Продукт позиционируется как инструмент для тех, кто не умеет (или не хочет) пользоваться Photoshop’ом. Все, что в данном случае требуется от пользователя – это умение различить на лице глаза/брови/нос, и отметить их с помощью мыши в соответствии с предоставленным примером. На основе полученных таким образом опорных точек строится модель человеческого лица, и в дальнейшем с ее использованием можно решать ряд злободневных задач: от улучшения качества кожи до облагораживания формы лица.

Пятиминутный тест (на большее не согласен, все-таки программа предназначена для экспресс-обработки). Берем фотку позапущеннее, выбираем пол модели, проставляем по образцу опорные точки:



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

Результат:



В общем, можно заключить, что программа вполне подходит для создания «восковых личиков» за несколько минут. Кто хочет большего – изучает более серьезные инструменты.

Цена игрушки на сегодня - $79.95, доступна версия для Mac.
http://www.portraitprofessional.com

понедельник, августа 11, 2008

Vista и проблема с командой arp

0 комментариев

Когда я захотел привязать IP своего шлюза к его MAC-адресу, то столкнулся с тем, что команда arp –s под Vista не работает, даже в режиме администратора, возвращая странную ошибку номер 5:

The ARP entry addition failed: 5

Решить данную проблему на форуме Microsoft предлагают с помощью утилиты netsh. Для этого из-под административной консоли выполняем:

netsh –c "interface ipv4"
set neighbors "Connection_name" "A.B.C.D" "XX-XX-XX-XX-XX-XX"

где
Connection_name – имя сетевого интерфейса;
A.B.C.D – IP-адрес шлюза;
XX-XX-XX-XX-XX-XX – MAC-адрес шлюза.

Таким образом, фактически, создается необходимая нам статическая запись ARP-таблицы.

Источник

воскресенье, мая 25, 2008

.NET + Unmanaged Fortran

0 комментариев

Так уж вышло, что у меня возникла необходимость прикрутить к дотнетовскому фронт-энду математический модуль, писанный на Фортране. Задача для меня не особо тривиальная, потому как раньше с Фортраном я не сталкивался.

В целом, задача моя состояла в следующем: взять код нескольких готовых функций на Фортране, несколько написать самому, скомпилировать получившееся в DLL, нежно обернуть библиотеку управляемым кодом, и вызвать из своей гуишки. Будем исходить из того, что получить необходимо 32-разрядное приложение.

Попытаюсь проследить весь процесс от начала и до конца :)

Писать/править код можно, в принципе, и в блокноте, а можно использовать неплохие бесплатные текстовые редакторы, подсвечивающие фортрановский синтаксис: к примеру, PSPad или Crimson Editor (первый мне понравился больше). Хотя, честно говоря, до UltraEdit’a им далековато. Он не бесплатен, и подсветка синтаксиса для Фортрана по умолчанию вместе с ним не идет – правила подсветки можно скачать с официального сайта программы. Но удобство редактора и набор возможностей позволяют закрыть глаза на эти мелочи.

Следующий шаг – выбор компилятора. Первым делом я ухватился за опенсорсовый вариант – G95. Мал, шустер и прост. Впрочем, на этом этапе у меня к компилятору было только одно требование – компилировать.

Итак, забрасываю все исходники в одну папку, решаю назвать свою библиотеку test.dll и вызываю команду:


g95 -s -shared -mrtd -o test.dll test.def *.f

Если верить FAQ’у, то здесь параметр -mrtd отвечает за соглашение передачи параметров STDCALL. В файле test.def разбираемся с декорированием имен: пусть экспортируем функцию testfcn, тогда, чтобы избавиться от знака подчеркивания при экспорте, пишем в нем:

EXPORTS testfcn=testfcn_

Итак, библиотека получена, теперь задача – обернуть ее в какой-нибудь класс на C#.

Пусть наша функция принимает параметрами xr, xi – вещественные массивы двойной точности, целые числа n и ord, и еще один вещественный массив y. Тогда метод, импортирующий функцию из нашей библиотеки, следует объявить следующим образом:

[DllImport( "test.dll", EntryPoint = "testfcn", SetLastError = true,
CharSet = CharSet.Ansi, ExactSpelling = true,
CallingConvention = CallingConvention.Stdcall )]
public static extern void testfcn( ref double xr,
ref double xi,
ref int n,
ref int ord,
ref double y );


При вызове функции, передавая массивы, даем ссылку на их первый элемент:

testfcn( ref xr[ 0 ], ref xi[ 0 ], ref n, ref o, ref y[ 0 ] );

Если работа выполняется на 64-разрядной машине, не забываем синхронизировать разрядность в настройках дотнетовского проекта.

В целом, на этом изыскания можно было бы и закончить, если бы не одно «но»: быстродействие полученного модуля меня абсолютно не устраивало. Поэтому мой взгляд упал на Intel Fortran Compiler, а именно – десятую его версию.

Он вполне неплохо проинтегрировался в Visual Studio 2005, поэтому нужда во внешних редакторах сразу же отпала. Порадовал широкий выбор опций, связанных с оптимизацией.

Вместо def-файла ему достаточно подсунуть такую директиву:

!DEC$ ATTRIBUTES DLLEXPORT, ALIAS: 'testfcn' :: testfcn

По советам Гугла пытался впихнуть туда же атрибут STDCALL, равно как и проставить соответствующую опцию в параметрах компилятора, но он упорно выдавал библиотеку с соглашением CDECL, поэтому C#-обвертку пришлось немного изменить, выставив для DLLImport’a CallingConvention = CallingConvention.Cdecl.

Еще одна проблема возникла с массивами – по умолчанию они передавались через стек, и даже при небольших объемах данных сыпались исключения переполнения стека. Лечится это добавлением ключика /heap-arrays в параметры командной строки компилятора.

Итак, выставив настройки оптимизации по своему вкусу (включая специфические для процессоров Intel), компилируюсь, запускаю программу на тест, и – получаю прирост производительности на 50% (!!!).

Единственный минус – при развертывании приложения придется тащить за собой целый ворох вспомогательных библиотек, от которых теперь, оказывается, зависит наш модуль. Их не так уж и много, они не такие уж и большие, но все равно вполне неприятно. При использовании G95 такой необходимости не было. Впрочем, в таких случаях я сразу вспоминаю псевдокомпилятор MATLAB’a со 150-мегабайтным установочником рантаймов, и на душе сразу становится легче :)