Лето, жара, ноутбук давно не проходил профилактику. Вот и результат – перегрев и аварийное отключение ноутбука. Не затягивайте с чисткой, пожалейте технику. #comandante #сервис

Лето, жара, ноутбук давно не проходил профилактику. Вот и результат – перегрев и аварийное отключение ноутбука. Не затягивайте с чисткой, пожалейте технику. #comandante #сервис

Instagram filter used: Aden

View in Instagram ⇒

Теоретический минимум *nix-based-систем

Предлагаю рассмотреть три юниорских степени познания дзена управлением шайтан-машиной ака *nix-сервак на примере всеми любимой ubuntu.

1-й юниорский

Начнем с самых азов — забудьте про GUI, только консоль, только хардкор ^_^!


Несколько красивых консолей в xmonad для повышения мотивации.

Наше приключение начинаем с того, что надо добраться до консоли (в случае SSH-подключения мы там будем сразу). Кстати, если вы windows user, вам поможет волшебная программка putty.

Если же вы уже в линуксе и вы его поставили, верю, что сможете найти там консоль и как в нее попасть. Если же нет, вот мануал на примере ubuntu с самыми популярными DWM. Там же найдете описание базовых команд консоли. Рассмотрим сей список поподробнее и немного сгруппируем.

Давайте посмотрим на структуру файловой системы.

Да, не пугайтесь, привычных C: и D: тут нету, всё идет от корня (/).

/ Корневая директория, содержащая всю файловую иерархию.
/bin/ Основные системные утилиты, необходимые и в однопользовательском режиме, и при обычной работе всем пользователям (cat, ls, cp).
/boot/ Загрузочные файлы (в том числе, файлы загрузчика, ядро и т. д.). Часто выносится в отдельный раздел.
/dev/ Основные файлы устройств системы (например, физические устройства: sata-винчестеры /dev/sda, видеокамеры или TV-тюнеры /dev/video или псевдоустройства, например, «черные дыры» /dev/null, /dev/zero).
/etc/ Общесистемные конфигурационные файлы и файлы конфигурации установленных программ (имя происходит от et cetera).
/home/ Содержит домашние директории пользователей, которые, в свою очередь, содержат персональные настройки и данные пользователя. Часто размещается на отдельном разделе.
/lib/ Основные библиотеки, необходимые для работы программ из /bin/ и /sbin/.
/media/ Точки монтирования для сменных носителей (CD-ROM, DVD-ROM, flash-диски).
/opt/ Дополнительное ПО.
/proc/ Виртуальная файловая система, представляющая состояние ядра операционной системы и запущенных процессов в виде каталогов файлов.
/root/ Домашняя директория пользователя root.
/sbin/ Основные системные программы для администрирования и настройки системы, например, init, iptables, ifconfig.
/tmp/ Временные файлы (см. также /var/tmp).
/usr/ Вторичная иерархия для данных пользователя; содержит большинство пользовательских приложений и утилит, используемых в многопользовательском режиме. Может быть смонтирована по сети только для чтения и быть общей для нескольких машин.
/var/ Изменяемые файлы: файлы регистрации (log-файлы), временные почтовые файлы, файлы спулеров.
/var/cache/ Данные кэша приложений. Сюда скачиваются пакеты перед установкой в систему, здесь же они какое-то время хранятся.
/var/lib/ Информация о состоянии. Постоянные данные, изменяемые программами в процессе работы (базы данных, метаданные пакетного менеджера и т. п.).
/var/log/ Различные файлы регистрации (log-файлы).
/var/www/ Директория веб-сервера Apache, всё, что находится внутри, транслируется им в интернет (конфигурация по умолчанию)

Теперь мы узнали, как выглядит файловая система *nix.

Потом рекомендую узнать, как перемещаться в пространстве (cdwww.linfo.org/cd.html), создавать файлы (touchwww.linfo.org/touch.html) редактировать и удалять тоже (понять шутку про sudo rm -rf / — настойчиво рекомендую загуглить тем, кто не в курсе), познакомиться, как работает консольный текстовый редактор (например, Nano) — да-да, не надо пугать новичков Vim и Emacs. Еще есть симпатичный вариант mcedit.


Nano


MCEdit

Чип и Дейл спешат на помощь! В любой непонятной ситуации вводите man %commandName%, и восхитительная утилита man в *nix-системах вам расскажет как работает та или иная команда (программа) в bash.
Если вы потерялись в файловой системе, поможет команда pwd.

Теперь давайте обозначим еще некоторые особенности этого семейства OS.

*nix-системы отличаются регистрозависимостью т. е. file.txt и File.txt — разные файлы. И директории /uploads и /Uploads — тоже разные директории.

Еще несколько важных отличий:

  • Разные слеши Win — Backslash “\”; *nix — Slash “/”

  • Символы переноса строки Win — “\r\n — CRLF”; *nix — “\n — CR”; mac — “\r — LF” статья по теме: en.wikipedia.org/wiki/Newline

В PHP-разработке для ликвидации этих проблем кроссплатформености рекомендуется использовать PHP_EOL для новой строки в консоли и DIRECTORY_SEPARATOR для правильных слешей.

В контексте обсуждения файловой системы и фич linux давайте рассмотрим интересную фичу — симлинки (symlinks). Если объяснить по-простому — это ярлыки, как в всем известной windows, только тут ярлык может быть и на другой сервер, и на директорию, и на файл. Отличие от ярлыков в windows в том, что тут ярлыки используют не только на рабочем столе, а во всей файловой системе. По поводу этого есть хорошая статья на вики en.wikipedia.org/wiki/Symbolic_link и немного синтаксиса с вики debian вдогонку: wiki.debian.org/SymLink.

Почему многие developer-ы любят *nix-системы? Да потому что они стандартизированы системой стандарта POSIX, что их все роднит и помогает спокойно мигрировать из одной стандартизированной OS в другую (и разработчику, и юзеру. Тема раскрыта тут: en.wikipedia.org/wiki/POSIX.

Продолжаем знакомство.

Основное отличие *nix-систем — их многопользовательский подход. Из этого следует логический вывод: если есть много пользователей, надо разграничивать их сферы влияния. Один из основных инструментов для этого — права к файлам и директориям.

Обозначения прав идут в буквенном или цифровом формате.

Увидеть права мы можем через команды lsl или lsla, а поменять — через chmod.


Нашел потрясающую картинку, которая объясняет всю суть происходящего.

Добавлю, что в жизни веб-разработчика всегда нужно помнить о правах в linux, поскольку имеет место обыденная ситуация: разрабатывали под windows, задеплоили и внезапно (!) ничего не работает. В целом ничего страшного в них нету, но keep in mind.

P. S. Советую хорошо разобраться в этом моменте, поскольку ставить 777 на весь проект тоже не очень секьюрно.

Для пользователей системы существует режим стандартных правил для создаваемых ими файлов — umask. От него зависит, с какими правами будут создаваться файлы этого пользователя по умолчанию.
Почитать здесь: ru.wikipedia.org/wiki/Umask.

Я вскользь упомянул о наличии пользователей и групп в *nix-системах, но еще есть административный пользователь — root.
Root-юзер помогает вам делать многое: инсталлить софт, маунтить (https://help.ubuntu.com/community/Mount) разделы, разруливать права на файлы и папки где вашего обычного юзера не хватает, и т. п.

Для этого есть волшебная команда sudo. Более подробно предлагаю ознакомиться здесь: help.ubuntu.ru/wiki/.

Под рутом надо быть очень аккуратными. Особенно на лайв-серверах. Особенно удаляя что-то через консоль.

Раз уж мы вспомнили о лайв-серверах, у них бывает такое свойство — заканчивается память.

Сначала проверяем, что у нас с ОЗУ, для этого подойдет top/htop.

Давайте также вспомним замечательную тулзу — ps. Она выводит отчет о работающих процессах. Удобна еще и несколькими триками:

  • Удобно пользоваться конвейером и утилитой less для пролистывания выводимой информации с помощью кнопок «вверх» и «вниз», например, ps aux | less.
  • С помощью утилиты grep удобно искать и выводить только нужные процессы, например, ps aux | grep node.

Для проверки, сколько свободного места у нас на харде, есть команды: df -h и df –k.

Если проблема в ОЗУ, смотрим, что у нас потребляет больше, чем надо, и делаем kill, или же, если это нужные процессы, — думаем дальше :).

Если же заканчиваются ресурсы харда и нечего удалить, на помощь приходят архиваторы. Основной архиватор в мире linux — tar. Вот небольшой гайд по сабжу, которого в повседневной жизни вам должно хватить с головой: help.ubuntu.ru/wiki/tar.

Стоит добавить, что в консоли есть варианты работы с несколькими программами одновременно — утилита GNU Screen: help.ubuntu.ru/wiki/screen.

В целом на этом можно и закончить первую степень посвящения, но обрадую немного тех, кто очень боится консоли: есть консольный 2-панельный классический файловый менеджер — Midnight commander.

Продолжим рубрикой «Что делать не надо» :).

  1. Не знаешь, зачем оно и как работает — не удаляй!
  2. Увидел файл или папку, которые начинаются с точечки — тем более не удаляй ^_^!

Это dotfiles — спрятанные файлы, просто по ls их не видно, можно увидеть через ls –la. Зачастую это системные файлы или файлы программ (иногда — настройки). И тут тоже вики хорошо раскрывает тему: en.wikipedia.org/wiki/Hidden_file_and_hidden_directory.

2-й юниорский

Первый юниорский нам поможет сделать что-то, но для повседневных задач web-developer’а этого мало, так что давайте пойдем дальше осваивать уровень, которого нам хватит для резолва ежедневных задач.

Первое, о чём надо упомянуть на этом уровне — пакетный менеджер aptitude (разбираем на примере ubuntu, да и в целом debian-based systems).
С его помощью можем устанавливать и удалять программы в й системе, подробнее рекомендую почитать, как говорится, на сайте производителя: help.ubuntu.ru/wiki/apt.

Следующая повседневная задача — установка lamp (linux apache php mysql)-сервера.

Вы не поверите, но после установки сервера на Windows в Ubuntu это делать просто и приятно, буквально в несколько команд: help.ubuntu.com/community/ApacheMySQLPHP

Конечно же, нам пригодятся Virtual Hosts. Файл хостов находится по адресу /etc/hosts, а хосты надо редактировать под рутом.

Пришло время упомянуть базовые команды Apache.

Включаем модули в apache, в том числе, модуль PHP (если ставим руками) — a2enmod %moduleName%.
Рестарт сервера — sudo service apache2 restart.

Вернемся к хостам. В apache, да и в nginx система хостов не очень сложная, но, как показывает практика, лучше рассказать, чтобы не видеть потом огромные и ужасные httpd.conf/nginx.conf.

Хосты, которые настроены и существуют (но не факт, что включены!) лежат отдельными файликами в папке /etc/apache2/sites-available. А хосты, которые используются и активны в данный момент, лежат симлинками в папке /etc/apache2/sites-enabled.

In real life выглядит все так: мы создаем файл конфига для нового хоста в sites-available, потом командой a2ensite %hostName% apache создает симлинк в папке sites-enabled, тем самым активируя хост. Обратная процедура — a2dissite.

Когда вы делаете это руками или просто пишете в файл основнового конфига, где-то плачет один котик, ну, или собачка — кому кого больше жаль :).

Ещё распространенная задача — поднять https. Хороший мануал здесь:
help.ubuntu.ru/wiki/apache_%D0%B8_https.


Картинка, обьясняющая суть того, зачем нам https.

Если вас всё ещё терзает вопрос зачем эта вся секьюрность, советую почитать на тему секьюрности для разработчиков хороший мануал: www.owasp.org/index.php/PHP_Security_Cheat_Sheet — тут на примере PHP, но многое актуально для всех Web разработчиков.

Также при работе с lamp старайтесь закрывать использование exec (выполнение команд в консоли OS через php) www.php.net/manual/ru/function.exec.php.

На уровне php это потенциальный пробел в вашей защите.

Добавлю часто встречающуюся задачу — закрытие сервера для незалогиненных пользователей методами веб-сервера, как на этом скрине.

Сделать так очень просто через htpasswd, вот пример: doc.norang.ca/apache-basic-auth.html.

Пришло время упомянуть о базах данных. В нашем юниорском забеге будем рассматривать MySql. В целом по вопросам Database Administration написано очень много книг и очень многое появляется с опытом, но некоторые базовые вещи просто необходимы.

how to mysql server restart?

Первое — конфиг живет по адресу /etc/mysql/my.cnf, заходить в гости, как обычно, под рутом.

Перезапустить «моську» можно командой sudo service mysql restart.

Если вы что-то не то сделали с правами своего рута или просто потеряли пароль рута от mysql, сбросить его и задать новый можно командой sudo dpkg-reconfigure mysql-server-5.5 (или 5.6), в общем, подставите нужную версию :).

Перейдем к следующему животрепещущему вопросу в жизни веб-девелопера:

Хоббит SQL-дампы — туда и обратно на dedicated servers
Для бекапа базы в sql-файл используется прекрасная команда mysqldump со следующим синтаксисом:

mysqldump —opt -u [uname] -p[pass] [dbname] > [backupfile.sql]
[uname] Имя юзера
[pass] Пароль (Будьте внимательны между параметром p и паролем нет пробела)
[dbname] Название нашей базы
[backupfile.sql] Как мы называем файл дампа (можно так же указать путь к нему если вы не в той папке где хотите создать его)
[–opt] Дополнительные опции
Пример: mysqldump -u root -p Tutorials > tut_backup.sql

  • add-drop-table — добавляет в дамп DROP TABLE перед CREATE TABLE.
  • no-data — дампит только таблицы без контента.
  • add-locks — добавляет LOCK TABLES и UNLOCK TABLES в дамп.

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

mysqldump -u [uname] -p[pass] [dbname] | gzip -9 > [backupfile.sql.gz]

Теперь давайте разберем накатку базы (условие: базы не существует, накатка с нуля).
Основной синтаксис будет такой:

mysql -u [uname] -p[pass] [db_to_restore] < [backupfile.sql]

Следуя нашему примеру, получаем что-то в духе:
mysql -u root -p Tutorials < tut_backup.sql

А если мы таки запаковались в архив, будет так:

gunzip < [backupfile.sql.gz] | mysql -u [uname] -p[pass] [dbname]

Если накатываем базу не с нуля, а она уже создана, есть другая команда:

mysqlimport -u [uname] -p[pass] [dbname] [backupfile.sql]

С архивом по аналогии.

Эту прекрасную шпаргалку по дампам взял отсюда: webcheatsheet.com/sql/mysql_backup_restore.php на good data centre

Следующий важный момент в MySQL — права Grants. «Моська» у нас многопользовательская, если есть много пользователей, значит, права свои у них будут — life is cruel :). Советую о них почитать. Самая распространенная задача — открыть юзеру вход не с локалхоста Она решается следующим образом:

Удаляем строку bind-address 127.0.0.1 из главного конфига.
Потом выполняем следующие команды:

~# mysql -u root mysql -p
mysql> GRANT ALL PRIVILEGES ON database.* TO username@»%» IDENTIFIED BY ‘password’ WITH GRANT OPTION;
mysql> exit;
~# mysqladmin -u root -p flush-privileges

Здесь database — база данных, к которой назначаем права пользователю username с паролем password, а % указывает на то, что пользователь может прийти не только с локалхоста, а откуда угодно.

Эти команды на респекте собрал отсюда: saradmin.ru/?p=792.

Node JS мы также можем установить в две команды “sudo apt-get install nodejs” “sudo apt-get install npm”.
Node-проекты заводить обычно легко, что-то в духе node server.js
Хочу поделиться интересной тулзой nodemon — она дает нам намного больше возможностей в области девелопмента на nodeJS, т. к. следит за изменениями в файлах проекта и перезапускает сервер автоматически:
nodemon.io/

Далее рекомендую ознакомиться с работой в консоли самых популярных в мире web development VCS — git и svn. Мануалов по ним очень много разных и хороших, думаю, подберете на свой вкус ;).

По теме VCS может понадобится мануал по генерации SSH-ключей для Git: help.github.com/articles/generating-ssh-keys.
Поделюсь интересным триком: если вам нужен live-вывод изменяющихся файлов в консоль (зачастую логи) — используйте команду tail –f, например, (tail -f /var/log/apache2/error.log).

3-й юниорский

Вот мы и подобрались к 3-му юниорскому! Довольно неплохой уровень, после которого уже идет хардкор, но тут еще ничего страшного тоже нет, всё достаточно интересно и весело.

Начинается опыт реального подъема серверов с фулстеком (lamp + ftp(s) + ssh) по ситуации, с прикруткой CI-систем, также интересен опыт подъёма хостинг-систем типа Virtualmin / WebMin.
В реальной эксплуатации не рекомендуется оставлять чистый ftp-сервер, лучше использовать SFTP (ftp over ssh) для секьюрности.


help.ubuntu.ru/wiki/webmin

Интересен опыт с nginx вместо apache — отличный мануал можно найти тут: help.ubuntu.ru/wiki/nginx-phpfpm.
Также дополню хорошей онлайн-тулзой которая трансформирует rewrite-правила из apache в формат nginx: winginx.com/ru/htaccess.

Еще на этом уровне не нужно бояться BASH-скриптинга и знать, что такое sed и grep. Основы рекомендую почитать тут:
help.ubuntu.com/community/Beginners/BashScripting

Хороший левел — знание vim или emacs. Очень холиварная тема, но не упомянуть нельзя.

Если временами вы очень скучаете по некоторым программам из windows, или у вас есть специфичный софт, который все-таки нужен и аналог никак не можете найти (что же такое страшное вам нужно?!), есть wine — wine is not an emulator.


IE В Ubuntu («работает» еще веселее, чем в нативной среде обитания).

Это действительно не эмулятор windows, а набор библиотек, чтобы заводить виндовые програмы под никсами. Есть база данных, какие программы и даже игры поддерживает wine — appdb.winehq.org/.

Давайте затронем сетевую тему, первым в гостем нашей студии станет netstat (network statistics), встречайте! Тулза поможет нам посмотреть статистику сетевой активности, открытые порты, наши сетевые интерфейсы и т. д.

Базовая информация:
en.wikipedia.org/wiki/Netstat

Примеры использования: putty.org.ru/articles/netstat-linux-examples.html.
Спасибо, netstat.
Следующий наш гость — Iptables, встречайте!
IPtables — стандартный интерфейс управления работой брандмауэра.
Базовая информация: en.wikipedia.org/wiki/Iptables
Спасибо, Iptables!

И в заключение сетевой темы давайте позовем нашего хедлайнера — nmap. Поприветсвуем гостя nmap!

Очень известная утилита в области сетевой безопасности, видеть ее мы могли в десятках фильмов ;).


nmap.org/movies/

Базовая информация: en.wikipedia.org/wiki/Nmap#Bibliography.
Примеры использования: habrahabr.ru/post/88064/.

Спасибо nmap за столь увлекательную историю и счастливое детство.

Предлагаю перейти на немного advanced level MySQL-тюнинга — PIMP MY DB.

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

DB Tuning можно условно разделить на две части:

Оптимизация структуры базы данных (нормализация/денормализация, foreign keys, indexes и т. д.).
Оптимизация настроек сервера DB.
Про оптимизацию структуры базы данных написано немало гайдов и мануалов, и серебряной пули тут не существует. Всегда смотрим на конкретный проект и индивидуальные проблемы. Explain в помощь :).

Советую почитать:

ruhighload.com/post/ ruhighload.com/index.php/2009/07/28/ habrahabr.ru/post/108418/
В вопросе тюнинга и оптимизации настроек DB очень преуспела компания Percona — MySQL-форк. Рекомендую познакомиться с ними поближе.
Из базового набора для тюнинга у них есть тулкит и визард настройки вашего сервера.

www.percona.com/software/percona-toolkit
tools.percona.com/wizard

Также известная тулза — mysqltuner (http://mysqltuner.com/).
Для тестирования нагрузки на MySQL есть интересная тулза sysbench. Почитать про нее можно тут: ruhighload.com/index.php/2010/03/05/sysbench-testiruem-proizvoditelnost-mysql/.

Добавим в наше приключение немного стильных, модных и молодежных технологий — CI.

Wiki: Непрерывная интеграция (англ. Continuous Integration) — практика разработки ПО, которая заключается в выполнении частых автоматизированных сборок проекта для скорейшего выявления и решения интеграционных проблем.

На практике это очень удобный софт, позволяющий собирать билды, прогонять все виды тестов, делать минификацию js/css, следить за качеством кода, деплоить, итп.

Самые популярные — Jenkins, Travis, TeamCity.

en.wikipedia.org/wiki/Jenkins_(software)
en.wikipedia.org/wiki/Travis_CI
ru.wikipedia.org/wiki/TeamCity

P. S. Клевая тулза Guake —выезжающая консолько в стиле quake.

Цельнотянуто с Хабра

Удобное удаленное управление консолью linux из-под Windows

Итак, друзья, некоторое подмножество нас (людей) так или иначе испытавает необходимость удаленного управления компьютером (как правило, сервера) на linux (способ может сработать и в BSD, и в Mac OS X, но я не пробовал) при помощи ssh. Другое подмножество использует Windows в качестве ОС на основной рабочей машине. К пересечению этих подмножеств обращена моя статья.

UPD:У меня часто спрашивают, зачем же всё, описанное в статье, надо.
Всё просто:
1. Сохранение подключения при обрыве связи. Этот пункт для меня самый важный и сыграл решающую роль в том, чтобы взяться за настройку такой системы. Дело в том, что я живу в общежитии с очень-очень нестабильным интернетом, и обрывы связи у меня (в плохие дни) могут происходить поминутно. А putty требует последовательности действий, чтобы переподключиться каждый раз
2. Сохранение сессии. Зачастую, единственной задачей при подключении к серверу стоит: зайти в одну и ту же директорию и написать git pull. Чтобы каждый раз не вспоминать путь к этой директории, нужно сохранение сессии
3. Терминал поддерживает вкладки. Самое главное, что данный терминал можно использовать также и для cmd, и для PS, и для git bash консоли. Поэтому, не придется держать несколько разных терминалов открытыми.
4. Плюсы tmux: многооконность в одной сессии и split
Не спорю, часть из этого можно решить другими средствами
Как же получить комфортный remote access к bash из-под Windows?

image

Рецепт успеха будет включать несколько пунктов:

  1. Терминал — ConEmu code.google.com/p/conemu-maximus5;
  2. Менеджер сессий — tmux tmux.sourceforge.net;
  3. Коннектор между клиентом и сервером — mosh mosh.mit.edu;
  4. Запуск *nix приложений под windows — cygwin www.cygwin.com;

Так же для проведения всех манипуляций нам также понадобится подобный набор софта:

  1. Putty или другой ssh клиент;
  2. Удаленный сервер (я использую ubuntu на aws, хотя это не имеет существенного значения).

 

Что мы получим в итоге?

В итоге мы получим терминал с возможностью доступа к удаленной консоли. При обрыве соединения (обрыве интернета, смене ip-адреса, изменении маршрутизации, неустойчивом соединении, засыпании ноутбука etc) не придется переподключаться, а при переподключении не будет теряться контекст работы.

Теперь поехали подробно.

Конфигурация

Настраивать нашу систему мы будем поэтапно, начнем с удаленного сервера. Подключаемся к нему по ssh и ставим…

tmux

Tmux — менеджер сессий, как говорится, screen на стероидах. К моему дистрибутиву tmux уже шел в комплекте, а если нет, то ставим его:

sudo apt-get install tmux

Или же собираем из исходников:

git clone git://git.code.sf.net/p/tmux/tmux-code tmux
cd tmux
sh autogen.sh
./configure && make

 

В конфиг, который находится в ~/.tmux.conf, добавляем следующее:

new-session
set-window-option -g mode-mouse on
set -g history-limit 25000

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

mosh

Mosh в нашей связке — это система, которая обеспечивает бесперебойность соединения. При обрыве соединения программа ждет, пока connectivity восстановится и продолжает работу с места остановки. Так же помогает и при медленном/нестабильном соединении.

Устанавливаем из исходников, чтобы получить версию, которая поддерживает все нужные фичи:

git clone https://github.com/keithw/mosh.git
cd mosh/
sudo apt-get build-dep mosh
./autogen.sh && ./configure && make
sudo make install

Специальная конфигурация не требуется.

Cygwin

Теперь переходим к клиентской части.

Cygwin — альтернативная реализация linux api, которая позволяет использовать linux утилиты из-под windows. Ставится с официального сайта (https://cygwin.com/install.html). У меня стоит версия x86_64. Скачиваем, ставим.
При выборе пакетов (помимо основных) нужно отметить mosh и ssh:

image

Конфигурация не требуется.

ConEmu

Последний пункт — ConEmu. Замечательный терминал под windows. Поддерживает кучу возможностей, таких как:

  1. вкладки и split-scren’ы;
  2. работа с консольными приложениями, использующими консольное API;
  3. гибкая настройка и управление;
  4. работа с цветами;
  5. … и многое другое, подробно про этот терминал можно почитать в статье разработчика.

ConEmu ставится с официального сайта. Скачиваем, ставим (или распаковываем), запускаем. При первом запуске оставляем галочки стоять на местах. Открываем настройки по Win+Alt+P. Нас интересует пункт Tasks.

Вот как выглядит задача запуска cygwin:

image

Создайте такой пункт у себя, при этом, вам, возможно, придется заменить путь на ваш путь установки:

C:\cool\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico -

Сохраняем, закрываем настройки, выбираем наш cygwin в выпадающем меню рядом с плюсиком в правом верхнем углу.
Теперь нам нужно добиться подключения по ssh к нашему серверу.

У меня команда выглядит так:

ssh -i key2014.pem -p 22

key2014.pem — мой ssh приватный ключ доступа к инстансу в aws. Возможно, его стоит скопировать с диска windows (который монтируется в /cygdrive) в корневую папку.

Следующий этап — подключение через Mosh:

mosh <username>@<hostname> --ssh=\"ssh -i key2014.pem -p 22\" -p 55505 -- tmux a

55505 — UDP порт, который я предварительно открыл для входящих соединений в правилах безопасности в админке aws. Теперь все соединения будут вестись только через него (помимо начального установления связи — оно идёт через 22 порт).
tmux a — команда, которая выполняется при подключении к серверу (attach к работающей сессии tmux).
Проверяем. Работает? Великолепно! Последняя задача — создать новый Task в ConEmu.

image

Конкретно:

C:\cool\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico /bin/bash -l -c "mosh <username>@<hostname> --ssh=\"ssh -i key2014.pem -p 22\" -p 55505 -- tmux a"

Думаю, всё понятно. Обратите внимание на слеши перед кавычками. Они отличают степень вложенности кавычек.

Ну вот, пожалуй и всё. Теперь, когда мы хотим подключиться к серверу, запускаем ConEmu, тыкаем по стрелочке рядом с плюсиком и выбираем наш Task.

Дополнение

Еще одно упрощение, которое я использую — я добавил все необходимые мне Task’и для вызова напрямую из Totcmd:

image

Обычная cmd:

image

Подключение к aws:

image

P. S.
Предлагаю всем, дочитавшим эту статью, высказывать предложения, что еще такого можно включить в эту схему. Спасибо за внимание.

P. P. S.
Данная статья является компиляцией других статей, взятых из разных мест и собственных наработок.

Linux Mint 17 и DLNA

Linux Mint — отличная домашняя ОС. Богатый выбор графических сред на любой вкус, простая и понятная даже новичку установка, сразу после установки имеем основной набор необходимого софта, удобный менеджер приложений, основные мультимедийные кодеки. В общем, отличная система для перехода и ознакомления с Linux.

image

Но возникает проблема для тех, у кого нет дома NAS или чего-то подобного, а смотреть контент с ПК на других устройствах, поддерживающих DLNA хочется. Под Linux существует множество различных DLNA-серверов, но оптимальным, все же, является MiniDLNA. И тому есть несколько причин. Во-первых, это типичный Unix-way: этот сервер является именно DLNA-сервером, а не комбайном с кучей свистелок, при этом контент без проблем воспринимается на любом устройстве. Даже телевизоры Samsung со своим AllShare прекрасно подключаются к нему. Также можно отметить и замечательную скорость работы и нетребовательность к ресурсам этого сервера.

И все бы было хорошо, но вот в с помощью команды

sudo apt-get install minidlna

установить его не получится — нет его в репозитарии.

Существуют разные варианты устранения этого недоразумения, но самый правильный путь — установка из исходников.
Чтобы не отвратить возможных новоиспеченных линуксоидов с этого пути и, возможно, помочь кому-то, напишу как обойти подводные камни, ибо информации много, но в начале пути людям нужно попроще.

Подготовка

Если будете выполнять команды в консоли, запущенной с правами root, команду sudo писать не нужно.

Для начала нужно установить необходимые библиотеки:

Обновляемся:

sudo apt-get update

И устанавливаем сами библиотеки:

sudo apt-get install libavcodec-dev libavformat-dev libavutil-dev libflac-dev libvorbis-dev libogg-dev libid3tag0-dev libexif-dev libjpeg-dev libsqlite3-dev

Самая свежая версия MiniDLNA на данный момент — 1.1.3, ее можно скачать здесь, либо загрузить из консоли:

wget --trust-server-names http://sourceforge.net/projects/minidlna/files/latest/download

ключ перед адресом нужен, чтобы сохранилось оригинальное имя, с выхдом новой версии имя файла будет отличатся. После этого архив нужно распаковать:

tar -xf minidlna-1.1.3.tar.gz

Теперь перейдем в распакованную папку с исходниками

cd minidlna-1.1.3

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

Для отключения запроса способа отображения файлов нужно в папке с исходниками (minidlna-1.1.3, мы в нее уже должны были перейти) подправить файл upnpsoap.c, но сначала сделаем его резервную копию:

sudo cp upnpsoap.c upnpsoap.c.old

и откроем в редакторе

sudo nano upnpsoap.c

поиском (F6), ищем процедуру:

"BrowseContentDirectory"static void
BrowseContentDirectory(struct upnphttp * h, const char * action)
{

В начале процедуры выполняется разбор SOAP/XML-запроса, затем его обработка и возврат результата. Разбор запроса завершается формированием отладочного сообщения:

DPRINTF(E_DEBUG, L_HTTP, "Browsing ContentDirectory:\n"
             " * ObjectID: %s\n"
             " * Count: %d\n"
             " * StartingIndex: %d\n"
             " * BrowseFlag: %s\n"
             " * Filter: %s\n"
             " * SortCriteria: %s\n",
            ObjectID, RequestedCount, StartingIndex,
            BrowseFlag, Filter, SortCriteria);

Далее реализован выбор корневого контейнера в зависимости от конфигурационного параметра root_container:

    // Если запрошен корневой контейнер
    if( strcmp(ObjectID, "0") == 0 )
    {
        // Выставляем флаг корневого контейнера
        args.flags |= FLAG_ROOT_CONTAINER;
        // Если в конфиге задан корневой контейнер
        if( runtime_vars.root_container )
        {
            // Если клиентом является аудио плейер и в конфиге задан обзор папок
            // Отправляем его в папку с музыкой
            if( (args.flags & FLAG_AUDIO_ONLY) && (strcmp(runtime_vars.root_container, BROWSEDIR_ID) == 0) )
                ObjectID = MUSIC_DIR_ID;
            else // Иначе выставляем контейнер, заданный в конфиге
                ObjectID = runtime_vars.root_container;
        }
        else // Если контейнер в конфиге не задан
        {
            // Если клиентом является аудио плейер
            // Отправляем его в папку с музыкой
            if( args.flags & FLAG_AUDIO_ONLY )
                ObjectID = MUSIC_ID;
        }
    }

Сразу после этого блока и перед блоком с запросами к БД добавляем код перенаправления папок для видео, музыки и изображений:

    //Redirect video to folder
    if( strcmp(ObjectID, VIDEO_ID) == 0 )
    {
        ObjectID = VIDEO_DIR_ID;
    }

    //Redirect music to folder
    if( strcmp(ObjectID, MUSIC_ID) == 0 )
    {
        ObjectID = MUSIC_DIR_ID;
    }

    //Redirect images to folder
    if( strcmp(ObjectID, IMAGE_ID) == 0 )
    {
        ObjectID = IMAGE_DIR_ID;
    }

В итоге правленный фрагмент должен выглядеть следующим образом:

        if( strcmp(ObjectID, "0") == 0 )
        {
                args.flags |= FLAG_ROOT_CONTAINER;
                if( runtime_vars.root_container )
                {
                        if( (args.flags & FLAG_AUDIO_ONLY) && (strcmp(runtime_vars.root_containe$
                                ObjectID = MUSIC_DIR_ID;
                        else
                                ObjectID = runtime_vars.root_container;
                }
                else
                {
                        if( args.flags & FLAG_AUDIO_ONLY )
                                ObjectID = MUSIC_ID;
                }
        }

        //Redirect video to folder
        if( strcmp(ObjectID, VIDEO_ID) == 0 )
        {
                ObjectID = VIDEO_DIR_ID;
        }

        //Redirect music to folder
        if( strcmp(ObjectID, MUSIC_ID) == 0 )
        {
                ObjectID = MUSIC_DIR_ID;
        }

        //Redirect images to folder
        if( strcmp(ObjectID, IMAGE_ID) == 0 )
        {
                ObjectID = IMAGE_DIR_ID;
        }

        if( strcmp(BrowseFlag+6, "Metadata") == 0 )
        {
                args.requested = 1;
                sql = sqlite3_mprintf("SELECT %s, " COLUMNS
                                      "from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID$
                                      " where OBJECT_ID = '%q';",
                                      (args.flags & FLAG_ROOT_CONTAINER) ? "0, -1" : "o.OBJECT_I$
                                      ObjectID);
                ret = sqlite3_exec(db, sql, callback, (void *) &args, &zErrMsg);
                totalMatches = args.returned;
        }

Чтобы упростить процедуру последующего обновления, сохраним патч с внесенными изменениями:

diff -u upnpsoap.c.old upnpsoap.c > ../minidlna-folders.patch

Теперь вместо редактирования файла, достаточно применить патч:

cd ~/src/minidlna/minidlna-НоваяВерсия
patch < ../minidlna-folders.patch

Теперь можно переходить к конфигурированию.

Если вам это не нужно, переходите сразу к конфигурированию:

./configure

И компилируем:

make
Установка

1) Для тех, кто в дальнейшем захочет обновить версию, предыдущую можно удалить (конфигурационные файлы при этом сохраняются), если этого не сделать, то в случае, если в новой версии состав установочных файлов изменится, в /usr/local могут остаться старые файлы, при первой установке — переходим сразу к пункту 2.

Для удаления заходим в папку с предыдущей установкой и выполняем команду:

sudo apt-get remove minidlna

2) Запускаем установку (в комментариях предложили более правильный путь, чем make install):

sudo checkinstall -D

Ключ -D указывает, что должен быть создан Debian-пакет

3)Если мы производим первоначальную установку, нужно создать init-скрипт:

sudo nano /etc/init.d/minidlna

, если мы обновляем версию, больше ничего делать не нужно, при первоначальной установке у нас откроется пустой файл, в который нужно внести следующий код:

Листинг

#!/bin/sh
#
# MiniDLNA initscript
#
# Based on the mediatomb debian package.
# Original authors: Tor Krill <tor@excito.com>
#                   Leonhard Wimmer <leo@mediatomb.cc>
#                   Andres Mejia <mcitadel@gmail.com>
#
# Modified by: Benoit Knecht <benoit.knecht@fsfe.org>
#
### BEGIN INIT INFO
# Provides:          minidlna
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop::    $network $local_fs $remote_fs
# Should-Start:      $all
# Should-Stop:       $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start minidlna at boot time
# Description:       Manage the minidlna daemon, a DLNA/UPnP-AV media server.
### END INIT INFO

unset USER

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="DLNA/UPnP-AV media server"
NAME=minidlnad
DAEMON=/usr/local/sbin/minidlnad
PIDDIR=/run/$NAME
PIDFILE=$PIDDIR/$NAME.pid
SCRIPTNAME=/etc/init.d/minidlna
DEFAULT=/etc/default/minidlna

# Exit if the package is not installed
[ -x $DAEMON ] || exit 0

# Read configuration variable file if it is present
[ -r $DEFAULT ] && . $DEFAULT

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# Do not start the daemon if NO_START is enabled in DEFAULT
if [ "$START_DAEMON" != "yes" ] && [ "$1" != "stop" ]; then
        log_warning_msg "$NAME: Not starting $DESC."
        log_warning_msg "$NAME: Disabled in $DEFAULT."
        exit 0
fi

# Set the default configuration file
if [ -z $CONFIGFILE ]; then
        CONFIGFILE=/etc/minidlna.conf
fi

# Set the default log file
if [ -z $LOGFILE ]; then
        LOGFILE=/var/log/minidlna.log
fi

# Run as `minidlna' if USER is not specified or is `root'
if [ -z $USER ]; then
        USER=minidlna
fi

# If no group is specified, use USER
if [ -z $GROUP ]; then
        GROUP=$USER
fi

DAEMON_ARGS="-f $CONFIGFILE -P $PIDFILE $DAEMON_OPTS"

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        touch $LOGFILE && chown $USER:$GROUP $LOGFILE || return 2
        if [ ! -d $PIDDIR ]; then
            mkdir $PIDDIR || return 2
        fi
        chown $USER:$GROUP $PIDDIR || return 2

        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --chuid $USER:$GROUP --exec $DAEMON --test > /dev/null \
                || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --chuid $USER:$GROUP --exec $DAEMON -- \
                $DAEMON_ARGS \
                || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -rf $PIDDIR
        return "$RETVAL"
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
    do_start
    case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
  ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
       status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                if [ "$1" = "force-reload" ]; then
                        # Rescan the collection
                        DAEMON_ARGS="$DAEMON_ARGS -R"
                fi
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
        exit 3
        ;;
esac

:

, сохранить комбинацией клавиш Ctrl+O и выйти из редактора — Ctrl+X.

4) После этого даем права на запуск скрипта:

sudo chmod 755 /etc/init.d/minidlna

5) И активируем запуск init-скрипта:

sudo update-rc.d minidlna defaults

6) Так как по умолчанию служба запускается под пользователем minidlna, нам нужно создать соответствующую учетную запись:

sudo adduser --system --home /var/lib/minidlna --group --gecos "MiniDLNA server" minidlna

7) Правим файл конфигурации сервера:

sudo nano /etc/minidlna.conf

В нем нам нужно следующее содержимое (здесь подправлен интервал, с которым сервер себя анонсирует, так как не все телевизоры опрашивают сервер, также вам надо прописать путь к папке с медиа, к примеру так: «media_dir=V,/mnt/sdb6/Video/Alex/» в соответствующем разделе файла):

Листинг minidlna.conf

# Порт сервера
port=8200

# Привязка к сетевому интерфейсу
# Можно задать несколько интерфейсов
# в формате network_interface=eth0,eth1
#network_interface=eth0

# Имя пользователя или UID, под которым будет работать служба
# Добавлен в версии 1.1.0
# В Debian задается в параметрах init-скрипта
#user=jmaggard

# Путь к папке с медиа-файлами
# Для сканирования нескольких папок, укажите несколько параметров media_dir
# Чтобы сканировать файлы определенного типа, укажите соответствующий префикс:
#   A - аудио: media_dir=A,/home/jmaggard/Music
#   V - видео: media_dir=V,/home/jmaggard/Videos
#   P - изображения: media_dir=P,/home/jmaggard/Pictures
# Начиная с версии 1.1.0, можно задать несколько типов:
#   PV - изображения и видео: media_dir=AV,/var/lib/minidlna/digital_camera
#
# При изменении параметра, потребуется повторное сканирование файлов.
# Необходимо выполнить команду "service minidlna force-reload" от имени root.
# Начиная с версии 1.1.0, при изменении параметра, сканирование выполняется автоматически.
media_dir=/var/lib/minidlna

# Имя DLNA-сервера, отображаемое клиентом
# По умолчанию: "$HOSTNAME:$USER"
#friendly_name=

# Путь к папке для хранения базы данных и кэша обложек альбомов
db_dir=/var/lib/minidlna

# Путь к папке с лог-файлами
log_dir=/var/log

# Уровень детальности лога
# В формате log_level=источник1,источник2=значение1,источник3,источник4=значение2 ...
# Доступные источники: "general", "artwork", "database", "inotify", "scanner", "metadata", "http", "ssdp", "tivo"
# Возможные значения: "off", "fatal", "error", "warn", "info" or "debug"
#log_level=general,artwork,database,inotify,scanner,metadata,info,ssdp,tivo=warn

# Перечень имен файлов-обложек альбомов, разделитель: "/"
album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg

# Автообнаружение новых файлов
# Включено по умолчанию
inotify=yes

# Поддержка устройств TiVo
#enable_tivo=no

# Строго следовать DLNA-стандарту
# Использовать серверное масштабирование для очень больших JPEG-изображений
# Что может снизить скорость их обработки.
#strict_dlna=no

# Адрес веб-страницы устройства
# По умолчанию IP-адрес и заданный порт сервера
#presentation_url=http://www.mylan/index.php

# Интервал отправки SSDP-уведомлений, в секундах
notify_interval=30

# Серийный номер и номер модели DLNA-сервера, сообщаемый клиенту
serial=12345678
model_number=1

# Путь к сокету MiniSSDPd, если установлен
# Требуется для обеспечения работы нескольких DLNA/UPnP служб на одном сервере
#minissdpdsocket=/run/minissdpd.sock

# Контейнер, используемый в качестве корневой папки для клиентов
#   * "." - стандартный контейнер
#   * "B" - "Обзор папки"
#   * "M" - "Музыка"
#   * "V" - "Видео"
#   * "P" - "Изображения"
# Если задано "B" и клиент представится как аудиоплеер, в качестве корня будет использована папка "Music/Folders"
#root_container=.

# Всегда использовать заданный критерий сортировки, вместо значения, запрошенного клиентом
#force_sort_criteria=+upnp:class,+upnp:originalTrackNumber,+dc:title

# Максимальное число одновременных подключений
# Учтите: многие клиенты открывают несколько подключений одновременно
#max_connections=50

8)Затем проверяем параметры init-скрипта /etc/default/minidlna:

sudo nano /etc/default/minidlna

Обычно корректировка не требуется. Если файл отсутствует, при первичной установке из исходников, копируем листинг:

# Запускать демон, если задано "yes"
START_DAEMON="yes"

# Путь к файлу конфигурации
#CONFIGFILE="/etc/minidlna.conf"

# Путь к лог-файлу
#LOGFILE="/var/log/minidlna.log"

# Запуск от имени заданного пользователя и группы
# По умолчанию: minidlna
#USER="minidlna"
#GROUP="minidlna"

# Дополнительные ключи запуска
DAEMON_OPTS=""

Обычно после этого не требуется дополнительных настроек, но если есть проблемы с доступом к медиа (или хотите перестраховаться), можно настроить права доступа:

Настройка прав доступа:

Поскольку служба работает под пользователем с ограниченными правами, публикуемые папки и файлы должны быть доступны на чтение для всех пользователей, следовательно, иметь разрешения 644: «rw- r– r–», для файлов и 755: «rwx r-x r-x», для папок.Проверяем доступность для каждой папки, заданной в minidlna.conf, командой:

sudo -u minidlna ls -l папка

Если папка недоступна, задаем права доступа:

sudo chmod -R 755 папка

Вышестоящие папки также должны быть доступны на чтение всем пользователям. Проверяем доступность на чтение каждой папки, указанной в пути. Для вышестоящих папок используем chmod без ключа -R, если не требуется сброс разрешений для всех дочерних файлов и папок.
В качестве альтернативы смене разрешений, можно запустить MiniDLNA от имени пользователя или группы-владельца файлов. Для этого необходимо задать параметры USER и GROUP в /etc/default/minidlna, и сменить владельца папки /var/lib/minidlna командой:

sudo chown -R пользователь:группа /var/lib/minidlna
Запуск сервера

Запускаем:

sudo service minidlna force-reload

Проверяем, работает ли служба, также смотрим параметры запуска:

ps ax | grep minidlna

Проверяем, слушается ли порт:

sudo ss -4lnp | grep minidlna

Проверяем лог:

cat /var/log/minidlna.log

В случае успешного старта, лог должен быть примерно следующим:

Gothician gothician # cat /var/log/minidlna.log
[2014/07/27 10:05:31] minidlna.c:1014: warn: Starting MiniDLNA version 1.1.3.
[2014/07/27 10:05:31] minidlna.c:355: warn: Creating new database at /var/lib/minidlna/files.db
[2014/07/27 10:05:31] minidlna.c:1053: warn: HTTP listening on port 8200
[2014/07/27 10:05:31] scanner.c:706: warn: Scanning /var/lib/minidlna
[2014/07/27 10:05:31] scanner.c:793: warn: Scanning /var/lib/minidlna finished (0 files)!
[2014/07/27 10:05:31] playlist.c:125: warn: Parsing playlists...
[2014/07/27 10:05:31] playlist.c:259: warn: Finished parsing playlists.
[2014/08/03 09:25:35] minidlna.c:1053: warn: HTTP listening on port 8200

Если видим: «WARNING: Inotify max_user_watches [8192] is low.», необходимо увеличить число дескрипторов слежения inotify до 100 000. Для этого в файл /etc/sysctl.conf добавим строки:

#MiniDLNA warning fix
fs.inotify.max_user_watches = 100000

Вручную редактором:

sudo nano /etc/sysctl.conf

Или копипастом команды:

sudo sh -c 'printf "\n\n#MiniDLNA warning fix\nfs.inotify.max_user_watches = 100000\n" >> /etc/sysctl.conf && cat /etc/sysctl.conf'

Изменение параметра вступит в силу после перезагрузки системы.
Открываем в браузере адрес.сервера:8200, видим количество файлов в библиотеке, начиная с версии 1.1.2, также отображается список подключенных клиентов.

Настройка DLNA/UPnP-AV сервера завершена.

При появлении ошибок в каталоге, необходимо выполнить повторное сканирование файлов.
При использовании приведенного выше init-скрипта, для запуска сканирования медиа-библиотеки используем команду:

sudo service minidlna force-reload

Служба при этом будет перезапущена, подключенные клиенты будут отключены.

Для сканирования медиа-библиотеки при каждом старте системы можно задать ключ запуска: “-R” в параметре DAEMON_OPTS в файле /etc/default/minidlna. Сканирование большой медиа-библиотеки существенно нагружает диск, что может замедлить загрузку системы.

Полное формирование каталога может занять несколько минут. Сканирование папок выполняется в порядке их объявления в конфиге. Файлы из небольших папок, объявленных в конфиге выше, появятся в каталоге в самом начале процесса сканирования. Крупные папки с редко воспроизводимым контентом имеет смысл размещать в конфиге последними.

По материалам http://itadept.ru/, wiki.archlinux.org.

Проекты на WordPress: советы по оптимизации

Сегодня WordPress является одной из самых популярных CMS. Задуманная изначально как движок для блогов, сегодня она используется для самых разных типов сайтов, в частности, для новостных порталов и интернет-СМИ. На Wordpress работают корпоративные веб-сайты, образовательные и развлекательные порталы.
Во всех примерах используется Ubuntu 12.04.

Настраиваем СУБД

Выбор СУБД

Как известно, для работы WordPress необходима СУБД MySQL. В последнее время широкое распространение получили альтернативные реализации (форки) этой СУБД, наиболее популярными из которых являются Percona Server и MariaDB. Во многих инструкциях по установке, опубликованных в Интернете, рекомендуется использовать MariaDB.

Мы же рекомендуем использовать Percona Server, так как этот форк по сравнению со стандартным MySQL является более производительным и стабильным. Кроме того, Percona обладает более широкими возможностями для сбора системной статистики.

Чтобы установить Percona на сервер, нужно сначала импортировать ключи:

$ apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A

Затем нужно добавить в файл /etc/apt/sources.list следующие репозитории:

deb http://repo.percona.com/apt precise main
deb-src http://repo.percona.com/apt precise main

И выполнить команду:

$ sudo apt-get update

После этого можно устанавливать percona-server при помощи стандартного менеджера пакетов:

$ sudo apt-get install percona-server-server percona-server-client

 

Выбираем движок: MyISAM или InnoDB?

Самыми популярными движками в MySQL-базах являются MyISAM и InnoDB. Если движок выбран неправильно, то возникают проблемы с производительностью и консистентностью.

Рассмотрим особенности этих движков более подробно.

MyISAM показывает хорошие результаты на выборках SELECT, что во многом обусловлено отсутствием поддержки транзакций и внешних ключей. Однако при модификации и добавлении записей вся таблица на время блокируется, что при большой загрузке может стать причиной серьезных задержек.

Несомненными преимуществами этого движка являются также полнотекстовый поиск и компрессия. Формат данных в MyISAM — кроссплатформенный, что позволяет без проблем переносить данные с одного сервера на другой путем простого копирования бинарных файлов (таблиц) баз данных.

InnoDB используется в современных версиях MySQL как движок по умолчанию.
В отличии от MyISAM InnoDB поддерживает транзакции и внешние ключи. В Percona Server используется собственный движок — XtraDB, полностью совместимый с InnoDB. Данные в InnoDB/XtraDB кэшируются. Когда большая часть данных считывается из кэша, производительность InnoDB/XtraDB в разы выше, чем у MyISAM.

Статей, посвященных сравнению MyISAM с InnoDB/XtraDB, а также MySQL c его форками, опубликовано немало (см., в частности, тест производительности здесь). Мы не будем вдаваться в теоретические подробности и ограничимся практическим советом: MyISAM нужно выбирать только в случаях, когда нужен полнотекстовый поиск. Со всеми остальными задачами прекрасно справятся InnoDB/XtraDB. Кстати, в MySQL/Percona Server 5.6+ полнотекстовый поиск для InnoDB уже поддерживается.

Оптимизация конфигурации СУБД

По мере развития сайта количество данных в БД будет расти, и возникнет необходимость изменений настроек базы данных. Чтобы обеспечить оптимальную работу сайта, желательно регулярно проверять, насколько оптимально настроена действующая конфигурация MySQL. Такую проверку проще всего осуществлять с помощью специальных скриптов, самым известным и популярным из которых является mysqltuner.pl. Его можно скачать при помощи следующих команд:

$ wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
$ chmod +x ./mysqltuner.pl
$ ./mysqltuner.pl

Этот скрипт собирает статистику MySQL и выдает рекомендации по улучшению существующих настроек.

Настраиваем веб-сервер

 

Параметры Apache

Настройки apache хранятся в файле /etc/apache2/apache2.conf

В конфигурационном файле Apache имеется такой параметр, как max_clients — максимальное количество процессов, запускаемых для параллельной обработки клиентских запросов. На первый взгляд может показаться, что для этого параметра нужно устанавливать максимальное значение. В реальной практике, однако, все бывает по-другому.

Допустим, один процесс Apache может потребить 20 Мб оперативной памяти. Если для параметра max_clients выставлено значение 200, то при пиковой нагрузке под все процессы потребуется 200×20 Мб = 4Гб памяти — и это только под Apache! В результате нехватки памяти даже самые простые запросы будут выполняться крайне медленно. И программное обеспечение на сервере может перестать работать.

Поэтому слишком большое значение параметра max_clients выставлять не желательно. Если количество запросов превысит установленное значение, то все эти запросы будут поставлены в очередь и обработаны, как только освободятся занятые процессы.

В целях повышения производительности рекомендуется также отключить keepalive-соединения, исправив соответствующую строку в конфигурационном файле:

KeepAlive off 

 

Backend+Frontend = Apache +Nginx

Любой более или менее высоконагруженный веб-проект должен иметь многоуровневую архитектуру (об этом мы уже писали). Для большинства проектов на базе WordPress вполне подойдет двухуровневая архитектура Backend — Frontend. Мы рекомендуем использовать следующую связку: в качестве бэкенда Apache, в качестве фронтенда — Nginx.

Впрочем, возможен и другой вариант — php-fpm в качестве бэкенда, а в качестве фронтенда — все тот же Nginx (см. инструкции по настройке, например, здесь и здесь). Во многих публикациях утверждается, что связка php-fpm+Nginx работает быстрее или потребляет намного меньше памяти. С этими утверждением, однако, вряд ли можно однозначно согласиться.

К тестам, опубликованным в Интернете, нужно относиться со здоровой долей скептицизма: нередко php-fpm+Nginx показывает лучшие результаты лишь потому, что Apache не был настроен должным образом (см., например, отчет о тестировании и его критический разбор; см. также любопытную дискуссию здесь). На основании собственного опыта можем сказать, что для большинства проектов на Wordpress комбинация Apache+Nginx вполне подойдет. Выбор решения должен основываться не только и столько на приросте производительности, сколько на специфке решаемых задач и соображениях технологического удобства. А Apache, на наш взгляд, отличается большей гибкостью конфигурирования. Он может использоваться и как отдельный веб-сервер, и как бэкенд для Nginx, и как фронтенд для php-fpm.

Общая схема работы выглядит так: Nginx принимает запросы от пользователей, которые затем либо передает Apache, либо обрабатывает самостоятельно. Apache будут передаваться запросы, связанные с обработкой динамического контента — например, php-скриптов. Nginx самостоятельно обрабатывает запросы на отдачу статики — например, графики, JS, CSS, текстовых файлов, XML-файлов.

Apache обработав запрос и передав содержимое Nginx, отключается и переходе к обработке других запросов. Благодаря этому работа существенно ускоряется (что немаловажно, например, при медленном интернет-подключении).

Кроме того, раздачу динамических запросов можно ускорить с помощью сервера Memcached (см., например, инструкцию по установке и настройке здесь).

Обеспечиваем безопасность

Для расширения функциональности WordPress используются многочисленные плагины. В этих плагинах постоянно обнаруживаются различные уязвимости, и из-за этого некоторые системные администраторы относятся к ней несколько предвзято. Сайты на базе WordPress действительно часто становятся мишенью для атак, но со временем разработчики совершенствуют плагины, устраняя существующие бреши безопасности. Ниже мы дадим еще несколько советов по настройке WordPress, с помощью которых можно сделать сайт менее уязвимым.

Защититесь от вредоносных программ и уязвимостей в скриптах на сервере, на котором установлен WordPress. Мы рекомендуем использовать сканер ClamAV+Maldet. С инструкцией по установке и настройке AV можно ознакомиться здесь. Для поиска уязвимостей можно также воспользоваться программой WPScan.

Измените префикс таблиц в базе данных. По умолчанию в базе данных WordPress установлен префикс «wp_». Это упрощает использование уязвимостей с MySQL-инъекцией: если известно имя таблицы, в нее гораздо проще вставить вредоносный код, изменить в ней информацию или вообще удалить. В новых версиях WordPress появилась возможность выбора префикса при установке.

Если вы используете раннюю версию WordPress, то изменить префикс можно с помощью специализированных плагинов. Наиболее известным и популярным является Prefix Changer. Следует, однако, учесть, что многие из этих плагинов не всегда работают корректно, поэтому перед их использованием рекомендуется сохранить резервную копию базы данных.

Переместите файл wp-config.php. В файле wp-config.php хранятся важные параметры настройки WordPress, которую желательно защитить от несанкционированного доступа. По умолчанию этот файл сохраняется в корневом каталоге, но его можно переместить на каталог выше. Не обнаружив файла wp-config.php в корневом каталоге, WordPress будет искать его автоматически.

Получите SSL-сертификат и включите SSL-шифрование. Для этого в файл wp-config нужно добавить следующие строки:

/* Enable SSL Encryption */
define(‘FORCE_SSL_LOGIN’, true);
define(‘FORCE_SSL_ADMIN’, true);

Удалите информацию о версии WordPress. Если злоумышленник узнает, что вы используете устаревшую версию WordPress, то он может воспользоваться имеющимися уязвимостями и взломать ваш сайт. Поэтому информацию о версии лучше удалить.

Во-первых, нужно удалить файл: ваш_сайт/readme.html, из которого можно без труда узнать, какую версию WordPress вы используете.

Об используемой версии можно также узнать из файла header.php, который находится в папке с темой. Он содержит следующую строку:

<meta name="generator" content="WordPress " />

Можно удалить всю эту строку целиком. Если в файле header.php вашей темы оформления нет такой строки, то, скорее всего она вставляется автоматически WordPress’ом при вызове функции wp_head(). В таком случае удалить информацию о версии из секцииможно, добавив в файл functions.php следующий код:

remove_action(’wp_head’, ’wp_generator’);
function selectel_remove_version() {
return ’’;
}
add_filter(’the_generator’, ’selectel_remove_version’);

Измените ключи безопасности. В упомянутом выше файле wp-config.php есть раздел с ключами безопасности. Выглядит он так:

define(’AUTH_KEY’, ’’);
define(’SECURE_AUTH_KEY’, ’’);
define(’LOGGED_IN_KEY’, ’’);
define(’NONCE_KEY’, ’’);

Ключи используются для хэширования паролей. Очень часто на этот раздел не обращают внимания даже опытные пользователи. Между тем изменить ключи безопасности довольно просто: достаточно зайти на страницу https://api.wordpress.org/secret-key/1.1 и скопировать сгенерированные ключи в файл wp-config.php. Эту процедуру достаточно осуществить всего один раз во время первичной настройки сайта.

Ограничьте доступ к папкам wp-content и wp-includes. Из соображений безопасности рекомендуется закрыть доступ к содержимому папок wp-content и wp-includes. Нужно закрыть доступ к любым файлам, кроме графики, JS и СSS. Для этого нужно в каждой папке создать файл .htaccess и поместить в него такой код:

Order Allow,Deny
Deny from all
Allow from all

Создайте пустой файл wp-content/plugins/index.html. Благодаря этому станет недоступной информация о том, какие плагины вы используете. В плагинах WordPress могут содержаться уязвимости, и этим могут воспользоваться злоумышленники.

Чтобы сделать листинг недоступным, можно также добавить в файл .htaccess, хранящийся в папке с плагинами, следующую строку:

Options -Indexes

 

Ограничьте доступ к папке wp-admin.

Чтобы ограничить доступ, нужно в этой папке создать файл .htaccess и поместить в него следующий код:

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName «Access Control»
AuthType Basic
order deny,allow
deny from all
# указываем, например. IP-адрес домашнего компьютера
allow from 
# здесь указываем адрес один или несколько IP-адресов, с которых мы будем писать в блог на работе
allow from 
allow from 

Ограничивать доступ определенным набором IP-адресов не всегда удобно. Можно настроить доступ к папке wp-admin только по паролю. Для этого нужно создать файл .htauth:

$ htpasswd -c /home/yourdirectory/.htauth

И поместить его на один уровень выше директории /public_html/
Затем нужно создать в папке wp-admin файл .htaccess и поместить в него следующий код:

AuthName «Admins Only»
AuthUserFile /home/yourdirectory/.htauth
AuthGroupFile /dev/null
AuthType basic
require user <имя пользователя>

 

Заключение

Настройка даже такой простой и интуитивно понятной CMS, как WordPress — дело довольно непростое и содержащее большое количество нюансов, на которые не всегда обращают внимание даже опытные пользователи.
Тянуто с Хабра

Правила хорошего тона или Мобильный этикет.

Non telephoneМобильный телефон сегодня есть у каждого. Это возможность быть на связи, в любое время, куда бы Вы не направились. Но факт обладания трубкой, не учит своих обожаемых владельцев «хорошим манерам». А между тем, соблюдение определенных правил поведения при пользованиисотовым телефоном это проявление вежливости и взаимного уважения.  Каждому знакома ситуация, когда находящиеся рядом мучают окружающих своими разговорами по телефону или же ваш собственный «мобильник» звонит в самый неподходящий момент. Немногим известно, что существуют правила этикета  и для мобильной связи. Вот о них и пойдет сегодня речь.

1. Согласно правилам хорошего тона в общественных местах, например – библиотека, выставка, театр, кинозал,ресторан или кафе,музей,а также работа (да, да!!!! это тоже общественное место) ваш телефон должен вести себя тихо. А это значит – отключенный звук набора клавиш и виброзвонок.И никаких телефонных разговоров!!! Совсем!!! Да, вообще совсем никаких. Обычно при входе в такое место или началом какого-либо сеанса обычно делается объявление с просьбой перевести телефон в беззвучный режим. Так же могут быть вывешены общепринятые знаки с перечеркнутой телефонной трубкой.Однако использование сотовой связи может создать дискомфорт окружающим не только там где это обозначено. Например, считается неприличным разговаривать в общественном транспорте. Это вполне понятно, ведь громко разговаривающий пассажир, пытающийся перекричать шум двигателя явно будет лишь раздражающим фактором. Для того, чтобы избежать этого, достаточно дождаться своей остановки. Во всех перечисленных ситуациях нужно перевести свой телефон в беззвучный режим, а в случае необходимости такого разговора в данный момент, извиниться перед собеседниками и выйти в другое помещение, где вы спокойно сможете поговорить по телефону. Если возможности выйти нет, так как вы например на улице, отойти от людей на минимум 5 метров. Вы можете поднять трубку в переполненном помещении, но начинать разговор со звонящим следует только после выхода из людного места. Я считаю, что лучше принять звонок до выхода, чем заставлять окружающих слушать мелодию вызова. t5GctMEXJeaVDSUmqVdVTQ-article

2. Следует выключать мобильный телефон в тех местах, где вы встречаете уведомление «Пожалуйста, выключите Ваш мобильный телефон», а также в самолетах и медицинских учреждениях.

3. Не стоит использовать в качестве звонка на вызов или в режиме ожидания то, что может оскорбить других людей, как окружающих, так и звонящих вам. Это касается нецензурной лексики, различных грубых и резких выражений.Да и прежде чем ставить на режим ожидания какую либо мелодию, хорошо подумайте как она будет звучать в разных ситуациях. Например если вам позвонит ваш директор. Или потенциальный партнер по бизнесу. Однажды звоня приличной женщине, бальзаковского возраста, с хорошей должностью,
услышала “Владимирский централ” Двусмысленно….А представьте звонок шефа…а там великолепное исполнение Масяни…с общеизвестным посылом…аха…его самого….директора.

4. Не стоит использовать чужие мобильные телефоны в своих целях, читать с них сообщения и сообщать номера третьим лицам без разрешения их владельцев. Разумеется, данное правило распространяется даже на самых близких друг другу людей: мать не может копаться в телефоне сына, муж – в телефоне жены и т.п.

5. Нежелательно звонить человеку по рабочим вопросам на личный мобильный телефон в его свободное время, а именно до начала и после завершения официального рабочего дня, а также на выходные и праздники. На личные звонки также существуют ограничения с 9 утра до 22 вечера. Если все же необходимо нарушить эти правила и позвонить, но только если повод для звонка действительно очень важный и совершенно не может ждать, извинитесь за беспокойство и спросите о возможности говорить с вами именно сейчас. Не забывайте учитывать разницу во времени,если звоните в другую страну или далёкий город.

5401657-00046. Большинство современных моделей телефонов помнят номера, с которых им был сделан вызов, и сообщают своим владельцам о пропущенных звонках. Если вам не ответили немедленно, не нужно звонить пока у вас или у вашего абонента сядет батарея, либо до тех пор пока вам не ответят — наберитесь терпения и подождите, когда вам смогут перезвонить. Например как-то, будучи у врача, после приема я обнаружила 47 непринятых вызовов. От одного человека. За 20 минут. Причина настойчивости? Очень проста – узнать на работе ли я уже. Аха…в собственный выходной день. С утра пораньше. Только вас и жду. А теперь представьте что было бы, если бы звук был включен?Лежа на кресле стоматолога или например, гинеколога, не очень то поскачешь за телефоном(((  В том случае если Вам не перезвонили, спустя 2 часа, мобильный этикет позволяет совершить повторную попытку дозвониться.

70238631ffd7abd1952aa36b81c3868a7.Ваш телефон оснащен фото и видео камерой? Запомните – снимать других людей, без их согласия, это дурной тон. Более того, за подобную любовь к фотографии могут и привлечь к суду. Или просто начистить физиономию.

8.Слушать музыку, используя мобильные динамики в общественном месте очень неприлично. Если уж очень хочется, используйте наушники.

9.Хвастаться крутостью своего телефона может только ребенок до тринадцати лет. Взрослого и воспитанного человека такое поведение не достойно. Телефон в первую очередь, средство коммуникации, а не статуса. Так, что держать его на виду и демонстрировать каждому, не стоит.

10.Записывайте в телефонную книгу абонентов только под именами и фамилиями. Не стоит использовать клички или прозвища. Это может обидеть.

11.Не стоит постоянно использовать гарнитуру. Это должно быть уместно. Кстати, разговаривающий сам с собой человек, идущий по улице, странно смотрится, не правда ли?

12.Когда Вы находитесimagesь за рулём автомобиля, разговаривать по мобильному телефону можете только посредством гарнитуры. Но и этого лучше избегать. Ни в коем случае не берите мобильный телефон в руки во время движения,в лучшем случае вы заплатите штраф, в худшем – могут пострадать люди.

13.Согласно правилам хорошего тона, не стоит класть сотовый телефон на стол в ресторане или кафе.

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

15.Разговаривая по мобильному телефону лучше улыбаться.Говорить стоит внятно и достаточно громко, чтобы на другом конце никто не мучился, разбирая ваши слова.Не стоит закатывать скандал – эмоции это не телефонный разговор.Не стоит тратить своё и чужое время на пустую и бессмысленную болтовню.Особенно если это деловой разговор.

Основное правило этикета мобильной связи, можно выразить так – будь взаимно вежлив с окружающими.
Это к тому же еще и создаст хорошее впечатление о Вас и улучшит оценку окружающих.
“Относись к окружающим так, как ты хочешь, чтобы они относились к тебе”

Годовщина Чернобыля. 28 лет.

 

чернобыльПрошло 28 лет с момента катастрофы на Чернобыльской АЭС, последствия

которой специалисты со всего мира устраняют до сих пор. Миллионы

людей, участвовавшие в ликвидации аварии, рискуя своими жизнями,

делали все возможное, чтобы снизить уровень радиационного заражения.

На 25 апреля 1986 года была запланирована остановка 4-го энергоблока

Чернобыльской АЭС для очередного планово-предупредительного ремонта.

Во время этой остановки должны были пройти очередные испытания и

мощность реактора постепенно снижали. Катастрофа произошла в 1:23 по

местному времени. Прогремел мощнейший взрыв и 4-й энергоблок был

полностью разрушен. колесо

В описаниях действий той ночи и причин аварии до сих пор очень мало

абсолютных фактов. Есть и нажатие кнопки аварийной защиты А3-5

(правда, не выяснено до конца, до взрыва её нажали или после),

версия землетрясения, приведшего ко взрыву, версия шаровой молнии…

Так или иначе, очевидно, что в первые часы после катастрофы истинных

масштабов произошедшего не оценил никто.

В эти первые дни происходило беспрецедентное утаивание информации:

тогда как СМИ Европы сообщали о катастрофе и внимательно следили за

движением воздушных потоков, несших смертельное заражение, на

Украине и в Белоруссии вовсю готовились, а потом и встречали

Первомай…

въездДень 26 апреля 1986 года  навсегда стал чёрной датой в истории

России, Украины и Белоруссии. Вышедший из-под контроля человека

мирный атом на 4-м блоке Чернобыльской АЭС показал всему миру, каких

бед он может натворить. И натворил. За короткое время радиационный

пепел выпал на обширные территории. Последствия трагедии в Чернобыле

затронули судьбы миллионов людей. Только в нашей стране пострадало

16 регионов. Более 59 тысяч квадратных километров территории

Российской Федерации были загрязнены радиоактивными веществами. В

ликвидации последствий атомной стихии приняли участие 200 тысяч

россиян. Многие из тех, кто в 1986-1990 годы вёл жестокий бой с

вышедшей из-за контроля радиацией, выполняя свой гражданский или

воинский долг, не думали об опасности. Ценой здоровья, а иногда и

жизни они спасли мир от более страшных последствий катастрофы. Их по

праву называют героями Чернобыля. Они и сегодня на переднем крае,

продолжают жить, работать, растить детей. отель

До сих пор в загрязненных радиацией регионах Украины, Белоруссии и

России проживают 5 млн человек. По данным Союза “Чернобыль” России,

на апрель 2014 года около 9 тысяч только российских ликвидаторов

аварии умерли, свыше 55 тысяч стали инвалидами.

“Чернобыль” поставил немало вопросов российским атомщикам, главным

из которых стала безопасность. Все последующие годы в отрасли были

практически полностью пересмотрены устаревшие технологические

решения и разработаны системы, которые, по словам специалистов,

полностью исключают возможность подобной аварии.кукла

“Сама промышленность очень сильно изменилась после Чернобыля. На

всех блоках АЭС была проведена огромная программа по модернизации с

большим финансированием. Она включала более современные системы

безопасности, более современное топливо и лучшее регулирование”, –

рассказал член-корреспондент РАН, директор Института проблем

безопасного развития атомной энергетики.

“В течение 28-ми лет вся мировая и российская энергетика работала

для того, чтобы избежать аварии, подобной Чернобылю. Произошла

модернизация всех станций. Сегодня атомная энергетика – это

великолепные технологии, – отметил президент НИЦ “Курчатовский

институт” Евгений Велихов. – В угольной и газовой промышленности

происходят взрывы, выбросы и химическое загрязнение. Согласно

статистике, именно в атомной энергетике погибло меньше всего людей.

Надо научиться делать атом безопасным так, чтобы это никак не

задевало благополучие граждан”.машины

Много воды утекло с тех пор…Сама страна в которой произошла

катастрофа уже прекратила свое существование…
В дни, когда весь мир склоняет головы перед памятью жертв катастрофы

на Чернобыльской АЭС, выражаю искреннее соболезнование родным и

близким погибших, а также хочу пожелать здоровья и успехов всем

ликвидаторам-чернобыльцам, их родным и близким.