Сообщения

Сообщения за 2021

Почему часто используют шестнадцатеричное представление для бинарных данных

Я раньше непонимал почему его вообще используют и зачем оно нужно. На самом деле это самый удобный способ представления бинарных данных человеку. Поскольку бинарная куча неразборчива для человека. Для него все эти единицы и нули сливаются в одну непонятную кучу. Поэтому использование hex для визуальной инспекции бинарной последовательности более удобно. Как мы все знаем 1 байт это 8 бит. 1 бит это 2 возможных значения (1 и 0). Получается 8 позиций по 2 размещения. То есть в 1 байте есть 2^8 (256) возможных состояния. Hex имеет 16 состояний 0-9 и A-F. 0--9 стостояний получается 10, и A-F (ABCDEF (6 стостяний)). И так удобно получилось что если вы расставите 2 hex символа то получится 16*16=256 комбинаций.

Пропускаем звук с микрофона android в Ubuntu

Изображение
Покопавшись в интернете я нашел много разных туториалов которые показывают методы пропуска звука через mumble сервер и клиент мамбла на телефоне, пропориетарнаый софт WO Mic , и много других. Все эти варианты требуют установки слишком много дополнительных пакетов, либо пропориетарны и написаны непонятно кем. Вдруг в WO Mic есть ратник, как то это все небезопасно. В репозитории варианта с mumble сервер я нашел  https://github.com/MatthiasCoppens/pulseaudio-virtualmic . Этот вариант не требует установки никаких дополнительных или пропориетарных пакетов на ПК. Он может пропускать звук из внешнего источника (например http сервера стримещего mp3). Используя этот скрипт + приложения LANmic  у меня получилось стримить микрофон с телефона на ПК. В настройках звука убунты мне просто потребовалось выбрать как вход этот unix сокет. В остальных вариантах звук всегда доходил с задержкой, но используя этот скрипт задержка минимальна и даже не чувствуется. Хотя если открыть стрим например LANmic нап

How to install trusted certificate from charlesproxy on Chrome Ubuntu 2021

Изображение
When you use charlesproxy and don't configure charlesproxy's CA as trusted ssl you will get this error in chrome: That happens because chrome detect that the SSL certificate is being replaced to some self signed CA. To fix this error you need to export your certificate from charlesproxy, and add it to the chrome's "Authorities" tab. The most important thing is to export the certificate in .CER format, not in .PEM as set by default. Chrome has troubles reading PEM, the only working format is CER. Then go to the chrome's ssl settings page  chrome://settings/certificates and go to the "Authorities" tab: The default chrome's file browser will not show you .cer files, you need to change the file browser's settings to show all files. The .cer file will appear and you need to chose it: Then on the chrome's check "Trust this certificate for identifying websites": After that, the https error page must be gone because chrome now trusts

Python requests ошибка SSL соединения

Изображение
У некоторых сайтов с неправильно настроенным SSL сервером могут возникать проблемы соединеня. В моем случае было странно то что я мог посетить веб сайт через браузер и никаких ошибок не вознкало, но когда я пытался отправить запрос через командную строку curl или скриптом питона то возникала ошибка SSL соединения. Я изучил в чем была проблема, оказалось что в браузерах есть встроенная система востановления недостающих SSL сертификатов. В моем случае была проблема в том что сервер не отдавал промежуточный сертификат. Браузер искал его по своей внутренней базе данных и смог восстановить его. Но у небраузеров такой функции небыло. Вы можете проверить тожесамое посетив сайт https://incomplete-chain.badssl.com . Если вы попробуете послать на него запрос через curl то получите ошибку. Чтобы исправить эту ошибку посылайте запрос с verify=False .

Django генерирование рандомных имён загруженным файлам FileField

В одном из моих проектов мне потребовалось реализовать загрузку пользовательских файлов через форму. Я использовал обычный FileField как советуют во всех туториалах, с стандартной конфигурацией. Пользователи загружали файлы, и все работало хорошо. Но затем я заметил проблему - делов в том что имя файла на сервере совпадало с именем файла которое загрузил пользователь. То есть, например если пользователь загружает картинку 1.png, то его картинка будет доступна по ссылке /uploads/1.png. Проблема этого подхода в том что в таких случаях имя файла можно будет просто перебрать и находить чужие файлы. Например, собрать огромный список стандартных названий файлов, и перебирать их в целях найти чужие файлы. Чтобы исправить эту проблему нужно просто использовать случайные имена файлов. Но дело в том что по умолчанию FileField нигде не сохраняет оригинальное имя файла. Оригинальное имя файла придётся сохранять отдельным полем в моделях. @csrf_exempt @login_required def upload_file (request, s

Как получить тип файла по расширению файла в python

Мне потребовалось угадывать тип файлов по их расширению. Для этого хорошо подошла библиотека mimetypes . На моем сервере находились файлы, например http://google.com/123.mp4. Мне нужно было делать определенные действия с определенными типами файлов. Это можно делать через guess_type: mimetypes . guess_type ( 'http://g.co/123.jpg' ) Полный список поддерживаемых типов находится тут:  https://www.iana.org/assignments/media-types/media-types.xhtml . В моем случае мне потребовалось просто захардкодить if на image/png, image/jpeg, video/mp4. Но такой метод не дает 100% гарантии что тип файла на самом деле будет mp4. Библиотека лишь пытается предугадать тип по расширению файла. Но если файл оканчивается на mp4, никто не давал гарантии что внутри на самом деле не php код например. Если вам нужно 100% знать что файл на самом деле имеет тип то нужно использовать утилиты для файлов. Например для картинок - ImageMagic, для видео - ffmpeg. Они уже проверят так же внутренюю структуру файла п

Как исправить ошибку docker-compose invalid argument for "-t, --tag" flag: invalid reference format

Когда я создавал очередной свой проект, я решил дать ему название на русском. Оказывается докер не дружит с русским языком и у меня вышла ошибка:  invalid argument "_web" for "-t, --tag" flag: invalid reference format . Решением проблемы было просто переименовать название папки на английское.

Как создать загрузочную флешку Windows 10 с Ubuntu 2021

Изображение
Как бы не был хорош Linux, но от Windows никуда не дется. И мне потребовалось создать загрузочную флешку Windows 10, с Ubuntu. Для создания загрузочной флешки нужно скачать ISO образ WIndows 10 . При помощи WoeUsb можно создать загрузочную флешку. Чтобы установить WoeUSB нужно скачать один из баш скриптов с релизов на гитхабе  https://github.com/WoeUSB/WoeUSB/releases . Затем дать права на исполнение через chmod +x имяфайла.bash . На убунту так же требуется установить wimtools: sudo apt install wimtools . Дале нужно найти айди девайса флешки. Для этого нужно выполнить lsblk -p , и в результате будет список: Понять что из этого флешка можно по размерам. В моем случае нужен  /dev/sdc  не /dev/sdc1. Тк цифра в конце означает номер раздела, а нам нужен только девайс. Отсоединяем флешку от файловой системы: umount /dev/sdc1 И можно начать запись на флешку: sudo ./woeusb-5.1.2.bash --device Win10_21H1_English_x64.iso /dev/sdc Теперь нужно подождать пока цифра внизу станет 100. В итоге у вас

Django migrations не видит изменения моделей

Изображение
В некоторых случаях python manage.py makemigrations может выдавать сообщение No changes detected: Если у вас на самом деле были изменения в моделях, но Django не видит изменений это свидетельстует о проблеме. В моих случаях решения были такие: Приложения нету в INSTALLED_APPS Если вы не добавили свое приложения в него, то Django неможет видеть ваши модели. Нарушена структура приложения Иногда вам хочется удалить папку migrations, чтобы с нуля создать все миграции. Так делать нельзя, это плохая практика. Так можно делать только когда вы разрабатываете локально, и не хотите создавать кучу лишних миграций. А просто создать все заново. При удалении папки migrations у вас будет выходить такое сообщение постоянно. Чтобы исправить, нужно создать самому папку migrations, и в ней создать файл __init__.py. При помощи __init__.py питон понимает что это не просто папка, а модуль питона.

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

Большинство гайдов описывают как принимать биткоины через платёжные шлюзы, но они имеют свои коммисии, которых можно избежать. Биткоин в отличии от банковской системы не требует наличия экваринга и договоров с банками для проведения оплат услуг. Все что вам нужно - генерировать биткоин адрес (это просто ECDSA публичный и приватный ключи), записывать его куда-то в БД и при нажати пользователем кнопки "проверить оплату" через блокчейн браузеры проверить оплату. Тем самым для проведения оплат вам даже не нужно держать full node у себя на сервере. Конечно при больших нагрузках лучше установить себе на компьютер full node, чтобы избежать тротлинга API. В питоне для целей генерации адресса, проверки оплат есть минималистичная библиотека - Bit . Key это основной объект этой библиотеки, в нем происходят все действия с кошельком. Генерация, получение приватного ключа, публичного ключа. Например простая генерация биткоин кошелька: >>> from bit import Key >>> my_k

Как делать бекапы postgres в docker контейнере

Мне нужно было как-то делать бекапы постгрес который находится в докере.  0 8 * * * docker-compose exec database pg_dump -O -F p -U dbname > /root/backups/dump_ ` date +%d-%m-%Y "_" %H_%M_%S ` .sql Для этого я написал такой крон таск который сохраняет в директорию /root/backups sql дамп базы данных. Такой скрипт подходит только для средних проектов, размер БД которых не больше 10 гигабайт, иначе всё будет тормозить. Если размер БД огромный, то придётся записывать сразу в файл, и закидывать на хост через волюм. Но в большинстве случаев подобный скрипт отлично работает. Для его установки нужно написать crontab -e, и в редакторе ввести код приведённый выше. "0 8 * * *" означает каждые 8 часов. Вы можете сгенерировать кастомный интервал через сервис  https://crontab.guru/ .

Как работает биткоин, очень простым языком

Изображение
Мне всегда было интересно как работает биткоин, но все статьи слишком упрощали, либо усложняли термины. И в итоге невозможно было понять как на самом деле работает биткоин. Если вы не можете запрограммировать это, значит вы не знаете как оно работает. В следующей статье я покажу как сделать простейшую POW криптовалюту на питоне. В этой статье мы рассмотрим основные принципы по которым можно создать криптовалюту как биткоин. В биткоин есть более глубокие моменты, в которые не обязательно знать чтобы понимать как он работает. В статье есть очень много терминов, и если вам что-то не понятно то можно задать вопрос в комментариях, или просто попробуйте получить больше информации в интернете по интересующей вас теме. Откуда берутся адреса в биткоине В основе большинства криптовалют стоит ассимитричная криптография. Ассимитричная криптография означает что есть публичный ключ, и приватный. Можно сказать что публичный ключ это логин, а приватный это пароль. Зная пароль вы можете подписывать про

Визуализация схемы БД через утилиту schemacrawler

Изображение
Многие иногда сталкиваются с тем что нужно нарисовать структуру таблиц для своего веб приложения, например для технической документации вроде такой: Это нужно делать руками если структура БД еще не создана, но что если вам нужно написать документацию для уже созданного приложения? Обычно я рисовалки схемы руками через рисовалки схем вроде draw.io , но недавно я нашел инструмент для авто генерации таких иллюстраций бесплатно, и в формате png.  Эта утилита называется  https://www.schemacrawler.com/ . По началу я хотел установить ее на свою систему через apt-get, но потом понял что можно просто использовать docker. На примере sqlite базы даных мы рассмотрим как сгенерировать такую иллюстрацию в формате png. Для начала нужно cd в директорию с вашей БД sqlite, затем выполнить команду для запуска контейнера: sudo docker run -v $( pwd ) :/home/ -w /home/ -it schemacrawler/schemacrawler /bin/bash Далее будет шелл контейнера, в нем нужно запустить: /opt/schemacrawler/schemacrawler.sh --command