Сообщество - Лига программистов

Лига программистов

2 395 постов • 12 006 подписчиков

Популярные теги в сообществе:

Как переехать с одного ИИ-агента на другой и не потерять историю работы⁠⁠

Как переехать с одного ИИ-агента на другой и не потерять историю работы

Недавно столкнулся с неприятной ситуацией. После проверки личности Anthropic заблокировала мне доступ к платной организации Claude Code. Подписка была Max 20x, пользовался активно, вёл сразу несколько проектов.

Ну заблокировали и заблокировали. Есть ведь Codex, Kimi, Cursor, OpenCode и другие инструменты. Казалось бы, бери другой и продолжай работать.

Но возникла проблема.

За несколько месяцев в Claude Code накопилась куча переписок по проектам. Мы обсуждали архитектуру, выбирали библиотеки, разбирали ошибки, отказывались от одних решений в пользу других. И далеко не всё это записывалось в документацию.

Как переехать с одного ИИ-агента на другой и не потерять историю работы

Код остался на компьютере, репозитории на GitHub тоже. А вот новый ИИ-агент понятия не имеет, почему программа устроена именно так и что мы планировали делать дальше.

Сначала попробовал встроенный импорт Claude Code в Codex. Часть истории перенеслась, но привязки диалогов к проектам получились кривыми, а некоторые данные потерялись. Результат не понравился.

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

Так нашёл Hansard.

Что это такое

Hansard собирает историю работы разных ИИ-агентов в отдельный локальный архив и позволяет обращаться к ней из других инструментов.

Например, раньше работали с Claude Code, теперь используете Codex. Или решили перейти с Kimi Code на OpenCode. Или хотите найти старое обсуждение из Cursor.

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

Поддерживаются Claude Code, Codex, Cursor, Kimi Code, OpenCode, Antigravity и множество других инструментов. Историю Gemini CLI тоже можно импортировать, хотя полноценное подключение Recall непосредственно к Gemini CLI пока не предусмотрено.

И самое интересное: Hansard может не только искать старые разговоры, но и передавать контекст конкретной задачи другому агенту.

Как установить

Сайт программы: https://www.hansard.dev/

Для Windows и macOS есть графическое приложение.

Скачиваем установщик, запускаем. При первом открытии программа предложит найти историю установленных ИИ-агентов.

Выбираем нужные источники, указываем All history, чтобы собрать всю доступную историю, а не только последние 30 дней.

Затем выбираем, каким агентам разрешить пользоваться архивом. Например, Codex и OpenCode.

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

Для любителей командной строки есть другой вариант. Потребуется Node.js подходящей версии.

Устанавливаем:

npm install -g hansard

Запускаем настройку:

hansard init --since all

Проверяем результат:

hansard status

Если Codex не подключили во время настройки:

hansard integrations add-to codex

После этого перезапускаем Codex.

Как вернуть контекст проекта

Открываем в Codex нужный проект и пишем примерно следующее:

$recall Найди через Hansard историю этого проекта, в том числе диалоги из Claude Code. Изучи предыдущие решения, договорённости, выполненные и незавершённые задачи. Сравни найденное с текущими файлами проекта и историей Git. Расскажи, на чём мы остановились, что уже сделано и что планировалось дальше. Пока ничего не меняй.

Codex обращается к архиву, ищет связанные с проектом разговоры и восстанавливает контекст.

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

Кстати, в Claude Code для поиска используется /recall, в Codex — $recall. В некоторых других инструментах достаточно обычного запроса, если подключён MCP.

А можно перейти обратно?

Можно. И это, пожалуй, самое полезное.

Архив Hansard не принадлежит ни Claude, ни Codex. Сегодня можно работать в одном агенте, завтра в другом, а затем вернуться к первому.

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

Но для большинства задач мне как раз это и требовалось: не переносить интерфейс переписки, а сохранить накопленные знания о проекте.

Что стоит учитывать

Hansard не восстановит историю, если исходные файлы уже удалены и резервных копий нет.

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

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

И ещё: восстановленный контекст желательно проверять. ИИ вполне может неправильно понять старое обсуждение или пропустить важное решение.

В общем, для меня история закончилась вполне удачно. Доступ к Claude Code потерял, зато нашёл способ перестать зависеть от истории одного конкретного агента.

Если тоже используете несколько ИИ-инструментов для разработки, возможно, пригодится.

А вы как переносите контекст между агентами? Или каждый раз начинаете разговор с чистого листа?

Показать полностью 1

PyCity: метавселенная, где Python строит город⁠⁠

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

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

Главный экран

Главный экран

Задача

Обучение программированию упирается в отсутствие физической обратной связи. Ученик пишет код, получает Hello, World! или Traceback, и на этом цикл заканчивается. Код не имеет веса, не рушится, не строится. Через две недели мотивация падает.

PyCity — попытка сделать так, чтобы каждая корректная строка на Python 3.11 материализовалась в 3D-городе. Написал функцию — надстроил этаж. Исправил ошибку — потушил пожар. Решил задачу — получил новый модуль для квартала. Это не геймификация ради геймификации, а способ дать коду визуальную плотность и мгновенную обратную связь.

Архитектурно город разбит на сектора 5×5, в каждом — ученик. Код исполняется в браузере через WebAssembly (CPython 3.11), результат передаётся в Three.js и отображается как геометрия.


Что реализовано

300 уроков, разбитых на уровни. Программа покрывает:

  • синтаксис, типы, условия, циклы, функции;

  • ООП, comprehensions, работу с файлами, исключения;

  • алгоритмы, Big-O, SQLite, паттерны проектирования;

  • асинхронность, сокеты, хэширование, JWT;

  • нейросети: от перцептрона до внимания QKV, LoRA и RAG;

  • распределённые системы: Raft/Paxos, фильтр Блума, LRU-кэш, WebSocket.

Финалы уровней — не тесты, а проекты: банковская система, ядро ИИ, «активация автономного сознания». Формулировки громкие, но по факту это набор задач, где нужно собрать работающий модуль.

Внутри урока открывается не просто редактор, а оконный менеджер: IDE с подсветкой, инспектор памяти, диспетчер процессов, имитация pip. Код исполняется локально в WASM, поэтому нет задержки на сервер. Есть ExecutionGuard, который прерывает бесконечные циклы, чтобы вкладка не зависала.

ИИ-ассистент объясняет ошибки компилятора человеческим языком: не «замените строку 4», а «ты забыл закрыть скобку в 4-й строке, поэтому интерпретатор ждёт продолжения».


Практические режимы

Код-дуэли 1 на 1. Два ученика получают одну задачу, ставят XP в эскроу. Кто первый отправляет корректное решение — забирает банк.

Код-дуэли

Код-дуэли

Охота на баги. Даётся реальный сломанный код: зависший светофор, утечка памяти из-за def add(item, q=[]), KeyError на сервере. Нужно найти и исправить.

Охота на баги

Охота на баги

SQL-майнфрейм. SQLite через WebAssembly, 4 связанные таблицы, 50 контрактов от SELECT до рекурсивных CTE и оконных функций.

SQL-майнфрейм

SQL-майнфрейм

Нейро-Колизей.
Режим, где ученик программирует ИИ боевого робота-меха. Пишет функцию make_decision(me, enemies, arena), которая на каждом такте возвращает действие. Дальше мех сражается сам — без ручного управления.

Нейро-Колизей

Нейро-Колизей


Инструменты преподавателя

У учителя есть 3D-стол с живыми статусами 25 учеников, электронный журнал, автоматическая посещаемость по «правилу 15 минут» и управление аномалиями. Последнее звучит необычно, но решает конкретную задачу: если ученик отвлёкся, учитель может наслать на его квартал кислотный дождь или поджечь здание. Пожар тушится решением текущей задачи. Это не наказание, а механизм возврата внимания.


3D-мегаполис

Вид от первого лица

Вид от первого лица

Город — не декорация, а основная система мотивации. Он разбит на сектора 5×5, каждый сектор занимает площадку 350×350 метров. Внутри сектора ученик строит свой квартал: этажность зданий, дороги, инфраструктура — всё это напрямую зависит от прогресса в уроках и потраченного XP.

Есть два режима взаимодействия:

  • Walk Mode (FPS). Ученик переключается в вид от первого лица, ходит по улицам, заглядывает в окна небоскрёбов, гуляет по кварталам одноклассников. Это не просто прогулка: так видно, кто продвинулся дальше, а кто застрял на стартовой вышке.

  • Режим проектора (кино-тур). Для школьного проектора или открытого урока. Камера взмывает в небо и запускает один из четырёх сценариев: тур по кадетам (7 секунд на квартал), бреющий полёт между небоскрёбами, круговую панораму всего мегаполиса или волнообразный дрейф над облаками.

Город живой: по дорогам ездят кибер-кары, останавливаются на светофорах, уступают друг другу дорогу. На высоте 65 метров курсирует монорельс на магнитной подушке. Это не статичная картинка — трафик и поезд работают постоянно.

Технически город собран на Three.js и React Three Fiber. Геометрия процедурная: здание не хранится как отдельная модель, а собирается из параметров (этажность, тип, материалы). Поэтому 25 кварталов по 350 метров не превращаются в гигабайты ассетов.


Кибер-Хаб


Экономический центр, где заработанный XP конвертируется в визуальное развитие квартала. Логика простая: опыт, полученный в дуэлях, рейдах и уроках, тратится на мегаструктуры.

Примеры объектов:

  • Салют Системы (5 000 XP) — неоновый фейерверк над крышами.

  • Неоновое Имя Архитектора (10 000 XP) — голограмма позывного в стратосфере.

  • Зенитные Прожекторы (12 000 XP) — четыре луча по углам квартала.

  • Золотые Магистрали (15 000 XP) — сияющий контур дорог вокруг сектора.

  • Монумент Python (20 000 XP) — обелиск с золотым обвивающим питоном.

  • Плазменный Купол (25 000 XP) — силовой купол над районом.

  • Башня Тесла (35 000 XP) — генератор плазменных дуг.

  • Зиккурат Данных (45 000 XP) — чёрная пирамида серверов.

  • Орбитальный Космо-Лифт (90 000 XP) — 2.6-километровый луч с движущейся кабиной.

  • Сфера Дайсона (250 000 XP) — рукотворная звезда в магнитных кольцах.

  • Квантовая Сингулярность (500 000 XP) — вращающаяся чёрная дыра над сектором.

  • Цитадель Гранд-Оверлорда (1 000 000 XP) — 200-метровый золотой шпиль.

Помимо мегаструктур есть апгрейды: спутниковый линк, оверклокинг виртуального процессора, золотые рамки аватара, эксклюзивные титулы для Зала Славы.

Смысл не в том, чтобы «купить красоту», а в том, чтобы дать XP материальный вес. Опыт не просто цифра в профиле — он меняет облик города, который видят все.


Алгоритмы и справочник Big-O

Три вида

Три вида

Визуализатор сортировок. Пошаговая демонстрация BubbleSort, InsertionSort, MergeSort и QuickSort. Сравниваемые элементы подсвечиваются красным, опорный элемент (pivot) — жёлтым, отсортированные позиции — зелёным. Ученик видит не результат, а процесс: как массив перестраивается на каждом шаге.

Интерактивное бинарное дерево поиска. Ученик вводит числа, наблюдает ветвление узлов, запускает поиск ключа за O(log N) с подсветкой пути. Отдельно можно вызвать балансировку по стандарту AVL и увидеть, как дерево перестраивается.

Справочник асимптотической сложности. Цветовая шкала от O(1) до O(2^N) с примерами из реальной разработки. Не абстрактные формулы, а конкретные операции: почему доступ к элементу списка — O(1), а поиск в неотсортированном массиве — O(N), и где в реальном коде это превращается в проблему.


Центр сертификации

Квалификация и сертификация

Квалификация и сертификация

Трёхуровневая система квалификации, привязанная к количеству пройденных уроков:

  • Уровень I — Junior Python Developer (150 уроков). Синтаксис, функции, ООП, базовые базы данных, основы математики перцептрона.

  • Уровень II — Middle Systems Architect (200 уроков). Алгоритмы на графах (BFS/DFS), асинхронные сокеты TCP/IP, упаковка байтов через struct, очереди, семафоры, паттерны GoF.

  • Уровень III — Senior AI & AGI Engineer (300 уроков). Трансформеры, механизм внимания QKV, квантование весов INT8, микросервисные саги, консенсус Raft, ядро AGI.

После сдачи теста ученик получает именной диплом с криптографическим идентификатором и возможностью экспорта в PDF. Это не «сертификат за прохождение курса», а привязка к конкретному объёму материала.


Итог

PyCity — работающий проект, а не концепт. Он решает конкретную проблему: даёт коду визуальную обратную связь и удерживает внимание за счёт игровых механик. Технически это связка Next.js, Three.js, WASM и Socket.IO, которая выдерживает одновременную работу группы.

Ссылка: pycity.ru. Если вы преподаёте Python или работаете с браузерным 3D — проект открыт для обсуждения архитектурных решений =)

Показать полностью 10

Написал скрипт распознания объектов с веб камеры⁠⁠

Написал скрипт распознания объектов с веб камеры

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

этот код загружает необходимые библиотеки, задействует веб камеру и считывая видеопоток с вебки обрабатывает его через нейросетевую medium модель, можно поставить и другую типа nano но для меня medium оптимальна (с моими жирнющими 8гб оперативки), завершение программы происходит через "q"

результат работы кода выглядит вот так:

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

Основная линейка моделей (по размеру)

Каждую модель можно загрузить, просто меняя последнюю букву в названии (например, yolov8n.pt, yolov8s.pt и т.д.):

  • yolov8n.pt (Nano): Самая маленькая и быстрая модель.

    • Описание: Разработана для микроконтроллеров, мобильных телефонов и Edge-устройств (например, Raspberry Pi). Минимально нагружает процессор, но может пропускать мелкие или перекрытые объекты.

  • yolov8s.pt (Small): Легкая модель, сбалансированная под CPU.

    • Описание: Хороший компромисс между скоростью и качеством. Идеальна, если инференс нужно запускать на обычном процессоре ноутбука без мощной видеокарты, сохранив адекватную точность.

  • yolov8m.pt (Medium): Средняя модель. (Используется у меня)

    • Описание: Золотой стандарт для большинства коммерческих задач. Требует наличия GPU среднего уровня для стабильного реалтайма, отлично распознает сложные сцены.

  • yolov8l.pt (Large): Большая модель.

    • Описание: Высокая точность детекции, стабильно держит мелкие детали. Из-за веса существенно снижает FPS на слабых устройствах, требует хороших видеокарт (серии RTX).

  • yolov8x.pt (Extra Large): Максимальная точность архитектуры.

    • Описание: Самая тяжелая, но и самая точная модель в линейке. Применяется там, где критически важна безошибочность (например, в медицине или анализе спутниковых снимков), а скорость обработки кадра вторична.


Специализированные суффиксы (под конкретные задачи)

Если вам нужна не просто детекция объектов рамками (по умолчанию), к названию весов добавляются суффиксы задач. Все они так же поддерживают градации от n до x:

  • -seg (Segmentation / Сегментация): Например, yolov8m-seg.pt.

    • Описание: Вместо квадратных рамок обводит объекты по их реальному контуру пиксель за пикселем.

  • -pose (Pose Estimation / Скелет): Например, yolov8n-pose.pt.

    • Описание: Находит человека и определяет ключевые точки его тела (суставы, глаза, уши) для анализа позы или движений.

  • -cls (Classification / Классификация): Например, yolov8s-cls.pt.

    • Описание: Не ищет координаты объектов, а просто выдает ответ, что в целом изображено на картинке (например, «кошка» или «собака»).

  • -obb (Oriented Bounding Boxes / Повернутые рамки): Например, yolov8m-obb.pt.

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

Показать полностью 1 1
90

Ответ на пост «С чего начать учить программирование, если бесплатных материалов слишком много: порядок важнее ресурса»⁠⁠2

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

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

Тем более что программирование уже движется от ручного написания кода к описанию моделей и требований. Примеры разных подходов: GitHub Spec Kit (https://github.github.com/spec-kit/), JetBrains MPS (https://www.jetbrains.com/mps/), Smart1Spec для 1С (https://smart1spec.com/), OpenSpec (https://openspec.dev/), TLA+ (https://lamport.azurewebsites.net/tla/tla.html).

ИИ всё лучше справляется с реализацией. Но точно сформулировать задачу, обнаружить противоречие, построить абстракцию и проверить корректность результата — это уже математическое мышление.

Поэтому мой порядок: математика → один язык → алгоритмы и парадигмы → модели и спецификации → разработка с ИИ. Причём ИИ можно использовать на всех этапах обучения, но не вместо собственного мышления.

Продолжение поста про UIscript⁠⁠

Серия Мой UIscript, личный опыт

Ещё раз привет, друзья, не ожидал такого количества комментариев (как негативных, так и позитивных) — всем спасибо.

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

Калькулятор на UIscript. Русский и английский код - одинаковый результат

Также калькулятор с идентичным интерфейсом, но на HTML, CSS и JavaScript

Также калькулятор с идентичным интерфейсом, но на HTML, CSS и JavaScript

Во-вторых, я говорил, что делаю с ИИ, но чётко разграничил, что не «написал промпт дипсику и выложил на GitHub», нет, я придумал проект, синтаксис, общую архитектуру, все фичи (двуязычность, например), а также тестировал и исправлял баги, которые нашёл в коде. В-третьих, зачем ещё один язык? Как по мне для супер простого создания интерфейсов с лёгким синтаксисом (как по мне) языков либо нет, либо я не знаю, Yoptascript ну не приличный, как по мне, хотя крутой.

И ещё хочу сказать, что цель языка — не только обучение, но и как побочный эффект — подходит для быстрого прототипирования, то есть легко набросать калькулятор, интерфейс и разные мелкие программки.

Ссылка на прошлый пост для тех кто не читал: Создал язык программирования на русском (и не только) для обучения детей и новичков. Оцените UIscript плиз

P.S. Старался ответить на каждый комментарий, даже негативный, но их набралось много, и поэтому решил сделать отдельным постом (этот пост)

Показать полностью 3

Ответ на пост «Создал язык программирования на русском (и не только) для обучения детей и новичков. Оцените UIscript плиз»⁠⁠2

Идея хорошая и интересная. С 90х не видел ничего приятного для лёгкого изучения программирования детям. И да, сам задумывался последние несколько лет об этом.

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

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

Ваша язык имеет задатки инициативности, но недочётов простого понимания и использования пока не меньше.

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

И да, нужно сделать все возможное, чтобы он не был похож на это 1Сное издевательство над языками программирования %))

Как криптографическое приложение писал, от школьного проекта до сегодня⁠⁠

Привет, Пикабу!

Ощущаете отсутствие конфиденциальности в мессенджере? Мое приложение не обещает анонимность в полном объеме, оно другого рода. Я создавал его изначально как инструмент шифрования переписки в мессенджере. Идея была проста: зашифровать текст перед отправкой в мессенджер, чтобы никто сторонний (например при утечке базы данных) не смог его прочитать.

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

Я презентовал приложение сначала на проектной работе, а затем и на конференции "Шаг в будущее" на которую меня директор поставил. Результат был ошеломительным, но я бы не сказал что те люди что то понимали в криптографии, так что впечатлить их было не сложно :).

Вот так выглядела версия 1.0 (Остальные к сожалению утеряны)

Вот так выглядела версия 1.0 (Остальные к сожалению утеряны)

Спустя время я оставил Паскаль и выучил C# и .NET Maui. Позже я вспомнил о приложении и решил - я сделаю полностью бесплатный ремейк без рекламы и с открытым исходным кодом!

Название я выбрал сомнительное - LOKI-Cryptographer, стоило подумать о нем лучше, ну да ладно. В приложении накидал простой интерфейс вдохновляясь другим приложением. Кстати - вот тут то была моя головная боль - вид кнопок, я тогда был неопытен и использовал ImageButton из за чего они выглядели огромными и размытыми. Позже до меня дошло использовать ttf кнопки.

К сожалению скриншота приложения с ImageButton я не нашел, зато есть ранний концепт интерфейса уже с ttf кнопками

К сожалению скриншота приложения с ImageButton я не нашел, зато есть ранний концепт интерфейса уже с ttf кнопками

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

Под капотом

Приложение кстати с открытым исходным кодом.

Вот метод шифрования на момент выкладывания статьи:

[RelayCommand]
private async Task CryptMessege()
{
try
{
if ( UserTextIn == null || UserTextIn.Length == 0) return;


byte[] MessegeToByte = Encoding.UTF8.GetBytes(UserTextIn);
byte[] CryptMessege = new byte[MessegeToByte.Length];
byte[] Nonce = new byte[12];//рандомное число
SecureRandom random = new SecureRandom();//рандомное число для кривой
byte[] RandomForBytes = new byte[32];


// Ассиметрия
random.NextBytes(RandomForBytes);
X25519PrivateKeyParameters MyPrivateKey = new X25519PrivateKeyParameters(RandomForBytes);// кривая X25519
X25519PublicKeyParameters MyPublicKey = MyPrivateKey.GeneratePublicKey();


string? a1 = await SecureStorage.Default.GetAsync("MyNowPrivateKey");// Приватный ключ
if (string.IsNullOrEmpty(a1))
{
await SecureStorage.Default.SetAsync("MyNowPrivateKey", Convert.ToBase64String(RandomForBytes));
}
else
{
SecureStorage.Default.Remove("MyNowPrivateKey");
await SecureStorage.Default.SetAsync("MyNowPrivateKey", Convert.ToBase64String(RandomForBytes));
}


if (string.IsNullOrEmpty(EphemeralKeyUser)) //если ключ пользователя null
{
byte[] MyEphemeralBytes = MyPublicKey.GetEncoded(); //промежуточный ключ пользователя
EphemeralKeyUser = Convert.ToBase64String(MyEphemeralBytes);
// сохранение своего первого ключа


string a = Preferences.Default.Get("MyEphemeralKey", string.Empty);
if (!string.IsNullOrEmpty(a))
{
Preferences.Default.Clear("MyEphemeralKey");
}


Preferences.Default.Set("MyEphemeralKey", Convert.ToBase64String(MyEphemeralBytes));
}

byte[] SomeoneEphemeralBytes = new byte[32]; // массив под чужой помежуточный ключ
if (!string.IsNullOrEmpty(SomeoneEphemeralKey))
{
SomeoneEphemeralBytes = Convert.FromBase64String(SomeoneEphemeralKey);
}
else
{// если не ввел ключ собеседника
return;
}


if (SomeoneEphemeralBytes == null || SomeoneEphemeralBytes.Length == 0) return; //подстраховка на промежуточный ключ собеседника
X25519PublicKeyParameters SomeoneRestoredEphemeral = new X25519PublicKeyParameters(SomeoneEphemeralBytes, 0);


byte[] GeneralKey = new byte[32]; // общий ключ
MyPrivateKey.GenerateSecret(SomeoneRestoredEphemeral, GeneralKey, 0);


//создание второго промеж ключа для следующего сообщения
SecureRandom random2 = new SecureRandom();
byte[] RandomForBytes2 = new byte[32];
random2.NextBytes(RandomForBytes2);


X25519PrivateKeyParameters MyPrivateKey2 = new X25519PrivateKeyParameters(RandomForBytes2);
X25519PublicKeyParameters MyPublicKey2 = MyPrivateKey.GeneratePublicKey();
byte[] MyEphemeralBytes2 = MyPublicKey2.GetEncoded();
EphemeralKeyUser = Convert.ToBase64String(MyEphemeralBytes2);

// Симметрия
try
{
RandomNumberGenerator.Fill(Nonce);
byte[] Gamma = HKDF.DeriveKey(HashAlgorithmName.SHA256, GeneralKey, MessegeToByte.Length, Nonce);


try
{
for (int i = 0; i < MessegeToByte.Length; i++)
{
CryptMessege[i] = (byte)(MessegeToByte[i] ^ Gamma[i]);
}
}
finally
{
CryptographicOperations.ZeroMemory(Gamma);
}
}
finally
{
CryptographicOperations.ZeroMemory(GeneralKey);
}


// Вывод инфы на интерфейс
try
{
string CryptMessegeBase64 = Convert.ToBase64String(CryptMessege);
string NonceBase64 = Convert.ToBase64String(Nonce);
string MyEphemeralBytes2Base64 = Convert.ToBase64String(MyEphemeralBytes2);
string Result = $"{CryptMessegeBase64}✶{MyEphemeralBytes2Base64}{NonceBase64}";


UserTextOut = Result;

}
finally
{
CryptographicOperations.ZeroMemory(MessegeToByte); // очистка остального
}


} catch (Exception) {}

}

Жаль что на Пикабу нет оформления под код. Если кратко о асимметрии:

  1. Генерация общего ключа реализована на базе эллиптической кривой X25519.

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

Оперативная память зачищается от остатков ключей и гаммы сразу после использования.

О симметрии:

В коде используется HKDF (SHA256) для создания уникальной гаммы на основе общего ключа и одноразового числа (Nonce), а затем применяется XOR.

Открытый исходный код можете посмотреть на моей странице в GitHub

Я понимал что одних слов недостаточно чтобы добиться доверия, поэтому выбрал единственное верное решение, проект - Open Source, открытый исходный код здесь GitHub. Только лицензию прочитайте сначала.

О релизе и сторах

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

<ApplicationId>com.companyname.loki</ApplicationId>

Ну и залил, из за этого я уже не могу его поменять. Больше проблем с Рустором не возникло. Там кстати новая версия 2.1.3 прошла модерацию. Я вначале пути думал встроить рекламу в приложение, но быстро отказался от этой идеи. Думал еще куда-нибудь выложить, но что то руки не дошли.

Вывод

Я рад что начал писать этот проект, мне нравится то, куда он меня привел, я очень многому научился и многое узнал работая над ним. Я пишу его один с декабря 2025 года.

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

Я наверняка где-то накосячил, все таки я не робот, если что найдете - воспользуйтесь внутренней возможностью отправить мне сообщение об ошибке, я исправлю.

Кто хочет просмотреть фулл код сам GitHub (Там же можно скачать андройд и пк версию)

Страница в Rustore - Rustore (только андройд версия)

Мой тгк с техническими новостями - Telegram (Там дублировать пост не буду, только технические апдейты по коду)

Показать полностью 2
280

Создал язык программирования на русском (и не только) для обучения детей и новичков. Оцените UIscript плиз⁠⁠2

Серия Мой UIscript, личный опыт

Друзья, немного расскажу и начну с предыстории. Я решил создать язык программирования UIscript.

Думаю, многие спросят: зачем, неужели языков не хватает? Если кратко, то да — в нише, которую я выбрал, их действительно нет или они не совсем подходят. Хотелось создать такой язык программирования, в котором не придется заучивать тонны англоязычных команд и перегруженный синтаксис. Чтобы он идеально подходил для изучения детьми и начинающими программистами, и они могли сразу видеть результат своей работы — графический интерфейс с кнопочками. И чтобы можно было сразу сосредоточиться на понимании самой логики программирования. И еще — да, желательно на русском языке. (Позже я добавил для тех, кому нравится английский, двуязычную поддержку).

Пример простейшей программы на русском

Пример простейшей программы на русском

И на английском то же самое.

И на английском то же самое.

В общем, за основу я взял JavaScript (понятно, что HTML и CSS в придачу). Он работает под капотом, но синтаксис ещё раз уточню свой. Почему? Во-первых, он изначально понимается браузером и отлично подходит для создания интерфейсов. Где-то за месяц я разработал команды, синтаксис и отредактировал код. Признаюсь, делал UIscript я вместе с ИИ: на него переложил рутинное написание кода, а сам строил всю логику, синтаксис и архитектуру, а также исправлял ошибки и тестировал. И совсем недавно я наконец закончил эту разработку. Конечно недочётов ещё много, но не всё сразу...

Пример простейшей программы - викторины

Пример простейшей программы - викторины

Ещё добавил предпросмотр

Ещё добавил предпросмотр

Пишу сюда в поисках ответа на вопрос: реально ли полезную штуку я придумал или всё же где-то промахнулся? Фотку суперпростого синтаксиса прилагаю к посту.

Проект под свободной лицензией Apache 2.0

Код полностью безопасен и открыт на GitHub (если кого интересует, то там же можно и скачать)

https://github.com/gromhorse90022110-dot/uis_uiscript

И ещё, хочу сразу сказать: этот проект не приносит мне никакой коммерческой выгоды, денег или ещё каких-либо материальных благ, поэтому прошу не рассматривать как рекламу, это мой опыт и результат, если кому интересно - я рад!

Показать полностью 4
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества