Обновить
144.94

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

Извращения с кодом

Сначала показывать
Порог рейтинга
Уровень сложности

Шел 2025й год… а BASIC все еще в строю. Современной автоматизации сметчика пост — КС-ки

Уровень сложностиПростой
Время на прочтение20 мин
Количество просмотров4.3K

Сейчас в программные решения, связанные с IT в строительном секторе, вливаются большие деньги. Появляются новые программные продукты на базе ERP/CRM систем, которые раньше проектировались под маркетинг и продажи, для электронного документооборота (ЭДО) инженеров (ИТР). Частью современной стратегии Заказчиков многих рангов является путь цифровизации бумажного документооборота в пользу электронного, для чего Минстрой РФ старательно разрабатывает и обязывает к внедрению новые форматы электронных файлов типовых форм документов, на база XML. В этих условиях настоящая статья посвящена стыку новых и старых технологий документооборота в строительстве, на примере формирования комплекта закрывающих финансовых документов по типовым Контрактам в Строительстве.
Читать дальше →

Портирование Dangerous Dave для NES/Dendy

Уровень сложностиСредний
Время на прочтение16 мин
Количество просмотров5.3K

Тема игр из детства до сих пор тревожит умы очень многих людей, а возможность реализовать свои фантазии в виде игры для любимой консоли вообще взрывает мозг (особенно в контексте игры, которую вы увидели на картинке ☺). И в этой статье я расскажу вам о своём опыте портирования Dangerous Dave in the Haunted Mansion для NES/Famicom/Dendy.

Читать далее

Пилим движок Arcanum. Урок 01. Начало

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров14K

Приветствую, Хабравчане!

Начинаю цикл статей, по воссозданию движка моей любимой игры Arcanum. Цель, написать движок Arcanum'а и в каждой статье шаг за шагом добавлять функционал с описанием кода, принятых решений, прогресса.

Читать

Я на дереве сижу, препроцессинг провожу

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров2.3K

Согласно описанию,


Tree-sitter — это инструмент для генерации синтаксических анализаторов и библиотека инкрементного синтаксического анализа. Он может создавать конкретное синтаксическое дерево для исходного файла и эффективно обновлять синтаксическое дерево по мере редактирования исходного файла.

Но как Tree-sitter справляется с языками, в которых необходима стадия препроцессинга?

Читать дальше →

identity functions являются описаниями типов

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров722

Добрый день. Меня зовут Тимур и я программист.

На днях я закончил одну фичу связанную с хромиумом (пробросил disk_cache в webextensions api, это дает прямой доступ как к http кешу так и к code cache и многим другим - первый шажок к антидетект браузеру), но перед тем как писать статью на эту тему решил взять паузу и немного остудить мозг. Обычно я в таких ситуациях устраиваю ревизию своих записей, спорю с самим собой из прошлого, иногда я его побеждаю иногда он меня, ниже один из таких этюдов, предлагаю обсудить.

Давайте поговорим об identity функциях. Да, именно так, во множественном числе.

Читать далее

Go: жарим общие данные. Атомно, быстро и без мьютексов

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров13K


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

Но в этой статье мы поговорим о другом. Современные процессоры имеют поддержку атомарных операций, что позволяет на основе них организовывать работу с общими данными до нескольких раз быстрее, чем с помощью общепринятых вариантов. Так как мьютексы реализованы на основе ОС, каналы сделаны на основе внутреннего кода Go с использованием тех же мьютексов из ОС под капотом, а атомарные операции делает сам процессор аппаратно за существенно меньшее количество тактов.
Пожарим омлет по атомному?

Как я bash писал на Chat GPT, или IMAP to API при помощи Fetchmail

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров1.5K

Как получить правильный ответ от Chat GPT — так же как и в реальной жизни — задать правильный вопрос. Какой вопрос правильный? Да кто ж его знает, но найти его с чатом стало проще, чем просто копаться на stackoverflow. Про это и статья... Ну и помимо этого под катом работающий скрипт, который слушает почту по IMAP и пересылает письма с вложениями и русским языком на API endpoint.

Читать далее

Подборка игр с низкоуровневым программированием

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров40K

TL;DR

Игры от Zachtronics:

TIS-100, EXAPUNKS, SHENZHEN I/O

Про создание процессора от логических элементов и до написания кода на ассемблере: браузерная бесплатная nandgame.com, более продвинутая Turing complete.

Если Вам нравится какая-то игра из перечисленных - наверно, и остальные тоже подойдут. В каждую из них я наиграл по 30+ часов, получил кучу удовольствия и научился чему-то новому.

Подробности

Как поделить не деля или оптимизация деления компиляторам(и)

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров11K

Если вы никогда не пробовали смотреть как код на C++ разворачивается компилятором в код Assembly – вас ждёт много сюрпризов, причём, не нужно смотреть какой-то замудренный исходный код полный templates или других сложных конструкций: рассмотрите следущий snippet:

Смотреть код

Что такое Python и с чем его едят

Время на прочтение4 мин
Количество просмотров5.5K

Поговорим о том кто такие Python-разработчики, чем они занимаются и как ими вообще стать? В этой статье будет информация о...

Изменить своё будущее

Асинхронный телеграм бот на bash, глазами C# программиста

Время на прочтение7 мин
Количество просмотров5.2K

В интернете много статей о том, как создавать простых bash-телеграм ботов. Часто это сводиться к вечному циклу, который раз в несколько секунд дергает tg-api. А что, если у меня хотелок больше чем может предоставить такое решение?

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

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

Читать далее

Как я писал простой язык конфигурации и в итоге перемудрил

Уровень сложностиПростой
Время на прочтение24 мин
Количество просмотров6.1K

Статья о том, как я во время каникул писал-писал язык для описания конфигураций, да и переборщил с объёмом

Читать далее

Имплементация чисел с фиксированной точкой (часть 2)

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров2.5K

Итак, в прошлый раз я представил базовую идею как можно реализовать Fixed-point arithmetic, а так же набросок кода на C++, в котором в комментариях нашли довольно много проблем (а я сам нашёл ещё больше). В этот раз хочется представить улучшенную реализацию, разбор тонких моментов в коде и провести более детальный анализ получаемых результатов.

Читать далее

Ближайшие события

Игрушечная имплементация чисел с фиксированной точкой в C++

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров2.4K

В C++ нет базового типа чисел с фиксированной точкой, в стандартной библиотеке также нет классов для них. В тоже время работа с числами с плавающей точкой (double, float) часто может быть неочевидна (например, ответьте на вопрос: ассоциативна ли операция сложения над ними?), вдобавок язык предоставляет (часто критикуемую) возможность перегрузки арифмитических операторов, подталкивая нас к созданию собственного типа данных.

Прежде чем писать код, давайте повторим мат. часть, а именно о представление чисел в типах uint8_t, int8_t и особенностях арифмитических операциях над ними. Итак, сложенение двух uint8_t происходит по модулю 256, то есть 1+2 = 3, но 1 + 255 = 0, для int8_t отрицательные значения можно ввести следущим образом: отрицательные числа соответсвуют тем безнаковым числам из uint8_t которые складываясь по модулю 256 дадут ноль, то есть -1 будем в памяти выглядить как 255 (FF). Границы типа int8_t -128...+127, для отрицательных чисел старший бит всегда равен 1. При умножении двух int8_t получаем результат типа int16_t, частное от деления int16_t на uint8_t будет иметь тип uint8_t. Все эти сведения носят аболютно тривиальный характер, но, они необходимы для дальнейшего понимания статьи.

Итак, перейдём к основной идее: что если мы мысленно возьмем значение типа int8_t и скажем, что теперь это не число единиц, а скажем, число 1/4 (проговорим словами: это число показывает сколько четвертых частей в исходном числе)? После чего инкапсулируем эту перменную в поле класса и перегрузим для него основные арифмитичекие операторы и напишем свой operator string() для правильного вывода таких чисел. Ниже, можно посмотреть, что получается из этой идеи.

Смотреть код

Ornament-8. Аналоговый функциональный генератор поведения. Часть 1

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров3.1K

В 2019 году я ступил на путь разработки электроники. Моим первым устройством является Орнамент-8. Не судите строго.

- Орнамент-8 это устройство, способное реализовывать сложные конечные автоматы.
- Переход конечного автомата из одного состояния в другое определяется патчем, соединением входов и выходов ячеек Орнамента.
- Каждая из 8 ячеек Орнамента представляет собой моновибратор.
- Если моновибратор запустить, он будет удерживать высокое состояние в течение периода времени, задаваемого потенциометром TIME.
- В момент перехода моновибратора (далее ячейка) из высокого состояния в низкое происходит генерация триггера.
- Этот триггер способен запустить любую другую ячейку Орнамента, кроме самой себя. Для этого необходимо соединить тригерный выход с тригерным входом.
- Если триггер приходит на вход уже активной ячейки, он не поглощается, а поступает на тригерный выход PASS>. Этот выход реализует логику: если ячейка активна -> пусть триггер активирует другие ячейки.
- Помимо тригерных входов и выходов каждая ячейка имеет аналоговый выход, сигнал на котором пропорционален времени активации ячейки от 0 до 1 в зависимости от параметра TIME. Если моновибратор сравнить с наполняющимся сосудом, то аналоговый выход (CV>) показывает уровень жидкости в этом сосуде.
- Каждая ячейка имеет вход для управляющего напряжения (>CV). Приложенное к этому входу напряжение управляет коэффициентом, увеличивающим значение параметра TIME установленного потенциоментром. Приложение управляющего напряжения к >CV можно представить как растяжение времени в системе координат ячейки.

Кажется, что Орнамент-8 это какой-то странный артефакт, упавший из космоса. Зачем он нужен? Что с ним делать? Кто и почему придумал такую странную систему правил?

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

Читать далее

Щупаем первый 8-битный процессор от Intel — 8008

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров16K

После того как я собрал систему на самом первом процессоре от Intel (4004), логичным, в каком-то смысле, шагом было перейти к Intel 8008. Концепция проекта та же - компилируем ассемблерный код на обычном ПК, отправляем скомпилированный бинарник на системную плату через USB, а современный микроконтроллер (stm32) эмулирует ПЗУ и ОЗУ для реального 50-летнего процессора, вставленного в DIP-сокет.

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

Так же как и в случае с 4004, моя плата эмулирует максимально возможный объем памяти, который нативно адресуется процессором. В данном случае, это 16Кб с некоторыми нюансами (об этом отдельно расскажу ниже).

И, конечно же, было занятно сравнить 4004 и 8008 в небольшой нишевой задачке. Да, сравнение весьма условное и какие-либо выводы по нему сделать сложно, но всё равно результаты вышли интересными.

Читать далее

Птичий язык (пятничное)

Уровень сложностиПростой
Время на прочтение13 мин
Количество просмотров3.8K

Стоим мы как-то раз в курилке с коллегами, обсуждаем новый полис в GOAP и планируем расход задач на неделю, пару тасок решили кинуть в обезьянку, две ноды вернуть из ада депрекейта и настроить для работы с новым бт, а одну вернуть мастеру - пусть сам свои фланкинги ковыряет, раз уж он их и заимплементил, а еще две сжечь, а еще надо выделить время, чтобы покопать TSA, потому что новый GD сломал пару вейтов, и теперь хуман ходит не в тот ковер. Еще одну придется собирать из г..на и палок частей других нод, потому что дизайнеру нужно вчера, а времени на инвестигейт нет, покрасим её в фиолетовый, чтобы в билд не пробралась. А программеры с соседнего проекта, не аишные, смотрят на нас круглыми глазами и иногда посмеиваются. И вот я сажусь заполнять таски в jira, и понимаю чему удивлялись мои коллеги, потому что придется все эти короткие термины разжевать в таске. Давайте я дам названия терминов, а вы их попробуете объяснить сами, до раскрытия спойлера? Интересный должен игродевовский квиз получиться :) КДПВ просто прикольная, C++ тут нет.

C++ тут нет

Обратная связь, творящая чудеса

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров12K

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

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

Читать далее

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров18K


Друзья! А знаете ли вы, какой Android-смартфон был первым в мире и как он выглядел? А я теперь не просто знаю, но и могу физически пощупать настоящую легенду своих лет — HTC Dream, также известный как T-Mobile G1. Однако G1 был мне интересен не только как коллекционный девайс для гика, но и потенциально-диковинное устройство для разработки приложений: ведь в современном мире принято повышать минимальную версию Android для работы тех или иных программ, а я свои буду… понижать, чтобы они смогли заработать даже на самой первой версии Android! В сегодняшней статье мы с вами: посмотрим на Dream и постараемся понять, почему HTC выбрала именно Android, неудачно перепакуем аккумулятор, бэкпортируем мои клиенты ВК, YouTube и Telegram и посмотрим, правда ли старичок «бесполезен», как говорят в ретро-обзорах или что-то ещё да может! Интересно? Тогда добро пожаловать под кат!
Читать дальше →

И целых 20 ядер мало

Уровень сложностиПростой
Время на прочтение27 мин
Количество просмотров21K

Если вы посмотрите на общую раздутость современного софта, загружаемые 100 гигабайтные игры, ежегодную Nvidia X090 дающую +20% год от года, и 20-ядерные процессоры, то со стороны может показаться, что оптимизация производительности неважно чего, будь то игры или другой софт, казалось бы, утратила свою актуальность. В эпоху безнаказанной производительности аппаратной части можно расплескивать хоть половину этой мощи, и пользователь этого даже не заметит. Это все может и верно, если вы не делаете игру. Почему же тогда на этих двадцати ядрах, фризит и тормозит (хорошо что не вылетает часто) игра выпущенная два года назад?

Почему тормозит я вам не скажу: возможно разработчики, которые делали её (на не самом новом движке, надо сказать) просто делали игру и не задумывались о рядовых игроках, которые сидят на пятилетнем железе, хотя даже пятилетнее железо уделывает приставки текущего поколения. Возможно это другая причина - когда твоя рабочая машина с 64 гибайтами оперативки и 4080 на борту тянет редактор, то беспокоиться об игроках можно начинать после патча первого дня.

При том, что все эти 30 — 60 — 120 — 200 фпс в играх, это чисто маркетинговый показатель, это время с которой движок может создавать фреймы для видеокарты, но движок это не только картинка, есть физика — а она как работала на 30 фпсах 10 лет назад, так и работает. Или звуковая подсистема, так она вообще своей отдельной жизнью живет в своих приоритетных тредах, мы просто кидаем туда меседжи с настройками и номером фрейма, чтобы засинхронизировать это с картинкой. Это сложно, но решаемо, но звук не привязан к картинке.

Налево пойдешь проца не хватит...

Вклад авторов