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

25.02.2017

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

Обмен опытом

Кочетов Андрей, http://www.delphikingdom.com/

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

Предполагается, что читатели сего немного ориентируются в предмете обсуждения: этапах разработки ПО, объектно-ориентированной терминологии, а также в методах проектирования реляционных БД.

К статье прилагается архив, содержащий: модель данных, а также её графическое изображение - для читателей, не имеющих возможности запустить для анализа модели ERwin. Также прилагаются две подпапки: SQL - со сгенерированными скриптами, и BPL - со сгенерированными исходниками компонентов. А также, для полноты представления, - скрипт для создания БД.

Многим программистам время от времени приходится разрабатывать вполне тривиальные отчётно-учётные приложения, "заточенные" под нужды конкретных заказчиков. Системы учёта CD и кассет, складские, зарплатные, и прочие подобные проекты… Разработка их отнимает уйму времени, и можно впасть в отчаяние от осознания того факта, что все они слишком похожи по сути, чтобы тратить на них жизнь! Но и подработать хочется…

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

Следование простым, но эффективным правилам, описанным во второй части статьи, помогает справиться с ворохом проблем. Но от подкрепления орг.мер техническими средствами ещё никому не поплохело.

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

Это средство - генератор программного кода (тем более, что некоторый подобный опыт у меня уже был), который, имея "на входе" модель данных, спроектированную в ERwin, "на выходе" генерирует SQL-скрипты, содержащие триггеры и хранимые процедуры, а также файлы компонентов (.H, .CPP) для Borland C++ Builder. Для каждой сущности предметной области будет сформирован свой класс, имеющий все поля описанных типов, а также умеющий отображать себя на БД: сохраняться в базе и читать значения своих полей из БД, и "понимающий" связи между сущностями. Эти компоненты включаются в Package, который устанавливается на палитру компонентов, - и вот вам "строительные кубики", из которых можно складывать приложение!

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

И хотя платформа, которой я пользуюсь ("Firebird 1.5" + "Borland C++ Builder 6.0"), не находится на острие прогресса, данный подход позволяет поиметь некоторые дивиденды от тех знаний и умений, которыми я овладел ранее. То есть, окупить прежние капиталовложения.

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

И последнее. Не надо, спеша, вещать о том, что существуют-де системы проектирования приложений типа Rational Rose, и т.д. На рынке, наряду с магазинами готового платья, существуют также пошивочные ателье - и, как ни странно, не разоряются.

Поэтому я решил свою уже устоявшуюся технологию разработки БД-приложений (со всеми наворотами, реализующими парадигму повторного использования кода и ресурсов) дополнить последним мазком художника - кодогенератором, дающим "быстрый старт" процессу разработки.

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

Маленький пример: моим последним заказом была разработка системы учёта контрагентов/договоров/поставленного оборудования, и т.д. для ЗАО "…" (пока не получил их согласия на оглашение). Общий объём исходников первой версии приложения составил более 13.500 строк, из них около 3.500 строк было сгенерировано. По-моему, 25% программного кода, которые принесены вам "на блюдечке с голубой каёмочкой" - это совсем неплохо.

Итак, опишу вкратце этапы разработки, которые приходится выполнять каждый раз, когда затевается новый проект.

Как уже упоминалось, я привык разрабатывать свои приложения в двухзвенной архитектуре "клиент-сервер", с использованием СУБД "Firebird 1.5". Не буду расписывать преимущества клиент-серверной модели по сравнению с "настольными" реализациями; просто перечислю их: эффективность, скорость, масштабируемость, возможность многопользовательской работы, и т.д.

Вначале анализируется предметная область - из бесед с представителями заказчика, или путём высасывания из пальца. При этом выделяются сущности и взаимосвязи между ними; простой пример: сущность "Регион" имеет поле "Наименование"; сущность "Населённый пункт" также имеет поле "Наименование", ссылку на "Регион", в котором расположен нас. пункт (кажется, город Каменка есть в любом регионе России), а также, возможно, ссылку на тип населённого пункта (типы должны быть прописаны в справочнике). Между сущностями "Регион" и "Населённый пункт" существует отношение "один-ко-многим".

Уф, это только словами долго расписывать, а при проектировании модели данных, например, в ERwin, - это всего несколько манипуляций мышкой. В-общем, хорошо представляя себе предметную область, разрабатываем модель данных. К счастью, ERwin позволяет сгенерировать SQL-скрипт для создания БД.

Понятия предметной области на уровне абстракции приложения мы оформляем в виде "сущностей", которые в БД представляют собою таблицы и взаимосвязи между ними. Один из стандартов проектирования, которых я придерживаюсь: уникальный идентификатор каждой записи каждой таблицы (primary key) должен быть целым автоинкрементируемым полем, никак не связанным со смысловым наполнением: просто ID. Такой подход многое упрощает. Настолько многое, что это просто праздник какой-то!..

На уровне клиентской части сущности представляются, как классы с набором полей (полностью соответствующим полям в таблицах БД), методами очистки, чтения из БД и записи в БД. Хорошо бы ещё, чтобы классы как-то отслеживали межсущностные связи.

Для каждой сущности генерируется её отображение на платформу разработки. Для серверной части - это генератор, триггеры и процедуры; для клиентской - класс, который умеет обращаться к соответствующим сгенерированным процедурам. Генераторы и триггеры обеспечивают работу автоинкрементных идентификаторов средствами InterBase/Firebird.

Рассмотрим, например, сущность "Город". В скрипте "AutoGen.SQL" мы увидим строчки, создающие генератор для таблицы "CITY":

create generator GEN_ID_CITY;
set    generator GEN_ID_CITY to 0;

А в скрипте "AutoTrig.SQL" - триггер "BEF_ADD_CITY", срабатывающий при добавлении записи в эту таблицу, и автоматически задающий значение полю "ID_CITY". Генератор кода - это видно на скриншоте - позволяет задать тип каскадного воздействия для таблиц "Master-Detail" индивидуально для каждой сущности: при удалении записи в master-таблице все зависимые записи в detail-таблицах можно либо удалить, либо обNULLить в них ссылки на master-запись. Эта функциональность достигается генерацией соответствующих триггеров для каждой таблицы.

При удалении города из справочной таблицы CITY триггер "BEF_DEL_CITY" обнуляет ссылки на город в таблице "ENTERPRISE".

exchage_test_1.gif

А для сущности "Предприятие" (ENTERPRISE) метод каскадного воздействия был указан другой: в случае удаления предприятия будут удалены все данные, связанные с ним: документы, договора, контакты, представители, и т.д. (триггер "BEF_DEL_ENTERPRISE").

В скрипте "AutoProc.SQL" находятся сгенерированные процедуры чтения/записи для каждой сущности; в частности, для "Города" - это "GET_CITY" и "PUT_CITY". Причём каждая сущность знает, каким способом себя записать в БД: если экземпляр сущности уже существовал (ID_<сущность> IS NOT NULL), при сохранении будет выбран оператор "update", иначе - если в БД записывается новый экземпляр - будет использован "insert". Здесь-то и пригодилось нам абстрагирование идентификатора записи от смыслового значения: простой целый автоинкрементный ID - это просто подарок судьбы!

Ещё стоит заметить, что все параметры PUT-функции, представляющие собой ID'ы, автоматически нормализуются (им присваивается значение NULL, если оно было равно числовому нулю), что имеет значение для соблюдения ссылочной целостности.

Продолжим рассмотрение сущности "Город", но теперь уже на уровне клиентской части приложения. В папке "BPL" находятся исходники классов - "обёрток" для сущностей; вернее, компонентов. Во первых, в заголовочном файле описаны все поля нашей сущности, но теперь уже в терминах языка С++, а не языка описания данных.

Во вторых, генерируются методы "Clear", "Get" и "Put"; два последних обращаются к уже сгенерированным серверным GET- и PUT-процедурам.

В-третьих, для сущностей, находящихся в отношении "master-detail" (например, "Регион" - "Город"), реализовано "понимание" классами этих связей. Так, класс TPRCity ("Город") является контейнером для объекта класса TPRReg ("Регион"). Это позволяет в методах TPRCity->Get() и TPRCity->Clear() автоматически вызывать соответствующие методы экземпляра класса TPRReg.

Такой подход позволяет, вызвав метод Get() класса "Город", получить сразу и данные о регионе, в котором он расположен. А вызвав метод Enterprise->Get(), мы узнаем всё не только о предприятии, но и о городе (а значит, и регионе!), в котором расположено предприятие, а также наименование отрасли промышленности, к которой оно относится (см. модель данных и приведённые исходники).

Если в какой-либо сущности зависимостей больше, для всех из них будет сгенерирован соответствующий код.

"Имплантировать" классы "master-сущностей" в код классов "detail-сущностей" можно двумя способами (см. скриншот программы): в первом варианте (как в приведённых исходниках) объекты "master-сущностей" будут создаваться в объектах "detail-сущностей", как в контейнере.

Во втором варианте в коде компонента "detail-сущности" будут сгенерированы свойства-указатели на компоненты "master-сущностей". Использоваться это может следующим образом: в процессе проектирования формы на неё помещаются все нужные компоненты ("Город", "Регион", "Предприятие"), и между ними "наводятся мосты" с помощью свойств, указывающих на нужные компоненты. Выбор метода представления связей остаётся за разработчиком.

Вот и всё. Как говорил Высоцкий, "что я хотел сказать своими песнями, то я и сказал". То есть, исходники представлены; в вашей воле их рассматривать и оценивать.

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

Те программы, которые не слишком сильно отражают индивидуальность заказчика, представлены на сайте http://goldenask.narod.ru

Часть II

Описание генератора кода было бы неполным без объяснения, на какие вспомогательные классы опирается получающийся программный код.

Сгенерированные исходники компонентов так лаконичны и красивы по той причине, что все компоненты, описывающие сущности, происходят (наследуются) от компонента TAIEssence, код которого приведён в "прицепе".

Этот компонент инкапсулирует некоторые понятия и методы, общие для всех сущностей. Во-первых, мы приняли, что каждый объект сущности обладает целым уникальным идентификатором; поэтому в классе TAIEssence есть public-поле ID, и каждая сущность наследует его.

exchage_test_2.jpg

Во-вторых (см. рисунок), каждый компонент имеет свойства-указатели на:

  • БД
  • TIBQuery
  • TIBStoredProc
  • транзакции для чтения и записи (TrR, TrW)

Естественно, что каждый объект должен знать, какими манипуляторами ему пользоваться при работе с БД. Метод Notification обслуживает корректное функционирование этих свойств-манипуляторов.

Далее. Объект каждого класса должен знать, как называются серверные GET- и PUT-процедуры, а также их параметры. Для этого заведёны поля ENTITY_ID, PutProc, GetProc, P_ID, R_ID, которые инициализируются правильными значениями в момент присвоения имени сущности свойству ENTITY_NAME. А этот код создаётся генератором кода; в этом можно убедиться, взглянув на исходники предыдущей статьи. В конструкторе каждого компонента обязательно присутствует строка типа «ENTITY_NAME="USER";».

Компонент TAIEssence реализует метод InheritProperties, который устанавливает упомянутые свойства-манипуляторы для всех объектов, динамически создаваемых в текущем классе, как в контейнере (см. исходники к предыдущей статье).

Следующий полезный метод, который позволяет лаконично выражать свои действия классам-потомкам, - это Prepare(). Этот метод подготавливает к исполнению хранимую процедуру с заданным именем. Предварительно процедуре "подсовывается" транзакция, "заточенная" под задачи процедуры: чтение или запись в БД.

Мы плавно подошли к рассмотрению "хитрых" свойств TrR, TrW (типа TAskIBTransaction, который рассмотрим ниже), которые также наследуются сущностями. Эти свойства возвращают наиболее подходящую транзакцию для выполнения какого-либо запроса/процедуры.

Кроме того, каждый экземпляр любой сущности обладает унаследованным от TAIEssence методом с приятным названием Del(). Его функциональность очевидна: каждая сущность должна уметь удалить себя из БД (помимо умений прочитать и записать себя в БД).

Теперь опишем тип TAskIBTransaction, производный от TIBTransaction. Он позволяет более свободно работать с БД, и писать меньше кода; свойства PtrTranR, PtrTranW каждого компонента указывают именно на транзакцию этого типа.

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

Мы можем в клиентском приложении написать следующий код:

try {
    DM->TrW->StartTransaction();
      ScreenToEnterprise(); Enterprise->Put();
      
      PutContacts(); PutPersons(); PutPersContactsToDB(); 
      PutContracts(); PutOffers(); PutDocs();
    DM->TrW->Commit();
      }
  catch(EIBInterBaseError &E) {
    DM->TrW->Rollback(); throw;
                              }

А внутри метода Put() каждого компонента-сущности уже сгенерирован код:

try {
    TranW->StartTransaction();
      Prepare(PutProc, ettWrite);
        PtrStoredProc->ParamByName(P_ID)->AsInteger = ID;
        <…>
      PtrStoredProc->ExecProc();
        ID = PtrStoredProc->ParamByName("R_ID_ENTERPRISE")->AsInteger;
      PtrStoredProc->Close();
    TranW->Commit();
      }
  catch(EIBInterBaseError &E) {
    TranW->Rollback(); throw;
                              }

То есть, если PtrTranW компонента указывает на DM->TrW (а обычно так оно и есть), мы можем не писать код, анализирующий, активна ли транзакция, и предпринимающий в соответствии с её состоянием, какие-либо действия.

Соответственно, подобный код не нужен и при завершении транзакции (Commit или Rollback).

Эта возможность обеспечивается отслеживанием глубины вызовов "старта" и окончания транзакции, и выполнением соответствующих методов (StartTransaction() и Commit() или Rollback()) только при первом (последнем) вызове.

Таким образом, этот простенький механизм позволяет не заморачиваться техническими вопросами, а спокойно ваять приложение, справедливо полагая, что механизм "вложенного" вызова транзакция сам во всём разберётся.

Вообще-то, осталось ещё несколько компонентов, облегчающих работу с БД InterBase/Firebird, но их описание отложим "на потом".

Программы, разработанные с использованием описанной методики, "живут" на сайте http://goldenask.narod.ru

К материалу прилагаются файлы:

Исходные коды, sql-скрипты и схемы. (182 K)
Исходный код модулей (2 K)

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