IdeaBlade DevForce EF released
Вышла 4-я версия ORM тулкита от IdeaBlade. Она построена на Entity Framework, небольшой обзор на сайте производителя.
Вышла 4-я версия ORM тулкита от IdeaBlade. Она построена на Entity Framework, небольшой обзор на сайте производителя.
The SDK documentation for StyleCop 4.3 is now available for download, here.
This documentation explains how to create and install custom StyleCop rules, how to integrate custom settings into the StyleCop settings dialog, and how to create a wrapper for hosting StyleCop in a custom build environment.
Перлы на митинге:
Чувствую, нужно на каждом митинге записывать такие перлы.
Недавно узнал, что Embarcadero Technologies выкупила CodeGear у Borland. А новость о выходе Delphi 2009 и C++ Builder 2009 меня вообще в шок повергла! Нам обещают:
Здесь речь идет о книге
, описывающей Shared Source CLI 2.0 - исходники реализации CLR 2.0. Полезно прочитать тем, кто любит заглядывать под капот.
Оказывается, помимо магии с Nullable типами, компилятор C# 2.0 и выше разрешает еще и такое:
IntPtr intPtr = (IntPtr)null;
... что превращается в
IntPtr intPtr = IntPtr.Zero;
В новом фильме о Бэтмэне The Dark Knight была разбита машинка. По виду - Lamborghini. Действительно, она. Действительно, разбили...
Will you be taking the Bat car, sir?
In the middle of the day, Alfred? Not too subtle.
Then Lamborghini then? That's much more subtle...
PS: Murciélago по-испански - летучая мышь. The Bat...
Появилась Axialis IconWorkshop™ Lite для Microsoft Visual Studio® 2008. Скачать можно здесь.
Пошаговая инструкция по перегону LOSSLESS форматов FLAC, APE в MP3.
Нужно скачать и поставить следующие пакеты:
Выполняется в два этапа:
Следующие команды делают преобразование:
for %i in (*.flac) do "C:\Program Files\FLAC\flac.exe" -d "%i" for %i in (*.ape) do "C:\Program Files\Monkey's Audio\MAC.exe" "%i" "%~ni" -d
Запускать нужно в папке с FLAC или APE файлами.
Если диск не разбит на треки (монолитный файл с идущими подряд дорожками), то выполнить разбивку можно утилитой EAC (при наличии cue-файла). Утилита графическая и интуитивно понятная, описывать не буду.
LameXP делает это преотличнейшим образом и использует кодек LAME, который считают лучшим. Визуально тоже все понятно, разберетесь.
Последняя версия LameXP умеет делать mp3 сразу из flac!
Преподаватель сексологии:
- По статистике 18% женщин постоянно хотят, 23% обожают оральный секс 38% регулярно изменяют мужьям.
Студент с задней парты:
- К черту статистику, нам нужны имена, адреса, телефоны!!!
Download Microsoft Visual Studio 2008 Service Pack 1 (ISO)
Доступны для скачивания также
После установки .NET Framework 3.5 Service pack 1 у меня появилась проблемка
- после закрытия главного окна .NET приложения процесс остается висеть несколько минут! В т.ч. при отладке приложения Visual Studio 2008. Подвисает
и сама студия, и SQL Server 2008 Management Studio и даже самое простое WinForms приложение.
Первоначальной целью было создание EXE-шника, который бы запускал подряд две MSI инсталляции. Для такой цели мог бы подойти архиватор, который поддерживает SFX архивы и возможность настроить запуск приложения после завершения распаковки. Самый распостраненный из них - 7zip. Но есть одна проблема - инсталляций несколько, а задать можно лишь один выполняемый файл. Это ограничение можно обойти несколькими путями:
В случае bat-файла есть существенный недостаток - консольное окно. В случае скриптового сценария есть вероятность, что они в системе запрещены.
Таким упаковщиком является NSIS. Об этом способе я расскажу подробнее, пожалуй.
Предполагается, что NSIS уже установлен в системе. Я просто приведу пример файла MyBundle.nsi
, который собирает нужный EXE-шник:
# Our installation name Name 'MyInstallationsBundle' # Output exe-file name !ifndef OUTPUT_FILE !error "You must define OUTPUT_FILE" !endif # Path to the first MSI file !ifndef INSTALLATION1_MSI !error "You must define INSTALLATION1_MSI" !endif # Path to the second MSI file !ifndef INSTALLATION2_MSI !error "You must define INSTALLATION2_MSI" !endif OutFile "${OUTPUT_FILE}" # Vista UAC support RequestExecutionLevel admin AutoCloseWindow true # No GUI SilentInstall silent Section "" # Set current directory to TEMP SetOutPath $TEMP # Extract INSTALLATION?_MSI to TEMP and rename it to Install?.msi File /oname=Install1.msi "${INSTALLATION1_MSI}" File /oname=Install2.msi "${INSTALLATION2_MSI}" # Execute msiexec ExecWait 'msiexec /i "$TEMP\Install1.msi" /qr' ExecWait 'msiexec /i "$TEMP\Install2.msi"' SectionEnd
Для гибкости имя выходного файла и пути к инсталляциям не зашиты в скрипт, а передаются билд машиной.
Командная строка сборки выглядит следующим образом:
nsis.exe /NOCD -DOUTPUT_FILE="MyBundle.exe" -DINSTALLATION1_MSI="MyProduct1Install.msi" -DAUTOUPGRADE_MSI="MyProduct2Install.msi" MyBundle.nsi
Первое, что приходит в голову, - запихнуть один MSI файл в другой и выполнить его запуск через Custom Action. Но, не судьба - A system-wide mutex protects the InstallExecuteSequence. The result of this is that only one installation per system can enter the execute sequence. So you cannot launch other installer packages from the execute sequence
. После этого сразу же приходит в голову засунуть этот Custom Action в InstallUISequence, но эта последовательность пропускается в случае тихой инсталляции
, без показа пользовательского интерфейса.
Погуглив на тему nested MSI installation я нашел документик How to create a nested .msi package. Оказывается, есть некий Custom action type 7 - Nested installation of a product residing in the installation package. То, что доктор прописал.
Для создания MSI файлов у нас используется WiX, который не поддерживает Custom action type 7. Вероятно это связано со следующим:
Concurrent Installations, also called Nested Installations, is a deprecated feature of the Windows Installer. Applications installed with concurrent installations can eventually fail because they are difficult for customers to service correctly. Do not use concurrent installations to install products that are intended to be released to the public. Concurrent installations can have limited applicability in controlled corporate environments when used to install applications that are not intended for public release. The concurrent installations documentation is provided for package authors that wish to use concurrent installations with applications that are not for public distribution.
Выхода три:
Напомню, что A system-wide mutex protects the InstallExecuteSequence
. Это значит, что нужно запустить Installation2.msi
после завершения Installation1.msi
. Сделать это можно многими способами, например через Asynchronous Custom Action. Основная проблема - дождаться освобождения блокировки и только после этого произвести запуск Installation2.msi
.
Получается, нужно написать программу (скрипт), которая подождет освобождения мьютекса _MSIExecute и запустит Installation2.msi
. Программа может попытаться открыть именованый мьютекс _MSIExecute и подождать его освобождения (не пробовал) либо подождать завершения процесса msiexec. В последнем случае через командную строку нужно передать PID (Process ID) msiexec. Windows Installer поддерживает свойство ClientProcessID, значение которого можно без проблем передать, как аргумент командной строки (использовать конструкцию [ClientProcessID] в командной строке запуска приложения).