понеділок, 1 липня 2019 р.

Игры на линухе?

Здравствуйте, похоже немножко заигрался и, соответсвенно, ничего не писал в этот блог. Зато теперь есть чем поделиться. До сих пор многие говорят, что на линуксах не наиграешься, но это не совсем правда (или совсем не правда). Были простенькие нативные игры еще до популяризации Steam, а также некоторые кросс-платформенные, к примеру игра UrbanTerror на движке Quake 3 является для меня одной из лучших стрелялок вообще. И конечно же многие виндузятные игры можно было запустить через Wine. И все же, еще 10 лет назад трудно было удовлетворить свое желание играться на линуксах и, поэтому, утверждение "линукс не для игр" было вполне справедливо. Но Steam приятно удивил и заставил меня изменить мое отношение к нему: на данный момент у меня больше сотни игр в стиме, которые работают на моей Ubuntu 16.04. Некоторые популярные игры даже бесплатные, например Dota 2. А другие таки надо будет покупать. К счастью, в Steam постоянно есть какие-то распродажи. К примеру, мне удалось купить всю коллекцию Counter-Strike всего за пару баксов. Также Humble Bundle помогает в этом. И да, Я начал покупать игры - как говорится, люди голосуют рублем. Соответсвенно, чем больше будут покупать игры, которые сделаны не только под винду, тем охотнее компании и отдельные разработчики будут пытаться сделать эти игры рабочими и на других платформах. Мало того, Steam разрабатывает систему Proton, которая позволяет запускать виндузятные игры на линуксе. И тогда Я решил, что буду покупать и виндузятные игры, если выпадет хорошая скидка, естественно. Некоторые старые игры приобретенные в стиме запускаются через DosBox и работают отлично, например Master of Orion 1 и 2. Некоторые через этот Proton - Splinter Cell, Sacred, Mirrors Edge. А вот есть некоторые старые игры, которые к сожалению, никак не хотят работать - Fallout 1, Disciples 1 и 2. Также имеются некоторые баги в некоторых играх, и может быть что их нет под виндой, но наиболее популярные игры обычно ничем не отличаются по играбельности на какой бы платформе они ни были. Возможно, в будущем все это исправится, или же мне пора поставить Ubuntu 18.04 и прикупить видеокарту, пока что играю без видеокарты. И следующий пост в блоге будет о моем выборе видеокарты, покупке и как она будет работать. Тем не менее, спектр рабочих игр довольно большой и может удовлетворить многих игроков, тем более, что очень часто люди играют постоянно всего лишь несколько игр из своего списка.
В общем, Я рад, что происходят такие улучшения и агатирую поддержать рублем тех, кто делает игры на все платформы. Также, неплохо было бы и донатить иногда в какие-то опенсорс проэкты, это тоже помогает, тем более что оно вам и воздастся потом в виде чего-то бесплатного и качественного (опенсорс обычно намного качественней закрытого софта). А пока что все, ушел играться :)

понеділок, 14 листопада 2016 р.

Cisco Webex как приложение для Google Chrome

Прошло полгода с момента моей публикации о том как настроить Cisco Webex на 64-битную Ubuntu - http://nixtravelling.blogspot.com/2016/05/cisco-webex-linux-64-bit.html, и как-то даже неожиданно (по крайней мере для меня) выходит приложение Cisco Webex для браузера Google Chrome. В поиске расширений (Extensions) нужно выбрать Cisco Webex из списка приложений (Apps), а не из расширений. И оно работает! Всё работает - даже видеокамера. Для последующих запусков этого приложения, нужно зайти в браузере в настройки самого приложения и добавить ярлык на рабочий стол. Если же у вас нет рабочего стола (окружения рабочего стола), то конечно же, тот ярлык вы запустить не сможете. Но, открыв созданный файл (что-то вроде ~/Desktop/chrome-fcaampjejlfaadkgdacpfhheknndlcjl-Default.desktop):

#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Terminal=false
Type=Application
Name=Cisco WebEx
Exec=/opt/google/chrome/google-chrome --profile-directory=Default --app-id=fcaampjejlfaadkgdacpfhheknndlcjl
Icon=chrome-fcaampjejlfaadkgdacpfhheknndlcjl-Default
StartupWMClass=crx_fcaampjejlfaadkgdacpfhheknndlcjl
Копируем значение аттрибута Exec и вставляем себе в шелл-скрипт. Вот это и будет запускать приложение Cisco Webex.
Вот и всё. Наконец-то, дождались. Ещё осталось дождаться драйверов побольше и игрушек. Удачи.


пʼятниця, 26 серпня 2016 р.

Жизнь в терминале

Продолжая прошлую тему i3wm, ещё раз напомню, что с клавитурой работать быстрее и удобнее, чем с мышкой. Да, мышку всё равно приходиться брать в руки (ютубчики, фейсбучики, пострелять в UrbanTerror и т.д. и т.п.) Ну а всё остальное отлично получается делать с помощью клавиатуры и хороших утилит. Поехали.
Первое, без чего будет тяжело - файловый менеджер. Уже неоднократно упомянутый Midnight Commander чудесно с этим справляется, а также приносит настоящую радость тем, кто ещё помнит Norton и Volkov Commander. Немножко настроить, выучить пару клавиатурных комбинаций - и друзья навеки:

Есть ещё Ranger со своими интересными фичами и vim-like командами, но, как по мне, не то:

Легковесная читалка pdf/djvu - Zathura, тоже с vim-like командами, нравится очень:

Также открыл для себя простой музыкальный плеер с встроенным навигатором по файловой системе, Cmus:

Даже погуглить иногда спокойно можно с текстовым браузером w3m или elinks. Больше нравится w3m, вот как выглядит стартова страница гугла в нём:

А ещё проще можно сделать поиск с помощью утилиты surfraw, к примеру выполнив команду:
surfraw google nixtravelling

сразу получим страницу выдачи гугл:

Кстати, w3m тоже имеет много vim-like команд и комбинаций клавиш. Как видим, от изучения редактора vim одни плюсы.

Переходя теперь больше к i3wm, а значит не имея DE и привыкая делать всё с помощью терминала, нам необходимо решить ещё пару проблем. Первое - ассоциации программ по-умолчанию с типами файлов. Узнать тип (mime) файла можно с помощью команды:
xdg-mime query filetype <path_to_file>

А задать программу по умолчанию командой:
xdg-mime default <program>.desktop <mimetype>

Открыть же программой по умолчанию некий файл можно командой xdg-open (ну или уже просто ентером в файловом менеджере). Пример:
$ xdg-mime query filetype ~/Downloads/Coroutines.pdf
application/pdf
$ xdg-mime default zathura.desktop application/pdf

Следующая проблема - как монтировать/отмонтировать флешку с терминала? Конечно же, использовать команду mount/umount. Для монтирования Я себе даже скриптик накидал, ибо часто приходится вводить дополнительные опции:
#!/bin/bash

function Mount_USB()
{
    cmd="sudo mount -ouser,uid=1000,gid=1000,umask=0000 $1 $2"
    echo "$cmd"
    $cmd
}

usb_device=$1
directory=$2
if [ -z $1 ] || [ -z $2 ]; then
    echo "USAGE: mount_usb.sh <usb_device> <directory>"
    exit 1
fi
if [ -d $directory ]; then
    Mount_USB $usb_device $directory
else
    sudo mkdir $directory
    Mount_USB $usb_device $directory
fi

Здесь gid, uid равняются 1000, это идентификатор группы и пользователя меня. Для себя вы можете узнать выполнив команду id. Отмонтировать же флешку можно как по точке монтирования, так и по пути устройства флешки. Я выбираю второе. Думаю, если Вы работаете ежедневно в терминале, то с флешками проблем никак не будет. Ну и если хочется выглядеть полностью как задрот, можно ещё себе поставить пакет bsdgames - сборник классических игр в текстовом режиме, а некоторые в полутекстовом (скорее всего с библиотекой curses):

Да, это тетрис! А ещё есть даже текстовая игра MMORPG! И мало кто поймёт на работе, что вы играетесь, а не работаете :)
Чтобы в неё играть, даже не надо ничего устанавливать, просто подключаетесь через telnet:
telnet www.ateraan.com 4002

На этом всё. Возможно, по i3wm продолжение всё ещё следует...

пʼятниця, 12 серпня 2016 р.

i3wm. Впечатления и настройка

Вот уже несколько месяцев прошло как Я перешел на "оконный менеджер" вместо "окружения рабочего стола". Более техническую и точную разницу между этими двумя понятиями можете нагуглить. С точки зрения обычного пользователя (по крайней мере с того, что мне почувствовалось) - WM (оконный менеджер) лишь управляет окнами, а значит:
1) меньше жрет ресурсов;
2) основная работа будет с клавиатурой, мышкой лишь в браузере тыкать и в Gimp;
3) настройки в большей части делать нужно через терминал и конфигурационные файлы, никакой общей панели управления, хотя это сделать можно.
Для обычного пользователя это всё может показаться сложным и ненужным - ну и что, что жрет меньше ресурсов, ведь у меня 100500 ГБ оперативки и чуть меньше ядер процессора. А вот мой старый ноутбук получил вторую жизнь, голая система (Ubuntu 16.04) без DE съедает лишь чуть более чем 200 МБ оперативки. Ну и тайловый оконный менеджер i3 (i3wm - improved windows manager), которому посвящен этот пост, предоставляет ещё одну чудесную возможность - настройка нескольких мониторов с разнымы разрешениями реально проще пареной репы.
Итак, знакомство можете начинать с официального сайта - https://i3wm.org/docs/userguide.html. Для начала можно поставить его дополнительно к обычному DE и выбирать сессию i3 при логине. А когда хватит сил пересесть полностью, можно поставить голый дистрибутив линукса без DE и тогда сразу ставить этот WM. Перед загрузкой сессии i3 обязательно выпишите себе пару комбинаций клавиш и команд, ибо так и застрянете с пустым чёрным экраном и будете делать хард ресет :)
При первом запуске i3 спросит клавишу-модификатор, Я себе выбрал клавишу "win" - хоть какая-то польза и не будет перебивать другие комбинации. Теперь Вы можете запустить терминал комбинацией "win+Enter", а если есть терминал - есть всё.
Кстати, насчёт эмулятора терминала, мой выбор в i3 - urxvt, а для полного счастья нужно ставить пакет rxvt-unicode-256color. Он не такой функциональный как, например, стандартный гномовский, зато быстрее и красиво выглядит в тайловых WM. Все настройки urxvt правите в ~/.Xresources, после редактирования файла - выполнить команду:

xrdb ~/.Xresources

Следующий важный для меня шаг - настройка статусной строки, особенно хотелось иметь рабочие иконки Dropbox и Skype. Конечно же, хотелось настроить имеющуюся с коробки строку статуса - i3bar, хоть она немного багнутая. Если не понравится, ставьте что-либо другое, i3wm не будет обижаться.

Как работает i3bar: утилита i3status читает конфиг файл /etc/i3status.conf и скармливает полученные статусы в виде строки утилите i3bar. Конечно же, адекватные статусы хочется получать за приемлемое время, не более секунды. Поэтому в конфиг файле  в секции general, опции interval нужно задать значение 1. Ещё быстрее нет смысла, только лишняя нагрузка процессора. Но из-за того, что эти статусы то ли стают в очередь, то ли ещё чего, а мой старый нетбук до того тормозной, что не успевал каждую секунду обрабатывать всё и обрабатывал статус где-то за 1,1 секунды, они отображались не вовремя. Через час работы разница во времени (между настоящим и тем, что показывал в строке статуса) ставала очень велика, около 15-20 минут. Поэтому нужно было придумать что-то другое. К счастью, i3 позволяет написать свой скрипт для получения статусов и использовать его совместно со встроенным, либо даже без встроенного. Итак, первая версия скрипта:
#!/bin/sh
# shell script to prepend i3status with more stuff

i3status | while :
do
    read line
    datetime = $(date +"%Y-%m-%d %H:%M:%S")
    echo "$datetime | $line" || exit 1
done
Принцип работы скрипта простой: читаем i3status, достаём то, чего нам не хватает, и выводим эту сроку далее. В таком варианте пропадут все цвета, поскольку цвета кодируются специальными последовательностями символов и съедаются оболочкой. Но при желании можно дописать свои функции для обертки разных параметров цветами.
Чтобы этот скрипт запускался вместо стандартного i3status, нужно в ~/.config/i3/config править секцию bar:
bar {                                                                           
        status_command ~/i3status.sh                                            
        tray_output primary                                                     
        position top                                                            
}
В опции status_command нужно указать полный путь к своему скрипту (ну или поместить его по одному из путей в переменной PATH).
Следующее, что мне страшно нехватало -  отображение раскладки, языка. Опять-таки, i3wm не для новичков, придется потратить много времени и нервов. Но настроив единожды, можно легко переносить свои настройки на любую другую машину. Также можно заливать конфигурационные файлы и автоматические скрипты на GitHub и выполнять любую настройку с нуля за считанные минуты. Для управления раскладками (чтобы в каждом приложении была своя раскладка), нужно поставить kbdd. Сами же раскладки, метод переключения и  запуск kbdd настраиваем в ~/.xinitrc:
setxkbmap "us,ua,ru" ",winkeys" "grp:shift_caps_toggle"
kbdd
exec i3
Что это всё значит:
1) 3 раскладки - us, ua, ru, переключение комбинациией shift+caps lock (по аналогии можете себе настраивать всё, что угодно)
2) запуск kbdd после установления раскладок
3) запуск сесии i3

При этом это всё запустится при выполнении команды "startx". А startx придется выполнять, ибо компьютер будет грузиться в режиме без иксов и вместо окошечка с логином будет консоль с логином. Кстати, это тоже надо настроить правильно:
1) нужно поправить конфиг grub
ищем строку

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

и меняем на

GRUB_CMDLINE_LINUX_DEFAULT="text"
после чего обновить груб:

sudo update-grub

2) Для систем, которые используют systemd надо сделать дополнительные настройки:
sudo systemctl enable multi-user.target --force
sudo systemctl set-default multi-user.target
3) сам блокиратор экрана с логином тоже нужен консольный, для этого хорошо подойдет vlock, но надо ставить версию 2.2.2-3, никак не 2.2.2-5 (в этой более новой версии почему-то можно зайти без пароля с другого tty). Ну и потом надо будет сказать своему пакетному менеджеру, чтобы не обновлял vlock. Далее вешаем блокирование экрана на стандартную комбинацию (CTRL+ALT+L), для этого в ~/.config/i3/config добавляем строчку:
bindsym ctrl+Mod1+l exec vlock -an

Теперь надо настроить отображение раскладок в строке статуса, поэтому тот скрипт i3status.sh будет выглядеть примерно так:
#!/bin/sh
# shell script to prepend i3status with more stuff

i3status | while :
do
    read line
    datetime = $(date +"%Y-%m-%d %H:%M:%S")
    layouts=$(setxkbmap -query | awk '/layout/{print $2}')
    current=$(dbus-send --print-reply=literal --dest=ru.gentoo.KbddService /ru/gentoo/KbddService ru.gentoo.kbdd.getCurrentLayout | awk '{ print $2 }')
    index=$(($current+1))
    lang=$(echo $layouts | cut -d, -f$index)
    echo "$lang | $datetime | $line" || exit 1
done
То есть, текущая раскладка будет показана перед датой/временем.

Если же Вы таки решились поставить на ноутбук i3wm, Вам скорее всего захочется в строке статуса отображать уровень заряда батареи и уровень сигнала wifi. Отображение уровня  заряда батареи можно настроить стандартными средствами в файле /etc/i3status.conf (возможно, поменять надо будет индекс  батареи с 0 на 1, или наоборот в зависимости от ноутбука):
battery 1 {
  format = "%status %percentage - %remaining"
  low_threshold = 30
  threshold_type = time
  # toggle actual capacity/design capacity
  #last_full_capacity = true
  hide_seconds = true
  integer_battery_capacity = true
}
Аналогично, возможно надо будет поиграться с индексом звукового устройства для отображения громкости:
volume master {
    format = "♪: %volume"
    format_muted = "♪: muted (%volume)"
    device = "pulse:0"
}
Саму же громкось в данном случае регулирую через программу pavucontrol (если у вас тоже Pulse, то настройки по сути те же). 

Ну а вот уровень сигнала wifi было "достать" не так просто. Лично мне удалось через CLI (Command Line Interface) Network Manager-а. Возможно, найдете лучший способ. Кстати, искать беспроводные сети и подключаться к ним можно через этот же nmcli. Итак, финальная версия скрипта i3status.sh для ноутбука:
#!/bin/sh
# shell script to prepend i3status with more stuff

i3status | while :
do
    read line
    layouts=$(setxkbmap -query | awk '/layout/{print $2}')
    current=$(dbus-send --print-reply=literal --dest=ru.gentoo.KbddService /ru/gentoo/KbddService ru.gentoo.kbdd.getCurrentLayout | awk '{ print $2 }')
    index=$(($current+1))
    lang=$(echo $layouts | cut -d, -f$index)
    wifi=$(nmcli d wifi | grep "^\*" | grep -v "\*.*SSID" | awk '{ print $8 }')
    datetime=$(date +"%Y-%m-%d %H:%M:%S")
    echo "$lang | W: $wifi | $line | $datetime" || exit 1
done
Ах, ну и ещё отключить "клик мышки" на тачпаде, это страшно бесит. Нужно добавить строчку (# - комментарий, не обязательно добавлять, но хорошо проясняет следующую строчку) в файл ~/.config/i3/config:
# Turn off tap click (single finger, two finger, and 3 finger)
exec synclient TapButton1=0 TapButton2=0 TapButton3=0
Иконки. Почему-то именно иконка Dropbox не хочет нормально отображаться в i3bar. Оказывается, нужно запустить dbus перед стартом dropbox, но в какой только скрипт Я не пробовал это засунуть, а Dropbox по-прежнему запускался без иконки. Пока что решил эту проблему тем, что создал скрипт dropbox_fix.sh и прописал такую строчку:
dropbox stop; dbus-launch; dropbox start &
И теперь каждый раз когда вижу, что нет иконки, запускаю этот скрипт. Иногда бывают проблемы с отображением иконок Skype и даже Thunderbird. Это лечится проще - просто перезагрузкой i3 "на месте" (никак не влияет на все запущенные программы), обычно это комбинация mod+shift+r. Да, ещё раз напомню, что багов таких мелких хватает, но плюсов в i3wm Я увидел больше, да и рабочий компьютер у меня не выключается месяцами, а значит "стартовые багофиксы" выполняю очень редко.

Далее, что ещё нужно знать о настройках - в конфиг файле ~/.config/i3/config ваша выбранная клавиша-модификатор будет обозначаться как $mod, клавиша alt обозначается как Mod1, клавиша win - Mod4. Все остальные клавиши таких специальных обозначений не имеют. Настроить несколько мониторов можно в этом же файле используя команду xrandr.
И ещё одна важная вещь - скриншоты тоже надо настроить! Но и это не проблема. Сначала ставим утилиту scrot - легкая, быстрая и конфигурабельная. Обычний снимок (весь экран) вешаю на кнопку PrintScreen, а на Alt+PrintScreen - снимок текущего (активного) окна. Поскольку клавиша Alt сама является модификатором, то самый легкий способ привязать данную комбинацию - это указать альтернативное значение кнопки PrintScreen, то есть - SysRq. Итого в файл ~/.config/i3/config добавляем следующие строчки:


# Take screenshots
bindsym Print exec scrot '%Y-%m-%d_%H:%M:%S.png' -e 'mv $f ~/Pictures/'
bindsym Mod1+Sys_Req exec scrot -u '%Y-%m-%d_%H:%M:%S.png' -e 'mv $f ~/Pictures/'
В результате все скриншоты будут попадать в папку ~/Pictures. При желани можно наконфигурить ещё больше гибкости. Вот пример скриншота с i3wm:



Пока что всё. Если у Вас есть другие предложения по настройке i3wm прошу делиться. Я же по возможности буду редактировать этот пост или напишу новый если наберется много чего нового. Продолжение следует...

понеділок, 30 травня 2016 р.

Многострадальная тема - Cisco Webex на Linux 64-bit

Вот и Я столкнулся с данной проблемой при переходе на 64-битную Ubuntu. В Интернете уже есть множество вопросов, обсуждений и решений. Насколько мне удалось понять - никто делать нормальную поддержку для линуксов не будет, сделали единожды для 32-бит - и хорошо. А что касается решений - большинство из них либо устаревшие, либо очень сложные. В любом случае, универсального решения (да ещё такого, чтобы автоматический скрипт написать) можно не ждать. Придется немного поковырять самостоятельно. Единственное, что Вам нужно 100% - 32-битный браузер и библиотеки. Итак, каркас настройки берем из этой статьи (она тоже устаревшая) - https://habrahabr.ru/post/163771/
Чтоб скачать последнюю 32-битную версию firefox смотрим в этот файл:
http://ftp.mozilla.org/pub/firefox/releases/latest/README.txt
На момент написания этого поста была доступна версия 46.0.1, а формат - tar.bz2 (формат вроде не менялся). Соответственно, для красоты качаем таким образом:


wget -O firefox-46-0-1.tar.bz2 "https://download.mozilla.org/?product=firefox-latest&os=linux&lang=en-US"

Теперь распаковываем в удобную для вас директорию или же, исходя из статьи в ~/32bit/ (tar xzf, а вообще, Вы уже должны уметь работать с архивами). Далее доустанавливаем 32-битные библиотеки, коих в новых версиях убунты уже нет. Поэтому (по крайней мере на Убунте 16.04), ставим так:


sudo apt-get install lib32z1

Профили в браузере создавать не обязательно, да и неудобно будет каждый раз перезапускать браузер или ещё чего (два firefox не могут быть запущены одновременно, даже если один - 32-битный, а второй - 64-битный). Далее нужна действительно Java (JRE) от Oracle, почему-то не удалось завести вебекс с openjdk и всем прилегающим (если у Вас получится - отпишитесь в комментах). Все старые версии доступны лишь с имеющимся аккаунтом в Oracle, а на данній момент существующая 8-ая версия не подходит. К счастью, ещё можно наковырять 7-ую, которая и доступна и подходит - http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html Распаковывайте самостоятельно :)
Теперь почти как в той статье создаем ссылку на плагин (у Вас может несколько отличатся, но Вы же делаете всё сознательно, не так ли?):


cd ~/32bit/firefox/plugins
ln -s ~/32bit/jdk1.7.0_80/jre/lib/i386/libnpjp2.so .

Ну и конечно же скрипт для запуска firefox:


#!/bin/bash
export ENV_HOME=~/32bit
export FIREFOX_HOME=$ENV_HOME/firefox
export MOZ_PLUGIN_PATH=$FIREFOX_HOME/plugins
export JDK_HOME=$ENV_HOME/jdk1.7.0_80
export JAVA_HOME=$JDK_HOME/jre
export PATH=$JAVA_HOME/bin:$JDK_HOME/bin:$PATH
$FIREFOX_HOME/firefox --no-remote

Как и в статье с хабра, делаем исполняемым и будем его запускать:
chmod +x ~/32bit/firefox.sh

Также, там говорится, что в Убунту 14.04 надо будет установить еще libxmu6:i386. Не знаю, как там в 14.04, но в 16.04 этого оказалось недостаточно. Запускаем из консоли firefox, далее тот webex и смотрим в консоль какие валятся ошбики от java. Скорее всего, будет жаловаться на недостающие библиотеки или файлы. Тут уж надо смотреть Вам лично, потому как не обязательно, что у всех будет одинаково. К примеру, у меня жаловался на недостающие файлы:
libgtk-3.so.0, libXtst.so
Какие же пакеты надо установить? Для этого используем команду apt-file find (кстати, apt-file возможно тоже надо установить). Итого:


apt-file find libgtk-3.so.0
libgtk-3-0: /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
libgtk-3-0: /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9
libgtk-3-0-dbg: /usr/lib/debug/usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9

а значит, надо установить libgtk-3-0:


apt-get install libgtk-3-0

И так проделайте со всеми недостающими файлами. Вроде всё - можно перезагружать браузер и пробовать. Пишите в комментах, если что-то не получается, возможно смогу чем-то помочь (но не обещаю :)) А если же нет - держитесь там, всего доброго! :)

четвер, 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 - извращение. Теоретически, этого должно хватить вам с головой, но если мало, то попробуйте ещё ЭТО и можете оставить отзыв о нём в комментариях, ибо Я ещё его не пробовал.
Счастливого кодинга!

неділя, 23 серпня 2015 р.

Делимся файлами по ftp и http

FTP

В прошлой публикации было рассказано как шарить файлы по протоколу smb, казалось бы что ещё надо? Во-первых, может быть у вас компания не купила ни одну винду, все сидят (и, надеюсь, счастливы) на линуксах, поэтому никто самбу не ставил даже. Во-вторых, протокол FTP (File Transfer Protocol) разрабатывался как раз для передачи файлов по сети, поэтому должен быть самым быстрым в этом деле. И, конечно же, он один из самых старых протоколов (википедия говорит - 1971 год), появился ещё задолго до HTTP.
В сети есть множество информации о том как стянуть или загрузить файлы по ftp, поэтому здесь рассмотрим лишь как настроить свой ftp сервер с доступом для анонимного пользователя. Возьмем один из самых простых и легковесных ftp-серверов - vsftpd (как устанавливать приложения для своего дистрибутива вы уже должны знать). Но, ещё надо сконфигурировать его. По умолчанию, корневая папка фтп сервера (по крайней мере в debian-based дистрах) - /srv/ftp, и она имеет права на запись лишь для рута, что и должно быть по мерках безопасности. Поэтому, для того, чтобы кто-то мог залить файлы, нужно создать внутри папку и назначить ей владельца ftp:ftp

$ sudo mkdir /srv/ftp/share
$ sudo chown ftp:ftp /srv/ftp/share

 Теперь осталось дать доступ анонимному пользователю (ВНИМАНИЕ: доступ и на запись), для этого в файле /etc/vsftpd.conf раскомментируем строчки, где упоминается анонимус (и, возможно, придется дописать или изменить, всяко бывает):

anonymous_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES

При этом анонимус может также изменять структуру подпапок, поэтому будьте осторожны. Для срочной единичной передачи данных на ваш компьютер такой конфиг вполне сгодится. Также такой конфиг подойдёт, если это какой-то выделенный ftp-сервер и находится внутри организации/компании, никоим образом недоступен извне и нужен лишь для быстрого обмена файлами между сотрудниками.

HTTP

Иногда бывает нужно просто поделиться файлами и не давать возможности загружать и что-либо изменять. Никсы дарят нам возможность сделать это в мгновение ока! Достаточно лишь зайдя с терминала в нужную директорию (ту, которую хотите расшарить) и ввести команду:

$ python -m SimpleHTTPServer

В данном случае сервер будет слушать "входящие" на порту 8000. Ну а если надо другой порт (к примеру 8888):

$ python -m SimpleHTTPServer 8888

Остановить сервер можно комбинацией клавиш CTRL+C. Конечно же, у вас должен быть установлен интерпретатор python, но, обычно, он уже входит в любой дистрибутив по умолчанию. Тепер, любой пользователь может зайти через браузер, введя ваш ip адрес и порт и посмотреть что там имеется, а скачать можно также и через curl или wget. Такой способ "шаринга", как видно, очень простой и позволяет легко иметь доступ к файлам изнутри виртуальной машины или контейнера (кстати, возможно, скоро больше ваших приложений будут "контейнеризированы" и сидеть где-то в облаках, нежели на вашем личном компьютере).
Делиться файлами по http протоколу можно "на постоянной основе" и на стандартном http порту 80. Для этого надо настроить httpd сервер (для debian-based - apache httpd, или ещё проще - апач, который и показан в примере). Редактируем файл /etc/apache2/apache2.conf (или /etc/httpd/httpd.conf), копипастим шаблон из стандартного пути /var/www и добавляем алиас, по которому будем доступаться к расшаренным файлам

Alias /files /var/www/files                                                    
                                                                               
<Directory /var/www/files>                                                     
     Options Indexes FollowSymLinks                                            
     AllowOverride None                                                        
     Require all granted                                                       
</Directory>

Теперь, если вы закинете файлы в директорию /var/www/files, то с браузера на вашем же компьютере она будет доступна как localhost/files. Ну а для других пользователей вместо localhost нужно подставить ip адрес вашего компьютера.
И последнее: в дистрибутивах из SELinux, а также хитро настроенными файрволами и т.д., и т.п. вам, возможно, придется ещё немного потрудиться, чтобы делиться файлами. Но награда за труды непременно ждёт вас! Удачи!

неділя, 26 квітня 2015 р.

Расшаривание каталога по сети через Samba

Наверное, все читатели этого блога знают (или хотя бы приблизительно помнят), как в винде делается доступной по сети любому пользователю любая папка. И это очень просто - ПКМ (правая кнопка мыши) по нужной папке, выбор пункта Свойства в контекстном меню, далее Доступ, выбираем Общий доступ и, возможно, некоторые дополнительные параметры. Даже гуглится это всё тоже очень просто и легко.
Для расшаривания каталогов в линуксе есть много разных способов, для доступа же к расшаренному каталогу способ фактически один - смонтировать (присоединить к файловой системе) расшаренный каталог. Монтируется всё через команду mount (постарайтесь узнать побольше информации о ней используя встроенную документацию - man mount, а не чуть что - сразу в гугл). Конечно же, не всё подходит для того, чтобы иметь возможность доступаться до папок расшаренных под Windows и наоборот - чтобы расшаренный каталог под Linux был доступен для Windows. При этом, чтобы был такой же стандартный интерфейс доступа (сетевое окружение - выбор нужной машины и нужной папки). И вот именно для такой задачи существует набор приложений Samba. Samba имеет клиент-серверную архитектуру и потому два основных приложения: samba сервер - для расшаривания, samba клиент - для доступа.
Весь нужный набор приложений для большинства задач в Ubuntu Linux устанавливается вместе с пакетом samba (всё остальное тянется по зависимостях), в Fedora Linux сервер и клиент идут отдельно. Возможно, в других дистрибутивах линукса ещё есть какие-то особенности и отличия, поэтому Вам надо будет погуглить, как установить samba на свой дистрибутив (вполне возможно, что вам надо будет лишь либо сервер, либо клиент). Тем более, что в Интернете имеется множество инструкций, а здесь Я рассматриваю лишь общие черты и подход к работе. Также существует и графическая утилита для конфигурации самба-сервера (system-config-samba), но ведь так не интересно, и поэтому всю настройку будем производить через терминал и конфигурационный файл samba.
Итак, если Вы выполнили установку, можно перейти к настройке, для этого откроем в режиме суперпользователя файл /etc/samba/smb.conf (хотя здесь отличий не встречал, всё же имеется вероятность, что в вашем дистрибутиве может быть другой путь). В конфигурационном файле имеется глобальная секция ([global]), где настраиваются общие параметры для всех расшаренных каталогов, и своя отдельная секция для каждого расшаренного каталога. Также, имеется секция для расшаривания принтера и других устройств. Опять-таки, в разных дистрибутивах (а также, в разных версиях самбы) имеются весомые различия в настройке, по крайней мере пока что. В Ubuntu Linux всё довольно просто, добавляем в конфигурационный файл например такую секцию:
[Shared_Downloads]
path = /home/sergius/Downloads
browsable =yes
writable = yes
guest ok = yes
read only = no
Все параметры имеют название, которое говорит само за себя: path - путь к расшариваемой папке; browsable - можно ли её просматривать; writable - доступна ли она для записи; guest ok - можно ли заходить не авторизированным пользователям, то есть тех, учётной записи которых нет на данном компьютере; read only - инверсия writable (оба параметра существуют возможно для того, чтобы играться с глобальной и локальной настройками, в данном случае достаточно указать один из них).
Расшаривание обычных каталогов по сути большего не требует, но здесь, как видно, расшаривается подкаталог Downloads из домашнего каталога пользователя sergius. А, как мы знаем, никакому пользователю, кроме рута, нельзя лазить по каталогах других пользователей. Поэтому, надо ещё дать права на листинг пользовательских директорий (бит прав х) и права на чтение (а также запись, если мы поставили параметр writable = yes) для всех пользователей. Команда chmod решает эти задачи:
chmod 711 /home/sergius
chmod -R 777 /home/sergius/Downloads
После всех настроек надо перезапустить демон сервера самбы и всё. На Fedora из SELinux дела обстоят куда сложнее. Тут надо и файрволл настроить, чтобы пропускал, да и политика насчёт домашних каталогов пользователей жёстче. Поэтому инструкция побольше и посложней. Самому до такого додуматься почти нереально. Итак, сначала пробуем по этой ссылке How to enable samba share Fedora 20, здесь рассказано о том, как настроить тот selinux и firewall для самбы. Конкретно же каталог расшарить можно опять-таки через конфигурационный файл:
[Downloads]
path = /home/sergius/Downloads
browseable = yes
guest ok = yes
writeable = yes
Далее так же надо дать права на домашний каталог, но... Здесь есть ещё один фокус. Ищем в файле строку security = share (в глобальной секции) и вместо неё пишем:
security = user
map to guest = Bad User
Эти две строчки означают, что любой пользователь, который не имеет учётной записи станет гостём. Ну и после всех настроек, надо перезапустить демон. Опять-таки, возможно, что в других дистрибутивах имеются свои нюансы, поэтому надо будет погуглить, если без этого у Вас что-то не работает.
Ещё хотелось бы добавить, что если хотите таки расшарить какую-то папку, видимую в Windows-домене, но при этом доступную лишь избранным, надо:

1) guest ok = no
2) добавить нужных пользователей через smbpasswd -a <user>

А если выставить имя пользователя и пароль такие же как и доменные, то на вашу шару винда должна пускать без проса пароля, а сразу, как в обычную папку.
Ну и на домашнее задание, попробуйте разобраться как подключиться к шаре через терминал с помощью smbclient и скачать какую-то папку.