Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Решай головоломку с котиками!

Котолэнд: блок пазл

Головоломки, Казуальные, 2D

Играть

Топ прошлой недели

  • Oskanov Oskanov 8 постов
  • alekseyJHL alekseyJHL 6 постов
  • XpyMy XpyMy 1 пост
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Новости Пикабу Помощь Кодекс Пикабу Реклама О компании
Команда Пикабу Награды Контакты О проекте Зал славы
Промокоды Скидки Работа Курсы Блоги
Купоны Biggeek Купоны AliExpress Купоны М.Видео Купоны YandexTravel Купоны Lamoda
Мобильное приложение

Ненормальное программирование

971 пост сначала свежее
4
Вопрос из ленты «Эксперты»
user10830363
7 дней назад
Спроси Пикабу

Посоветуйте качественные курсы C# и .NET⁠⁠

Я хотела бы начать двигаться в направлении C#-разработки. Но курсов очень много, отзывы не очень.

Пересмотрела кучу платформ, остановилась на: SkillFactory, OTUS, ITVDN, Специалист — рейтинг хороший, но отзывы вызывают сомнение. Кто сталкивался с ними? Поделитесь мнением о них.

Если знаете другие топовые курсы — пишите названия, буду благодарна!

Также вопрос к бывшим менеджерам по продажам курсов (или тем, кто в теме): Как можно выбить максимальную скидку? Слышала что нужно отказать в цене 2-3 раза, правда ли это? Может знаете реальные рабочие лайфхаки?

Буду рада помощи! Заранее спасибо за ответ.

Программирование Программист IT Онлайн-курсы Курсы программирования Курсы Менеджер по продажам Лайфхак Скидки Обучение Дистанционное обучение Учебные курсы Csharp Dotnet Вопрос Спроси Пикабу Текст
13
3
0sadchi
0sadchi
7 дней назад
Лига Разработчиков Видеоигр

Я доделал сихронизацию через сервер :з⁠⁠

[моё] Программирование Windows C++ YouTube Hacking Видео
0
5
Uncle.Shrimp
Uncle.Shrimp
7 дней назад

Как установить библиотеку GLFW3 на Windows 10, Microsoft Visual Studio 2022⁠⁠

Здравствуйте! Я увлекся программированием графики на C++ и решил написать свой 2D движок под это дело, но столкнулся с проблемой - не мог установить нужную для моей задумки библиотеку GLFW. В интернете всё было слишком сложным и непонятным. Я пытался через vcpkg, но не получилось.
В конце концов я разобрался и сейчас решил поделиться находками здесь. Мало ли, может кому-то пригодится.

Начнем со скачивания библиотеки с официального сайта.
Качаем pre-compiled версию.

Как установить библиотеку GLFW3 на Windows 10, Microsoft Visual Studio 2022 Программирование, IT, Длиннопост

После скачивания распаковываем в удобную для вас папку.

Как установить библиотеку GLFW3 на Windows 10, Microsoft Visual Studio 2022 Программирование, IT, Длиннопост

Вот так это выглядит у меня

Открываем папку. Внутри это должно выглядеть так :

Как установить библиотеку GLFW3 на Windows 10, Microsoft Visual Studio 2022 Программирование, IT, Длиннопост

Для версии Microsoft Visual Studio 2022, нам, как понятно, понадобится открыть папку lib-vc2022.

Как установить библиотеку GLFW3 на Windows 10, Microsoft Visual Studio 2022 Программирование, IT, Длиннопост

В ней должны быть эти файлы

Файлы

glfw3.lib

glfw3_mt.lib

glfw3dll.lib

Нужно скопировать в следующую папку :

C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\lib\x64

Файл

glfw3.dll

Копируем в эту папку :

C:\Windows\SysWOW64

Последнее, что надо скопировать - это файлы из папки include (на третьем скриншоте) :

glfw3.h

glfw3native.h

В папку : (папку GLFW я сам создал)

C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include\GLFW

На этом с копированием всё. Теперь надо настроить сам проект.

Для этого нажимаем правой кнопкой мыши на заголовок проекта, как на скрине и выбираем Properties.

Как установить библиотеку GLFW3 на Windows 10, Microsoft Visual Studio 2022 Программирование, IT, Длиннопост

Последнее, что надо сделать - во вкладке Linker -> Input -> Additional Dependencies указать как на скрине :

glfw3.lib

glfw3_mt.lib

glfw3dll.lib

Как установить библиотеку GLFW3 на Windows 10, Microsoft Visual Studio 2022 Программирование, IT, Длиннопост

Не забываем нажать Apply и всё!

Как установить библиотеку GLFW3 на Windows 10, Microsoft Visual Studio 2022 Программирование, IT, Длиннопост

Теперь можем в начале кода написать

#include <GLFW/glfw3>

И работать на здоровье!

Если кто-нибудь попросит, могу написать, как устанавливать glew, чтобы полноценно работать с 2D графикой.

Надеюсь, кому-то поможет! Критика и замечания приветствуются! Спасибо за внимание!

Показать полностью 7
Программирование IT Длиннопост
7
10
psyvld
7 дней назад

Опаньки, Фортран⁠⁠

Опаньки, Фортран
СССР Информатика Школа Программирование Языки программирования
8
2
user7359809
7 дней назад

История Linux, Minix и GNU: краткий обзорMinix — учебная⁠⁠

Minix — учебная операционная система

  • Создана Эндрю Таненбаумом в 1987 году как лёгкая микроядерная ОС для образовательных целей.

  • Имеет микроядерную архитектуру, была предназначена для изучения принципов ОС.

  • Содержит собственное ядро и базовый набор утилит.

Linux — монолитное ядро, родившееся в Minix-среде

  • Линус Торвальдс начал разработку ядра Linux в 1991 году, используя Minix как платформу для разработки и тестирования.

  • Первые версии Linux использовали некоторые библиотеки и утилиты из Minix (например, перекомпилированный shell bash, стартовые библиотеки).

  • Linux — самостоятельное монолитное ядро, не зависящее от микроядра Minix и не работающее в ней.

  • На ранних этапах Linux не мог самостоятельно запускать полноценные программы — многие утилиты были кросскомпилированы или запускались из Minix.

GNU — свободный проект ОС с утилитами

  • Начат Ричардом Столлманом в 1983 году для создания полностью свободной UNIX-подобной ОС.

  • К 1991–1992 году GNU предоставлял большинство необходимых компонентов: компилятор gcc, оболочку bash, системные утилиты, библиотеки, но не имел своего ядра (проект ядра GNU Hurd ещё не готов).

  • В 1992 году ядро Linux было переведено под лицензию GNU GPL, что позволило объединить Linux и GNU-компоненты в полноценную систему — GNU/Linux.

Итог

  • Linux — ядро, разработанное в среде Minix, но являющееся самостоятельной системой.

  • Minix — отдельная ОС с микроядром, послужившая средой и вдохновением для Linux.

  • GNU — проект системных утилит и инструментов, без ядра, который вместе с Linux образует полнофункциональную ОС GNU/Linux.

Показать полностью
Linux Windows Программирование Текст
0
2
ru1000
ru1000
7 дней назад
Серия Игрушечный программист - мой опыт Construct 3

Часть 13. Оформление формул - Порядок в проекте Construct 3 - собственный взгляд⁠⁠

Добрый день!

Меня зовут Руслан.
С 2016 года делаю игры в редакторе Construct 3.


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

Пример:

Часть 13. Оформление формул - Порядок в проекте Construct 3 - собственный взгляд Gamedev, Браузерные игры, Программирование, Construct 3, Порядок, Формула

Оформление формул.

Часть 13. Оформление формул - Порядок в проекте Construct 3 - собственный взгляд Gamedev, Браузерные игры, Программирование, Construct 3, Порядок, Формула

Оформление формул.

Здесь пробел есть как между операциями (+, -, *, /), так и между параметрами массивов ArrayFragments.At,(0, 0).

Так глаз быстрее выхватывает нужные блоки, чем если лепить всё непрерывным потоком.


Как обычно, Телеграм:
https://t.me/toyprogrammer

[моё] Gamedev Браузерные игры Программирование Construct 3 Порядок Формула
0
4
Gordok
7 дней назад

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов⁠⁠

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов IT, Автоматизация, Гайд, Программирование, Приложение, Длиннопост

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

В своей статье я хочу развеять этот стереотип и рассказать об интересном low‑code решении с визуальным интерфейсом — n8n. Мы разберем принципы работы и основные возможности n8n, а также, в качестве иллюстрации, приведу 4 практических примера автоматизации процессов, которые показались мне интересными и покажу как можно запустить собственную версию приложения в облаке.

Как работает n8n?

Итак, n8n это open source инструмент для автоматизации рабочих процессов, который позволяет планировать задачи, собирать отдельные действия в сценарии, а также извлекать и перемещать данные между множеством приложений, платформ и сервисов, которые вы и ваша команда используете ежедневно.

Основное его преимущество — вам не нужно обладать даже минимальными знаниями в программировании, глубоко разбираться в настройках API и понимать принципы написания кода. Полностью визуальный интуитивно понятный интерфейс с набором готовых модулей и шаблонов для различных ситуаций позволит вам настроить и объединять в единый процесс любой набор действий по вашей логике. Большую часть настроек можно сделать пользуясь только мышкой или тачпадом. Вы можете воспринимать его как цифрового помощника, который выполняет повторяющуюся работу за вас, планируя задачи, интегрируя сервисы или автоматически перемещая данные между различными приложениями, которые обычно по умолчанию не взаимодействуют друг с другом. Например, в n8n вы можете создать процесс, который будет ежедневно обновлять данные (делать выгрузку) в заданной вами Google таблице, делать выборку в нужном вам виде и отправлять краткий отчет (несколько ключевых цифр) в виде сообщения в Telegram.

Представьте себе соединение различных приложений и действий, как кусочков пазла. В n8n эти кусочки называются узлами. Каждый узел представляет собой определенное действие, например отправку электронного письма или сообщения в Telegram, обновление электронной таблицы или извлечение данных из приложения с помощью API.

При объединении все узлы образуют рабочий процесс — набор действий, объединенный общей логикой для достижения какого‑то результата. Создание и настройка логики узлов происходит через визуальный интерфейс, что упрощает создание рабочих процессов без написания пользовательского кода.

Гибкость n8n и широкий набор различных шаблонов и интеграций (более 300 приложений) позволяет автоматизировать множество действий: от простых задач до сложных многошаговых рабочих процессов.

Существуют различные типы узлов в зависимости от их функции. Типичный рабочий процесс состоит из:

  • Узел триггера: это то, что запускает ваш рабочий процесс. Это может быть обычная кнопка в приложении, электронное письмо в вашем почтовом ящике, сообщение в бота Telegram или любое событие из другого приложения.

  • Узлы действий: они определяют логику, конкретные приложения и действия в вашем рабочем процессе.

Узлы действий могут содержать простые задачи, такие как сохранение данных в базе данных, манипуляцию с данными (сортировку, вычисления и т. д.), отправку уведомления или обновление задачи в вашем приложении для управления проектами. Также они могут инициировать более сложные действия, такие как отправка HTTP‑запросов, запуск пользовательского кода Python или JavaScript или генерация запроса к AI с вашими собственными данными. Например:

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов IT, Автоматизация, Гайд, Программирование, Приложение, Длиннопост

Простой пример рабочего процесса n8n.

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

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

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

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

Я выбрал 4 интересных на мой взгляд примера с целью демонстрации возможностей приложения, а на сайте n8n вы сможете найти 1000+ различных бесплатных шаблонов, созданных сообществом.

Создание AI чат бота с помощью модулей n8n

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

Аналогичную задачу можно решить без написания сложных скриптов. N8n предлагает мощное и удобное решение, с встроенными модулями управления и взаимодействия с AI моделями. Это означает, что вы можете создать чат‑бота быстрее и с большей гибкостью, сохраняя при этом полный контроль над его функциональностью.

Итак, приступим. Для нашего бота мы создадим рабочий процесс, который использует языковые модели OpenAI и SerpAPI для поддержки динамичного и интеллектуального AI агента. Благодаря встроенным ручным триггерам чата и буферу памяти он сможет поддерживать непрерывные диалоги с учетом контекста.

Итоговая схема нашего рабочего процесса в n8n выглядит следующим образом:

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов IT, Автоматизация, Гайд, Программирование, Приложение, Длиннопост

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

  1. Создайте триггер чата. Выберете в меню соответствующий узел триггера чата и добавьте его в свой рабочий процесс.

  2. Создайте узел агента ИИ (выбрав его из меню узлов справа) и подключите его к триггеру чата.

  3. Добавьте узел выбранной вами языковой модели AI (например, в нашем случае это модель на базе OpenAI) кликнув на соответствующую ветку узла Агента (ветки визуально промаркированы, вам нужна Chat Model)

  4. Подключите узел памяти для контекста. Для подключения узла буфера памяти кликните на соответствующую ветку узла Агента (вам нужна ветка memory) и выберете нужный узел из меню, например узел Window Buffer Memory

  5. И финальный шаг, добавим дополнительные инструменты к нашему процессу. К ветке Узла Агента с маркировкой Tools подключим инструмент SerpAPI для поддержки web поиска. Для этого кликнем на соответствующую ветку и выберем инструмент из списка.

Получившийся модуль уже обладает полным функционалом для работы. Вы можете начать чат с языковой моделью прямо в интерфейсе n8n. В дальнейшем вы можете развивать описанный процесс, добавляя новые модули или меняя инструменты коммуникаций. Например, вы можете создать бота Telegram и подключить его к вашему Агенту, это позволит все диалоги с AI вести через Telegram.

Автоматизация Push кода в Git Hub

Еще одна опция использование n8n, это автоматизация процесса доставки кода в GitHub. Основные преимущества использования модулей n8n:

  • Во‑первых, возможность вносить изменения непосредственно в репозиторий GitHub. Это особенно полезно, когда вам нужно обновить части файлов документации Git без необходимости извлекать данные из GitHub и делать локальные коммиты перед отправкой изменений обратно.

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

Вот пример рабочего процесса n8n для отправки и обновления файлов в GitHub.

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов IT, Автоматизация, Гайд, Программирование, Приложение, Длиннопост

Вы можете работать с GitHub через готовый узел, через универсальный узел Git или через команду Execute Command.

В данном процессе приведены 2 возможных сценария:

1. Push через стандартный узел GitHub

Такой подход позволяет обновлять репозиторий GitHub, не затрагивая локальный репозиторий.

В верхней части схемы процесса расположены три узла:

  • GitHub извлекает файл README.md из репозитория и возвращает его в виде двоичных данных;

  • Узел декодирования файла преобразует строку base64 в понятный человеку текст;

  • Последний узел отправляет отредактированный файл непосредственно на GitHub:

{{ $json.data }} ## Updated at: {{ $now.toISO() }}

2. Push через Git node/bash

Теперь попробуем альтернативный подход и используем узел Git для работы с локальным репозиторием.

В нижней строке схемы процесса показано несколько узлов Git и один узел Execute Command:

  • Git Pull извлекает удаленный репозиторий и обновляет локальную копию. Этот шаг необходим, поскольку репозиторий GitHub был обновлен ранее, и ваша локальная копия может быть не синхронизирована.

  • Узел обновления README и добавления нового файла выполняет ряд локальных команд, которые записывают строки в файл README.md и создают новый файл.

echo '' >> {{ $('config').item.json.localrepo }}/README.md echo '## Updated at:' >> {{ $('config').item.json.localrepo }}/README.md echo '{{ $now.toISO() }}' >> {{ $('config').item.json.localrepo }}/README.md echo 'Check new file' >> {{ $('config').item.json.localrepo }}/README.md echo '' >> {{ $('config').item.json.localrepo }}/README.md echo '# This is a new file' >> {{ $('config').item.json.localrepo }}/new_{{ $now.toFormat('yyyyddMM-hhmmss') }}.md

  • Узлы Add files, Commit и Push по функционалу соответствуют своим названиям — они обновляют все последние изменения в репозитории GitHub. Важно отметить, что узел Git работает с локальным репозиторием. Поэтому вам необходимо заранее убедиться, что файл конфигурации Git настроен.

Чат с БД PostgreSQL с использованием модуля AI.

Еще один интересный пример рабочего процесса n8n, который предназначен для организации чата с AI агентом, который выдает релевантные данные из заданной БД в ответ на промпты, написанные естественным языком.

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов IT, Автоматизация, Гайд, Программирование, Приложение, Длиннопост

Как это работает

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

  • Затем сообщение обрабатывается модулем AI Agent с использованием соответствующих инструментов — Execute SQL Query, Get DB Schema, Tables List и Get Table Definition, если требуется. Агент использует эти инструменты для формирования и выполнения SQL‑запросов, которые необходимы для ответа на вопросы.

  • Получив данные, AI Agent использует их для формирования ответа и возвращает его пользователю.

При первом запуске процесса вам необходимо произвести настройку учетных данных. Для этого вам понадобятся учетные данные PostgreSQL и ключ API OpenAI.

Автоматизация процесса мониторинга доступности сайта.

Этот рабочий процесс n8n демонстрирует, как создать простую службу мониторинга uptime сайтов с использованием запланированных триггеров. Позволяет одновременно работать со списком сайтов.

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов IT, Автоматизация, Гайд, Программирование, Приложение, Длиннопост

Как это работает

  • Запланированный триггер считывает список URL‑адресов веб‑сайтов в Google Таблице каждые 5 минут.

  • Каждый URL‑адрес веб‑сайта проверяется с помощью узла HTTP, который определяет, находится ли веб‑сайт в состоянии UP или DOWN.

  • Для веб‑сайтов, находящихся в состоянии DOWN, отправляются электронные письма и сообщения в Slack (можно заменить модулем Telegram).

  • Google таблица обновляется с учетом состояния веб‑сайта и создается журнал.

  • Журналы можно использовать для определения общего процента времени UP и DOWN за определенный период.

Для настройки процесса вам понадобятся:

  • Google Таблица для хранения отслеживаемых веб‑сайтов и их состояний

  • Gmail для оповещений по электронной почте (можно заменить на модуль вашего почтового сервиса)

  • Slack для оповещений по каналам (можно заменить на модуль Telegram).

Надеюсь, что выбранные мной примеры будут вам полезны. Ну или, как минимум, сподвигнут вас поэкспериментировать с этим low‑code инструментом или найти готовый шаблон (из более чем 1000, представленных сообществом), который пригодится для решения именно вашей задачи.

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

Как развернуть собственное приложение n8n  в облаке Dockhost.

Наиболее простой способ развернуть облачную версию приложения — запустить его готовую к установке версию на платформе Dockhost.

Рассмотрим подробно как развернуть собственное приложение N8N. Для этого воспользуемся функционалом «Приложения» облачной платформы Dockhost.

Первым шагом переходим в раздел «Приложения» в панели управления Dockhost, и в открывшемся каталоге в разделе Low‑code выбираем приложение n8n.

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов IT, Автоматизация, Гайд, Программирование, Приложение, Длиннопост

Раздел «Приложения» — это каталог популярных приложений, готовых к установке и использованию на платформе.

В открывшемся окне нужно выбрать необходимую вам конфигурацию приложения. К установке доступно 8 конфигураций, отличающиеся выделенными для приложения ресурсами. После выбора конфигурации нажимаем «Установить» и указываем имя приложения в открывшемся модальном окне:

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов IT, Автоматизация, Гайд, Программирование, Приложение, Длиннопост

Нажимаем установить и дожидаемся завершения процесса установки приложения:

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов IT, Автоматизация, Гайд, Программирование, Приложение, Длиннопост

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

Все созданные ресурсы вы можете увидеть, нажав кнопку «Управлять» справа от установленного приложения.

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов IT, Автоматизация, Гайд, Программирование, Приложение, Длиннопост

При необходимости можно обновить конфигурацию, переустановить приложение целиком или восстановить его настройки в состояние после установки.

Итак, наше приложение создано и готов к использованию. Для перехода в web версию приложения нужно перейти в раздел «Приложения / Установленные» и нажать кнопку «Web» справа от выбранного приложения.

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов IT, Автоматизация, Гайд, Программирование, Приложение, Длиннопост

При нажатии на кнопку «Web» вы переходите на страницу приложения в вашем браузере, где вам необходимо пройти стандартную первичную регистрацию:

N8n - все о сервисе автоматизации с примерами популярных рабочих процессов IT, Автоматизация, Гайд, Программирование, Приложение, Длиннопост

Все, теперь у вас есть собственная версия n8n в облаке и вы можете приступать к работе с приложением.

Заключение

Автоматизация помогает экономить время, обрабатывая повторяющиеся задачи, чтобы вы могли сосредоточиться на более важных вещах. Будь то публикация в социальных сетях, организация данных, управление уведомлениями или отслеживание проектов, n8n упрощает настройку рабочих процессов для выполнения утомительной или повторяющейся работы за вас.

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

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

Показать полностью 11
[моё] IT Автоматизация Гайд Программирование Приложение Длиннопост
3
200
monobogdan
monobogdan
Посты о ремонте и моддинге ретрогаджетов.
TECHNO BROTHER
7 дней назад

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру⁠⁠

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Осторожно: в данной серии статей я рассказываю о реверс-инжиниринге и хакинге простых кнопочных звонилок. Цель простая: расширить скудный функционал телефонов ценой до 1 000 рублей и сделать их привлекательной моддинг-платформой для самых разных гиков. Если вы когда-нибудь слышали про эльфы и патчи, и вам интересно узнать, как происходит процесс взлома и изучения прошивок, а также написания новых программ для кнопочников — приглашаю вас под кат!

❯ Предыстория

Недавно я познакомился с Ilya_ZX, человеком-легендой в моддинг сцене телефонов из нулевых. Илья рассказал мне забавную историю: ещё будучи студентом, он увидел как одногруппник играет на своём LG G1800 в легендарную мобильную игру нулевых — «Змейку». Его тогдашний Siemens A60 не умел ничего кроме игрушки Stack Attack, даже Java-игры не поддерживались, а молодому парню очень хотелось сыграть в Змейку на скучных парах!

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Казалось бы, на дворе 2005 год, можно просто пойти на рынок и купить уже изрядно подешевевшую Б/У 3310 и поиграть в «трушную» змейку именно там. Но Илья был не просто студентом технаря, он с юности интересовался программированием, реверс-инжинирингом и телефонами! И он решил поспорить с одногруппником — сможет ли он реализовать Змейку на своём A60? Всего за один месяц он умудрился исследовать прошивку телефона на диковинной процессорной архитектуре, найти необходимые функции для работы с дисплеем, вводом и окнами и написать ту самую змейку. Попробуйте теперь представить лицо его одногруппника, который проиграл спор молодому реверсеру :)

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Сначала Илья написал игру на Паскале для самопального «симулятора» A60, а затем переписал её на ассемблере для C166s!

На момент написания статьи мне 23 года, я лишь чуточку старше тогдашнего Ильи. После рассказанной истории, я подумал «А чем я хуже?» и принялся реверсить прошивку бюджетного кнопочника 10-й давности - Explay B240. В прошлой статье, мы с вами проделали первые шаги по хакингу телефона: загрузка прошивки в IDA Pro и поиск системных функций, хакинг файлового менеджера для запуска программ с MicroSD-флэшки, разработка загрузчика исполняемых файлов и организация таблицы функций. В целом, это весьма неплохая поучительная статья для новичков в реверс-инжиниринге.

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Однако итоговый результат в виде заливки экрана желтым цветом может показаться незначительным. Поэтому в сегодняшней статье мы с вами напишем первую действительно полезную программу!

❯ «Змейка»

Напомню, что загрузчик внешних программ работает по очень простому принципу: мы нашли в дизассемблере функцию обработки сообщений окна встроенной игры и хукнули её, дабы при открытии окна она загружала программу с MicroSD-флэшки в ОЗУ и передавала ей управление. При этом загрузчик сразу интегрирован в проводник: при запуске файла с расширением .app, патч кладет строку с абсолютным путем к нему в одну из «угнанных» глобальных переменных, открывает хукнутое окно игры, а далее бинлоадер транслирует все сообщения от ОС в загруженную программу.

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Наглядная демонстрация работы

Таким образом, жизненный цикл приложений значительно упрощается по сравнению с "эльфами" на тех же Motorola и Siemens: по сути, нам остаётся лишь проинициализировать состояние программы в MSG_CREATE и освободить динамическую память в MSG_CLOSE. Читателям, которые хоть раз писали программы под Windows, такой подход может показаться очень знакомым!

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Для реализации змейки, нам необходимо уметь обрабатывать кнопки и рисовать что-то на дисплей. С кнопками проблем никаких не возникает: система шлёт сообщения типа MSG_KEYDOWN_KEY и MSG_KEYUP_KEY на каждое событие с клавиатурой. А вот с графикой чуточку сложнее: поскольку встроенные в прошивку функции завязаны на работу с вшитыми ресурсами, мы напишем нужные функции сами.

UI-подсистема телефона реализована по принципу «грязных зон». Вместо перерисовки всего экрана, система хранит массив с координатами прямоугольников, где что-то изменилось с момента прошлой перерисовки: это позволяет сэкономить такты процессора на тяжелых операциях по типу альфа-блендинга.

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Таким образом, сначала нам нужно получить указатель на буфер кадра, затем сделать весь экран «грязным» путем отрисовки полноэкранного прямоугольника и только потом поверх него рисовать графику нашей игры. На первый взгляд листинг ниже кажется дичью, но чуток отрефакторить — и выглядит как типичный код эмбедщика!

void Paint(LoaderContext* context)
{
LcdId lcd = { 0, 0 };
uint16* fb = ((uint16*(*)(LcdId* id)) LcdGetFrameBuffer)(&lcd); // Get framebuffer for primary screen

uint16 startEnd[4] = { 0, 0, 240, 320 }; // Rect
((void(*)(LcdId* lcdId, uint32 start, uint32 end, uint16 col)) LcdDrawRectPtr)(&lcd, ((uint32*)&startEnd[0])[0], ((uint32*)&startEnd[0])[1], 0x0); // Draw fullscreen rectangle

((void(*)()) LcdUpdateRect)(); // Update rect
}

Далее я реализовал функцию для отрисовки текста на экране. Шрифты самые примитивные — 8x8, побитовые, примерно как в знакогенераторе оригинального IBM PC. Принцип отрисовки прост: каждый символ (глиф) хранится в виде 8 байт. В каждом байте один бит представляет из себя пиксель по координате Y, если он равен нулю — значит пиксель прозрачный, в обратном же случае он должен быть закрашен нужным цветом.

Алгоритм для отрисовки шрифтов выглядит так:

int LcdDrawChar(LoaderContext* context, uint16* frameBuffer, char chr, uint32 x, uint32 y, uint16 color)
{
if(x >= 0 && y >= 0 && x + FONT_WIDTH < LCD_WIDTH && y + FONT_HEIGHT < LCD_HEIGHT)
{
int i, j;
unsigned char* glyph = (unsigned char*)(GLOBAL(context) + &embedded_font[chr * 8]);

for(i = 0; i < FONT_HEIGHT; i++)
{
short* fb = &((short*)frameBuffer)[(y + i) * LCD_WIDTH + x];

for(j = 0; j < FONT_WIDTH; j++)
{
if((*glyph >> (FONT_WIDTH - j)) & 0x1)
*fb = color;

fb++;
}

glyph++;
}

return true;
}

return false;
}

void LcdDrawString(LoaderContext* context, uint16* frameBuffer, char* str, uint32 x, uint32 y, uint16 color)
{
if(x >= 0 && y >= 0)
{
unsigned int i;

for(i = 0; i < strlen(str); i++)
{
if(!LcdDrawChar(context, frameBuffer, str[i], x, y, color))
return; // Out of screen

x += FONT_WIDTH;
}
}
}

Наверняка вы заметили страшный костыль в локальной переменной glyph с арифметикой над указателями. Дело в том, что на момент написания статьи, программа представляет из себя сырую склейку секций .text, .data, .bss и .rodata, поэтому на данный момент в ней нет релокаций, которые помогли бы сделать программу перемещаемой в памяти. В arm-none-eabi все вызовы функций без явного указателя — относительные, но при этом обращения к глобальным переменным и константам (например, строковым литералам) — абсолютные. Если попытаться напрямую использовать глобальную переменную по адресу 0x18 — программа будет пытаться читать или портить память в таблице векторов прерываний, что неизбежно приведет к HardFault. Поэтому для получения настоящего адреса переменной, к ней необходимо прибавить базовый адрес загрузки программы:

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Этот костыль можно избежать, если в конец программы дописать сведения о релокациях, которые можно вытянуть путем парсинга промежуточного эльфа, а при особом желании — можно сделать так, что программа сама себя будет патчить «на лету»!

Далее мы рисуем нашу строку с текстом:

LcdDrawString(context, fb, SCONST(context, "Ya lyublu AvtoVAZ"), 0, 0, 0xFFFFFF);

И получаем следующий результат:

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Для змейки, если она не ASCII, этого всё равно мало. Поэтому нам нужна функция для вывода картинок на дисплей. Написать загрузчик tga или bmp не составляет труда, но хотелось бы чтобы программа была самодостаточной и несла с собой все необходимые ресурсы. Поэтому для конвертации картинок я использую вот этот инструмент: выбираем файл, формат ставим в 16-бит 565 и преобразовываем в C-массив.

Процесс отрисовки изображения называется блиттингом, а его суть заключается в копировании пикселей с одной поверхности на другую. В нашем случае, исходная поверхность — само изображение, вторая — фреймбуфер. Также к пикселям могут применяться дополнительные операции: поворот и скейлинг (на фиксированные углы, либо же с аффинными преобразованиями), альфа-блендинг и колоркей.

void LcdDrawBitmap(uint16* frameBuffer, short* bitmap, uint32 width, uint32 height, uint32 x, uint32 y)
{
if(bitmap)
{
int i, j;
short* bmp = bitmap;

// Slow debug version
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
LCD_PLOT_565(clamp(x + j, 0, LCD_WIDTH), clamp(y + i, 0, LCD_HEIGHT), bmp[i * width + j]);
}
}
}
}

А отрисовать нашу картинку можно вот так:

LcdDrawBitmap(fb, (short*)(GLOBAL(context) + (uint32)&lada_bmp), LADA_WIDTH, LADA_HEIGHT, 0, 0);

Почему бы не спрятать дескриптор изображения в структуру?

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

И вот наш результат. Не удивляйтесь тестовому изображению, просто я — прирожденный ТАЗовод!

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Помощь

Переходим к геймплею. Сама по себе «Змейка» в реализации — простая игра, где каждый уровень представляет из себя примитивную сетку. Алгоритм работы заключается в том, что раз в n-миллисекунд вызывается один игровой тик, который двигает игрока в текущем выбранном направлении. Если в момент тика нажата одна из кнопок-стрелок — направление движения меняется — тут всё очевидно:

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

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

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Для продвижения змейки по направлению, необходимо в обратном порядке обойти массив сегментов, переставляя текущий крайний сегмент на позицию предыдущего сегмента и так до самой головы. Позиция головы будет инкрементироваться относительно выбранного направления:

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Для того, чтобы проверить скушали ли мы яблочко — достаточно сравнить координаты головы и объекта. Если они идентичны, то прибавляем очко и переносим яблоко на другую позицию:

if(state->Segments[SEGMENT_HEAD].X == state->AppleX && state->Segments[SEGMENT_HEADER].Y == state->AppleY)
{
state->Score++;
MoveApple(state);
}

Для респавна яблочка можно использовать два подхода: параметрические таблицы с заранее прописанными координатами объекта (эдакая псевдослучайность) и обычный PRNG-генератор, который путем реверса можно найти в прошивке.

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Благодаря дипсику удалось определить, что в прошивке используется LCG. Вообще, нейронки очень сильно помогают при реверсе и могут легко анализировать стандартные алгоритмы: я тестировал от простых по типу memcpy, до относительно сложных как например программное деление по модулю и программная растеризация треугольника по Scanline-алгоритму.

unsigned int rand()
{
int v0; // r3
int v1; // r4
int v2; // r1

v0 = MEMORY[0x4710E80] - 1;
v1 = *(_DWORD *)(4 * MEMORY[0x4710E84] + 0x4710E88) + *(_DWORD *)(4 * MEMORY[0x4710E80] + 0x4710E88);
*(_DWORD *)(4 * MEMORY[0x4710E84] + 0x4710E88) = v1;
MEMORY[0x4710E80] = v0;
v2 = MEMORY[0x4710E84] - 1;
if ( v0 >= 0 )
{
--MEMORY[0x4710E84];
if ( v2 < 0 )
MEMORY[0x4710E84] = 54;
}
else
{
--MEMORY[0x4710E84];
MEMORY[0x4710E80] = 54;
}
return (unsigned int)(2 * v1) >> 1;
}

Если же голова оказывается в одном из сегментов или же за полем — игра окончена. Полный вес собранного приложения - 5 килобайт 644 байта! А ниже - демонстрация его работы:

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

❯ Заключение

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

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

Это приносит невероятное моральное наслаждение

А что ещё нужно парню в 23 года? Правильно: чтобы мотор бодро тянул любимую десятку и чтобы реверсилось всё легко и понятно! Исходный код и все что необходимо для установки бинлоадера есть в на моем гите.

А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статью) можно найти на моём YouTube канале.

Важно: друзья! Я уверен, что статью будут читать выходцы с форумов моддеров и возможно даже ребята, связанные с прошивочными боксами. Если у вас есть исходный код или объектные файлы для телефонов Siemens (S-Gold или E-Gold — не имеет значения) и вы хотели бы помочь общему моддерскому делу — напишите пожалуйста мне в Telegram. Несмотря на то, что этот код уже давно никому не нужен и E-Gold/S-Gold уже более 15 лет снят с производства, гарантирую полную анонимность и крутой контент :)

Очень важно! Разыскиваются девайсы для будущих статей!

Друзья! Если вам понравилась сегодняшняя статья про разработку эльфов, то спешу объявить: для подготовки будущих материалов с разработкой самопальных игрушек под необычные устройства, объявляется розыск телефонов и консолей! В 2000-х годах, китайцы часто делали дешевые телефоны с игровым уклоном — обычно у них было подобие геймпада (джойстика) или хотя бы две кнопки с верхней части устройства, выполняющие функцию A/B, а также предустановлены эмуляторы NES/Sega. Фишка в том, что на таких телефонах можно выполнять нативный код и портировать на них новые эмуляторы, чем я сейчас занимаюсь, а затем написать об этом подробную статью и записать видео! Если у вас есть телефон подобного формата и вы готовы его задонатить или продать, пожалуйста напишите мне в Telegram (@monobogdan) или в комментарии. Также интересуют смартфоны-консоли на Android (на рынке РФ точно была Func Much-01), там будет контент чуточку другого формата :)

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

А также я ищу старые (2010-2014) подделки на брендовые смартфоны Samsung, Apple и т. п. Они зачастую работают на весьма интересных чипсетах и поддаются хорошему моддингу, парочку статей уже вышло, но у меня ещё есть идеи по их моддингу! Также может у кого-то остались самые первые смартфоны Xiaomi (серии Mi), Meizu (ещё на Exynos) или телефоны на Linux (например Motorola EM30, RAZR V8, ROKR Z6, ROKR E2, ROKR E6, ZINE ZN5 и т. п., о них я хотел бы подготовить специальную статью и видео т. к. на самом деле они работали на очень мощных для своих лет процессорах, поддавались серьезному моддингу и были способны запустить даже Quake!). Всем большое спасибо за донаты!

Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост
Самая сложная «Змейка»: Как я отреверсил и хакнул кнопочный телефон, чтобы написать для него классическую игру Телефон, Гаджеты, Программирование, Реверс-инжиниринг, Хакеры, Моддинг, Кастомизация, Игра змейка, Гифка, Длиннопост

А ещё я держу все свои мобилы в одной корзине при себе (в смысле, все проекты у одного облачного провайдера) — Timeweb. Потому нагло рекомендую то, чем пользуюсь сам — вэлкам:

Показать полностью 19
[моё] Телефон Гаджеты Программирование Реверс-инжиниринг Хакеры Моддинг Кастомизация Игра змейка Гифка Длиннопост
24
Посты не найдены
О Нас
О Пикабу
Контакты
Реклама
Сообщить об ошибке
Сообщить о нарушении законодательства
Отзывы и предложения
Новости Пикабу
RSS
Информация
Помощь
Кодекс Пикабу
Награды
Команда Пикабу
Бан-лист
Конфиденциальность
Правила соцсети
О рекомендациях
Наши проекты
Блоги
Работа
Промокоды
Игры
Скидки
Курсы
Зал славы
Mobile
Мобильное приложение
Партнёры
Промокоды Biggeek
Промокоды Маркет Деливери
Промокоды Яндекс Путешествия
Промокоды М.Видео
Промокоды в Ленте Онлайн
Промокоды Тефаль
Промокоды Сбермаркет
Промокоды Спортмастер
Постила
Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии