пʼятницю, 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 и скачать какую-то папку.

середу, 18 лютого 2015 р.

Безопасность превыше всего!

Рано или поздно каждый (надеюсь, что каждый) пользователь ПК задумывается о безопасности своих данных, работоспособности ОС и компьютера в целом. И, конечно, же сразу вопрос - антивирус под линукс? По этому поводу в Сети множество холиваров с разными окончаниями. Так что же делать? Есть ли жизнь вирусы в мире никсов? Нужен ли антивирус?
Насколько мне удалось изучить данную тему, могу сказать, что вирусы есть, но их распространение крайне сомнительно. Во-первых, Windows более распространенная ОС по количеству пользователей, следовательно, выигрыш для создателей вирусов здесь будет больше (для создателей антивирусов тоже, может это одни и те же лица?). Во-вторых, через политику прав доступа к файлам в никсах, распространение вирусов почти невозможно, но вы всегда можете скачать и запустить какую-то зловредную программу, которая навредит лишь вам (если очень постараетсь, то навредит ещё кому-то). Итак, для успокоения души антивирус ставим. Для большинства пользователей вплоне подойдёт ClamAV, как поставить и настроить для своего дистрибутива ищите в Интернете, но это всё равно буквально 2-3 команды, так что сильно не перетрудитесь.

Куда более серьёзная проблема безопасности - это уязвимости в разных библиотеках, программах и т.п. Некоторые уязвимости позволяют даже выполнять удаленно команды на вашем компьютере. Если объяснить метафорически - это как потайная дверь, нужно лишь найти на что нажать, чтобы потайная дверь открылась. Единственное различие в том, что уязвимость создалась не преднамеренно, а случайно. И вот о ней не знают до тех пор, пока кто-то ней не воспользовался. При чём, в некоторых случаях пользование уязвимостью может быть незамеченным довольно долгое время. Уязвимости исправляются лишь разработчиками операционной системы (или конкретной программы), и обновлённая версия будет доступна в репозитории. Поэтому, надо почаще делать обновление своей системы и программ. Ну и, конечно, если вы неинтересны злоумышленникам, то никто и не будет пытаться пройти все ступени защиты вашего ПК.

Но самая страшная угроза для вашего ПК, обычно, сидит перед вашим монитором. Да, это вы, уважаемый пользователь. Одно неосторожное движение и всё пропало. Поэтому, надо всегда действовать с пониманием того, что вы делаете. В общем, инструкция подходит и для пользования ОС Windows:
1) устанавливать (хотя бы постарайтесь) программы лишь с официальных репозиториев или сайтов;
2) не лазать по недоверенным сайтам вообще;
3) не открывать ссылки из писем от неизвестного/недоверенного отправителя;
4) не сидеть всё время под рутом, пользоваться командой sudo и лишь для того, в чём вы уверены (к примеру, ваш "добрый" знакомый захотел подшутить и кинул вам "секретную команду", которая будто бы делает что-то полезное (например, скрывает ваш айпи), а вы с радостью эту команду выполнили и все ваши данные исчезли; вот такой хитрый набор символов "perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'", на самом деле, является командой rm -rf);
5) тщательно проверять ваши команды, которые что-либо удаляют/изменяют;
6) делайте периодически копии всех важных данных на какой-нибудь носитель, не подключённый к данному компьютеру.

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

суботу, 3 січня 2015 р.

RST-рендеринг в браузере

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

Итак, собственно, инструкция:
1) установить python-docutils, чтобы был доступен скрипт rst2html.py, который и производит нужную нам конвертацию;
2) выяснить, где находятся конфигурационные файлы вашей версии httpd (в большинстве случаев просто httpd или apache), на моей Fedora 20 это
/etc/httpd/conf.d/*.conf
3) добавить туда свой новый конфигурационный файл (например, /etc/httpd/conf.d/docs_rst.conf) с таким содержанием:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/ Action RSTHandler /cgi-bin/rst2html.sh AddHandler RSTHandler .rst


Как видно, здесь просто добавлен хендлер, который запустит скрипт rst2html.sh, если в строке запроса идёт обращение к файлу с расширением "rst".

4) Теперь надо добавить соответствующий файл rst2html.sh в папку /var/www/cgi-bin/ с таким содержанием:

#!/bin/sh
echo "Content-type: text/html"
echo ""
/usr/bin/rst2html /var/www/html/${REQUEST_URI}
exit 0

5) Теперь можно помещать ваши rst-документы под папку /var/www/html и доступаться к ним через браузер (в моем случае - localhost/docs/mydoc.rst).



Не забудьте перезапустить ваш httpd, дабы все настройки вступили в силу!

Таким же образом можно добавлять и другие обработчики для других типов файлов. Удачи!