Моя дюжина книг
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Наука и технологии
Подписка
Где купить
Авторам
Рекламодателям
Магазин
Архив номеров
Вакансии
Контакты
   

  Опросы

Какие курсы вы бы выбрали для себя?  

Очные
Онлайновые
Платные
Бесплатные
Я и так все знаю

 Читать далее...

1001 и 1 книга  
20.12.2019г.
Просмотров: 5031
Комментарии: 0
Dr.Web: всё под контролем

 Читать далее...

04.12.2019г.
Просмотров: 6283
Комментарии: 0
Особенности сертификаций по этичному хакингу

 Читать далее...

28.05.2019г.
Просмотров: 7527
Комментарии: 2
Анализ вредоносных программ

 Читать далее...

28.05.2019г.
Просмотров: 7855
Комментарии: 1
Микросервисы и контейнеры Docker

 Читать далее...

28.05.2019г.
Просмотров: 6903
Комментарии: 0
Django 2 в примерах

 Читать далее...

Друзья сайта  

Форум системных администраторов  

sysadmins.ru

 Моя дюжина книг

Статьи / Моя дюжина книг

Автор: Алексей Вторников

Когда-то, не помню от кого, я услышал фразу «Каждому человеку достаточно прочесть только двенадцать книг. Главное – правильно их выбрать». Хотя автор фразы, разумеется, несколько утрировал, но его мысль очевидна: из кучи литературного мусора нужно отобрать всего-то дюжину книг. Однако, осуществить это «всего-то» оказалось для меня делом далеко не простым. Я расскажу о том, как формировал свою дюжину избранных книг по программированию.

Польза не во многих, но в хороших книгах

Луций Анней Сенека

Когда-то, не помню от кого, я услышал фразу «Каждому человеку достаточно прочесть только двенадцать книг. Главное – правильно их выбрать». Хотя автор фразы, разумеется, несколько утрировал, но его мысль очевидна: из кучи литературного мусора нужно отобрать всего-то дюжину книг. Однако, осуществить это «всего-то» оказалось для меня делом далеко не простым. Я расскажу о том, как формировал свою дюжину избранных книг по программированию.

Переплетная логика

Давным-давно моя знакомая, работавшая программистом в одном из «ящиков» (для тех, кто не знает – так в советские времена назывались оборонные лаборатории, институты и заводы), попросила сделать копию книги английских авторов У.Клоксина и К.Меллиша «Программирование на языке Пролог». Множительная техника в этом «ящике» находилось под неусыпным надзором болвана-отставника, который зорко следил за тем, чтобы не только важные документы, но даже невинные кулинарные рецепты и выкройки ни в коем случае не могли быть скопированы без его ведома. Объяснять этому сторожу зачем ей была нужна копия книги, взятой в библиотеке того же «ящика», было бессмысленно и унизительно, поэтому она обратилась ко мне.

Книга была не прошита, а склеена, поэтому мне пришлось распотрошить ее на отдельные страницы. После копирования книгу следовало привести в божеский вид, так что я, поневоле, стал на время переплетчиком. И, автоматически – читателем.

Книга У.Клоксина и К.Меллиша показала мне, что программирование – это конструктивный процесс, позволяющий строить собственные модели мира. Программирование на Прологе заключается в задании аксиом (в Прологе они называются фактами) и правил вывода; затем нужно было указать цель (что именно следовало доказать), а дальше все шло само собой: программа строила доказательство, рекурсивно порождая гипотезы и проверяя их одну за другой, откатываясь при необходимости назад и выбирая новые ветки дерева доказательства.

Конечно, программирование на Прологе выглядит не так просто: этот язык далеко не прост. В частности, для повышения эффективности поиска в пространстве решений приходилось использовать нелогический оператор «отсечения» (англ. «cut»). Вот так началась моя коллекция «сакральных» книг по программированию.

Дисциплина или наука

Примерно в это же время мой приятель показал мне книгу Э.Дейкстра «Дисциплина программирования», сопроводив свой рассказ восторженными отзывами. Разумеется, я не мог удержаться, чтобы не прочесть ее, но увы – книга не произвела на меня того впечатления, которого я ожидал. Одни главы были, на мой взгляд, блестящими, другие – невыносимо скучными. Так что я не без сожаления и некоторого презрения к самому себе отложил книгу, решив вернуться к ней позже. Теперь я понимаю, что эта книга предназначалась для зрелого программиста: именно зрелого, а не просто опытного. Но тогда я был зеленым новичком и не сумел по достоинству оценить пионерскую работу Э.Дейкстра. И тут опять вмешался случай.

Волей обстоятельств однажды я оказался в одном букинистическом магазине, где была полка с книгами по программированию. Перебирая книги, я натолкнулся на книгу Д.Гриса с интригующе знакомым названием «Наука программирования». О том, что программирование может быть искусством я, конечно, знал (книги Д.Кнута). О том, что программирование может быть дисциплиной – тоже (книга Э.Дейкстра). Я решил купить книгу, что называется, «на всякий случай». Случай оказался на редкость удачным.

«Наука программирования» оказалась фактически адаптацией книги Э.Дейкстра. С точки зрения математики она несколько сложнее своей «прародительницы», но вся необходимая математика содержалась в ней самой. Философских отступлений, которыми ценна так книга Э.Дейкстра, в книге Д.Гриса практически не было, но зато было технически грамотное и последовательное введение в методологию доказательств правильности программ и спецификации алгоритмов на языке логики предикатов.

Чтение «Науки программирования» заняло у меня несколько месяцев. Подобно ершику для чистки бутылок, книга Д.Гриса в буквальном смысле слова «промыла» мне мозги, после чего книга Э.Дейкстра приобрела новое значение и я, наконец, стал понимать мотивы автора «Дисциплины программирования» и оценил (пусть и не сразу) ее новизну.

Ортогональный ассемблер

Те, кто застал старые времена, должен помнить, что в конце 80-х и начале 90-х годов прошлого столетия были весьма популярными не IBM-совместимые компьютеры, многие из которых можно было спаять «на коленке», в домашних условиях.

У меня тоже был такой компьютер (правда, не самодельной, а заводской сборки) под гордым именем БК-0010 («БК» означало «бытовой компьютер»). В целом компьютер не представлял ничего особенного за одним исключением – его архитектура была заимствована у архитектуры знаменитой линейки миникомпьютеров PDP-11, производившихся корпорацией DEC.

Программировать на встроенных языках BASIC и FOCAL мне достаточно быстро надоело. Но можно было еще программировать в машинных кодах (именно в машинных кодах – полноценные ассемблеры, разработанные энтузиастами, появились позже). Понятно, что нужно было грамотное и полное описание архитектуры PDP-11. Руководство системного программиста из комплекта поставки БК-0010 было невнятным (по крайней мере, я лично практически ничего из него не понял). Однако имелись несколько книг, переведенных на русский язык, и одна из них – книга Т.С.Фрэнка «PDP-11. Архитектура и программирование». Книга написана так мастерски, что учиться программированию по ней можно было даже без компьютера.

Я до сих пор помню и восхищаюсь инженерным гением тех, кто разработал эту архитектуру. Откровенно говоря, царящая ныне почти повсеместно архитектура INTEL производит в сравнении с архитектурой PDP-11 унылое и безрадостное зрелище. Сама INTEL-ская архитектура напоминает кошмарный сон обитателей чеховской палаты номер 6. Архитектура PDP-11 был проста как струганная доска, но за этой простотой скрывалась небольшая, но мощная система команд (практически не имевшая исключений, из-за чего она и получила эпитет «ортогональная», т.е. непосредственно отображаемая на память), очень практичная система адресации, логичная система ввода/вывода, основанная на концепции общей шины. Переход на PDP-11 занимал максимум неделю: достаточно было изучить организацию памяти и внимательно разобрать с десяток примеров. Удовольствие от программирования для PDP-11 нельзя описать: настолько это было красиво, логично и увлекательно. Именно поэтому я храню эту книгу среди избранных.

Конечно, PDP-11 уже давно сняты с производства. И причина здесь не столько в безусловных архитектурных или технологических преимуществах других архитектур, сколько в бездарном менеджменте руководства DEC, не сумевшего в начале 80-х годов разглядеть наступление эры персональных компьютеров. Так настоящий шедевр был загублен, но остались книги, свидетельствующие о выдающемся достижении его инженеров и программистов.

Грамматики и трансляция

Наверное, многие программисты, писали (или по крайне мере, пытались) написать свои языки программирования. Для многих этот этап был пройден еще во время учебы, другие (и я в том числе) осваивал эту премудрость самостоятельно. Выбор книг по этой тематике был тогда скромным, но спасибо советским издательствам – они перевели (и, кстати, очень хорошо перевели) практически все достойное. Одна из них – книга уже упоминавшегося Д.Гриса – «Конструирование компиляторов для цифровых вычислительных машин». Собственно, сама книга не нуждается в рекомендациях: все, кто профессионально занимается вопросами трансляции языков программирования, о ней, по крайней мере, должны были слышать. Книга, конечно, порядком устарела и далеко не отвечает современным требованиям. Но для начального объяснения «на пальцах», что такое грамматики, сканеры, синтаксический анализ, генерация кода, организация памяти, таблицы символов и многое другое – книга, на мой взгляд, остается непревзойденным по ясности и широте охвата пособием. Если разрабатываемый вами язык не является чересчур уж изощренным, книга Д.Гриса вполне может служить настольным пособием: произведение искусства скорее всего не получится, но работать ваш транслятор будет, а это, в конце концов, главное.

Анатомирование языков программирования

Сегодня никого не удивить обилием книг, посвященных обзору и обсуждению языков программирования и отдельных их особенностей (управлению памятью, системой типов и проч.). Но мне, как ни покажется странным, больше всего дорога старая (1979) и порядком потрепанная книга Т. Пратта «Языки программирования. Разработка и реализация». Сразу замечу, что переиздание (2005) этой книги сделало ее, на мой взгляд, хуже, поэтому я буду говорить только о первом издании.

Книга удивительно ясно (до такой степени ясно, что остается только завидовать умению автора излагать действительно сложные вещи простым, но не вульгарным языком) рассказывает об основных особенностях распространенных (по состоянию на конец 70-х годов прошлого столетия) языков. Понятно, что многие из этих языков давно стали достоянием истории (например, ALGOL и PL/1). Но, отойдя в тень, эти языки оставили богатое наследство и, по большому счету, очень и очень многое из того, что было актуальным более 30 лет назад, продолжает оставаться актуальным и сегодня. Т.Пратт увлекательно рассказывает, почему были приняты те или иные решения, как эти решения были воплощены, какие проблемы трансляции пришлось решать. Благодаря этой книге я сумел преодолеть робость перед устрашающими академическими описаниями и учебниками: понимая, что на самом деле происходит «за ширмой», легче усваиваются непонятные и немотивированные на первый взгляд особенности, принятые разработчиками того или иного языка. До этой книги изучение мною каждого нового языка программирования напоминало просмотр неподготовленным зрителем спектакля японского театра Кабуки: не зная определенных правил и условностей, принятых в нем, невозможно следить за игрой актеров, оценить их мастерство и глубину пьесы.

Конечно, книга Т.Пратта во многом устарела. В ней нет ни слова о новомодных языках объектно-ориентированного программирования, SQL и уж тем более о языках для WEB. Книга описывает то, что было актуальным именно в то время и не более того. Но я благодарен этой книге за ясность, которую она внесла в мои разрозненные знания.

Три плюс два и еще чуть-чуть = Лисп

Книг по Лиспу в частности и по функциональному программированию в целом всегда не хватало. Это верно как сегодня, так, тем более, и раньше. Поэтому неудивительно, что книга английского математика П.Хендерсона «Функциональное программирование. Применение и реализация» сразу привлекла мое внимание. Можно было бы подумать, что и на безрыбье рак рыба, но эта книга, как я понимаю даже по прошествии стольких лет, действительно, была и остается хороша.

П.Хендерсон начинает с самого начала и описывает небольшой диалект Лиспа, называемый в книге «строго функциональным языком». Диалект, действительно, небольшой: три основные списковые операции (CAR, CRD и CONS), два предиката (EQ и ATOM), плюс конструкции для образования новых определений функций и арифметика. Все, больше ничего. Затем автор строит вместе с читателем несколько нетривиальных программ (обращаю внимание, что готовые решения не появляются как кролики из рукава фокусника, а именно ищутся методом проб и ошибок, что делает читателя соавтором процесса). Самая, пожалуй, ценная часть книги – это подробное описание т.н. SECD-машины П.Лэндина (грубо говоря, ассемблера для функциональных программ) и реализация применяемого строго функционального языка в виде процедур и функций на ALGOL-подобном языке программирования.

Если у читателя хватит терпения и усидчивости, то к концу книги он будет полностью вознагражден пониманием того, как программировать на Лиспе и методах его реализации (включая сборку мусора).

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

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

И последние будут первыми

Речь, как, возможно, догадался проницательный читатель, идет о стеке – структуре данных, подчиняющейся дисциплине «последним вошел – первым вышел» (иначе – «LIFO»). Вернее, речь пойдет о самом, наверное, необычном, как мне кажется, языке – Форте. Мое знакомство с Фортом началось, как, наверное, и у подавляющего большинства русскоязычных читателей, с маленькой книжицы С.Н.Баранова и Н. Р. Ноздрунова «Язык Форт и его реализации». И, похоже, все, кто дал себе труд прочесть эту книгу внимательно, на всю жизнь остались зараженными «бациллой» стековых языков программирования.

Трудно найти язык проще Форта – он практически лишен синтаксиса. Данные обрабатываются на стеке. На Форте можно сделать все: хотите обработку списков – пожалуйста, нуждаетесь в ООП – нет проблем, желаете «обмолотить» данные от датчиков – проще не бывает, ассемблерные вставки – легче легкого.

Форт относится к редкому классу саморасширяющихся систем программирования: маленькое ядро (действительно маленькое – нередко пара/тройка килобайт) без труда дополняется недостающими функциями (в Форте они называются «словами»), хранящимися в специальном списке-словаре. Программист сохраняет абсолютный контроль за всеми аспектами поведения Форт-системы. Но одновременно трудно найти язык сложнее Форта. И именно из-за его поразительной гибкости и миниатюрности. Форт дозволяет многое (точнее говоря – все), но предъявляет повышенные требования к программисту. Программисты на Форте – это особая порода. Изучить основы Форта можно за пару часов. Если он вас зацепит, то будьте уверены – это навсегда; от этой «заразы» вы не избавитесь, как бы ни старались. Вы будете программировать что угодно, где угодно и на чем угодно, но будете раз за разом возвращаться к Форту хотя бы ради своего удовольствия.

Попробуйте поработать с Фортом и решите сами – нужен он вам или нет, но помните – о последствиях я вас предупредил.

K&R

Аббревиатура K&R должна быть знакома всем, кто использует язык программирования C. Об этой книге (для тех, кто в танке, все же напомню, что речь идет о книге «Язык программирования C» Б.Кернигана и Д.Ритчи) рассказывать, собственно, нечего – если эта книга вас не зацепила, то C – не ваш язык: язык C пленяет вас либо сразу, либо – никогда. Если C не ваш язык, то это, разумеется, ни в коей степени не говорит о том, что ваша программистская карьера неудачна; просто так получилось. Конечно, сегодня, когда балом правят многочисленные монструозные объектно-ориентированные языки программирования (такие, например, как Java или C#), старый добрый C выглядит некоторым анахронизмом, но, однако, на этом «анахронизме» по сию пору разрабатываются базы данных и операционные системы, а это уже о чем-то да говорит.

Я ценю K&R (как, впрочем, и многие мои коллеги) за удивительную лаконичность и мастерство, с которым авторы (один из которых, кстати, автор языка) демонстрируют возможности языка. Они показывают стиль, следование которому не может не привести к успеху. Даже если C не тот язык, который вы будете использовать, то хотя бы посмотрите, как решаются на нем типичные задачи – вреда не будет точно.

Греби больше, кидай дальше, отдыхай, пока летит

Значение языка работы с реляционными базами данных SQL трудно переоценить. SQL вездесущ, и знание его – непременная составляющая профессионального багажа многих и многих программистов. Количество учебников и пособий по SQL неисчислимо, пожалуй, только «сладкая парочка» C и C++ составляют SQL достойную конкуренцию. Выбрать что-то достойное очень и очень трудно: надо смотреть и читать, пока не найдете подходящее. Мне, как обычно, повезло и здесь: мне попалась книга «Практическое руководство по SQL» написанная Дж. Боуман, С. Эмерсон и М. Дарновски. Честно говоря, мне трудно объяснить, почему именно эта книга оказала на меня такое влияние, и я готов согласиться, что, вообще говоря, это, наверное, не лучшая из книг по SQL. К тому моменту, когда она мне попалась на глаза, SQL я пользовался достаточно активно, хотя и чувствовал, что стройного представления о нем (особенно в том, что касалось всяческих JOIN-ов) у меня не было. Иными словами, я мог составить достаточно сложный запрос, но порядком этим тяготился и делал что называется «по необходимости». Никаких уроков от проделанной работы у меня в голове не оставалось, и следующий запрос я составлял как в первый раз.

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

Тексты и ничего кроме текстов

Последняя книга по программированию, о которой я хотел бы рассказать, наверняка покажется кому-то неожиданной: «The AWK Programming Language» A.Aho, B.Kernigan, P.Weinberger. Почему же эта небольшая (200 с небольшим страниц) книга, описывающая язык программирования для обработки текстов, попала в мой почетный список? Прежде всего, потому, что меня восхищает то, как с помощью простого в сущности инструмента можно делать столько полезных дел. Мне всегда нравились именно небольшие языки программирования и AWK как раз из таких. Программистам и (особенно) администраторам операционных систем *nix этот язык, безусловно, знаком. Но очень немногие используют этот язык на полную «катушку». Это не только поиск и «выщемление» необходимых данных, но также и их преобразование и проверка, генерация отчетов, построение простых баз данных, текстовые процессоры и даже компиляторы языков программирования. Для задач обработки текстов лучшего языка программирования, пожалуй, нет (конечно, это мое личное мнение). Тем более, по «ходу дела» вам придется изучить (если вы еще не знаете, что это такое) такую вещь как регулярные выражения, а вот это уж точно лишним не будет.

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

В сухом остатке

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

Первая из них – книга лауреата Тьюринговской премии М.Минского «Вычисления и автоматы». Это книга по конечным автоматам, нейронам, машинам Тьюринга, системам Поста, рекурсивным функциям и совсем чуть-чуть о программировании. Хотя перечисленный список тем выглядит несколько угрожающе, книга написана на редкость понятным языком и достойна для прочтения всяким, кто интересуется теоретическими основами информатики. Для чтения книги нужна некоторая привычка к абстрактному мышлению.

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

"... если божественное обладает всеми добродетелями, то оно обладает и мужеством. Если же оно имеет мужество, то имеет знание страшного, нестрашного и того, что посредине между тем и другим; и если так, то для бога существует нечто страшное... Поэтому если бог мужествен, то для него существует нечто страшное. Если же есть нечто страшное для бога, то есть и нечто для бога, способное его отяготить. А если так, то он доступен отягощению, а чрез это и гибели. Отсюда вытекает: если существует божественное, то оно тленно. Но оно (божественное) нетленно; следовательно, его не существует".

Это – прекрасный образчик «доказательства» от противного. Чем меня пленяет Секст Эмпирик, так это изумительной последовательностью в выстраивании доводов. Если вы сразу не нашли ошибки в его посылках, то он играючи убедит вас в том, что к примеру материальное тело (например, вы сами) одновременно существует и не существует. А так как третьего не дано, то лучше всего воздержаться от суждения.

***

Разумеется, мои поиски своей профессиональной библиотеки, отражают мои и только мои пристрастия и интересы. Не вызывает сомнений, что большинство (а, пожалуй, что и все) читатели в той или иной степени не согласятся со мной. Предвижу самые очевидные возражения: а где же в этом списке книги Д.Кнута («Искусство программирования»), Т.Кормена и соавторов («Алгоритмы: построение и анализ»), Э.Таненбаума («Операционные системы. Разработка и реализация»), К.Дейта («Введение в системы баз данных»), Б.Страуструпа («Язык программирования C++»), «книга дракона» («Компиляторы: принципы, технологии, инструменты» А.Ахо, Р.Сети и Д.Ульмана)?

Отчего я полностью умолчал об объектно-ориентированном программировании? Отвечу так: и эти, и многие другие книги у меня есть. Но они не попали в число избранных мною. Я глубоко уважаю выбор коллег-программистов, но на меня эти книги не оказали столь сильного влияния как те, о которых говорится в статье. Для меня этот список не только источник знаний – таких книг гораздо больше, чем я перечислил; они – источник вдохновения и восхищения, а это, согласитесь, дорогого стоит.

Если читатель думает, что составить такой список легко, то пусть попробует. Отберите столько книг, сколько считаете нужным, а потом пройдитесь по нему мелким «гребнем». Не стоит зацикливаться именно на числе 12: пусть будет 8 или 15. Главное – выбрать, а потом (скажем, через год) проверить – так уж ли вы были правы в своем выборе.

И, наконец, краткий список моей дюжины:

  • У.Клоксин, К.Меллиш Программирование на языке Пролог. – М., «Мир», 1987
  • Д.Грис Наука программирования. – М., «Мир», 1984
  • Т.С.Фрэнк PDP-11. Архитектура и программирование. – М., «Радио и связь», 1986
  • Д.Грис Конструирование компиляторов для цифровых вычислительным машин. – М., «Мир», 1975
  • Т.Пратт Языки программирования. Разработка и реализация. – М., «Мир», 1979
  • П.Хендерсон Функциональное программирование. Применение и реализация. – М., «Мир», 1983
  • С.Н.Баранов, Р.Н.Ноздрунов Язык Форт и его реализации. – Ленинград, «Машиностроение», 1988
  • Б.Керниган, Д.Ритчи Язык программирования C. – М., «Вильямс», 2006
  • Дж.Боуман, С.Эмерсон, М.Дарновски Практическое руководство по SQL. – М., «Вильямс», 2001
  • A.Aho, B.Kernigan, P.Weinberg The AWK Programming Language. – «Addison-Wesley», 1988
  • М.Минский Вычисления и автоматы. – М., «Мир», 1971
  • Секст Эмпирик Сочинения в 2-х томах. – М., «Мысль», 1976

Комментарии отсутствуют

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru