четвер, 28 квітня 2016 р.

Очередная статья о разбивке жесткого диска

21 апреля, как и обещалось, вышла новая Ubuntu 16.04 LTS. Я решил поставить её на рабочем компе в оригинальном виде (с Unity), а на свой нетбук всё так же Xubuntu (фактически та же убунта, но с окружением рабочего стола - XFCE). Ну и конечно же, захотелось переразбить жесткие диски, так как в первый раз Я их разбивал по разных рекомендациях из сети и не имея собственного опыта. Из-за этого имел некоторые проблемы. Итак, давайте коротко пройдёмся по основным пунктам:

/ - корень (root), это должно существовать всегда, как иначе дерево будет без корня?
/home - тут будут храниться домашние каталоги пользователей; поскольку пользователи могут забить дисковое пространство под завязку, это надо закидать на отдельный раздел.
swap - это тоже надо, когда не будет хватать оперативки, своп выручает. Казалось бы, если оперативки на компе много, зачем своп? Только место занимает. Но, поэкспериментировав с компом с 8-ю гигами оперативы, увидел, что без свопа "умирает". Сегодня браузеры уже не те, да и скайп отжирает много. А если ещё какие-то виртуалки крутятся, то вообще беда. В общем, рекомендуемый своп - размер оперативки (по крайне мере, чтобы загнать ноут в спящий режим). Но, когда оперативки будет 16 гб или больше, будет немного жаль столько жесткого диска отдать. Возможно, при таких размерах оперативки и не пользуясь дополнительными режимами остановки ОС, можно своп сделать маленький - до 4 гб. С другой стороны, когда жесткий диск - 500 гб, то не жаль отдать и 16 гб на своп.

Вот для десктопа, в принципе, больше ничего и не нужно, если дать на корневой раздел - 30 гб, то должно хватить с головой. И не надо будет мучиться с LVM или ещё чем-нибудь подобным. Вот так, дешево и сердито, фактически как когда-то делали диски C: и D: для винды :)
Ну и можете смело для всех этих разделов выбирать файловую систему ext4 (возможно, потом появится ещё что-то лучше).
Если же это какой-то сервер или просто удаленная многопользовательская машина, рекомендуется сделать дополнительные разделы:

/tmp - при одновременной работе нескольких пользователей (конечно, смотря что они делают) этот каталог может расти, поэтому его надо забрать с корневого раздела и разместить отдельно.
/var - тут будут складироваться лог-файлы, если это сервер, то логи будут очень большие и расти будут очень быстро, поэтому - на отдельный раздел.
/usr - сюда обычно ставятся программы, большинство из них на серверах обновляются редко, обычно после всех проверок на стабильность, ибо сервер должен быть стабилен. И это рекомендуют даже монтировать в режиме только для чтения, чтобы никто не смог удалить какую-то важную программу. И лишь администратор при необходимости обновлений может перемонтировать в режим для чтения/записи и провести все обновления.
/etc - конфигурации всех и вся. Встречается редко, но видел даже такое, мол дополнительная защита конфигов.
И когда-то выносили /boot в отдельный маленький раздел (были на то свои причины) - этого делать уже не нужно.

Ну вот и всё. Прошу делиться своими мыслями по этому поводу. Конечно, статей и мыслей множество, и всё меняется со временем, поэтому будем пытаться идти в ногу со временем.

понеділок, 22 лютого 2016 р.

Vim kung fu

- Ты хочешь научиться кунг-фу?
- Дааааа!
- Тогда Я и есть твой мастер!

из мультфильма "Панда Кунг-Фу"


Так же, как мастер Шифу и панда По обрели новый опыт и новый взгляд на старые вещи, так и Я путем попыток и ошибок изменил в корне свою работу с Vim. И как обычно, начну с краткой предыстории.
Мой рабочий компьютер обычно остаётся включенным несколько месяцев (рекорд uptime - 112 дней), а значит и всё программы, окна, вкладки остаются на месте. И вот наконец настал тот час, когда у меня в vim открыт большой проект, нужно внести изменения в 6 файлов, чтобы реализовать нужную фичу. При этом надо было выключить компьютер, и Я вспомнил, что в vim есть возможность сохранить сессию (команда mksession). Я сохранил, закрыл, проверил - что-то пошло не так. NERDTree вообще не загрузил дерево каталогов, появилось также дополнительные пустые окна, в общем - хаос и ужас. Конечно же, Я сразу начал искать в сети что да и как. Предлагались разные варианты с дописыванием своих функций в конфиге vim. Но, в ходе поиска Я наткнулся на пост человека по имени Josh Davis http://joshldavis.com/2014/04/05/vim-tab-madness-buffers-vs-tabs/.
И вот тут до меня дошло, а ведь действительно - файлы в vim открываются в буферах, всё остальное - это для удобного размещения на экране. Следуя этой статье, ссылкам в ней и поиска в сети с новым ключевым словом - буфер, Я взялся перенастраивать свой Vim и перепрывыкать к работе с файлами (буквально два дня работы с редактором и всё отлично). Теперь табы Я использую крайне редко, соответственно, удалил плагин NERDTreeTabs, оставил только NERDTree.
Итак, приступим к новой настройке моего (если вы это всё же читате, скорее всего и вашего) любимого текстового редактора.
Порядок действий:

1) установить git, если вдруг ещё не поставлен

2) установить плагин для работы с буферами (и не только), как в блоге того Джоша:

На данном этапе у вас должно получится что-то такое:


А чтобы сделать такое красивое, как у Джоша, надо ещё поработать:
3) скачать шрифты для powerline
git clone https://github.com/powerline/fonts.git ~/.fonts

4) регистрируем шрифты в системе:
fc-cache -vf ~/.fonts/

5) выбираем в настройках терминала нужный шрифт (не все подойдут, но можно смело выбирать "Meslo LG S for Powerline")

6) добавляем строчку в .vimrc:
let g:airline_powerline_fonts = 1
Это заполнит словарь символов новым шрифтом.

И теперь у вас должно получится как-то так:


И ещё для полного счастья взгляните на плагин Tagbar https://github.com/majutsushi/tagbar (не забудьте установить exuberant-ctags перед его использованием).
Конечно же, весь этот процесс можно максимально автоматизировать, для чего можно написать скрипт вроде такого:
#!/bin/bash
# Install Pathogen plugin and runtime manager
mkdir -p ~/.vim/autoload ~/.vim/bundle && \
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

# Install plugins
git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle/nerdtree
git clone https://github.com/ctrlpvim/ctrlp.vim.git ~/.vim/bundle/ctrlp
git clone https://github.com/vim-airline/vim-airline.git ~/.vim/bundle/airline
git clone https://github.com/vim-airline/vim-airline-themes ~/.vim/bundle/airline-themes
git clone https://github.com/majutsushi/tagbar.git ~/.vim/bundle/tagbar

# Get fonts
git clone https://github.com/powerline/fonts.git ~/.fonts
fc-cache -vf ~/.fonts/

# Get vimrc
curl https://raw.githubusercontent.com/MasterSergius/conf_files/master/.vimrc -o ~/.vimrc

Здесь Я использую Vim Pathogen для управления плагинами, а готовый vimrc качаю из своего репозитория конфигурационных файлов (рекомендую и вам завести свой репозиторий). Единственное, что придётся сделать вручную - это выбрать шрифт в Терминале, но и это можно автоматизировать при желании. К примеру, в xfce сессии все настройки графической среды лежат в домашней директории (на момент создания этого поста - директория .xfce4). Там можно найти конфигурацию терминала в обычном текстовом файле, а значит задать шрифт автоматически довольно легко. Также для продвинутого использования плагинов, написания своих скриптов и т.д. рекомендую книгу The VimL Primer - Edit Like a Pro with Vim Plugins and Scripts by Benjamin Klein.
Не забывайте, что вы можете в комментариях писать свои предложения, делиться вашими настройками, плагинами, мыслями и так далее. Чем больше мы будем расшаривать полезную информацию, тем будет легче её найти другим. А другие тоже чем-то поделятся, а значит все выиграют.
Удачного кодинга с Vim!

понеділок, 18 січня 2016 р.

Полезные ресурсы и книги

Век живи - век учись! Можно сюда ещё добавить кучу прописных истин в стиле "мастерами не рождаются, мастерами становятся" и так далее. Мало того, некоторым вещам нужно обучаться десятилетиями. И, конечно, совершенства достичь вряд ли возможно, но стремиться нужно. Я, к примеру, познакомился с миром *nix более 5 лет назад, но ежедневно "сидеть" на линуксах начал лишь 3 года назад. И за это время Я ещё до сих пор не собрал собственноручно ядро (а ещё поговаривают, что каждый линуксоид должен сам себе собрать ядро и настроить с нуля систему); Я также понимаю, что мне известна лишь малая часть этого мира, и края не видно. Да и запомнить нормально всё то, что уже проходил тоже сложно, поэтому этот блог Я создал отчасти для себя, чтобы не забыть некоторые вещи, всегда иметь в сети пример конфига vim, быстро расшарить файлы по сети и т.п., если вдруг что-то случится с моими нотатками и бекапами на собственном компьютере. Конечно, если работа связана с администрированием системы, сети, баз данных или ещё чего, то оно само собой будет учиться и запоминаться. А для обычного пользователя, который хочет наслаждаться работой и быть эффективным вполне достаточно даже десятой части этих знаний. В общем, хватит лить водичку, перейдем к делу.

Книги (некоторые есть лишь на английском, но это даже ещё полезней):
- Современные операционные системы Эндрю Таненбаум
Unix и Linux. Руководство системного администратора Эви Немет, Гарт Снайдер, Трент Хейн, Бэн Уэйли
- Linux in a Nutshelby Ellen Siever, Stephen Figgins, Robert Love, Arnold Robbins
Компьютерные сети. Принципы, технологии, протоколы Олифер В.Г., Олифер Н.А.
- Запускаем Linux Маттиас Калле Далхаймер, Мэтт Уэлш
- Ubuntu Pocket Guide by Keir Thomas

Ресурсы:
- Advanced Bash Scripting Guide
- 10 лучших команд на хабре
60 команд от новичка до администратора
- Форум Ubuntu

Для начала всего этого хватит сполна. А далее - учимся самостоятельно находить нужную информацию, регистрироваться на соотвествующих форумах, коректно задавать вопросы. Если же у вас есть предложения по ресурсах, добавляйте в комментариях - давайте делиться информацией :)

вівторок, 5 січня 2016 р.

Работа с sshfs

Как уже ранее упоминалось, в мире Linux есть много способов расшаривания/передачи файлов по сети (рассматривались Samba, FTP и HTTP). Знаем также, что можно безопасно "ходить" по разных хостах через ssh и копировать файлы через scp. Даже можно работать в Vim на своей машине с помощью netrw плагина, который автоматически при сохранении файла копирует его через один из транспортных протоколов, что настраивается (в том числе и через scp). Естественно, это сопровождается задержками при сохранении, так как каждый раз устанавливается новое соединение. А можно просто примонтировать себе удалённую директорию (структуру, файловую систему и т.п.) и работать с ней как с локальной директорией. Естественно, никто чужой не должен иметь доступ к точке монтирования, иначе зачем эта вся безопасность с ssh?
Итак, для начала вам надо установить sshfs (теоретически, оно должно автоматически подтянуть fuse, на котором sshfs базируется). Все нужные настройки и дополнительные пакеты смотрите для вашего дистрибутива; в основном далее достаточно себя добавить в группу fuse и всё.
Монтирование выполняется командой:

sshfs <-o опции монтирования> user@host:<путь> <точка монтирования>

А размонтирование:

fusermount -u <точка монтирования>

Это всё можно красиво завернуть в простой bash скрипт, дабы облегчить себе же работу (в данном случае, к удалённым хостам Я подключаюсь через SOCKS, проброс через порт 3128):
#!/bin/bash

USAGE="USAGE:\n\
        \t$0 mount|umount|remount <host_name>\n"

SSHFS_MOUNT_ROOT=/home/sergius/work/SSHFS

action=$1
host=$2

function mount_sshfs( ) {
    if [[ -z $host ]]
    then
        echo "Invalid arguments"
        echo -e $USAGE
        exit 2
    fi

    mkdir -p $host
    sshfs -o reconnect,workaround=all,ProxyCommand="/bin/nc.openbsd -x localhost:3128 %h %p" sergius@$host: $SSHFS_MOUNT_ROOT/$host/
}

function umount_sshfs( ) {
    fusermount -u $SSHFS_MOUNT_ROOT/$host
}

function remount_sshfs( ) {
    umount_sshfs;
    mount_sshfs;
}

if [[ $action == "mount" ]]
then
    mount_sshfs;
elif [[ $action == "umount" ]]
then
    umount_sshfs;
elif [[ $action == "remount" ]]
then
    remount_sshfs;
else
    echo "Invalid arguments"
    echo -e $USAGE
    exit 1
fi

exit 0

Сохраняем скрипт под именем "mount_sshfs" и делаем его исполняемым. Теперь монтируем командой (если находимся в директории, где скрипт, то путь начинается с точки):
./mount_sshfs mount home_comp
Где home_comp - имя моего домашнего компьютера. В большинстве случаев, далее вам пригодится только remount. Есть один недостаток (больше мне не встречалось) в sshfs: когда связь обрывается, а вы выполняли как раз какую-то операцию ввода-вывода - это может затянуться надолго, а уж после появится сообщение с ошибкой. Всегда можно прибить процесс, перемонтировать. В любом случае, это надо всё попробовать самому - лучше один раз пощупать, чем сто раз увидеть.
Да и вообще, sshfs существует уже довольно давно, а вот активно пользоваться этим Я начал лишь несколько месяцев назад. И пришел к выводу, что довольно полезная вещь, по крайней мере в моей работе, поэтому решил это внести в блог, пусть запись вышла немного сырая, но кому-то может пригодиться. Также можете внести предложения к публикации в комментариях, подправлю.

пʼятниця, 4 грудня 2015 р.

Софт для чайников

Серия книг "для чайников" настолько была популярная, что эта приставка теперь используется очень часто (на лурке даже статья есть по этому поводу). И Я решил не отставать, что вылилось в данный пост, где напишу о своём топе программ для линуксов.
Опять-таки, удобный случай вспомнить, что многие люди "боятся" линукса (да, это всего лишь ядро, но многие и системный блок могут называть "процессором"), другие же просто не воспринимают его всерьёз, третьи не находят возможности запуска некоторых нужных им программ и игр (к сожалению, не все игры можно поиграть на линуксах). Но, что же нужно "простой домохозяйке"? Возможно утрирую, но зачастую - просто посидеть в соцсетях, почитать новости, посмотреть новую серию какой-нибудь Санта-Барбары, показать знакомым фоточки. Для этого фактически нет разницы какая ОС установлена, разве что домохозяйка не поймает случайно на линукс "винлокер".
Примечание: некоторые из описанных ниже программ могут не устанавливаться на некоторые дистрибутивы линукса (99.99% гарантии, что работают под убунтой), зато все бесплатные. Скриншоты, думаю, тоже не для всех программ нужны, дабы не делать слишком тяжелую страницу.
Итак, часть первая - программы для домохозяек.

Браузер: почти в каждом дистрибутиве идет Firefox прямо из коробки (или форк, как Iceweasel для дебиана). Можно установить также и google-chrome, но это уже дело вкуса.

Видеоплеер: мой выбор - VLC:

 
Аудиоплеер: DeadBeef - минималистичный и шустрый:


 или XMMS (с виду как старый добрый WinAmp):


Просмотрщик изображений: Ristretto (теоретически, подойдёт любой установленный из коробки)

Часть вторая - программы для продвинутых домохозяек.

Пакет офисных программ:  LibreOffice, на худой конец можно поставить и Microsoft Office под Wine - работает нормально. Но Google предоставляет возможность работать с документами прямо в браузере, даже презентации можно сделать. Думаю, скоро вообще отпадёт потребность в офисном пакете. 

Читалки: FBReader, Okular.

Запись оптических дисков: K3b

Коммуникации: Skype - сторонняя программа, поэтому нет в репозиториях, ставится с оффициального сайта. Pidgin можно настроить почти на все остальные протоколы связи. Ну и почтовик - Thunderbird, Evolution.

Торрент-клиент: Transmission - минималистичный и простой

Часть третья - Программы для продвинутых пользователей

Редактирование изображений: Gimp (растровые изображения), Inkscape (векторные изображения)

Файловый менеджер: Midnight Commander:



Krusader:




Записная книжка: Zim (Zim Desktop Wiki)

Управление дисками и разделами: GParted

Игры: Steam уже имеет много игрушек под линуксы (лучший выбор будет Ubuntu)

Ну и напоследок можно было что-то подсказать для разработчиков, но, теоретически, они и сами себе знают, что им нужно.
Хорошо жить на линуксе, не правда ли? :)

пʼятниця, 27 листопада 2015 р.

Мессенджер Telegram

Краткое вступление

Мой первый опыт общения с помощью Всемирной сети Интернет - электронная почта. Конечно же, почта будет жить всегда, но потом появились другие потребности - к примеру общение голосом, возможность увидеть есть ли онлайн тот или иной контакт, удобство общения (особенно для мобильных телефонов).
Так позже Я познакомился с ICQ (I seek you, аська). Этот сервис уже существовал относительно долго, мне удалось даже попользоваться мобильным клиентом QIP, который работал на многих телефонах (до эры смартфонов), которые позволяли устанавливать скачанные джава приложения (очень популярная была тогда линейка телефонов Sony Ericsson). В то время (примерно 2005) тарифы на мобильный Интернет были довольно высоки, да и мобильная связь тоже не была очень дешевой. Мобильный QIP потреблял очень мало трафика и позволял связываться с людьми по всему миру, в чём определённо была выгода.
Прошло ещё немножко времени - и компьютер уже почти в каждом доме, смартфон уже почти у каждого человека. Skype быстро набирал популярность, в то время как аська теряла. Конечно, множество людей также регистрировалось в разных социальных сетях и предпочитало общение там же. Но со skype можно было делать даже видеозвонки почти в любую точку мира, а Интернет уже был быстрым и дешевым. Но вот случилася беда - Microsoft выкупила Skype. Правда, он и чуть раньше начал портиться - старые смартфоны больше его не поддерживали, а новым, но с маленькими ресурсами - skype был уже не под силу. Кроме того, некоторые люди очень беспокоились тем, что skype "прослушивается" (многие также говорят, что им скрывать нечего, но довольно неприятно осознавать сам факт прослушки). Странички в соцсетях и без всяких специальных средств как на ладони, а если ещё и "попросят", то можно расковырять всё о владельце аккаунта. И вот немалоизвестный создатель одной из таких соцсетей - Павел Дуров (кстати, довольно интересная история его выезда из родной страны, обязательно почитайте) создаёт новый месенджер - Telegram.

Telegram

Вышел этот мессенджер в 2013 году, казалось бы чем он мог соревноваться с уже существующими мессенджерами. Но, пройдя на страничку Telegram, можно увидеть, что он предлагает следующие преимущества:
- бесплатный навсегда, без реклам, без взносов;
- супер защищенный; говорят, что не дадут доступа к перепискам даже на запросы разных спецслужб;
- легковесный, работает на любой популярной платформе, а также просто в браузере;
- клиент с открытым кодом (сервер - нет).
Ну и поскольку он привязан к телефонному номеру, то автоматически импортирует конакты всех людей из вашей телефонной книги, которые уже зарегистрированы в Telegram.
А в 2015 году появились ещё и программируемые боты для Telegram. Суть в том, что Вы можете отсылать вашему боту команду как обычное сообщение (каждый созданный вами бот будет висеть в списке контактов), а ваша программа может парсить эту команду, выполнить её и прислать вам ответ в тот же чат с ботом (или прислать файл, или ничего не присылать, а просто что-то выполнить). Это очень удобно, если Вам, к примеру, надо следить за "здоровьем" какого-то вашего сервера с любой точки планеты.

Telegram Bot

Рассмотрим как это работает на простом примере. Будем писать бота, который читает и копирует файлы в директорию Dropbox. Код, который Вы здесь увидите, не идеален, но может послужить Вам стартовой площадкой.
Все запросы к API телеграм бота делаются через HTTPS протокол и имеют такой формат:
https://api.telegram.org/bot<token>/<method>

Например: 

https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe

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

Ответ на любой запрос приходит в виде красивого JSON. Если отправить боту сообщение "Hello World", а потом проверить получил ли бот что-то новенькое, то это всё будет выглядеть примерно так:

 $ curl https://api.telegram.org/bot$TOKEN/getUpdates
 

{"ok":true,"result":[{"update_id":373347763,
"message":{"message_id":121,"from":{"id":119435478,"first_name":"Sergius","last_name":"Master"},"chat":{"id":119435478,"first_name":"Sergius","last_name":"Master","type":"private"},"date":1447629425,"text":"Hello World"}}]}

Итак, наша задача - распарсить этот JSON и послать соответствующий ему ответ (или не послать, если нет соответствия).
Для отправки ответа нужно использовать метод "sendMessage", где обязательные парамеры это сам текст сообщения и идентификатор чата - куда послать (с консоли надо "ескейпить" символ "&"):
$ curl https://api.telegram.org/bot$TOKEN/sendMessage?text=hello+from+bot\&chat_id=119435478

Для написания бота Я использовал мой любимый ЯП - Python. Естественно, принимать и отправлять сообщения будем не через curl, а через высокоуровневые библиотеки Python'a (urllib, urllib2).
 
#!/usr/bin/env python
import json
import logging
import logging.handlers
import os
import re
import shutil
import signal
import urllib
import urllib2

from contextlib import closing
from glob import glob
from string import Template
from time import sleep

HTTP_API_TEMPLATE = Template("https://api.telegram.org/bot${TOKEN}/${METHOD}")
API_TOKEN = "!!!!! HERE MUST BE YOUR API TOKEN !!!!!"

class TelegramBot(object):

    should_continue = False

    def __init__(self):
        self.last_update_id = None

        self._log = logging.getLogger('file_reader')
        self._log.setLevel(logging.INFO)
        handler = logging.handlers.SysLogHandler(address = '/dev/log')
        log_format = "%(filename)s: %(levelname)s: %(message)s"
        fmt = logging.Formatter(log_format)
        handler.setFormatter(fmt)
        self._log.addHandler(handler)

    def get_last_message(self):
        if self.last_update_id:
            response = self.get_updates("?offset=%s" % (self.last_update_id + 1))
        else:
            response = self.get_updates()

        resp_dict = json.loads(response)
        if resp_dict.get("result", []):
            last_msg_dict = resp_dict["result"][-1]
            self.last_update_id = int(last_msg_dict.get("update_id", 0))
            return { "from": last_msg_dict["message"]["chat"]["id"],
                     "cmd": last_msg_dict["message"]["text"] }

    def get_updates(self, options=""):
        subs_dict = {'TOKEN': API_TOKEN, 'METHOD': 'getUpdates%s' % options}
        get_message_url = HTTP_API_TEMPLATE.substitute(subs_dict)
        response = ""
        with closing(urllib2.urlopen(get_message_url)) as get_upd:
            response = get_upd.read()
        return response

    def send_response(self, text, send_to):
        options = "?" + urllib.urlencode({'chat_id': send_to, 'text': text})
        subs_dict = {'TOKEN': API_TOKEN, 'METHOD': 'sendMessage%s' % options}
        send_message_url = HTTP_API_TEMPLATE.substitute(subs_dict)
        response = ""
        print send_message_url
        with closing(urllib2.urlopen(send_message_url)) as send_msg:
            response = send_msg.read()

    def parse_command(self, command):
        command = command.split()
        if len(command) == 1:
            cmd, args = command[0], ""
        elif len(command) == 2:
            cmd, args = command
        else:
            return None, None
        match = re.search("/\w+", cmd.strip())
        if match:
            cmd = match.group()
            if re.match("^\S*$", args.strip()):
                return cmd, args.strip()
        return None, None

    def execute_command(self, command):
        """ Available commands:

            /help - shows this documentation
            /ls <directory>* - shows directory listing
                type /ls <directory>*.txt to show all txt files in directory
            /cat <file> - shows file
            /head <file> - shows first 10 lines of file
            /tail <file> - shows last 10 lines of file
            /cpd <file> - copy file to Dropbox/bot
        """
        cmd, args = self.parse_command(command)
        if cmd == "/help":
            return self.execute_command.__doc__
        if cmd == "/ls":
            return "\n".join(glob(args))
        if cmd == "/cat":
            try:
                output = ""
                with open(args) as f:
                    output = f.read()
                return output
            except IOError as e:
                return str(e)
        if cmd == "/head":
            try:
                output = ""
                with open(args) as f:
                   output = "".join(f.readlines()[:10])
                return output
            except IOError as e:
                return str(e)
        if cmd == "/tail":
            try:
                output = ""
                with open(args) as f:
                   output = "".join(f.readlines()[-10:])
                return output
            except IOError as e:
                return str(e)
        if cmd == "/cpd":
            DropboxFolder = "/home/sergius/Dropbox/bot"
            destination = "%s/%s" % (DropboxFolder, os.path.basename(args))
            try:
                shutil.copyfile(args, destination)
                return "Copied file successfully"
            except Exception as e:
                return str(e)

    def check_updates_for_command(self):
        msg = None
        try:
            msg = self.get_last_message()
        except Exception as e:
            self._log.error("Network Error: %s " % str(e))
            sleep(10)
            return None
        if msg:
            # Easter Egg ---
            if msg["cmd"].lower() == "good job":
                response = "Thank you, Master"
            # ---
            else:
                response = self.execute_command(msg["cmd"])
            if response:
                self.send_response(response, msg["from"])

    def doit(self):
        self._log.info('Starting telegram bot "file_reader"')
        TelegramBot.should_continue = True
        while TelegramBot.should_continue:
            self.check_updates_for_command()
            sleep(1)
        self._log.info('Stopping telegram bot "file_reader"')

    @staticmethod
    def signal_handler(signum, frame):
        TelegramBot.should_continue = False

signal.signal(signal.SIGTERM, TelegramBot.signal_handler)

def main():
    bot = TelegramBot()
    bot.doit()

if __name__ == "__main__":
    main()


Этот пример можете использовать как угодно, можете даже присылать свои варианты реализации, идеи новых ботов. 

середа, 2 вересня 2015 р.

Зачем IDE? Бери VIM и не оглядывайся

Если Вам текстовый редактор vim подходит для большинства мелких задач и Вы его полюбили, но не видите его в качестве инструмента для работы над крупным проэктом, то этот пост для Вас. Не зря в сети ходят шутки о редакторах Emacs и Vim (оригинал гласит вроде о первом): Emacs - хорошая операционная система, которой не хватает нормального текстового редактора.
Итак, перейдём к делу. Vim легко расширяем с помощью разных плагинов, которые устанавливать тоже легко. Есть несколько разных утилит для управления плагинами, и конечно же, некоторые плагины работают под управлением одной утилиты и не работают под управлением другой. Нам нужен Pathogen - имхо, наилучшая утилита. Следуя инструкции на гитхабе, устанавливаем:
mkdir -p ~/.vim/autoload ~/.vim/bundle && \curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

После чего добавляем строчку 
execute pathogen#infect()
в ваш .vimrc (у вас, как любителя vim уже должен быть свой, ну или хотя бы скопирован чей-то).
Теперь можно устанавлить разные плагины, их есть на любой вкус и цвет, легко находятся поисковиками. Здесь же познакомимся из плагином NERDTree и нормальной работой табов для него - NERDTreeTabs.
Как видно из инструкций по установке - всё довольно просто, копируются файлы плагина в папку ~/.vim/bundle и всё. Далее достаточно перезапуска vim-a. После установки плагинов, добавляем ещё одну строчку в ваш .vimrc:
let g:nerdtree_tabs_open_on_console_startup=1
Теперь эти пропатченные табы будут открываться сразу при старте vim. И вот как оно всё теперь выглядит:



Вверху есть табы (закладки), как видно из рисунка - открыто два файла. Слева - дерево каталогов, ну а главная область - содержимое файла. Чтобы открыть файл в новом табе, нужно стать тем курсором на файл и нажать "t". Дерево каталогов и содержимое файла находятся в разных окнах. Поэтому все команды для навигации остаются прежними. Перемещение между окнами по умолчанию CTRL+w и соотвествующая стрелка (в данном случае влево/вправо). Переключение вкладок последовательно - gt (Ngt - переключение на вкладку под номером N). Ну и конечно же, можно мышку включить, но мышкой пользоваться в vim - извращение. Теоретически, этого должно хватить вам с головой, но если мало, то попробуйте ещё ЭТО и можете оставить отзыв о нём в комментариях, ибо Я ещё его не пробовал.
Счастливого кодинга!