воскресенье, 4 декабря 2022 г.

Настройка удаленного подключения к mysql (mariadb)

1. Создаем пользователя MariaDB

root@servername# sudo mysql -u root -p

mysql> CREATE USER 'user'@'%' IDENTIFIED BY 'your password';
Query OK, 0 rows affected (0.11 sec)

mysql> GRANT ALL ON *.* TO 'user'@'%';
Query OK, 0 rows affected (0.15 sec)

mysql> FLUSH PRIVILEGES;

mysql> quit;



2. Разрешаем подключения с удаленного хоста к серверу MariaDB

nano /etc/mysql/mariadb.conf.d/50-server.cnf

Комментируем
#bind-address = 127.0.0.1

Добавляем
bind-address = 0.0.0.0



3. Перезапускаем сервис mysql

sudo service mysql restart

php move_uploaded_file failed to open stream: Permission denied

При обработке полученного файла php-скриптом (перемещении файла из временного каталога в наш каталог на стороне web-сервера) $_FILES получаем сообщение о недостаточности прав, например, как у меня "<b>Warning</b>:  move_uploaded_file(/var/www/html/upload_files/defect_attach/04_12_22_01_05_41_371_3374.zip): failed to open stream: Permission denied in <b>/var/www/html/engine/defect.php</b> on line <b>159</b><br />"


Шаг 1. Выясняем под каким пользователем выполняется наш php-скрипт на стороне сервера:
<?php echo exec('whoami'); ?>
...в моем случае это "www-data";

Шаг 2. Добавляем пользователя, под которым подключаемся 
к серверу для разработки в группу `www-data`:
sudo adduser <username> www-data

Шаг 3.
sudo chown -R www-data:www-data /var/www

Шаг 4.
sudo chmod -R g+rwX /var/www

вторник, 10 мая 2022 г.

Класс для логирования программы (RichTextBox), версия 2

Первая версия класса расположена по web-ссылке: RichTextBox_LoggedClass

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

1. Логирование отладочного текста (*.log_dbg), по умолчанию оранжевого цвета (*.col_dbg). При логировании строки в компоненте RichTextBox не используется (timestamp( )) в начале добавляемого текста и не используются символы перевода строки ("\r\n") в конце текста.

2. Добавление текста в компонент RichTextBox выполнена через *.InvokeRequired, позволяющего работать из другого потока;

3. Также пространство имен в классе "Framework". Исключено имя разрабатываемого проекта (projectname.Framework);
Остальные методы работы остались без изменений:

Пример использования класса:
---------------------
...
using Framework;
...
class Class_Name {
    RichTextBoxLogClass log;
    public Class_Name() {
        log = new RichTextBoxLogClass(rtbLog);
    }
    
    ...
    public void button_click(...) {
        log.log_msg("Начало выполнения операции.");
        log.log_err("Ошибка выполнения операции");
        log.log_tx("ASCII CMD SEND TEXT");
        log.log_rx("ASCII CMD RECIVED TEXT");
        log.log_tx(new byte [] {0x01, 0x20, 0x44, 0x55});
        log.log_rx(new byte [] {0x01, 0x20, 0x44, 0x55});
        log.log_dbg("dbg chars " + BitConverter.ToString(new byte[] {0x01, 0x02, 0x03 }).Replace("-", " ");   
    }
}

Настраиваемые параметры:
------------------------
    log.col_msg - цвет текста сообщения, по умолчанию, Color.Gray;
    log.col_err - цвет текста сообщения об ошибке, по умолчанию, Color.Black;
    log.col_tx - цвет текста отправляемых данных, по умолчанию, Color.Red;
    log.col_rx - цвет текста принимаемых данных, по умолчанию, Color.Blue;
    log.log_dbg - цвет текста отладочного сообщения, по умолчанию, Color.Orange;
    log.timestampFormat - формат вывода времени, например, "HH:mm:ss.ff";
    log.bytes_in_line - количество байт в строке, например, 16;
    log.hex_to_ascii_space - расст между hex и ascii строк, напр. 8;

среда, 4 мая 2022 г.

Сохранение настроек программы в xml-файл

        ...
        string param1;
        string param2;
        string param3;
        bool flag1;
        ...

static class SaveAppSetting
{

    public static string fname_xml = @"\appSetting.xml";
    
    static XmlDocument doc;
    
    static public void LoadXmlAppSetting()
    {
        if (System.IO.File.Exists(fname_xml))
        {
            doc = new XmlDocument();
        
    doc.Load(fname_xml);
        
        
    param1 = getStringValue("/setting/equipment/param1");
            param2 = getStringValue("/setting/equipment/param2");
            param3 = getStringValue("/setting/equipment/param3");
         
            flag1 = getBoolValue("/setting/dbg/log_7e1_codeString");
        }
    }

    static public void SaveXmlAppSetting()
    {
        string xml_content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                             "<setting>";
        xml_content += "<equipment>";
        xml_content += "<
param1>" + param1 + "</param1>";
        xml_content += "<param2>" + param2 + "</param2>";
        xml_content += "<param3>" + param3 + "</param3>";

        xml_content += "<flag1>" + flag1.ToString() + "</flag1>";
        xml_content += "</equipment>";

        xml_content += "</setting>";
        try
        {
            doc = new XmlDocument();
            doc.LoadXml(xml_content);
            doc.Save(fname_xml);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    static private string getStringValue(string xml_path, string default_value = "-")
    {
        string ret_value = "";
        try
        {
            ret_value = doc.SelectSingleNode(xml_path).InnerText.Trim();
        }
        catch
        {
            ret_value = default_value;
        }
          
        return ret_value;
    }
    
    static private bool getBoolValue(string xml_path, bool default_value = false)
    {
        bool ret_value = false;
        
        try
        {
            ret_value = Convert.ToBoolean(doc.SelectSingleNode(xml_path).
                                                                 InnerText.Trim());
        }
        catch
        {
            ret_value = default_value;
        }
        
        return ret_value;
    }
}

четверг, 9 декабря 2021 г.

Установка FreeBSD

Виртуальная машина: Oracle VM VirtualBox
Используемый образ: FreeBSD13.iso

Если на компьютере или ноутбуке мало аппаратных ресурсов, используем установку ОС только в терминальном режиме, используем образ freebsd i386 (ОЗУ выделяем 512 Мб).

Если на компьютере или ноутбуке под работу виртуальной машины можно выделить 2 Гб ОЗУ и более 1 ядра процессора, используем образ freebsd amd64.

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

После установки:
###################################################################
#                                                                 #
# Этап 1. После установки ОС, запрашиваем необходимые обновления. #
#                                                                 #
###################################################################

# Определяем обновляемые элементы ОС
freebsd-update fetch

# Выполняем обновление
freebsd-update install

# Обновляем информацию о доступных пакетах
pkg update

# Обновляем установленные пакеты
pkg upgrade

# Просматриваем информацию о системе
uname -rm

##############################################
#                                            #
# Этап 2. Устанавливаем средства разработки. #
#                                            #
##############################################

# Отображаем доступные для установки компиляторы gcc
pkg serach lang/gcc

# Устанавливаем компилятор gcc
pkg install -y lang/gcc

# Проверяем версию установленного компилятора gcc
gcc --version

# Отображаем доступные версии языка Python
pkg search python

# Устанавливаем Python
pkg install -y python

# Устанавливаем файловый менеджер (аналогичного Far Manager)
pkg install -y mc

# Запускаем файловый менеджер
mc

# Дополнительно устанавливаем nano (текстовый редактор)
pkg install -y nano

# как IDE для программирования будем использовать emacs
pkg install -y emacs

# для редактирования файлов можно также установить vim
pkg install -y vim

#
#
# Далее для работы в многооконном режиме минимально по ресурсам
pkg install -y xorg

# для запуска используем (интерфейс не очень удобен похож на Win3.1)
startx

Черновик. #####################################
#
# В качестве пользовательской графической оболочки
# будем используем xfce4, автоматически его запускать не будем,
# только с командной строки
#
# Устанавливаем Slim (х.з. что такое, видимо темы для оформления)
# pkg install -y slim slim-themes
#
# Устанавливаем саму оболочку xfce4
# pkg install -y xfce4
#
# Запускаем xfce4 с командной строки
# startxfce4
#
#- - - - - - - - - - - - - - - - - - - - - - - -
#
# В случае, если графическую оболочке xfce4 хочите запускать
# автоматически при загрузке сервера, то в файл /etc/rc.conf, 
# прописываем следующие строки
# slim_enable=yes
# dbus_enable=yes
#
# для пользователя root создаем файл "/root/.xinitrc"
# и для созданного пользователя создаем
# файл /home/<username>/.xinitrc.
# Оба файла со следующим содержанием:
# exec /usr/local/bin/xfce4-session
###############################################

воскресенье, 7 ноября 2021 г.

TcpIpSocket класс, для приема/передачи байт-последовательностей

Пример использования:
---------------------

private void button1_Click(object sender, EventArgs e)
{
    Thread _thr = new Thread(_thr_process);
    _thr.IsBackground = false;
    _thr.Start();
}

CustomSocket socket;

private void event_socket_rx_data(byte[] msg)
{
    log.log_rx(msg);
}

private void event_socket_tx_data(byte[] msg)
{
    log.log_tx(msg);
}

private void event_socket_connect(string msg)
{
    log.log_msg(msg);
}


private void event_socket_noconnect(string msg)
{
    log.log_err(msg);
}

private void event_socket_close_connect(string msg)
{
    log.log_msg(msg);
}

private void _thr_process()
{
    socket = new CustomSocket();
    socket.event_rx = event_socket_rx_data;
    socket.event_tx = event_socket_tx_data;
    socket.event_close_connection = event_socket_close_connect;
    socket.event_connection = event_socket_connect;
    socket.event_noconnection = event_socket_noconnect;
    
    if (!socket.doConnect("192.168.0.209", 5205))
        return;

    socket.Send(new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05 }));

    rx_bytes = new byte[1024];
    socket.Receive(ref rx_bytes, 0, 1024, 2000);

    socket.CloseConnection();
}

Скачать класс: CustomSocket.cs

четверг, 4 ноября 2021 г.

Класс для логирования программы (RichTextBox)

Пример использования:
---------------------
...

using proj_namespace.Framework;

...

class Class_Name {

    RichTextBoxLogClass log;

    public Class_Name() {
        log = new RichTextBoxLogClass(rtbLog);
    }
    
    ...

    public void button_click(...) {
        log.log_msg("Начало выполнения операции.");
        log.log_err("Ошибка выполнения операции");
        log.log_tx("ASCII CMD SEND TEXT");
        log.log_rx("ASCII CMD RECIVED TEXT");
        log.log_tx(new byte [] {0x01, 0x20, 0x44, 0x55});
        log.log_rx(new byte [] {0x01, 0x20, 0x44, 0x55});
    }
}

Настраиваемые параметры:
------------------------
    log.col_msg - цвет текста сообщения, например, Color.Gray;
    log.col_err - цвет текста сообщения об ошибке, например, Color.Black;
    log.col_tx - цвет текста отправляемых данных, например,  Color.Red;
    log.col_rx - цвет текста принимаемых данных, например, Color.Blue;

    log.timestampFormat - формат вывода времени, например, "HH:mm:ss.ff";

    log.bytes_in_line - количество байт в строке, например, 16;
    log.hex_to_ascii_space - расст между hex и ascii строк, напр. 8;

Скачать: RichTextBoxLogClass.cs

Nginx + Let's Crypt

Шаг 1. Установка Certbot # apt-get install python3-acme python3-certbot python3-mock python3-openssl python3-pkg-resources python3-pyparsing...