[ Content | View menu ]

Угадывание мыслей и выполнение несуществующих команд средствами bash

17.11.2008

В Debian в bash был добавлен патч, благодаря которому пользователь может написать свою функцию, выполняемую в случае, если введённая пользователем команда отсутствует. В Ubuntu эту фичу использует подсказка command-not-found, заметно тормозящая работу, в то время как можно найти более интересные и полезные возможности применения этого механизма, оставив поиск пакета специализированным программам. Поделюсь своим опытом.

У нашего подразделения есть специальная сеть для тестовых серверов и виртуальных машин: 192.168.20.0/24, и очень часто приходится набирать команды типа ssh user@192.168.20.xx, причем в командах различается только последняя цифра. У ограниченного числа серверов нужно указывать другой username. Реже приходится ходить на сервера в других подсетях (в пределах 192.168.0.0/16); также иногда клиенты открывают нам доступ к своим системам, чтобы мы смогли продиагностировать их проблему и решить ее на месте.

Как следует из предыдущего абзаца, очень часто набираются команды вида:

ssh ordinary_user@192.168.20.xx
ssh special_user@192.168.xx.yy
ssh third_user@ww.xx.yy.zz

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

alias 123='ssh user@192.168.20.123'

Однако вскоре я понял, что поддерживать список из полусотни alias’ов — не true unix way, и задумался об альтернативах. Вспомнил об опытах вебмастеров эпохи web 1.0 по использованию 404 ошибки для отображения страницы с нужным содержанием, задумался о том, каким образом bash перехватывает вызов неизвестной команды и подменяет её командой поиска нужного пакета… В результате беглого изучения состава пакета command-not-found было выяснено, что используется функция command_not_found_handle. Она принимает в качестве аргумента введённую пользователем команду, выполняет некие действия и возвращает 127, если ничего нельзя сделать (в таком случае bash выводит стандартное сообщение об ошибке), или любое другое число, если что-то получилось.

Остальное оказалось делом техники. В ~/.bashrc была добавлена функция:

command_not_found_handle () {
    if [[ ! "$1" ]] ; then
        return 127
    fi

    n="$1"

    if echo $n| perl -ne 'exit(/^([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/ ? 0:1)' ; then
        ip=192.168.20.$n
    elif echo $n| perl -ne 'exit (/^([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/ ? 0:1)' ; then
        ip=192.168.$n
    elif echo $n| perl -ne 'exit (/^([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/ ? 0:1)' ; then
        ip=$n
    else
        return 127
    fi

    ssh $ip
}

Любое введённое число от 1 до 255 преобразуется в команду ssh 192.168.20.число; два числа — в ssh 192.168.число.число; любой введённый IP-адрес превращается в ssh IP-адрес. Во всех остальных случаях просто выводится сообщение "command not found".

Поскольку используется довольно сложное регулярное выражение, то для его обработки пришлось использовать perl. Ещё был вариант с grep -qP, но эксперименальная опция -P (расширенная поддержка perl-овых регулярных выражений) включена в grep не во всех дистрибутивах (например, в Ubuntu 8.04 её нет, а в 8.10 уже есть).

Чтобы для всех хостов в 20 сети подставлялось общее имя пользователя ordinary_user, а для избранных хостов — специальные имена, в ~/.ssh/config я добавил строчки (общие параметры для всех хостов, предваряемые конструкцией Host *, должны находиться в конце списка):

Host 192.168.20.251
User special_user1

Host 192.168.20.252
User special_user2

Host 192.168.20.254
User special_user3

Host *
User ordinary_user

К сожалению, мне не удалось заставить эту функцию обрабатывать также и параметры командной строки: функции command_not_found_handle передаётся только первый позиционный параметр, остальные недоступны. Поэтому для каждого нестандартного хоста придётся либо писать полный вариант команды со всеми параметрами, либо указывать настройки сервера в ~/.ssh/config, подобно указанным выше. Имеются и прочие недостатки в реализации, обсуждаемые, в частности, на сайте smylers hates software.

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

P.S. бонус для дочитавших до этого места: библиотека регулярных выражений perl, где я нашел регэксп для проверки строки на соответствие IP-адресу.

Метки: bash, debian, Linux, ssh, tips, ubuntu

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

su vs sudo

10.11.2008

С давних времен многих смущает разнообразие вариантов обеспечения безопасности при выполнении операций с максимальными привилегиями. Например, в официальной документации ubuntu в качестве команды редактирования рекомендуется использовать что-то вроде sudo nano, а в многочисленных любительских мануалах (в стиле “5 фокусов в командной строке, которые удивят вашу бабушку”) для получения root’ового шелла предлагается писать “sudo su -”. Попробую объяснить, почему такое положение вещей кажется мне неправильным.

Исторически единственным универсальным способом выполнить команду от имени другого пользователя в Unix была программа su. Запущенная без параметров, она запрашивала пароль суперпользователя и в случае успеха просто подменяла текущее имя пользователя на root, оставляя почти все переменные окружения от старого пользователя (кроме PATH, USER и еще пары-тройки, см. man su от своего дистрибутива). Более правильно было запускать ее как su - — в таком случае оболочка получала также и правильный environment. С параметром -c можно было выполнить команду: su -c "vim /etc/fstab".

При этом пользователям приходилось помнить пароль root’а и у всех пользователей, перечисленных в группе “0″ (т.е. в группе, члены которой могли выполнить команды su и стать суперпользователем), был одинаковый неограниченный доступ ко всей системе, что являлось серьёзной проблемой безопасности.

Затем появилась команда sudo, и это был прорыв. Теперь администратор мог указывать список разрешенных команд для каждого пользователя (или группы пользователей), файлы, доступные для редактирования, специальные переменные окружения и многое другое (все это великолепие управляется из /etc/sudoers, см. man sudoers от своего дистрибутива). При запуске sudo спрашивает у пользователя его собственный пароль, а не пароль root. Полноценный шелл можно получить с помощью “sudo -i

Стоит особо упомянуть о специальной команде sudoedit, безопасно запускающей редактор, указанный в переменной окружения $EDITOR. При более традиционной схеме редактирование файлов производилось примерно так:

sudo vim /etc/fstab

Запускаемый таким образом vim наследовал оболочку с неограниченными правами и через :! пользователь мог запускать любую команду (если, конечно, админ не позаботился об этом заранее) и открыть любой файл.

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

В Debian-based дистрибутивах пользователь root не имеет пароля, вместо этого все административные действия должны производиться через sudo или его графический аналог gksudo. Являясь полной заменой su, sudo должна бы быть единственной командой переключения между пользователями, однако, как было сказано вначале, в настоящий момент это не так и все зачем-то изобретают дикие последовательности из sudo, su, vi и черточек.

Поэтому предлагаю всем раз и навсегда запомнить:

выполнить команду от имени root: sudo command
редактирование файлов от имени root: sudoedit file
оболочка root: sudo -i

Upd. Тут коллеги в комментариях жалуются на то, что sudo echo 1 >> /etc/apt/sources.list не работает. Это происходит потому, что права повышаются только для команды echo, а результат уже перенаправляется в файл с правами обычного пользователя. Чтобы добавить что-нибудь в privileged_file, нужно выполнить такую команду:

echo 1| sudo tee -a privileged_file >/dev/null
Метки: Linux, root, shell, sudo, ubuntu

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

Как я обновлялся до Ubuntu 8.10

08.11.2008

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

Первым делом столкнулся с нехваткой места: установщик обновлений потребовал 1,6 Гб места в корневом разделе, а поскольку при распределении места я пожадничал и выделил под / чуть меньше пяти гигабайт, которые, естественно, сразу же забились, то пришлось основательно почистить систему от старых ядер, ненужных приложений, документации, различных кэшей и т.д. После этого никаких проблем с обновлением не возникло, почти все моё железо продолжило работать в прежнем режиме, включая USB-карточку Netgear WG111T, драйвер которой загружался через ndiswrapper… Кроме графической карты ATI Radeon X1650 Pro, которую и в hardy не удавалось заставить работать на полную мощность ни с проприетарным fglrx, ни с открытым radeon от X.org — обходился vesa. Но и этот баг оказался во благо: достаточно было удалить из /etc/modprobe.d/blacklist драйвер radeon, внесенный туда в процессе предыдущих экспериментов по настройке видеокарты, и внести его в /etc/modules. Затем немного подправил xorg.conf и все отлично заработало.

Через неделю успешного использования Ubuntu Intrepid Ibex дома я решил, что функциональность нового дистрибутива меня устраивает и неплохо бы обновить и рабочий компьютер. Некоторое время назад в нашей компании наконец набралась критическая масса пользователей-линуксоидов, и совместными усилиями удалось уговорить админов открыть неограниченный доступ к вышеупомянутому репозиторию хотя бы в нерабочее время с 18:00 до 9:00 следующего дня (в нашей провинции принято экономить трафик, поэтому каждому корпоративному пользователю еженедельно выделяется 50 мегабайт http-трафика, на которые систему особо не обновишь). Поскольку пакеты устанавливались из этого репозитория без проблем, то я решил, что обновление дистрибутива также пройдёт без особых приключений. Как же я ошибался!

Основная проблема заключалась в том, что в графическом менеджере обновлений никак не появлялась кнопка «доступен новый дистрибутив». Попытка решить проблему методом гугления ничего не дала, кроме еще одного бедолаги, по странному стечению обстоятельств также жаловавшегося на невозможность обновить систему на работе стандартными средствами, тогда как дома все прошло нормально. Автоматический апгрейд из командной строки (do-release-upgrade), едва начавшись, завершался с сообщением: «Checking for a new ubuntu release: no new release found».

Поэтому я полез в исходники (на python я за всю жизнь не написал ни строчки, однако, как оказалось, читать его исходники очень легко) и в /usr/lib/python2.5/site-packages/UpdateManager/Core/MetaRelease.py нашёл, что для определения доступности нового релиза менеджер обновления обращается к файлу по адресу http://changelogs.ubuntu.com/meta-release, который в моем случае был недоступен из-за особенностей нашего корпоративного прокси (сервер обновлений доступен напрямую, тогда как к changelogs.ubuntu.com необходимо обращаться через прокси-сервер с авторизацией).

Как всегда, обнаружилось несколько способов решения проблемы:
— выкачать Alternate CD и обновиться с него: с учетом наличия сети — не тру unix way :) приберегу этот способ для своего eee pc, на котором в любом случае не хватит места для выкачивания новых пакетов;
— поднять свой прокси-сервер, который обращался бы напрямую к yum.fireground.ru и через корпоративный прокси — ко всем остальным ресурсам: неохота ставить монстрообразный сквид для такой простой задачи, а в более мелких и простых прокси разбираться нет времени, хотя задача интеллектуального переключения между несколькими прокси вне зависимости от клиента (proxy.pac не подходит) довольно интересна;
— создать локальную копию changelogs.ubuntu.com и в вышеупомянутом скрипте MetaRelease.py указать свой адрес: также не совсем правильно с точки зрения соблюдения целостности системы, поскольку требует неконтролируемых изменений в программе, а не в конфигурационном файле, и в процессе обновления этот файл будет заменен (необходимо заметить, что в update-manager в intrepid уже можно указывать свои сервера в /etc/update/manager/meta-release).

Я пошел немного другим путем: нашел инструкцию по ручному обновлению 8.04 до 8.10 и воспользовался ей. Краткое содержание (используйте на свой страх и риск):

sudo -s # become superuser

# заменить hardy на intrepid в /etc/apt/sources.list
# лучше воспользоваться текстовым редактором :)
sed -i '/^deb/ s/hardy/intrepid/g' /etc/apt/sources.list

aptitude update
aptitude update # два раза — не опечатка! подробности см. по ссылке выше
aptitude upgrade
aptitude dist-upgrade
aptitude upgrade

Поначалу я вместо «intrepid» в /etc/apt/sources.list «interpid», за что и был обруган :) В процессе обновления опять же не хватило места, пришлось на ходу удалить несколько неиспользуемых ядер, освободив при этом порядка 200 мегабайт), а также слегка чужеродный для гномоориентированного ubuntu amarok, из-за которого не удовлетворялись какие-то зависимости. Пришлось немного поотвечать на вопросы о различиях в конфигурационных файлах; тут приятно удивило то, что задавались вопросы только о настройках, используемых по умолчанию, внесенные пользователем изменения в конфигурации не затрагиваются. По сравнению с mergemaster в FreeBSD это большой шаг вперёд в автоматизации системного обновления :) (правда, FreeBSD последний раз приходилось обновлять с 4.11 до 5.4 и сейчас я не в курсе нынешнего состояния механизма апгрейда, возможно, что-то поменялось в лучшую сторону).

Учитывая то, что все вышеописанное я проделывал из дома, используя только ssh, и в процессе лишь один раз перезагружался для загрузки с новым ядром — обновление прошло просто идеально. Правда, новый внешний вид системы на этом компьютере я еще не успел оценить :) но, поскольку там используется простенькая мать со чипсетом 82801FB 2004 года выпуска, то никаких проблем с графикой не ожидается.

Собственно о впечатлениях от новых фич Intrepid Ibex (а их много: и фич, и впечатлений) расскажу как-нибудь в другой раз. Вкратце скажу, что особых тормозов не замечено, система работает стабильно и без ошибок.

P.S. Для нагугливших этот пост по ключевым словам «ubuntu intrepid radeon x1650» привожу краткую инструкцию по настройке.
read more…

Метки: intrepid, Linux, ubuntu

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

Мелочи жизни

10.09.2008

1. Мини-программа AllTray, единственное назначение которой — минимизация окон в трей. Работает в Gnome, KDE, XFCE4, FluxBox и WindowMaker. Присутствует в universe-репозитории Ubuntu (sudo apt-get install alltray), имеются готовые пакеты для Fedora, SUSE, Debian, Gentoo.

2. В состав пакета MouseTweaks входит апплет pointer-capture-applet, представляющий из себя область на панельке, куда можно ткнуть мышкой, после чего отключается курсор и некоторые сочетания клавиш типа Alt-Tab или Alt-F1. Чтобы включить всё обратно, нужно еще раз кликнуть мышкой или нажать волшебную комбинацию клавиш (настраивается). Отключение возможности переключаться в другие программы серьёзно улучшает производительность, проверено на себе :-) MouseTweaks входит в комплект поставки Ubuntu и вроде бы ставится по умолчанию вместе с Gnome.

Метки: gnome, lifehack, Linux, ubuntu

Linux - 6 комментариев

Как распаковать vmlinuz и вытащить оттуда версию компилятора

05.09.2008

Иногда бывает необходимо узнать полную версию ядра Linux, не имея возможности или желания грузиться с него. Например, сегодня мне нужно было перекомпилировать ядро с незначительными изменениями в .config и самым тщательным образом убедиться, что новый vmlinuz ничем не отличается от старого. Один из ключевых моментов — это строчка vermagic, которая должна совпадать у ядра и загружаемых модулей. Эта строчка выводится в начале загрузки ядра, например:

Linux version 2.6.24-19-generic (buildd@terranova) (gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)) #1 SMP Fri Jul 11 23:41:49 UTC 2008 (Ubuntu 2.6.24-19.36-generic)

Интересующихся смыслом vermagic отправляю к главе 2.8 The Linux Kernel Module Programming Guide и описанию опции --force-vermagic в man modprobe.

Vermagic незагруженного модуля, находящегося в текущем каталоге, можно узнать по команде modinfo ./module_name.ko (работает, даже если модуль собран для другой архитектуры, например, если мы работаем в i386, а модуль — для x86_64, и наоборот). С ядром такой фокус не пройдет: во-первых, ядро, как правило, находится в сжатом виде, а исходники ядра не всегда доступны; во-вторых, сжатое ядро представляет собой загрузчик и распаковщик, за которым следует собственно сжатый алгоритмом zlib vmlinux (вопреки распространенному мнению, bzImage — это не ядро, сжатое bzip’ом, а сжатое ядро, которое можно загружать в несвязанные между собой области памяти), и необходимо отделить сжатое ядро от загрузчика.

Решение нашлось на форуме CodeGuru.

Заголовок gzip начинается с байт 1f 8b 08 00, их и будем искать. По ссылке выше рекомендуют использовать команду od -A d -t x1 vmlinuz|grep "1f 8b 08 00", и в некоторых случаях это действительно помогает, однако, во-первых, остаётся много трудноалгоритмизируемой ручной работы (необходимо отсчитать количество байт от смещения первого байта в строке до начала собственно заголовка gzip); во-вторых, две части искомого фрагмента могут находиться в разных строках, как, например, в текущей версии generic-ядра Ubuntu:

0011376 00 fd f3 a4 fc 5e 81 c5 ff ff 0f 00 81 e5 00 00
0011392 f0 ff 8d 83 90 01 1d 00 ff e0 01 01 1d 00 1f 8b
0011408 08 00 26 a1 ac 48 02 03 ec 3a 6d 74 14 55 96 af
0011424 3b d5 49 77 e8 58 15 a7 5b 5b b6 19 1a 2d 30 19

В данном случае, чтобы вычислить актуальное смещение заголовка gzip, необходимо к смещению первого байта в строке (11392) прибавить еще 14 байт. Поэтому мы пойдём немного другим путём.

Как я уже писал ранее, в состав исходников ядра Linux входит программа binoffset, с помощью которой можно находить сколь угодно длинные последовательности байт в бинарном файле. Ей и воспользуемся, благо она присутсвует также и в пакете linux-headers в Ubuntu:

$ gcc -o binoffset /usr/src/linux/scripts/binoffset.c
$ /binoffset /vmlinuz 0x1f 0x8b 0x08 00 2>/dev/null
11406

Теперь “вытащим” из vmlinuz сжатое ядро и распакуем его:

$ dd if=/vmlinuz skip=11406 bs=1|gzip -d >vmlinux

В vmlinux уже можно искать нужные строки:

$ strings vmlinux |grep gcc
Linux version 2.6.24-19-generic (buildd@terranova) (gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)) #1 SMP Wed Aug 20 22:56:21 UTC 2008 (Ubuntu 2.6.24-19.41-generic)
%s version %s (buildd@terranova) (gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)) %s

Как видно, получили почти то, что нам нужно. Теперь сократим все вышенаписанное в одну строчку:

(dd if=/vmlinuz skip=`./binoffset /vmlinuz 0x1f 0x8b 0x08 0x00` bs=1|gzip -d |strings|grep "^Linux version") 2>/dev/null

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

P.S. Примерно то же самое делает скрипт /usr/src/linux/scripts/extract-ikconfig, только нужно слегка его модифицировать, чтобы он выдавал не конфиг, а распакованное ядро, но мне было интересно изобрести очередной велосписед и разобраться самостоятельно :-)

Метки: kernel, Linux

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

Спросите меня!

30.06.2008

Ежедневно наблюдая 30-40 человек в день, приходящих с поисковых систем по разнообразным запросам и посещающих одну-две страницы, решил немного облегчить их жизнь и дать им то, что они ищут. А что может быть проще и понятней, чем прямой ответ на поставленный ответ вопрос?!

Итак. В правом нижнем углу каждой страницы сайта теперь находится небольшой темный прямоугольник с заголовком и двумя кнопками: развернуть и закрыть. При нажатии на заголовок этого прямоугольника или кнопку “развернуть” появится поле ввода сообщения. В это поле можно что-нибудь написать, и я тут же получу ваше сообщение по протоколу XMPP (aka Jabber). Если в данный момент я в состоянии ответить, то ответ воспоследует и вы тут же его увидите. Если меня нет в онлайне, то сообщение ко мне все равно придёт, но ответить я скорее всего не смогу, поскольку вы со страницы уже уйдёте :-) Поэтому просто оставляйте вопрос и координаты, куда отвечать.

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

Метки: hab.la, блог

Блоговодство - 17 комментариев

Небольшой костыль для мониторинга ресурсов

23.06.2008

На одном высоконагруженном сервере постоянно возникала нехватка ресурсов: то httpd расплодится и забьёт таблицу процессов, то место закончится, то память… Поэтому необходимо было мониторить несколько разных параметров. Разумеется, впоследствии тут не обошлось без Nagios’а, а в качестве срества дополнительного контроля мы сделали мелкий скриптик /usr/local/bin/hh, в который написали несколько строчек вида:

#!/bin/sh
df -h /usr/ | awk '$6~/^\/usr$/ {print $4" space available on /usr"}'
ps ax | grep httpd | grep -v grep | wc -l | awk '{print $1,"httpd processes running"}'

Запуск скриптика поместили в ~/.cshrc (дело было под FreeBSD) каждого заинтересованного пользователя, после чего, входя на сервер, админы получали необходимую информацию о состоянии системы и, если что, предпринимали действия по устранению неполадок.

Сейчас почти то же самое у меня работает на Asus EEE PC — в условиях крайне ограниченного места необходимо время от времени его мониторить, а захламлять панель (и память) апплетами очень не хочется. Поскольку я постоянно использую консоль, то посчитал логичным выводить информацию о свободном месте при каждом логине. Одна лишняя строчка при входе в шелл совсем не напрягает, а пользы от нее очень много.

Метки: freebsd, Linux, tips, советы

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

SOCKS proxy в SSH

09.06.2008

Алексей Свешников в комментарии к заметке о пробросе туннелей через ssh напомнил о возможности использования ssh в качестве SOCKS4/SOCKS5-сервера.

Допустим, у нас есть рабочая станция в локальной сети за firewall’ом; также имеется ssh-доступ на сервер в Интернете. Кроме ssh, никакой связи с внешним миром не имеется, а очень хочется, например, подключиться к какому-нибудь jabber-серверу.

На рабочей станции запускаем простую команду:

ssh -D 5555 user@remotehost -f -N

Теперь, указав в настройках XMPP-клиента (например, Pidgin’а) в качестве SOCKS5 прокси localhost:5555, получим желаемый результат: Pidgin соединяется с сервером через внешний сервер.

Еще один неизвестный мне доселе ssh tip: в комплект поставки ssh входит программка ssh-copy-id, автоматически прописывающая ваш .ssh/.id_rsa.pub в .ssh/authorized_keys на целевом сервере и устанавливающая правильные права. Использовать это проще простого:

ssh-copy-id user@remotehost

(via 10 трюков в командной строке, о которых вы не знали.)

Метки: Linux, ssh, tips

Linux, Без рубрики - 4 комментария

Геотаргетинг в СУПе

07.06.2008

Прочитал во френдленте преисполненную драматизма историю попытки разместить нацеленную на Нижний Новгород рекламу в ЖЖ. Выяснилось, что для геотаргетинга в СУПе используется глючная база MaxMind GeoIP, вечно путающая Новгород и Нижний Новгород. Оставив в стороне некомпетентность суповского рекламного менеджера, который оказался не в состоянии разрулить проблему или хотя бы передать ее более компетентному коллеге, и сделав скидку на технические проблемы обработки накопленной в жежешной базе данных статистики соответствий IP-адресов и указанных пользователями регионов, можно констатировать, что имеет место явный обман — вместо ожидаемого заказчиком геотаргетинга по тому местонахождению, которое указал сам пользователь, работает (точнее, не работает) геотаргетинг по абсолютно левой, не относящейся к ЖЖ базе.

А ведь можно было бы пойти другим путём и всё сделать по уму — на основе указанных пользователями ЖЖ регионов сформировать базу, хотя бы уточняющую данные из MaxMind GeoIP — сразу была бы решена проблема отнесения нижегородцев к Новгороду и упомянутого поста не возникло бы. Или скооперироваться с другими сервисами СУПа (не ЖЖ ведь единым СУП жив), пользователи которых указывают своё местонахождение, и сделать свою, правильную базу, тогда от MaxMind вообще можно было бы отказаться — по крайней мере, для России.

А так получается еще один, не первый и далеко не последний камень в огород СУПа.

Метки: geolocation, ебизнес, жж

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

Asus EEE PC 701G: впечатления от использования

06.05.2008

  Aishe: Теперь я буду есть как все нормальные люди!
Aishe: на кухне
Aishe: с ноутом..

Цитата №396526

Две недели назад обзавёлся означенным ноутбуком, и за это время он уже успел неплохо себя зарекомендовать. Специально не стал сразу писать пост, чтобы успеть понять, действительно ли он стоит таких восторженных отзывов, или же всё обстоит как в известном анекдоте:
- Зря слона ругаешь!
- Почему?
- Не продашь!

Впрочем, обо всём по порядку.

1. Покупка
Последний раз я что-то покупал в Эльдорадо лет 5 назад — телевизор для престарелой бабушки. Дело закончилось обменом купленного телевизора на работающий уже через час после покупки. Затем лишь читал отзывы на сайте анекдот.ру (нашел место, ага). Но поскольку у нас EEE PC продаётся исключительно в Эльдорадо, то мне ничего не оставалось делать, кроме как скрежеща зубами нести им свои 10 т.р.

На удивление всё оказалось цивильно и без подвоха (несмотря на страстное желание менеджера продать мне заодно внешний накопитель, USB-мышь и техподдержку на несколько лет — раз в полгода бесплатно чистить клавиатуру). На мой вопрос о популярности данного продукта продавец ответил, что на складе их осталось совсем немного, и, если в ближайшее время не завезут, то через пару дней продавать будет нечего. Т.е. спрос на такой скромный, по сравнению с рядом стоящими собратьями, девайс, всё же имеется, и немалый.

2. Комплектация
В коробке обнаружился собственно ноут, чехол к нему, DVD с драйверами под Windows, руководство пользователя, несколько различных рекламных и гарантийных бумажек и адаптер питания. Несоответствие габаритов последнего духу минимизации неприятно поражает, а впоследствии и очень раздражает. Но, похоже, это единственная ложка дёгтя, поскольку всё остальное высоко держит марку.

По умолчанию на ноутбуке установлена специальная (?) редакция Windows XP. Про нее можно сказать, что несмотря на кажущуюся поддержку всех имеющихся устройств, включая возможность установить разрешение экрана 800×600 (с вертикальным скроллингом), выглядит она просто ужасно и пользоваться ею на Asus EEE PC без вреда для психического здоровья невозможно (мне, по крайней мере).

К чести Microsoft необходимо заметить, что без них эта покупка состоялась бы на несколько месяцев позже или вообще не состоялась бы — именно благодаря идее мелкомягких распространить как можно больше компьютеров с установленным Windows и их соглашению с Эльдорадо и Asus’ом о предустановке винды на ноуты, где изначально должен быть Linux и последующей продаже этих ноутбуков по демпинговой цене (в GNU/Linuxcenter правильные eee pc с xandros стоят от 12 т.р.) эти девайсы и попали в регионы.

Молодцы, одним словом, но я всё равно поставил Ubuntu.

3. Установка и настройка правильной ОС

Почитав мануалы по различным вариантам установки многочисленных дистрибутивов, я решил изменить Федоре, на которой сижу и с которой работаю последние несколько лет, с Ubuntu. Сама идея изначально ограниченного eeexubuntu мне не понравилась, поэтому я предпочел поставить нормальный ubuntu desktop и затем удалить оттуда всё ненужное. Установка 7.10 Gutsy Gibbon (не заморачиваясь с флэшкой, нашел старенький USB-привод и поставил с него) прошла без проблем, дальнейшая конфигурация согласно доке на wiki.eeeuser.com тоже особых затруднений не вызвала. Hardy Heron вообще должен с полпинка заработать, как пишут на том же сайте. Поэтому описывать в этом разделе больше нечего.

4. Использование

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

Возможности самого ноутбука вкупе с возможностями Ubuntu (уже из коробки на порядок превосходящие возможности Windows) предполагают огромное количество вариантов использования - от написания и отладки мелких скриптов до реализации целых проектов, от чтения новостей за чашкой кофе по утрам до ознакомления с рабочими документами и системной документацией (man bash удобно перечитывать в дороге :)). Исчезла проблема разделения основного домашнего компьютера: пока жена играет в очередную инкарнацию шариков, я валяюсь на диване с ноутом и занимаюсь своим делом. И наоборот, пока жена с ноута читает очередной детектив про Фандорина, ничто не мешает мне через ssh что-нибудь полезное поделать на том же ноуте. На первые майские праздники ездили в деревню, так я установил kstars и, сверяясь с этим карманным планетарием, смотрел в телескоп на звёзды.

5. Минусы

Предполагаемые ранее недостатки в полной мере себя не проявили: процессор Celeron M 600 Mhz работает довольно шустро; 512 мегабайт оперативной памяти вполне хватает для одновременного запуска трёх-четырёх приложений (firefox, gnome-terminal, openoffice и вышеупомянутый kstars); свободного места на диске после установки убунту оставалось почти 2 гигабайта. К уменьшенной клавиатуре я уже привык (только всё время вместо кнопки с тильдой и буквой Ё попадаю не туда и каждый раз промахиваюсь мимо правого шифта), тачпад тоже нареканий не вызывает. В режиме активного использования батарейка работает около двух часов, процесс полной зарядки занимает чуть побольше. К недостаткам можно отнести маленький экран, при котором приходится выбирать между крупным шрифтом и большим количеством отображаемой информации, и крайне неудобный адаптер питания, из-за которого всё добро приходится таскать в рюкзаке, вместо того, чтобы распихать по карманам.

6. Мораль

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

Метки: asus eee pc, Linux, ubuntu, Windows, девайсы

Разное - 20 комментариев

fortune в подписи thunderbird

29.04.2008

Что мы имеем на текущий момент:

  • thunderbird в качестве почтового клиента. Многим лучше, немногим хуже монстроидальных и неповоротливых Outlook и Evolution. Один из недостатков — невозможность редактирования шаблонов без использования дополнений, что приводит к необходимости каждый раз вручную вставлять подпись.
  • непреодолимое желание нести свет в корпоративные массы путём включения избранных linux-related цитат из сборника fortune linuxcookie

В настройках учётной записи thunderbird есть специальная галка “использовать файл подписи”. Эту фичу и заюзаем для того, чтобы в каждое письмо вставлять подпись в соответствии с корпоративным стандартом и приплюсовывать туда что-нибудь забавное и правильное из fortune.

Для того, чтобы у получателя была возможность отличить собственно подпись от цитаты, буквально взявшейся с потолка, каждую строчку цитаты будем предварять традиционным для c-программистов сочетанием символов “//”.

Ничтоже сумняшеся, набросал небольшой скрипт на любимом средстве мыслевыражения — perl-е:

#!/usr/bin/perl -w
use strict;

my $sign="/path/to/home/signature.txt";
open(F,">$sign") || die "Could not open $sign: $!\n";
my $fortune=`fortune linuxcookie`;
chomp $fortune;
undef($/);
$fortune=~s|\n|\n// |g;
while(<DATA>){
    s/\{fortune\}/$fortune/g;
    print F;
}
close F;
exit 0;

__DATA__
Best regards,
John Doe
Company
Department
Software Engineer

//  {fortune}

Поместив команду запуска этого скрипта в свой собственный crontab (man 1 crontab, см. также предыдущую запись), получаем обновляемый раз в минуту файл ~/signature.txt, который можно указать thunderbird’у как файл подписи. Что и требовалось.

Метки: Linux, perl, thunderbird

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

Организация рабочих файлов по неделям

28.04.2008

Ежедневно в моей рабочей папке появлялось от одного до полутора десятков и более файлов — документов, патчей, скриптов, отчётов и прочих продуктов рабочей деятельности. Однажды настал момент, когда найти нужный файл среди этого бардака стало довольно затруднительно, и чаша моего терпения переполнилась. Файлы нужно каким-нибудь организовать, подумал я. Изобретать систему меток для организации файлов по фэн-шую GTD было лень, поэтому я просто остановился на принципе “одна неделя — одна папка”, т.е. все файлы хранятся в папках вида ~/work/week18, к текущей и предыдущей неделе можно обратиться по ссылкам ~/work/current и ~/work/prev.

Для начала я соорудил скрипт для раскидывания файлов по папкам, создающий в текущей директории папки с именами в нужном формате, если их не существует, и перемещающий туда файлы:

#!/usr/bin/perl -w
use File::stat;
use POSIX qw(strftime);
use strict;
foreach(`find . -maxdepth 1 -type f |sed 's/\ /\\ /g;'`){
    chomp;
    my $st=stat($_)||die "Could not stat $_: $!\n";
    my $week=strftime("%W",localtime($st->mtime));
    unless(-d "week$week"){mkdir "week$week";}
    rename("$_","week$week/$_")||warn "Could not rename $_ to week$week/$_: $!\n";
}

Затем создал скриптик для еженедельного создания новой папки и переименования ссылок current и prev:

#!/bin/sh
current_week=week`/bin/date "+%W"`
test -L ~/work/prev && rm ~/work/prev
mkdir -p ~/work/$current_week
pushd ~/work
test -L current && /bin/mv current prev
ln -s $current_week current
popd

Запуск скриптика в первый день каждой недели (нулевой — воскресение, по американским традициям) поместил в свой crontab (если кто еще не в курсе, у каждого пользователя есть свой crontab, аналогичный общесистемному /etc/crontab; редактируется с помощью команды crontab -e, просматривается командой crontab -l; подробнее см. man 1 crontab):

# crontab -l
1   0   *   *   1   ~/bin/weekly.sh

Ссылки на ~/work/current и ~/work/prev впоследствии была добавлены в в favorite folders в Gnome, а также во все места, где требуется быстрый доступ к рабочим материалам. Кроме того, в начале каждой новой недели при написании еженедельного отчета стало на порядок проще делать обзор работы за предыдущую неделю (конечно, список рабочих активностей не исчерпывается появившимися файлами; есть же еще и почта, и bug-tracker, и другие средства организации информации)Недостаток у данного скрипта пока один — нужно ежегодно архивировать накопившиеся 52 папки, иначе снова возникнет бардак :) Но и это исправляется при наличии желания и умения.

Метки: bash, lifehack, Linux, perl, советы

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

Epic fail

10.04.2008

Из всех админских ошибок, которые мне когда-либо случалось делать (с каждым бывает), самой кошмарной, до сих пор приходящей ко мне в сновидениях, была опечатка в рутовой консоли на боевом сервере под управлением freebsd 5.4: вместо обычного убийства команды в бэкграунде kill %1 набрал и выполнил kill 1. Всего один символ забыл, зато какой эффект! Процесс init с pid’ом 1 был благополучно уничтожен… К чести Linux-сообщества, эта команда на моём тестовом сервере действия не возымела.

Метки: freebsd, fun, Linux

Linux - 6 комментариев

Небольшие обновления в блоге

07.04.2008

1. Нарисовал себе велосипед в качестве favicon.ico. Хотите такой же? favicon.cc вам поможет.

2. Свёл все свои нетленные креативы в единое содержание, которое стало уже третьим по списку (но не последним по смыслу) методом навигации по сайту. Предыдущие два — метки и “предыдущая страница — следующая страница” — не очень хорошо работают. Идею слизал у интернетных штучек. Пока что из-за большой доли комментариев к ссылкам обновляется вручную, но надо будет подумать над автоматизацией процесса.

Метки: блог, лытдыбр

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

Anonymising proxies в Google

03.04.2008

Читаю CV человека по имени Ian Macdonald, автора многочисленных скриптов автодополнения в bash, с 2001 года работавшего (работающего?) системным администратором в Google. Конечно же, неплохой образец карьеры в Linux/Open Source, но вот эта фраза меня смутила:

Configured and deployed HTTP-anonymising proxies for anonymous corporate use of WWW.

Значит ли это, что в Гугле настолько пекутся о конфиденциальности веб-серфинга своих сотрудников, что предлагают им ходить в интернет через собственные анонимные прокси?

Метки: google

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