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" (вступает в силу).

Saturday, September 06, 2008

Forcing Domain Admins to be local admins on domain computers

All network administrators want to be able to administer user workstations remotedly. Often this requires the administrator to be a member of the local Administrators group on the user workstation. A simple way to ensure this is to have Domain Admins group to be a member of local Administrators group on each computer. Not surprisingly, this is the default situation on all Windows computer that are domain members.

However, if your users are local admins on their computers, sometimes you can find yourself in a situation when a clever or misguided user removed Domain Users from their local Administrators group. Also, sometimes you want some less privileged group than Domain Admins to be local admins on all computers - for example a group of network administrators that are assigned to manage user computers but are not eligible to administer the domain. In both cases you face a problem: how to ensure that a certain domain group is always a member of local Administrators group on each domain member computer?

Group policy to the rescue. Below I describe how to achieve this goal, as well as the pitfalls and shortcomings of this seemingly simple solution.

The key to the solution is to configure a feature in Group Policy called "Restricted Groups". In the following steps I will assume that you want to make Domain Admins part of local Administrators, but you can use any other group that you want.

Fire up Group Policy Management Console and locate your default domain policy (or any other Group Policy Object you want to use for this configuration). Right-click it and select edit. In the Group Policy Editor navigate to Computer Configuration\Windows Settings\Security Settings\Restricted Groups. Right-click and select "Add Group". Browse for your Domain Admins group. You should now arrive at the dialog box that looks like this:

First, in the top part of the dialog window, press "Add..." and add all the members of your Domain Admins group here. This seemingly extra step is necessary, because when the Group Policy is applied, it will change the membership of the group to the one specified here. If you don't list all your Domain Admins members here, you will wipe out your Domain Admins group! So, be careful and specify all relevant members here.

Now you are ready to do what you came here for. In the bottom part of the dialog, press "Add..." and type in Administrators group name. Note: do not use "Browse..." button, just type in the name. The dialog will now look like this:

Click OK and you are done. Once Group Policy applies to domain member computers, Domain Admins will become part of local Administrators group if not already there.

Caveats

Unfortunately, there are issues with this solution that you must be aware of. They all stem from the fact that Group Policy matches the Restricted Groups by name rather then SID; i.e. when the policy applies your Domain Admins will become a member of a group named Administrators; but it's not this name that makes this group special, it's its well-known SID. Let's see what implications this has.

For one, a malicious user may simply rename the local Administrators group (e.g. call it Admins), and it will completely defeat our trick, because Group Policy won't find a group named Administrators. This said, a truly malicious user will always find a way to prevent Group Policy from applying to his computer or to undo its effect after it applied. Thus we shouldn't even expect Group Policy to help overcome malicious users.

Next, consider international users. The local admin group is called Administrators in English version of Windows, but in other language versions the name is localized. In Russian version of Windows the group is called Администраторы, in Cyrillic. If you have both Russian and English systems in your domain, you can simply add both names to the "This group is a member of" list:

This will work, but has its own problems. Whenever Group Policy applies, it will find either Russian or English version of the Administrators name, depending on the system language. The other name will not be found, and a warning like the following will be logged to the Application system log.


Event Type: Warning
Event Source: SceCli
Event Category: None
Event ID: 1202
Date:  9/4/2008
Time:  1:41:37 AM
User:  N/A
Computer: 
Description:
Security policies were propagated with warning. 0x534 : No mapping between account names and security IDs was done.

Advanced help for this problem is available on http://support.microsoft.com. Query for "troubleshooting 1202 events".

Error 0x534 occurs when a user account in one or more Group Policy objects (GPOs) could not be resolved to a SID.  This error is possibly caused by a mistyped or deleted user account referenced in either the User Rights or Restricted Groups branch of a GPO.
...
[very detailed explanation follows]

That might be not a big deal on a workstation, but on domain controllers the Group Policy applies every 5 minutes, and the Application log will be flooded with these warnings, making it harder to spot more serious warnings, if they occur.

What can we do? Well, this policy doesn't need to apply to domain controllers, they don't even have local groups! So, you can do the following:

  1. create a new GPO;
  2. make the Restricted Groups configuration there and not in Default Group Policy;
  3. make the GPO apply to Domain Computers group only (which does not include domain controllers). For this add Domain Computers group in the "Security Filtering" section of Group Policy Management Console for this GPO and remove any other groups that were there, like this:

That gets rid of the flood of warning on domain controllers. An occasional warning in member servers' and workstations' logs can be tolerated, but if not, you have a way to get rid of them. For that you will need to create two separate GPOs and make them apply to either English or Russian systems with WMI Filters.

Using WMI Filters

So, back in Group Policy Management Console, create a new GPO. Let's call it "Russian language-specific policy". Make it apply to Domain Computers as described above. Now, under WMI Filters, in the Group Policy Management Console's left-hand tree, select "New" from the context menu to create a new filter with the following condition:

select * from Win32_OperatingSystem where OSLanguage = 1049

Your "New WMI Filter" dialog will look as follows:

Make the filter apply to the GPO by selecting the filter from the drop down list in the "WMI Filtering" section of Group Policy Management Console:

Voila, you have a GPO that applies only to domain computer with Russian version of Windows. Now you can configure Restricted Groups in it using the Russian name "Администраторы".

Repeat the same steps to configure "English language-specific policies" with a similar WMI Filter:

select * from Win32_OperatingSystem where OSLanguage = 1033

Now you can configure Restricted Groups in it using the English name "Administrators".

Somewhat complicated, but now you have different policies that apply to different language versions of Windows. Was it worth it? In this case probably not, but it's an interesting exercise and the technique may help you in other situations.

Friday, June 06, 2008

Еще о трудностях перевода

Читаю распечатку компьютерной диагностики автомобиля. На странице "Спецификация автомобиля" написано "Трансмиссия: руководство". Долго думал, что за тип трансмиссии такой. Догадался: это перевод "Transmission: manual". Действительно, коробка передач у нас ручная.

Monday, May 19, 2008

Corrupt Winbind IDMAP database

After a Samba server crashed due to a power failure, several users could no longer access it shares. When access was attempted, password dialog was shown and the correct password was not accepted. Strangely, the problem affected only some users, while others continued to work in Samba shares successfully.

The Samba server's /var/log/messages showed the following errors:

May 19 12:48:05 server winbindd[1929]:   tdb(/var/lib/samba/winbindd_idmap.tdb): 
tdb_rec_read bad magic 0x42424242 at offset=102664
May 19 12:48:05 server winbindd[1929]:   Error storing SID -> ID: Corrupt database

So, the problem was that windbindd_idmap.tdb file was corrupted. In this situation, the only sensible solution is to restore the file from a backup. If you don't have a backup, you are out of luck. Best you can do is remove the corrupted file, but it stores the mapping between Windows and Unix user IDs, and as the result file ownership and permission information on the Samba shares will be screwed up.

Wednesday, April 23, 2008

Фред Брукс. "Мифический человеко-месяц"

Одна из первых книг по управлению программными проектами, ставшая классической. Книга написана в 1975г. по материалам работы автора над созданием операционной системы OS/360 в IBM в 1965-68гг. Казалось бы, за столько лет индустрия программирования так изменилась, что книга должна была безнадежно устареть. Ничего подобного - устарели только технические моменты, которые не играют в книге важной роли (смешно выглядят советы использовать PL/I и фразы типа "Нередко можно встретить человека, выражающего ужас по поводу того, что в машине, имеющей 2 Мбайт памяти, под операционную систему может быть отведено 400 Кбайт"). Основные идеи книги по-прежнему актуальны - и знаменитый закон Брукса "Если проект не укладывается в сроки, то добавление рабочей силы задержит его еще больше", и "планируйте на выброс" и "эффект второй системы" и т.п.

В 1995-м году вышло юбилейное издание книги, включившее в себя, помимо оригинала, статью автора "No Silver Bullet" 1986г., где он утверждает, что не существует волшебной технологии, способной поднять производительность труда программиста на порядок, разбор критики этой статьи, и новый взгляд на идеи "Мифического человеко-месяца" 20 лет спустя.

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

HTML-вариант книги можно найти здесь. Текст взят с lib.ru и снабжен более-менее приличным форматированием. Также исправлены наиболее вопиющие опечатки и дефекты перевода. Форматирование максимально адаптировано для чтения в программе Books для iPhone, но будет нормально смотреться в любом средстве просмотра HTML (в т.ч. в любом браузере).

Tuesday, April 22, 2008

Windows computer can't get IP address from DHCP

Suppose you configured a Windows computer to obtain IP address automatically via DHCP, but it doesn't work. Ipconfig shows that IP address is 0.0.0.0 and running ipconfig /renew returs errors like "Unknown interface" or "RPC server not available".

The most likely reason for this: DHCP Client service is not running. It is started automatically by default, but some users stop it, because it is not needed when you have a static IP address. Just start the service and ipconfig /renew should get you your IP address.

Friday, April 18, 2008

Apache: How to enable CGI in one user's directory

Recently I had to configure Apache HTTPD server on a Fedora 7 box to allow CGI script execution in one particular user's public_html directory, yet not allowing it for all users.

Easy, I thought. First, Apache needs to know that a certain file is a CGI script and not a regular web page. Normally CGI scripts live in cgi-bin directory and Apache knows that anything in it is a CGI script by virtue of ScriptAlias directive. But how does it know a file outside of cgi-bin directory is a CGI script? Usually, by the file's extension. To tell Apache that any file with .cgi extension is a CGI script, uncomment the following line in the default httpd.conf (or add it if it's not there at all):


AddHandler cgi-script .cgi

Now Apache knows which files are CGI scripts. So far so good, but how do we tell it that it is permitted to run CGI scripts in a certain directory? We do it with ExecCGI option. Where do we add it? In Fedora, Apache configuration is modular. Instead of adding everything to the main httpd.conf file, and then struggling with it when you upgrade Apache, we add bits of local configuration to files in /etc/httpd/conf.d directory. So, I went ahead, created a new file usercgi.conf in that directory and entered the following directives in it:

<Directory /home/cgiuser/public_html>
  Options +ExecCGI
</Directory>

To my surprise, this didn't work. Apache refused to run CGI scripts in /home/cgiuser/public_html. Giving it more thought, I realized that the files in cond.d directory are included into the main httpd.conf before most of the directives there, and the main httpd.conf has the following part regarding users' public_html directories:

<Directory /home/*/public_html>
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    ...  
</Directory>

The default directive comes after my custom directive and overrides it. What can we do? There are three approaches:
  1. Brute-force approach. Modify the main httpd.conf to include our custom directive after the default directive. I don't like this though, since it's easy to loose the configuration when upgrading to a newer version of Apache.
  2. Put the user's CGI scripts in a subdirectory of public_html, say public_html/cgi-bin. Then you will be able to turn ExecCGI on this directory on with the usual directives:
    
    <Directory /home/cgiuser/public_html/cgi-bin>
      Options +ExecCGI
    </Directory>
    
    
    Why does it work for subdirectory? Because a more specific Directory directive (the one with a longer path) always overrides the one that is less specific. Therefore options set for /home/cgiuser/public_html/cgi-bin will override those set for /home/*/public_html.
  3. Use Location directive instead of Directory:
    
    <Location ~/cgiuser/>
      Options +ExecCGI
    </Directory>
    
    
    Apache always processes Location directives after all Directory directives, thus a Location directive will take precedence.

Wednesday, April 16, 2008

Google и Харьков

Что общего между Google и Харьковом? Непосредственно - ничего, но косвенная связь имеется.

В 1960-е годы в МГУ учился талантливый молодой математик Михаил Брин. После окончания МГУ он написал диссертацию, но в те годы еврею защититься в Москве было проблематично, и с защитой не складывалось. Вместе с Брином учился Дмитрий Ахиезер, сын знаменитого харьковского математика Наума Ильича Ахиезера. Дмитрий решил через отца помочь соученику. И вот Наум Ильич Ахиезер, используя свой авторитет и влияние, организовал для Брина защиту в Харькове. Оппонентом был другой известный харьковский математик Ю.И. Любич. Брин успешно защитился и продолжил работать в Москве.

Через несколько лет он уехал в США, где сейчас работает в Университете Мэриленда. А что сделал его сын, все знают.

Прошло много лет, и Михаил Брин решил почтить память Н.И. Ахиезера, который так помог ему в свое время. На собственные средства он организовал в Харькове Фонд им. Н.И. Ахиезера для поддержки молодых математиков, живущих и работающих в Харькове. Фонд уже третий год дает стипендии молодым математикам Харькова.

Историю рассказал мне Г.М. Фельдман, член Координационного совета Фонда.

Friday, April 04, 2008

NTLM authentication in Apache

NTLM authentication is Microsoft's way to enable Windows users to transparently (i.e. without entering user name and password) authenticate to web sites. Apache can support this style of authentication too with mod_auth_ntlm_winbind. This module is developed as part of Samba. It is available in Fedora. More information on it can be found here: http://adldap.sourceforge.net/wiki/doku.php?id=mod_auth_ntlm_winbind, including the basic information on how to install and configure this module.

An important piece of information that I didn't see mentioned by any documentation and that I discovered the hard way is that Apache's KeepAlive directive should be on, otherwise NTLM authentication doesn't work. Unfortunately Fedora 7 default httpd.conf has "KeepAlive off" (don't know why). So, one has to turn it into "KeepAlive on" to use mod_auth_ntlm_winbind. With keep-alives turned on, it works great.

Thursday, April 03, 2008

Правила для SpamAssassin'а - Kerio MailServer

Почему-то много спама проходит через ПО почтового сервера Kerio MailServer. Поэтому такое правило для SpamAssassin'а удачно работает:

header KERIO_MAILSERVER Received =~ /Kerio MailServer/
describe KERIO_MAILSERVER Sent through Kerio Mailserver software
score KERIO_MAILSERVER 2.5

Впрочем, с этим правилом надо быть осторожным. В самом Kerio MailServer нет ничего преступного, просто статистика против него. Если статистика изменится, правило может начать давать false positives. Но пока такого не замечено.

Wednesday, April 02, 2008

Превоапрельские тезисы

Google сообщила о запуске совместно с Virgin Group проекта Virgle для освоения Марса. В то же время команда Google Talk сообщает, что для снижения выбросов CO2 Google Talk будет автоматически сокращать все сообщения (т.к. "every character (byte) we send in a message results in about 0.0000000000000000034 metric tons of CO2 being released into the atmosphere"), а Blogger объявляет о новом поколении блогов: Google Weblogs.

KDE.news сообщают, что KDE решило поддержать Микрософтовский Office Open XML. Смешно для тех, кто в курсе.

Korrespondent.net сообщил, что в зоне отчуждения Чернобыльской АЭС голландцы построят аквапарк ("Мы добавим в воду флуоресцентный зеленый краситель, чтоб посетители получали зрительный эффект посещения зараженной радиацией территории"). Также, Шевченко переходит в "Шахтер". Также Korrespondent.net сделал подборку самых веселых цитат прошлого года (и это не розыгрыш).

Но лучше всех BBC, которая сообщает о недавно открытом виде перелетных пингвинов:

Saturday, March 29, 2008

Набираем номер в украинском формате на iPhone

Еще один совет для незаконных пользователей iPhone в Украине. Изначально американский прибор рассчитан на американский формат номера телефона. В результате наше, к примеру, 8 (067) 111-11111 выглядит просто как 806711111111, а в процессе набора даже как (806) 711-1111. Мелочь, не неприятно. Вот как мне удалось это подправить.

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

Так вот, нужно подредактировать файл /System/Library/Frameworks/UIKit.framework/PhoneFormats/UIPhoneFormats.plist на телефоне. Последовательность действий:

  1. Скачиваем файл на компьютер через SSH (кстати, рекомендую для этих целей SFTP plugin для Total Commander)
  2. Переводим файл в текстовый формат на этом сайте.
  3. Редактируем файл в текстовом редакторе. Менять нужно секцию us. Вот как она выглядит у меня после редактирования:
     <key>us</key>
     <array>
      <string>8 (0572) ##-##-##</string>
      <string>8 (###) ###-####</string>
      <string>+380 (##) ###-####</string>
      <string>+1 (###) ###-####</string>
      <string>###-####</string>
      <string>###</string>
      <string>####</string>
      <string>#####</string>
     </array>
    
    
    В начале я вставил отдельную строчку для шестизначных номеров в Харькове с кодом 0572. Жители других городов с шестизначными номерами могут вставить здесь свой код. Я также сохранил американский формат, начинающийся на +1, на всякий случай.

    Нужно быть особо осторожным, чтобы не нарушить структуру XML-файла.

  4. Результат можно взять здесь.
  5. Готовый файл копируем поверх оригинального. Настоятельно рекомендую сохранить оригинальную версию.
  6. Перезагружаем телефон. Если все прошло удачно, наслаждаемся красотой:

Подключаем iPhone к Киевстару

Небольшие советы незаконным пользователям Apple iPhone в Украине. Как разлочивать писать не буду, на эту тему есть масса ресурсов (хотя бы www.iphones.ru).

Чтобы получить подтверждение доставки SMS, первым символом в тексте нужно ввести восклицательный знак. Получатель его не увидит, а вы получите отчет о доставке. К сожалению, автоматически iPhone этого не делает.

Полезно установить пакет "Киевстар" из репозитория http://garconpro.com/repo (после подключения репозитория в Installer'e, пакет в категории Carrier Services (1.1.3-4)). Что это дает:

  • перестает появляться окошко "Call forwarding active" при наборе номера
  • В левом верхнем углу экрана появляется напись "Київстар" вместо UA-KYIVSTAR
  • В настройках телефона (Settings, раздел Phone) появляется пункт "Киевстар services", в котором телефоны проверки баланса, пополнения счета и сервис-центра (если вы их забыли) и ссылка на веб-страничку "Мой Киевстар".
Не забудьте проделать все действия, о которых пакет предупреждает при установке: перезагрузить, вставить SIM-карту другого оператора, затем снова свою SIM-карту. Без этого не заработает.

К сожалению, пакет нуждается в доработке напильником. Во-первых, напись "Київстар" в левом верхнем углу экрана у меня не появилась. Оказалось, что пакет настроен на имя оператора UA-KS, но мой телефон именует Киевстар UA-KYIVSTAR. Может быть дело в том, что у меня Ace&Base, может у контрактных абонентов иначе. Во всяком случае мне пришлось поредактировать файл /System/Library/Carrier Bundles/Kievstar_UA.bundle/carrier.plist на телефоне. Сначала я перевел его в текстовый формат с помощью этого сайта, а затем заменил UA-KS на UA-KYIVSTAR в текстовом редакторе. Результат здесь. Подредактированный файл скопировал поверх оригинального.

Во-вторых, пакет прописал мне в настройках EDGE имя точки доступа www.kyivstar.net, имя пользователя kyivstar и пароль internet. Может для контрактного подключения это верно, но для Ace&Base - нет. Исправить легко: в Settings, раздел General - Network - EDGE вводим APN: www.ab.kyivstar.net, username и password - пустые. Теперь все в порядке.

Monday, March 17, 2008

Еще правила для SpamAssassin'а

В продолжение темы спама, вот модификация правил из предыдущей статьи, которая по-прежнему актуальна и эффективна:


header __SPAMMY_YAHOO_SENDER From:addr =~ /[A-Z][a-z]*[A-Z][a-z]*[0-9][0-9]\@yahoo\.co\.uk/
header __SUBJECT_SEMINAR Subject =~ /seminar|Moratoriy/
header __SUBJECT_STARTS_WITH_DOT Subject:raw =~ /^\s*=\?Windows-1251\?Q\?\._?=/

meta SPAMMY_YAHOO_SENDER_AND_SUBJECT __SPAMMY_YAHOO_SENDER && (__SUBJECT_SEMINAR|| __SUBJECT_STARTS_WITH_DOT)
describe SPAMMY_YAHOO_SENDER_AND_SUBJECT Spammy sender FirstLastNN@yahoo.co.uk and suspicious subject
score SPAMMY_YAHOO_SENDER_AND_SUBJECT 2.5

Здесь должно быть 6 строк, начинающихся словами header, header, header, meta, describe и score. Любые другие переносы строк надо удалить!

Что здесь происходит: мы отслеживаем письма, у которых адрес отправителя имеет вид FirstLastNN@yahoo.co.uk (где First и Last - произвольные имя и фамилия, а NN - двузначное число), а тема письма - либо слова seminar или Moratoriy, либо начинаются на точку. Сомневаюсь, чтобы кому-то кроме спаммеров пришло в голову делать такую тему письма, так что такие письма наверняка спам.

P.S. 23.04.2008. Теперь такой же спам присылают также с адресов вида *@earthlink.net. Ввиду этого я модифицировал правила таким образом:


header __SPAMMY_YAHOO_SENDER From:addr =~ /[A-Z][a-z]*[A-Z][a-z]*[0-9][0-9]\@yahoo\.co\.uk/
header __SPAMMY_EARTHLINK_SENDER From:addr =~ /\@earthlink\.net/
header __SUBJECT_SEMINAR Subject =~ /seminar|Moratoriy/
header __SUBJECT_STARTS_WITH_DOT Subject:raw =~ /^\s*=\?Windows-1251\?Q\?\._?=/

meta SPAMMY_SENDER_AND_SUBJECT (__SPAMMY_YAHOO_SENDER || __SPAMMY_EARTHLINK_SENDER) && (__SUBJECT_SEMINAR|| __SUBJECT_STARTS_WITH_DOT)
describe SPAMMY_SENDER_AND_SUBJECT Spammy sender and suspicious subject
score SPAMMY_SENDER_AND_SUBJECT 2.5

Wednesday, February 06, 2008

О нас пишут

Блоггер, называющий себя Дмотрий Бдрк или driessen, написал статью о переключании раскладок клавиатуры в KDE, где рекомендует мою скромную утилиту KKBSwitch, а меня называет "замечательным украинским программистом". Большое спасибо, очень приятно.

Monday, January 07, 2008

Необходимые сайты

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

Korrespondent.net

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

E-Katalog

E-Katalog - агрегатор товаров и цен украинских интернет-магазинов. Аналогичные сайты - Magazilla и Nadavi, похоже, основаны на той же базе данных, так что не совсем понятно, зачем их три, а не один.

Рейтинг интернет-магазинов

Могу назвать два сайта с рейтингом украинских интернет-магазинов: UAShops и TopShops. К сожалению, отзывов еще не очень много.

Железнодорожные билеты

Сайт Южной железной дороги позволяет узнать расписание поездов по Украине и наличие билетов.

Internet applications I couldn't live without

Inspired by the list of Web 2.0 Companies I Couldn't Live Without by TechCrunch's Michael Arrington, I'd like to compile my own. I'll split this post into two. This one will be about international sites, and the next one (in Russian) will be dedicated to Ukrainian ones.

Completely agree with TechCrunch on the following websites:

  1. Delicious
  2. GMail
  3. Google Reader
  4. Skype (not really a website, but an Internet application)

I am also impressed by TripIt; if I traveled in the US, I would use it, and Kayak or Farecaster for flight booking. Now my own picks.

VoipDiscount

Skype is great for PC-to-PC calls, and probably for PC-to-phone calls in the Western world. Unforunately, here in Ukraine Skype has a severe limitation: for reasons that are hard to comprehend, Skype doesn't allow to buy Skype credit with a credit card from Ukraine, essentially making SkypeOut service unavailable for Ukrainian users. Given how expensive international calls from Ukraine are, there seems to be a great market for VoIP, yet Skype chose to ignore it. Luckily there are others to fill in the void. VoipDiscount readily takes payments from Ukraine, has reasonable sound quailty, is actually cheaper than Skype, what else could you wish for? Once you make a 10 euro deposit to your VoipDiscount account, you are given 120 days of free calls to major developed countries, and quite cheap to the rest of the world. Once your 120 days expire, normal rates apply to all destinations, but still this is really cheap, cheaper than Skype.

Picasa Web Albums

Flickr may be great, but I prefer Picasa Web Albums by Google.

Last.fm

Last.fm is the single best site to discover new music and do datamining on your music tastes.

Slashdot

Digg and Reddit are so popular, but I prefer good old Slashdot. I mostly read it via Google Reader though.

Blogger

Since I am writing this on Blogger, I definitely must add it to the list.

Almost on the list

I joined LinkedIn and Facebook this year, but I'm yet to see their merits for a user like me.

Wednesday, January 02, 2008

Ледяной городок в Харькове

На пл. Свободы в центре Харькова на Новый 2008-й год выстроили ледяной городок.

Last.fm ripping with TheLastRipper

TheLastRipper is a great, if legally questionable, way to download music from Last.fm as MP3 files.

It may be a little unclear how to enter the URL in the Radio station box to record a particular album. Follow these steps:

  1. Open your Last.fm page in your browser and go to Settings - Website page. In "Music Playback" section specify "Play everything in the Last.fm software".
  2. Now open Last.fm album page in your browser (it looks like http://www.last.fm/music/<artist>/<album>, e.g. http://www.last.fm/music/Beatles/Revolver).
  3. Locate the "Play this album in the Last.fm software" link on the page under the "Tracks on this Album" heading.
  4. Copy the URL that this link points to. It will look like this: lastfm://play/tracks/NNN,NNN,NNN, where NNN are numbers.
  5. Now paste this URL in the Radio station box in TheLastRipper and click "Tune in" button. Wait for the album to download, as it's going to take time.

Lee Feldman

Great artist, Lee Feldman. Try this album on Last.fm:

Lee Feldman - I've Forgotten Everything