Обновить
112.95

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

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

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

C# to Java (вызов C# dll из Java)

Время на прочтение5 мин
Охват и читатели21K
Доброго времени суток!
Помучив немного хабра поиск не нашел подобных тем, в связи с чем создал свою.

Немного лирики:
Имеем шарповскую библиотеку, в которой лежат необходимые для работы методы. Необходимо этими методами воспользоваться из Java программы.
Читать дальше →

PHP: массивы, возвращаемые функцией

Время на прочтение4 мин
Охват и читатели11K
Мне нравится PHP (если вам не нравится — пожалуйста, забудьте про этот топик. Не надо холиварить) и еще мне нравится одна штука, которая прям везде есть, а в PHP отсутствует:

superFunction(foo, bar)[2];


Что делает этот код? Правильно! Возвращает третий элемент массива, который возвращает superFunction() с аргументами foo и bar.

В PHP-синтаксисе это выглядело бы так:

superFunction($foo, $bar)[2];


Вот только этот код выдает Parse Error. «И поделом!» — раздаются уж крики ненавистников синтаксического сахара. Я предлагаю им тоже отправиться подальше от этого топика, чтобы не холиварить и не доказывать, что это не нужно (посмотрите, в каком я блоге это разместил, в конце-то концов).

На сайте PHP я узнал, что такого синтаксиса разработчики позволять не планируют даже в 6 версии. Ну, блин. Я и сам — молодец! Итак, за ночь я написал небольшой класс, который, если его правильно использовать, разрешает работать с массивами по-человечески.

мне не страшно

Теряем невинность с Таненбаумом: Amsterdam Compiler Kit

Уровень сложностиСложный
Время на прочтение9 мин
Охват и читатели6.9K

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

Именно о нем пойдет сегодняшний рассказ.

Читать далее

Вайбкодинг для маркетплейсов

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

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

Вайбкодить далее

UzePhone — как UzeBox, но только телефон

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

Я очень надеюсь, что не довёл ещё @bodyawmдо белого каления постоянными упоминаниями — но мимо этого я пройти, конечно, не мог. Как вы все помните, я сам что‑то пытался изобразить на тему «кастомизируемого телефона‑звонилки». Я давно обещал выложить свои наработки, но даже просто вспомнить, на чём я там сломался N лет назад — уже труд немалый, и если бы не активность единомышленника в этом направлении, которая меня стронула, сподвигла и стриггерила — стронуться, наверное, так бы и не смог. Особенно учитывая тот прискорбный факт, что я открываю свои собственные записки на эту тему и не понимаю там ни слова — положите на могилку Элджернона, что на заднем дворе, хотя бы пару цветочков...

ПЩЩЩЩЩЩ! (контакт белого каления и клавиш)

Как обогнать 99% Python-разработчиков, с фокусом на эру ИИ — по версии ИИ ((гайд) но это не точно)

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

🔰 ЦЕЛЬ: Создать разработчика, который является архитектором и оптимизатором сложных систем, способным эффективно использовать ИИ как мощный инструмент, но не зависящим от него для критических инженерных решений.

Читать далее

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

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

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

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

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

В 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() для правильного вывода таких чисел. Ниже, можно посмотреть, что получается из этой идеи.

Смотреть код

VGranite — Софт для преобразователя интерфейсов serial<->ethernet

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели4K

Мы занимаемся сбором данных с ИПУ в многоквартирных домах. Наше предпочтение - проводное подключение. Обычно мы подключаем одинаковые типы счетчиков в один канал - Вода, Газ, Электричество.

Однажды к нам перешел дом, на котором в качестве счетчиков электричества стояли "Меркурий 203.2ТL". Особенность этих счетчиков в том, что они используют в качестве интерфейса опроса - CAN шину. И тут важно уточнить, что именно только CAN шину, ничего более от CAN там нет. То есть, если вы купите преобразователь Ethernet<->CAN по типу USR-CANET200 - работать у вас ничего не будет. Причина в том, что подобные преобразователи используют кадры CAN для общения между устройствами, но разработчики счетчиков "Меркурий 203.2ТL" вертели на своем вертеле все это и просто поставили внутри драйвер CAN<->UART.

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

Скажу честно, мы не любим зависимости, поэтому пошли своим путем. Была приобретена Orangepi Zero, USB<>SerialTTL, TTL<>CAN. Все это было слеплено вместе в один преобразователь Ethernet<>CAN. Сразу скажу, что мы пробовали несколько разных драйверов CAN и на практике они оказались довольно капризными, мы пришли к выводу, что лучше использовать драйвер VD230 с UsbSerialTTL-CH340G.

Читать далее

Использовать LLM в оффлайне — LocalAI, Ollama, Flowise

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

Привет, Хабр.

В этой статье о том, как без написания кода поставить себе локально и использовать LLM без подключения к сети. Для меня это удобный способ использования в самолёте или in the middle of nowhere. Заранее выгрузив себе нужные файлы, можно делать анализ бесед саппорта с клиентами, или получить саммарайз отзывов из стора на приложение, или оценить резюме/тестовое задание кандидата...

Читать далее

Квитанции как способ отражения сделанной работы на уровне типов

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

Функциональное программирование одной из целей ставит отражение логики программы в типах входных/выходных значений функций. Типы аргументов и результатов накладывают существенные ограничения на то, как может быть реализована функция. Тем самым, позволяют делать разумные выводы о работе функции, ориентируясь только на её сигнатуру. Такое явление называется "параметричность". Замечательным примером параметричности служит такая сигнатура:


val f: [A] => A => A

Эту сигнатуру можно прочитать так: для любого типа, получив значение этого типа, вернуть какое-то значение того же типа. Исходя из того, что тип может быть любым, и никаких операций над этим типом мы не определили, единственной продуктивно завершающейся реализацией является identity. Здесь и далее мы исключаем непродуктивные решения вида f(a) = f(a) (зависание/отсутствие завершения) или f(a) = throw Exception() (исключение).


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

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

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

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели8.3K

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

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

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

Читать далее

Имя enum'a C++ в рантайме

Время на прочтение10 мин
Охват и читатели9K

Получение имени типа, не важно это структура или перечисление, в C++ — проблема. То, что тривиально известно компилятору на этапе парсинга исходников, не получится перевести в человеко-читаемый вид в рантайме. Можно использовать std::type_info::name, который не является переносимым решением, потому что зависит от реализации манглинга в компиляторе. Некоторые компиляторы (например, MSVC, IBM, Oracle) создают "удобное" имя типа, а вот gcc и clang, возвращают искаженное имя, котороe можно преобразовать в удобочитаемую форму с помощью дополнительных функций, например abi::__cxa_demangle. Чтобы вся эта магия работала нужно подключить RTTI, который тоже не всегда доступен, а иногда и вообще-то вреден, потому что сжирает драгоценную производительность, но можно сделать по другому.

follow the white rabbit

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

Pump Station Framework для ПЛК ОВЕН 110-32м2

Время на прочтение5 мин
Охват и читатели8.7K

Привет, Хабр! Это мой первый опыт написания здесь, если что, уж сильно не пинайте). Сам я программист самоучка. Новый язык Structured Text и среду разработки Codesys разбирал по мануалу и стандарту МЭК-61131-3. В статье будет рассматриваться легкий самописный фреймворк для быстрой сборки насосной станции реализованной на ПЛК 110-32м2 фирмы ОВЕН.

Читать далее

Пару слов о стилизации React компонентов

Время на прочтение3 мин
Охват и читатели16K


Стилизация. Довольно насущный для меня момент. Несмотря на годы работы с React, стартуя новый проект, я каждый раз задумываюсь о стилизации. Я перепробовал многие её способы, больше и дольше всего я работал с css-modules и styled-components. Сегодня я хочу предложить вам рассмотреть еще один не менее интересный вариант.

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

Как я начал писать макросы для Rust на Gluon

Время на прочтение2 мин
Охват и читатели4.3K

Во многих языках есть специальный механихм для кодогенерации - макросы. Иногда из реализуют на отдельном достаточно примитивном языке, основанном на простой подстановке текста (препроцессоры PL/I и C, m4), но даже в таком варианте удается делать интересные и полезные вещи. Другой популярный вариант - макросы реализуются на том же языке, что и программа, в которой они используются. Такой подход ведет свое начало из Lisp (удобный тем, что формат программ и данных там одинаков), активно применяется в Julia, OCaml(camlp4/5), Scala, Haskell, Rust, а наибольшего развития получил в Nemerle, где макрос может может запускаться как до, так и после проверки и вывода типов, и в последнем варианте иметь доступ к типам.

При этом макросах все возможности языка не нужны, скажем высокая эффективность и безопасность Rust пользы здесь не принесут и могут только затруднить разработку.

Читать далее

Мультивселенная и задачи о переправе

Время на прочтение4 мин
Охват и читатели2.6K

Как-то прочел на Хабре статью «Перевозим волка, козу и капусту через реку с эффектами на Haskell», которая так понравилась, что решил написать фреймворк для всего класса задач о переправах, используя мультипарадигменное проектирование. Наконец удалось найти время, и вот, спустя почти год, фреймворк готов. Теперь персонажи, их взаимодействия и описание искомого результата задаются через domain-specific language, который позволяет решать любые головоломки подобного рода с пошаговым выводом. Ниже приводится поэтапный разбор реализации DSL. Статья подойдет тем кто изучает язык Kotlin или просто интересуется примерами его использования. Некоторые малозначимые детали (вроде импортов и вывода) для кратости опущены.

Начнем писать код

Перепрограммирование GameBoy за счёт бага в Pokemon Yellow

Время на прочтение10 мин
Охват и читатели5.2K

Pokemon Yellow - это карманная вселенная со своими правилами. В ней можно покупать и продавать предметы, тренировать покемонов, побеждать других тренеров — но нельзя менять правила самой игры. Нельзя построить себе дом, поменять музыку или даже переодеться. Точнее, так было задумано. На самом деле есть последовательность валидных команд (типа перемещения из одного места в другое и манипуляций с предметами), которая позволяет превратить игру в Pacman, тетрис, Pong, MIDI-проигрыватель и что угодно ещё.

Читать далее

Часы и волны

Время на прочтение2 мин
Охват и читатели6K

Я показывал Хабру свою графику, хотя меня и заминусовали, я хочу показать снова то, над чем я работал, может кому то из большой аудитории Хабра понравится анимация, графика или идея, которая уже давно лежит на поверхности. Это прототип стрелочных часов, измеряющих время в 7300000-7320000 больших размерах, может столько и не нужно, но обычным 12-часовым часам явно не хватает делений для измерения хотя бы сегодняшней даты.

Я добавил красивую графику, чтоб было не слишком скучно: получилось что часы существуют в пространстве, зависящем от t1 (текущие дата и время), а окружающие фракталы в пространстве, вычисляя цвет пикселей, зависят от t2 (время прошедшее с момента запуска) - мне нравится эта особенность, она кажется странной.

Читать далее

Как я автоматизировал однотипную, монотонную работу бесплатно и без навыков программирования

Время на прочтение3 мин
Охват и читатели49K

Многим знакома проблема однотипных действий за компьютером, особенно на офисных работах. Заполнение каких-то данных в таблицу, размещение постов в социальных сетях, поиск в базе данных и заполнение отчетов. И если для программистов решение такой задачи не составит труда, то что делать обычным офисным работникам?

Я долго мучался над подобной проблемой, был период когда вся моя работа заключалась в сравнении данных в Excel, SAP и ещё парочки источников, но так как я очень ленив, стал искать способ как это дело можно автоматизировать и вот уже два года, я с некой периодичностью создаю новые или редактирую старые программы действий для компьютера (скрипты или сценарии), позволяя ему работать вместо меня, а себе гонять чай в рабочее время посматривая на экран. Я не стал супер экспертом по автоматизированию (RPA разработка если по научному), но работа стала приносить намного меньше стресса.

Читать далее

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