Saturday, December 27, 2008

Обзоры книг

Решил поместить здесь несколько мини-обзоров книг по программированию, которые я написал ранее для корпоративного сайта.

С. Макконнелл, "Совершенный код"

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

Мартин Фаулер. Архитектура корпоративных программных приложений

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

Недостатком книги, на мой взгляд, является порядок изложения. В первой части автор дает обзор проблем, стоящих перед архитектором корпоративных систем, ссылаясь при этом на типовые решения, которые рассматриваются только во второй части. Т.о. понять первую часть зачастую трудно. Рекомендую читать книгу в таком порядке: сначала вводную главу 1, потом вторую часть, где рассматриваются типовые решения, и затем остальные главы первой части, проясняющие где, когда и зачем применять эти типовые решения.

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

Gamma, Helm, Johnson, Vlissides. Design Patterns

Классическая книга по Design Patterns, известная также как "Gang of Four". Написана в академической манере, подробно и основательно. В книге три основных части. В первой части объясняется, что такое Design Patterns и для чего они нужны. Во второй части на примере проектированя текстового редактора объясняется как Design Patterns возникают в реальной жизни. Третья часть представляет собой каталог 23-х базовых Design Patterns общего назначения. Описание каждого объясняет, откуда этот pattern взялся, когда его следует применять, как реализовывать, для пояснения используются диаграммы и примеры кода. Книгу можно использовать и как учебник, и как справочное пособие.

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

Гради Буч и др. Объектно-ориентированный анализ и проектирование с примерами приложений

Книга считается классическим трудом по объектно-ориентированному анализу и проектированию. Тем не менее, меня разочаровала. Книга состоит из трех частей: Концепции, Метод и Приложения. Первая часть содержит глубокий разбор основных концепций объектно-ориентированного анализа и проектирования: абстрация, объектная модель, классы, иерархия и т.п. Не совсем понятно, на кого ориентировано это изложение. Опытный программист уже знаком с этими концепциями, а начинающему будет сложно их понять из-за весьма тяжелого научного стиля изложения. Скорее всего, авторы ориентируются на тех, кто занимается computer science именно как science.

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

Третья часть, Приложения, описывает применение описанных ранее подходов для проектирования нескольких приложений. Эта часть наиболее интересна. Рассматриваются следующие системы:

  • Система спутниковой навигации. Проделывается очень высокоуровневое проектирование систем
  • Система контроля движения поездов. Рассматривается выработка требований
  • Криптоаналитическая система. Рассматривается более детальное проектирование. Интересно с точки зрения ознакомления с системами искусственного интеллекта
  • Система сбора данных с метеостанции. Рассматриваются вопросы embedded систем
  • Web-система планирования отпусков. Рассматриваются вопросы web-систем.

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

Fritz Onion. Essential ASP.NET with Examples in C#

Книга последовательно и доходчиво объясняет принципы технологии ASP.NET. Мне понравилась тем, что описывает архитектуру и "как это работает внутри". Освещаются такие темы как веб-формы, конфигурация (web.config), диагностика и обработка ошибок, валидация, data binding, custom controls, кеширование, state management и безопасность.

Для понимания книги нужно знать немного C#, предварительных знаний по .NET не требуется.

К сожалению, книга посвящена ASP.NET версии 1.1, а в 2.0 уже много поменялось. Также хочу отметить, что прочтя эту книгу уже понимаешь, как работает ASP.NET, но еще не можешь писать ASP.NET-сайты сам; для этого нужно еще прочесть какую-нибудь более практическую книгу, например "ASP.NET 2.0 Website Programming" (см. ниже).

Marco Bellinaso. ASP.NET 2.0 Website Programming: Problem - Design - Solution

Книга по программированию на ASP.NET 2.0, построенная на примерах. Автор описывает создание веб-сайта для вымышленного пивного кабака (!), последовательно добавляя к нему функциональность, т.о. демонстрируя возможности ASP.NET 2.0 и как их использовать.

Помимо прочего демонстрируется использование master pages, membership (системы пользователей/групп и их прав), создание новостей, статей, опросов, email-рассылки, форумов, электронного магазина, персонализация и локализация. В завершение обсуждается deployment сайтов на ASP.NET 2.0.

Для понимания книги необходимо уметь читать код на C# и иметь базовое представление о ASP.NET.

Как Касперский тормозит почту

С некоторых пор стал наблюдать следующую картину на почтовом сервере: в очереди sendmail'а стоят письма, адресованные локальным пользователям, но не доставляются. Более того, письмо часто адресовано целой группе пользователей, но доставка затыкается на ком-то одном, и все, кто в списке после него, письмо не получают.

Посмотрим, нет ли блокировок почтовых ящиков:


# cd /var/spool/mail
# ls *.lock
lz.lock
# 

Ага, один ящик заблокирован (здесь я описываю на примере моего ящика lz, хотя в жизни это были ящики других пользователей). Посмотрим, кто его использует:

# fuser -v lz
                     USER        PID ACCESS COMMAND
lz:                  lz        20384 F.... pop3
                     lz        20476 F.... procmail
# 

Похоже, процесс pop3-сервера занял ящик, поэтому procmail не может открыть его на запись. Проверим:

# lsof -p 20384 
COMMAND   PID USER   FD   TYPE   DEVICE     SIZE     NODE NAME
...
pop3    20384   lz    9uR  REG    253,3 11922701 16680817 /var/spool/mail/lz

(здесь число послее опции -p команды lsof - это PID, который вывела команда fuser; и я опустил все строки в выводе lsof, кроме интересующей меня).

Действительно, файл заблокирован на чтение (о чем говорит большая буква R в колонке FD). Но с какой стати процесс pop3 это сделал? Казалось бы, он должен выдать клиенту все сообщения и "отвалить". С помощью strace'а я посмотрел, чем был занят процесс pop3 - оказалось, периодически получает от клиента команды NOOP, и все. Зачем клиент посылает эти команды и не отключается? Я проверил поведение Outlook Express'а на своем компьютере - как и ожидалось, он подключался, забирал почту и отключался, т.е. не висел и команд NOOP не посылал.

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

И черт с этим почтовым антивирусом, все равно почту проверяет ClamAV

Sunday, November 23, 2008

Forcing Sendmail to talk plain SMTP

While routinely checking out our mail queue I noticed a message stuck in it with an explanation I never saw before:

Deferred: 402 4.5.2 Error: command not recognized

Command not recognized? What is that supposed to mean? I ran sendmail -q -v manually and observed the following dialogue:

>>> 220 *******************************
<<< EHLO csltd.com.ua
>>> 402 4.5.2 Error: command not recognized
<<< QUIT
>>> 221 2.0.0 Bye

It looked like the remote mail server did not recognize Extented SMTP EHLO command. However, instead of replying with 500 error code (as it should when it does not recognize a command), it replied with 402 "temporary failure" code. Had it replied with the correct 500 code, our Sendmail would fall back to normal SMTP and retry with HELO command. But with 402 reply our Sendmail deferred the message.

Further analysis showed that the remote site deployed an overly clever Cisco firewall that filtered SMTP traffic. The firewall was configured (intentionally or not) to allow only plain SMTP commands. Anything else, including ESMTP EHLO, it replaced with XXXX. On top of that, the mail server software replied with an incorrect error code to the unknown command.

What a mess. How could I work around this? I had to force our Sendmail to talk plain SMTP to that particular remote server. This can be easily done with mailertable. Assume for the sake of example that the remote domain was brokensmtp.com. In /etc/mail/mailertable, I added the following entry:


brokensmtp.com       smtp:brokensmtp.com

The key here is that I specify smtp mailer instead of the default esmtp. Ran make in /etc/mail directory to rebuild the mailertable, and the issue was solved.

Friday, November 07, 2008

Windows 2003 Server cannot access Samba share

We migrated a certain application from a Windows XP workstation to Windows Server 2003 and faced the following issue. The Windows Server 2003 computer could not access a share on a remote Samba server that is running in security = server mode. Attempts to access the remote share resulted in this error message:

\\server is not accessible. You might not have permission to use this network resource. Contact the administrator of this server to find out if you have access permissions.

The request is not supported.

For various reasons we could not change the Samba server security mode to ADS. A workaround, however, was found here.

On Windows Server, start Local Security Policies, navigate to Local Policies --> Security Options. Open the "Network Security: LAN Manager Authentication Level" setting and set it to "Send LM and NTLM responses".

After that, remote Samba share is accessible. No reboot necessary.

Saturday, November 01, 2008

Анекдоты о кризисе

- Папа, а нас кризис затронет?

- Сынок, это олигархов он затронет, а нам - капец.

***

Только в Украине! Закажите финансовый кризис, и получите в подарок политический!

***

Как поступает премьер-министр, если за два дня курс национальной валюты обваливается на 25 %, инфляция за год составляет 20%, производство падает на 4%, половина металлургических комбинатов остановлена, 5 системных банков на грани банкротства?

В Голландии - сдает в бюджет все семейные ценности и ездит на велосипеде.

В Англии - уходит в отставку и пишет покаянные мемуары.

В Японии - совершает харакири.

В Украине - выигрывает парламентские и президентские выборы...

***

-Почему цена нефти в мире падает, а бензина в Украине - растет?

-Видимо, дорожает то, чем у нас бензин разбавляют.

Saturday, October 25, 2008

"Failed to set servicePrincipalNames" Samba error

I was trying to join a Samba server to an Active Directory domain with a standard command:

net -U administrator ads join

Unexpectedly, the command failed with the following message:

Failed to set servicePrincipalNames. 
Please ensure that the DNS domain of this server matches the AD domain, 
Or rejoin with using Domain Admin credentials.
Disabled account for 'SERVERNAME' in realm 'DOMAIN' 

I was puzzled, since DNS domain name was correct, and I was using Domain Admin credentials.

After some searching, I came upon an advice here to check /etc/hosts. And indeed, the file contained an entry created by my distribution (Fedora) setup process which looked like:


SERVER_IP_ADDRESS SERVERNAME

Where SERVERNAME was a short name (without domain). Changing it to

SERVER_IP_ADDRESS SERVERNAME.DOMAIN

or just removing it resolved the issue. Rather weird.

Monday, September 15, 2008

Украинизмы

Я уже писал о трудностях перевода, но не подозревал, что украинские журналисты столкнутся с трудностями при переводе с украинского на русский. В этой заметке я собираю украинизмы в русскоязычных статьях на популярном украинском новостном сайте Korrespondent.net.
  • http://korrespondent.net/ukraine/politics/583232:
    Батькивщина молодая обратилась к СБУ и прокуратуре с требованием немедленно выучить ситуацию и принять меры...

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

  • http://korrespondent.net/ukraine/events/585967:
    Во Львове за сутки уничтожили уникальную памятку истории.

    Украинское слово "пам'ятка" переводится как "памятник". В русском языке слово "памятка" имеет другое значение.

  • http://korrespondent.net/ukraine/politics/582034:
    Безусловно, состоится полное и радикальное искривление волеизъявления избирателей

    Если бы речь шла о "викривленні простору", то это было бы "искривление пространства". А "викривлення волевиявлення" это все-таки "искажение волеизъявления".

  • http://korrespondent.net/sport/519660:
    Из данных исследования выплывает закономерность...

    Выплывать могут расписные челны из-за острова на стрежень. Украинское слово "випливає" в этом контексте нужно перевести "вытекает".

  • http://korrespondent.net/ukraine/politics/586801:
    ... во втором туре, в котором принимают участие две партии (блоки), что набрали наибольшее количество голосов избирателей во время первого тура

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

  • http://korrespondent.net/business/economics/587065:
    Европейский союз и Украина планируют провести дежурный раунд переговоров относительно создания зоны свободной торговли в октябре 2008 года

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

  • http://korrespondent.net/ukraine/politics/590228:
    Господину Вакарчуку также нужно пойти из должности министра...

    No comment. Калька с "пійти з посади". Может они автоматическим переводчиком переводят?

  • http://korrespondent.net/business/companies/596680:
    Бюджетные авиалинии на Близком Востоке и Северной Африки Air Arabia объявили про свои намерения с 15 октября 2008 года осуществлять полеты в столицу Украины, Киев, из узлового аэропорта в Шардже, ОАЭ.

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

  • http://korrespondent.net/ukraine/events/597200:
    ...рассказывается о подготовке и совершении убивства проводника ОУН Степана Бандеры

    Не знал, что Бандера служил проводником.

  • http://korrespondent.net/ukraine/politics/608659:
    ...о каких именно изменениях в держаного бюджет идет речь...

    Да уж, о каких изменениях здесь может идти речь...

  • http://korrespondent.net/ukraine/events/618617:
    Владимир Литвин считает, что в Украине полная деградация в области образования... "Балл правит агрессивная серость. Чем глупее человек, тем выше он сидит", - считает Литвин.

    Это уже не украинизм, я подтверждение слов Литвина - грамотность журналистов у нас на таком же уровне, как все остальное.

  • http://korrespondent.net/ukraine/politics/645470:
    Блок Литвина не берет участия в консультациях относительно новой кандидатуры на должность главы Верховной Рады

    Не берет, кто ж ему даст...

  • http://korrespondent.net/business/economics/649508:
    Указ набирает силу с момента его опубликования...

    Как опубликовали, так и набирает силу, не по дням, а по часам. По-украински действительно "указ набирає чинностi" (вступает в силу).