Skip to content


пщщпдуюсщь?

Часто вам приходится набирать в строке адреса броузера что-то вроде "пщщпдуюсщь"? Это фраза "google.com", набранная в русской раскладке. Согласно статистике, такие опечатки встречаются очень часто. Другие распространённые варианты --- нщгегиуюсщь, нфюкг, нфтвучюкг. Такое бывает когда при наборе текста взгляд сосредоточен на клавиатуре. Решение проблемы --- освоить "слепой десятипальцевый метод" набор текста, например с помощью тренажёра "Соло на клавиатуре", или поставить специальную программу --- автоматический переключатель раскладок, такую как Punto Switcher. Первое решение, конечно, намного более трудоёмкое, требует усидчивости и большого терпения. Но результаты того стоят --- скорость набора текста повышается в разы, а значит, и эффективность работы за компьютером в целом.

Posted in Разное.


Создание rpm-пакета

Иногда бывает, что на поиск нужной RPM-ки уходит времени больше, чем на создание своей из исходников. Например, RPM-пакет pptpd 1.3.4 более недоступен по ссылке, которая была в посте об установке pptpd. А мне он как раз понадобился при настройке очередного VPN-сервера. Выход как всегда есть. Рассмотрим на примере pptpd создание rpm-пакета на основе исходных текстов, запакованных в классический tarball с раширением .tar.gz.

  1. Качаем tarball отсюда: http://sourceforge.net/projects/poptop/files/
  2. Устанавливаем пакет rpm-build:
    [root@server]# yum install rpm-build
    Setting up Install Process
    Resolving Dependencies
    --> Running transaction check
    ---> Package rpm-build.i386 0:4.4.2.3-20.el5_5.1 set to be updated
    --> Processing Dependency: elfutils for package: rpm-build
    --> Running transaction check
    ---> Package elfutils.i386 0:0.137-3.el5 set to be updated
    --> Processing Dependency: elfutils-libs-i386 = 0.137-3.el5 for package: elfutils
    --> Processing Dependency: libdw.so.1(ELFUTILS_0.127) for package: elfutils
    --> Processing Dependency: libdw.so.1(ELFUTILS_0.122) for package: elfutils
    --> Processing Dependency: libasm.so.1 for package: elfutils
    --> Processing Dependency: libdw.so.1(ELFUTILS_0.130) for package: elfutils
    --> Processing Dependency: libdw.so.1 for package: elfutils
    --> Processing Dependency: libasm.so.1(ELFUTILS_1.0) for package: elfutils
    --> Processing Dependency: libdw.so.1(ELFUTILS_0.126) for package: elfutils
    --> Running transaction check
    ---> Package elfutils-libs.i386 0:0.137-3.el5 set to be updated
    --> Finished Dependency Resolution
    Dependencies Resolved
    ===================================================================
     Package     Arch    Version         Repository  Size
    ===================================================================
    Installing:
     rpm-build      i386   4.4.2.3-20.el5_5.1   updates    302 k
    Installing for dependencies:
     elfutils       i386   0.137-3.el5          base       228 k
     elfutils-libs  i386   0.137-3.el5          base       193 k
    Transaction Summary
    ===================================================================
    Install       3 Package(s)
    Upgrade       0 Package(s)
     
    Total download size: 723 k
    Is this ok [y/N]: y
    Downloading Packages:
    (1/3): elfutils-libs-0.137-3.el5.i386.rpm               | 193 kB   00:00
    (2/3): elfutils-0.137-3.el5.i386.rpm                    | 228 kB   00:00
    (3/3): rpm-build-4.4.2.3-20.el5_5.1.i386.rpm            | 302 kB   00:00
     
    Total                                            842 kB/s | 723 kB 00:00
    Running rpm_check_debug
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
      Installing     : elfutils-libs                                1/3
      Installing     : elfutils                                     2/3
      Installing     : rpm-build                                    3/3
    Installed:
      rpm-build.i386 0:4.4.2.3-20.el5_5.1
    Dependency Installed:
      elfutils.i386 0:0.137-3.el5  elfutils-libs.i386 0:0.137-3.el5
    Complete!

    Возможно, также еще потребуется С-компилятор, такой как gcc (если еще не установлен).

  3. Собираем пакет:
    [root@server]# rpmbuild -tb /tmp/pptpd-1.3.4.tar.gz
  4. Находим вновьсозданную rpm-ку:
    [root@server]# ls -l /usr/src/redhat/RPMS/i386/
    -rw-r--r-- 1 root root 84570 Nov  5 22:18 pptpd-1.3.4-1.i386.rpm
  5. Устанавливаем:
    [root@server]# rpm -ivh /usr/src/redhat/RPMS/i386/pptpd-1.3.4-1.i386.rpm

Если пакет собирается обычным юзером, не обладающим привилегиями суперпользователя, то доступа на запись в директорию /usr/src/redhat у него, ясное дело, нет. В этой ситуации можно явно указать rpmbuild-у рабочие директории следующим образом:

WD=$HOME/tmp/rpmtop
[ ! -d $WD ] && mkdir -p $WD
mkdir -p $WD/{SOURCES,BUILD,SPECS,SRPMS,RPMS/`uname -m`}
echo "%_topdir $WD" >> $HOME/.rpmmacros

Во 3-ей строке команда "uname -m" вернёт конкретную, используемую Вами архитектуру. В большинстве случаев это “i386”. У меня - “x86_64”.

Можно также собирать rpm-пакет из src.rpm. Например, мне как-то нужно было поставить на кучу серверов сразу с CentOS x86_64 пакет tinyproxy. В том пакете, который мне удалось найти в известных мне репозиториях (EPEL, RPMForge), был кривой init-скрипт, в котором был неправильно указан путь к бинарнику (/usr/bin/tinyproxy вместо /usr/sbin/tinyproxy) и путь к pid-файлу, что приводило к невозможности запустить сервис штатными средствами без доработки напильником стартового скрипта /etc/init.d/tinyproxy на каждом сервере. К тому же, конфиг-файл по умолчанию меня несколько не устраивал, поэтому я решил всё это один раз подредактировать и создать свою RPM-ку, которую потом простым скриптом можно было сразу проинсталлировать на все сервера. Далее я нашёл tinyproxy-1.8.2-1.fc14.src.rpm и распаковал его:

# rpm2cpio < tinyproxy-1.8.2-1.fc14.src.rpm | cpio -i
430 blocks
# ls -la
total 488
drwxrwxr-x  2 avz avz   4096 Apr 13 13:13 .
drwx------ 10 avz avz   4096 Apr 13 13:13 ..
-rw-r--r--  1 avz avz 214619 Apr 12 14:51 tinyproxy-1.8.2-1.fc14.src.rpm
-rw-rw-r--  1 avz avz 202931 Apr 13 13:13 tinyproxy-1.8.2.tar.bz2
-rw-r--r--  1 avz avz  10147 Apr 13 13:13 tinyproxy.conf
-rw-r--r--  1 avz avz   1906 Apr 13 13:13 tinyproxy.init
-rw-r--r--  1 avz avz    252 Apr 13 13:13 tinyproxy.logrotate
-rw-r--r--  1 avz avz   4109 Apr 13 13:13 tinyproxy.spec

Теперь редактируем файлы tinyproxy.init и tinyproxy.conf (при необходимости). В файл tinyproxy.spec в раздел changelog пишем чего же мы такого ценного привнесли своими изменениями (это необязательно, просто правило хорошего тона) и собственно собираем rpm-ку:

# mv tinyproxy-1.8.2.tar.bz2 tinyproxy.conf tinyproxy.init tinyproxy.logrotate /usr/src/redhat/SOURCES
# rpmbuild -ba tinyproxy.spec

Если всё прошло успешно (нет ошибок от make), то сможем наблюдать появление правильной RPM-ки, которую и можно ставить на все сервера сразу:

# ls /usr/src/redhat/RPMS/`uname -m`/tin*
/usr/src/redhat/RPMS/x86_64/tinyproxy-1.8.2-1.x86_64.rpm

Ключик -ba, кстати, также создаёт и src.rpm в директории /usr/src/redhat/SRPMS --- может пригодиться при последующих пересборках. Если же make выдаёт ошибки, то надо разбираться и чинить. В моём случае, например, пришлось установить пакет docbook-style-xsl, потому что без него man-файлы почему-то не создавались в процессе сборки.

Posted in *nix, Howto.

Tagged with , , , .


Полезные приёмы работы в VIM

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

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

  1. Сдвиг вертикального блока вправо: жмём Ctrl-V, выделяем стрелками вертикальный блок, потом жмём >, в результате весь выделенный текст сдвигается на shiftwidth символов вправо. В моём конфигурационном файле ~/.vimrc стоит set shiftwidth=2. Если нужно сдвинуть на большее расстояние, то перед > следует еще ввести цифру, что, как обычно в VIM-е, приведёт к повторению команды заданное число раз. Например, для сдвига блока из 3-х строк начиная с текущей на 6 символов вправо, в моём случае нужно будет набрать на клавиатуре последовательность Ctrl-V ↓ ↓ 3>
  2. Часто когда в VIM производится вставка куска текста с длинными строками (например, вывод tcpdump), VIM автоматически переносит те слова на следующую строку, которые находятся за пределами максимальной длины строки. Чтобы этого не происходило, нужно в командном режиме набрать :set paste
  3. При написании программного кода для отступов почти всегда используется кнопка Tab. Но если над кодом работает более одного человека, могут возникнуть неудобства, связанные с тем, что у них разные настройки редакторов, и, возможно, даже разные редакторы, в результате чего символы табуляции по разному отображаются. Для повышения переносимости VIM можно настроить так, чтобы при нажатии кнопки Tab вместо символа табуляции на самом деле вставлялось заданное количество пробелов. Для этого в командном режиме нужно сказать :set expandtab (или добавить в ~/.vimrc set expandtab). А собственно количество пробелов регулируется параметром tabstop. Например, чтобы при нажатии клавиши Tab вставлялось 4 пробела, нужно в командном режиме набрать :set tabstop=4. Но включение опции expandtab никак не влияет на те символы табуляции, которые появились в тексте до её включения. Заменить все существующие в документе символы табуляции на пробелы можно с помощью команды :retab. Чтобы вставить настоящий символ табуляции когда включена опция expandtab, нужно набрать на клавиатуре комбинацию Ctrl-V Tab. Можно также задать разный режим работы клавиши Tab для разных типов файлов. Например, чтобы заменять табуляции на пробелы только для файлов с PHP-кодом, нужно добавить в ~/.vimrc следующее:
    autocmd FileType * set tabstop=2|set shiftwidth=2|set noexpandtab
    autocmd FileType php set tabstop=4|set shiftwidth=4|set expandtab
  4. Макросы позволяют ускорить выполнение часто используемых операций. Для их создания есть команда map. Например, чтобы после набора "id" в командном режиме в текст вставлялась текущая дата, нужно в ~/.vimrc добавить строчку:
    map id !!date "+\%Y\%m\%d \%T"^M

    При этом ^M в конце строки должно быть вставлено как esc-последовательность путем ввода комбинации клавиш Ctrl-V Ctrl-M. Восклицательный знак означает выполнение внешней команды ОС из командного интерпретатора.

  5. Для редактирования файлов в кодировке, отличной от текущей кодировки локали, в ~/.vimrc нужно указать кодировку файла следующим образом:
    au BufRead /path/to/old/charset/files/* e ++enc=koi8-r

    В результате при открытии любого файла из директории /path/to/old/charset/files его содержимое будет автоматически перекодировано из KOI8-R в текущую кодировку локали.

  6. Если собираетесь использовать встроенное в vim шифрование, то в .vimrc обязательно стоит добавить явное указание на то, какой именно метод использовать

    set cryptmethod=blowfish2

    поскольку более старые 2 метода (zip и blowfish) уже недостаточно криптостойкие. Подробнее об этом можно почитать здесь и у David Leadbeater. Проверить каким именно методом был зашифрован уже существующий файл можно командой

    head -c 11 somefile.txt
    VimCrypt~03

    Самая последняя цифра в выводе как раз и указывает на cryptmethod (1 - zip, 2 - blowfish, 3 - blowfish2).

Вот тут еще есть весьма подробная и полезная шпаргалка по VIM.

Если бы vim написали в Microsoft, то выглядел бы он, вероятно, как-то так :)

Помощник-скрепыш в VIM

Помощник-скрепыш в VIM :)

Posted in *nix.


Mutt и blind carbon copy (BCC)

Однажды я обнаружил для себя неприятный сюрприз - оказывается, почтовый клиент mutt по-умолчанию показывает получателям, которые перечислены в заголовке письма в поле To:, значение заголовка BCC:, сводя тем самым на нет всю пользу от использования BCC. Ведь BCC (blind carbon copy) на то и blind, чтобы основной получатель не видел, что письмо ушло еще и по другому адресу из BCC. Лечится просто - добавить в конфигурационный файл строчку:

set write_bcc=no

Posted in *nix, Howto.