This media is not supported in your browser
VIEW IN TELEGRAM
#memes
Когда решил помочь коллеге с задачей, но сделал только хуже, ну в принципе как и предполагалось
Когда решил помочь коллеге с задачей, но сделал только хуже, ну в принципе как и предполагалось
🧜♂️🧜♂️ Погружение в Telegram API через TDLib
Пришла пора узнать, как сделать свой клиент для Telegram, что такое TL-схема и TDLib.
Прежде чем начать
Telegram поощряет, ну или по крайней мере не наказывает, за разработку пользовательских клиентов. Для создания клиента необходимо придерживаться следующих правил:
➖ Необходимо использовать свой уникальный APP_ID
➖ Необходимо следовать правилам безопасности
➖ Можно расширять функциональность Telegram, но нельзя заставлять пользователей других приложений переходить в ваше приложение
➖ Нельзя нарушать базовые механики мессенджера, например, делать «невидимки» и «нечитайки»
➖ Нельзя выполнять действия без ведома пользователя, например, автоматически подписываться на канал или рассылать сообщения
➖ Если клиент обеспечивает доступ к каналам, то необходимо также реализовать функциональность «спонсированных сообщений»
➖ Нельзя выдавать приложение за официальное
➖ Монетизировать можно любым легальным способам, если о нем написано на странице приложения
Нарушение этих правил приведет к предупреждению, а его игнорирование — к отключению API для вашего приложения. Также команда Telegram может запросить удалить ваше приложение из магазинов.
Также не стоит забывать, что деструктивные действия, такие как спам и распространение незаконного контента, вне зависимости от клиента являются нарушением и могут привести к бану аккаунта.
Подробнее читайте тут
Пришла пора узнать, как сделать свой клиент для Telegram, что такое TL-схема и TDLib.
Прежде чем начать
Telegram поощряет, ну или по крайней мере не наказывает, за разработку пользовательских клиентов. Для создания клиента необходимо придерживаться следующих правил:
➖ Необходимо использовать свой уникальный APP_ID
➖ Необходимо следовать правилам безопасности
➖ Можно расширять функциональность Telegram, но нельзя заставлять пользователей других приложений переходить в ваше приложение
➖ Нельзя нарушать базовые механики мессенджера, например, делать «невидимки» и «нечитайки»
➖ Нельзя выполнять действия без ведома пользователя, например, автоматически подписываться на канал или рассылать сообщения
➖ Если клиент обеспечивает доступ к каналам, то необходимо также реализовать функциональность «спонсированных сообщений»
➖ Нельзя выдавать приложение за официальное
➖ Монетизировать можно любым легальным способам, если о нем написано на странице приложения
Нарушение этих правил приведет к предупреждению, а его игнорирование — к отключению API для вашего приложения. Также команда Telegram может запросить удалить ваше приложение из магазинов.
Также не стоит забывать, что деструктивные действия, такие как спам и распространение незаконного контента, вне зависимости от клиента являются нарушением и могут привести к бану аккаунта.
Подробнее читайте тут
🧑🍳🧑🎓 Релиз vcpkg 2023.10.19
Стала доступна версия менеджера пакетов vcpkg 2023.10.19. Автор статьи кратко излагает изменения, случившиеся с 10 августа 2023 года по 19 октября 2023 года для репозиториев Microsoft/vcpkg, Microsoft/vcpkg-tool и Microsoft/vcpkg-docs на GitHub.
Некоторая статистика за этот период:
🔹 В реестр с открытым исходным кодом было добавлено 53 новых порта. Если вы не знакомы с термином «порт», то это пакеты, которые создаются из исходного кода и обычно представляют собой библиотеки C/C++.
🔹 В существующие порты было внесено 729 обновлений.
🔹 В настоящее время в public registry vcpkg доступно 2 318 библиотек.
🔹 34 участника представили PRs или приняли участие в обсуждениях в основном репозитории.
🔹 Основной vcpkg repo имеет более 5700 форков и 19 900 звездочек на GitHub.
Более детально о релизе читайте здесь
Стала доступна версия менеджера пакетов vcpkg 2023.10.19. Автор статьи кратко излагает изменения, случившиеся с 10 августа 2023 года по 19 октября 2023 года для репозиториев Microsoft/vcpkg, Microsoft/vcpkg-tool и Microsoft/vcpkg-docs на GitHub.
Некоторая статистика за этот период:
🔹 В реестр с открытым исходным кодом было добавлено 53 новых порта. Если вы не знакомы с термином «порт», то это пакеты, которые создаются из исходного кода и обычно представляют собой библиотеки C/C++.
🔹 В существующие порты было внесено 729 обновлений.
🔹 В настоящее время в public registry vcpkg доступно 2 318 библиотек.
🔹 34 участника представили PRs или приняли участие в обсуждениях в основном репозитории.
🔹 Основной vcpkg repo имеет более 5700 форков и 19 900 звездочек на GitHub.
Более детально о релизе читайте здесь
#вопросы_с_собеседований
Как работает std::shared_ptr?
➖ std::shared_ptr — это умный указатель, который использует подсчет ссылок для управления жизненным циклом объекта. Это означает, что несколько shared_ptr могут указывать на один и тот же объект, и он будет удален только тогда, когда все shared_ptr, указывающие на него, будут уничтожены.
➖ Когда вы создаете shared_ptr, он увеличивает счетчик ссылок на объект. Когда shared_ptr уничтожается, он уменьшает счетчик ссылок. Если счетчик ссылок достигает нуля, это означает, что больше нет shared_ptr, указывающих на объект, и он может быть безопасно удален.
➖ std::shared_ptr также предоставляет набор методов для управления объектом, таких как reset, который позволяет заменить текущий объект новым, и use_count, который возвращает текущее количество shared_ptr, указывающих на объект.
Вот простой пример использования std::shared_ptr:
#include
#include
int main() {
std::shared_ptr ptr1(new int(5));
std::cout << *ptr1 << std::endl; // выводит 5
std::cout << ptr1.use_count() << std::endl; // выводит 1
{
std::shared_ptr ptr2 = ptr1;
std::cout << ptr1.use_count() << std::endl; // выводит 2
}
std::cout << ptr1.use_count() << std::endl; // выводит 1
}
Создаем std::shared_ptr, который владеет динамически выделенным объектом типа int. Затем еще один shared_ptr, который указывает на тот же объект. Когда второй shared_ptr выходит из области видимости и уничтожается, счетчик ссылок уменьшается, но объект не удаляется, потому что все еще есть другой shared_ptr, указывающий на него.
Как работает std::shared_ptr?
➖ std::shared_ptr — это умный указатель, который использует подсчет ссылок для управления жизненным циклом объекта. Это означает, что несколько shared_ptr могут указывать на один и тот же объект, и он будет удален только тогда, когда все shared_ptr, указывающие на него, будут уничтожены.
➖ Когда вы создаете shared_ptr, он увеличивает счетчик ссылок на объект. Когда shared_ptr уничтожается, он уменьшает счетчик ссылок. Если счетчик ссылок достигает нуля, это означает, что больше нет shared_ptr, указывающих на объект, и он может быть безопасно удален.
➖ std::shared_ptr также предоставляет набор методов для управления объектом, таких как reset, который позволяет заменить текущий объект новым, и use_count, который возвращает текущее количество shared_ptr, указывающих на объект.
Вот простой пример использования std::shared_ptr:
#include
#include
int main() {
std::shared_ptr ptr1(new int(5));
std::cout << *ptr1 << std::endl; // выводит 5
std::cout << ptr1.use_count() << std::endl; // выводит 1
{
std::shared_ptr ptr2 = ptr1;
std::cout << ptr1.use_count() << std::endl; // выводит 2
}
std::cout << ptr1.use_count() << std::endl; // выводит 1
}
Создаем std::shared_ptr, который владеет динамически выделенным объектом типа int. Затем еще один shared_ptr, который указывает на тот же объект. Когда второй shared_ptr выходит из области видимости и уничтожается, счетчик ссылок уменьшается, но объект не удаляется, потому что все еще есть другой shared_ptr, указывающий на него.
Сколько типов стандартных исключений существует в C++?
Anonymous Quiz
29%
6
21%
9
12%
12
37%
Нет верного ответа
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
🦾🤾 Хардварный проброс
Пробрасывать можно не только сетевые порты, а еще и регистры периферии микроконтроллера(МК). Идея та же самая — открыть периферию для использования вне микроконтроллера.
🤔 В случае проброса периферии, внешними клиентами будут выступать программы на ПК, и для них мы будем давать доступ к внутренним регистрам микроконтроллера. Для программ это будет выглядеть так, как будто регистры периферии находятся в адресном пространстве компьютера(ПК). Все равно что эти самые регистры периферии висели бы на одной шине с памятью и другими устройствами ввода-вывода.
✍️ Путь первый. Перехватываем все что есть
В каждой инструкции mov что работает с памятью будем проверять операнды, и если в операндах есть адрес, который совпадает с адресом периферии (к примеру адрес GPIOС 0x40011000) в микроконтроллере, то PinTool будет эту операцию выполнять на целевом микроконтроллере с помощью OpenOCD сервера и железного отладчика(st-link).
Детальное продолжение ждет тут
Пробрасывать можно не только сетевые порты, а еще и регистры периферии микроконтроллера(МК). Идея та же самая — открыть периферию для использования вне микроконтроллера.
🤔 В случае проброса периферии, внешними клиентами будут выступать программы на ПК, и для них мы будем давать доступ к внутренним регистрам микроконтроллера. Для программ это будет выглядеть так, как будто регистры периферии находятся в адресном пространстве компьютера(ПК). Все равно что эти самые регистры периферии висели бы на одной шине с памятью и другими устройствами ввода-вывода.
✍️ Путь первый. Перехватываем все что есть
В каждой инструкции mov что работает с памятью будем проверять операнды, и если в операндах есть адрес, который совпадает с адресом периферии (к примеру адрес GPIOС 0x40011000) в микроконтроллере, то PinTool будет эту операцию выполнять на целевом микроконтроллере с помощью OpenOCD сервера и железного отладчика(st-link).
Детальное продолжение ждет тут
Бесплатный С++ митап в Москве и онлайн с инженерами YADRO — боли С++23, lifetime extension и техсобесов
Состоится вся кухня 21 ноября 2023 в 19:00. Офлайн будет в Москве, Столярный пер., 3К15, ДК «РАССВЕТ».
Обсудите новый стандарт с точки зрения практикующего программиста, узнаете, как избежать dangling reference и подискутируете, как собеседовать комфортно для всех. Докладчики митапа — разработчики из команд систем хранения данных и телекома в YADRO.
Программа
Как работает (и не работает) lifetime extension
Что страшнее: segfault или UB, лишнее копирование или dangling reference? Мы редко задумываемся о том, как работает механизм lifetime extension, еще реже осознанно используем. Спикер расскажет, как он устроен и на что обращать внимание, чтобы не создать себе проблем на ровном месте.
C++ 23 глазами практикующего системного программиста
Новый стандарт закрыл как минимум две боли, которые все испытывали при программировании. Но нет худа без добра, он добавил две новых!
Я провожу собеседования каждую неделю, и у меня наболело
Обсудите, как нащупать потолок кандидата, как говорить про алгоритмы без синтетических алгоритмических задач, почему Qt — зло, и многое другое.
Регистрация тут
#мероприятие
Состоится вся кухня 21 ноября 2023 в 19:00. Офлайн будет в Москве, Столярный пер., 3К15, ДК «РАССВЕТ».
Обсудите новый стандарт с точки зрения практикующего программиста, узнаете, как избежать dangling reference и подискутируете, как собеседовать комфортно для всех. Докладчики митапа — разработчики из команд систем хранения данных и телекома в YADRO.
Программа
Как работает (и не работает) lifetime extension
Что страшнее: segfault или UB, лишнее копирование или dangling reference? Мы редко задумываемся о том, как работает механизм lifetime extension, еще реже осознанно используем. Спикер расскажет, как он устроен и на что обращать внимание, чтобы не создать себе проблем на ровном месте.
C++ 23 глазами практикующего системного программиста
Новый стандарт закрыл как минимум две боли, которые все испытывали при программировании. Но нет худа без добра, он добавил две новых!
Я провожу собеседования каждую неделю, и у меня наболело
Обсудите, как нащупать потолок кандидата, как говорить про алгоритмы без синтетических алгоритмических задач, почему Qt — зло, и многое другое.
Регистрация тут
#мероприятие
#вопросы_с_собеседования
Какая разница между статической и динамической библиотеками?
Статическая библиотека — это набор объектных файлов, которые компилятор или компоновщик могут использовать для создания исполняемого файла. Когда вы компилируете программу, которая использует статическую библиотеку, код из библиотеки копируется в исполняемый файл. Это означает, что каждый исполняемый файл содержит свою собственную копию кода из статической библиотеки.
Динамическая библиотека — это набор функций и данных, которые могут быть загружены и использованы несколькими программами одновременно. Когда вы компилируете программу, которая использует динамическую библиотеку, исполняемый файл содержит только ссылки на функции и данные в библиотеке. Код из динамической библиотеки загружается в память только один раз и может быть использован несколькими программами.
Основное отличие между статическими и динамическими библиотеками заключается в том, как они используются и распространяются. Статические библиотеки встраиваются непосредственно в исполняемый файл, что увеличивает его размер, но делает его самодостаточным. Динамические библиотеки распространяются отдельно от исполняемого файла и могут быть использованы несколькими программами, что уменьшает размер каждого исполняемого файла и обеспечивает лучшее использование памяти.
Какая разница между статической и динамической библиотеками?
Статическая библиотека — это набор объектных файлов, которые компилятор или компоновщик могут использовать для создания исполняемого файла. Когда вы компилируете программу, которая использует статическую библиотеку, код из библиотеки копируется в исполняемый файл. Это означает, что каждый исполняемый файл содержит свою собственную копию кода из статической библиотеки.
Динамическая библиотека — это набор функций и данных, которые могут быть загружены и использованы несколькими программами одновременно. Когда вы компилируете программу, которая использует динамическую библиотеку, исполняемый файл содержит только ссылки на функции и данные в библиотеке. Код из динамической библиотеки загружается в память только один раз и может быть использован несколькими программами.
Основное отличие между статическими и динамическими библиотеками заключается в том, как они используются и распространяются. Статические библиотеки встраиваются непосредственно в исполняемый файл, что увеличивает его размер, но делает его самодостаточным. Динамические библиотеки распространяются отдельно от исполняемого файла и могут быть использованы несколькими программами, что уменьшает размер каждого исполняемого файла и обеспечивает лучшее использование памяти.
🧠⚙️ Как научиться критически мыслить: 6 эффективных способов
Критическое мышление позволяет принимать решения в условиях неопределённости, доносить свои идеи до команды, видеть ошибки в логике, замечать манипуляции. В статье рассказываем, откуда пошло это понятие и как можно развить критическое мышление.
💬Считаете ли вы, что у вас развито критическое мышление?
👍 — да, и это очень помогает мне в жизни и работе
🤔 — да, но оно ничем не помогает
🥱 — нет
Критическое мышление позволяет принимать решения в условиях неопределённости, доносить свои идеи до команды, видеть ошибки в логике, замечать манипуляции. В статье рассказываем, откуда пошло это понятие и как можно развить критическое мышление.
💬Считаете ли вы, что у вас развито критическое мышление?
👍 — да, и это очень помогает мне в жизни и работе
🤔 — да, но оно ничем не помогает
🥱 — нет
🤔 Очередной #дайджест материалов по C++
♦️ Shared, TO, PLOT: друзья или враги — тестирование вызовов функций, вызовов указателей на функции и производительность виртуальных вызовов
♦️ «Есть вопросы, на которые не ответит даже наниматель»: три истории о собеседованиях разработчиков на С++ — как проводить технические интервью, говорить про алгоритмы без синтетических задач и оценить знания кандидата
♦️ Great .NET 8 Hack — узнаете, как создавать облачные нативные приложения, ИИ-приложения или приложения .NET MAUI с использованием последней версии .NET.
♦️ Хранение данных в Entity Component Systems — как ECS упорядочивает ваши данные для оптимизации скорости выполнения итераций
♦️ Как подключиться к Flutter приложению в режиме нативного debug на ОС Аврора — подключение к нативной части ОС Авроры для тестирования нативной части Flutter-приложения
♦️ Shared, TO, PLOT: друзья или враги — тестирование вызовов функций, вызовов указателей на функции и производительность виртуальных вызовов
♦️ «Есть вопросы, на которые не ответит даже наниматель»: три истории о собеседованиях разработчиков на С++ — как проводить технические интервью, говорить про алгоритмы без синтетических задач и оценить знания кандидата
♦️ Great .NET 8 Hack — узнаете, как создавать облачные нативные приложения, ИИ-приложения или приложения .NET MAUI с использованием последней версии .NET.
♦️ Хранение данных в Entity Component Systems — как ECS упорядочивает ваши данные для оптимизации скорости выполнения итераций
♦️ Как подключиться к Flutter приложению в режиме нативного debug на ОС Аврора — подключение к нативной части ОС Авроры для тестирования нативной части Flutter-приложения
🧑💻🪜 6 карьерных советов программисту
Советы, которые подойдут джуниорам, мидлам и сеньорам.
#туториал
Читать статью
Советы, которые подойдут джуниорам, мидлам и сеньорам.
#туториал
Читать статью
Паттерн Strategy
Паттерн Strategy — это паттерн проектирования, который позволяет определять семейства связанных алгоритмов и делать их взаимозаменяемыми.
Это дает возможность выбирать конкретный алгоритм во время выполнения программы.
Основная идея паттерна Strategy заключается в том, чтобы вынести алгоритмы в отдельные классы-стратегии и передавать нужную стратегию в клиентский код.
Это паттерн используется, когда:
— Нужно использовать разные варианты одного и того же алгоритма в разных ситуациях.
— Нужно легко добавлять новые стратегии, не меняя существующий клиентский код.
— Нужно избавиться от условных операторов, выбирающих алгоритм.
#код
Паттерн Strategy — это паттерн проектирования, который позволяет определять семейства связанных алгоритмов и делать их взаимозаменяемыми.
Это дает возможность выбирать конкретный алгоритм во время выполнения программы.
Основная идея паттерна Strategy заключается в том, чтобы вынести алгоритмы в отдельные классы-стратегии и передавать нужную стратегию в клиентский код.
Это паттерн используется, когда:
— Нужно использовать разные варианты одного и того же алгоритма в разных ситуациях.
— Нужно легко добавлять новые стратегии, не меняя существующий клиентский код.
— Нужно избавиться от условных операторов, выбирающих алгоритм.
#код
🚩 Итог одной валютной удаленки: проработал месяц бесплатно и ушел с долгами
Изумительная история фронтендера, который целый месяц работал без зарплаты и даже остался должен своему работодателю $1609
#почитать
Читать статью
Изумительная история фронтендера, который целый месяц работал без зарплаты и даже остался должен своему работодателю $1609
#почитать
Читать статью
🏃🏃♂️ Библиотека libopencm3. Работа с USART, прерываниями, I2C и таймерами
В заключительной части (это и это — предыдущие части, в которых происходит вся подготовительная кухня) рассматривается взаимодействие микроконтроллера с окружающим миром с помощью USART — интерфейса, позволяющего организовать взаимодействие с человеком при помощи текста.
Цель: отправить в USART строчку «Hello from LibOpenCM3!» Параметры подключения должны быть: скорость 9600, 8 бит данных, один стоп-бит, проверка четности выключена.
Изучить материал
#туториал
В заключительной части (это и это — предыдущие части, в которых происходит вся подготовительная кухня) рассматривается взаимодействие микроконтроллера с окружающим миром с помощью USART — интерфейса, позволяющего организовать взаимодействие с человеком при помощи текста.
Цель: отправить в USART строчку «Hello from LibOpenCM3!» Параметры подключения должны быть: скорость 9600, 8 бит данных, один стоп-бит, проверка четности выключена.
Изучить материал
#туториал
Подборка лучших статей «Библиотеки C/C++ разработчика» за октябрь: сохраняй в заметки, чтобы не пропустить #самыйсок
💪 6 сервисов для подготовки к техническим собеседованиям
🛡️ 8 способов защиты от манипуляций на работе
👩💻 Женщины в ИТ: проблемы и преимущества сложной профессии
👨💻 9 трендов в найме айтишников в 2023 году
🧠 Как научиться критически мыслить: 6 эффективных способов
💪 6 сервисов для подготовки к техническим собеседованиям
🛡️ 8 способов защиты от манипуляций на работе
👩💻 Женщины в ИТ: проблемы и преимущества сложной профессии
👨💻 9 трендов в найме айтишников в 2023 году
🧠 Как научиться критически мыслить: 6 эффективных способов
Принцип YAGNI
Принцип YAGNI (You Ain't Gonna Need It), который также известен как «Не добавляйте функциональность, пока она не понадобится».
В контексте С++ это означает, что при проектировании и разработке программы вы должны избегать лишней сложности, излишних функций и структур данных, которые не требуются на текущем этапе разработки. Вместо этого фокусируйтесь на решении актуальных задач и добавлении только тех функций, которые необходимы для выполнения текущих требований.
Этот принцип помогает избежать излишней сложности кода, упростить его поддержку и обеспечить более гибкую архитектуру, которая может легко адаптироваться к будущим изменениям и требованиям.
#код
Принцип YAGNI (You Ain't Gonna Need It), который также известен как «Не добавляйте функциональность, пока она не понадобится».
В контексте С++ это означает, что при проектировании и разработке программы вы должны избегать лишней сложности, излишних функций и структур данных, которые не требуются на текущем этапе разработки. Вместо этого фокусируйтесь на решении актуальных задач и добавлении только тех функций, которые необходимы для выполнения текущих требований.
Этот принцип помогает избежать излишней сложности кода, упростить его поддержку и обеспечить более гибкую архитектуру, которая может легко адаптироваться к будущим изменениям и требованиям.
#код