[ Content | View menu ]

Секретные операторы Perl

30.11.2009

Эскимосский превед }{, goatse НЛО =()=, телекоммуникационный спутник -+- и другие не менее осмысленные конструкции.

И вообще, блог good coders code, great reuse (англ.) более чем заслуживает того, чтобы на него подписаться.

linux - 0 комментариев

Сравнение нулей и пустых строк в MySQL

06.11.2009

Коллега поделился парадоксом:

Server version: 5.0.51a-24+lenny1 (Debian)

mysql> select '0'=0;
+-------+
| '0'=0 |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

mysql> select 0='';
+------+
| 0='' |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select ''='0';
+--------+
| ''='0' |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)

Если два значения равны третьему, они не равны между собой, что немного противоречит здравому смыслу. Однако такое поведение легко можно объяснить read more…

linux - 0 комментариев

Лицензия Windows 7 с точки зрения линуксоида

29.10.2009

Миллионы пользователей Windows, больше года ожидавшие выхода новой, теперь уже правильной (по сравнению с Vista) ОС от Microsoft, наконец счастливы: 22 октября начались продажи Windows 7. Из этих счастливцев самые радостные — добровольные бета-тестеры предварительных релизов, которым наравне со всеми рано или поздно придется приобрести один из вариантов семерки.

Последней версией windows, которой я активно пользовался, была XP, и я не видел ни Windows Vista, ни тем более Windows 7 (что за идиотское обозначение релиза: «7», его можно употреблять только в сочетании со словом windows. Похоже, концентрация «windows» в этом посте превысит все мыслимые пределы. Windows windows windows windows окна окна пластиковые окна, и закончу на этом). Но я слышал множество лестных отзывов о новой системе даже от бывалых линуксоидов. Более того, сам Линус Торвальдс в шутку сфотографировался на фоне точки продаж семерки. Что же это такое, надо, пожалуй, взглянуть, неужели и правда Microsoft сделала такой шаг вперед навстречу прогрессивному человечеству?

Но нельзя поставить систему на компьютер, не согласившись с лицензионным соглашением. Посмотрим, что же нам предлагает (точнее, запрещает) лицензионное соглашение для версии с максимальными возможностями (по-русски она так и называется — «максимальная», что, конечно же, не передаёт всех смысловых оттенков слова «Ultimate»). А в разделе «Примеры лицензионных соглашений» можно найти примерную OEM лицензию, которая, за исключением нескольких моментов, соответствует своей коробочной версии.
read more…

linux - 7 комментариев

Заметки на память

07.09.2009

Если после перезагрузки не сохраняются параметры клавиатуры в Gnome-окружении Debian или Ubuntu, поможет добавление setxkbmap в приложения, запускаемые автоматически при входе в систему («Система — Параметры — Запускаемые приложения» или «System — Parameters — Sessions»)

Если при монтировании расшаренного через Samba каталога через mount.cifs симлинки отображаются как локальные ссылки, нужно на обеих машинах в smb.conf отключить unix extensions, которые и отвечают за такое поведение символических ссылок:

unix extensions = no

Если в Ubuntu одновременно перестали работать su, sudo, входы в систему с консоли и через ssh (основной симптом: зависает после ввода пароля), то для постановки окончательного дифференциального диагноза можно попробовать выполнить команду «logger test». Если и это зависает, то налицо проблема с демоном syslogd. В моем случае решение вылилось в отключении опции «-r» в/etc/default/syslogd (принимать сообщения по сети), которая однажды была добавлена мной для удаленной отладки одного voip-телефона. На самом деле это явная бага, которая, судя по Ubuntu Bug 26986, тянется аж с 2005 года.

linux - 1 комментарий

Ссылка на определенное место в man’е

24.08.2009

В блоге «Полезные советы по Linux» наткнулся на способ ссылаться на определенное место в документации:

sh -c 'PAGER="less" LESS="-p search_string" man man_page'

Явно вызываем sh, задаем просмотрщик less и указываем ему строку, которую нужно найти. Команда man запустит less и прокрутит экран до первого совпадения.

Конечно же, необходимо убедиться, что заданный шаблон присутствует в документе хотя бы один раз, и первый раз встречается именно в том месте, на которое вы хотите сослаться. Если ни одного совпадения не найдено, будет выведена ошибка и man будет показан с его начала, да и то только после нажатия Enter. Также стоит учитывать, что у адресата вашего сообщения может быть другой shell, другая версия документации и вообще другая операционная система.

Несколько примеров (предполагаем, что в качестве шелла используется sh-compatible shell типа bash или zsh, а переменная PAGER установлена в less).

Абзац в bash (1) про фичу complete-into-braces из одной из предыдущих заметок:

LESS="-p complete-into-braces" man bash

Раздел про подстановку из истории в bash (1). Поскольку строка HISTORY EXPANSION в документе встречается неоднократно, то требуется привязка к началу строки:

LESS='-p ^s*HISTORY EXPANSION' man bash

Подсветка важной фразы целиком:

LESS='-p Please note.*log the command[^.]*.' man sudo

Этот фокус можно задействовать в других утилитах, использующих less, например, в perldoc:

LESS='-p ^s*Range Operators' perldoc perlop

О том, как эта конструкция работает:

LESS='-p MANPAGER, PAGER' man man
LESS='-p -ppattern.*' man less
LESS='-p Options which.*' man less

linux - 2 комментария

Построение регулярного выражения по списку строк

18.08.2009

Имеется неколько десятков однотипных файлов вида FILE20090801011253.txt, FILE20090801023619.txt и т.д. Требуется составить регулярное выражение, которому удовлетворяют только названия файлов из списка.

Вручную это можно сделать примерно так:

FILE200908010(11253|23619)\.txt

Если файлов много, то никаких нервов не хватит высчитывать, проверять и перепроверять.

То же самое можно сделать полуавтоматически, с помощью механизма complete-into-braces оболочки bash. Сочетание клавиш Esc-{ преобразовывает список подстановки в более-менее оптимальный формат brace-completion, пригодный для дальнейшей обработки:

$ echo /path/to/dir/(Esc-{)FILE200908010{11253.txt,23619.txt}

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

echo "FILE200908010{11253.txt,23619.txt} "|sed -e 's/{/(/g' -e 's/}/)/g' -e 's/,/|/g'

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

После непродолжительных поисков был найден Perl’овый модуль Regexp::List, функцию list2re (преобразование списка в регулярное выражение) из которого можно приспособить под любые подобные задачи. Вот, например, сокращенная версия скрипта для моего случая:

use Regexp::List;
my $l=Regexp::List->new;
$l->set(lookahead=>0);

opendir(D,"/path/to/dir") or die "Could not open $dir: $!";
my @list=grep {$_!~/^\.\.?$/ } readdir(D);          # get directory entries except "." and ".."
closedir(D);

my $re = $l->list2re(@list);                        # create regexp from @list
$re=~s/^\(\?-[xism]+:(.*?)\)$/^$1\$/g;              # strip "(?:-xism" and ")"
print "$re\n";

Для следующих десяти файлов:

FILE20090802120343.txt
FILE20090802165139.txt
FILE20090802181550.txt
FILE20090804014529.txt
FILE20090804140848.txt
FILE20090805103525.txt
FILE20090805104025.txt
FILE20090810083211.txt
FILE20090810120349.txt
FILE20090810121250.txt

Скрипт выдает такой результат:

^FILE200908(?:0(?:510(?:40|35)25\.txt|21(?:81550|20343|65139)\.txt|4(?:140848|014529)\.txt)|10(?:12(?:1250|0349)\.txt|083211\.txt))$

Что и требовалось.

Пользуясь случаем, хочу порекламировать PDF-версию третьего издания книги «Регулярные выражения» Джеффри Фридла

linux - 8 комментариев

Дым над Лебердоном

07.07.2009

Вторую неделю рунет бурлит и негодует по поводу решения Кировского райсуда г.Ростова-на-Дону от 15 июня, согласно которому группа Deep Purple «незаконно», без согласования с РАО, 19 октября 2008 года исполнила собственные произведения в городе Ростов-на-Дону. Вот ссылка на юридический форум, где обсуждается данное дело, а вот сканы в удобочитаемом виде. Впрочем, из обоих источников нормальному человеку все равно ничего не понятно, поэтому новость распространилась в следующей придуманной добрыми людьми формулировке:

«Приехала как то в Ростов–на–Дону всемирно известная и очень любимая нынешним президентом России группа Deep Purple, сыграла концерт и уехала. И никто не ждал подвоха, пока через некоторое время к организаторам концерта не пришли местные представители РАО и попросили заплатить за то что какие то засранцы Ян Гиллан, Роджер Гловер, Стив Морс и Ян Пейс в славном городе Ростове исполнили песни всемирно известных артистов Яна Гиллана, Роджера Гловера, Стива Морса и Яна Пейса. Организаторы отказались, после чего РАО подало на них в суд и выиграло. Ну и напоследок, самое вкусное — сканы решения суда заставляющие гордится мощью и эффективностью системы, под названием Российское Авторское Общество»

А между тем, если внимательно прочитать сканы решения, суть дела понять вполне можно, и абсурдное «РАО против Deep Purple» превращается в «Deep Purple против организаторов концертов, не уплативших авторские отчисления». Подробно об этом написано в комментарии хабрапользователя Вадима Галкина:

Организаторы концерта обязаны были заплатить группе:
а) деньги за исполнение,
б) авторские отчисления.

Почему надо оплатить авторские отчисления тем, кто сам исполняет? Потому что сочиняют песни разные люди, одни играют свое, другие нет. Есть те, кто сочинил, но в туре не участвует. Они тоже должны получить свои деньги.

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

Здесь и происходит самое интересное. Да, в договоре такого пункта нет. Организаторы решили, что если пункт исключить, то платить не надо. Но они ошиблись. Если они не хотели платить авторское вознаграждение, то надо было включить в договор пункт, что платить не будем. Договор подписан, группа с этим согласилась, требовать не имеет право.

Но в гражданском законодательстве действует другой принцип: если какого-то пункта в договоре нет, то решается все на основании кодексов, законов, или деловой практики. Суд ссылается именно на деловую практику и деловую традицию. Так принято, организатор платит и за выступление и выплачивает авторское вознаграждение.

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

Итог: это не маразм РАО, это не маразм суда, это просто разборки между юрлицами. Организаторы концертов хотели сэкономить, но сделали это не профессионально. Представители группы (IMB) обратились в РАО, что бы те взыскали деньги, потому что имеют право.

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

Таким образом, кроме спора юридических лиц, ведущегося в рамках закона, имеем очередную иллюстрацию известного демотиватора и панику на пустом месте.

Будьте бдительны. Не поддавайтесь на провокации.

P.S. 21 октября 2008 года, через два дня после концерта в Ростове-на-Дону , Deep Purple должны были бы выступать в Нижнем Новгороде в традиционном для концертов такого масштаба Нагорном Дворце Спорта. Но за пару недель до концерта вдруг выяснилось, что в свежеотремонтированном здании Дворца Спорта нельзя проводить любые шоу, кроме ледовых представлений и хоккейных матчей. Поэтому приезд DP в НН со скандалом отменили и, похоже, больше они в наш город ни ногой. Равно как и другие звезды их уровня.

linux - 4 комментария

Мелкие хитрости midnight commander

18.06.2009

Из /usr/share/doc/mc/README.Debian:
- если в истории команд mc постоянно присутствуют строки вида cd "`printf "%b" '\0057home'`", убедитесь, что в переменной окружения HISTCONTROL присутствует ignorespace или ignoreboth, или же эта переменная вообще отсутствует. Подробности в debian bug 440102.
- действие, с незапамятных времен выполнявшееся по кнопкам M-O (в противоположной панели отобразить путь в текущей панели), с 4.6.2-pre1 пор переехало на M-I, а на M-O теперь отображение в другой панели родительского каталога, или каталога, находящегося под курсором. Эргономично, да, но очень непривычно. Кстати, русскоязычная справка, вызываемая по F1, описывает старое поведение.


У нас есть несколько папок с однотипными объектами вида 1.1.1.1, 1.1.1.2, …, 1.1.1.10, 1.1.1.11, …, 1.4.3.5, 1.4.3.9, 1.4.3.10 …. Опытные разработчики уже, наверно, догадались, к чему я клоню :) При обычной алфавитно-цифровой сортировке 1.1.1.10 следует после 1.1.1.1, но до 1.1.1.2, что очень неприятно. У GNU-версии ls есть специальная опция -v, которая как раз выводит файлы в порядке возрастания версий. А в mc ничего похожего, увы, нет.

За 10 минут сделал патч, добавляющий вариант «сортировать файлы по версии» в меню выбора режима сортировки. К сожалению, простой правкой конфига тут обойтись не получилось, поэтому пришлось пересобрать пакет mc целиком — еще 40 минут, но оно того стоило :-)


Мегаполезной фичей вдруг оказалось пользовательское меню, которым я раньше почти никогда не пользовался (наверно, потому, что там ничего полезного не было — ну на кой мне «распаковать архив», если я то же самое сделаю тремя привычными способами). Прочитав раздел справки про mc.menu и добавив в ~/.mc/menu несколько строчек, я сэкономил себе кучу времени, тратившегося на бесконечные

vimdiff Alt-A Alt-Enter Tab Alt-A Alt-Enter Enter

и

diff -rubB Alt-A  Tab Alt-A Enter

Этот код добавляет в меню две команды: сравнения двух каталогов и мержа файла в одном каталоге с одноименным файлом в другом каталоге:

d   Compare directories
    if [ "%d" = "%D" ]; then
      whiptail --msgbox "The two directores must be different" 7 60
      exit 1
    fi
    diff -rubB "%d" "%D" | vim -

# обычный непомеченный файл
+ t r & ! t t
f   Diff & merge file under cursor with the same file in other panel
    if [ "%d" = "%D" ]; then
        # если в противоположной панели открыта та же папка
        whiptail --msgbox "The two directores must be different" 7 60
      exit 1
    fi
    if [ ! -f "%D/%f" ] ; then
       # если в противоположной панели нет файла с таким же именем
        whiptail --msgbox "No copy of %f in %D" 7 60
        exit 1
    fi
    if diff -q "%D/%f" "%d/%f" ; then
       # если файлы не различаются
        whiptail --msgbox "%D/%f and %d/%f are identical" 10 80
        exit 1
    fi
    vimdiff "%d/%s" "%D"

linux - 0 комментариев

Рекурсивные операции с файлами в Linux

16.06.2009

Иногда возникает путаница между опциями -r и -R, каждая из которых в разных программах может означать рекурсивную обработку файлов в найденных каталогах. А может означать нечто совершенно противоположное или работать не так, как этого ожидал пользователь. Попробуем разобраться, в каких случаях что используется.

Эпиграф

— Это новый «Гарри Поттер». Я заказал версии для детей и взрослых, чтобы проверить, что в тексте нет различий.
Морис Мосс, The IT Crowd.

chmod

Неправильно:

chmod -r 755 dir

Ключ -r у chmod интерпретируется как «запретить всем чтение файла», а 755 в данном случае рассматривается как название файла, у которого изменяются права. Поскольку в подавляющем большинстве случаев файла с таким названием в текущей директории отсутствует, то команда возвращает ошибку.

Правильно:

chmod -R 755 dir

chown, chattr, chgrp

Неправильно:

chown -r user:group dir
chattr -r dir +I
chgrp -r group dir

У вышеперечисленных команд опция -r просто отсутствует. Для рекурсивной обработки директорий необходимо использовать опцию -R. Очевидно, так сделано из солидарности с «братской» командой chmod

Правильно:

chown -R user:group dir. .
chgrp -R group dir
chattr -R dir # только Linux, только для ext2/ext3

cp

Неправильно:

cp -r dir destdir

Правильно:

cp -R dir destdir

Несмотря на то, что в странице документации cp из GNU coreutils сказано, что опции -r и -R равнозначны и означают рекурсивную обработку встречающихся директорий, опция -r, в отличие от -R, не соответствует стандарту POSIX и ее указание может повлечь за собой неожиданные последствия в случае, если очередной копируемый объект является чем-то отличным от обычного файла или директории (например, символической ссылкой, fifo или сокетом). В таких случаях некоторые реализации cp просто копируют содержимое ссылки/fifo, тогда как при -R такие объекты пересоздаются заново. Раньше такое поведение было присуще GNU cp, о чем до сих пор имеется свидетельство в русском man cp. Что касается более правильных (чем Linux) систем, то, например, в BSD-версии cp опция -r работает в «режиме совместимости», т.е. не создает символическую ссылку заново, а копирует содержимое в файл с тем же именем.

ls

Неправильно:

ls -r

Ключ -r команды ls означает «обратный порядок сортировки»
Правильно:

ls -R

rm, grep

Зато в следующих случаях употребление -r/-R равнозначно:

rm -r dir
rm -R dir

а также

grep -r pattern dir
grep -R pattern dir

Что касается grep, то, во-первых, обе опции не соответствуют POSIX (но, похоже, присутствуют во всех реализациях) Во-вторых, иногда возникает путаница между опциями -i (игнорировать регистр) и -I (пропускать двоичные файлы). Но это уже тема для другого разговора :)

Прочие команды

Поскольку команд, в том или ином виде поддерживающих рекурсивную обработку каталогов, набралось довольно много, то я попробовал свести их в одну таблицу.

команда -r -R
chacl рекурсия удаление ACL только с файлов
setfacl не поддерживается рекурсия
cvs номер ревизии рекурсия
diff рекурсия не поддерживается
gzip/gunzip рекурсия не поддерживается
zip рекурсия рекурсия, начиная с текущей директории (см. man zip, там есть существенная разница в обработке -r и -R)
rsync рекурсия использование относительных путей
wget рекурсия указывает список отвергаемых шаблонов

Заключение

Как видно, в большинстве случаев для указания рекурсии используется опция -r в нижнем регистре, в противовес стандартным утилитам, для которых характерно все же -R. Поэтому совет один: в случае сомнения смотрите в man, там все написано :)

Постскриптум

По абзацу про cp видно, что русская документация в некоторых дистрибутивах (не будем показывать пальцем на Debian и Ubuntu) не соответствует реальному положению дел. В частности, несмотря на то, что в jaunty используется GNU coreutis 6.10, русский man описывает cp версии 4.1. Желающие могут самостоятельно сравнить свою версию man 1 cp с локализованной. Другими словами, русская страница документации cp в силу своей древности вводит пользователя в заблуждение, т.е. врёт. По этой причине я рекомендую сделать apt-get remove manpages-ru.

linux - 2 комментария

Несколько одновременно загруженных профилей firefox

08.06.2009

Часто возникает задача проверить функционал разрабатываемого или поддерживаемого веб-интерфейса под двумя логинами одновременно. Например, изменяя настройки доступа некоего пользователя под логином администратора, тут же проверять эти настройки в пользовательской системе. Или проверить второй ящик gmail, не выходя из основного. Однако firefox всегда открывает новые окна и табы в рамках уже запущенного процесса, что, казалось бы, делает невозможным одновременное использование двух авторизаций.

Однако выход, как всегда, есть (и не один)! В ff начиная со второй версии есть ключ --no-remote, который заставляет firefox всегда запускать новый процесс. В комбинации с ключом -ProfileManager это дает возможность создавать и использовать столько профилей, сколько заблагорассудится (лично мне вполне хватает двух дополнительных профилей, плюс еще один под клиент-банк).

Чтобы в среде gnome не вводить каждый раз командную строку, можно в ярлыке запуска firefox указать что-то вроде:

firefox %u -ProfileManager --no-remote

Тогда при каждом клике на значок firefox’а будет открываться окно с менеджером профилей (где желательно снять галку «Don’t ask at startup», чтобы выбранный профиль не загружался автоматически). Возможно, это создаст некоторые неудобства из-за того, что при каждом клике на кнопку запуска открывается новый независимый процесс, а не используется существующий, но преимущества в данном случае перевешивают недостатки.

P.S. В вышеприведенном примере %u необходим, чтобы можно было перетаскивать файлы с рабочего стола или nautilus’а на этот значок.

P.P.S. насколько я понимаю, в IE подобная возможность отсутствует как класс. Поправьте меня, если я ошибаюсь :)

linux - 4 комментария

Читаете ли вы perlop?

03.06.2009

Еще немного про perl. Перелистывая Perl Cookbook, вдруг осознал, что никогда не задумывался о возможностях оператора диапазона «..«. То есть, конечно, понятно, что в списковом контексте он вернет список значений от левого операнда до правого и конструкция foreach(1 .. 5) превратится в начало натурального ряда. А вот про то, что в скалярном контексте этот оператор ведет себя наподобие диапазона в sed, я не знал. Например, часто возникающая задача «сделать что-то с данными между открывающей и закрывающей строкой» решается просто и элегантно:

perl -ne 'print if /<Directory /i .. /<\/Directory>/i' httpd.conf

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

Не последнюю роль тут играет и местами довольно сложный язык документации. Но мир меняется к лучшему и недавно на translated.by в рамках проекта pod2-ru под руководством Анатолия Шарифулина народ принялся за перевод perldoc. К настоящему моменту уже переведены: perlbook, perldoc, perlpragma, perlstyle; на подходе perlintro и в процессе одна из центральных страниц документации — perlfunc. Также переведена примерно половина perlboot. Так что если есть желание и возможность помочь в переводе документации perl, присоединяйтесь к любому из этих переводов или начинайте свой. Даже с минимальными знаниями английского языка вы можете помочь в качестве редактора или корректора. В общем, внесите уже свой вклад в open source :)

linux - 5 комментариев

Приоритеты операторов в Perl

15.05.2009

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

Сначала был примерно такой код:

while(<STDIN>)
{
    if(($name) = $_ =~ /^\s*source (.*)\.sql/i)
    {
        if (&function $name)
        {
            # do something with $name
        }
    }
}

Логично было бы объединить два условия в одно:

while(<STDIN>)
{
    if(($name) = $_ =~ /^\s*source (.*)\.sql/i && &function $name)
    {
        # do something with $name
    }
}

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

Для простоты рассмотрим однострочник на Perl, локализующий эту проблему:

echo o|perl -ne 'print "aga\n" if (($o) = $_ =~ /(a)/ && 1)'

Здесь в одном условии встречаются три оператора: присваивания =, привязки =~, а также логическое И &&. Согласно perldoc perlop, оператор присваивания имеет более низкий приоритет, чем два остальных, поэтому выполняется последним, и код можно представить в виде:

echo o|perl -ne 'print "aga\n" if (($o) = ( $_ =~ /(a)/ && 1 ) )'

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

Поэтому при объединении условий всегда нужно проверять приоритеты операторов и группировать условия вручную:

while(<STDIN>)
{
    if( ( ($name)=$_=~/^\s*source (.*)\.sql/i ) && &function $name)
    {
        # do something with $name
    }
}

linux - 3 комментария

Вязаный FreeBSD Beastie

03.05.2009

FreeBSD daemon

Ещё один культовый персонаж, сделанный руками моей жены.

linux - 4 комментария

Вязаный Tux

24.04.2009

Вязаный Tux

Жена связала :-)

linux - 7 комментариев

Немного о работе

14.04.2009

Уже более двух месяцев тружусь на новом рабочем месте в отделе решений voip нашей компании — занимаюсь поддержкой веб-интерфейса управления основным продуктом: исправляю накопившиеся баги, создаю новые :), а также готовлю релизы. Все работает под Debian Lenny, на базе Apache 2 + PHP5 + MySQL 5.

По сравнению с предыдущей деятельностью сменилось вроде бы немногое — базовый дистрибутив поменялся с Fedora на Debian, PostgreSQL — на MySQL (с удивлением узнал, что хранимые процедуры в MySQL появились только начиная с 5.0, а подзапросы тут и сейчас кривоваты), PHP4 на PHP5 (exceptions рулят), плюс ко всему в окне стало видно небо и две трубы :) Но рабочее окружение пришлось слегка модифицировать. Поначалу были предпосылки к тому, чтобы перейти обратно на Windows, но, попробовав что-то серьёзно там поделать, я понял, что в операционной системе без родного клиента ssh и человеческого терминала я жить не смогу, плюнул и остался на Ubuntu 8.10. К тому же мне выдали новый компьютер (Athlon 64 X2 вместо Pentium 4) с двухголовой Nvidia GeForce 8500 GT (вместо интегрированного i815), и после перетыкания жесткого диска XP просто перестала загружаться.

Да и в убунте из-за того, что всё железо, кроме жесткого диска, полностью новое, возникли некоторые проблемы, в частности, зависал Xorg (и тянул за собой клавиатуру) при двух подглюченных мониторах. Решение в конце концов свелось к перенастройке сети и установке драйверов от nvidia (драйвер nv из xorg почему-то не захотел нормально работать):

1. загрузился в single mode
2. отключил запуск сервиса gdm:

sudo update-rc.d gdm remove

3. в /etc/udev/rules.d/70-persistent-net.rules в строчке, относящейся к старой сетевой карте, поменял mac-адрес на новый:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1a:92:15:61:33", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

4. перезагрузился, убедился, что сеть доступна (пришлось сходить к админам и попросить их также поменять mac-адрес в настройках корпоративного DHCP на новый)
5. установил свежий (на тот момент) комплект драйверов от nvidia:

sudo apt-get install nvidia-glx-173 # (последняя на момент установки версия nvidia-glx)
sudo mv /etc/X11/xorg.conf /etc/X11/xorg.`date "+%Y%m%d%H%m%S"`.conf
sudo nvidia-xconfig # создался новый xorg.conf

6. загрузился в графическую оболочку (service gdm start), запустил nvidia-settings, включил TwinView в режиме «растягивания» рабочего стола на два монитора 1280×1024 (получилось разрешение 2560×1024)
7. вернул автозапуск gdm:

update-rc.d gdm defaults

Продолжение следует.

linux - 1 комментарий