понедельник, 7 октября 2019 г.

Установка mysql 8 на Centos 7

mysqld --initialize-insecure --user=mysql --console --defaults-file=/etc/my.cnf --verbose
sudo -u mysql mysqld --upgrade=FORCE
sudo -u mysql mysqld --init-file=/tmp/1 --console --verbose
cat /tmp/1


DROP USER 'root'@'localhost';
FLUSH PRIVILEGES;
CREATE USER 'root'@'localhost' IDENTIFIED BY '1234567890';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

суббота, 12 января 2019 г.

Захват изображения с web камеры и отображение на веб странице


Нам потребуется nginx, модуль для nginx https://github.com/arut/nginx-rtmp-module, ffmpeg и сама web камера. В качестве плейера будем использовать https://videojs.com/ Я перепробовал довольно много вариантов, но только этот захотел работать одновременно в firefox, chrome, safari ipad/iphone/macbook.

Я опишу сам процесс, как понял его я. 
rtmp модуль запускает ffmpeg, который берет поток из /dev/video0 используя плагин video4linux и записывает в rtmp канал hls/movie. Модуль nginx rtmp принимает данные и раскладывает данные по файликам, параллельно обновляя файл movie.m3u8 в папке /mnt/hls. Потом nginx отдает содержимое папки /mnt/hls по протоколу http, что он умеет делать очень хорошо.

Надо отметить, что этот метод не лишен недостатков. С текущими настройками, есть временной лаг и довольно приличный. Данные пишутся на диск (от этого диск будет деградировать), создатель плагина рекомендует располагать данные в tmpfs или в оперативной памяти.

Конфиг для nginx
http {
    ....
    server {
        listen 8080;
        root /mnt;
        index index.html;

        location / {
        }

        location /stat {
            rtmp_stat all;

            # Use this stylesheet to view XML as web page
            # in browser
            # https://github.com/arut/nginx-rtmp-module/blob/master/stat.xsl
            rtmp_stat_stylesheet stat.xsl;
        }

        location /hls {
            # Serve HLS fragments
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            add_header Cache-Control no-cache;
        }
    }
}

rtmp {
    server {
        listen 1935;

        chunk_size 4000;

        application hls {
            live on;
            hls on;
            hls_path /mnt/hls;
            exec_static ffmpeg -re -f video4linux2 -i /dev/video0 -vcodec libx264 -pix_fmt yuv420p -vprofile baseline -f flv rtmp://localhost:1935/hls/movie;
        }
    }
}

Создаем /mnt/index.html со следующим содержанием
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Live Streaming</title>
    <link href="//vjs.zencdn.net/7.3.0/video-js.min.css" rel="stylesheet">
    <script src="//vjs.zencdn.net/7.3.0/video.min.js"></script>
    <script src="https://unpkg.com/@videojs/http-streaming@1.8.0/dist/videojs-http-streaming.min.js"></script>
</head>
<body>
    <video-js id="vid1" width=600 height=300 class="vjs-default-skin" controls>
        <source src="http://127.0.0.1:8080/hls/movie.m3u8" type="application/x-mpegURL">
    </video-js>
    <script>
        var player = videojs('vid1');
        player.play();
    </script>
</body>
</html>


суббота, 9 июня 2018 г.

Macbook prod wifi: не аппаратного обеспечения

Решение:

1) Отключить Wi-Fi.
2) Перейти в папку /Library/Preferences/SystemConfiguration/.
3) Удалить файлы:
com.apple.airport.preferences.plist
com.apple.network.eapolclient.configuration.plist
com.apple.wifi.message-tracer.plist
NetworkInterfaces.plist
preferences.plist
4) Выключить Macbook
5) Включить Macbook

Именно выключить, а потом включить. Перезагрузка не поможет.

понедельник, 16 апреля 2018 г.

Установка Dante в Centos

## Добавляем репозиторий:
yum install http://mirror.ghettoforge.org/distributions/gf/gf-release-latest.gf.el7.noarch.rpm

## Включаем репу и устанавливаем dante-server
yum --enablerepo=gf-plus install dante-server

## Разрешаем автозагрузку сервиса
systemctl enable sockd.service

## Создаем рабочую папку
mkdir /var/run/sockd

## Забэкапим оригинальный конфиг
mv /etc/sockd.conf /etc/sockd.conf.orig

## Создаем конфиг, прокси будет слушать на порту 443
cat >> /etc/sockd.conf << 'EOF'
user.privileged: root
user.unprivileged: nobody

internal: eth0 port = 443
external: eth0

logoutput: syslog stdout /var/log/sockd.log
errorlog: /var/log/sockd_err.log

socksmethod: username

client pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    log: error
}

socks pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    command: connect udpassociate
    log: error
}
EOF


## Стартуем сервис
systemctl start sockd.service

## Правило для фаервола
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="ваш_внешний_ip/32" port protocol="tcp" port="443" accept"


## Добавляем пользователя
useradd -s /sbin/nologin -d /dev/null sock

## Указываем пароль
passwd sock 
 

суббота, 14 апреля 2018 г.

Оптимизация sql запросов

Оптимизация - это всегда компромисс. Преждевременная оптимизация иногда хуже чем полное отсутствие. Но иногда лучше иметь список возможных улучшений, чтобы их проверить, чем выдумывать их.
1. Выборка по первичному ключу самая быстрая.
select id, name from client where id in (1,2,3,4)
Такой запрос самый быстрый, НО если кол-во id слишком большой получим обратны эффект. Наша задача уменьшить объем передаваемых данный как от mysql до php, так и обратно. Так что этой техникой надо пользоваться очень аккуратно.

2. Есть одна особенность связанная с сортировкой и yii1.
select id, name from client inner join (select client_id, max(created_at) as created_at from worksheet group by client_id) w on w.client_id = client.id order by w.created_at desc
Проблема в том, что для запроса select count(*) from client не нужен подзапрос  select client_id, max(created_at) as created_at from worksheet group by client_id . Он даже для выборки не нужен, потому что при наличии фильтра по client.id, подзапрос будет тормозить. Правильнее переписать запрос так
select id, name from client order by (select max(created_at) from worksheet where worksheet.client_id = client.id) desc
3. exists работает медленее чем объединение, но для фильтрации он предпочтительнее так как ведет себя более стабильнее для yii1
select id, name from client inner join worksheet on worksheet.client_id = client.id where worksheet.type = 1
такой запрос отлично можно оптимизировать добавив индексы, но он не подходит для построения списка клиентов и лучше использовать exists, пусть и с большими потерями
select id, name from client where exists(select 1 from worksheet where worksheet.client_id = client.id where worksheet.type = 1)
4. Использование функций в секции where. Запрос
select id, name from client where year(created_at) = 2018
лучше переписать так
select id, name from client where created_at between '2018-01-01 00:00:00' and '2018-12-31 23:59:59'
так можно задействовать индекс по полю created_at. С функций year такого добиться не получится. Можно конечно начать использовать вычисляемые поля и индексы по ним, но по мне это излишество


четверг, 15 февраля 2018 г.

Настройка dnsmasq для локальной разработки

Устанавливаем dnsmasq
sudo apt install dnsmasq -y
Добавляем адрес локального dns сервера в /etc/resolv.conf
nameserver 127.0.0.1
Если ip номер получаем от dhcp, файл /etc/resolv.conf будет пересоздан при подключении к сети. Добавляем в /etc/dhcp/dhclient.conf строчку
prepend domain-name-servers 127.0.0.1;
Настраиваем сам dnsmasq через файл /etc/dnsmasq.conf, чтобы домены *.local резолвились как 127.0.0.1
address=/.local/127.0.0.1

Чтобы домены *.warehouse.local резолвились как 127.0.0.1, добавляем в файл /etc/dnsmasq.conf строку
address=/.warehouse.local/127.0.0.1
Перезагружаем dnsmasq
sudo service dnsmasq restart
Редактируем файл /etc/nsswitch.conf чтобы заработал Firefox
hosts:          files dns mdns4_minimal [NOTFOUND=return]

воскресенье, 17 декабря 2017 г.

openvpn

Начальная установка по этому манулу

И правила для iptables
# Generated by iptables-save v1.4.21 on Sun Dec 17 14:16:49 2017
*nat
:PREROUTING ACCEPT [1195:90375]
:INPUT ACCEPT [138:8561]
:OUTPUT ACCEPT [193:10888]
:POSTROUTING ACCEPT [195:10948]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT
# Completed on Sun Dec 17 14:16:49 2017
# Generated by iptables-save v1.4.21 on Sun Dec 17 14:16:49 2017
*filter
:INPUT ACCEPT [141:7959]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [44692:85212805]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i tun+ -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1194 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i tun+ -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m state --state NEW -j ACCEPT
COMMIT
# Completed on Sun Dec 17 14:16:49 2017