Класс для работы с базой данных (на примере MySQL)

В этой публикации я приведу пример более совершенного класса для работы с базой данных. Смысл в минимизации кода и приведения его (кода) в более удобочитаемый вид.
В примере ниже, в отличие от предыдущего, в отдельном классе реализованы не только методы выполняющие запросы типа (Scalar и NonQuery) но и метод возвращающий набор данных в DataTable. При этом продумана обработка исключительных ситуаций.

Привожу код как есть, он весь прокомментирован, на столько на сколько это необходимо для понимания.

Сам класс:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data;
using System.Data;

namespace MySqlLib
{
    /// <summary>
    /// Набор компонент для простой работы с MySQL базой данных.
    /// </summary>
    public class MySqlData
    {

        /// <summary>
        /// Методы реализующие выполнение запросов с возвращением одного параметра либо без параметров вовсе.
        /// </summary>
        public class MySqlExecute
        {

            /// <summary>
            /// Возвращаемый набор данных.
            /// </summary>
            public class MyResult
            {
                /// <summary>
                /// Возвращает результат запроса.
                /// </summary>
                public string ResultText;
                /// <summary>
                /// Возвращает True - если произошла ошибка.
                /// </summary>
                public string ErrorText;
                /// <summary>
                /// Возвращает текст ошибки.
                /// </summary>
                public bool HasError;
            }

            /// <summary>
            /// Для выполнения запросов к MySQL с возвращением 1 параметра.
            /// </summary>
            /// <param name="sql">Текст запроса к базе данных</param>
            /// <param name="connection">Строка подключения к базе данных</param>
            /// <returns>Возвращает значение при успешном выполнении запроса, текст ошибки - при ошибке.</returns>
            public static MyResult SqlScalar(string sql, string connection)
            {
                MyResult result = new MyResult();
                try
                {
                    MySql.Data.MySqlClient.MySqlConnection connRC = new MySql.Data.MySqlClient.MySqlConnection(connection);
                    MySql.Data.MySqlClient.MySqlCommand commRC = new MySql.Data.MySqlClient.MySqlCommand(sql, connRC);
                    connRC.Open();
                    try
                    {
                        result.ResultText = commRC.ExecuteScalar().ToString();
                        result.HasError = false;
                    }
                    catch (Exception ex)
                    {
                        result.ErrorText = ex.Message;
                        result.HasError = true;
                    }
                    connRC.Close();
                }
                catch (Exception ex)//Этот эксепшн на случай отсутствия соединения с сервером.
                {
                    result.ErrorText = ex.Message;
                    result.HasError = true;
                }
                return result;
            }


            /// <summary>
            /// Для выполнения запросов к MySQL без возвращения параметров.
            /// </summary>
            /// <param name="sql">Текст запроса к базе данных</param>
            /// <param name="connection">Строка подключения к базе данных</param>
            /// <returns>Возвращает True - ошибка или False - выполнено успешно.</returns>
            public static MyResult SqlNoneQuery(string sql, string connection)
            {
                MyResult result = new MyResult();
                try
                {
                    MySql.Data.MySqlClient.MySqlConnection connRC = new MySql.Data.MySqlClient.MySqlConnection(connection);
                    MySql.Data.MySqlClient.MySqlCommand commRC = new MySql.Data.MySqlClient.MySqlCommand(sql, connRC);
                    connRC.Open();
                    try
                    {
                        commRC.ExecuteNonQuery();
                        result.HasError = false;
                    }
                    catch (Exception ex)
                    {
                        result.ErrorText = ex.Message;
                        result.HasError = true; 
                    }
                    connRC.Close();
                }
                catch (Exception ex)//Этот эксепшн на случай отсутствия соединения с сервером.
                {
                    result.ErrorText = ex.Message;
                    result.HasError = true;
                }
                return result;
            }
             
        }

        /// <summary>
        /// Методы реализующие выполнение запросов с возвращением набора данных.
        /// </summary>
        public class MySqlExecuteData
        {
            /// <summary>
            /// Возвращаемый набор данных.
            /// </summary>
            public class MyResultData
            {
                /// <summary>
                /// Возвращает результат запроса.
                /// </summary>
                public DataTable ResultData;
                /// <summary>
                /// Возвращает True - если произошла ошибка.
                /// </summary>
                public string ErrorText;
                /// <summary>
                /// Возвращает текст ошибки.
                /// </summary>
                public bool HasError;
            }


            /// <summary>
            /// Выполняет запрос выборки набора строк.
            /// </summary>
            /// <param name="sql">Текст запроса к базе данных</param>
            /// <param name="connection">Строка подключения к базе данных</param>
            /// <returns>Возвращает набор строк в DataSet.</returns>
            public static MyResultData SqlReturnDataset(string sql, string connection)
            {
                MyResultData result = new MyResultData();
                try
                {
                    MySql.Data.MySqlClient.MySqlConnection connRC = new MySql.Data.MySqlClient.MySqlConnection(connection);
                    MySql.Data.MySqlClient.MySqlCommand commRC = new MySql.Data.MySqlClient.MySqlCommand(sql, connRC);
                    connRC.Open();

                    try
                    {
                        MySql.Data.MySqlClient.MySqlDataAdapter AdapterP = new MySql.Data.MySqlClient.MySqlDataAdapter();
                        AdapterP.SelectCommand = commRC;
                        DataSet ds1 = new DataSet();
                        AdapterP.Fill(ds1);
                        result.ResultData = ds1.Tables[0];
                    }
                    catch (Exception ex)
                    {
                        result.HasError = true;
                        result.ErrorText = ex.Message;
                    }
                    connRC.Close();
                }
                catch (Exception ex)//Этот эксепшн на случай отсутствия соединения с сервером.
                {
                    result.ErrorText = ex.Message;
                    result.HasError = true;
                }
            
                return result;

            }

        }
    }
}


Несколько примеров использования:
Запись в DataGridView:

MySqlLib.MySqlData.MySqlExecuteData.MyResultData result = new MySqlLib.MySqlData.MySqlExecuteData.MyResultData();

result = MySqlLib.MySqlData.MySqlExecuteData.SqlReturnDataset("select * from table_name", "Database=base;Data Source=localhost;User Id=root;Password=pass");

            if (result.HasError == false)
            {
                dataGridView1.Columns.Clear();
                dataGridView1.DataSource = result.ResultData.DefaultView;
            }
            else
            {
                MessageBox.Show(result.ErrorText);
            }


Занесение в разные TexBox'ы и т.п.:

//Проверяем есть ли в выборке вообще хоть что-то?
if (result.ResultData.DefaultView.Table.Rows.Count > 0)
{
  //Помещаем значения в текстовые поля.
  textbox_fio.Text = result.ResultData.DefaultView.Table.Rows[0]["fio"].ToString();
  textbox_adress.Text = result.ResultData.DefaultView.Table.Rows[0]["adress"].ToString();
  textbox_info.Text = result.ResultData.DefaultView.Table.Rows[0]["info"].ToString();
}


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

ручная установка java на операционную систему Linux Debian

ручная установка java на операционную систему Linux Debian
и так для начала перейдём на офф сайт и скачаем последний пакет java
я выбрал jdk-8u102-linux-x64.tar.gz
и так мы его скачали и теперь
создаём каталог
mkdir /usr/lib/jvm

затем распаковываем архив в него
tar xvfz jdk-8u102-linux-x64.tar.gz

копируем
mv jdk1.* /usr/lib/jvm/jdk

обновим
update-alternatives —install /usr/bin/java java /usr/lib/jvm/jdk/bin/java 1

проверяем
java -version

можно задать $JAVA_HOME
проверим путь
which java

проверяем симлинки
ls -l /usr/bin/java

и
ls -l /etc/alternatives/java

установим JAVA_HOME
echo "export JAVA_HOME=/usr/lib/jvm/jdk/" » ~/.bashrc

обновим
. ~/.bashrc

и проверим
echo $JAVA_HOME


вот и всё
1

Автоматический логин Debian + Mate

Как уже писал немногим ранее, я перешёл на debian, и тут столкнулся с ещё одной неприятностью, это отсутствие автоматического входа в систему, ну то есть необходимо было указывать имя пользователя и пароль, что не всегда радует, и так я решил это следующим способом.
Так как в mate используется lightdm то для начала его переустановим
apt-get install lightdm

теперь переконфигурируем его
dpkg-reconfigure lightdm

проверим нашу кнфигурацию
/usr/sbin/lightdm --show-config

теперь открываем конфиг файл
nano /etc/lightdm/lightdm.conf

и ищем следующие строки

#autologin-user=
#autologin-user-timeout=0
#user-session=default

расскомментируем их и поправим следующим образом

autologin-user= user*
autologin-user-timeout=0
user-session=mate-session

теперь создаём конфиг файлик
sudo nano /usr/share/lightdm/lightdm.conf.d/10-mylogin.conf

со следующим содержимым
[SeatDefaults]
greeter-session=lightdm-greeter
autologin-user=user*

сохраняемся и перезапускаемся, после всех операций мы входим в систему без запроса логина и пароля
*вместо user пишем нашего пользователя, под которым будем входить в систему
подготовил cerber специально для WORLDJB.RU
1

Автоматическое монтирование диска Debian

Долгое время использовал ubuntu и меня устраивало то, что разделы монтировались автоматически, но из-за некоторых проблем с системой, решил перейти на более стабильный debian и вот тут то я столкнулся с не очень то приятной проблемой, каждый раз необходимо было вводить пароль root для монтирования дисков, точнее при каждом запуске системы, исправил это следующим образом, в начале запустил synaptic и установил все необходимые зависимости для ntfs-3g, дабы разделы я монтировал с файловой системой ntfs
,
после того, как всё было установлено открываем терминал и вводим команду
blkid

нам выдаст список дисков с их UUID собственно они нам и нужны, запоминаем UUID необходимого диска, к примеру это будет диск с нашей windows, которую мы оставили по необъяснимым причинам, и так, запомнили, как называется диск и его номер, теперь открываем fstab, дабы нам необходимо внести в него кое какие изменения
sudo nano /etc/fstab

ну или другим удобным для нас редактором, теперь проматываем до самого конца наш файлик и вписываем в него следующее
UUID="UUID диска" /media/имя пользователя/имя диска    ntfs-3g defaults    1 2

разумеется указав соответствующие идентификаторы и имена, сохраняем файлик и закрываем его, теперь примонтируем наш диск
sudo mount -a

если нам выдало сообщение
mount: mount point /media/имя пользователя/имя диска does not exist

то не пугаемся, а идём в папку media/имя пользователя/ и создаём там папку с именем нашего диска, после чего повторно выполняем команд монтирования, никаких сообщений выскакивать не должно
в приложение небольшая таблица-шпаргалка по файловым системам

вот на сем и всё
подготовил cerber специально для WORLDJB.RU
1

Включение\Отключение безопасного режима из командой строки [WINDOWS]

Включение\Отключение Windows в безопасном режиме и из командной строки. Для этого откройте командную строку (cmd) с правами администратора и выполните команду:

bcdedit /set {current} safeboot minimal



Затем перезагрузите компьютер командой:
Shutdown –f –r –t 0


Теперь Windows всегда будет загружаться в безопасном режиме. Чтобы вернуть обычный режим загрузки:
bcdedit /deletevalue {default} safeboot

1

установка ubuntu

в прошлый раз мы ознакомились с установкой операционной системы debian, теперь же познакомимся с установкой ubuntu, и так идём на офф сайт и качаем дистрибутив записываем и запускаем, ожидаем окончания загрузки, по окончанию появляется окошко языка и возможность установить систему и запустить её

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

следующим этапом у нас идёт разметка диска, выбираем другой вариант

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

нажимаем новая таблица разделов

и нажимаем продолжить, теперь у нас появилось свободное место.
ВНИМАНИЕ ЕСЛИ УСТАНАВЛИВАЕТЕ НА УЖЕ СОЗДАННЫЙ РАЗДЕЛ ТО ПРОПУСКАЕТЕ СОЗДАНИЕ РАЗДЕЛА
теперь выбираем наш раздел и нажимаем на плюсик, оставляем всё как есть, только меняем размер раздела, ставим его на 3Гб и в использовать как выбираем раздел подкачки

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

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

нажимаем установить сейчас на сообщение о установке нажимаем продолжить

ожидаем форматирования разделов и устанавливаем свой часовой пояс

устанавливаем раскладку

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

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

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

затем нам предлагается нажать enter для дальнейшей перезагрузки

после перезагрузки запускается наша система, нажимаем комбинацию клавиш ctrl+alt+t, после чего открывается терминал

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

подготовил cerber специально для worldjb.ru

установка linux debian

и так, я всё же созрел на написание данной статейки, много информации о установке данной ОС, но видимо не всем понятно, что же напишу, как говорится на собственном примере, и так для начала переходим на офф сайт и скачиваем сетевой установщик, почему именно сетевой? просто во время установки мы сможем установить необходимое нам окружение рабочего стола и так мы скачали и запустили установщик, при старте нам высветит вот такое окошечко

думаю не стоит объяснять в чём разница установщиков, дабы все помнят это на примере windows, ну так продолжаем, я выбрал x64, но не графическую установку, а так называемую текстовую, просто мне так привычнее… замечу, что все операции выполняются только с клавиатуры, стрелками влево-вправо и вверх-вниз, переход между ссылками продолжить и назад осуществляется клавишей tab, выбор программного обеспечения для установки осуществляется клавишей пробел, следующим шагом выбираем язык нашей системы

и местонахождения

следующим этапом нам предлагает выбрать раскладку клавиатуры

и способ переключения

ожидаем настройки системы и указываем сетевое имя нашей системы

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

и задаём пароль супер пользователя root

подтверждаем пароль и создаём пользователя

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

подтверждаем пароль, устанавливаем часовой пояс, выбираете свой часовой пояс

ожидаем настройки и доходим до разбивки диска, и выбираем вручную

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

выделяем наш раздел и выбираем удалить раздел

теперь у нас появилась неразмеченная область

вновь выбираем наш диск и выделяем создать новый раздел

задаём ему размер, так как у нас диск 42 Гб, то зададим 6 Гб на новый раздел

устанавливаем его первичным

в начале дискового пространства

в использовать как выбираем раздел подкачки

по сути это тот же файл подкачки, коим мы пользуемся в windows, затем выбираем настройка раздела закончена и повторяем операцию по созданию раздела, только теперь при использовать как

в открывшемся меня выделяем журналируемая файловая система ext4

теперь опускаемся ниже и устанавливаем метку «загрузочный» на положение вкл

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

соглашаемся с тем, что вносим изменения на диск

и ожидаем окончания установки базовой системы

теперь выбираем страну в которой расположено зеркало архивов

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

вводим информацию о прокси, если имеется, если нет, то пропускаем

и ожидаем окончания загрузки

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

затем запускается окно выбора рабочего окружения

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

по окончании установки, нам предложит установить grub на главную загрузочную запись

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

ожидаем окончания установки

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

после чего произойдёт перезагрузка и загрузится наш grub выбираем систему и ожидаем её загрузки
появляется окошко выбора пользователя, пишем пользователя, или нашего пользователя или root, что вам больше нравится и пишем пароль

после чего мы попадаем в установленное нами рабочее окружение

на этом всё, учитесь на данном примере и расширяйте свои знания в области linux debian

с вами был cerber специально для worldjb.ru

Установка Apache, MySQL, PHP на Windows

тут немного расскажу о установке Apache, MySQL, PHP на Windows, и так, всё вышеописанное подходит для систем windows, начиная win xp и заканчивая win 10, и так, так же, установка проводилась на старых версиях apache,php и MySQL, для начала идём по ссылке, и скачиваем версию apache 2.2, устанавливаем её, только во время установки выбираем каталог C:\www\, далее переходим по следующей ссылке и качаем php, качаем версию 5.3 либо 5.4, распаковываем в каталог C:\php, после распаковки открываем свойства «Мой компьютер», и переходим по ссылке «Дополнительные параметры», на вкладке «Дополнительно» жмём кнопку «Переменные среды...». В нижнем окне «Системные переменные» находим переменную PATH, выделяем её и нажимаем кнопку «Изменить». Ставим курсор в поле «Значение переменной», на клавиатуре нажимаем клавишу END. Ставим; (это разделитель значений) и пишем путь к каталогу PHP: C:\php
Создаём в директории C:\php три дополнительные поддиректории:

tmp — для хранения временных файлов сессий

includes — для хранения подключаемых классов

upload — для хранения временных загружаемых файлов.
Переименовываем файл php.ini-development в php.ini
На этом установка PHP завершена.
Далее, переходим по ссылке и качаем MySQL версии 5.5, установку проводим, согласно данной статье, всё, установка окончена, начинаем настройку всего нашего хозяйства.
Для этого, в нашем примере, переходим в конфиг каталог apache,C:\www\conf\httpd.conf и открываем конфиг файл, любым текстовым редактором
Найдём и раскомментируем (удалим символ # в начале строки)
LoadModule rewrite_module modules/mod_rewrite.so
Спускаемся до конца списка загружаемых модулей (LoadModule) и ниже последней записи добавляем следующие строки:

LoadModule php5_module «C:/php/php5apache2_2.dll»

AddType application/x-httpd-php .php

PHPIniDir «c:/php/»

Этим мы подключаем поддержку PHP в Apache.

Найдём и раскомментируем строку, задающее имя нашего вэб-сервера

ServerName localhost:80

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

DocumentRoot «C:/www/htdocs»
Находим следующий блок:

Options Indexes FollowSymLinks

AllowOverride None

Order allow,deny

Allow from all


И заменяем его на нижеследующий:

Options Indexes Includes FollowSymLinks

AllowOverride All

Order allow,deny

Allow from all


Опция Index разрешает просмотр каталога, если отсутствует индексный файл, опция Includes включает поддержку SSI, а опция FollowSymLinks позволяет использовать символические ссылки на файлы и каталоги. Директива AllowOverride All позволяет изменять опции доступа посредством файла .htaccess.
Находим следующий блок:

DirectoryIndex index.html

И заменяем его на:

DirectoryIndex index.html index.htm index.shtml index.phtml index.php

Находим, начинающийся с блок и в самом конце его раскомментируем следующие две строки:

AddType text/html .shtml

AddOutputFilter INCLUDES .shtml


И добавим ещё две следующие строки

AddType application/x-httpd-php .php

AddType application/x-httpd-php-source .phps

Сохраняем и закрываем файл httpd.conf. Теперь проверим корректность конфигурации: Пуск -> Все программы -> Apache HTTP Server 2.2 -> Configure Apache Server -> Test Configuration. Если настроили не правильно, то в появившемся окне командной строки мы увидим сообщение об ошибке и номер строки, в которой эта ошибка допущена. Если всё правильно, то мелькнёт окно командной строки с надписью «Syntax OK». Ещё раз убедимся, что всё работает, набрав localhost в адресной строке браузера.
В текстовом редакторе откроем настроечный файл PHP – php.ini. В нашем случае он расположен в папке C:\php.

Найдём и раскомментируем (удалим символ; в начале строки) строку

short_open_tag = On

Это позволяет заключать код в короткие тэги.

Следующая строка отключает сообщения об ошибках:

display_errors = Off

Из соображений безопасности отключаем register_globals

register_globals = Off

Отключаем magic_quotes_runtime

magic_quotes_runtime = Off

В секции Paths and Directories найдём и раскомментируем строку для Windows

include_path = ".;c:\php\includes"

Значение директивы extension_dir (путь к папке с расширениями) устанавливаем как

extension_dir = «C:/php/ext»

Разрешим загрузку файлов

file_uploads = On

Найдём строку upload_tmp_dir и укажем директорию для хранения временных загружаемых файлов

upload_tmp_dir = «C:/php/upload»

Установим максимальный размер, загружаемого файла

upload_max_filesize = 8M

Укажем путь к папке для хранения временных файлов сессий

session.save_path = «C:/php/tmp»

Выключим session.auto_start

session.auto_start = 0

Раскомментируем следующие строки для подключения нескольких библиотек расширений:
extension=php_bz2.dll

extension=php_curl.dll

extension=php_gd2.dll

extension=php_mbstring.dll

extension=php_mysql.dll

extension=php_mysqli.dll

Сохраняем файл php.ini. Проверим, как настроена связка PHP и Apache. Для этого в текстовом редакторе создадим файл следующего содержания:

<?php
phpinfo();

?>


Сохраним его как index.php и скопируем в корневую директорию сайтов: C:\www\htdocs. После этого перестартуем Apache для того чтобы он перечитал изменённый файл php.ini, а затем наберём в адресной строке браузера: localhost/index.php. Если видим фиолетовые таблицы с информацией PHP, то значит всё настроено правильно.
Теперь устанавливаем phpMyAdmin, переходим по ссылке и качаем версию 3.4
Распаковываем в дирректорию C:\www\htdocs\phpmyadmin, создаём файл с именем config.inc.php и записываем в него следующее
<?php

$cfg['blowfish_secret'] = '1234567890';

$i=0;

$i++;

$cfg['Servers'][$i]['auth_type'] = 'cookie';

?>

на этом настройка окончена, перезапускаем apache и проверяем работу

Изменение заголовка окна Windows [C#]

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

Добавьте на форму два текстовых поля TextBox и кнопку Button. Запустите какую-нибудь программу, например, Калькулятор. Напишите в первом текстовом поле наименование окна, которое вы хотите изменить (Калькулятор). Напишите во втором текстовом поле новый заголовок окна, например, iCalc. Нажмите на кнопку – название программы должно поменяться.

Как это работает
С помощью функции Windows API FindWindow мы находим программу, которая имеет нужный заголовок. Далее при помощи функции SendMessage с параметром WM_SETTEXT мы посылаем окну сообщение для смены заголовка. Вы почти обновили Windows до Mac )).

[DllImport("user32.dll")]
private static extern IntPtr FindWindow(
string className,
string windowName);

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd,
UInt32 Msg, Int32 wParam, string lParam);

private const int WM_SETTEXT = 0xC;

private void button1_Click(object sender, EventArgs e)
{
IntPtr target_hwnd;
string target_name;
string new_caption;
target_name = textBox1.Text;
new_caption = textBox2.Text;
target_hwnd = FindWindow(null, target_name);

SendMessage(target_hwnd, WM_SETTEXT, 0, new_caption);
}


реакция ноутбука на закрытие крышки

думаю из названия и так всё понятно, и как сделать, что бы ноутбук, на базе ОС debian и исходных, не реагировал на закрытие крышки, не составит труда, но это если у вас установлена графическая оболочка, но мы же мастдаи и извращенцы, поэтому у нас нет графической среды и мы работаем с консолью, и так открываем нашу любимую консоль и логинемся под root и открываем logind.conf, в нём то и кроется основной секрет
nano /etc/systemd/logind.conf

теперь прокручиваем его и находим строку
#HandleLidSwitch=suspend

для начала расскомментируем её, убёрм в начале символ #, теперь изменим значение с
suspend

на
ignore

что бы получилось так
HandleLidSwitch=ignore

теперь сохраняемся ctrl+o и закрываем редактор ctrl+x, перезапускаем ноут закрываем крышку и радуемся тому, что он работает