Отказ от соцсетей

Павел Дуров разродился призывом откааться от социальных сетей. Если вы еще не видели, то я процитирую его:

Друзья в социальных сетях – явление из 2010 года. Все, кто нужен, давно в мессенджерах. Поддерживать устаревающие списки друзей в публичных сетях бессмысленно и долго. Читать чьи-то новости – засорение мозга.

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

Говорят, что лучшее – враг хорошего. Но верно и то, что хорошее – враг лучшего. Единственная преграда на пути к лучшему – это цепляние за то хорошее, что уже есть.

В принципе, я с ним согласен и сам давно отказался от большинства социалок. Только вот Twitter и Instagram остались. Ну и еще LinkedIn, в качестве "профессионального лица". :)

Все остальное - это какой-то шлак, который льется в мозг и от этого ему становится только хуже. Все эти новости "друзей", "вам понравится" и "возможно вы пропустили" мне не надо лет 300. Все что мне необходимо я получаю из RSS и Twitter (подписан на тех, кто мен интересен в профессиональном плане). Для общения есть мессенджеры и FIDONet (да, я ретроград и олдфаг).


How To: 16 практических примеров команды ls

Команда ls применяется для просмотра списка файлов в каталоге. Хотя, если вы используете Unix-like систему, то вы это уже знаете не хуже меня.

Но все ли вы знаете об этой прекрасной команде? Может быть вы используете ее не до конца?

1. Показать все файлы в каталоге

Классический вариант команды ls - это:

ls -a

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

2. Скрыть служебные каталоги '.' и '..'

ls -A

3. Отображение файлов и каталого в обратном порядке

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

ls -r

4. Сортируем файлы по расширению

Это тоже можно легко сделать:

ls -X

Читать далее...

Автотесты для образов docker

Docker сильно удобная штука для упаковки и доставки кода на сервера. Тестирование кода - задача рутинная и уже давно легко автоматизируемая.

А что на счет готовых образов docker? Мы же пишем Dockerfile, в котором есть определенные инструкции по установке пакетов, открытых портов и т.п. Это такой же код, как и само наше приложение внутри доккера. Его тоже стоит покрывать тестами и для этого тоже есть инструменты.

Goss

Goss - это инструмент, основанный на YAML, для тестирования конфигурации серверов. Он облегчает процесс написания тестов, позволяя пользователю создавать тесты из текущего состояния системы.

Пример goss.yml из документации:

port:
  tcp:22:
    listening: true
    ip:
    - 0.0.0.0
  tcp6:22:
    listening: true
    ip:
    - '::'
service:
  sshd:
    enabled: true
    running: true
user:
  sshd:
    exists: true
    uid: 74
    gid: 74
    groups:
    - sshd
    home: /var/empty/sshd
    shell: /sbin/nologin
group:
  sshd:
    exists: true
    gid: 74
process:
  sshd:
    running: true

Описывать тут особо нечего, все просто и понятно. Для доккера есть dgoss враппер, который позволяет писать такие тесты для доккера.

Интегрировать такие тесты в CI/CD процесс не сложно и весьма полезно.


Улучшаем Gnome Shell (Gnome 3)

В связи с тем, что Canonical отказалась от развития Unity и фактически выбросила всех его приверженцев за борт, пришлось искать альтернативы. KDE когда-то я использовал достаточно плотно. Хорошо в памяти сидит его тормознутость и имено поэтому он был отвергнут на самом начальном этапе.

До Unity в Ubuntu использовалась оболочка Gnome, правда, версии 2. Потому и решил посмотреть, что же нового в Gnome3 нам приготовили разработчики. Т.к. ноут давно просился переустановить систему с нуля, то я и ставил сразу Gnome Ubuntu, но можно было сделать и вот так:

$ sudo apt install ubuntu-gnome-desktop

После этого нужно выйти из системы, выбрать сеанс Gnome и войти. Ничего сложного.

В принципе, оболочка вышла достаточно удобной, но некоторые моменты несколько непривычны. Это все очень легко исправляется расширениями для Gnome.

Pixel Saver

Расширение, которое объединяет заголовок окна с верхней панелью, как в Ubuntu. Это очень удобно и экономит место на ноутбуках.

Установить Pixel Saver

No Topleft Hot Corner

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

Нажатие на клавишу 'Win' для активации этого меню остается и вы не будете ограничены в доступе. :)

Установить No Topleft Hot Corner

Top Icons

Трей с иконками приложений в Gnome находится не на привычном месте, а реализован как слацдер в левом нижнем углу. Если он открыт постоянно, то немного мешает. Если же его скрыть (такая возможность есть штатно), то не видно уведомлений. Странное немного решение, которое можно исправить с помощью Top Icons

Trash

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

Установить Trash

Panel OSD

Расширение, которое позволяет настроить, в каком месте экрана будут показываться уведомления.

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

Gnome 3 меня пока радует. :)


Gnome3 и suspend при закрытии крышки ноутбука

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

Установка прошла как по маслу и все вроде бы шло не плохо, пока я не закрыл крышку ноута и не оказалось, что ноутбук не переходит в состояние сна. Просто продолжал работать как и раньше. Открываешь - вот оно все. Даже пароль не просит.

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

В файл /etc/acpi/events/lidbtn пишем эти строки:

# /etc/acpi/events/lidbtn

event=button[ /]lid
action=/etc/acpi/lid.sh

Теперь сам скрипт, который будет блокировать рабочий стол и отправлять машинку в suspend - /etc/acpi/lid.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/bash

RUNTIME=`grep -l DISPLAY /run/systemd/users/* | xargs grep RUNTIME | awk -F= '{print $2}'`
USERNAME=`grep -l DISPLAY /run/systemd/users/* | xargs grep NAME | awk -F= '{print $2}'`
DISPLAY=`grep -l DISPLAY /run/systemd/users/* | xargs grep DISPLAY | awk -F= '{print $2}'`

export XAUTHORITY=${RUNTIME}/gdm/Xauthority
export DISPLAY=:${DISPLAY}
export `cat ${RUNTIME}/dbus-session`

grep -q closed /proc/acpi/button/lid/*/state

if [ $? == 0 ]; then
  su ${USERNAME} -c 'gnome-screensaver-command -l'
  /usr/sbin/pm-suspend >> /tmp/lid.log
fi

Не забудьте поставить пакет с утилитами:

apt install pm-utils

Перезагружаем acpid и проверяем:

/etc/init.d/acpid restart

Как правильно удалить пользователя MySQL/MariaDB

ВНИМАНИЕ: Сделайте резервную копию ваших данных перед запуском команд из этой инструкции!

Шаг 1 - Подключение к серверу MySQL/MariaDB

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

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

$ mysql -u root -p mysql

или

$ mysql -u root -h db.example.com -p mysql

Шаг 2 — список всех пользователей

Для того чтоб увидеть разрешения для пользователя bloguser введите:

mariadb> SHOW GRANTS FOR 'bloguser'@'localhost';

Где:

  • bloguser — имя пользователя MySQL/MariaDB
  • localhost — имя хоста, с которого разрешено подключаться этому пользователю
  • mywpblog — имя базы данных

Шаг 3 - отзыв всех разрешений

Введите следующую sql команду:

mariadb> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bloguser'@'localhost';

Пример вывода:

Query OK, 0 rows affected (0.00 sec)

Шаг 4 - Удаление пользователя

Введите следующую команду:

mariadb> DROP USER 'bloguser'@'localhost';

Пример вывода:

Query OK, 0 rows affected (0.00 sec)

Шаг 5 - удаление базы данных

Введите следующую команду:

mariadb> DROP DATABASE mywpblog;

Пример вывода:

Query OK, 0 rows affected (0.00 sec)

На этом все. :) Вы удалили пользователя базы данных.


Ошибка ttf-mscorefonts-installer

Последнее время достает ошибка ttf-mscorefonts-installer.

Решение проблемы:

sudo dpkg -P ttf-mscorefonts-installer  
wget http://ftp.de.debian.org/debian/pool/contrib/m/msttcorefonts/ttf-mscorefonts-installer_3.6_all.deb
sudo dpkg -i ttf-mscorefonts-installer_3.6_all.deb
sudo fc-cache -fv
fc-cache ~/.fonts

ISC DHCP сервер и маршрут по умолчанию

она описана внутри этого скрипта:

# if we have $new_rfc3442_classless_static_routes then we have to
# ignore $new_routers entirely

Т.е. скрипт просто игнорирует значение опции:

option routers ....

Чтоб это исправить нужно добавить в classless маршрут по умолчанию:

option classless-routes code 121 = array of unsigned integer 8;
option classless-routes 0,               192,168,1,1, 
                        24, 192,168,100, 192,168,1,2,
                        24, 10,4,0,      192,168,1,2;
option classless-routes-win code 249 = array of unsigned integer 8;
option classless-routes-win 0,               192,168,1,1, 
                            24, 192,168,100, 192,168,1,2,
                            24, 10,4,0,      192,168,1,2;

Ищем причину зависания сервера

Игрался я тут как-то с Orange Pi Zero и стала она подвисать на ровном месте. Монитор я не подключал к нему, т.к. это такая себе была игровая площадка для всяких датчиков и т.п. В общем, надо было понять в чем дело и почему подвисает железка.

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

Для настройки netconsole нужен другой (постоянно включенный) компьютер который примет сообщение по сети.

Настраиваем проблемный сервер

  1. В /etc/modules добавляем netconsole
  2. В /etc/modprobe.d/netconsole.conf пишем

    options netconsole netconsole=SRCPORT@SRCHOST/eth0,DSTPORT@DSTHOST/DSTMAC

Где SRCPORT и SRCHOST соответственно порт и IP адрес сервера который отлаживаем.
А DSTPORT и DSTHOST порт и IP адрес сервера который будет принимать сообщения.

DSTMAC — это MAC адрес сервера который будет принимать сообщения ЕСЛИ он в той же сети. Если он за роутером или где нибудь в интернете, то нужно указывать MAC адрес ближайшего роутера (Gateway).

Должно получится чтото типа:

options netconsole netconsole=6666@192.168.1.2/eth0,6666@192.168.1.3/e0:91:f5:7d:e6:38

Настраиваем сервер с логом

Нам нужно как-то запустить программу которая будет слушать UDP порт DSTPORT и куда-либо записывать сообшения.

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

Запускаем screen

screen -U -D -RR

Запускаем в окне netcat

netcat -l -u DSTHOST DSTPORT

Как понять что все работает?

Можно подождать какого нибудь события, но как убедится что сообщения реально ходят?

kmsg

echo test > /dev/kmsg

После выполнения этой команды в лог прилетит отправленный текст

SysRq

Можно активировать SysRq механизм ядра.
echo 1 > /proc/sys/kernel/sysrq
echo h > /proc/sysrq-trigger

После этого на сервере который принимает сообщения в окне с netcat появится текст типа
[ 7849.700372] SysRq : HELP : loglevel(0-9)....


HTTP сервер для раздачи статики одной строкой

Иногда надо быстро поднять http сервер для отдачи какого-то одного или нескольких файликов.

Тут собраны несколько способов, как одной строкой запустить http сервер для раздачи статических файлов.

Python 2.x

$ python -m SimpleHTTPServer 8000

Python 3.x

$ python -m http.server 8000

Twisted

$ twistd -n web -p 8000 --path .

or

$ python -c 'from twisted.web.server import Site; from twisted.web.static import File; from twisted.internet import reactor; reactor.listenTCP(8000, Site(File("."))); reactor.run()'

Ruby

$ ruby -run -ehttpd . -p8000

asdf

$ gem install adsf   # install dependency
$ adsf -p 8000

Sinatra

$ gem install sinatra   # install dependency
$ ruby -rsinatra -e'set :public_folder, "."; set :port, 8000'

Perl

$ cpan HTTP::Server::Brick   # install dependency
$ perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>8000); $s->mount("/"=>{path=>"."}); $s->start'

Plack

$ cpan Plack   # install dependency
$ plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");' -p 8000

PHP > 5.4

$ php -S 127.0.0.1:8000

busybox httpd

$ busybox httpd -f -p 8000