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

Visual Studio debugger and referenced libraries

Допустим, в своем проекте MyProgram Вы используете некую библиотеку MyLibrary. Как обычно, подключаете MyLibrary.h, MyLibrary.lib. Все компилируется отлично, а вот при попытке запуска...

---------------------------
MyProgram.exe - Unable To Locate Component
---------------------------
This application has failed to start because MyLibrary.dll was not found. Re-installing the application may fix this problem.
---------------------------
OK
---------------------------

Если вы столкнулись с этой ошибкой - читайте дальше.

Сообщение об ошибке говорит, что MyLibrary.dll was not found. Windows ищет dll в следующих местах:

  1. The directory where the executable module for the current process is located.
  2. The current directory.
  3. The Windows system directory. The GetSystemDirectory function retrieves the path of this directory.
  4. The Windows directory. The GetWindowsDirectory function retrieves the path of this directory.
  5. The directories listed in the PATH environment variable.

Вероятно, ни в одном из вышеперечисленных источников MyLibrary.dll не была найдена. Соответственно, для решения проблемы следует положить MyLibrary.dll в одно из этих мест. Пункты 3 и 4 отшибаем сразу, а остальные случаи разберем подробнее.

  1. The directory where the executable module for the current process is located.

    Наверное, это папка bin/Debug проекта, где линкер создает MyProgram.exe. MyLibrary.dll туда можно скопировать путем создания Post Build Event. Мне эта идея не нравится.

  2. The current directory.

    Можно попросить отладчик менять стартовый каталог запускаемого приложения. Для этого есть настройка проекта Debugging->Working Directory. Мне эта идея тоже не нравится.

  3. The directories listed in the PATH environment variable.

    Можно изменить пользовательскую (или системную) переменную PATH (System Properties->Advanced->Environmental Variables->User variables for %USERNAME%), добавив туда каталог с MyLibrary.dll.

    Но мне больше всего нравится следующий трюк: Visual Studio Debugging Environment

Space between items in horizontal list

Только что придумал, как в HTML отделить элементы горизонтального списка с помощью CSS:
.hor-list-item + .hor-list-item {
   margin-left: 20px;
}
В результате, каждый элемент с классом hor-list-item будет отдален на 20 пикселей от предыдущего элемента с этим же классом. А первый элемент в этот селектор не попадает!

Oxford's Dictionary QuickTime 7 Vista problem

After resolving the problem with Longman Dictionary of Contemporary English 2005 Updated Edition I've got another headache - Oxford Advanced Learner's Dictionary 7th Edition.

The QuickTime Plug-in requires the QuickTime System extension version 5 or later.

That is what I've got. I hate QuickTime and I hate Apple.

After looking at the C:\Program Files\Oxford\OALD7\ folder's structure I realized that Oxford and Longman programs are somehow similar in libraries they use. So the solution is simple - copy plugins folder from QuickTime 7 installation to C:\Program Files\Oxford\OALD7\ with overwrite. That's all!

Longman Dictionary QuickTime 7 Vista problem

Longman Dictionary of Contemporary English 2005 Updated Edition doesn't work with QuickTime 7. However there is a Longman's patch that should solve the problem, but not in case of Windows Vista...

How did I overcome the issue? I've installed QuickTime 6 from Longman's CD and used cracked ldoce4.exe. If you need QuickTime 7 - follow the instructions below.

  1. Uninstall QuickTime 6.
  2. Intall QuickTime 7.X.
  3. Extract contents of this archive to installation folder, overwrite any files.
  4. Copy all files from QuickTime 7's plugins folder to Longman's plugins folder with overwrite.
  5. Apply Longman's patch.
  6. Run program with administrative privileges and enjoy!

After those manipulations I have sound with Vista and QuickTime 7!

Shared Source Solutions for Developers

Вот наткнулся на Майкрософтовский список свободно распостраняемых библиотек, примеров, дополнений и утилит.
Почти все ссылается на CodePlex.

Code Standarts Circus

В документе о код стандарте. Просто цирк.

Verify is always executed and is preferable to Assert unless the condition is expensive to check or the Verify is inside a hot loop. Try to verify all your assumptions about the executing behavior. Lowry suggests that every 5th line of code should be an Assert or Verify.

Best RSS Reader

Когда я только начал использовать RSS, то первым запросом в Гугл стал этот. Результаты, конечно, бестолковые, но Google Reader был замечен и оценен.

Я не люблю, когда мальчикам доверяют мужскую работу. Поэтому всегда по-возможности предпочитаю десктопные приложения. У Google Reader, правда, есть одно существенное преимущество - возможность просматривать RSS не отрываясь от браузера (кстати, плагин Wizz RSS для Мозиллы тоже неплох).

Ладно. К черту веб. Приложение, на котором я остановился - FeedDemon. Альтернатив с таким функционалом просто нет. Правда, хитрые дядьки для отображения контента используют IE Host :).

Enterprise Management

Американцы и японцы решили устроить соревнование по гребле. Обе команды долго и упорно тренировались, чтобы достичь высшей спортивной формы. И вот в один прекрасный день, они решили, что уже готовы. Японцы победили, обогнав американцев на одну милю.

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

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

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

ATL Server attributes are not supported by Orcas

Только что выяснил, что Visual Studio 2008 больше не поддерживает attributed ATL. Плохо.

"Baptizer" или "Креститель"

Иллюстрация "Креститель".

Show repentance, sinners! (c) Agnet.

Home router with WAN, LAN, WiFi and Linux

Я долго собирался купить домой маленький маршрутизатор. Хотел WiFi, поддержку IDE диска и, самое главное, - Linux, который можно настроить из консоли. На форумах узнал, что лучшим решением является серия ASUS WL-500.

Уже несколько дней, как приобрел ASUS WL-500g Premium. ASUS WL-500g Premium

В наличии:
  • 1 100Mbit WAN
  • 4 100Mbit LAN
  • WiFi типа g (54Mbit)
  • 2 USB
  • Linux
С поддержкой IDE у него не сложилось, да и смысла нет - производительность такого решения крайне низкая.

Настраивается за несколько минут через веб интерфейс, позволяет принудительно установить MAC адрес сетевой карты WAN (я был очень доволен этой функцией т.к. мой провайдер привязывается к MAC сетевой карты). Есть проброс портов, простенький файрвол, поддержка USB-принтера, DHCP-сервер. Короче говоря, его функций хватит для рядового пользователя с головой. К примеру, если вы беспокоитесь о торрентах из-за внутреннего айпи, - не надо, рутер поддерживает UPnP, поэтому uTorrent заработает на отдачу без проблем.

Я, как бывший любитель UNIX, сразу же поставил на устройство альтернативную прошивку от Олега. Самым важным для меня оказалось наличие telnet сервера для доступа к консоли устройства. Дальше - интереснее, т.к. с архитектурой MIPS я не знаком и опыта работы с подобными железяками у меня не было. NVRAM, FlashFS и много нового. Благо, на форуме настройка девайса расписана очень прилично. Пока что я поднял лишь SSH сервер, в будущем планирую сделать из WL-500g полноценную качалку (*ttp, torrent). Но для этого нужно устройство хранения данных и много часов хардфакинга.

Напоследок, несколько неприятных моментов... Я расчитывал, что моя мама ASUS P5B Deluxe с встроенной карточкой WiFi сможет нормально работать без проводов. Но, не судьба, - при скорости больше 1М/с мышка начинает дергаться. Подозреваю, что плата генерирует слишком много прерываний.

Install Oracle 11g sample schemas

Недавно потребовались демо схемы БД в Oracle. Существует способ накатить их на существующую базу, но для этого потребуется для начала скачать Oracle Database 11g Examples (formerly Companion). Далее с помощью sqlplus нужно выполнить файл YOUR_PATH\demo\schema\mksample.sql:
SQL> @YOUR_PATH\demo\schema\mksample.sql passwd_system passwd_sys pw_hr pw_oe pw_pm pw_ix pw_sh pw_bi users temp x:\path\to\log\with\trailing\slash\
SQL> @d:\Oracle\Db\11.1.0\db0\demo\schema\mksample.sql sys_passwd sys_passwd hr_passwd oe_passwd pm_passwd ix_passwd sh_passwd bi_passwd users temp c:\temp\
Параметры можно указать как в командной строке, так и интерактивно.

Перед загрузкой нужно выполнить еще некоторые действия, поскольку в некоторых файлах (sale1v3.dat, например) в роли разделителя целой и дробной частей выступает точка, а параметры указывают на американскую локаль:
CREATE TABLE sales_transactions_ext
( PROD_ID         NUMBER,
  CUST_ID    NUMBER,
  TIME_ID    DATE,
  CHANNEL_ID  NUMBER,
  PROMO_ID    NUMBER,
  QUANTITY_SOLD   NUMBER,
  AMOUNT_SOLD  NUMBER(10,2),
  UNIT_COST  NUMBER(10,2),
  UNIT_PRICE  NUMBER(10,2)
)
ORGANIZATION external 
(
  TYPE oracle_loader
  DEFAULT DIRECTORY data_file_dir
  ACCESS PARAMETERS 
  (
    RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII
    TERRITORY AMERICAN
    BADFILE log_file_dir:'ext_1v3.bad'
    LOGFILE log_file_dir:'ext_1v3.log'
    FIELDS TERMINATED BY "|" OPTIONALLY ENCLOSED BY '^' LDRTRIM 
    ( PROD_ID         ,
      CUST_ID         ,
      TIME_ID         DATE(10) "YYYY-MM-DD", 
      CHANNEL_ID      ,
      PROMO_ID        ,
      QUANTITY_SOLD   ,
      AMOUNT_SOLD     ,
      UNIT_COST       ,
      UNIT_PRICE      
    ) 
 )
 LOCATION
 ('sale1v3.dat')
)
REJECT LIMIT 100;
Можно заменить все точки на запятые или вписать територию с нужным форматом дробных чисел. Я использовал первый вариант.

Green Card Lottery

На одном из уроков английского речь зашла о лотереи Green Card. Я заинтересовался и решил заполнить форму. Поиск в гугле выдал тучу сайтов. Я нажал самую верхнюю ссылку, которая гласила "USA Green Card Lottery". Начал заполнять анкету и на каком-то шаге меня попросили заплатить 50 баксов! Я, понятное дело, послал это все к черту, но спросил у Джо насчет денег. Он сказал, что на 99% уверен в бесплатности лотереи. Только что я нашел настоящую форму заявления.

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

Please note: There have been instances of fraudulent websites posing as official U.S. Government sites. Some companies posing as the U.S. Government have sought money in order to "complete" lottery entry forms. There is no charge to download and complete the Electronic Diversity Visa Entry Form. The Department of State notifies successful Diversity Visa applicants by letter, and NOT be electronic mail. To learn more, see the Department of State Warning and the Federal Trade Commission Warning in the Related Links section of this page.

Да и адрес www.dvlottery.state.gov не асоциируется с Green Card. Вообще.

Visual Studio 2008 download

90-Day Trial Downloads
  • Visual Studio 2008 Professional Edition (Coming Soon)
  • Visual Studio Team System 2008 Team Suite
  • Visual Studio Team System 2008 Team Foundation Server
  • Visual Studio Team System 2008 Test Load Agent
In addition, you can download the free Visual Studio 2008 Express Editions.

Новость на блоге Scott Gu.

Visual Studio 2008 will be available for download THIS week

На блоге MSDN Subscriptions появилась информация, что Visual Studio будет доступна подписчикам на этой неделе уже сейчас. Ура!

Microsoft Corporation Integrates BCGControlBar Pro Technology for Future MFC Update

На Visual C++ Team Blog появился пост про грядущий апдейт всеми любимой библиотеки MFC. Вкратце, нам обещают support for the Office 2007 Ribbon Bar, Office-style menus, Visual Studio-style docking toolbars, tabbed documents and much more.

Правда есть и обратная сторона медали: это не разработка Microsoft. Да и глупо было бы на это расчитывать, ведь библиотеки, которыми пользуются создатели Microsoft Office или любого другого коммерческого решения, вероятно, никогда не выйдут за пределы компании because internal code isn't at the level required of a product, respectively. К тому же, эти продукты написаны не на MFC. Нам подсунут интегрированную в MFC библиотеку BCGControlBar Professional Edition. Это все, конечно, хорошо, но качество оставляет желать лучшего. С другой стороны, продукт уже много лет лучший на рынке и многие известные организации его используют. Надеюсь, парни поработают над кодом и сделают из него конфетку с качественной документацией.

Microsoft Line Of Code Counter

Microsoft Line Of Code Counter - порядочно полезная утилита!

Из названия понятно, что считает строчки кода. Но это не аналог Project Line Counter т.к. позволяет

  • использовать источник файлов (TFS, VSS или каталог файловой системы)
  • выполнять подсчет изменений содержимого файлов
  • считать метрики по различным методологиям

Гибко настраивается через XML файл. Изначально поддержка всех основных MS-языков. Работает как в составе Visual Studio 2005 так и отдельно.

Visual Studio 2008 release date is November 2007

Похоже, что Visual Studio 2008 релизнется в ноябре (в конце). Это стало известно на конференции TechEd в Барселоне. Жду с нетерпением!!!

Xtreme Toolkit Pro v11.20 ZWT

splash
Появился наконец после мучительных лет ожидания Xtreme Toolkit Pro v11.20 в исходниках. Щас посмотрю, что они там наделали. Прошлые версии уступали BCG по функциональности и, что более существенно, по качеству.

Using .NET Controls from WinAPI/MFC/WTL applications (Part 1)

До появления .NET графические приложения разрабатывались с использованием узкого круга инструментов и библиотек. Самыми популярными были Borland Delphi/C++ Builder (VCL), Microsoft Visual Studio (WinAPI, MFC, WTL) и QT. Инфраструктура Borland позволяла сторонним разработчикам создавать библиотеки графических елементов управления, которые хорошо интегрировались в IDE и позволяли быстро "рисовать" красивые, удобные интерфейсы. Microsoft Visual Studio на тот момент была по всем параметрам хуже - слабенький компилятор, не поддерживающий актуальные стандарты, отсутствие полноценного дизайнера форм, плохо спроектированная обьектная модель базовых библиотек (а их расширения можно перечислить на пальцах одной страусиной ноги). Выход Visual Studio 2002/2003 (официальное рождение .NET) сильно повлиял на чашу весов - все больше проектов пишут под .NET. Borland решил не отставать и включил поддержку управляемого кода в свою IDE, правда это не поменяет текущее аутсайдерское положение.

Единственный механизм, который позволяет подружить функционал различных платформ (речь о платформах разработки, а не ОС), - COM/ActiveX. Ни у кого не вызывает сомнений факт возможности интеграции компонента VCL-ActiveX в приложение MFC или наоборот. Оказывается, .NET тоже позволяет пользоваться этим механизмом на полную. Я рассмотрю лишь случай использования .NET-обьектов из неуправляемого кода (C++/CLI является управляемым!), так как обратный вариант взаимодействия прост и не нуждается в разжевывании. Существует 2 способа достижения поставленной цели:

  1. Классический - использование .NET через COM/ActiveX.
  2. Анальный - непосредственный хостинг CLR и использование COM-подобных механизмов взаимодействия.

Каждый рассмотрим детально. Для понимания того, что написано далее, необходимы твердые знания технологии COM! Мы напишем элемент управления .NET WinForms (ComplexControl), который попытаемся использовать из неуправляемого приложения следующим образом:

  1. Создать екземпляра обьекта
  2. Добавить элемент управления в форму или диалог
  3. Вызывать методы обьекта, читать и записывать его свойства
  4. Подписываться на уведомления и получать их через callback-интерфейс

Диаграмма классов следующая:

Часть первая. COM-Interop в .NET.


Любой тип MySuperDotNetType (класс MySuperDotNetClass, структура MySuperDotNetStruct, перечисление MySuperDotNetEnum, инртерфейс IMySuperDotNetInterface или делегат MySuperDotNetDelegate) при определенных условиях может быть доступен посредством COM. Эти условия также влияют на видимость полей структур, методов и свойств классов. Минимальный набор таков:
  1. Область видимости элемента - public.
  2. Наличие атрибута [ComVisible(true)] в обьявлении самого элемента либо в его родительской области (сборка в целом или тип, в котором находится обьявление).
    Также его можно использовать для сокрытия ([ComVisible(false)]) полей структуры, методов и свойств класса, а также внутренних типов.
Далее любой элемент CLR, удовлетворяющий этим требованиям, будем называть ComVisible.

Дополнительно можно использовать следующие атрибуты для более тонкой настройки взаимодействия:
  • [Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")] - CLSID CO-класса, IID интерфейса, ID библиотеки типов (в зависимости от контекста атрибута - класс, интерфейс, сборка)
  • [ProgId("MyHumanReadableTypeName")] позволяет задавать ProgID для типа MySuperDotNetType
  • [ClassInterface(ClassInterfaceType.XXX)] определяет вид экспортируемого интерфейса класса (далее - класс-интерфейс) MySuperDotNetClass. Перечисление ClassInterfaceType содержит 3 значения:
    1. AutoDispatch
      Означает, что класс будет явно поддерживать исключительно позднее связывание через свой dispinterface. Библиотека типов, которую создает утилита Tlbexp.exe (о ней - чуть позже), не содержит информацию о "начинке" этого интерфейса - свойствах и методах. Это сделано для предотвращения кеширования (когда они подставляются непосредственно в вызовы метода Invoke компилятором) клиентами значений DISPID. Является значением по умолчанию.
      Вот, как в этом случае выглядит IDL для CO-класса ComplexControl:
      [
        uuid(2D7FDCB4-6C3F-4529-A93D-10DFC72927B1),
        version(1.0),
        custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, NetControlsLibrary.ComplexControl)
      ]
      coclass ComplexControl {
          [default] interface _ComplexControl;
          interface _Object;
          interface IComponent;
          interface IDisposable;
          interface IWin32Window;
          interface IComplexView;
          [default, source] dispinterface IComplexView_Events;
      };
      
      
      Обратите внимание, что CO-класс ComplexControl явно поддерживает итерфейс _Object, который на самом деле - дуальный dispinterface:
      [
        uuid(65074F7F-63C0-304E-AF0A-D51741CB4A8D),
        hidden,
        dual,
        nonextensible,
        custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, System.Object)
      
      ]
      dispinterface _Object {
          properties:
          methods:
              [id(00000000), propget, custom(54FC8F55-38DE-4703-9C4E-250351302B1C, 1)]
              BSTR ToString();
              [id(0x60020001)]
              VARIANT_BOOL Equals([in] VARIANT obj);
              [id(0x60020002)]
              long GetHashCode();
              [id(0x60020003)]
              _Type* GetType();
      };
      
      
      Обратите внимание, что интерфейс _ComplexControl - это dispinterface, а в CO-классе обьявлен, как обычный:
      [
        uuid(6148B23F-BFFE-344F-809A-FF0915CC4C5B),
        hidden,
        dual,
        custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, NetControlsLibrary.ComplexControl)
      
      ]
      dispinterface _ComplexControl {
          properties:
          methods:
      };
      
      
      Важно:
      • Такой диспинтерфейс позволяет использовать исключительно ComVisible методы и свойства класса такие, что C#-выражение myClassInstance.SomeMemberIWantToUseFromIDispatch не вызывает ошибку компиляции. К примеру, методы интерфейсов с явной реализацией сюда не попадают. Другими словами, он еквивалентен общедоступному интерфейсу (здесь речь идет концепции, а не о ключевом слове interface) класса.
      • Возможности явно задать IID для него нет, поэтому во время разработки можно смело ожидать сюрпризов в виде E_NOINTERFACE.
    2. AutoDual
      Означает, что интерфейс класса будет дуальным дисп-интерфейсом (dual dispinterface). Анологично предыдущему варианту + возможность использовать интерфейс класса через стандартный vtbl-механизм + в библиотеку типов попадает информация об экспортируемых свойствах и методах (попадающих под вышеизложенное правило). Использовать этот механизм не рекомендуют из-за проблем с версионностью (изменение таблицы виртуальных функций после добавления или удаления методов класса).
      IDL для CO-класса ComplexControl анологичен, а вот интерфейс _ComplexControl выглядит монстрообразно:
      [
        uuid(6148B23F-BFFE-344F-809A-FF0915CC4C5B),
        hidden,
        dual,
        custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, NetControlsLibrary.ComplexControl)
      
      ]
      dispinterface _ComplexControl {
          properties:
          methods:
              [id(0x60020000), propget,
                custom(54FC8F55-38DE-4703-9C4E-250351302B1C, 1)]
              BSTR ToString();
              [id(0x60020001)]
              VARIANT_BOOL Equals([in] VARIANT obj);
              [id(0x60020002)]
              long GetHashCode();
              [id(0x60020003)]
              _Type* GetType();
              [id(0x60020004)]
              VARIANT GetLifetimeService();
              [id(0x60020005)]
              VARIANT InitializeLifetimeService();
              [id(0x60020006)]
              _ObjRef* CreateObjRef([in] _Type* requestedType);
              [id(0x60020007), propget]
              ISite* Site();
              [id(0x60020007), propputref]
              void Site([in] ISite* rhs);
              [id(0x60020009)]
              void add_Disposed([in] _EventHandler* value);
              // Last 1000000 lines omited for brevity... :)
      };
      
    3. None
      Означает, что интерфейс для класса не генерируется. Рекомендуемое значение.
  • [InterfaceType(ComInterfaceType.XXX)] - по аналогии с предыдущим, только касательно .NET-интерфейсов.
  • [ComDefaultInterface(typeof(IMySuperDotNetInterface))] указывает на интерфейс по-умолчанию CO-класса. В IDL - default.
  • [ComSourceInterfaces(typeof(IMySuperDotNetInterface_Events))] присоединяет Sink-интерфейс (добавляет в класс Connection Point). В IDL - source. О связи этих интерфейсов с классом - далее.
  • [DispId(1234)] - явно заданный DISPID для элемента дисп-интерфейса (свойства или метода).
  • Прочие атрибуты из пространства имен System.Runtime.InteropServices.

С помощью интроспекции CLR способен спроектировать обьектную модель на COM и создать на лету объект (так называемый CCW - COM Callable Wrapper), совместимый с конвенциями вызова __stdcall и по структуре памяти совпадающий с vtbl-интерфейсами. CCW выглядит, как обычный COM-объект, но транслирует все вызовы в упраыляемую среду. А утилита Tlbexp.exe (Type Library Exporter) способна создать для сборки библиотеку типов (Type Library) в виде tlb-файла, который можно просмотреть с помощью программы OleView (идет в комлекте со студией по адресу C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin\OleView.Exe).
Алгоритм отображения сборки на IDL сложен и часто просто непонятен. Более полную модель можно увидеть с помощью OleView, заглянув в категорию ".NET Category" (насколько я понимаю, эту информацию .NET-обьекты отдают непосредственно через IDispatch::GetTypeInfo). Вот несколько интересных и важных моментов, которые стоит знать:

  • Информация tlb-файла является порядочно урезанной версией реальной обьектной модели, которую строит CLR.
  • Каждый .NET COM-обьект поддерживает интерфейсы IUnknown, IDispatch, _Object, IConnectionPointContainer, IProvideClassInfo, ISupportErrorInfo, IManagedObject.
  • ComplexControl дополнительно поддерживает интерфейсы _Component, _ContainerControl, _Control, _MarshalByRefObject, _ScrollableControl, _UserControl, IComponent, IOleControl, IOleInPlaceActiveObject, IOleInPlaceObject, IOleObject, IOleWindow, IPersist, IPersistPropertyBag, IPersistStorage, IPersistStreamInit, IQuickActivate, IViewObject, IViewObject, IWin32Window. Судя по этому списку можно сделать следующие выводы.
  • Каждый .NET COM-обьект поддерживает все ComVisible интерфейсы своих предков.
  • Каждый .NET COM-обьект поддерживает все ComVisible класс-интерфейсы своих предков (с учетом атрибута ClassInterfaceType, конечно-же).
  • Каждый .NET WinForms Control COM-обьект поддерживает множество интерфейсов (если не все) OLE/ActiveX. Соответственно, может быть использован, как OLE/ActiveX.
Для того, чтобы использовать библиотеки посредством классического COM, их нужно зарегистрировать.
  1. Статической регистрацией занимается утилита RegAsm.exe (C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe). Она выполняет инструментирование сборки (аналогичным Tlbexp.exe образом) и вносит записи в системный реестр. Запуск RegAsm.exe можно возложить на Visual Studio - в настройках проекта в разделе Build поставить галочку [Register for COM interop]. Запись в реестре для CO-класса ComplexControl выглядит следующим образом:
    [HKEY_CLASSES_ROOT\CLSID\{2D7FDCB4-6C3F-4529-A93D-10DFC72927B1}]
    @="NetControlsLibrary.ComplexControl"
    [HKEY_CLASSES_ROOT\CLSID\{2D7FDCB4-6C3F-4529-A93D-10DFC72927B1}\Implemented Categories]
    [HKEY_CLASSES_ROOT\CLSID\{2D7FDCB4-6C3F-4529-A93D-10DFC72927B1}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
    [HKEY_CLASSES_ROOT\CLSID\{2D7FDCB4-6C3F-4529-A93D-10DFC72927B1}\InprocServer32]
    @="mscoree.dll"
    "Assembly"="NetControlsLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
    "Class"="NetControlsLibrary.ComplexControl"
    "CodeBase"="file:///D:/Development/Projects/NETComInterop/Debug/NetControlsLibrary.dll"
    "RuntimeVersion"="v2.0.50727"
    "ThreadingModel"="Both"
    [HKEY_CLASSES_ROOT\CLSID\{2D7FDCB4-6C3F-4529-A93D-10DFC72927B1}\InprocServer32\1.0.0.0]
    "Assembly"="NetControlsLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
    "Class"="NetControlsLibrary.ComplexControl"
    "CodeBase"="file:///D:/Development/Projects/NETComInterop/Debug/NetControlsLibrary.dll"
    "RuntimeVersion"="v2.0.50727"
    [HKEY_CLASSES_ROOT\CLSID\{2D7FDCB4-6C3F-4529-A93D-10DFC72927B1}\ProgId]
    @="NetControlsLibrary.ComplexControl"

    Здесь {2D7FDCB4-6C3F-4529-A93D-10DFC72927B1} - CLSID моего класса ComplexControl, {62C8FE65-4EBB-45e7-B440-6E39B2CDBF29} в ключе "Implemented Categories" - GUID категории компонента (".NET Category" в нашем случае), 1.0.0.0 в ключе "InprocServer32" - версия класса (поддержка нескольких версий компонента). Стоит отметить, что InprocServer32 указывает на mscoree.dll! Именно там находится точка входа в фабрику классов - функция DllGetClassObject. Ну, а остальные записи ниже InprocServer32 служат для нахождения нужной сборки с типом (читает их, конечно-же, не подсистема COM, а CLR).
  2. Динамически зарегистрировать поможет класс TypeLibConverter.
  3. Утилита regsvcs.exe тоже годится, но это другой конек, связанный с COM+.
Для добавдения в CO-класс точки подключения (эта часть была самая сложная в инвестигации!) необходимо выполнить следующие действия:
  1. Создать интерфейс IMySuperDotNetClass_Events
  2. Настроить COM-аспекты - [ComVisible(true)], [Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")] и [InterfaceType(ComInterfaceType.XXX)] (рекомендуется использовать InterfaceIsIDispatch, обьяснение дальше).
  3. Наполнить интерфейс обьявлениями методов, совместимыми с типами-делегатами поддерживаемых событий.
  4. Добавить в класс MySuperDotNetClass определения событий с именами, которые соответствуют именам функций интерфейса IMySuperDotNetClass_Events.
Лучше это показать на примере:
Интерфейс (открытый) и делегат (область видимости не имеет значения).
internal delegate void PropertyChangedEventHandler(Object src, String propertyName);

[ComVisible(true)]
[Guid("FD9AEC7A-3688-4394-B4D0-636E4A7FE3B9")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] // if InterfaceIsDual then SinkObj must also be dual!
public interface IComplexView_Events
{
   [DispId(0x01)]
   void PropertyChanged(Object src, String propertyName);
}
Тело класса ComplexControl.
#region IComplexView_Events Mappings

private PropertyChangedEventHandler _propertyChanged;
internal event PropertyChangedEventHandler PropertyChanged {
   add {
      _propertyChanged += value;
      Trace.WriteLine("PropertyChanged.add(...)");
   }
   remove {
      _propertyChanged -= value;
      Trace.WriteLine("PropertyChanged.remove(...)");
   }
}

#endregion

Oracle Database 11g Release 1 (11.1.0.6.0) for Windows has released

Свершилось! Теперь можно забыть про Линупс на виртуальной машине! Oracle Database 11g Release 1 (11.1.0.6.0) for Microsoft Windows (32-bit)

C# freaks on generics

Спокойно компилируется...
partial class partial<[partial: where] where> where where : partial<where> {}
Рекурсивные шаблоны...
namespace N
{
    public abstract class A<B>
    {
        public abstract void Foo(B x);

        public abstract class C<D> : A<C<D>>
        {
            public abstract class T<E> : C<T<E>>
            {
                public new class C<F> : T<C<F>>
                {
                    public override void Foo(ТИП x) // Подставить тип сюда
                    {}
                }
            }
        }
    }
}
Я бы вместо дурацких вопросов давал кандидатам эту задачу на полчаса\час в качестве стресс-теста на логическое мышление.

Lingvo, чисто поржать

motherfucker
сущ.; = mother-fucker; = muthafucka; = mutherfukka
1) неценз. ублюдок (ещё более грубый вариант от fucker)
You think I'm joking, motherfucker?! — Ты думаешь, я шучу, ублюдок?!
Look at that sexy motherfucker shaking her ass. — Смотри, как эта смазливая сучка виляет задницей.
What gives, motherfucker? — Ну как дела, хрен моржовый?
2) что-то очень большое, сильное, опасное
to fly a 250-passenger motherfucker — управлять 250-местной бандурой
A this is how Trout describes that A-bomb - "a purple motherfucker as big as a boiler of middle-size heat plant". — А вот как Траут описывает ту атомную бомбу - "багровая дура размером с паровой котёл бойлерной средних размеров". (К.Воннегут, "Время назад")
What do you think is the most lethal drink? - A Purple Motherfucker. — Какой напиток самый убойный? -Лиловая Хреновина.
motherfucker
1) Leave me alone, motherfucker — Оставь меня, блин, в покое, придурок
Where are you, where, motherfucker? — Куда ты делся, твою мать?
Rise, motherfucker, you're gonna die — Вставай, сволочь, тебе пришел конец
Just a minute, motherfucker — Одну минуту, гондон
He's the dumbest motherfucker I've ever seen — Такого тупорылого ублюдка, в натуре, еще поискать надо
You'll regret every word you said, motherfucker — Ты, пидор, еще пожалеешь о том, что сказал
2) What gives, motherfucker? — Ну как дела, старик?

I hate all this code style formatting (braces layout)

Ненавижу придерживаться глупых правил.

Одно из важнейших качеств "хорошего" кода - "хорошее" форматирование. Компилятор способен прочесть любую корректную программу, не важно какой кашей (точнее, кем) она написана. С людьми дело обстоит иначе. Способность быстро понимать чужой код особенно важна, когда над проэктом работают десятки и более разработчиков, находящихся териториально далеко друг от друга. Хорошее Форматирование позволяет единообразно и точно показывать логическую структуру кода, визуально разбивать код на удобные для понимания человеком абстракции.

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

Цели хорошего форматирования

  • Точно представлять логическую структуру кода
  • Единообразно показывать логическую структуру кода
  • Улучшать читабельность
  • Упрощать модификацию кода

Основное влияние на стиль форматирования имеет семантика языка программирования. Например, в языке Python с форматированием особо не повоюешь - язык его строго определяет сам. Блоки кода и подчинение блоков определяются исключительно отступами, т.е. форматированием:

if (x == 0):
SomeOperator
SomeOperator
SomeOperator

Здесь if (x == 0): является единственной частью управляющей структуры, а подчиненные операторы должны иметь положительный от ее начала отступ.

Управляющие структуры могут иметь вид:

  1. Явных блоков (Visual Basic, ADA, PL/SQL, ...)

    if (x == 0) [then]<--then может быть опущен
    SomeOperator
    SomeOperator
    SomeOperator
    end if;

  2. Эмуляций явных блоков (C++, Java, C#, ...)

    if (x == 0) {<-- начало блока является частью управляющей конструкции
    SomeOperator
    SomeOperator
    SomeOperator
    }<-- конец блока говорит об окончании управляющей конструкции и является эквивалентом end if;

  3. Управляющая конструкция, за которой следует блок с границами ( begin - end или { - })

    if (x == 0)
    {<-- начало блока не является частью управляющей конструкции
    SomeOperator
    SomeOperator
    SomeOperator
    }<-- конец блока

  4. Отформатированных блоков, когда пробельный символ является конструкцией языка (Python)

    if (x == 0):
    SomeOperator
    SomeOperator
    SomeOperator

Из всех вариантов хуже всего смотрится вариант 3 (а в HTML - намного хуже :), причем некоторые энтузиасты умудряются делать его еще уродливей:

if (x == 0)
{<-- начало блока не является частью управляющей конструкции и визуально ей не подчиняется
SomeOperator<-- Этот блок на самом деле не подчиняется {, хотя визуально выглядит иначе
SomeOperator
SomeOperator
}<-- конец блока на уровне управляющей конструкции

Или:

if (x == 0)
{<-- начало блока не является частью управляющей конструкции
SomeOperator
SomeOperator
SomeOperator<-- Этот блок на самом деле не подчиняется {, хотя визуально выглядит иначе
}<-- конец блока

Поубивал бы.

Продолжение следует...

Designing .NET Class Libraries

Только что посмотрел must see видео
MSR Technical Education Series: Designing .NET Class Libraries by Krzysztof Cwalina
Рассматриваются 4 концепции:
  1. Simple
  2. Integrated
  3. Consistent
  4. Evolvable
BTW, Krzysztof Cwalina является автором этой книги, и презентация, естественно, имеет непосредственное отношение к ее содержанию.

Antipattern "Public Morozov"

Из ЖЖ:

Сейчас на работе придумал новый антипаттерн "Паблик Морозов". Класс-потомок, созданный в соответствии с этим антипаттерном, выдает по запросу все данные класса-предка, независимо от степени их сокрытия.

Баян, конечно, но не перестаю сползать под стол.

Еще раз эту строку кто-то закоментирует - руки оборву

вот нашёл в коде: )))
public DBEngine(String p_connectionString)
{
   _connectionString = p_connectionString;
   _dbConnection = new SqlConnection(p_connectionString);
   _dbConnection.Open();
   //Рябченко : Еще раз эту строку кто-то закоментирует - руки оборву
   CheckDatabaseVersion();
}

Releasing the Source Code for the .NET Framework Libraries

Товарищ, работающий менеджером в Microsoft, сообщил, что Visual Studio 2008 зарелизится где-то в декабре 2007-го года (что, в принципе, отражает догадки о дате релиза). А, вместе с релизом, мы получим возможность посмотреть исходники .NET Base Class Libraries (System, System.IO, System.Collections, System.Configuration, System.Threading, System.Net, System.Security, System.Runtime, System.Text, ...), ASP.NET (System.Web), Windows Forms (System.Windows.Forms), ADO.NET (System.Data), XML (System.Xml), WPF (System.Windows) и даже с комментариями! Спустя месяц планируют добавить WCF, Workflow и LINQ.

Исходники можно будет скачать, как отдельный пакет, или же позволить Visual Studio 2008 скачивать их (вместе с файлами отладки) по мере надобности.

Должен заметить, что я, как и любой другой любопытный разработчик, потратил много времени как на декомпиляцию фреймворковских библиотек, так и на изучение Rotor Shared Source. Часто, без этого тяжело понять, как работают некоторые классы. Скажем, хорошие знания Remoting появились у меня только после просмотра исходников.

Единственное, чего бы не хотелось, - так это good old MFC development style, когда разработчик проводит 90% своего времени в исходных кодах MFC, тщетно пытаясь понять в чем проблема и как это работает.

Новая должность в софтверных компаниях

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

High-Resolution Timer = Time Stamp Counter = RDTSC

Некоторые приложения очень требовательны к точности измерения времени. Им нужен таймер, который сможет отразить дельту времени даже двух последовательных операторов. Intel в своей архитектуре IA-32 реализовала подобный таймер и добавило в instruction set соответствующую инструкцию RDTSC для его использования. Эта инструкция сохраняет число тиков (64-битное значение) от старта процессора в регистрах EDX:EAX.

Реализация на C#.
  1. Прототип функции, которая возвращает текущее значение RDTSC.
    Прототип функции, которая возвращает текущее значение RDTSC.
  2. x86 байт код, который выполняет инструкцию RDTSC и соответствует конвенции вызова делегата с типом RdtscCallback.
    x86 байт код, который выполняет инструкцию RDTSC и соответствует конвенции вызова делегата с типом RdtscCallback.
  3. Создание екземпляра делегата с типом RdtscCallback, который выполняет эти инструкции.
    Создание екземпляра делегата с типом RdtscCallback, который выполняет эти инструкции.

RDTSC не лишен проблем, описанных в этом документе.

Магия с Nullable-типами в .NET

Nullable<T> - классное нововведение (или, с учетом времени, - старовведение) CLR 2.0 как минимум в контексте работы с базой данных. Не хочу приводить список проблем, которые решают Nullable-типы, речь не о них. Хочу рассказать, как это работает.

Пример 1.
В результате на консоли - False. Стоп! А должен быть NullReferenceException, ведь i равна null! А равна ли? Ответ на этот вопрос в сгенерированном компилятором IL-коде, который выглядит приблизительно вот так:
Компилятор нас обманул, оператор i = null; превращается в i = new Nullable<Int32>();

Пример 2.
В результате на консоли - Int32. Стоп! А должен быть Nullable`Int32, ведь i имеет тип Nullable<Int32>! А имеет ли?... Условный IL-код:
Да, i имеет тип Nullable<Int32>. Теперь интересно, почему у o тип Int32? Ответ - в исходниках CLR (Rotor Shared Source), файл object.cpp, функции Nullable::Box и Nullable::UnBox
Приводить и разбирать тексты функций не хочу, просто обратите внимание на комментарии. Вывод: боксирование типа Nullable<T> выполняется CLR специальным образом - box(Value), если значение есть, и box(null), если значения нет. В результате тип боксированного значения - T, если значение было задано, а если не было - то выяснить его динамический тип невозможно.

Гвоздь в гроб Windows

20 минут назад мне подкинули в аське ссылочку на статью "Гвоздь в гроб Windows". Мне, как человеку, использовавшему UNIX-подобные ОС системы больше 6-ти лет, стало интересно - что нового может быть брошено в эту глупую войну. Вкратце основные пункты статьи:

  • будущее за unix-системами, и уже ясно, что это будет Linux

    А почему Linux? Почему не FreeBSD или OpenBSD или Solaris? Ответ на этот вопрос полностью содержится в статье, только надо поменять Windows на Linux.

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

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

  • Аналоги есть, и по своим характеристикам значительно превосходят Windows.

    По каким характеристикам и в чем превосходят? По количеству статей, которые я должен прочитать, чтобы настроить хоть что-то, что не было настроено при установке? Или по количеству команд, которые я вынужден набрать?

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

    Какие закрытые патентами протоколы? Проблема UNIX в том, что его ПО не соответствует потребностям пользователей. И, что самое плохое, - никто эти потребности выяснять не хочет. А Microsoft тем временем тратит кучу денег на создание удобных интерфейсов и повышение юзабилити.

  • они не заработали этих денег и близко.

    Кто "они"? Билл Гейтс? Свои деньги он заработал, уж поверь. А вот разработчики, написавшие Windows, действительно, своих денег не заработали (точнее, не получили), т.к. зарплата разработчика в MS колеблется от 75 до 150 тысяч в год (ровно, как и зарплата Билл Гейтса не составляет миллиарды). Остальные деньги сотрудники получают с опционов (акций) своей же компании. Чем больше человечек сделал для развития корпорации - тем больше он сможет купить опционов.

    Если кто-то говорит вам, что пользоваться нелицензионным Windows - воровство, то смело отвечайте, что эта корпорация обокрала всех нас, перетянув удавкой горло мировому рынку ПО и продавая задыхающимся пользователям свой пыльный воздух по цене золота.

    Если рынок ПО (в частности, бесплатного ПО) не способен составить конкуренцию платным продуктам, то Microsoft в это не виновата. Ровно, как и любая другая организация не виновата, что ее продукт - лучший. Никто никого не заставляет покупать Windows. Сиди на своем Linux-е, чем ты не доволен? Firefox используют не потому, что он бесплатный, а потому, что он лучше. И, стань он платный, его будут продолжать использовать. Конкуренция рождается, когда продукты взаимозаменяемы. О Windows и Linux этого сказать нельзя.

  • пользуйтесь такой операционной системой, которую дают бесплатно, поскольку деньги создатели зарабатывают не на вас, а на техподдержке

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

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

    Никакой программист не получает миллиарды, откуда эта глупость появилась в твоей голове?

  • Стоимость рекламы товара не входит в его рыночную цену.

    Ошибаешься. Ты платишь за товар, за его рекламу и сам же ее потом смотришь.

  • Мировой продукт должен быть бесплатен, т.к. стоимость разработки полностью окупается рекламой фирмы-производителя при использовании продукта.

    Леонид Каганов, а ты сыт от того, что отрекламирован? Или ты все-же ждешь, что твоя реклама когда-то превратится в заказ с кругленькой суммой? Или, может, ты выполнишь заказ бесплатно в пользу еще большей рекламы? До тех пор, пока не умрешь с голоду. Microsoft уже давно прошла этот этап и сейчас рубит заслуженное бабло (при этом нахаляву продолжая себя рекламировать).

  • Этот сыр - бесплатный.

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

  • неграмотно спланированная, полная ошибок, лишенная системы безопасности с грамотным разграничением прав пользователей, она служит прекрасным компостом, в котором роятся черви и вирусы самых разных мастей.

    Автор, ты абсолютно некомпетентен, чтобы говорить подобное. Windows NT еще с версии 3.51 4.51 сертифицирована по уровню безопасности C2. И было это в 1995 году, а с тех пор много чего изменилось в ядре в лучшую сторону.

  • Интерфейс пользователя намного красивее и удобнее, например, у Макинтоша, откуда MS постоянно тырит решения.

    MS тырит, и правильно делает. А самый красивый и удобный интерфейс у удобной палки, которой можно колотить по пню.

  • быстрее всего исправляются ошибки в системах с открытым кодом.

    Беспочвенное заявление. Их там быстрее всего находят. И чаще находят. И находят порядком больше, чем в системах с закрытым исходным кодом. А Windows Update позволяет тебе быть уверенным, что дырки будут закрыты быстро и автоматически, без ежедневного чтения BugTraq. Да и лучше не исправлять ошибки, а выпускать софт без ошибок, но, оупенсорсу до этого далеко.

  • Да, Windows самая распространенная сегодня. А почему? Ответ прост: как мы уже говорили, это потому, что под Windows работают все программы, игры и любое оборудование. А почему они работают под Windows? Потому что это самая удобная среда для запуска программ и устройств? Напротив: большинство системных протоколов закрыто и нет документации. Программы и драйвера создают под Windows именно потому, что это самая распространенная система. Замкнутый круг.

    Они работают под Windows потому, что ОС представляет собой адекватную среду для разработки таких программ (как и UNIX для программ другого типа - сетевых сервисов). Потому, что аналога DirectX с аппаратной поддержкой видеокартами в UNIX-е нет и не будет. Потому, что графический сервер X11 - тормозящее устарелое убожество. Потому, что нет адекватных инструментальных средств для разработки.

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

    Бред. Производители софта сначала выбирают ОС (и инструментарий), а потом уже создают продукт. А создатели оборудования продают свои спецификации! И правильно делают.

  • пришлось бы бегать к ним в соседний квартал чинить слетевший Windows - страшную штуку в руках деятельного и любопытного новичка.

    Заменить Windows на Linux.

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

    У каждого свои цели при использовании чего-либо. Кто-то любит наблюдать появление строчек в файле /var/log/xxx.log, жуя при этом позавчерашний бутер, найденный в системном блоке. Кто-то вынужден наблюдать за изменением квот на бирже дабы сходить в дорогой ресторан, и ему совершенно наплевать на то, какая идеология у ОС.

  • Все больше программ появляется под Linux. Фактически нет только хорошего Фотошопа, хотя Gimp уже близок.

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

Если задуматься, то речь вообще не о Microsoft или программном обеспечении, а о стоимости интеллектуальной собственности. Такие же рассуждения можно провести в области музыки, литературы, кино.

В целом, с автором я согласен в том, что Microsoft гребет слишком много денег с пальца. В этом плане мне нравится лицензионная политика Oracle: используешь для зарабатывания денег - плати! Поэтому считаю, что для некоммерческого использования ОС должна быть бесплатной (или условно-бесплатной за 10 баксов). А послевкусие статьи у меня такое: оплачиваться должно создание корпоративного софта.

Мне кажется, что текущее положение вещей в области интеллектуальной собственности вполне рационально и адекватно - она (собственность) бесценна. Так что платим, товарищи. The best software money can buy.

This disc is not rewritable and therefore cannot be erased.

Вот такое сообщение выдавал мне Nero и сама Windows Vista. Какой диск не засуну - писать не получается (This disc is not rewritable and therefore cannot be erased)! Сначала подумал, что опять что-то с системой! Оказалось - Daemon Tools...

Turn off 'Hide CD-R' option

Настройки RDP в Vista

Я пользуюсь домашним компьютером с работы, поэтому разрешаю Remote Desktop. В Vista есть 3 возможные настройки для RDP-доступа:

  1. Don't allow connections to this computer
  2. Allow connections from computers running any version of Remote Desktop (less secure)
  3. Allow connections only from computers running Remote Desktop with Network Level Authentication (more secure)

Естественно, я, как приверженец строжайшей безопасности, выбрал вариант 3, о чем сейчас жалею:

The remote computer requires Network Level Authentication, which your computer does not support. For assistance, contact your system administrator or technical support.

Все предельно просто: The Windows XP SP2 RDP 6.0 client software does not currently support Network Level Authentication. Подходит (пока что, надеюсь) только RDP клиент, встроенный в Windows Vista.

Так что лучше выбирать вариант 3 и не париться.

Для маньяков здесь описаны интересные аспекты настройки RDP.

Мой новый рекорд по количеству установок Windows Vista подряд

Я убедился, что был прав. До первого сервис пака Висту ставить не следует.

Недавно мне потребовался IIS и я попытался его поставить. Не получилось, как не получилось поставить даже банальный Telnet Client - в Event Log сыпались ошибки, связанные с Windows Servicing (Windows Servicing failed to complete the process of setting package XXX into YYY(YYY) state). Кроме того, при попытке перемещения\копирования файлов с рабочего стола диалог копирования подвисал, а файл блокировался даже на чтение до перезагрузки. Это то, что меня уж сильно достало (было еще несколько неприятных вещей).

Я записал установочный образ июльской Vista Ultimate от noPE, поставил, при первом старте выполнил привычные действия - изменил рабочую группу и поменял метки\точки монтирования дисковых разделов. При попытке добавить\удалить компоненты системы - та же ошибка Windows Servicing!

Сначала согрешил на какой-то апдейт, встроенный в июльскую сборку. Записал июньскую от ETH0 (с нее я ставил в прошлый раз и помню, что удаление\добавление компонентов работало). Поставил, попытался изменить компоненты - успешно! Выполнил привычные действия, после которых начала вылазить горе-ошибка...

Итак, проблема может быть следствием

  1. изменения рабочей группы по умолчанию;
  2. переразметки букв разделов.

Переставил, сменил рабочую группу, проверил - работает. Выходит, проблема в переразметке букв разделов.

Диск был разбит на два первичных раздела и один логический. На primary1 стоит Windows XP, на primary2 - ставлю Windows Vista, logical - хранилище. primary2 получал точку C:\, а primary1 - D:\, причем букву primary1 Disk Management сменить не разрешал (Windows cannot modify the drive letter of your volume. This may happen if your volume is a system or boot volume, or has page files). Переразметку я выполнял с помощью Acronis Disk Director 10, который сумел сменить букву так, как мне надо. В результате - проблемы с Windows Servicing. Бред, конечно, но, что поделаешь.

В результате: 5 переустановок, массивные сдвиги\переносы разделов (раздел с XP переехал на отдельный винт, раздел Vista стал единственным первичным). 7 часов угробил.

Назойливые дефекты Visual Studio 2005/2008

Мучительно неприятно, что некоторые вещи не исправляются даже с выходом новой версии. Не говоря уже о сервис паках! Предыдущий пост, новый дефект:
Окна задочены наверху, включен Auto Hide - списки "Modules" и "Processes" пустые!
Убираю Auto Hide - строчки появляются в обоих окошках.
Ставлю Auto Hide - список "Processes" опять пустой, "Modules" заполнен.
Картинка снята с Visual Studio 2008 B2. В 2005SP1 ситуация аналогичная. А в 2005 без SP1, кажется, все нормально.

Скучно

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

Visual Studio native debugging

Visual Studio можно использовать в качестве отладчика нативного кода (по большей части интересует возможность прерывания на функциях WinApi). Для этого нужно установить некоторые параметры отладчика:

http://msdl.microsoft.com/download/symbols
Галочка "Search ..." установлена для того, чтобы символы грузились по требованию, а не каждый раз при старте приложения или аттаче к уже запущенному.

Собственно, вот и просьба загрузить символы:

Самое важное - как установить точку останова на функции. Формат функции такой: {,,some.dll}MangledFunctionName. Пример: {,,user32.dll}_MessageBoxW@16

TypeMock.NET

По словам моего сотрудника, человека с приличным опытом, TypeMock.NET - лучшее решение для генерации (точнее сказать - просто решение, но об этом позже) Mock-объектов и использования их в юнит тестах.

Традиционные Mock фреймворки имеют определенные требования к объектной модели, обусловленные принципами функционирования - сабклассинг и динамическая генерация кода. Эти требования нередко заставляют проектировать с учетом необходимости юнит тестирования посредством Mock-объектов, что негативно сказывается на конечном результате и удобстве использования. Некоторые вещи вообще с трудом подлежат юнит тестированию, например, классы, использующие внешние статические методы. Решается либо условной компиляцией (далеко не уйдешь) либо перепрограммированием механизма взаимодействия объектов (порядочное усложнение существующего кода).

Итак, почему же "#1 Mocking Framework"? Лучше всего сразу посмотреть на возможности TypeMock.NET, который доступен в 3-х редакциях - Community (бЭсплатно), Professional и Enterprise (соответсвенно, за денюжку).

Если пройтись по списку фич, можно заметить такие интересные и, на первый взгляд, невозможные вещи, как "mock all types, including sealed and internal classes", "fake any method", "mock third-party types, including types in the .NET framework". Нам заявляют, что TypeMock способен подделать поведение любого объекта, в т.ч. его статических методов!

Банальнейший пример демонстрирует, что sealed класс SqlConnection начинает вести себя так, как ему приказано! Шокирующих примеров хватает.

Досих пор меня мучил главный вопрос - как это работает?! Парочка часов скитаний по сети увенчалась успехом! Итак айнц, цвай, драй. И все стало на свои места.

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

Как итог могу написать, что TypeMock решает главную проблему, связанную с юнит тестированием, - проблему создания изолированно-тестируемых классов. С TypeMock об этом вообще можно смело забыть.

Ultimate Toolbox, Ultimate Grid и Ultimate TCP/IP стали бесплатными!

Welcome!

We are very happy to announce that we have made the decision to offer our commercial lineup of MFC libraries, including Ultimate Toolbox, Ultimate Grid, and Ultimate TCP/IP to the CodeProject.com community free of charge.

These are the full and complete libraries including source code, documentation, samples and examples.

The Ultimate Toolbox and line of related MFC libraries products have been powering professional MFC applications for more than 10 years. We realize that there is a very large number of users who are still coding new applications in Visual C++ and MFC and who are looking for effective and proven libraries to enhance their applications, as well as those with legacy.

Ultimate Toolbox, Ultimate Grid and Ultimate TCP/IP come with full source code, and are compatible with Microsoft Visual Studio versions 6.0 through 2005.

By releasing these long standing MFC libraries to the CodeProject.com community we hope that the libraries will continue to grow, evolve and provide a library of useful controls to the development community through the auspices of The Code Project and its members.

Обновления библиотеки Morgan's library - Oracle 11g наступает

Крайне приятно было получить письмо с благодарностями от Daniel A. Morgan, редактора библиотеки Morgan's library, за помощь в ее промоутинге. Пожалуй, это лучший мини-справочник по Oracle, который я встречал в сети. А теперь он непрерывно обновляется вкусностями 11g, которая не так давно стала доступна для скачивания (Linux версия). Наблюдая за помойным развитием сети хочется пожелать нам побольше таких замечательных ресурсов! Вот обновленная на дату публикации страничка:
Best Practice Built-in Functions Built-in Packages New in 11g
Topic Version Last Modified Comment
Active Session History 10gR2 08-Aug-2006 -
Add Binding Clause 10gR2 01-Nov-2006 -
ADDM Demo 10gR2 09-Aug-2006 -
Advanced Queuing Demo 10gR2 16-Jan-2005 -
Analytic Functions 10gR2 15-Jul-2007 -
Analyze 11gR1 09-Jul-2007 -
Anonymous Block 11gR1 07-Jul-2007 -
Anydata Data Type 11gR1 28-Jul-2007
Application Server 10.1.2.0.2 07-Feb-2007 -
Application Server 10.1.3.0.0 07-Feb-2007 -
Archive Logs 10gR2 03-Mar-2007 -
Array Processing 10gR2 03-Mar-2007 -
Arrays: Index by BINARY_INTEGER 11gR1 07-Jul-2007 -
Arrays: Index by VARCHAR2 11gR1 07-Jul-2007 -
AS OF Queries 10gR2 27-Apr-2007 -
ASH 10gR2 03-Mar-2007 -
Associative Arrays 11gR1 07-Jul-2007 -
Auditing 11gR1 06-Aug-2007
AUTHID 10gR2 12-Jan-2006 -
Automatic Workload Repository 11gR1 17-Aug-2007
Automatic Workload Repository Report 11gR1 17-Aug-2007
Autonomous Transactions 11gR1 07-Jul-2007 -
Autotrace 11gR1 08-Jul-2007 -
AWR Report 11gR1 17-Aug-2007 -
Backup & Recovery 10gR2 07-Mar-2006 -
B*Tree Indexes 10gR2 23-Jun-2006 -
Bidirectional Cursor 11gR1 06-Aug-2007
Bind Variables 11gR1 20-Jul-2007 -
Bitmap Indexes 10gR2 23-Jun-2006 -
Bitmap Join Indexes 10gR2 23-Jun-2006 -
Block Change Tracking 11gR1 20-Jul-2007
Block Dump 10gR2 12-Oct-2005 -
Built-in Packages 10gR2 25-May-2007 -
Buffer Pool 11gR1 15-Jul-2007 -
Bulk Binding / Bulk Collection 10gR2 03-Mar-2007 -
CASE Function 11gR1 15-Aug-2007 -
Cast Function 11gR1 21-Jul-2007 -
Chained Rows 11gR1 30-Jul-2007
Change Data Capture - Sync 10gR2 07-Jun-2006 -
Change Data Capture - HotLog 10gR2 07-Jun-2006 -
Change Data Capture - AutoLog 10gR2 - -
Character Sets 11gR1 30-Jul-2007 -
Character Set Functions 11gR1 21-Jul-2007 -
Check Constraint 10gR2 09-May-2007 -
Clustering Factor 11gR1 12-Aug-2007 -
Clusters 11gR1 20-Jul-2007
Codd's Rules - 07-Jul-2007 -
Collections 11gR1 21-Jul-2007
Collection Functions 10gR2 22-Nov-2005 -
Commit 11gR1 07-Jul-2007 -
Compilation: Interpreted and Native 11gR1 09-Aug-2007
Compound Triggers 11gR1 12-Aug-2007
Compressed Indexes 10gR2 23-Jun-2006 -
Compressed Tables 11gR1 11-Aug-2007
Conditional Compilation 10gR2 11-Sep-2005 -
Conditions 11gR1 08-Jul-2007 -
Connect By 11gR1 08-Jul-2007 -
Constraints 10gR2 06-May-2007 -
Consumer Groups 10gR2 03-Jan-2006 -
Contexts 10gR2 18-Nov-2005 -
Continue Statement 11gR1 09-Aug-2007
Control Files 10gR2 10-Oct-2005 -
Control Structures 11gR1 06-Aug-2007
Conversion Functions 11gR1 29-Jul-2007
Create Database 10gR2 21-Nov-2006 -
Create Schema 11gR1 08-Jul-2007 -
Cross Tabulation and Pivot Operator 11gR1 07-Jul-2007 -
CTX_DDL 10gR2 29-Apr-2007 incomplete
Cube 10gR2 09-Dec-2006 -
Cursor Sharing 10gR2 14-Dec-2006 -
Cursors & Cursor Loops 11gR1 06-Aug-2007
DANGLING 10gR2 08-Mar-2007 -
Data Control Language (DCL) 11gR1 07-Jul-2007 -
Data Dictionary 10gR2 15-Apr-2006 -
Data Files 10gR2 26-May-2007 -
Data Guard 10gR2 30-May-2007 Physical Only
Data Integrity 11gR1 29-Jul-2007
Data Mining Functions 10gR2 22-Nov-2005 -
Data Pump (API) 10gR2 - -
Data Pump (Executable) 10gR2 - -
Data Types & SubTypes 11gR1 09-Aug-2007 New SIMPLE_INTEGER
Database 10gR2 21-Nov-2006 -
Database Links 10gR2 08-Apr-2007 -
Date Functions 10gR2 06-Jun-2007 -
DBMSOBJG 11gR1 08-Jul-2007 -
DBMS_ADVANCED_REWRITE 11gR1 11-Aug-2007 -
DBMS_ADVISOR 10gR2 11-Aug-2007
DBMS_ALERT 11gR1 08-Jul-2007 -
DBMS_AMD 11gR1 08-Jul-2007 -
DBMS_APPLICATION_INFO 11gR1 08-Jul-2007 -
DBMS_APPLY_ADMIN 10gR2 01-Jun-2006 incomplete
DBMS_AQ 10gR2 20-Dec-2005 -
DBMS_AQADM 10gR2 03-Jul-2007 -
DBMS_AQELM 10gR2 20-Dec-2005 -
DBMS_ASSERT 11gR1 12-Aug-2007
DBMS_ASYNCRPC_PUSH 11gR1 08-Jul-2007 -
DBMS_AUTO_TASK_ADMIN 11gR1 09-Aug-2007
DBMS_AW_STATS 11gR1 19-Aug-2007
DBMS_CAPTURE_ADM 10gR2 07-Jun-2007 -
DBMS_CDC_PUBLISH 10gR2 23-Mar-2006 -
DBMS_CDC_SUBSCRIBE 10gR2 23-Mar-2006 -
DBMS_CHANGE_NOTIFICATION 10gR2 30-Apr-2007 -
DBMS_CLUSTDB 11gR1 08-Jul-2007 -
DBMS_COMPARISON 11gR1 09-Aug-2007
DBMS_CONNECTION_POOL 11gR1 12-Aug-2007
DBMS_CQ_NOTIFICATIONS 11gR1 19-Aug-2007
DBMS_CRYPTO 11gR1 11-Aug-2007
DBMS_CRYPTO_TOOLKIT_TYPES 11gR1 29-Jul-2007
DBMS_CSX_ADMIN 11gR1 20-Aug-2007
DBMS_DATAPUMP 10gR2 03-Jun-2007 -
DBMS_DBLINK 11gR1 29-Jul-2007 -
DBMS_DB_VERSION 10gR2 11-Sep-2005 -
DBMS_DBVERIFY 10gR2 11-Sep-2005 -
DBMS_DDL 10gR2 11-Sep-2005 -
DBMS_DDL_INTERNAL 11gR1 18-Aug-2007
DBMS_DESCRIBE 10gR2 11-Sep-2005 -
DBMS_DG 11gR1 11-Aug-2007
DBMS_DIMENSION 11gR1 11-Aug-2007
DBMS_DRS 10gR2 29-Nov-2006 -
DBMS_EDITIONS_UTILITIES 11gR1 11-Aug-2007
DBMS_ERRLOG 11gR1 29-Jul-2007
DBMS_EXPFIL 10gR2 11-Sep-2005 -
DBMS_EXTENDED_TTS_CHECKS 10gR2 11-Sep-2005 -
DBMS_FEATURE_USAGE 11gR1 17-Aug-2007 -
DBMS_FEATURE_USAGE_REPORT 11gR1 17-Aug-2007 -
DBMS_FGA 10gR2 11-Apr-2007 -
DBMS_FILE_TRANSFER 11gR1 09-Aug-2007 -
DBMS_FLASHBACK 11gR1 14-Aug-2007
DBMS_HA_ALERTS 11gR1 14-Aug-2007
DBMS_HA_ALERTS_PRVT 11gR1 14-Aug-2007 -
DBMS_HM 11gR1 18-Aug-2007
DBMS_HPROF 11gR1 09-Aug-2007
DBMS_I_INDEX_UTL 11gR1 09-Aug-2007
DBMS_INDEX_UTL 11gR1 09-Aug-2007
DBMS_INDEXING 11gR1 09-Aug-2007
DBMS_IOT 11gR1 17-Aug-2007
DBMS_IR 11gR1 18-Aug-2007
DBMS_JOB 10gR1 14-Apr-2005 See DBMS_SCHEDULER too
DBMS_LCR 11gR1 29-Jul-2007 -
DBMS_LDAP 10gR2 27-Nov-2006 -
DBMS_LOB 10gR2 15-Jul-2007 -
DBMS_LOCK 11gR1 18-Aug-2007 -
DBMS_LOGMNR 10gR2 08-May-2006 -
DBMS_METADATA 11gR1 11-Aug-2007
DBMS_MONITOR 10g 16-Oct-2006 -
DBMS_MVIEW 10gR2 20-Nov-2006 -
DBMS_NETWORK_ACL_ADMIN 11gR1 09-Aug-2007
DBMS_NETWORK_ACL_UTILITY 11gR1 09-Aug-2007
DBMS_OBFUSCATION_TOOLKIT - - Deprecated See DBMS_CRYPTO
DBMS_ODCI 11gR1 09-Aug-2007
DBMS_OUTLN 10gR2 30-May-2006 -
DBMS_OUTLN_EDIT 10gR2 30-May-2006 -
DBMS_OUTPUT 11gR1 10-Jul-2007 -
DBMS_PCLXUTIL 11gR1 10-Jul-2007 -
DBMS_PREDICTIVE_ANALYTICS 11gR1 13-Aug-2007
DBMS_PREPROCESSOR 11gR1 13-Aug-2007
DBMS_PROFILER 11gR1 20-Aug-2007 -
DBMS_PROPAGATION_ADM 10gR2 07-Jun-2007 -
DBMS_RANDOM 11gR1 10-Jul-2007 See DBMS_CRYPTO too
DBMS_RECTIFIER_DIFF 11gR1 10-Jul-2007 -
DBMS_RECTIFIER_FRIENDS 11gR1 10-Jul-2007 -
DBMS_REDEFINITION 10gR2 23-Jun-2007 -
DBMS_REFRESH 11gR1 20-Aug-2007
DBMS_REGISTRY 11gR1 09-Aug-2007
DBMS_REGISTRY_SERVER 10gR2 28-Nov-2006 -
DBMS_REGXDB 11gR1 20-Aug-2007 -
DBMS_REPAIR 10gR2 25-Sep-2006 -
DBMS_RESOURCE_MANAGER 10gR2 03-Jan-2006 -
DBMS_RESOURCE_MANAGER_PRIVS 10gR2 03-Jan-2006 -
DBMS_RESULT_CACHE 11gR1 09-Aug-2007
DBMS_RESUMABLE 10gR2 15-Nov-2005 -
DBMS_RLS 10gR2 16-Sep-2005 -
DBMS_ROWID 10gR2 22-Feb-2007 -
DBMS_SCHEDULER 10gR2 18-May-2006 -
DBMS_SCHEMA_COPY 10gR2 06-May-2006 -
DBMS_SERVER_ALERT 10gR2 01-Jan-2006 -
DBMS_SERVER_TRACE 10gR2 30-Nov-2006 -
DBMS_SERVICE 10gR2 17-Jan-2007 -
DBMS_SESSION 10gR2 23-Jun-2007 -
DBMS_SHARED_POOL 10gR2 25-Nov-2005 -
DBMS_SNAPSHOT 10gR2 08-Oct-2005 -
DBMS_SPACE 10gR2 25-Nov-2005 -
DBMS_SPACE_ADMIN 10gR2 15-Mar-2007 -
DBMS_SPM 11gR1 16-Aug-2007
DBMS_SQL 10gR2 30-Dec-2005 -
DBMS_SQLHASH 11gR1 29-Jul-2007
DBMS_SQLJTYPE 11gR1 19-Aug-2007
DBMS_SQLPA 11gR1 20-Aug-2007
DBMS_SQLPLUS_SCRIPT 10gR2 23-Mar-2007 -
DBMS_SQLTUNE 10gR2 11-Aug-2007
DBMS_STAT_FUNCS 10gR2 20-Dec-2006 -
DBMS_STATS 11gR1 09-Aug-2007
DBMS_STORAGE_MAP 11gR1 19-Aug-2007
DBMS_STREAMS 10gR2 07-Jun-2007 -
DBMS_STREAMS_ADM 10gR2 07-Jun-2007 -
DBMS_STREAMS_AUTH 10gR2 07-Jun-2007 -
DBMS_SUPPORT 10gR2 17-Mar-2007 -
DBMS_SYSTEM 10gR2 04-Dec-2006 -
DBMS_TDB 10gR2 01-Dec-2006 -
DBMS_TRACE 10gR2 16-Nov-2005 -
DBMS_TRANSACTION 10gR2 30-Dec-2005 -
DBMS_TRANSFORM 10gR2 26-Nov-2005 -
DBMS_TTS 10gR2 20-Nov-2005 -
DBMS_TYPES 11gR1 29-Jul-2007 -
DBMS_UNDO_ADV 11gR1 19-Aug-2007
DBMS_UTILITY 11gR1 10-Jul-2007 -
DBMS_WARNING 11gR1 06-Aug-2007
DBMS_WARNING_INTERNAL 11gR1 15-Jul-2007 -
DBMS_WM Synonym 10gR2 17-Dec-2005 -
DBMS_WORKLOAD_REPOSITORY 11gR1 17-Aug-2007
DBMS_XA 11gR1 13-Aug-2007
DBMS_XDBUTIL_INT 10gR2 09-Sep-2006 -
DBMS_XMLGEN 10gR2 15-Jul-2007 -
DBMS_XPLAN 11gR1 15-Aug-2007
DBMS_ZHELP 11gR1 13-Jul-2007 -
DBMS_ZHELP_IR 11gR1 13-Jul-2007 -
DBV (database verify) 10gR2 26-Nov-2005 -
DCL Statements 11gR1 29-Jul-2007 -
DDL Event Triggers 11gR1 19-Aug-2007
Deadlocks 11gR1 07-Jul-2007 -
DECODE Function 11gR1 15-Aug-2007
Delete Statement 11gR1 12-Aug-2007 -
Descending Indexes 10gR2 23-Jun-2006 -
Dimensions 10gR2 20-Nov-2006 -
Directories 11gR1 29-Jul-2007
DIUTIL 11gR1 11-Jul-2007 -
DML Statements 11gR1 07-Jul-2007 -
Dynamic Performance Views 10gR2 05-May-2007 -
Editions 11gR1 11-Aug-2007
Environment Variables 10gR2 30-Mar-2006 -
Errors 11gR1 30-Jul-2007
Exception Handling 10gR2 27-Feb-2007 -
Excluded Nodes 10g 15-Jun-2005 -
Exists 10gR2 24-Oct-2005 -
Explain Plan 11gR1 16-Aug-2007
Export 10gR2 16-Dec-2005 -
Expression Filtering 10g 28-Apr-2005 -
External Tables 10gR2 04-Jun-2007 -
Files Of Interest 11gR1 16-Aug-2007
Fine Grained Access Control (FGAC) 10gR2 16-Sep-2005 -
Flashback 11gR1 14-Aug-2007
Flashback Archive 11gR1 14-Aug-2007
Flashback Database 11gR1 14-Aug-2007
Flashback Drop 11gR1 14-Aug-2007
Flashback Query 11gR1 14-Aug-2007
Flashback Table 11gR1 14-Aug-2007 -
Flashback Transaction 11gR1 14-Aug-2007 -
Flashback Version 11gR1 14-Aug-2007 -
FOLLOWS Clause (Triggers) 11gR1 12-Aug-2007
FOR UPDATE 10gR2 26-Nov-2005 -
FORALL 10gR2 03-Mar-2007 -
Foreign Key Constraint 10gR2 09-May-2007 -
FORMs 10g 24-Jan-2005 -
Function Based Indexes 10gR2 23-Jun-2006 -
Functions: Miscellaneous 11gR1 19-Aug-2007
Functions: User Defined 11gR1 18-Aug-2007 -
Fusion MiddleWare Application Server 10.1.2.0.2 02-Jan-2007 -
Fusion MiddleWare Application Server 10.1.3.0.0 02-Jan-2007 -
Global Hints 10gR2 22-Aug-2006 -
Global Partitioned Indexes 10gR2 25-May-2007 -
Global Temporary Tables 11gR1 29-Jul-2007
Globalization Toolkit 10gR2 25-Oct-2005 -
Grid Control 10gR2 07-May-2007 -
GROUP BY Clauses 10gR2 09-Dec-2006 -
GROUPING SETS 10gR2 09-Dec-2006 -
Guaranteed Restore Point 11gR1 29-Jul-2007
GV$ Views 10gR2 05-May-2007 -
HAVING Clauses 10gR2 09-Dec-2006 -
Heap Tables 10gR2 11-Aug-2007
Hints 10gR2 17-Mar-2007 incomplete
Histograms 10gR2 15-Apr-2006 -
Host Environment 10gR2 29-Sep-2006 -
HTP 10gR2 16-Jun-2006 -
IF Statements 11gR1 06-Aug-2007
Import 10gR2 16-Dec-2005 -
Indexes 10gR2 23-Jun-2006 -
Index Organized Tables (IOT) 10gR2 29-May-2006 -
Init SID Dot Ora 10gR2 04-Apr-2007 -
Inline Views 10gR2 24-Nov-2006 -
Insert Statements 11gR1 12-Aug-2007
Instead-Of Triggers 10gR2 06-Aug-2007
Instring Function 11gR1 27-Jul-2007 -
Intermedia Audio 10g 21-Jul-2004 -
Intermedia Video 10g 21-Jul-2004 -
Interval 11gR1 01-Aug-2007
Invisible Indexes 11gR1 09-Aug-2007
Invited Nodes 10g 15-Jun-2005 -
Joins 10gR2 21-Nov-2005 -
Keep Pool 11gR1 15-Jul-2007 -
Killing Sessions 10gR2 16-Jan-2005 -
Licensing 10gR2 30-Sep-2006 -
Listener 10gR2 30-Sep-2006 -
LOB_Compression 10gR2 25-Oct-2005 -
Local Partitioned Indexes 10gR2 25-May-2007 -
Locks 10gR2 24-Feb-2005 -
Log Files 10gR2 08-Nov-2006 -
LONG To CLOB 10gR2 26-Nov-2005 -
Loops 11gR1 06-Aug-2007
LT Built-in Package 10gR2 17-Dec-2005 -
Materialized Views 10gR2 02-Jan-2007 -
Merge Statement 11gR1 12-Aug-2007
Microsoft SQL Server 2005 Comparison - 24-Apr-2007 -
Microsoft Vista Enterprise and Oracle - 21-Apr-2007 -
Model Clause 10g 09-Dec-2006 -
Multiset 10gR2 18-Nov-2005 -
Multiversion Concurrency Control (MVCC) 10gR2 27-Sep-2006 -
Native Compilation 11gR1 09-Aug-2007
Native Dynamic SQL (NDS) 10gR2 03-Dec-2005 -
Nested Loops 10gR2 02-Mar-2007 -
Nested Tables 10gR2 05-Dec-2005 -
Nested Table Constraints 10gR2 09-Dec-2006 -
Net Services 10g 03-May-2005 -
Network Appliance Filer Management - 16-Jan-2007 -
NID (change internal database identifier) 10gR2 26-Nov-2005 -
No Segment Indexes 10gR2 23-Jun-2006 -
NOCOPY 10gR2 12-Jan-2006 -
Normalization - 28-May-2007 -
NOWAIT 10gR2 26-Nov-2005 -
Numeric Functions 10gR2 15-Dec-2006 -
NULL 10gR2 03-Feb-2007 -
NULL Pruning 10gR2 15-Apr-2006 -
Object Privileges 10gR2 26-Nov-2005 -
Object-Relational Views 10g 17-Nov-2004 -
Operators: Built-in 10gR2 29-Nov-2005 -
Operators: User Defined 10gR2 01-Nov-2006 -
ORA_HASH 11gR1 13-Jul-2007 -
ORA_NAME_LIST_T 10gR2 16-Jun-2006 -
ORA_ROWSCN 11gR1 19-Aug-2007
ORADEBUG 10gR2 08-Aug-2006 -
ORADIM 10gR2 23-Nov-2005 -
ORAPWD 10gR2 13-Jul-2006 -
ORDER BY Clause 11gR1 07-Jul-2007 -
Outlines 10gR2 30-May-2007 -
OUTLN_EDIT_PKG 10gR2 30-May-2006 -
OUTLN_PKG 10gR2 30-May-2006 -
OWA_CUSTOM 10gR2 05-Mar-2007 -
OWA_CX 10gR2 19-Mar-2007 -
OWA_OPT_LOCK 10gR2 14-Jan-2007 -
OWA_SEC 10gR2 06-May-2007 -
OWA_TEXT 10gR2 06-May-2007 -
OWA_UTIL 10gR2 16-Jul-2007 -
Packages: User Defined 10gR2 29-Mar-2007 -
Parent Correlation Name 11gR1 06-Aug-2007
Partitioning (tables and indexes) 10gR2 25-May-2007 -
Partitioning Elimination Demo 10gR2 25-May-2007 -
Partitioning Pruning Demo 10gR2 25-May-2007 -
Pipelined Table Functions 10gR2 15-Mar-2007
Pivot 11gR1 15-Aug-2007
PLSQL_CCFLAGS 10gR2 11-Sep-2005 -
PL/Scope 11gR1 18-Aug-2007
PL/SQL Object Settings 11gR1 09-Aug-2007
PRAGMAS 10gR2 16-Dec-2006 -
PRAGMA Autonomous_Transaction 10gR2 16-Sep-2005 -
PRAGMA Exception_Init 10gR2 26-Nov-2005 -
PRAGMA Serially Reusable 10gR2 17-Jul-2005 -
Primary Key Constraint 10gR2 09-May-2007 -
Procedures 11gR1 18-Aug-2007
Product User Profiles 10gR2 30-Nov-2005 -
Profiles 11gR1 13-Jul-2007 -
Protocol.ora 10gR2 03-May-2005 Deprecated See: SQLNET.ORA
Pseudo Columns 10gR2 19-Aug-2007
Public Synonyms 11gR1 21-Jul-2007
Purge Recyclebin 11gR1 14-Aug-2007 -
Purge Table 10gR2 08-Mar-2006 -
Quote Delimiters 10gR2 10-Jul-2006 -
RAC 10gR2 31-Jul-2006 -
RAID 10gR2 16-Jan-2005 -
Rank 10gR2 30-Nov-2005 -
RDA 10gR2 05-Oct-2006 -
Real Application Clusters 10gR2 16-Jan-2006 -
Recycle Bin 11gR1 14-Aug-2007
Recycle Pool 11gR1 15-Jul-2007 -
Redo 10gR2 23-Mar-2007 -
Ref Cursors 10gR2 05-Dec-2005 -
Referential Constraint 10gR2 09-May-2007 -
Regular Expressions 10gR2 15-Jul-2007 -
Remote Diagnostic Agent 10gR2 05-Oct-2006 -
Replace Built-in Function 11gR1 07-Aug-2007
Restore Point 11gR1 29-Jul-2007
Resumable Transactions 10gR2 15-Nov-2005 -
Reverse Key Indexes 10gR2 23-Jun-2006 -
Rewrite Equivalence 10gR2 11-Sep-2005 -
RMAN 10gR2 26-Apr-2006 incomplete
RMAN Demo 10gR2 19-Mar-2006 incomplete
Roles 10gR2 28-Nov-2005 -
Rollback 11gR1 07-Jul-2007 -
Rollup 10gR2 09-Dec-2006 -
ROWDEPENDENCIES 10gR2 27-Nov-2005 -
ROWID 10gR2 27-Nov-2005 -
Row Level Security 10gR2 16-Sep-2005 -
ROWNUM 10gR2 27-Nov-2005 -
Rule Based Optimizer (RBO) 10g 16-Apr-2004 Deprecated
Sample Clause 10gR2 12-Jul-2006 -
Savepoint 11gR1 07-Jul-2007 -
Schema 11gR1 08-Jul-2007 -
Select Statement 10gR2 10-Aug-2007
Sequences 11gR1 11-Aug-2007
Services 10gR2 26-Nov-2005 -
Sessions 10gR2 24-Feb-2006 -
Set Operators 10gR2 29-Nov-2005 -
SHOW 10gR2 22-Dec-2006 -
SKIP LOCKED 10gR2 26-Nov-2005 -
SLEEP 10gR2 28-Feb-2007 -
Snapshots 10gR2 30-Apr-2006 -
Sorted Hash Clusters 10gR2 26-Feb-2007 -
Soundex 10gR2 16-Sep-2006 -
SPFile 10gR2 26-Jan-2007 -
SQL Injection 10gR2 05-Mar-2007 -
SQL*Loader 10gR2 03-May-2007 -
SQL*Plus 10gR2 21-Apr-2007 -
SQLNET.ORA 10gR2 03-May-2005 -
Standard 10gR2 16-Sep-2006 -
Starting & Stopping The Database 10gR2 16-Jul-2007 -
Startup Parameters 10gR2 05-Apr-2007 -
Stored Outlines 10gR2 19-May-2007 -
Stored Procedures 10gR2 21-Nov-2005 -
Storage - 19-Oct-2006 -
Streams Demo 1 10gR2 07-Jun-2007 -
Streams Demo 2 10gR2 - -
String Functions 10gR2 07-Mar-2007 -
Subqueries 10gR2 24-Oct-2005 -
Substring Function 11gR1 27-Jul-2007 -
Sybase ASE 15.0.1 Comparison - 26-Jan-2007 -
Synonyms 11gR1 21-Jul-2007
SYS_CONTEXT Built-in Function 11gR1 19-Aug-2007
SYS_GUID 11gR1 09-Dec-2006 -
SYS_OP_DESCEND 10gR2 16-Jun-2006 -
SYS_OP_DISTINCT 10gR2 09-Mar-2007 -
SYS_OP_GUID 10gR2 27-May-2007 -
SYS_OP_LBID 10gR2 16-Jun-2006 -
SYS_OP_MAP_NONNULL 10gR2 09-Sep-2006 -
SYS_OP_RAWTONUM 10gR2 09-Mar-2007 -
SYS_OP_RPB 10gR2 07-Mar-2007 -
SYS_OP_TOSETID 10gR2 07-Mar-2007 -
SYS_TYPEID 11gR1 29-Dec-2006 -
System 10gR2 03-Dec-2006 -
System Events 10gR2 11-Feb-2007 -
System Event Triggers 11gR1 29-Jul-2007
System Privileges 11gR1 20-Aug-2007
System Statistics 10gR2 25-Feb-2007 -
Table Collection Expression 11gR1 21-Jul-2007
Tables 10gR2 11-Aug-2007
Table Triggers 11gR1 12-Aug-2007
Tablespaces 10gR2 15-Jul-2007 -
Tablespace Groups 10gR2 06-Jan-2006 -
Timestamp 11gR1 01-Aug-2007
Time Zones 11gR1 01-Aug-2007
TKPROF 10gR2 07-May-2007 -
Total Recall 11gR1 09-Aug-2007
Trace File Identifier 10gR2 26-Sep-2006 -
Tracing 10gR2 07-May-2007 -
Transactions 11gR1 07-Jul-2007 -
Translate Built-in Function 11gR1 07-Aug-2007
Transportable Tablespaces 10gR2 07-Jan-2006 -
Truncate (Tables & Partitions) 11gR1 30-Jul-2007
Tuning 10gR2 05-Mar-2007 -
Types 10g 16-Apr-2004 -
Undocumented Oracle 10gR2 29-May-2007 -
UNIX / vi - 15-Jul-2007 -
Unique Constraint 10gR2 09-May-2007 -
Unpivot 11gR1 15-Aug-2007
Update Statement 11gR1 12-Aug-2007
USERENV 11gR1 02-Dec-2005 See SYS_CONTEXT
Users 10gR2 06-Aug-2007
USER_LOCK 11gR1 27-Jul-2007
Utilities 10gR2 21-Mar-2007 -
UTL_COLL 11gR1 29-Jul-2007 -
UTL_COMPRESS 11gR1 29-Jul-2007
UTL_ENCODE 10gR2 13-Nov-2005 -
UTL_FILE 10gR2 25-Oct-2005 -
UTL_GDK 10gR2 29-May-2007 -
UTL_HTTP 10gR2 09-Jun-2006 -
UTL_I18N 11gR1 27-Jul-2007
UTL_INADDR 11gR1 07-Jul-2007 -
UTL_LMS 11gR1 07-Jul-2007 -
UTL_MAIL 11gR1 11-Aug-2007 -
UTL_MATCH 10gR2 12-Nov-2005 -
UTL_RAW 10gR2 30-Mar-2007 -
UTL_RECOMP 11gR1 30-Jul-2007
UTL_REF 10gR2 16-Jan-2006 -
UTL_SMTP 10gR2 12-Nov-2005 Deprecated: See UTL_MAIL
UTL_TCP 11gR1 12-Aug-2007 -
UTL_URL 11gR1 11-Aug-2007 -
Varrays 10gR2 03-Dec-2005 -
VERSIONS BETWEEN 10gR2 27-Nov-2005 -
Views 11gR1 07-Jul-2007 -
Virtual Columns 11gR1 09-Aug-2007
Virtual Indexes 10gR2 23-Jun-2006 -
Virtual Private Database 10gR2 16-Sep-2005 -
V$ Views 10gR2 05-May-2007 -
WAIT 10gR2 26-Nov-2005 -
Where Clause 11gR1 29-Jul-2007
Wildcards 10gR2 26-Nov-2005 -
Windows 10gR2 28-Apr-2006 -
WITH Clause 10gR2 15-Jul-2007 -
Workspace Manager 10gR2 17-Dec-2005 -
WPG_DOCLOAD 10gR2 25-Jul-2006 -
Wrap 10gR2 26-Nov-2005 -
Write CLOB to file 10gR2 25-Jul-2006 -
XML Functions 10gR2 28-May-2007 -
XMLQuery 10gR2 16-Sep-2005 -
XMLTable 10gR2 16-Sep-2005 -
XMLTYPE 11gR1 14-Jul-2007 -
XML Tables 10gR2 16-Sep-2005 -
Library Key: Version = Highest version number tested Red date = altered in last 30 days in last 30 days changed in last 30 days
This is site maintained by the Puget Sound Oracle Users Group.
Copyright 2007-2011 Chabster