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

23.03.2017

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

State-full Web Services на Delphi

Александр Шагин, ведущий программист отдела "ИНФОВУЗ", Волгоградский Государственный Педагогический Университет

Введение

Среда Borland Delphi (версии 6 и 7) предоставляет достаточно удобные инструменты по созданию Web Services application. В сочетании с технологией Midas у программиста есть очень эффективный инструмент по созданию N-звенных приложений доступа к корпоративным БД. Тем не менее реализация Web Services в Delphi содержит некоторые существенные ограничения, которые, в целом оправданы, но при переходе на новую платформу, будут вызывать у программистов, привыкших работать с TDCOMConnection, TSocketConnection и т.п. дополнительные сложности. SOAP Server applications - это, в общем случае, statelss приложения - сервер не хранит информацию о предыдущих вызовах клиента, что не позволяет использовать привычный подход и технологию программирования, а тем более говорить о прозрачном переходе на новый тип соединения(Например,так как это происходит при переходе с TDCOMConnection на TSocketConnection или наоборот). Конечно, отсутствие statefull-объектов на сервере оправдывается тем, что потенциально Web Services должны будут обрабатывать огромное количество входящих соединений, и выделение для каждого из них оперативной памяти приведет, в конце концов, к выводу сервера или сервиса из строя, но тем не менее отсутствие прозрачного механизма портации существующих проектов(если, конечно, таковая вообще требуется) может остановить от реализации этой идеи даже очень опытных программистов.

В процессе работы у нас возникла следующая задача. Корпоративная система работала в пределах локальной сети. Соеденение клиентов осуществлялось с помощью SocketConnection, что обеспечивало вполне приличную скорость и масштабируемость. Со временем появились новые удаленные рабочие места, но соеденение по локальной сети установить уже не было возможности, только Internet. Требовалось обеспечить работу пользователей в точности с тем же набором приложений (чтобы не приходилость дополнительно тратить времени на обучение по работе с новым софтом или на дополнительную организацию их взаимодействия с основной корпоративной системой), который они использовали ранее. Для коммуникации клиентских приложений с основным сервером идеально подходил SOAP-протокол, но отсутствие statefull соединений могло сильно затянуть время адаптации серверов приложений. Посколько в параллельных проектах уже был опыт использования Web Services , и появление вышеобозначенных проблем вполне предсказывалось, велась разработка механизма прозрачного перевода MIDAS-серверов и клиентов на использование протокола SOAP. Детали, проблемы и подходы в решении этой задачи я бы и хотел осветить в этой статье.

Проблемы и их решения.

Основной проблемой, с которой приходится изначально бороться - это отсутствие сессионности между вызовами клиента. От кого пришел запрос, в общем случае, однозначно понять практически невозможно. В интернете содержится достаточно много публикаций на эту тему и подход (пример: Managing sessions with Delphi 6 Web services , Building Real-Life Web Services), в общем-то, для решения проблемы един: создание на стороне сервера постоянно существующий объект: менеджер сессий. Как следствие - application server должен быть постоянно загружен на web-сервере или самостоятельно выполнять его функцию.

Следующая проблема - это обеспечение прозрачного вызова базовых методов интерфейса IAppServer с клиента соответствующих методов требуемого провайдера(TCustomProvider) на сервере в контексте сессии. Решением данной проблемы является создание наследника от TCustomRemoteServer, который инкапсулирует данные(контекст сессии) и методы по взаимодействию с менеджером сессий средствами SOAP-протокола. На стороне сервера создается наследник от TInvokableClass (TSOAPSessionManeger), и соответствующий ему IInvokable интерфейс ISOAPSessionManeger, который реализует базовые, но модифицированные, методы интерфейса IAppServer, и дополнительные методы, необходимые для авторизации, контроля состояния и др. .

 1: ISOAPSessionManeger = interface(IInvokable)
 2:   ['{59AD0E15-EF0F-4DF3-A782-18B5FEC70AC4}']
 3:   {IAppServer support}
 4:   function  WS_AS_ApplyUpdates(const SessionID:WideString; const ProviderName: WideString; Delta: OleVariant;
 5:                                MaxErrors: Integer; out ErrorCount: Integer; var OwnerData: OleVariant): OleVariant;  stdcall;
 6:   function  WS_AS_GetRecords(const SessionID:WideString; const ProviderName: WideString; Count: Integer; out RecsOut: Integer;
 7:                              Options: Integer; const CommandText: WideString;
 8:                              var Params: OleVariant; var OwnerData: OleVariant): OleVariant; stdcall;
 9:   function  WS_AS_DataRequest(const SessionID:WideString; const ProviderName: WideString; Data: OleVariant): OleVariant; stdcall;
10:   function  WS_AS_GetProviderNames(const SessionID:WideString): TWideStringDynArray;  stdcall;
11:   function  WS_AS_GetParams(const SessionID:WideString;const ProviderName: WideString; var OwnerData: OleVariant): OleVariant; stdcall;
12:   function  WS_AS_RowRequest(const SessionID:WideString; const ProviderName: WideString; Row: OleVariant; RequestType: Integer;
13:                             var OwnerData: OleVariant): OleVariant;  stdcall;
14:   procedure WS_AS_Execute(const SessionID:WideString; const ProviderName: WideString; const CommandText: WideString;
15:                           var Params: OleVariant; var OwnerData: OleVariant); stdcall;
16:   {Authorithation support}
17:   function  WS_Login(const AUserName, APassword: WideString ; var SessionID, ErrMsg:WideString):Integer; stdcall;
18:   function  WS_Logout(const SessionID:WideString):Integer; stdcall;
19:   function  WS_GetSessionState(const SessionID:WideString):Integer;stdcall;
20:   {Data-exchange support}
21:   function  WS_GetValue(const SessionID, AName: WideString):OleVariant;stdcall;
22:   procedure WS_SetValue(const SessionID, AName: WideString; const AData: OleVariant);stdcall;
23:   function  WS_CallMethod(const SessionID, MethodName: WideString; const Params: OleVariant):OleVariant;stdcall;
24:   end;

Базовым понятием в данной модели является понятие сессии (класс TWSSession) . Сессия - это объект, который идентефицирует клиетское соединение на стороне сервера, ассоциирует с ним наборы модулей данных(наследники TDataModule), обеспечивает регистрацию провайдеров из соответствующих модулей, вызов базовых методов интерфейса IAppServer, и методы авторизации для конкретной сессии. Ключевые понятия сессии:

  • SessionID - id сессии в менеджере сессий.
  • UserName, Password - данные для авторизации.
  • AppID - наименование набора классов(модулей данных), которые будут создаваться при регистрации нового клиента. AppID вместе с SessionID клиент передается в заголовке каждого SOAP-сообщения на сервер.

Для того, чтобы определить, какие модули данных необходимо создавать для данного AppID - их классы предварительно регистрируются. Поскольку интерфейс ISOAPSessionManeger является своеобразным "переходником" между клиентом и стандартным интерфейсами IAppServer посредством менеджера сессий, обеспечивая бинарную совместимость передаваемых пакетов данных, что позволяет прозрачно вызывать методы провайдеров уже в контексте сессии(т.е. только из тех дата-модулей, которые определены для данного AppID в конкретной сессии)

Вызов методов IInvokable интерфейсов в котнексте сессии. Для решения этой проблемы пришлось изменить стандартное поведение класса TSoapPascalInvoker. При определении экземпляра объекта для выполнения метода, запрашиваемого клиентом интерфейса, Delphi ищет в собственном реестре(объект InvRegistry) класс, его реализующий, а затем создает его экземпляр(Per request), или процедуру, возвращающую ссылку на этот объект(Global). Поскольку в каждом SOAP-сообщении содержится SessionID, можно определить сессиию клиента, и как следствие, получить ссылки на дата-модули, существующие в ее контексте. Далее находим дата-модуль, реализующий запрашиваемый интерфейс и возвращаем на него ссылку. Далее работает стандартная схема, а метод уже вызывается именно в контексте сессии. Поскольку предварительно мы реализуем стандартный код, вышеприведенные изменения ни в коем случае не изменяют установленного поведения компонентов и их методов. Таким образом задача создания своих собственных state-full объектов с поддержкой сессий становится тривиальной задачей: Создание наследника TDataModule TMyDM, объявление IInvokeble интерфейса IMyIntf и его регистрация в InvRegistry, включение интерфеса IMyIntf в класс TMyDM и его регистрация в системе(WSReg.RegisterDataModule(TMyDM,'MyApp')), реализация методов интерфейса.

Неожиданной оказалась проблема автоматического включения в каждый заголовок SOAP-сообщения идентификационной информации. Класс TRIO не содержит событий, которые позволили добавить в заголовок нужную информацию c использованием сдандартных для этого методов(Класс TSOAPHeader). Событие OnBeforeExecute вызывается уже полсе того, как заголовки упакованы в сообщение. Исходный код TRIO пришлось модифицировать, добавлением события OnBeforeRequest(добавить метод DoBeforeRequest) и полученный класс TWSRIO использовать в классе TwssSoapConnection(наследник TCustomRemoteServer, реализующий взаимодействие сервером приложений). Вызов удаленных методов интерфейсов предпочтительно осуществлять с использованием этого класса, или же, для компонента TRIO самостоятельно добавлять нужные заголовки(класс TWSSHeader).

Как следствие, вышеприведенных изменений вполне достаточно как для портации серверных приложений на базе TRemoteDataModule под Web Services, так и создания новых state-full, state-less Web Services приложений в привычных для программиста условиях.

Дополнительные особенности.

В процессе работы, к стандартному механизму SOAP, были добавлены такие возможности как:

  • сжатие передаваемого по сети контента(используется библитека ZLib);
  • так называемые NotifyEvents для модулей данных.
  • вызов удаленных методов минуя IInvokable интерфейсы(wssIntf.pas : IModuleAuth.CallMethod).

Реализация

Исходники и примеры здесь(112 Кб). Для реализации примера установите у себя пакет wss.dpk. Пропишите необходимые пути в Library Path.

Пример

Сервер

Сервер будем реализовывать как standalone Web Service(Требуется библиотека Indy).

  1. Создаем консольное приложение.
  2. Добавляем к нему TDataModule.
  3. Объявляем интерфейс(Классом реализации будет наш дата-модуль):
     1: { Invokable interface IWSSTest }
     2: 
     3: unit WSSTestIntf;
     4: 
     5: interface
     6: 
     7: uses InvokeRegistry, Types, XSBuiltIns;
     8: 
     9: type
    10: 
    11:   { Invokable interfaces must derive from IInvokable }
    12:   IWSSTest = interface(IInvokable)
    13:   ['{15907745-68B1-47A3-86A6-9EF2A3530493}']
    14: 
    15:     { Methods of Invokable interface must not use the default }
    16:     { calling convention; stdcall is recommended }
    17:     function TestMethod(const s : string): string ;stdcall;
    18:   end;
    19: 
    20: implementation
    21: 
    22: initialization
    23:   { Invokable interfaces must be registered }
    24:   InvRegistry.RegisterInterface(TypeInfo(IWSSTest));
    25: 
    26: end.
    
  4. Реализуем поддержку нашего интерфейса в дата-модуле:
     1: unit Unit2;
     2: 
     3: interface
     4: 
     5: uses
     6:   SysUtils, Classes, WSSTestIntf,
     7:   WSObj{WSS Core};
     8: 
     9: type
    10:   TDataModule2 = class(TDataModule, IWSSTest, IWSSessionNotifyEvents)
    11:   private
    12:     { Private declarations }
    13:     //добавление совершенно не обязательно, но удобно, а иногда и полезно:)
    14:     procedure  WSSessionNotifyEvent(const SessionClient : TWSSesClient;
    15:                                              const EventName : string;
    16:                                              const Data: OleVariant);
    17:   public
    18:     { Public declarations }
    19:     function TestMethod(const s : string): string ;stdcall;
    20:   end;
    21: 
    22: var
    23:   DataModule2: TDataModule2;
    24: 
    25: implementation
    26: 
    27: {$R *.dfm}
    28: 
    29: { TDataModule2 }
    30: 
    31: function TDataModule2.TestMethod(const s: string): string;
    32: begin
    33:   Result := 'Hello from server: '+ s;
    34:   writeln('Method call: '+ s);
    35: end;
    36: 
    37: procedure TDataModule2.WSSessionNotifyEvent(
    38:   const SessionClient: TWSSesClient; const EventName: string;
    39:   const Data: OleVariant);
    40: begin
    41:   writeln('EVENT:',EventName,' - sessionid:',SessionClient.SessionID);
    42: end;
    43: 
    44: end.
    
  5. Модифицируем dpr-файл как показано ниже.
     1: program Project2;
     2: 
     3: {$APPTYPE CONSOLE}
     4: 
     5: uses
     6:   SysUtils,
     7:   IndyHttpServerApp,{Под Apache2 заменить на Apache2ServerApp}
     8:   WSSTestIntf in 'WSSTestIntf.pas',
     9:   Unit2 in 'Unit2.pas' {DataModule2: TDataModule};
    10: 
    11: begin
    12:   { TODO -oUser -cConsole Main : Insert code here }
    13:   ServerApplication.Initialize;
    14:   {register TDataModule2 class for AppID="TEST"}
    15:   ServerApplication.RegisterDataModuleClass(TDataModule2,'TEST');
    16:   ServerApplication.Run;
    17: end.
    
  6. Готово. Запускаем сервер.
  7. Видим Service Info Page страницу по адресу: http://localhost:8888/
Клиент
  1. Создаем новый проект.
  2. На форме распологаем компонент TwssSoapConnection. Устанавливаем значения свойств как приведено на скриншоте.
  3. При помощи утилиты WSDL Importer импортируем в наш проект модуль с описанием интерфейса IWSSTest(получаем модуль IWSSTest1.pas).
  4. Устанавливаем: wssSoapConnection1.URL=http://localhost:8888/soap, wssSoapConnection1.AppID="TEST" и заполняем поля wssSoapConnection1.SessionUserName и wssSoapConnection1.SessionPassword.
  5. Пишем обработчики для кнопок:
     1: unit Unit1;
     2: 
     3: interface
     4: 
     5: uses
     6:   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     7:   Dialogs, StdCtrls, DB, DBClient, wssSoapConn;
     8: 
     9: type
    10:   TForm1 = class(TForm)
    11:     wssSoapConnection1: TwssSoapConnection;
    12:     Button1: TButton;
    13:     Label1: TLabel;
    14:     Button3: TButton;
    15:     procedure Button1Click(Sender: TObject);
    16:     procedure Button2Click(Sender: TObject);
    17:     procedure Button3Click(Sender: TObject);
    18:   private
    19:     { Private declarations }
    20:   public
    21:     { Public declarations }
    22:   end;
    23: 
    24: var
    25:   Form1: TForm1;
    26: 
    27: implementation
    28: 
    29: uses IWSSTest1;
    30: 
    31: {$R *.dfm}
    32: 
    33: procedure TForm1.Button1Click(Sender: TObject);
    34: begin
    35:   wssSoapConnection1.Open;
    36:   Label1.Caption := wssSoapConnection1.SessionID;
    37: end;
    38: 
    39: procedure TForm1.Button2Click(Sender: TObject);
    40: begin
    41:   wssSoapConnection1.Close;
    42: end;
    43: 
    44: procedure TForm1.Button3Click(Sender: TObject);
    45: begin
    46:   ShowMessage( (wssSoapConnection1.RIO as IWSSTest).TestMethod('Client.'));
    47: end;
    48: 
    49: end.    
    
  6. Готово. Запускаем.
    Клиент:

    Сервер:

Исходный код примера здесь.(11,7Kb)

Переход от TXXXConnection к TwssSoapConnection

Клиент
  1. TXXXConnection заменяется на TwssSoapConnection.
  2. Вызовы методов через TCustomRemoteServer.AppServer заменяются на TwssSoapConnection.RIO as IMyAppIntf.
Сервер
  1. Создаем серверный проект как показано в примере.
  2. Добавляем к проекту TRemoteDataModule.(Меняем наследника на TDataModule)
  3. Убираем все, что связано с DCOM.(Factrory и прочее...)
  4. На базе You Project_TLB.pas создаем IInvokeble интерфейс и объявляем его поддержку для модуля данных.
  5. Выполняем ServerApplication.RegisterDataModule(TMyDM,'MyApp');

Заключение

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

Оригинал статьи на странице автора

Размещение рекламы — тел. +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
    Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...