Logo    
Деловая газета CitCity.ru CITKIT.ru - все об Open Source Форумы Все публикации Учебный центр Курилка
CitForum    CITForum на CD    Подписка на новости портала Море(!) аналитической информации! :: CITFORUM.RU
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

18.01.2017

Google
WWW CITForum.ru
С Новым годом!
2002 г

Получение средствами DirectDraw прямого доступа к видеопамяти

Вадим Бодров
"Открытые Системы"
Мир ПК, #06/2002

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

Уже более пяти лет операционные системы семейства Win32 (Windows 95/98/Me/NT/2000/XP) практически безраздельно властвуют на рынке приложений для платформы Intel. Тем не менее до сих пор многие начинающие программисты не торопятся осваивать Windows. Когда дело касается создания графических приложений, требующих прямого доступа к видеопамяти, они отдают свое предпочтение MS-DOS и низкоуровневым функциям стандартов VGA BIOS и VESA/VBE. Так, и на страницах журнала "Мир ПК" часто можно встретить статьи, посвященные такому подходу. Между тем есть достаточно простой способ решения данных задач средствами Win32, а именно использование части технологии Microsoft DirectX - компонента DirectDraw.

О выборе языка программирования

Объект DirectDraw представляет собой обычный COM-объект, порожденный непосредственно от базового интерфейса IUnknown. Напомню, что COM-объекты очень похожи на обычные объекты языка Cи++, но отличаются рядом ограничений. Так, COM-объекты не могут иметь открытых переменных (полей), конструкторов и деструкторов. Для создания COM-объектов обычно используются специальные функции, а для их удаления применяется метод Release(), принадлежащий базовому интерфейсу IUnknown. Поскольку COM-интерфейсы довольно легко реализуются средствами Cи++, в данной статье выбран именно этот язык программирования. Разумеется, работать с объектами DirectX позволяют и другие популярные языки, например Паскаль (Borland Delphi [3], TMT Pascal [4]) и Visual Basic. Стандартный язык программирования Си также позволяет работать с COM-объектами, но при этом значительно усложняется синтаксис вызова функций DirectDraw, и потому при выборе транслятора следует ориентироваться на Microsoft Visual C++ 6.x.

Создание базового объекта DirectDraw

Первый шаг к применению компонента DirectDraw - реализация базового DirectDraw-объекта при помощи функции DirectDrawCreate(), обычно находящейся в динамической библиотеке DDRAW.DLL и объявленной в заголовочном файле ddraw.h:

LPDIRECTDRAW lpDDraw;
hResult = DirectDrawCreate(NULL, &lpDDraw,
 NULL);

Первый параметр функции DirectDrawCreate() является указателем на GUID (Globally Unique Identifier), определяющим создаваемый драйвер. Чаще всего в качестве этого параметра применяется константа NULL, идентифицирующая активное графическое устройство (Active Display Device). В случае удачного вызова функция возвращает значение DD_OK и помещает указатель на порожденный объект DirectDraw в переменную lpDDraw. Последний параметр функции DirectDrawCreate() предназначен для COM-агрегирования (COM aggregation), реализующего разделение интерфейсов многократного использования при наследовании одним объектом методов другого. В текущей версии DirectX этот параметр должен иметь значение NULL.

Полученный указатель на объект DirectDraw теперь можно применять для задания прав доступа к экрану (Cooperative Level) и установки графического режима (Display Mode). Права эти задаются с помощью метода SetCooperativeLevel(). Обычно требуется задавать полноэкранный режим с исключительными правами доступа. Делается это следующим образом:

hResult = pDDraw->SetCooperativeLevel
(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);

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

Установка графического режима

Теперь настало время заняться установкой графического режима. Эта задача решается при помощи метода SetDisplayMode(), аналога функции 02h прерывания Int 13h VESA/VBE, но в отличие от нее позволяет напрямую задавать горизонтальное и вертикальное разрешение экрана, а также максимальное количество цветов, доступное в данном режиме. Например, установка 256-цветного режима с разрешением 640x480 точек будет иметь вид:

hResult = lpDDraw->SetDisplayMode(640, 480, 8);

Следующая же функция устанавливает режим 800x600 точек, поддерживающий уже 65 536 цветов.

hResult = lpDDraw->SetDisplayMode(800, 600, 16);

Здесь следует отметить, что современные версии пакета DirectX содержат новые компоненты DirectDraw2, DirectDraw4 и DirectDraw7, обладающие более широкими возможностями, чем рассматриваемый компонент DirectDraw. Так, они позволяют устанавливать вертикальную частоту развертки монитора, возвращают объем видеопамяти и т.п. Однако для данной статьи мы возьмем именно DirectDraw, поскольку он обладает всеми свойствами, необходимыми для решения поставленной задачи, в частности для получения прямого доступа к видеопамяти в оконных Win32-приложениях.

Создание первичной поверхности

Следующий шаг - создание первичной поверхности (Primary Surface), являющейся объектом DirectDrawSurface. Здесь следует отметить, что компонент DirectDraw дает возможность порождать множество объектов DirectDrawSurface. Чтобы упростить пример, мы заведем всего одну поверхность DirectDrawSurface, отображенную непосредственно на область видеопамяти для получения прямого доступа к ней.

Перед тем как приступить к формированию первичной поверхности, нужно объявить и инициализировать специальную структуру типа DDSURFACEDESC. Вообще говоря, программа взаимодействует с объектом DirectDraw посредством множества различных структур данных, в том числе и через структуру типа DDSURFACEDESC, представленную в файле ddraw.h следующим образом:

typedef struct _DDSURFACEDESC {
DWORD          dwSize;
DWORD          dwFlags;
DWORD          dwHeight;
DWORD          dwWidth;
union
{
LONG       lPitch;
DWORD      dwLinearSize;
};
DWORD          dwBackBufferCount;
union
{
DWORD      dwMipMapCount;
DWORD      dwZBufferBitDepth;
DWORD      dwRefreshRate;
};
DWORD          dwAlphaBitDepth;
DWORD          dwReserved;
LPVOID         lpSurface;
DDCOLORKEY     ddckCKDestOverlay;
DDCOLORKEY     ddckCKDestBlt;
DDCOLORKEY     ddckCKSrcOverlay;
DDCOLORKEY     ddckCKSrcBlt;
DDPIXELFORMAT  ddpfPixelFormat;
DDSCAPS        ddsCaps;
} DDSURFACEDESC;

Полное описание всех полей этой структуры можно найти в работе [2]. Нам же понадобится инициализировать три поля:

  • dwSize - размер структуры в байтах, который должен быть инициализирован перед ее использованием;
  • dwFlags - набор флагов, определяющих, какие именно поля структуры содержат инициализированные значения;
  • ddsCaps - вложенная структура типа DDSCAPS.

Структура DDCAPS также определена в файле ddraw.h:

typedef struct _DDSCAPS{
DWORD dwCaps;
} DDSCAPS,FAR* LPDDSCAPS;

Первичная поверхность создается при помощи метода CreateSurface(), принадлежащего объекту DirectDraw:

DDSURFACEDESC ddsd;
DDSCAPS ddsc;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.ddsCaps.dwCaps = DDSCAPS
_PRIMARYSURFACE;
ddsd.dwFlags = DDSD_CAPS;
hResult = (lpDDraw->CreateSurface
(&ddsd, &lpPrimarySurface, NULL);

Обратите внимание на то, что перед вызовом метода CreateSurface() все неиспользуемые поля структуры типа DDSCAPS должны быть обнулены, а поле dwSize содержать ее точный размер в байтах.

Метод lock()

Мы научились создавать и инициализировать объект DirectDraw, устанавливать требуемый графический режим и формировать первичную графическую поверхность. Теперь нужно позаботиться о получении прямого доступа к видеопамяти. Для этого заблокируем поверхность в памяти при помощи метода Lock():

hResult = lpPrimarySurface->Lock
(NULL, &ddsd, DDLOCK_WAIT, NULL);

В качестве первого аргумента Lock() получает указатель на структуру типа RECT, содержащую координаты прямоугольной области, к которой мы хотим иметь прямой доступ. В приведенном выше примере вместо указателя на структуру RECT мы взяли значение NULL. Значит, мы хотим, чтобы у нас появился прямой доступ ко всей поверхности, а не к какой-то отдельной ее части. Указатель на саму поверхность передается вторым аргументом метода Lock().

Флаг DDLOCK_WAIT сообщает методу Lock() о том, что при неудачной попытке блокирования поверхности (например, во время проведения blit-операции) следует повторять эту операцию вплоть до возникновения какой-либо иной ошибки типа DDERR_SURFACEBUSY и т.п.

После успешного выполнения (hResult = DD_OK) метод Lock() заполняет структуру ddsd необходимыми нам параметрами блокируемой поверхности. В данном случае это будут параметры DirectDraw-поверхности, отражаемой на активную страницу видеопамяти. Итак, наиболее важными полями структуры ddsd считаются:

  • lpSurface - указатель на область памяти, ассоциированную с поверхностью. Здесь он указывает на начало активной страницы видеопамяти;
  • lPitch - расстояние в байтах до начала следующей графической линии; данная величина может быть больше или равна "физической" ширине поверхности (dwWidth), умноженной на размер точки (пиксела) в байтах (BPP).

Таким образом, имея указатель на начало активной страницы видеопамяти, мы способны непосредственно манипулировать ее содержимым. Например, функция очистки видеостраницы может выглядеть так:

memset(lpSurface, 0, ddsd.lPitch
 * ddsd.dwHeight);

Следует подчеркнуть очень важный момент при работе с заблокированной поверхностью: после выполнения операций, которые связаны с прямым доступом к памяти, ассоциированной с поверхностью DirectDraw, требуется немедленно разблокировать эту поверхность при помощи метода Unlock():

lpPrimarySurface->Unlock
(ddsd.lpSurface);

В противном случае операционная система может зависнуть.

Удаление объектов DirectDraw

Перед уничтожением главного окна приложения нужно удалить созданные объекты DirectDraw, чтобы освободить занимаемые ими системные ресурсы. Обычно все делается в обработчике события WM_DESTROY. Главное, о чем всегда следует помнить при работе с COM-объектами, - это то, что недопустимо применять метод delete() непосредственно. Дело в том, что удаляемый объект может использоваться другим приложением, ведь мы работаем в многозадачной среде. С подобной проблемой легко справляется метод Release(), который просто уменьшает счетчик ссылок на объект (reference count) и вызывает метод delete() лишь тогда, когда значение этого счетчика равно нулю. Это свидетельствует о том, что удаляемый объект не используется ни одним приложением.

В данном примере мы создали два COM-объекта, причем указатели на них содержатся в переменных lpDDraw и lpPrimarySurface. Значит, при обработке системного события WM_DESTROY нам требуется применить всего два метода:

lpPrimarySurface->Release();
lpDDraw->Release();

Простейшая программа, демонстрирующая прямой доступ к видеопамяти средствами DirectDraw, приведена в листинге.

Листинг

#include <windows.h>
#include <ddraw.h>

const PHYSICAL_WIDTH = 800;
const PHYSICAL_HEIGHT = 600;

LPDIRECTDRAW lpDDraw;
LPDIRECTDRAWSURFACE lpPrimarySurface;

LRESULT CALLBACK DDrawWndProc(HWND hWnd, UINT message, 
                 WPARAM wParam, LPARAM lParam);
BOOL DDrawInit(HWND hWnd);
void DDrawDone();
void DrawScreen();

int WINAPI WinMain(HINSTANCE hInstance, 
     HINSTANCE hPrevInstance, LPSTR lpCmdLine,
    int nCmdShow)
{

    WNDCLASS wndClass;
    HWND hWnd;
    MSG msg;

    ZeroMemory(&wndClass, sizeof(wndClass));
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = DDrawWndProc;
    wndClass.hInstance = hInstance;
    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.lpszClassName = <DDrawApp>;

    RegisterClass(&wndClass);

    hWnd = CreateWindowEx(
        WS_EX_TOPMOST,
        wndClass.lpszClassName,
        <DirectDraw Application>,
        WS_POPUP | WS_MAXIMIZE,
        0,
        0,
        GetSystemMetrics(SM_CXSCREEN),
        GetSystemMetrics(SM_CYSCREEN),
        NULL,
        NULL,
        hInstance,
        NULL);

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK DDrawWndProc(HWND hWnd, 
        UINT message, WPARAM wParam,
    LPARAM lParam)
{
    switch(message)
    {
        case WM_CREATE:
            DDrawInit(hWnd);
            SetTimer(hWnd, 1, 50, 0);
            return 0;

        case WM_TIMER:
            DrawScreen();
            return 0;

        case WM_KEYDOWN:
            if (wParam == VK_ESCAPE)
                SendMessage(hWnd, WM_CLOSE, 0, 0);
            return 0;

        case WM_DESTROY:
            KillTimer(hWnd, 1);
            DDrawDone();
            PostQuitMessage(0);
            return 0;

        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
}

BOOL DDrawInit(HWND hWnd)
{
    DDSURFACEDESC ddsd;
    DDSCAPS ddsc;

    if (DirectDrawCreate(NULL, &lpDDraw, NULL) != DD_OK)
        return FALSE;

    if (lpDDraw->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE |
           DDSCL_FULLSCREEN) != DD_OK)
       return FALSE;

    if (lpDDraw->SetDisplayMode(PHYSICAL_WIDTH, 
        PHYSICAL_HEIGHT, 
        8) != DD_OK)
       return FALSE;

    ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize = sizeof(ddsd);
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
    ddsd.dwFlags = DDSD_CAPS;
    if (lpDDraw->CreateSurface(&ddsd, &lpPrimarySurface, 
        NULL) != DD_OK)
        return FALSE;

    return TRUE;
}

void DDrawDone()
{
    if (lpPrimarySurface != NULL)
       lpPrimarySurface->Release();

    if (lpDDraw != NULL)
        lpDDraw->Release();
}

void DrawScreen()
{
    DDSURFACEDESC ddsd;
    static int pos;

    ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize = sizeof(ddsd);

  if (lpPrimarySurface->Lock(NULL, &ddsd, 
      DDLOCK_WAIT, NULL) == DD_OK)
   {
    char* buffer = (char*)ddsd.lpSurface;
    for (int i = 0; i < PHYSICAL_HEIGHT / 2; i++)
     {
       memset(buffer + (i * ddsd.lPitch), i + pos, 
              PHYSICAL_WIDTH);
       memset(buffer + ((PHYSICAL_HEIGHT / 2 + i) 
              * ddsd.lPitch), i - pos,
 PHYSICAL_WIDTH);
     }

     pos++;

     lpPrimarySurface->Unlock(ddsd.lpSurface);
    }
}

Cтандарт VESA/VBE отображает видеопамять в виде отдельных окон (банков) размерами не более 64 Кбайт, причем только одно из них может быть активным в заданный момент времени. Переключение таких окон значительно усложняет алгоритмы обработки графики, а также замедляет скорость работы всего приложения. Стандарт VESA/VBE, начиная с версии 2.0, позволяет добиться линейного доступа к видеопамяти в режиме LFB (Linear Flat-frame Buffer) аналогично тому, как это делает DirectDraw. К сожалению, приложения MS-DOS, использующие режим LFB, не могут работать под управлением ОС семейства Windows NT (Windows NT/2000/XP). Это значительно ограничивает область применения LFB и практически сводит на нет все его преимущества перед обычными "оконными" режимами VESA/VBE.

В отличие от упомянутых режимов компонент DirectDraw представляет видеопамять в виде непрерывного линейного массива (вектора), напрямую определяющего цвета отображаемых пикселов. Таким образом, программирование графики в режиме прямого доступа к видеопамяти в Win32-приложениях гораздо более простая задача, чем использование средств VESA/VBE в среде MS-DOS.

Литература и Web-ресурсы

  1. Microsoft DirectX SDK // Microsoft Corp.
  2. DirectX Programmers Reference // Microsoft Corp.: http://www.microsoft.com/directx/ download.asp
  3. DirectX for Delphi (также известен как Jedi Project): http://www.delphi-jedi.org/DelphiGraphics
  4. TMT Pascal Multi-target standard distributive: http://www.tmt.com

 

Размещение рекламы — тел. +7 495 4119920, ICQ 232284597

Подписка на новости IT-портала CITForum.ru
(библиотека, CITKIT.ru, CitCity)

Новые публикации:

24 декабря

CITKIT.ru:

  • Новогодние поздравления
  • Сергей Кузнецов. Цикл Операционные системы: Ностальгия по будущему:

  • Алексей Федорчук. OpenSolaris 2008.11 Release

  • Сергей Голубев:

  • Евгений Чайкин aka StraNNik (Блогометки):

    17 декабря

  • С.Д.Кузнецов. Базы данных. Вводный курс

    10 декабря

    CITKIT.ru:

  • OpenSolaris 2008.11 Release

  • Альтернативные ОС: две грустные истории (С.Кузнецов)
  • Nokia N810 — доведение до ума
  • CitCity:

  • Платформа 2009: заоблачные перспективы Microsoft

    4 декабря

  • Лекция С.Д.Кузнецова Понятие модели данных. Обзор разновидностей моделей данных

    CITKIT.ru:

  • OpenSolaris 2008.11 Release. Первые впечатления

  • Linux vs FreeBSD: продолжим "Священные войны"?

  • Nokia N810 as is

  • Индульгенция для FOSS

  • Друзья СПО'2008

    26 ноября

  • Нечеткое сравнение коллекций: семантический и алгоритмический аспекты

    CitCity:

    CITKIT.ru:

  • Глава из книги А.Федорчука
    Сага о FreeBSD:
  • 19 ноября

  • Проблемы экономики производства крупных программных продуктов

  • Язык модификации данных формата XML функциональными методами

    CITKIT.ru:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:

    Заметки к книге:

  • FreeBSD: монтирование сменных устройств и механизм HAL
  • Текстовый редактор ee

    12 ноября

  • Правило пяти минут двадцать лет спустя, и как флэш-память изменяет правила (Гоц Грейф, перевод: Сергей Кузнецов)

    CITKIT.ru:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:
  • OSS в России: взгляд правоведа (В.Житомирский)

  • Новая статья из цикла С.Голубева "Железный марш":

    29 октября

  • О некоторых задачах обратной инженерии

  • Веб-сервисы и Ruby

  • Тестирование web-приложений с помощью Ruby

    CITKIT.ru:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:

  • PuppyRus Linux - беседа с разработчиком (С.Голубев)

  • Сергей Кузнецов. Заметка не про Linux

    22 октября

  • Обзор методов описания встраиваемой аппаратуры и построения инструментария кросс-разработки

    CITKIT.ru:

  • Сергей Кузнецов. Почему я равнодушен к Linux

  • Глава из книги А.Федорчука
    Сага о FreeBSD:
  • Что надо иметь
    3. Базовые познания

    CitCity:

  • Управление IT-инфраструктурой на основе продуктов Microsoft

    15 октября

  • Методы бикластеризации для анализа интернет-данных

    CitCity:

  • Разъемы на ноутбуках: что они дают и зачем их так много?
  • AMD Puma и Intel Centrino 2: кто лучше?

    CITKIT.ru:

  • Новый цикл статей С.Голубева
    Железный марш:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:

    8 октября

  • Автоматизация тестирования web-приложений, основанных на скриптовых языках
  • Опыт применения технологии Azov для тестирования библиотеки Qt3

    Обзоры журнала Computer:

  • SOA с гарантией качества
  • Пикоджоуль ватт бережет
  • ICT и всемирное развитие

    CitCity:

  • Пиррова победа корпорации Microsoft

    CITKIT.ru:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:

    Статья из архива:

  • Я живу в FreeBSD (Вадим Колонцов)

    Новые Блогометки:

  • Перекройка шаблона Blogger или N шагов к настоящему
  • Blogger. Comment style
  • Screenie или глянцевый снимок экрана

    2 октября

    CITKIT.ru:

  • Сага о FreeBSD (А. Федорчук)

    Zenwalk: пакет недели

  • Банинг — интеллектуальное развлечение (С.Голубев)

    CitCity:

    25 сентября

  • Клермонтский отчет об исследованиях в области баз данных

    CITKIT.ru:

  • Пользователям просьба не беспокоиться... (В.Попов)

  • Снова про ZFS: диск хорошо, а два лучше
  • Командная оболочка tcsh (А.Федорчук)

    Zenwalk: пакет недели

    17 сентября

  • T2C: технология автоматизированной разработки тестов базовой функциональности программных интерфейсов
  • Технология Azov автоматизации массового создания тестов работоспособности

    CITKIT.ru:

  • FreeBSD: ZFS vs UFS, и обе-две — против всех (А.Федорчук)

    Zenwalk: пакет недели

  • Дачнет — практика без теории (С.Голубев)

    10 сентября

  • За чем следить и чем управлять при работе приложений с Oracle
  • Планировщик заданий в Oracle
    (В.Пржиялковский)

    CITKIT.ru:

  • Microsoft: ответный "боян" (С.Голубев)

  • Причуды симбиоза, или снова "сделай сам" (В.Попов)

  • Файловые системы современного Linux'а: последнее тестирование
  • Zsh. Введение и обзор возможностей
    (А.Федорчук)

    Описания пакетов Zenwalk: Zsh, Thunar, Thunar-bulk-rename, Xfce4-places-plugin, Xfce4-fsguard-plugin

    Блогометки:

  • Google Chrome
  • Лончер для ASUS Eee PC 701

    3 сентября

    CITKIT.ru:

  • Заметки о ядре (А.Федорчук):

    Добавлены описания пакетов Zenwalk: Galculator, Screenshot, Gnumeric, Pidgin

    В дискуссинном клубе:

  • И еще о Википедии и Google Knol

  • Лекция для начинающего линуксоида (С.Голубев)

    26 августа

  • Транзакционная память (Пересказ: С. Кузнецов)

    CITKIT.ru:

  • Открыт новый проект Zenwalk: пакет недели

  • Статья Текстовые процессоры и их быстродействие: конец еще одной легенды?

    21 августа

    CITKIT.ru:

  • Почему школам следует использовать только свободные программы (Ричард Столлман)
  • Беседа Сергея Голубева с учителем В.В.Михайловым

  • Википедия или Гуглезнание? Приглашение к обсуждению (Алексей Федорчук)
  • Народная энциклопедия от Google (StraNNik)

  • Обзор Mandriva 2009.0 Beta 1 Thornicrofti
  • Новичок в Линукс: Оптимизируем Mandriva 2008.1

  • Книга Zenwalk. Приобщение к Linux:

    13 августа

    CitCity:

  • Мирный Atom на службе человеку. Обзор платы Intel D945GCLF с интегрированным процессором
  • Обзор процессоров Intel Atom 230 на ядре Diamondville

  • iPhone - год спустя. Скоро и в России?

    CITKIT.ru:

  • Интермедия 3.4. GRUB: установка и настройка (из книги Zenwalk. Приобщение к Linux)

    6 августа

  • СУБД с хранением данных по столбцами и по строкам: насколько они отличаются в действительности? (Пересказ: С. Кузнецов)

    CITKIT.ru:

  • Интермедия 2.2. Что неплохо знать для начала (из книги Zenwalk. Приобщение к Linux)

  • И снова про шрифты в Иксах (А.Федорчук)

  • 20 самых быстрых и простых оконных менеджеров для Linux

  • Дело о трех миллиардах (С.Голубев)

    30 июля

  • OLTP в Зазеркалье (Пересказ: С. Кузнецов)

    CitCity:

  • Будущее BI в облаках?
  • Тиражные приложения и заказная разработка. Преимущества для заказчика
  • Дискуссия со сторонниками заказной разработки

    CITKIT.ru:

  • Новые главы книги Zenwalk. Приобщение к Linux:
  • Глава 8. Пакеты: средства установки, системы управления, системы построения
  • Глава 9. Zenwalk: репозитории, пакеты, методы установки

    23 июля

    CITKIT.ru:

  • Все против всех. 64 vs 32, Intel vs AMD, tmpfs vs ext3
  • Две головы от Intel

  • Zenwalk: обзор штатных приложений (глава из книги "Zenwalk. Приобщение к Linux")

  • Нормально, Григорий...

    16 июля

    Обзоры журнала Computer:

  • Перспективы и проблемы программной инженерии в XXI веке
  • Большие хлопоты с большими объемами данных
  • Перспективы наноэлектроники

    CITKIT.ru:

  • Интермедия о лицензиях (А.Федорчук. "Zenwalk. Приобщение к Linux")

  • Есть ли будущее у KDE?

  • Linux в школе: альтернативный вариант в задачах

  • Шифр (приключения агента Никодима)

    10 июля

    CITKIT.ru:

  • Новые разделы книги А. Федорчука Zenwalk. Приобщение к Linux:
  • Интермедия вступительная. Linux или GNU/Linux? Как вас теперь называть?
  • Глава 5. Среда Xfce
  • Глава 6. Xfce: приложения и плагины

  • ZUR (Zenwalk User Repository) FAQ

    2 июля

  • Персистентность данных в объектно-ориентированных приложениях (С. Кузнецов)

    CITKIT.ru:

  • Новые разделы книги А. Федорчука Zenwalk. Приобщение к Linux:
  • Интермедия 1.2. Дорога к Zenwalk'у. Период бури и натиска
  • Интермедия 3.3. Немного о Linux'е и "железе"
  • Глава 4. Настройка: инструментами и руками
  • Интермедия 4.1. Zenpanel и конфиги: поиски корреляции

  • Интервью с Жан-Филиппом Гийоменом, создателем дистрибутива Zenwalk

  • Linux в школе: первые итоги (С. Голубев)

    25 июня

    CITKIT.ru:

  • Zenwalk. Приобщение к Linux (А. Федорчук)

  • Логика и риторика (С.Голубев)

  • Технология Tru64 AdvFS

  • Ханс Райзер предлагает отвести полицейских к телу Нины

    18 июня

  • Проекты по управлению данными в Google (Пересказ: С. Кузнецов)

    CITKIT.ru:

  • ОС и поддержка "железа": мифы и реальность (А. Федорчук)

  • Linux в школе: другие дистрибутивы

  • Пинок (С. Голубев)

    4 июня

  • Ландшафт области управления данными: аналитический обзор (С. Кузнецов)

    CITKIT.ru:

  • Linux в школе: слово заинтересованным лицам

  • SlackBuild: пакеты своими руками

  • Linux от компании Novell. Установка и обзор openSUSE Linux

    Все публикации >>>




  • IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

    Информация для рекламодателей PR-акции, размещение рекламы — тел. +7 495 4119920, ICQ 232284597 Пресс-релизы — pr@citcity.ru
    Послать комментарий
    Информация для авторов
    Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
    Copyright © 1997-2000 CIT, © 2001-2007 CIT Forum
    Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...