Мини заметки — выпуск 9

2 января 2013

Темы выпуска: добавляем вывод мета-тэгов 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: 15x15+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

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.