Удалённое парное программирование с использованием GNU Screen
Перевод этой статьи может послужить хорошей пошаговой инструкцией для тех, кто регулярно пользуется парным программированием, или хотя бы совместным просмотром кода, и при этом знаком и готов использовать текстовые редакторы, работающие в текстовом режиме (Emacs, vi и т.п.). В статье дано много интересных ссылок, советую по ним пробежать глазами, а первый комментарий содержит ссылку на аналогичный опыт, но с более чистым аналогом GNU Screen — tmux.
У нас в Siyelo две распределённых команды, одна в Кейптауне, вторая в Скопье. Нам приходится придумывать, как заниматься удалённым парным программированием между офисами. Существует много возможностей (отличный обобщающий пост здесь).
Раньше мы постоянно пользовались Skype'ом для разделения экрана, но у нас при этом возникали следующие проблемы:
— нет контроля над экраном другого пользователя (странно, у меня такая возможность есть, возможно с помощью какого-то плагина)
— невозможно одновременно разделять экран и использовать видеоконференцию (о том, зачем это нужно подробнее есть в заметке по ссылке, данной несколькими строками выше)
— пропускная способность сети иногда может стать проблемой
— это не инструмент для парного программирования
Мы недавно экспериментировали с Google+ Hangouts и, хотя и обнаружили у него те же самые недостатки, предпочли его для аудио- и видеоконференций. Но что нам действительно нужно от инструмента парного программирования, так это совместное редактирование кода в реальном времени.
Решение: screen. У Screen есть много полезных сценариев использования, но в этой статье мы сконцентрируемся на следующих двух:
— только для чтения: удобно в качестве разделения экрана одной стороной без возможности вмешательства другой
— дозволяющая: удобно для совместного программирования
Ниже о том, как запустить оба сценария. Замечание: недостаток таких интрументов, как screen, это то, что всем участникам нужно уметь использовать редактор, который запускается в терминале. К счастью, мы все любим vim.
Первым делом нам нужно установить SSH сервер, так как все коммуникации будут идти по защищённому каналу:
sudo apt-get install openssh-server
Для первого сценария, нам нужно будет добавить гостевой аккаунт на принимающей стороне. По соображениям безопасности мы создадим его с помощью rbash (ограничивающий bash), который будет использоваться программистом на удалённой стороне для того, чтобы подключиться к нашей машине.
sudo useradd -s /bin/rbash guest
sudo passwd guest
sudo mkdir /home/guest
Далее, нам нужно задать профиль гостевого аккаунта. Добавьте следующее в /home/guest/.profile:
trap "" 2 3 19 # не давать пользователю выйти в оболочку
clear
echo «Добро пожаловать в сессию парного программирования»
echo -n «Нажмите Enter, чтобы продолжить» && read
screen -x dalibor/pairprog
exit
Здесь, как вы можете заметить, «screen -x dalibor/pairprog» автоматически подключит гостя к сессии с кодом «pairprog», которая запущена пользователем «dalibor».
Далее нам нужно установить screen на принимающей стороне (на всякий случай, если его ещё там нет):
sudo apt-get install screen
По соображениям безопасности, screen по умолчанию установлен так, что пользователи системы не могут подсоединиться к сессиям других пользователей (сообщение об ошибке «Must run suid root for multiuser support.»). Чтобы разрешить другим пользователям подсоединяться нужно запустить следующее (нужно подправить путь к screen):
sudo chmod +s /usr/bin/screen
sudo chmod 755 /var/run/screen
Прим. перев. Возможно, достаточно было бы внести обоих пользователей в группу, скажем, pairs, и сделать chgrp на эту группу.
Далее нужно добавить следующие строки в конфигурационный файл ~/.screenrc:
hardstatus on
hardstatus alwayslastline
startup_message off
termcapinfo xterm ti@:te@
hardstatus string "%{= kG}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "
screen -t bash1 1
# multiuser setup
multiuser on
aclchg guest -wx "#,?"
aclchg guest +x «colon,wall,detach»
Самое важное здесь это «multiuser on», который позволяет нескольким пользователям одновременно подключаться к сессии и «aclchg», которая снимает все ограничения на запись и исполнения для всех окон (#) и комманд (?) гостевого пользователя. Сконфигурировав это так, принимающая сторона может делать что угодно, а гость только смотреть, или писать сообщения, используя <c-a> wall «привет!».
В конце концов, screen сессия запускается принимающей стороной:
screen -S pairprog
Гость заходит по SSH на принимающую машину:
ssh guest@host
Теперь можно вместе работать с одним терминалом. Чуть больше о командах screen здесь.
Если мы доверяем гостевому пользователю, можно добавить ему прав с помощью команды «acladd».
multiuser on
acladd guest
В этом случае гостевой пользователь может присоединиться к сессии (уже зайдя по SSH) слеюущей командой:
screen -x host/pairprog
Подробнее о командах screen можно узнать в справочнике команд. Основные команды:
Ctrl-a d # отключиться от экрана screen
Ctrl-a Ctrl-a # переключаться туда-сюда между экранами
screen -r # переподключиться к эрану screen
Если вдруг вы не соберётесь почитать ссылки, ниже интересные вещи оттуда.
Во время сессий хочется не только слышать, но и видеть второго участника, иначе упускаешь язык тела.
Существует и более человечный аналог GNU Screen — tmux, пришедший из NetBSD, с более продуманной архитектурой, с более читаемым и поддерживаемым кодом. Ко всему прочему, в нём есть как горизонтальное, так и вертикальное разделение окон, доступное без всяких патчей. Здесь краткая заметка о парноем программировании с tmux и vim.
У нас в Siyelo две распределённых команды, одна в Кейптауне, вторая в Скопье. Нам приходится придумывать, как заниматься удалённым парным программированием между офисами. Существует много возможностей (отличный обобщающий пост здесь).
Раньше мы постоянно пользовались Skype'ом для разделения экрана, но у нас при этом возникали следующие проблемы:
— нет контроля над экраном другого пользователя (странно, у меня такая возможность есть, возможно с помощью какого-то плагина)
— невозможно одновременно разделять экран и использовать видеоконференцию (о том, зачем это нужно подробнее есть в заметке по ссылке, данной несколькими строками выше)
— пропускная способность сети иногда может стать проблемой
— это не инструмент для парного программирования
Мы недавно экспериментировали с Google+ Hangouts и, хотя и обнаружили у него те же самые недостатки, предпочли его для аудио- и видеоконференций. Но что нам действительно нужно от инструмента парного программирования, так это совместное редактирование кода в реальном времени.
Решение: screen. У Screen есть много полезных сценариев использования, но в этой статье мы сконцентрируемся на следующих двух:
— только для чтения: удобно в качестве разделения экрана одной стороной без возможности вмешательства другой
— дозволяющая: удобно для совместного программирования
Ниже о том, как запустить оба сценария. Замечание: недостаток таких интрументов, как screen, это то, что всем участникам нужно уметь использовать редактор, который запускается в терминале. К счастью, мы все любим vim.
Первым делом нам нужно установить SSH сервер, так как все коммуникации будут идти по защищённому каналу:
sudo apt-get install openssh-server
Для первого сценария, нам нужно будет добавить гостевой аккаунт на принимающей стороне. По соображениям безопасности мы создадим его с помощью rbash (ограничивающий bash), который будет использоваться программистом на удалённой стороне для того, чтобы подключиться к нашей машине.
sudo useradd -s /bin/rbash guest
sudo passwd guest
sudo mkdir /home/guest
Далее, нам нужно задать профиль гостевого аккаунта. Добавьте следующее в /home/guest/.profile:
trap "" 2 3 19 # не давать пользователю выйти в оболочку
clear
echo «Добро пожаловать в сессию парного программирования»
echo -n «Нажмите Enter, чтобы продолжить» && read
screen -x dalibor/pairprog
exit
Здесь, как вы можете заметить, «screen -x dalibor/pairprog» автоматически подключит гостя к сессии с кодом «pairprog», которая запущена пользователем «dalibor».
Далее нам нужно установить screen на принимающей стороне (на всякий случай, если его ещё там нет):
sudo apt-get install screen
По соображениям безопасности, screen по умолчанию установлен так, что пользователи системы не могут подсоединиться к сессиям других пользователей (сообщение об ошибке «Must run suid root for multiuser support.»). Чтобы разрешить другим пользователям подсоединяться нужно запустить следующее (нужно подправить путь к screen):
sudo chmod +s /usr/bin/screen
sudo chmod 755 /var/run/screen
Прим. перев. Возможно, достаточно было бы внести обоих пользователей в группу, скажем, pairs, и сделать chgrp на эту группу.
Далее нужно добавить следующие строки в конфигурационный файл ~/.screenrc:
hardstatus on
hardstatus alwayslastline
startup_message off
termcapinfo xterm ti@:te@
hardstatus string "%{= kG}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "
screen -t bash1 1
# multiuser setup
multiuser on
aclchg guest -wx "#,?"
aclchg guest +x «colon,wall,detach»
Самое важное здесь это «multiuser on», который позволяет нескольким пользователям одновременно подключаться к сессии и «aclchg», которая снимает все ограничения на запись и исполнения для всех окон (#) и комманд (?) гостевого пользователя. Сконфигурировав это так, принимающая сторона может делать что угодно, а гость только смотреть, или писать сообщения, используя <c-a> wall «привет!».
В конце концов, screen сессия запускается принимающей стороной:
screen -S pairprog
Гость заходит по SSH на принимающую машину:
ssh guest@host
Теперь можно вместе работать с одним терминалом. Чуть больше о командах screen здесь.
Если мы доверяем гостевому пользователю, можно добавить ему прав с помощью команды «acladd».
multiuser on
acladd guest
В этом случае гостевой пользователь может присоединиться к сессии (уже зайдя по SSH) слеюущей командой:
screen -x host/pairprog
Подробнее о командах screen можно узнать в справочнике команд. Основные команды:
Ctrl-a d # отключиться от экрана screen
Ctrl-a Ctrl-a # переключаться туда-сюда между экранами
screen -r # переподключиться к эрану screen
Если вдруг вы не соберётесь почитать ссылки, ниже интересные вещи оттуда.
Во время сессий хочется не только слышать, но и видеть второго участника, иначе упускаешь язык тела.
Существует и более человечный аналог GNU Screen — tmux, пришедший из NetBSD, с более продуманной архитектурой, с более читаемым и поддерживаемым кодом. Ко всему прочему, в нём есть как горизонтальное, так и вертикальное разделение окон, доступное без всяких патчей. Здесь краткая заметка о парноем программировании с tmux и vim.