Архив за ‘Туториалы’ категория

Миграция на WordPress

Август 22nd, 2009

Итак, как обещал, пишу свои впечатления от миграции на WordPress.

Прежде всего хочу акцентировать внимание на то, почему я всё же решил «слинять» с LiveJournal. Окончательной причиной такого решения стала тотальная кривость движка ЖЖ, которая меня очень сильно поражает. Почему я для того, чтобы удалить запись, должен жать на 3 кнопки (править — удалить — согласен) вместо того, чтобы воспользоваться всего двумя (удалить — согласен). Зачастую даже путаешься в интерфейсе для того, чтобы совершить простейшую операцию — перейти из личного кабинета в блог и наоборот. Ну а также не удовлетворяют тормоза в работе, сильная перегруженность контента ЖЖ и ВНЕЗАПНО появившаяся реклама.

Тем не менее, недостатки, как выяснилось, у WordPress тоже в наличии, но они не такие большие.
Прежде всего претензии к плагинам, работающими с ЖЖ: ни lj-xp, ни lj-user работать нормально не хотели. Ну если в lj-xp всё не так страшно и ограничивается только мелкими патчами кода, неработающего на новой версии PHP, то о плагине lj-user можно сказать только то, что автор вообще не знал, чего писал. Это просто БЫДЛОКОДИНГ, и результат этого быдлокодинга тупо вешал движок WordPress при, казалось бы, элементаной операции обработки текста. Заведомо практически не зная PHP, я написал нормальный плагин lj-user, который не вгоняет в вечный цикл движок WordPress, и именно поэтому считаю стирание исконного автора из комментариев справедливым.

Именно поэтому я публикую исправленные версии плагинов у себя на сервере:
LJ CrossPost (lj-xp).
LJ User (lj-user).

В общем, надеюсь, вам эти плагины тоже помогут.

SSH over HTTP proxy

Июль 30th, 2009

Ввиду того, что инет на даче пионерский, а работать по ssh всё же иногда нужно, искал способ работы по SSH через http-proxy.

И нашёл хороший вариант: использование тулзы под названием corkscrew
Собирается она легко и не требует особых хитростей в настройке. Для этого достаточно отредактировать файл ~/.ssh/config.
Для доступа к myhost.zone конфига будет выглядеть примерно следующим образом:

Host myhost.zone
ProxyCommand corkscrew proxy-address proxy-port %h %p

Если же потребуется аутентификация прокси, то необходимо создать файл (например, ~/.ssh/proxyauth) и записать в нём строчку:

username:password

Сама же конфига SSH изменится так:

Host myhost.zone
ProxyCommand corkscrew proxy-address proxy-port %h %p ~/.ssh/proxyauth

После этого можно спокойно коннектиться на нужный хост:

sadko@sadko:~>ssh myhost.zone

С отпуска!

Июль 22nd, 2009

Подключил-таки инет на даче.
Стоимость 80 копеек за мегабайт впечатляет.
Немного выводит из себя качество: доступ в сеть только через proxy (по имени пользователя и паролю), в результате чего пока могу глядеть только сайты.
Пытался поднять socks через dante, да что-то не клеится.
Собственно, пробую на такой конфиге:

route {
        method: username
        from: 0.0.0.0/0   to: 0.0.0.0/0   via: 192.168.0.1 port = 3128
        command: connect                 # only thing a httproxy supports.
        proxyprotocol: http_v1.0
}

При этом, переменные окружения установлены как надо:

sadko@sadko:~> export | grep SOCKS
declare -x SOCKS_PASSWORD="********"
declare -x SOCKS_USERNAME="********"

В результате получаю вот такую фигню

Hand-made синхронизация репозиториев Subversion

Март 29th, 2009

Несмотря на то, что репозиторий ОС XSystem мигрировал ко мне на домашний сервер, всё же хорошо было бы хранить бэкапы на каком-нибудь удалённом сервере.
Для этого я решил воспользоваться уже имеющимся репозиторием subversion на http://sourceforge.net/.

Идея работы такая: раз в сутки мой репозиторий должен синхронизироваться с удалённым репозиторием. При этом, все изменения в одном репозитории должны однозначно отражаться на другом. С версии subversion 1.4 появилась такая тулза, как svnsync, но она для моего случая не подходит: оба репозитория не предоставляют прямого доступа к svnroot.

Поэтому, немного порывшись в гугле, решил прибегнуть к собственному механизму синхронизации. Идея простая: раз в сутки сливается содержимое первого и второго (будем называть source и destination) репозитория. После этого сверяем содержимое source-репозитория с содержимым destination-репозитория: создаём несуществующие каталоги и копируем несуществующие файлы. Файлы, имеющие различные контрольные суммы md5, также перезаписываем. Но это не всё. После того, как мы влили новое файло в локальное дерево destination-репозитория, мы должны удалить из него те файлы, которых уже нет в source-репозитории. Для этого осуществляем обратную сверку снимка destination-репозитория с source-репозиторием и удаляем из него лишние файлы.

В результате всё это было сведено к скрипту на PERL.

#!/usr/bin/perl

use strict;

my @blacklist   =
(
    qr(^\.svn|\/\.svn$),
    qr(^\.{1,2}$|\/\.{1,2}$)
);


my $src_path  = 'xsystem';
my $dst_path  = 'xskernel-sync';
my $svn_user  = '';
my $svn_pass  = '';

# Update repositories
`svn update $src_path`;
`svn update $dst_path`;

# now search files in src_path and compare to dst_path

add_files();
remove_files();

`svn commit $dst_path -m "Synchronization commit" --username $svn_user --password $svn_pass`;

Как видно, работа скрипта достаточно примитивна. Для его работы нужно иметь два рабочих снимка репозитория: source и destination. У меня source-репозиторий находится в каталоге xsystem, а destination — в каталоге dst_path.
Скрипт сначала обновляет снимки репозиториев, затем осуществляет вливание новых файлов в destination-репозиторий при помощи функции add_files(). После этого удаляются устаревшие файлы и каталоги из destination-репозитория функцией remove_files() и производится коммит изменений в destination-репозиторий.

Дело осталось за малым — разобрать функции добавления и удаления файлов и каталогов. Для этого сначала напишем функцию, которая получает md5sum файла:

sub md5sum
{
    my $fname = shift;
    if (open PIPE, "md5sum $fname |")
    {
        my $line = ;
        close PIPE;
        my ($sum) = ($line =~ /^(\w+)\s+/o);
        return $sum;
    }
    return undef;
}

В принципе, ничего нового. Вызывается утилита md5sum и анализируется её вывод.

Также необходимо игнорировать каталоги ".svn", "." и "..", для чего вводится массив @blacklist и пишется функция банинга файлов:

sub ban_file
{
    my $src_file = shift;
    foreach (@blacklist)
    {
        ($src_file =~ $_) and
            return 1;
    }
    return undef;
}

После этого можно спокойно разобрать функцию add_files():


sub add_files
{
    my @directories = ();
    my $curr_dir = '';

    do
    {
        # Открываем каталог
        if (opendir DIRHDL, "$src_path$curr_dir")
        {
            CYCLE: # Читаем содержимое каталога
            while (my $fname = readdir DIRHDL)
            {
                # Баним ненужные файлы
                my $src_file = "$src_path$curr_dir/$fname";
                (ban_file($src_file)) and
                    next CYCLE;

                my $dst_short = "$curr_dir/$fname";
                my $dst_file  = "$dst_path$dst_short";

                # Файл является каталогом?
                if (-d $src_file)
                {
                    # необходимо проверить, что он есть в destination-репозитории
                    unless (-d $dst_file)
                    {
                        # если каталога нет - его нужно создать
                        print "mkdir   $dst_short\n";
                        `mkdir -p $dst_file`;
                        `svn add $dst_file`;
                    }

                    # Запомним каталог для того, чтобы в будущем его просмотреть
                    push @directories, $dst_short;
                }
                else
                {
                    # проверяем, существует ли файл в destination-репозитории
                    unless (-e $dst_file)
                    {
                        # файл не существует, его нужно скопировать и добавить
                        print "add     $dst_short\n";
                        `cp -f $src_file $dst_file`;
                        `svn add $dst_file`;
                    }
                    else
                    {
                        # файл существует, вычисляем md5sum обоих файлов
                        my $sum1 = md5sum($src_file);
                        my $sum2 = md5sum($dst_file);

                        # если суммы не совпадают - заменяем файл новым
                        if ($sum1 ne $sum2)
                        {
                            print "replace $dst_short\n";
                            `cp -f $src_file $dst_file`;
                        }
                    }
                }
            }
        }
        else
        {
            print "Can't open dir $src_path$curr_dir\n";
        }

        # закрываем каталог и получаем следующий каталог, который следует обработать
        closedir DIRHDL;
        $curr_dir = shift @directories;
    }
    while (defined $curr_dir); # крутимся, пока в списке присутствуют обрабатываемые каталоги.
}

При удалении функция будет очень похожа, только теперь надо осуществлять поиск файлов в destination-репозитории и смотреть, есть ли они в source-репозитории:

sub remove_files
{
    my @directories = ();
    my $curr_dir = '';

    do
    {
        # опять же, открываем каталог destination-репозитория
        if (opendir DIRHDL, "$dst_path$curr_dir")
        {
            CYCLE: # читаем файлы
            while (my $fname = readdir DIRHDL)
            {
                # баним недопустимые diren'ы
                my $src_file = "$dst_path$curr_dir/$fname";
                (ban_file($src_file))
                    and next CYCLE;

                my $src_short = "$curr_dir/$fname";
                my $dst_file  = "$src_path$src_short";

                # проверяем, является ли это каталогом
                if (-d $src_file)
                {
                    # проверяем, существует ли этот каталог в source-репозитории
                    unless (-d $dst_file)
                    {
                        # каталога нет - удаляем его из destination-репозитория
                        print "rmdir   $src_short\n";
                        `svn delete $src_file`;
                    }
                    else
                    {
                        # каталог существует, запоминаем его для дальнейшей обработки
                        push @directories, $src_short;
                    }
                }
                else
                {
                    # Это обычный файл, проверяем, есть ли он в source-репозитории
                    unless (-e $dst_file)
                    {
                        # Файла нет, удаляем его из destination-репозитория
                        print "unlink  $src_short\n";
                        `svn delete $src_file`;
                    }
                }
            }
        }
        else
        {
            print "Can't open dir $dst_path$curr_dir\n";
        }

        # Закрываем каталог, получаем следующий
        closedir DIRHDL;
        $curr_dir = shift @directories;
    }
    while (defined $curr_dir);
}

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

Как я поднимал SVN

Март 29th, 2009

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

Управление репозиторием

Итак, для всего этого нам нужнен сам Apache (я использовал Apache 2) и дополнительные модули: dav и dav_svn.

Помимо этого, я ещё поставил просматривалку репозитория ViewVC, с которой потом долго и провозился.

Для того, чтобы заставить работать subversion через http, достаточно сделать следующее (делал в OpenSUSE 10.3):
Сначала включаем модули при помощи a2enmod:


a2enmod dav
a2enmod dav_svn

Теперь можно перезагрузить конфигу апача (либо через restart, либо через reload):


/etc/init.d/apache2 restart

или


/etc/init.d/apache2 reload

После этого необходимо сконфигурировать виртуальный хост. Лично я хотел, чтобы у меня SVN-репозиторий был как отдельный поддомен в домене xskernel.org — то есть, svn.xskernel.org.

Для этого заводим отдельный виртуальный хост в апаче:


<VirtualHost *:80>
    ServerName svn.xskernel.org
    ErrorLog    /var/log/apache2/svn-error.log
    TransferLog /var/log/apache2/svn-access.log

    <Location /svn >
      DAV svn
      SVNPath /home/svn/repositories/svn.xskernel.org
      SVNListParentPath on
      AuthType Basic
      AuthName "XSystem Kernel Team repository"
      AuthBasicProvider file
      AuthUserFile /home/svn/auth/svn.xskernel.org.htpasswd
      SetOutputFilter DEFLATE

      <LimitExcept GET PROPFIND OPTIONS REPORT>
        Require valid-user
      </LimitExcept>
    </Location>

</VirtualHost>

Как видно, здесь в конфиге заводится локейшн /svn, который используется для работы DAV. Именно DAV позволяет полноценно работать с репозиторием через http.

Рассмотрим некоторые параметры:
SVNPath задаёт каталог, в котором располагается репозиторий, который будет ассоциирован с данным виртуальным хостом. Естественно, сам SVNRoot я спрятал (не стал использовать SVNRootPath).
AuthUserFile — файл, в котором будут в дальнейшем храниться пользователи и хэши их паролей, которым будет разрешён доступ в SVN.
LimitExcept накладывает ограничения на все команды кроме GET, PROPFIND, OPTIONS и REPORT, требуя авторизации (Require valid-user).

Отлично, теперь нужно завести соответствующий репозиторий. Я решил хранить все репозитории в отдельном каталоге /home/svn/repositories, поэтому создал репозиторий таким образом:


mkdir -p /home/svn/repositories
svnadmin create /home/svn/repositories/svn.xskernel.org

Отлично, теперь репозиторий есть, надо сделать авторизацию. Для этого создаю файл паролей и завожу в нём пользователя:


mkdir -p /home/svn/auth
touch /home/svn/auth/svn.xskernel.org.htpasswd
htpasswd2 /home/svn/auth/svn.xskernel.org.htpasswd username

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


chown -Rv webserver:web /home/svn

Сохраняем конфигурационный файл виртуальных хостов апача, перезагружаем конфигурацию по reload, и пробуем зайти по адресу http://svn.xskernel.org/svn/. WebDAV работает!

Просматривание репозитория

Вот с просматривалкой у меня и возникло много проблем. Хотелось, чтобы при заходе на http://svn.xskernel.org/ автоматически запускалась просматривалка, при этом она отображала бы только тот репозиторий, который ассоциирован с данным виртуальным хостом. Я перепробовал много различных вариантов и, в конце-концов, остановился на том, что изложу ниже.

WebDAV я поставил штатными средствами OpenSUSE — из репозитория, после чего забрал его из /srv/www и переместил в каталог /home/svn.
Для своего виртуального хоста завёл отдельную конфигу /home/svn/viewvc-svn.xskernel.org.conf, в которой прописал следующие параметры:


# Доступные репозитории для просмотра
svn_roots:
        svn.xskernel.org : /home/svn/repositories/svn.xskernel.org
# Репозиторий, который следует просматривать по умолчанию
default_root = svn.xskernel.org
# Адрес обратной связи
address = team@xskernel.org
# Не использовать корень как компонент URL (то есть, не отображаются остальные репозитории в корне)
root_as_url_component = 0
# Путь к файлам с шаблонами отображения веб-страницы
template_dir = /home/svn/viewvc/svn.xskernel.org/templates
# компонент URL, по которому будут располагаться ресурсы для просматривалки (картинки и пр.)
docroot = /viewvc-docroot

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


cp /home/svn/bin/cgi/viewvc.cgi /home/svn/bin/cgi/viewvc-svn.xskernel.org.cgi

И редактируем строки, прописывая:


LIBRARY_DIR = r"/home/svn/lib"
CONF_PATHNAME = r"/home/svn/viewvc-svn.xskernel.org.conf"

Теперь скрипт /home/svn/bin/cgi/viewvc-svn.xskernel.org.cgi хватает конфигу /home/svn/viewvc-svn.xskernel.org.conf.
После всего этого заводим свои темплейты для ViewVC:


mkdir -p /home/svn/viewvc/svn.xskernel.org
cp -R /home/svn/templates /home/svn/viewvc/svn.xskernel.org
cp -R /home/svn/templates/docroot /home/svn/viewvc/svn.xskernel.org/viewvc-docroot

Прикручивание ViewVC к апачу

Теперь надо в каталоге /home/svn/viewvc/svn.xskernel.org завести файл index.html, который редиректит на подкаталог "/viewvc":



<pre>
<html><head><META HTTP-EQUIV="Refresh" CONTENT="0; URL=/viewvc"><head>
<body></body>
</html>
</pre>

Сделано это так потому, что если сам Апач осуществит редирект, SVN-клиент начнёт ругаться, что не может выполнить PROPFIND при импорте репозитория (проверено уже часовыми бдениями над mod_rewrie).

Прописываем ViewVC в конфиге виртуального хоста:


<VirtualHost *:80>
    #...
    ScriptAlias /viewvc "/home/svn/bin/cgi/viewvc-svn.xskernel.org.cgi"
    Alias / /home/svn/viewvc/svn.xskernel.org/

    <Directory /home/svn/viewvc/svn.xskernel.org/ >
        Order allow,deny
        Allow from all
        DirectoryIndex index.html
    </Directory>
</VirtualHost>

Параметр ScriptAlias указывает, какой скрипт следует запускать, когда URL содержит "/viewvc".

Перезагружаем конфигу апача, пробуем: http://svn.xskernel.org/.
Грузится страничка index.html, которая автоматом нас редиректит на http://svn.xskernel.org/viewvc/ и запускается скрипт /home/svn/bin/cgi/viewvc-svn.xskernel.org.cgi .

Заключение

Как видно, не всё так красиво в моей настройке, как хотелось бы. Если есть соображения/советы, как сделать лучше, то я их внимательно выслушаю.

Тем не менее, репозиторий ОС XSystem переехал с SourceForge.net ко мне на домашний сервер. Работает на порядок быстрее, чем тормозной сервис от SourceForge.net. Однако, от SF.net я не стал отказываться, а сделал его зеркалом моего репозитория. Как — в следующем посте.

Это всё же реально!

Июль 22nd, 2008

Сколько не читал в сети, сколько не разбирался в подобном вопросе, ответ у большинства был такой: «Вернуть деньги за предустановленную Windows Vista — это Unreal». Пусть это не реально, но топовых ноутов с FreeDOS/Linux в нашей стране найти — это ещё больший Unreal.

Подобный горький опыт с предустановленным ПО от Microsoft существует практически всё время, в течение которого существовала эта фима. Достаточно вспомнить продажу вычислительных машин от IBM с операционной системой QDOS (Quick & Dirty Operating System, далее — официальное название Disk Operating System), грубой, быстрой копией операционной системы CP/M. Но тем не менее, именно из-за продаж IBM PC + QDOS последняя выжила, а CP/M, будучи более качественной и продуманной, умерла.
Что же мы наблюдаем на данный момент? Более 95% населения, пользующегося персональными компьютерами, сидит под операционными системами фирмы Microsoft, остальные — под альтернативными ОС — *BSD, GNU/Linux, Sun Solaris, MacOS и пр.
Именно эти 95% позволяют фирме Microsoft диктовать правила на рынке, устраивать сговоры с вендорами и чувствовать себя, в принципе, абсолютно всемогущей и вседозволенной монополией в мире, которой выгоднее платить штрафы еврокомиссии, нежели выполнять их условия.
Но суть не в этом. А, как я уже писал, в том, что, фактически являясь монополистом, фирма сама решает за пользователя, что ему нужно. И в большинстве случаев это так и есть, да и не только в софтверной сфере: хитрые менеджеры никогда не дремлют, и всегда знают, какой товар лучше втюхать вам, чтобы им жилось хорошо.
Что мы наблюдаем в последнее время? А мы в последнее время наблюдаем активную пропаганду нового поделия от Microsoft — Windows Vista. И как бы были недовольны пользователи, как бы они ни кричали и не барахтались, как бы они не требовали от Microsoft вернуть Windows XP, хитрые менеджеры уже всё решили за них. И перейти на Vista им придётся хотя бы поэтому:
  • эта ОС поставляется как предустановленная на большинстве ПК и ноутбуках;
  • производители оборудования пишут драйверы для нового оборудования только под Vista;
  • Microsoft заканчивает поддержку Windows XP;
  • Microsoft прекращает продажи Windows XP;
  • «Microsoft думает о вас» (и за вас).

В итоге, подходя ближе к теме, большинство вендоров ноутбуков продаёт оборудование с предустановленной Vista, и не соглашается возвращать деньги за отказ от пользования этой ОС. Пример позорного поведения одной из фирм — знаменитая фирма Acer, которая даже не удосуживается прикладывать к продаваемому ноутбуку диск с установочным дистрибутивом системы. Или, например, знаменитый бренд Hewlett Packard, которы стал заниматься тем же. Появляется вполне логичный и однозначный вопрос: а если с моей предустановленной ОС что-то случится, я вынужден буду выкинуть наклееную на ноутбук блестящую наклейку на помойку, и купить коробочную версию Windows? Получается, заплатив за предустановленную ОС, я вынужден платить ещё раз?
Некоторые бренды вроде ASUS хоть и прикладывают диски в комплекте (по крайней мере, при мне ещё было такое), но вот на требование вернуть деньги за предустановленную ОС посылают далеко и надолго, даже несмотря на то, что ОС не является неотъемлемой частью продаваемого компьютера. Поправьте меня, если я неправ. Знаю, что с IBM/Lenovo дела обстоят получше, и есть случаи, когда фирма возвращала деньги.
Что же касается меня, то, так как я хотел ноутбук хорошей по сегодняшним меркам конфигурации, пришлось покупать компьютер с предустановленной Vista. Ну никуда ты не денешься… При покупке, зная про доску позора, решил остановиться на бренде, про которого ещё ничего не знаю (в плане возвращения предустановленной ОС). И этим брендом оказалась (апплодисменты) фирма Benq. Надо сказать, что мне уже приходилось иметь дело с техникой этой фирмы, и нареканий с моей стороны она не вызывала. Даже дома сейчас я пишу эту статью (если её так можно назвать), не без помощи монитора Benq FP93 GX. И он меня очень даже устраивает, несмотря на то, что и матрица TN (монитор всё же игровой как-никак). Вот и решил попытать счастье с ноутбуком Benq Joybook R56 R21. И почти всё оборудование у меня без проблем заработало под openSUSE Linux.
Но всё же я отошёл от темы, статья не об этом, а о том, как я возвращал деньги… Постараюсь более полно изложить этот материал и прокомментировать (какие ошибки были, и чего допускать нельзя).
При покупке ноутбука я прямо на столе продающей фирмы не согласился с лицензионным соглашением Windows Vista, выключил компьютер, вставил диск с openSUSE Linux 10.3 и поставил эту замечательную ОС. В идеальном случае было бы неплохо иметь ещё одного-двух свидетелей или снять процес «несоглашения с лицензией» на видео.
Через где-то полмесяца я вспомнил про то, что у меня в коробке валяется установочный диск с Vista и на дне ноутбука наклеена блестящая бумажка с серийным номером. «А что это я должен платить Баллмеру в карман свои кровные, если я не пользуюсь его операционной системой?» — подумал я и написал в саппорт. Вот текст письма, которое я отправил (через сайт производителя):

Центр Информационной и Технической поддержки Microsoft
Здравствуйте! Купил Joybook R56R21 и не согласен с EULA Microsoft Windows Vista, предустановленной на компьютере. Возможно ли вернуть назад установочный диск с Vista (входящий в комплектацию ноутбука) и вернуть сумму, потраченную на его преобретение?

Вендор, хоть я и не надеялся, всё же откликнулся:

Думаю этот вопрлос Вам надо решать с компанией Microsoft.


Данное соглашение актуально для всех ноутбуков с предустановленной ОС Vista.

Просим Вас сохранять историю переписки.

С Уважением
Служба Поддержки Клиентов BenQ
BenQ Russia

Но Microsoft Software License Terms же утверждает обратное! А что оно утверждает? Как ни странно, но лицензионное соглашение мне было сложно найти в Google. Всё же, после долгих поисков я процитировал кусок в ответном письме:

Ещё раз здравствуйте!

В MICROSOFT SOFTWARE LICENSE TERMS указывается следующая цитата:

By using the software, you accept these terms. If you do not accept them, do not use the software. Instead, return it to the retailer for a refund or credit. If you cannot obtain a refund there, contact Microsoft or the Microsoft affiliate serving your country for information about Microsoft’s refund policies. See www.microsoft.com/worldwide. In the United States and Canada, call (800) MICROSOFT or see www.microsoft.com/info/nareturns.htm.

Как я понял, я должен обращаться именно к производителю, то есть к вам.

Я не принимаю MICROSOFT SOFTWARE LICENSE TERMS и хочу вернуть свои деньги. Меня интересует как раз порядок возврата ПО, которое я никогда не буду использовать, но заплатил за него свои деньги.

Прошу помочь разобраться.

На что получил ответ — что (кратко говоря) «всё же обращайтесь в Microsoft». Ну что же, Без общения с Microsoft не обойтись, накатал им письмо, на что получил ответ:

Добрый день!

Благодарим Вас за обращение в Центр Информационной и Технической поддержки Microsoft.

Согласно лицензионному соглашению на Windows Vista OEM версии (поставляемой вместе с компьютером) для < /SPAN>возврата ОС необходимо обращаться к сборщику систем Вашего ПК.

Эти условия лицензии являются соглашением между вами и

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

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

  • обновления,
  • дополнения,
  • службы Интернета и
  • службы технической поддержки

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

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

С уважением,

Гаврилова Юлия

Собственно говоря, это письмо я приложил к своему и снова послал в Benq, от которого долго ждал ответа. Думал, что даже они про меня забыли. Поэтому приходилось пересылать им письмо, чтобы напомнить о себе. И это одно из правил: если саппорт забыл про вас, то напоминайте о себе. Посылайте письма повторно, если они не ответили через неделю.
В конце концов, Benq Support уточнили процедуру возврата ОС (оказывается, я был первым в Benq, кто решил это сделать) и выдвинули требования:

  • Наличие полностью заполненного гарантийного талона и чека, подтверждающего дату и стоимость покупки ноутбука.
  • С даты продажи должно пройти не более 30 дней.
  • Наличие на ноутбуке лицензионной наклейки с читаемой информацией, комплекта дисков с ОС.
  • Серийный номер лицензии (наклейка на нижней части ноутбука) на установленной на данном ноутбуке ОС, не использовался.

С учётом даты первого обращения в саппорт, они мне продлили срок возврата. Отсюда правило: чем раньше обратился в саппорт, тем лучше.
Хорошо, дело ближе двигалось к завершению, меня отправили в R Style Service для изъятия лицензии. Процедура изъятия прошла без особых проблем. Пришлось писать заявление, копию которого я любезно попросил оставить себе. Вот заявление:
Free Image Hosting at www.ImageShack.us
Сняли копию накладной на ноутбук. Сам ноутбук пришлось оставить. Но, несмотря на то, что вернуть обещали через 2-3 дня, вернули мне его вечером в этот же день.
Выдали техническое заключение:
Free Image Hosting at www.ImageShack.us

После этого я снова связался с поддержкой Benq и спосил о дальнейших действиях. Хотел настоять на денежном переводе/банковском чеке, но всё же пришлось нести ТЗ в фирму, у которой покупал ноутбук. Моей ошибкой было то, что, получая ТЗ, я забыл о золотом правиле: «роспись — подпись — и печать«. Вот третьего у меня, как раз, не было, и, получив разумный ответ от фирмы-продавца, что без печати сервиса это ТЗ не имеет силы, снова связался с Benq. Они извинились, и просили снова посетить R-Style Service, чтобы поставить печать. В принципе, печать мне поставили без проблем, после чего я уже имел документ:

Free Image Hosting at www.ImageShack.us

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

Итог таков: деньги мне вернули ($ 73.90 по курсу ЦБ РФ), но сама процедура возврата заняла порядочно времени. Поэтому если вы хотите этого — то надо биться до конца. А Benq ещё раз доказал, что это Фирма с большой буквы и ценит своих клиентов, за что им большое человеческое спасибо! Огромное спасибо и продающей фирме «Аскод Сервис», которая помогла мне раскрутить цепочку возврата.