Библиотеки бывают двух видов — статические и динамические. Код первых при компиляции полностью входит в состав исполняемого файла, что делает программу легко переносимой. Код динамических библиотек не входит в исполняемый файл, последний содержит лишь ссылку на библиотеку. Если динамическая библиотека будет удалена или перемещена в другое место, то программа работать не будет. С другой стороны, использование динамических библиотек позволяет сократить размер исполняемого файла. Также если в памяти находится две программы, использующие одну и туже динамическую библиотеку, то последняя будет загружена в память лишь единожды.
Динамическая библиотека это фактически исполняемый файл (т.е. DLL и EXE в Windows имеют одинаковый формат). Динамическая линковка запускается в момент создания процесса (когда вы запускаете исполняемый файл на выполнение), линкуются между собой несколько исполняемых файлов каждый раз, когда создается новый процесс. Так же возможна динамическая линковка уже после запуска, т.е. новая библиотека может быть подгружена в адресное пространство ужа работающего процесса.
Сделать из статической библиотеки динамическую в принципе можно - необходимо ее (статически) слинковать в динамическую библиотеку, при этом будет создана динамическая библиотека и статическая стаб-библиотека, которую можно использовать в проекте вместо статической библиотеки, чтобы вызывать функции из динамической библиотеки.
Статическую библиотеку создать проще. Она создается из обычных объектных файлов путем их архивации с помощью утилиты ar.
Объектные файлы для динамической библиотеки компилируются особым образом. Они должны содержать так называемый позиционно-независимый код (position independent code). Наличие такого кода позволяет библиотеке подключаться к программе, когда последняя загружается в память. Это связано с тем, что библиотека и программа не являются единой программой, а значит как угодно могут располагаться в памяти относительно друг друга. Компиляция объектных файлов для динамической библиотеки должна выполняться с опцией -fPIC компилятора C++.
Динамическая библиотека это фактически исполняемый файл (т.е. DLL и EXE в Windows имеют одинаковый формат). Динамическая линковка запускается в момент создания процесса (когда вы запускаете исполняемый файл на выполнение), линкуются между собой несколько исполняемых файлов каждый раз, когда создается новый процесс. Так же возможна динамическая линковка уже после запуска, т.е. новая библиотека может быть подгружена в адресное пространство ужа работающего процесса.
Сделать из статической библиотеки динамическую в принципе можно - необходимо ее (статически) слинковать в динамическую библиотеку, при этом будет создана динамическая библиотека и статическая стаб-библиотека, которую можно использовать в проекте вместо статической библиотеки, чтобы вызывать функции из динамической библиотеки.
Статическую библиотеку создать проще. Она создается из обычных объектных файлов путем их архивации с помощью утилиты ar.
Объектные файлы для динамической библиотеки компилируются особым образом. Они должны содержать так называемый позиционно-независимый код (position independent code). Наличие такого кода позволяет библиотеке подключаться к программе, когда последняя загружается в память. Это связано с тем, что библиотека и программа не являются единой программой, а значит как угодно могут располагаться в памяти относительно друг друга. Компиляция объектных файлов для динамической библиотеки должна выполняться с опцией -fPIC компилятора C++.
1👍2🔥2 2 1
Роадмап изучения ООП в Python 🐍
Объектно-ориентированное программирование (ООП) — это парадигма программирования, где различные компоненты компьютерной программы моделируются на основе реальных объектов. Объект — это что-либо, у чего есть какие-либо характеристики и то, что может выполнить какую-либо функцию. Главным понятием ООП является понятие программного объекта. Вообще говоря, большинство сущностей на планете Земля – это некие объекты. И с частью из них мы взаимодействуем при помощи программирования. Банковский счёт, персонаж компьютерной игры или анимированный виджет сайта – всё это легко представить в виде объектов. Можно сказать, что объектно-ориентированное программирование позволяет смоделировать реальный объект в виде программного.
Роадмап:
Объектно-ориентированное программирование (ООП) — это парадигма программирования, где различные компоненты компьютерной программы моделируются на основе реальных объектов. Объект — это что-либо, у чего есть какие-либо характеристики и то, что может выполнить какую-либо функцию. Главным понятием ООП является понятие программного объекта. Вообще говоря, большинство сущностей на планете Земля – это некие объекты. И с частью из них мы взаимодействуем при помощи программирования. Банковский счёт, персонаж компьютерной игры или анимированный виджет сайта – всё это легко представить в виде объектов. Можно сказать, что объектно-ориентированное программирование позволяет смоделировать реальный объект в виде программного.
Роадмап:
Объекты и классы
Атрибуты (Setattr, getattr, delattr, dict)
Инициализация объектов и аргумент self
Свойства (getter, setter, deleter)
Dunder методы (get, set)
Статические методы (@staticmethod)
Slots - оптимизируем потребление памяти
Dunder метод (New)
Методы класса (@classmethod)
Инкапсуляция - публичные, приватные и защищенные атрибуты
Моносостояние - принцип работы
Полиморфизм на примере (@singledispatch)
Dunder методы (str, repr, len, del)
Dunder методы (bool, bytes, float, int)
Dunder методы (pow, reversed, truediv)
Dunder методы (next, iter, call)
Контекстный менеджер в классе используя (enter, exit)
Dunder методы (add, sub, eq, hash)
Работа с атрибутами (hasattr, getattr)
Dunder методы (getitem, setitem, delitem, mul)
Наследование и перегрузка методов
Разбираем (isinstance, issubclass, getsizeof)
Переопределение методов родителя
Дата-классы (@dataclass)
Множественное наследование (mro, vars, callable, super)
Абстрактные методы (ABCMeta, abstractmethod)
Декораторы классов
Динамическое редактирование класса
Метаклассы
5 3🔥2
❤️ Спасибо, друзья!
Вам уже 169 подписчиков. Звезды, бусты, наш канал развивается. Когда он был просто блогом-архивом (что можно понять по юзернейму @hex_warehouse - шестнадцатеричный склад). А сейчас благодаря вам канал стал развиваться.
Спасибо вам!
Напишите в комментариях то, о чем хотите пост, или просто пожелания каналу.
Спасибо!
Вам уже 169 подписчиков. Звезды, бусты, наш канал развивается. Когда он был просто блогом-архивом (что можно понять по юзернейму @hex_warehouse - шестнадцатеричный склад). А сейчас благодаря вам канал стал развиваться.
Спасибо вам!
Напишите в комментариях то, о чем хотите пост, или просто пожелания каналу.
Спасибо!
10 5🔥2❤1👍1
Статья про создание своей ORM пишется полным ходом!
А пока можете поставить звезду репозиторию: https://github.com/alexeev-prog/SQLSymphony
На странице репозитория вы также можете уже попробовать протестировать библиотеку, установив ее.
А пока можете поставить звезду репозиторию: https://github.com/alexeev-prog/SQLSymphony
На странице репозитория вы также можете уже попробовать протестировать библиотеку, установив ее.
🔥2 2👍1👏1
Ruff — это новый быстроразвивающийся линтер Python-кода, призванный заменить flake8 и isort.
Основным преимуществом Ruff является его скорость: он в 10–100 раз быстрее аналогов (линтер написан на Rust).
Ruff может форматировать код, например, автоматически удалять неиспользуемые импорты. Сортировка и группировка строк импорта практически идентична isort.
Инструмент используется во многих популярных open-source проектах, таких как FastAPI и Pydantic.
Настройка Ruff осуществляется в файле pyproject.toml.
Для использования ruff как линтер можно использовать следующие команды:
Или как форматтер:
Основным преимуществом Ruff является его скорость: он в 10–100 раз быстрее аналогов (линтер написан на Rust).
Ruff может форматировать код, например, автоматически удалять неиспользуемые импорты. Сортировка и группировка строк импорта практически идентична isort.
Инструмент используется во многих популярных open-source проектах, таких как FastAPI и Pydantic.
Настройка Ruff осуществляется в файле pyproject.toml.
Для использования ruff как линтер можно использовать следующие команды:
ruff check # Lint all files in the current directory (and any subdirectories).
ruff check path/to/code/ # Lint all files in `/path/to/code` (and any subdirectories).
ruff check path/to/code/*.py # Lint all `.py` files in `/path/to/code`.
ruff check path/to/code/to/file.py # Lint `file.py`.
ruff check @arguments.txt # Lint using an input file, treating its contents as newline-delimited command-line arguments.
ruff check . --fix # Lint all files in current directory and fix
Или как форматтер:
ruff format # Format all files in the current directory (and any subdirectories).
ruff format path/to/code/ # Format all files in `/path/to/code` (and any subdirectories).
ruff format path/to/code/*.py # Format all `.py` files in `/path/to/code`.
ruff format path/to/code/to/file.py # Format `file.py`.
ruff format @arguments.txt # Format using an input file, treating its contents as newline-delimited command-line arguments.
ruff format . # Format all files in current directory
Valgrind является многоцелевым инструментом профилирования кода и отладки памяти для Linux на x86, и, начиная с версии 3 и AMD64. Это позволяет запускать программу в собственной среде Valgrind, что контролирует использование памяти, например, вызовы malloc и free (или new и delete в C++). Если вы используете неинициализированную память, записываете за пределами концов массива, или не освобождаете указатель, Valgrind может это обнаружить. Поскольку это наиболее распространенные проблемы, эта статья будет сосредоточена главным образом на использовании Valgrind для обнаружения простых проблем с памятью, хотя Valgrind — это инструмент, который может сделать гораздо больше.
http://cppstudio.com/post/4348/
http://cppstudio.com/post/4348/
5👍1🔥1 1 1
cppcheck — это проект статического анализа с открытым исходным кодом, ориентированный в первую очередь на нахождение реальных ошибок в коде с минимальным количеством ложных срабатываний.
cppcheck перестраховывается, причём планка адекватности высока. Большинство проверок cppcheck по умолчанию не включает. Среди них следующие категории проверок, каждая из которых может включаться/выключаться независимо:
error — явные ошибки, которые анализатор считает критическими и обычно они приводят к багам (включено по умолчанию);
warning — предупреждения, здесь даются сообщения о небезопасном коде;
style — стилистические ошибки, сообщения появляются в случае неаккуратного кодирования (больше похоже на рекомендации);
performance — проблемы производительности, здесь cppcheck предлагает варианты, как сделать код быстрее (но это не всегда даёт прирост производительности);
portability — ошибки совместимости, обычно связано с различным поведением компиляторов или систем разной разрядности;
information — информационные сообщения, возникающие в ходе проверки (не связаны с ошибками в коде);
unusedFunction — попытка вычислить неиспользуемые функции (мёртвый код), не умеет работать в многопоточном режиме;
missingInclude — проверка на недостающий #include (например, используем random, а подключить stdlib.h забыли).
Включаются проверки параметром --enable, список категорий проверок перечисляется через запятую.
Существует ключевое слово all, которое включает все перечисленные проверки.
И это ещё не всё. Если ваша программа безошибочна с точки зрения анализатора, попробуйте запустить cppcheck с параметром --inconclusive. Данный режим действительно включает все возможные проверки, даже ошибки с малой вероятностью, которые cppcheck пропускает по умолчанию.
Примеры использования:
cppcheck перестраховывается, причём планка адекватности высока. Большинство проверок cppcheck по умолчанию не включает. Среди них следующие категории проверок, каждая из которых может включаться/выключаться независимо:
error — явные ошибки, которые анализатор считает критическими и обычно они приводят к багам (включено по умолчанию);
warning — предупреждения, здесь даются сообщения о небезопасном коде;
style — стилистические ошибки, сообщения появляются в случае неаккуратного кодирования (больше похоже на рекомендации);
performance — проблемы производительности, здесь cppcheck предлагает варианты, как сделать код быстрее (но это не всегда даёт прирост производительности);
portability — ошибки совместимости, обычно связано с различным поведением компиляторов или систем разной разрядности;
information — информационные сообщения, возникающие в ходе проверки (не связаны с ошибками в коде);
unusedFunction — попытка вычислить неиспользуемые функции (мёртвый код), не умеет работать в многопоточном режиме;
missingInclude — проверка на недостающий #include (например, используем random, а подключить stdlib.h забыли).
Включаются проверки параметром --enable, список категорий проверок перечисляется через запятую.
Существует ключевое слово all, которое включает все перечисленные проверки.
Примечание. Параметры -j и режим проверки unusedFunction несовместимы, поэтому -j выключит проверку unusedFunction, даже если она указана явно.
И это ещё не всё. Если ваша программа безошибочна с точки зрения анализатора, попробуйте запустить cppcheck с параметром --inconclusive. Данный режим действительно включает все возможные проверки, даже ошибки с малой вероятностью, которые cppcheck пропускает по умолчанию.
Примеры использования:
cppcheck -q -j4 --enable=warning,style,performance,portability ./source
cppcheck -q --enable=all ./source
cppcheck -q --enable=all --inconclusive ./source
Решил ввести новую рубрику кибердек. Буду постить разные прикольные кибердеки
#CYBERDECK • PELICAN 1150
Источник
GitHub
#CYBERDECK • PELICAN 1150
От автора: Этот проект - моя первая попытка создать портативную cyberdeck с использованием Raspberry Pi 4 и корпуса Pelican 1150. Она спроектирована как полностью автономная, с водонепроницаемыми портами, встроенным аккумулятором и охлаждающими вентиляторами. Моим основным фокусом было создание изящной, функциональной системы для запуска различных сценариев и задач, таких как атаки BadUSB, при этом сохраняя все компактным и переносимым. В будущем я планирую добавить инструкции по сборке и электрические схемы.
7-дюймовый дисплей: встроенный для портативного использования
Работает под управлением Kali Linux: идеально подходит для задач кибербезопасности
Активная система охлаждения: 1x 30-миллиметровый вентилятор и 2x 18-миллиметровых вентилятора обеспечивают поток воздуха при открытом корпусе
3 порта USB: 2 внутренних и 1 внешний для периферийных устройств
Устройство чтения SD-карт: встроено для удобного доступа к хранилищу данных
Выход HDMI: Внешний порт для подключения к дисплею большего размера
Зарядка через USB-C: Удобный источник питания как для Pi, так и для экрана
Порт Cat5 Ethernet: Подключение к внешней сети для проводного доступа
Аудиоразъем: для подключения наушников или внешнего аудиосигнала
Индикаторы состояния:
Индикатор зарядки
Включение / выключение Raspberry Pi
Включение / выключение экрана
3 дополнительных настраиваемых светодиода
Переключатель питания экрана: Автоматически выключает экран при закрытии корпуса
Клавиатура: Встроенная для удобства использования
Отделения для хранения: Вмещают SD-карты и USB-накопители под клавиатурой
Встроенный аккумулятор: обеспечивает питание как Raspberry Pi, так и экрана для портативной работы
Водонепроницаемая конструкция: Герметична и защищена в закрытом состоянии
Источник
GitHub
🔥3 2
🌐 Настраиваем сетевой мост в Linux
Сетевой мост – представляет собой тип работы интерфейсов сетевого устройства, который объединяет сети на канальном уровне, позволяя коммуницировать узлам и конечным точкам между объединенными интерфейсами.
Принцип работы заключается, в том что создается на устройстве новое логическое, затем подключаются два и более физических или виртуальных интерфейсов.
Затем пакеты свободно проходят в две стороны, образуя единую канальную среду
🔗 Читать подробнее на Serverspace
Сетевой мост – представляет собой тип работы интерфейсов сетевого устройства, который объединяет сети на канальном уровне, позволяя коммуницировать узлам и конечным точкам между объединенными интерфейсами.
Принцип работы заключается, в том что создается на устройстве новое логическое, затем подключаются два и более физических или виртуальных интерфейсов.
Затем пакеты свободно проходят в две стороны, образуя единую канальную среду
🔗 Читать подробнее на Serverspace
Подборка SQL тренажеров для практики
Делимся подборкой тренажеров по SQL, которые помогут закрепить SQL на практике:
1. sql-academy.org
2. sql-ex.ru
3. schoolsw3.com
4. SQL Fiddle
5. sqltest.online
6. Oracle LiveSQL
7. stratascratch.com
8. sql-practice.com
9. HackerRank
10. sqlzoo.net
#SQL #тренажеры #полезное
Делимся подборкой тренажеров по SQL, которые помогут закрепить SQL на практике:
1. sql-academy.org
2. sql-ex.ru
3. schoolsw3.com
4. SQL Fiddle
5. sqltest.online
6. Oracle LiveSQL
7. stratascratch.com
8. sql-practice.com
9. HackerRank
10. sqlzoo.net
#SQL #тренажеры #полезное
👍1 1
Путешествие во времени...
Anonymous Poll
19%
Никак не возможно
19%
Возможно, но только в прошлое, без влияния, наблюдение
6%
Возможно, но только в будущее, без влияния, наблюдение
19%
Возможно и в прошлое и в будущее, но нельзя будет влиять
19%
Возможно и в прошлое и в будущее и влиять можно будет
0%
Возможно, но только в прошлое, с влиянием
19%
Возможно, но только в будущее, с влиянием
👍2
Своя СУБД за 3 недели.
Конечный продукт должен обладать следующими свойствами:
#статья #полезное #SQL #СУБД #проекты #велосипедостроение
Нужно всего-лишь каждый день немного времени уделять архитектуре; и всё остальное время вкалывать на результат, печатая и перепечатывая сотни строк кода.
По закону Мерфи, если есть более одного проекта на выбор — я возьмусь за самый сложный из предложенных. Так случилось и с последним заданием курса о системах управления базами данных (СУБД).
Конечный продукт должен обладать следующими свойствами:
хранит базу в бинарном формате в едином файле
DDL: поддерживает три типа данных: Integer, Float и Varchar(N). Для упрощения, все они фиксированной длины.
DML: поддерживает базовые SQL операции:
INSERT
UPDATE
DELETE
SELECT с WHERE и JOIN. С каким именно JOIN — указано не было, поэтому на всякий случай мы сделали и CROSS, и INNER
выдерживает 100'000
#статья #полезное #SQL #СУБД #проекты #велосипедостроение
🔥3👍1
#HEX • IT
В мире программирования создание собственных библиотек — это не просто возможность пополнения своего портфолио или способ структурировать код, а настоящий акт творческого самовыражения (и иногда велосипедостроения). Каждый разработчик иногда использовал в…
Давайте наберем до вторника +30 на этой статье)
👍5
Poetry — это инструмент для управления зависимостями и сборкой пакетов в Python. А также при помощи Poetry очень легко опубликовать свою библиотеку на PyPi!
В Poetry представлен полный набор инструментов, которые могут понадобиться для детерминированного управления проектами на Python. В том числе, сборка пакетов, поддержка разных версий языка, тестирование и развертывание проектов.
Все началось с того, что создателю Poetry Себастьену Юстасу потребовался единый инструмент для управления проектами от начала до конца, надежный и интуитивно понятный, который бы мог использоваться и в рамках сообщества. Одного лишь менеджера зависимостей было недостаточно, чтобы управлять запуском тестов, процессом развертывания и всем созависимым окружением. Этот функционал находится за гранью возможностей обычных пакетных менеджеров, таких как Pip или Conda. Так появился Python Poetry.
Установить poetry можно через pipx:
Итак, давайте создадим проект при помощи poetry и установим зависимости:
В Poetry представлен полный набор инструментов, которые могут понадобиться для детерминированного управления проектами на Python. В том числе, сборка пакетов, поддержка разных версий языка, тестирование и развертывание проектов.
Все началось с того, что создателю Poetry Себастьену Юстасу потребовался единый инструмент для управления проектами от начала до конца, надежный и интуитивно понятный, который бы мог использоваться и в рамках сообщества. Одного лишь менеджера зависимостей было недостаточно, чтобы управлять запуском тестов, процессом развертывания и всем созависимым окружением. Этот функционал находится за гранью возможностей обычных пакетных менеджеров, таких как Pip или Conda. Так появился Python Poetry.
Установить poetry можно через pipx:
pipx install poetry и через pip: pip install poetry --break-system-requirements. Это установит poetry глобально во всю систему.Итак, давайте создадим проект при помощи poetry и установим зависимости:
poetry new <имя_проекта>
cd <имя_проекта>
poetry add <зависимости>
poetry shell # входим в виртуальное окружение
20👍4❤1🔥1 1
#HEX • IT
В мире программирования создание собственных библиотек — это не просто возможность пополнения своего портфолио или способ структурировать код, а настоящий акт творческого самовыражения (и иногда велосипедостроения). Каждый разработчик иногда использовал в…
Извиняюсь что выклянчиваю, но давайте добьем рейтинг статьи до 30(
20👍5
DevOps-инженер - специалист, который внедряет методологию эффективной совместной работы нескольких сфер (такие, как серверное программирование, QA и администрирование серверов) в процесс работы. Можно сказать, что эта специальность абстрактная, т.к. нет четко обозначенных границ знаний.
DevOps-инженер, косвенно или нет, отвечает за следующие этапы работы:
Этап планирования. Какая будет архитектура проекта, как настроить его масштабируемость, определение метрик для оценки эффективности.
Следующим шагом является настройка и администрирование серверов. Эта часть работы включает в себя развертывание и конфигурирование серверной инфраструктуры, установка и настройка необходимого системного ПО и самой системы, а также обеспечение безопасного вывода в продакшен и проверка среды.
Автоматизация CI/CD. Continuous Integration/Continuous Delivery - это одна из практик в DevOps, подразумевающая непрерывную интеграцию и доставку. Ее цели - обеспечение последовательного и автоматизированного способа сборки, упаковки и тестирования продуктов или приложений.
Тестирование и мониторинг. Данный этап представляет собой разработку систем мониторинга производительности и доступности, а также всевозможное тестирование.
Взаимодействие с обратной связью от пользователя. Цель этапа - внедрять улучшения в проект.
Решение других задач, которые позволяют анализировать эффективность разных рабочих процессов, наладить систему работы других сотрудников сферы IT.
Но почему разработчики разных этапов не могут просто работать отдельно, а после синхронизировать? Проблема возникает в том, что у каждого свое окружение, и то что работает у одних, может не работать у других. Все тратят время на решение багов, проблем совместимости и синхронизацию компонентов. Здесь и нужна профессия DevOps-инженера - тот, кто поможет всем общаться, настроить совместную работу.
Конечно данный план - идеальный проект, но таких, к сожалению, мало. Есть многочисленные проекты, где мониторинг отваливается, процесс обновления громоздкий, этап планирования был пропущен или сервера используют потенциально уязвимое ПО. И тогда задача DevOps-инженера - решить все (или хотя бы часть) существующих проблем, сделать так, чтобы все работало, и непрерывно работало и обновлялось.
Как говорит старая английская пословица - "Time is money", время - деньги. В контексте бизнеса и IT инфраструктуры это правда. Сколько бизнес потеряет денег, если вдруг, из-за плохого тестирования или CI/CD упадет сервер? DevOps-инженер как раз и нужен для решения таких проблем.
DevOps-инженер, косвенно или нет, отвечает за следующие этапы работы:
Этап планирования. Какая будет архитектура проекта, как настроить его масштабируемость, определение метрик для оценки эффективности.
Следующим шагом является настройка и администрирование серверов. Эта часть работы включает в себя развертывание и конфигурирование серверной инфраструктуры, установка и настройка необходимого системного ПО и самой системы, а также обеспечение безопасного вывода в продакшен и проверка среды.
Автоматизация CI/CD. Continuous Integration/Continuous Delivery - это одна из практик в DevOps, подразумевающая непрерывную интеграцию и доставку. Ее цели - обеспечение последовательного и автоматизированного способа сборки, упаковки и тестирования продуктов или приложений.
Тестирование и мониторинг. Данный этап представляет собой разработку систем мониторинга производительности и доступности, а также всевозможное тестирование.
Взаимодействие с обратной связью от пользователя. Цель этапа - внедрять улучшения в проект.
Решение других задач, которые позволяют анализировать эффективность разных рабочих процессов, наладить систему работы других сотрудников сферы IT.
Но почему разработчики разных этапов не могут просто работать отдельно, а после синхронизировать? Проблема возникает в том, что у каждого свое окружение, и то что работает у одних, может не работать у других. Все тратят время на решение багов, проблем совместимости и синхронизацию компонентов. Здесь и нужна профессия DevOps-инженера - тот, кто поможет всем общаться, настроить совместную работу.
Конечно данный план - идеальный проект, но таких, к сожалению, мало. Есть многочисленные проекты, где мониторинг отваливается, процесс обновления громоздкий, этап планирования был пропущен или сервера используют потенциально уязвимое ПО. И тогда задача DevOps-инженера - решить все (или хотя бы часть) существующих проблем, сделать так, чтобы все работало, и непрерывно работало и обновлялось.
Как говорит старая английская пословица - "Time is money", время - деньги. В контексте бизнеса и IT инфраструктуры это правда. Сколько бизнес потеряет денег, если вдруг, из-за плохого тестирования или CI/CD упадет сервер? DevOps-инженер как раз и нужен для решения таких проблем.
10 3👍2 1