Архив автора: admin

10 примеров команд lsof в Linux

10 примеров команд lsof в Linux. В этой статье мы рассмотрим команду lsof с практическими примерами. lsof расшифровывается как «LiSt Open Files» и используется для того чтобы понять, какие файлы открываются какими процессами. Как мы все знаем, Linux/Unix рассматривает все как файлы (в том числе каналы, сокеты, каталоги, устройства и т.д.). Одна из причин использования команды lsof – это ситуация когда диск не может быть размонтирован, так как возникает ошибка: “Файлы используются“. С помощью этой команды мы можем легко определить используемые файлы.




1. Вывод всех открытых файлов с помощью команды lsof




В приведенном ниже примере lsof в Linux будет показан список открытых файлов. В данном выводе отображаются такие столбцы, как CommandPIDUSERFDTYPE и т.д.




lsof







Разделы и их значения говорят сами за себя. Однако мы рассмотрим столбцы FD&TYPE более подробно:




FD – обозначает дескриптор файла и принимает следующие значения как:




  • cwd – текущий рабочий каталог
  • rtd – корневой каталог
  • txt – текст программы (код и данные)
  • mem  файл памяти




Кроме того, в столбцах FD такие номера, как 1u, являются фактическим дескриптором файла, а за ним следует один из флагов urw как режим доступа:




  • r – доступа для чтения.
  • w – доступа для записи.
  • u – чтения и записи.




TYPE – файлов и их идентификация:




  • DIR – директория
  • REG – обычный файл
  • CHR – специальный символьный файл.
  • FIFO – First In First Out




2. Список открытых пользовательских файлов




Приведенная ниже команда отобразит список всех открытых файлов пользователя sedicomm:




lsof -u sedicomm




3. Поиск процессов, работающих на конкретном порту




Чтобы узнать все запущенные процессы на определенном порту, просто используйте следующую команду с флагом -i. В приведенном ниже примере будут выведены все запущенные процессы порта 22:




# lsof -i TCP:22



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

sshd 1471 root 3u IPv4 12683 0t0 TCP *:ssh (LISTEN)

sshd 1471 root 4u IPv6 12685 0t0 TCP *:ssh (LISTEN)




4. Вывод открытых файлов IPv4 и IPv6




В приведенном ниже примере lsof в Linux показаны только сетевые файлы IPv4 и IPv6, выведенные с помощью отдельных команд:




1# lsof -i 42​3COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME4rpcbind 1203 rpc # lsof -i 4



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc

rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954

rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN)

avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns

avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600




# lsof -i 6



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc

rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954

rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN)

rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800

rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)

cupsd 1346 root 6u IPv6 12112 0t0 TCP localhost:ipp (LISTEN)




5. Вывод открытых файлов диапазона портов TCP 1-1024




Для вывода всех запущенных процессов открытых файлов TCP-порт меняется в диапазоне 1-1024.




# lsof -i TCP:1-1024



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN)

cupsd 1346 root 7u IPv4 12113 0t0 TCP localhost:ipp (LISTEN)

sshd 1471 root 4u IPv6 12685 0t0 TCP *:ssh (LISTEN)

master 1551 root 13u IPv6 12898 0t0 TCP localhost:smtp (LISTEN)

sshd 1834 root 3r IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED)

sshd 1838 sedicomm 3u IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED)

sshd 1871 root 3r IPv4 15842 0t0 TCP 192.168.0.2:ssh->192.168.0.1:groove (ESTABLISHED)

httpd 1918 root 5u IPv6 15991 0t0 TCP *:http (LISTEN)

httpd 1918 root 7u IPv6 15995 0t0 TCP *:https (LISTEN)




6. Исключение пользователей с использованием символа «^»




В этом примере lsof в Linux мы исключили пользователя root. Вы же можете исключить конкретного пользователя, используя «^» с командой приведённой ниже:




# lsof -i -u^root



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc

rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954

rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN)

rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc

rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954

rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN)

avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns

avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600

rpc.statd 1277 rpcuser 5r IPv4 11836 0t0 UDP *:soap-beep

rpc.statd 1277 rpcuser 8u IPv4 11850 0t0 UDP *:55146

rpc.statd 1277 rpcuser 9u IPv4 11854 0t0 TCP *:32981 (LISTEN)

rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800

rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)




7. Узнайте, какие файлы и команды использует пользователь?




Приведенный ниже пример показывает, что пользователь sedicomm использует такие команды, как ping и /etc.




# lsof -i -u sedicomm



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

bash 1839 sedicomm cwd DIR 253,0 12288 15 /etc

ping 2525 sedicomm cwd DIR 253,0 12288 15 /etc




8. Вывод списка всех сетевых подключений




Следующая команда с опцией «-i» выводит список всех сетевых подключений «LISTENING & ESTABLISHED»:




# lsof -i



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc

rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954

rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN)

avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns

avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600

rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)

cupsd 1346 root 6u IPv6 12112 0t0 TCP localhost:ipp (LISTEN)

cupsd 1346 root 7u IPv4 12113 0t0 TCP localhost:ipp (LISTEN)

sshd 1471 root 3u IPv4 12683 0t0 TCP *:ssh (LISTEN)

master 1551 root 12u IPv4 12896 0t0 TCP localhost:smtp (LISTEN)

master 1551 root 13u IPv6 12898 0t0 TCP localhost:smtp (LISTEN)

sshd 1834 root 3r IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED)

httpd 1918 root 5u IPv6 15991 0t0 TCP *:http (LISTEN)

httpd 1918 root 7u IPv6 15995 0t0 TCP *:https (LISTEN)

clock-app 2362 narad 21u IPv4 22591 0t0 TCP 192.168.0.2:45284->www.gov.com:http (CLOSE_WAIT)

chrome 2377 narad 61u IPv4 25862 0t0 TCP 192.168.0.2:33358->maa03s04-in-f3.1e100.net:http (ESTABLISHED)

chrome 2377 narad 80u IPv4 25866 0t0 TCP 192.168.0.2:36405->bom03s01-in-f15.1e100.net:http (ESTABLISHED)




9. Поиск по PID




В приведенном ниже примере показано только те выводы, чей PID равен 1:




# lsof -p 1



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

init 1 root cwd DIR 253,0 4096 2 /

init 1 root rtd DIR 253,0 4096 2 /

init 1 root txt REG 253,0 145180 147164 /sbin/init

init 1 root mem REG 253,0 1889704 190149 /lib/libc-2.12.so

init 1 root mem REG 253,0 142472 189970 /lib/ld-2.12.so




10. Завершение всей активности конкретного пользователя




Иногда вам может потребоваться завершить все процессы для конкретного пользователя. Команда ниже завершает все процессы пользователя sedicomm:




# kill -9 `lsof -t -u sedicomm`




Примечание: здесь невозможно привести пример всех доступных опций, это руководство знакомит вас, как можно использовать команду lsof. Вы можете обратиться к странице справки команды lsof, чтобы узнать больше: man lsof.




Источник: https://blog.sedicomm.com/2020/03/19/10-primerov-komand-lsof-v-linux/



2022-04-23T02:29:41
Утилиты командной строки

Установка и настройка Harbor

В данной статье рассмотрим, как установить и настроить хранилища репозиториев Harbor.




Установка хранилища репозиториев Harbor




Harbor устанавливается как Docker-образ с помощью online installer.




Чтобы установить хранилища репозиториев Harbor:




  1. Скачайте скрипт online installer и разархивируйте его:




root@ubuntu-standard-2-4-40gb:~# wget https://github.com/goharbor/harbor/releases/download/v1.9.3/harbor-online-installer-v1.9.3.tgz 

root@ubuntu-standard-2-4-40gb:~# tar -zxvf harbor-online-installer-v1.9.3.tgz




  1. В получившейся папке harbor настройте файл harbor.yml:




hostname: <SERVER_DNS_NAME>

http:

  # port for http, default is 80. If https enabled, this port will redirect to https port

  port: 8080

# https related config

 https:

#   # https port for harbor, default is 443

   port: 8443

#   # The path of cert and key files for nginx

   certificate: /opt/gitlab/config/ssl/<SERVER_DNS_NAME>.crt

   private_key: /opt/gitlab/config/ssl/<SERVER_DNS_NAME>.key

# The default data volume

data_volume: /opt/harbor




Причем:




  • Имя хоста совпадает с именем Gitlab, так как развертывание выполняется на сервере, на котором находится Gitlab.
  • Используем нестандартные HTTP- и HTTPS-порты, так как стандартные используются веб-интерфейсом Gitlab. 
  • Использует сертификат и ключ LetsEncrypt, которые были созданы при настройке Gitlab.




  1. Выполните скрипт install.sh:




root@ubuntu-standard-2-4-40gb:~/harbor# ./install.sh



[Step 0]: checking installation environment ...

Note: docker version: 19.03.5

Note: docker-compose version: 1.25.0



[Step 1]: preparing environment ...

[Step 2]: starting Harbor ...

Creating harbor-log ... done

Creating registryctl ... done

Creating redis ... done

Creating harbor-db ... done

Creating harbor-portal ... done

Creating registry ... done

Creating harbor-core ... done

Creating nginx ... done

Creating harbor-jobservice ... done



✔ ----Harbor has been installed and started successfully.----




Harbor запущен.




Настройка хранилища репозиториев Harbor




  1. Авторизуйтесь в Harbor. 




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




https://<SERVER_DNS_NAME>:8443




Логин по умолчанию admin. Первичный пароль задается в файле harbor.yml (по умолчанию — Harbor12345).










  1. Смените пароль пользователя admin. Для этого в правом верхнем углу нажмите на admin и выберите Change Password:










  1. Укажите текущий и новый пароли:










Создайте пользователя, от имени которого Gitlab будет работать с Harbor. Для этого слева выберите Users:**







**




Укажите данные нового пользователя:**







**




Внимание




Запомните введенный для пользователя пароль, он потребуется для интеграции с Gitlab.




  1. Создайте новый проект, в который будут складываться собранные образы из Gitlab. Для этого слева выберите Projects:




**







**    




  1. Введите данные нового проекта:




**







**




7. Добавьте пользователя в проект:**







**




8. Укажите для пользователя имя и роль:**









Установка и настройка Harbor

В данной статье рассмотрим, как установить и настроить хранилища репозиториев Harbor.




Установка хранилища репозиториев Harbor




Harbor устанавливается как Docker-образ с помощью online installer.




Чтобы установить хранилища репозиториев Harbor:




  1. Скачайте скрипт online installer и разархивируйте его:




root@ubuntu-standard-2-4-40gb:~# wget https://github.com/goharbor/harbor/releases/download/v1.9.3/harbor-online-installer-v1.9.3.tgz 

root@ubuntu-standard-2-4-40gb:~# tar -zxvf harbor-online-installer-v1.9.3.tgz




  1. В получившейся папке harbor настройте файл harbor.yml:




hostname: <SERVER_DNS_NAME>

http:

  # port for http, default is 80. If https enabled, this port will redirect to https port

  port: 8080

# https related config

 https:

#   # https port for harbor, default is 443

   port: 8443

#   # The path of cert and key files for nginx

   certificate: /opt/gitlab/config/ssl/<SERVER_DNS_NAME>.crt

   private_key: /opt/gitlab/config/ssl/<SERVER_DNS_NAME>.key

# The default data volume

data_volume: /opt/harbor




Причем:




  • Имя хоста совпадает с именем Gitlab, так как развертывание выполняется на сервере, на котором находится Gitlab.
  • Используем нестандартные HTTP- и HTTPS-порты, так как стандартные используются веб-интерфейсом Gitlab. 
  • Использует сертификат и ключ LetsEncrypt, которые были созданы при настройке Gitlab.




  1. Выполните скрипт install.sh:




root@ubuntu-standard-2-4-40gb:~/harbor# ./install.sh



[Step 0]: checking installation environment ...

Note: docker version: 19.03.5

Note: docker-compose version: 1.25.0



[Step 1]: preparing environment ...

[Step 2]: starting Harbor ...

Creating harbor-log ... done

Creating registryctl ... done

Creating redis ... done

Creating harbor-db ... done

Creating harbor-portal ... done

Creating registry ... done

Creating harbor-core ... done

Creating nginx ... done

Creating harbor-jobservice ... done



✔ ----Harbor has been installed and started successfully.----




Harbor запущен.




Настройка хранилища репозиториев Harbor




  1. Авторизуйтесь в Harbor. 




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




https://<SERVER_DNS_NAME>:8443




Логин по умолчанию admin. Первичный пароль задается в файле harbor.yml (по умолчанию — Harbor12345).










  1. Смените пароль пользователя admin. Для этого в правом верхнем углу нажмите на admin и выберите Change Password:










  1. Укажите текущий и новый пароли:










Создайте пользователя, от имени которого Gitlab будет работать с Harbor. Для этого слева выберите Users:**







**




Укажите данные нового пользователя:**







**




Внимание




Запомните введенный для пользователя пароль, он потребуется для интеграции с Gitlab.




  1. Создайте новый проект, в который будут складываться собранные образы из Gitlab. Для этого слева выберите Projects:




**







**    




  1. Введите данные нового проекта:




**







**




7. Добавьте пользователя в проект:**







**




8. Укажите для пользователя имя и роль:**









Настройка фаервола — Nftables

В этой статье я покажу вам, как настраивается фаервол (netfilter) на сервере Debian 11 или Ubuntu 22.04 при помощи инструмента nftables.





Читать

Решатель судоку с графическим интерфейсом на Python

Решатель судоку в Python — это упражнение или проект начального уровня для студентов колледжей. Написание кода для решения судоку с использованием языка Python делает его проще и проще.

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

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

 

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

Мы будем создавать решатель судоку с графическим интерфейсом, используя IDE Jetbrains Pycharm . Поскольку мы создаем впечатляющее решение для судоку с графическим интерфейсом, мы импортируем библиотеку Tkinter. Давайте начнем:

 

Импорт библиотеки и написание кода

Импортируйте все из Tkinter и создайте экземпляр для окна Tkinter. Установите заголовок окна как «Решатель судоку». Теперь задайте размеры окна с помощью метода Geometry. Мы принимаем размеры окон как 324×550 пикселей.

Создайте метку, которая будет указывать на использование программы. Поместите метку в 0-ю строку и первый столбец, используя метод сетки. Установленный диапазон столбца, равный 10, центрирует метку в окне.

Теперь создайте еще одну метку, которая будет использоваться, если головоломка судоку не может быть решена, и инициализируйте ее пустой строкой. Цвет переднего плана для метки ошибки в нашем случае будет красным. Используйте метод Grid, чтобы поместить метку в 15-ю строку и 1-й столбец, диапазон столбцов до 10 и отступы до 5.

Создайте метку для успеха решения судоку. Вы можете скопировать код предыдущей метки, изменить цвет переднего плана на зеленый и назвать метку решенной.

Давайте создадим пустой словарь для хранения каждой ячейки входной сетки. Определите функцию проверки для управления вводом в ячейки. В качестве аргумента принимает значение ячейки.

Блок кода:

from tkinter import *

root = Tk()

root.title("Решатель судоку")

root.geometry("324x550")



label = Label(root, text="Заполните цифры и нажмите кнопку решить").grid(row=0, column=1, columnspa=1)



errLabel = Label(root, text="", fg="red") errLabel.grid(row=15, column=1, columnspan=10, pady=5)



solvedLabel = Label(root, text="", fg="green")

solvedLabel.grid(row=15, column=1, columnspan=10, pady=5)

Напишите функцию проверки

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

Блок кода:

cells = {}

def ValidateNumber(P):

out = (P.isdigit() or P == "") and len(P) < 2

return out

Регистрация функции и написание другой функции для разделения судоку на сетки 3×3

Зарегистрируйте функцию в окне, используя метод корневой регистрации. Разделите сетку судоку 9 × 9 на более мелкие фрагменты 3 × 3, написав функцию. Это примет номер строки, номер столбца и цвет фона в качестве аргумента.

Используйте цикл for с диапазоном из трех, который будет указывать строки. Используйте другой цикл for внутри него, чтобы указать столбцы. Теперь создайте виджет ввода шириной 5, bg в качестве цвета фона, а по центру выровняйте текст с помощью Justify. Кроме того, подтвердите клавишу, чтобы подтвердить функцию при нажатии клавиши.

Подтвердите команду кортежем зарегистрированной функции и кода подстановки %P, который передаст новое значение в функцию при изменении. Поместите виджет на сумму номера строки как i+1 строку и сумму номера столбца как j+1. Вы можете установить прилипание к новому, что сделает его липким со всех сторон. Установите для padx и pady значение 1, а для внутреннего заполнения значение 5.

Теперь сохраните виджет записи в словаре с кортежем номеров строк и столбцов, которые мы использовали для размещения виджета в качестве ключа.

Блок кода:

reg = root.register(ValidateNumber)

defdraw3x3Grid(row, column, bgcolor):

for i in range(3):

forj in range(3):

e = Entry(root, width=5, bg=bgcolor, justify="center", validate="key", validatecommand=(reg,"%P"))



e.grid(row=row+i+1, column=column+j+1, sticky="nsew", padx=1, pady=1, ipady=5) 

cells[(row+i+1, column+j+1)] = e

Напишите функцию для рисования сетки 9 × 9

Мы напишем функцию для создания сетки 9×9. Мы использовали двухцветную комбинацию для этой сетки. Первый цвет означает значение. Используйте цикл for в диапазоне 1, 10 и размер шага 3 для строки №. Используйте другой цикл for внутри с диапазоном 0, 9 с размером шага 3.

Теперь вызовите функцию 3×3 и передайте номер строки, номер столбца и цвет. Чтобы чередовать цвета, используйте условие if. Если значением переменной цвета является первый цвет, мы установим его на второй цвет. В противном случае мы установим его на первый цвет. При написании цветовых кодов следите за регистром букв.

Блок кода:

def draw9x9Grid():

color = "#D0MT"

for rowNo in range(1, 10, 3):

for colNo in range(0, 9, 3):

draw3x3Grid(rowNo, colNo, color)

if color == "#Doffff":

color = "#ffffd0"

else:

color = "#Doffff"

 

Напишите функцию для очистки судоку

Мы напишем функцию очистки значений для судоку, которая очистит значения в каждой ячейке сетки. Во-первых, удалите ошибки и метки успеха. Опять же, повторите строки и столбцы. Диапазон для строки будет 2, 11, а диапазон для столбцов будет 1, 10.

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

Блок кода:

defclearValues():

errLabel.configure(text="")

solvedLabel.configure(text="")

for row in range(2, 11):

for col in range(1, 10):

cell = cells[(row, col)]

cell.delete(0, "end")

 

Напишите функцию для получения ввода от пользователя

Напишите функцию получения значений и объявите пустой список для хранения значений для каждой ячейки для каждой строки. Снова очистите все метки, чтобы очистить текст, если он есть. Используйте цикл for для перебора диапазона 2, 11 для строк и 1, 10 для столбцов. Теперь получите значение ячеек, используя метод get виджетов ввода. Если значение представляет собой пустую строку, мы добавим 0 к списку строк. В противном случае добавьте в список целочисленное значение.

После окончания цикла добавьте список строк в список доски.

Блок кода:

defgetValues():

board = []

errLabel.configure(text="")

solvedLabel.configure(text="")

for row in range(2, 11):

rows = []

for col in range(1, 10):

val = cells[(row, col)].get()

if val = ""

rows. append(0)

else:

rows.append(int(val))

board.append(rows)

 

Написание кода для кнопок

Используя виджет кнопки, создайте кнопку. Установите команду для получения значений, текста для решения и ширины на 10. Теперь поместите кнопку в 20-ю строку и первый столбец с диапазоном столбцов 5, как 20.

Создайте еще одну кнопку, скопировав тот же код, установите ее команду на очистку значений и текст на очистку. Поместите эту кнопку в 5-й столбец.

Блок кода:

btn = Button(root, command=getValues, text="Solve", width=10)

btn.grid(row=20, column=1, columnspan=5, pady=20)



btn = Button(root, command=clearValues, text="Clear", width=10)

btn.grid(row=20, column=1, columnspan=5, pady=20)

 

Вызов функций

Вызовите функции сетки 9×9 и метод основного цикла root, чтобы запустить экземпляр нашего созданного окна.

draw9x9Grid()

root.mainloop()

 

Написание кода

Сначала мы объявим переменную, которая будет содержать количество строк и столбцов. Напишите вопрос, который будет проверять данное число для данной строки или столбца. Это примет судоку, номер строки, номер столбца и номер в качестве аргументов. Чтобы проверить, существует ли такое же число в той же строке, мы будем использовать цикл for в диапазоне 9. Условие цикла for выглядит следующим образом: если номер данной строки и i-го столбца равен num, мы вернемся ЛОЖЬ.

Точно так же мы проверим, существует ли такое же число в том же столбце. Используйте цикл for в диапазоне 9. Если номер данного столбца и j-й строки равен num, мы вернем false.

Теперь нам нужно проверить, существует ли такое же число в его конкретной сетке 3×3. Начальная строка будет строкой, вычтенной из модуля строки 3. Начальным столбцом будет столбец, вычтенный из модуля столбца 3.

Используйте два вложенных цикла в диапазоне от трех. Если число в начальной строке плюс i-я строка и начальный столбец плюс j-й столбец равны num, мы вернем False. В конце функции мы вернем True, которая будет выполнена, если ни одно из предыдущих условий не будет выполнено.

Блок кода:

N = 9



defisSafe(sudoku, row, col, num):

for i in range(9):

ifsudoku[row][i] - num:

return False



for i in range(9):

ifsudoku[i][col] == num:

return False



startRow = row - row % 3

startCol = col - col % 3

for i in range(3):

for j in range(3):

ifsudoku[startRow + i][startCol + j] =num:

return False

return Truc

 

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

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

Давайте проверим, равна ли строка N-1, а столбец равен n. Если условие преобладает, мы вернем true. Это условие будет базовым, так как мы будем использовать рекурсию для решения головоломки. После того, как последний столбец будет достигнут, мы перейдем к следующему столбцу. Если столбец равен n, мы добавим единицу к строке и установим столбец обратно в ноль. Теперь мы проверим, присвоен ли номер текущему местоположению.

Если число в данной строке и столбце больше нуля, мы вернем функцию решения судоку для следующего столбца. Используйте цикл for в диапазоне 1, N+1 для проверки каждого числа от 1 до 9.

Теперь мы проверим, можно ли присвоить это число заданной строке и столбцу, используя функцию, которую мы написали ранее. Если можно присвоить номер, мы присвоим его в судоку. Допустим, присвоенный номер правильный. Мы также проверим возможность со следующей колонкой.

В блоке кода циклов мы переназначим 0, поскольку наше предположение было неверным, и оно подтверждает следующее значение. Верните false в конце блока кода функций.

Блок кода:

startCol = col - col % 3 

for i in range(3):

for j in range(3):

if sudoku[startRow + i][startCol + j] == num:

return False

return True







defsolveSudoku(sudoku, row, col):

ifrow== N - 1 and col == N:

return True



ifcol == N: 

row += l 

col = 0



ifsudoku[row][col] > 0:

return solveSudoku(sudoku, row, col + 1)

for num in range(1, N + 1):

if isSafe(sudoku, row, col, num):

sudoku[row][col] = num



if solveSudoku(sudoku, row, col + 1):

return True



sudoku[row][col] = 0

return False

 

Напишите функцию для решенной судоку

Мы напишем функцию, которая будет возвращать решенную судоку, если она разрешима. Это примет судоку в качестве аргумента. Чтобы узнать, разрешима ли судоку, используйте условие if. Мы вернем судоку, если это разрешимо. В противном случае мы вернем No.

Сохраните этот файл как Solver.py в той же папке, где вы сохранили файл GUI.

Блок кода:

det solver(sudoku):

if solveSudoku(sudoku, 0, 0):

return sudoku

else:

return "no"

 

Импорт функции решения в файл GUI

Откройте файл GUI и импортируйте функцию решения из файла Solver.py. Напишите функцию обновления значений, которая будет обновлять ячейки и отображать решение судоку. В качестве аргумента будет использоваться матрица судоку.

Вызовите функцию решения и передайте ей судоку. Если решение не равно NO, используйте цикл for в диапазоне 2, 11. Внутри цикла for используйте другой цикл for с диапазоном 1, 10. Удалите существующие значения из ячейки. Используйте метод вставки, чтобы вставить значение в 0-й индекс.

Значением будет число строк минус вторая строка и столбец минус первый столбец. Вычитаем 2 и 1 соответственно, так как матрица нулевая.

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

from tkinter import * 

from solver import solve 

root = Tk() 

root.title("Решатель судоку") 

root.geometry("324x550")

 

Вызов значений обновления

Вызовите функцию получения значений в конце и передайте матрицу доски.

На данный момент наша окончательная программа готова к выполнению.

 

Вывод

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

Этот пост разделен на части для удобства сопровождения кода. Надеюсь, вам понравилось читать эту статью.



2022-04-22T16:08:31
Python

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

МСП и фрилансеры

Несмотря на то, что большое количество компаний (любого размера), учреждений, организаций и фрилансеров работают с Microsoft Windows и многочисленным и разнообразным проприетарным программным обеспечением, GNU/Linux также может иметь пробел, как и свободное программное обеспечение с открытым исходным кодом. На самом деле такого рода программное обеспечение может иметь фантастические преимущества для малого и среднего бизнеса и фрилансерови даже для крупных корпораций.

Кроме того, после пандемического кризиса не платить лицензии Это также может быть огромным преимуществом в снижении расходов практически любой гильдии и типа colectivos, но это не единственная положительная вещь, которую могут внести это программное обеспечение и операционные системы GNU/Linux. С другой стороны, избитый стереотип бесплатного программного обеспечения = низкое качество иссякает аргументы…



Читать