mini-notes-issue-9/

Темы выпуска: добавляем вывод мета-тэгов description в WordPress, делаем самопальную замену clip2net, учим оболочку Erlang’а сохранять историю команд, настраиваем L2TP VPN в Ubuntu, и не только. Предыдущие выпуски: восьмой , седьмой , шестой , пятый .

1. Как добавить meta-тэги description в WordPress

Тэг description используется поисковыми системами при формировании SERP, а также некоторыми социальными сетями при размещении ссылки на страницу. В случае отсутствия тэга описание страницы генерируется автоматически, но при этом оно зачастую оказывается не вполне корректным.

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

Для этого я добавил в header.php следующий код:

<?php if ( is_home ( ) && ! $paged ) { ?>
<meta name=»description» content=»Записки программиста: блог о программировании, алгоритмах, операционных системах, компьютерных сетях, безопасности, девайсах, сайтостроении и не только» />
<?php } else if ( is_home ( ) ) { ?>
<meta name=»description» content=»Записки программиста: архив блога, страница <?php echo $paged ?> » />
<?php } else if ( is_tag ( ) ) { ?>
<meta name=»description» content=»Записки программиста: посты с меткой &laquo; <?php single_tag_title ( ) ?> &raquo; <?php if ( $paged ) { echo «, страница $paged » ; } ?> » />
<?php } else if ( is_single ( ) ) { ?>
<meta name=»description» content=» <?php single_meta_description ( ) ?> » />
<?php } ?>

Функция single_description ( ) определяется в functions.php:

function single_meta_description ( ) {
global $wp_query ;
// вырезаем html-тэги
$temp = preg_replace ( ‘#<[^>]*>#su’ , ‘ ‘ ,
$wp_query -> post -> post_content ) ;
// заменяем html entities на соответствующие символы
$temp = htmlspecialchars_decode ( $temp ) ;
// удаляем пробелы перед знаками препинания
$temp = preg_replace ( ‘#s+([.,;:!?)])#su’ , ‘$1’ , $temp ) ;
// заменяем последовательности из нескольких пробелов на один пробел
$temp = preg_replace ( ‘#s+#su’ , ‘ ‘ , $temp ) ;
// оставляем только первые 160 символов, пропуская пробелы в начале
$temp = preg_replace ( ‘#^s*(.{0,160}).*$#su’ , ‘$1’ , $temp ) ;
echo htmlspecialchars ( $temp ) ;
}

У меня в блоге не используются рубрики и нет возможности просматривать посты за указанный год или месяц. Если они есть в вашем блоге и вы решите воспользоваться приведенным кодом, вам придется соответствующим образом поправить header.php.

2. Работаем с несколькими мониторами в i3

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

i3-msg move workspace to output right
i3-msg move workspace to output left

Вводить ручками такие длинные команды грустно, поэтому повесим их на какие-нибудь сочетания клавиш. Открываем ~/.i3/config и дописываем в него:

bindsym $mod+z move workspace to output left
bindsym $mod+x move workspace to output right

Если у вас всего лишь два монитора, то вторая команда, очевидно, является лишней.

3. Утилита xxkb

Xxkb — это небольшая программа для отображения текущей раскладки клавиатуры. Вот так у меня выглядит файл ~/.xxkbrc:

XXkb.button.enable: no
XXkb.mainwindow.enable: yes
XXkb.mainwindow.type: tray
XXkb.mainwindow.geometry: 15×15+0+0
XXkb.image.path: /usr/share/xxkb/
XXkb.mainwindow.image.1: en15.xpm
XXkb.mainwindow.image.2: ru15.xpm

Для автозапуска xxkb в ~/.i3/config у меня прописано exec xxkb & .

4. Настройка шрифтов в Skype

У меня были слишком мелкие шрифты в Skype. Исправить ситуацию помогла утилиты qtconfig:

sudo apt-get install qt4-qtconfig

Запускаем qtconfig, меняем шрифт по умолчанию, перезапускаем Skype.

5. Добавляем сохранение истории в оболочку Erlang’а

Существует заплатка для Erlang’а, добавляющая сохранение истории команд между запусками оболочки. Устанавливается эта заплатка очень просто:

git clone git: // github.com / ferd / erlang-history.git
cd erlang-history
sudo make install

К сожалению, идущий в комплекте Makefile не работает под FreeBSD, и, вероятно, некоторыми другими системами. Я послал pull request , который исправляет эту ситуацию, но на момент написания этих строк он еще не был принят. Однако вы все равно можете воспользоваться скриптом install.escript из этого pull request’а.

6. Как в Git объединить несколько коммитов в один

При работе с Git иногда требуется объединить несколько коммитов в один. Например, если одно логическое изменение расползлось по нескольким коммитам, их имеет смысл объединить, чтобы изменение было проще понять по git log -p .

Вот как можно объединить несколько последних коммитов. Смотрим git log и находим коммит, который идет после (то есть, был сделан ранее) группы коммитов, которые мы хотим объединить. Говорим:

git rebase -i найденный_коммит

В $EDITOR будет открыт файл, в котором первую строку следует оставить без изменений, а во всех остальных — заменить слово pick на слово squash. Если строк, которые нужно изменить, много, и при этом вы пользуетесь vim , то можете воспользоваться следующей командой:

:2,$s/^pick/squash

Сохраняем все изменения, правим описание коммита, проверяем по git log , что получили именно то, что хотели. Затем удаляем нашу ветку с origin:

git push origin :название_текущей_ветки

… и создаем новую с таким же именем:

git push origin HEAD

Есть и другие способы объединения нескольких коммитов. Например, можно сохранить вывод команды git diff в отдельный файл, создать новую ветку от нужного места, а затем накатить изменения из файла с помощью git apply . Или воспользоваться комбинацией команд git reset и git commit --amend .

7. Настройка L2TP VPN в Ubuntu

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

sudo apt-add-repository ppa:seriy-pr / network-manager-l2tp
sudo apt-get update
sudo apt-get install xl2tpd openswan network-manager-l2tp-gnome
sudo service xl2tpd stop
sudo update-rc.d xl2tpd disable

При первом коннекте я получил ошибку «The VPN connection ‘myvpn’ failed because there were no valid VPN secrets». Избавиться от нее помогла команда:

/ etc / init.d / network-manager restart

Хм… или сначала сделать restart, затем соединиться, введя пароль вручную, отсоединиться, ввести пароль в настройках соединения, после чего снова соединиться. Как-то так, точно не помню. В общем, то ли в плагине, то ли в NetworkManager имеется бага с сохранением пароля, из-за которой приходится совершать такие телодвижения. Не считая этого момента, все работает, как часы.

8. Как пробросить SSH-ключ

Хранить копии SSH-ключей на разных серверах — не самая удачная идея. По понятным причинам. К счастью, протокол SSH позволяет «пробрасывать» локальные SSH-ключи. Вот как это работает:

eval ` ssh-agent -s `
ssh-add ~ / .ssh / id_rsa
ssh -A user @ example.ru

Теперь вы можете использовать ключ ~/.ssh/id_rsa, который хранится у вас на ноутбуке, на сервере example.ru. Список «проброшенных» ключей можно посмотреть командой ssh-add -l .

9. Перенаправление X’ов через SSH

А еще SSH позволяет запускать GUI-приложения на удаленной машине, используя локальный X-сервер:

ssh -X user @ example.ru

То есть, вы запускаете какой-нибудь xclock на сервере, а окошко у вас рисуются на мониторе, за которым вы сейчас сидите. Если окажется, что X11 forwarding у вас не работает, проверьте, что в /etc/ssh/sshd_config прописано X11Forwarding yes .

10. Делаем собственный clip2net за пять минут

Clip2Net — это сервис для публикации скриншотов в интернете. Недавно с их сайта исчез клиент для Linux. Среди достойных альтернатив мне удалось найти разве что JShot , но их клиент мне показался не очень удобным.

Тогда я подумал, а отчего бы не набросать небольшой скрипт, который делает скриншот экрана с помощью scrot, открывает его в каком-нибудь графическом редакторе, а затем заливает на ImageShack? Сложнее всего оказалось найти подходящий графический редактор. Я остановил свой выбор на Pinta. Он работает как под Linux, так и под FreeBSD, умеет делать все необходимое, прост и приятен в использовании. Несмотря на зависимость от Mono, Pinta тянет за собой не так уж много «лишних» пакетов.

Скрипт для создания и заливки скриншотов у меня получился таким:

#!/bin/sh

scrot / tmp / new-screenshot.png
pinta / tmp / new-screenshot.png
chromium-browser ` yfrog_upload / tmp / new-screenshot.png | grep imageshack.us | cut -f 2 `

Скрипт yfrog_upload вы найдете в седьмом выпуске мини-заметок . Если при запуске Pinta вы увидите ошибку «GLib.GException: Icon ‘gtk-dialog-error’ not present in theme …», установите последнюю версию пакета gnome-icon-theme-full, если вы пользуетесь Ubuntu, или пакета gnome-icon-theme, если вы пользуетесь FreeBSD.

Дополнение: Мини-заметки — выпуск 10

EnglishRussianUkrainian