Архив рубрики «howto»

vim: внешние фильтры

29.04.2010

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

Выполнение внешней команды на диапазоне:

:{диапазон} ! {команда}

При этом на STDIN команды подается содержимое диапазона, а затем диапазон заменяется выводом STDOUT команды.

Несколько примеров.

Форматирование всего исходного текста на perl с помощью perltidy:

:% ! perltidy -es=4 -t -st

Отфильтровать с помощью команды grep все строки, содержащие символ "#" из строк 14-24:

:14,24 ! grep -v "\#"

vim: сортировка

20.04.2010

Сортировать в vim очень просто:

:{диапазон}sort

Диапазон подставится автоматически, если в визуальном режиме (V) выделить блок, а затем перейти в командный режим (:):

:'<,'>

Или для сортировки всего файла:

:%sort

Сортировка в обратном порядке:

:%sort!

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

:%sort -u

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

:%!sort --numeric-sort --reverse

Ну и как обычно, читаем маны:

:help :sort

vim: избавляемся от dos-овых концов строк (\r\n -> \n)

02.09.2009
  1. Если vim распознал dos-овые концы строк, и не показывает ^M,
    :set ff=unix
    :w

    Документацию по поводу опции fileformat почитать можно в разделе usr_23:

    :help usr_23
  2. Если vim автоматически не распознал DOS line ends, то в конце строк будут символы ^M. Удалить их можно простой заменой:
    :%s/^M//g

    Символ ^M при этом вводится как Ctrl-V Ctrl-M.

bash: горячие клавиши

17.06.2009

Полный мануал как обычно:

man bash

, ключевые слова в квадратных скобках:

Перемещение:
слово-назад – Alt-B [backward-word (M-b)]
слово-вперед - Alt-W [forward-word (M-f)]
начало-строки - Ctrl-A [beginning-of-line (C-a)]
конец-строки - Ctrl-E [end-of-line (C-e)]

Удаление:
удалить-строку-вперед - Ctrl-K [kill-line (C-k)] - от курсора до конца строки
удалить-строку-назад - Ctrl-U [unix-line-discard (C-u)] - от курсора до начала строки
удалить-слово-вперед - Alt-D [kill-word (M-d)] - от курсора до конца слова
удалить-слово-назад - Alt-Backspace [backward-kill-word (M-Rubout)] - от курсора до начала слова

(Обновляется. Последнее изменение: 17 июня 2009 г.)

linux: как узнать (проверить) key fingerprint?

08.06.2009

Узнать fingerprint ключа можно при помощи команды ssh-keygen:

# ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key
2048 e2:02:50:2b:d8:1f:ce:d4:18:07:02:7b:22:90:44:25 /etc/ssh/ssh_host_rsa_key.pub (RSA)

По-умолчанию команда ищет публичный ключ и печатает для него fingerprint.

Создание /etc/init.d/nginx на debian 5.0 lenny

05.06.2009
$ sudo vim /etc/init.d/nginx

Вставляем нижеследующий код (помним про команду ‘set :paste’ для вставки в VIM):

#!/bin/sh
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $remote_fs $syslog $named $network $time
# Required-Stop:     $remote_fs $syslog $named $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start nginx at boot time
# Description:       Enable service provided by nginx.
### END INIT INFO
# $Id$
 
NGINXHOME=/usr/local/nginx
NGINXPID=$NGINXHOME/logs/nginx.pid
 
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=$NGINXHOME/sbin/nginx
NAME=nginx
DESC=nginx
 
if [ ! -x $DAEMON ]
then
   echo "Couldn't find $DAEMON. Please set path to DAEMON."
   exit 0
fi
 
# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
	. /etc/default/nginx
fi
 
set -e
 
case "$1" in
  start)
	echo -n "Starting $DESC: "
	start-stop-daemon --start --pidfile $NGINXPID \
		--exec $DAEMON -- $DAEMON_OPTS
	echo "$NAME."
	;;
  stop)
	echo -n "Stopping $DESC: "
	start-stop-daemon --stop --pidfile $NGINXPID \
		--exec $DAEMON
	echo "$NAME."
	;;
  restart|force-reload)
	echo -n "Restarting $DESC: "
	start-stop-daemon --stop --pidfile \
		$NGINXHOME/run/$NAME.pid --exec $DAEMON
	sleep 1
	start-stop-daemon --start --pidfile \
		$NGINXPID --exec $DAEMON -- $DAEMON_OPTS
	echo "$NAME."
	;;
  reload)
      echo -n "Reloading $DESC configuration: "
      start-stop-daemon --stop --signal HUP --pidfile $NGINXPID \
          --exec $DAEMON
      echo "$NAME."
      ;;
  *)
	N=/etc/init.d/$NAME
	echo "Usage: $N {start|stop|restart|force-reload}" >&2
	exit 1
	;;
esac
 
exit 0

Сохраняем скрипт и выходим из vim.

Делаем скрипт исполняемым:

$ sudo chmod 755 /etc/init.d/nginx

Указываем, что nginx нужно запускать при запуске и остановке сервера:

$  sudo /usr/sbin/update-rc.d -f nginx defaults

UPD: Блок, заключенный между строками

### BEGIN INIT INFO
### END INIT INFO

обеспечивает LSB-совместимость. Подробнее см. http://wiki.debian.org/LSBInitScripts

Установка nginx на debian 5.0 lenny

04.06.2009

На "пустом" свежеустановленном Debian не хватает ряда инструментов и библиотек для сборки и установки nginx.

Ставим gcc, make, и компания:

$ sudo apt-get install build-essential

Библиотеки для сборки nginx:

$ sudo apt-get install libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev

Для поддержки встроенного Perl добавляем:

$ sudo apt-get install libperl-dev

Собственно процесс сборки и установки (вместо 0.7.XX впишите номер актуальной версии):

$ wget http://sysoev.ru/nginx/nginx-0.7.XX.tar.gz
$ tar zxvf nginx-0.7.XX.tar.gz
$ ln -s nginx-0.7.XX nginx
$ cd nginx
$ ./configure \
--prefix=/usr/local/nginx \
--with-cc-opt="-I /usr/include" \
--with-ld-opt="-L /usr/lib" \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_perl_module  \
--with-http_ssl_module
 
$ make && make install
 

Обратите внимание, параметры

--with-cc-opt="-I /usr/include" --with-ld-opt="-L /usr/lib"

указывают на расположение системных заголовков и библиотек, без них configure не видит ряда системных библиотек.

Unix: Поиск и замена во многих файлах одновременно

09.02.2009

Задача: найти все файлы содержащие OLDTEXT, и заменить OLDTEXT на NEWTEXT.

Решение:

grep -HR OLDTEXT ./ | awk '{print $1}' | sed 's/:.*$//' | grep -v '~' | sort | uniq | xargs vim -p

В открывшемся окне vim командуем:

:tabdo %s/OLDTEXT/NEWTEXT/g

(заменить OLDTEXT на NEWTEXT во всех вкладках)

:xa

(записать изменения во всех вкладках)
либо

:qa!

(отменить изменения во всех вкладках)

Ссылки по теме:

  1. VIM FAQ
  2. Save all open buffers at once
  3. Сохранение файла без прав на запись в vim используя sudo
  4. [SLUG] Vim. Search and replace in multiple files

ubuntu: обновляем систему до последнего релиза

18.12.2008

Инструкция по обновлению:
http://www.ubuntu.com/getubuntu/upgrading

Поехали..

WordPress бэкенд: устанавливаем правильный REMOTE_ADDR для комментариев

12.12.2008

В случае, если WordPress живет на бекенд-сервере, например за акселератором nginx, при настройках по-умолчанию комментарии будут содержать вместо IP отправителя IP фронтенда:

From: wordpress@shatlovsky.ru              Fri, Nov 21, 2008 at 7:59 AM
To: shatlovsky@gmail.com
Новый комментарий к записи #22 "Макросы RCS" ожидает одобрения

http://shatlovsky.ru/blog/2008/10/13/makrosy-rcs/

Автор : evikalley (IP: 10.1.0.1 , 10.1.0.1)
E-mail: 
URL   : http://
Whois  : http://ws.arin.net/cgi-bin/whois.pl?queryinput=10.1.0.1
Комментарий:
Спасибо! Буду теперь заходить на этот блог каждый день!

Видим, что вместо IP спамера записан IP фронтенд-сервера (10.1.0.1).

Решение этой проблемы заключается в подстановке корректного адреса в переменную $_SERVER["REMOTE_ADDR"] (в понятиях PHP, на котором написан WordPress). Корректный адрес может быть в переменных HTTP_X_FORWARDED_FOR, X_REAL_IP и некоторых других.

Решим задачу так, чтобы:

  1. не трогать код WordPress;
  2. это работало во всех наших скриптах.

Для этого воспользуемся фичей php autoprepepend (файл, который добавляется и исполняется перед каждым php-скриптом). Скрипт (автор Grant Burton), кладем в любое место сайта:

autoprepend.inc.php:

/* By Grant Burton @ BURTONTECH.COM (11-30-2008): IP-Proxy-Cluster Fix */
function checkIP($ip) {
	if (!empty($ip) && ip2long($ip)!=-1 && ip2long($ip)!=false) {
		$private_ips = array (
		array('0.0.0.0','2.255.255.255'),
		array('10.0.0.0','10.255.255.255'),
		array('127.0.0.0','127.255.255.255'),
		array('169.254.0.0','169.254.255.255'),
		array('172.16.0.0','172.31.255.255'),
		array('192.0.2.0','192.0.2.255'),
		array('192.168.0.0','192.168.255.255'),
		array('255.255.255.0','255.255.255.255')
		);
 
		foreach ($private_ips as $r) {
			$min = ip2long($r[0]);
			$max = ip2long($r[1]);
			if ((ip2long($ip) >= $min) && (ip2long($ip) <= $max)) return false;
		}
		return true;
	} else {
		return false;
	}
}
 
function determineIP() {
	if (checkIP($_SERVER["HTTP_CLIENT_IP"])) {
		return $_SERVER["HTTP_CLIENT_IP"];
	}
	foreach (explode(",",$_SERVER["HTTP_X_FORWARDED_FOR"]) as $ip) {
		if (checkIP(trim($ip))) {
			return $ip;
		}
	}
	if (checkIP($_SERVER["HTTP_X_FORWARDED"])) {
		return $_SERVER["HTTP_X_FORWARDED"];
	} elseif (checkIP($_SERVER["HTTP_X_CLUSTER_CLIENT_IP"])) {
		return $_SERVER["HTTP_X_CLUSTER_CLIENT_IP"];
	} elseif (checkIP($_SERVER["HTTP_FORWARDED_FOR"])) {
		return $_SERVER["HTTP_FORWARDED_FOR"];
	} elseif (checkIP($_SERVER["HTTP_FORWARDED"])) {
		return $_SERVER["HTTP_FORWARDED"];
	} else {
		return $_SERVER["REMOTE_ADDR"];
	}
}
//Override server variable for WordPress comments
$_SERVER["REMOTE_ADDR"] = determineIP();
 

Далее редактируем .htaccess в корне сайта, добавляем туда ссылку на этот скрипт:

php_value auto_prepend_file /home/username/htdocs/autoprepend.inc.php

(путь надо скорректировать в соответствии с вашими настройками).

Готово! Теперь WordPress видит правильный IP комментатора.