Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

IdeaBlade DevForce EF released

Вышла 4-я версия ORM тулкита от IdeaBlade. Она построена на Entity Framework, небольшой обзор на сайте производителя.

StyleCop 4.3 SDK released

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.

Development pearls

Перлы на митинге:

  • способами
  • некая мешанина, которую я нахватался
  • мачурные команды
  • трэнинг
  • которая поднаторела в тест кейсах
  • что ж юзер может делать?
  • у меня есть ощущение их неполноты (риквайрментов)
  • риквайрменты бетонируются
  • риквайрменты - вещь такая, они могут плавать
  • мы напишем неполноценный компонент
  • свобода принимать, и, в общем, свобода отходить от нашего воркфлоу
  • здравый смысл должен преобладать над формальными шагами

Чувствую, нужно на каждом митинге записывать такие перлы.

CodeGear 2009 released

Недавно узнал, что Embarcadero Technologies выкупила CodeGear у Borland. А новость о выходе Delphi 2009 и C++ Builder 2009 меня вообще в шок повергла! Нам обещают:

  • Built-in support for Unicode.
  • Delphi generics and anonymous methods.
  • Commercial IDE support for C++0x and Technical Report 1 (TR1) in the C++ language.
  • Microsoft Office style ribbon controls.
  • VCL for the Web for creating AJAX and Silverlight-enabled rich intranet and line of business web applications.

StyleCop 4.3 released

Download StyleCop 4.3 here.

NHibernate 2.0.0-GA released

Download NHibernate 2.0.0-GA here.

Shared Source CLI 2.0 Internals Draft

Здесь речь идет о книге, описывающей Shared Source CLI 2.0 - исходники реализации CLR 2.0. Полезно прочитать тем, кто любит заглядывать под капот.

How to cast null to a struct in C#

Оказывается, помимо магии с Nullable типами, компилятор C# 2.0 и выше разрешает еще и такое:

IntPtr intPtr = (IntPtr)null;

... что превращается в

IntPtr intPtr = IntPtr.Zero;

Batman rides Lamborghini Murciélago

В новом фильме о Бэтмэне 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...

Wahing machine

  • Ириша: ааааааа...седня я перегреласяяяя.. подключил сашка новую стиралку.. напхала я белья
  • Ириша: вытаскиваю потом.. ооооо, думаю, бля!!круто, без сушки, а так отжало...
  • Ириша: короче, развесила грязное непостиранное бельёёёёё*смех*
  • Ириша: старую сашка уже 3 раза реанимировал.. больше 10 лет продержалася
  • Ириша: включить забыла*самоубийство*

IconWorkshop for Visual Studio 2008

Появилась Axialis IconWorkshop™ Lite для Microsoft Visual Studio® 2008. Скачать можно здесь.

Convert FLAC or APE to MP3

Пошаговая инструкция по перегону LOSSLESS форматов FLAC, APE в MP3.

Необходимые утилиты

Нужно скачать и поставить следующие пакеты:

  1. flac-1.2.1b.exe
  2. MAC_399F.exe
  3. eac-0.99pb4.exe
  4. LameXP.2008-08-12.zip

Конвертация FLAC или APE в MP3

Выполняется в два этапа:

  • Преобразование FLAC или APE в WAV с опциональным разбитием монолитного файла на отдельные треки
  • Преобразование WAV в MP3

Преобразование FLAC или APE в WAV

Следующие команды делают преобразование:

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-файла). Утилита графическая и интуитивно понятная, описывать не буду.

Преобразование WAV в MP3

LameXP делает это преотличнейшим образом и использует кодек LAME, который считают лучшим. Визуально тоже все понятно, разберетесь.

Последняя версия LameXP умеет делать mp3 сразу из flac!

Преподаватель сексологии:
- По статистике 18% женщин постоянно хотят, 23% обожают оральный секс 38% регулярно изменяют мужьям.
Студент с задней парты:
- К черту статистику, нам нужны имена, адреса, телефоны!!!

Visual Studio 2008 Service Pack 1 is out

Download Microsoft Visual Studio 2008 Service Pack 1 (ISO)

Доступны для скачивания также

  • .NET Framework 3.5 Service pack 1
  • Visual C++ 2008 SP1 Redistributable Package
  • Visual Studio 2008 Team Foundation Server SP1

После установки .NET Framework 3.5 Service pack 1 у меня появилась проблемка - после закрытия главного окна .NET приложения процесс остается висеть несколько минут! В т.ч. при отладке приложения Visual Studio 2008. Подвисает и сама студия, и SQL Server 2008 Management Studio и даже самое простое WinForms приложение.

Upd: Проблемы появились не только у меня и не только эти...

Composite MSI installations

Недавно столкнулись с проблемой - нужно было создать композитную инсталляцию. Т.е. склеить два MSI файла в один инсталляционный файл (MSI или EXE). Оказалось, задачка не из простых.

How to bundle several MSI installations into one EXE file and execute them consecutively

Первоначальной целью было создание EXE-шника, который бы запускал подряд две MSI инсталляции. Для такой цели мог бы подойти архиватор, который поддерживает SFX архивы и возможность настроить запуск приложения после завершения распаковки. Самый распостраненный из них - 7zip. Но есть одна проблема - инсталляций несколько, а задать можно лишь один выполняемый файл. Это ограничение можно обойти несколькими путями:

  1. Написать bat-файл (или использовать любой другой скриптовый язык, который поддерживает Windows), из которого будет произведена нужная последовательность запусков инстялляций.

    В случае bat-файла есть существенный недостаток - консольное окно. В случае скриптового сценария есть вероятность, что они в системе запрещены.

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

    Таким упаковщиком является NSIS. Об этом способе я расскажу подробнее, пожалуй.

NSIS MSI installations bundling

Предполагается, что 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

How to join several MSI installations into one MSI

Первое, что приходит в голову, - запихнуть один 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.

Выхода три:

  1. Использовать Install Shield, который поддерживает Custom action type 7.
  2. Написать скрипт, который откроет Installation1.msi и выполнит действия, указанные в документе How to create a nested .msi package.
  3. Использовать первый подход (EXE-шник, который бы запускал подряд две MSI инсталляции) плюс некоторые хитрости. Дальше - о них.

How to run a nested MSI installation through msiexec

Напомню, что 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] в командной строке запуска приложения).

Copyright 2007-2011 Chabster