Обновить
137.09

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

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

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

Свежий взгляд на честное 3D в браузере

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

Приветствую.

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

Читать далее

Русификация баша

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

Чтож... Начну с откашливаний - я не писака ( в хорошем смысле этого слова, писать " на поток" это надо уметь), хоть и немного писатель. И даже не очень уверен в том, что я хочу вам сегодня поведать.


Но моей Прокрастинации нет границ, так что пристёгивайте ремни, это будет ухабистая поездка!

Что будет если присать код на русском?

Как верстать веб-интерфейсы быстро, качественно и интересно

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

image


Всем привет! Давно хотел и наконец написал небольшую книжку — бодрое пособие по своей профессиональной области: актуальным подходам к разметке интерфейсов, экранному дизайну и доступности. Она о моем оригинальном подходе к созданию GUI, препроцессорам CSS (для объективности, немного и об альтернативных подходах), и его эффективном практическом использовании с javascript и популярными реактивными компонентными фреймворками Vue и React. Материал представлен аккуратно последовательно, но безумно интенсивно и динамично — ничего лишнего или даже слишком подробного — для того чтобы увлеченный и подготовленный читатель не потерял интереса и «проглотил на одном дыхании». С другой стороны, текст, достаточно сложный ближе к концу, и на всем протяжении — густо насыщенный идеями, ссылками на технологии и подходы — поэтому, очевидно, будет «на вырост» начинающим. Но, в любом случае, как и если вы только начали интересоваться данной тематикой, так и если уже давно занимаетесь веб-дизайном, версткой и программированием фронтенда — вам может быть полезно на него взглянуть.

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

Вызов Rust функции из Go

Время на прочтение3 мин
Охват и читатели3.1K
На Хабре в свое время была статья о том, как вызвать Rust код из Go. Статья неплохая, но довольно сложная для понимания и на самом деле отталкивающая новичков от желания смотреть в сторону обоих языков. Цель этого поста не столько залезть в «кишки» кросс-языковых вызовов, сколько показать насколько просто это можно сделать.

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

noexcept-ctcheck или несколько простых макросов, чтобы компилятор помогал при написании noexcept кода

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

При разработке на C++ время от времени приходится писать код, в котором исключения не должны возникать. Например, когда нам нужно написать не бросающий исключений swap для собственных типов или определить noexcept move-оператор для своего класса, или вручную реализовать нетривиальный деструктор.


В С++11 в язык был добавлен модификатор noexcept, который позволяет разработчику понять, что из помеченной noexcept-ом функции (или метода) исключения вылететь не могут. Поэтому функции с такой пометкой могут смело использоваться в контекстах, где исключения не должны возникать.


Например, если у меня есть вот такие типы и функции:


class first_resource {...};
class second_resource {...};

void release(first_resource & r) noexcept;
void close(second_resource & r);

и есть некий класс resources_owner, который владеет объектами типа first_resource и second_resource:


class resources_owner {
   first_resource first_resource_;
   second_resource second_resource_;
   ...
};

то я могу написать деструктор resources_owner следующим образом:


resources_owner::~resources_owner() noexcept {
   // Функция release() не бросает исключений, поэтому просто вызываем ее.
   release(first_resource_);

   // А вот функция close() может бросать исключения, поэтому
   // обрамляем ее try-catch.
   try{ close(second_resource_); } catch(...) {}
}

В каком-то смысле noexcept в C++11 сделал жизнь C++ разработчика легче. Но у текущей реализации noexcept в современном C++ есть одна неприятная сторона...


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

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

LOLWUT: произведение искусства в команде БД

Время на прочтение3 мин
Охват и читатели3.8K
Автор — Сальваторе Санфилиппо aka antirez, один из основных разработчиков БД Redis, сотрудник Redis Labs. Статья опубликована 12 сентября 2018 года

Последние несколько дней оказались весьма напряжёнными. Одним из аргументов в споре о замене или не замене слов, используемых в коде репликации Redis, было следующее: стоит ли делать работу, которая не даёт никакого технологического результата? [Речь о замене терминов «хозяин/раб» при репликации — прим. пер.]

В процессе чистки исходников Redis от определённого слова, где это возможно, я подумал, что мне нравится писать код даже без измеримых технологических эффектов. Замена слов — слишком рутинная работа, она просто раздражает, даже если по ходу встречаются достойные технологические проблемы. Но есть другой вид кода с особым качеством, которое я бы назвал “hack value”. Он может не решать никакой проблемы, но всё равно это достойная задача. Здесь несколько причин. Иногда процесс написания кода полезен сам по себе. Иногда для решения не самой важной проблемы используются технически продвинутые идеи. А иногда код пишется просто из эстетических соображений.
Читать дальше →

Бесконечная алгоритмическая мелодия на основе простых чисел

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

Привет, Хабр! В прошлой статье «бесконечный узор на основе простых чисел» я рассказал про алгоритм, который позволяет генерировать бесконечные красивые узоры, похожие то ли на инопланетные рисунки, то ли на нечто технологическое, подобно устройству микросхем. Однако, алгоритм для генерирования 2D узоров можно так же использовать и для создания мелодий. Подробнее под катом.
Читать дальше →

Создаем свои криптокотиков (Часть 2)

Время на прочтение8 мин
Охват и читатели6K
Это статья — вторая (и заключительная) часть из серии о создании своих криптокотиков. В первой части мы узнали, что из себя представляет каждый Криптокотик, кто контролирует ход игры и как сделать котика в виде токена. Но для по-настоящему прорывного приложения нам необходимо определелить для них механизм размножения, а главное — рыночной торговли, чтобы участники могли выкупать друг у друга самых породистых котят.image
Скрещиваем котиков

«…Желают знать, что будет» или пишем гадальный шар в САПР NanoCAD на C# (MultiCAD .NET API)

Время на прочтение12 мин
Охват и читатели5K
Если верить одной старой песне из советского кинофильма, то люди всегда интересуются вопросами будущего в трудной ситуации. Кто-то подбрасывает монетку, кто-то мучает осьминога Пауля, а совсем уж зверски настроенные люди — ощипывают ромашки. Мы с вами поступим куда как гуманней и найдем для САПР NanoCAD, весьма нетрадиционное применение, а именно сделаем свой аналог гадального шара (почти как на картинке ниже).

В статье мы еще раз потренируемся создавать пользовательские примитивы NanoCAD с помощью MultiCAD.NET API, а также прикрутим к нашему объекту взаимодействие с Windows.Forms.

Код сегодня будет только на C#, писать его будем для платной версии (NC 8.5) и для бесплатной (NC 5.1), ну и естественно пользователи Linux смогут его собрать в Mono и запустить под Wine, поэтому милости прошу под кат…



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

Тест на знание языка Си, найденный в первоапрельской шутке

Время на прочтение5 мин
Охват и читатели30K
Прошло 1 апреля. Часто первоапрельские шутки, выложенные в Интернете, продолжают свое шествие, и всплывают совершенно в неожиданное время. О такой шутке про язык Си и будет эта статья. В каждой шутке есть только доля шутки. Код из нее я взял на вооружение для беглого тестирования на знание языка Си.

Надо написать программу (с пояснениями), в которой будет работать следующая строка:

for(;P("\n"),R--;P("|"))for(e=C;e--;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);

Всего одна строка, но по ней можно определить глубину понимания человеком языка Си. Эта строка будет работать также и на С++. Советую попробовать свои силы. Смешно не будет. Возможно будет полезно.
Читать дальше →

Прячем текст от посторонних глаз (пример на Scala)

Время на прочтение2 мин
Охват и читатели7.6K
После прочтения этого поста, у меня возникла идея, а нельзя ли сделать некий текст полностью невидимым? Ниже описанный метод не претендует на эффективность по скорости работы или объёму данных.
Читать дальше →

Используем HTML и WebBrowser control в качестве UI для обычных windows-приложений на C#

Время на прочтение6 мин
Охват и читатели35K
Как известно, контрол WebBrowser это просто обертка над ActiveX компонентом Internet Explorer. Следовательно он предоставляет доступ к полноценному layout-движку со всеми современными плюшками. А раз так, то попробуем (сам не знаю правда зачем) на его основе сделать пользовательский интерфейс для обычного windows-приложения.

Можно, конечно, было бы запустить в этом же процессе мини веб-сервер (на HttpListener например) и ловить запросы через него, но это слишком просто, скучно и неспортивно. Попробуем обойтись без сетевых компонентов, just for fun.
Читать дальше →

Используем TSQL для игры в «Балду»

Время на прочтение12 мин
Охват и читатели9.7K
Недавно я вспомнил об замечательной интеллектуальной игре «Балда», с которой я познакомился еще в школьные годы.

На днях я задался вопросом – насколько сложно будет реализовать алгоритм этой игры для компьютерного соперника?

Так как мне больше всего нравится работать с реляционными данными и моим любимым языком является SQL, то я решил совместить приятное с полезным и попробовать написать этот алгоритм используя только TSQL. Это моя первая попытка написать ИИ используя только возможности SQL.

Архив с файлами можно скачать по следующей ссылке – скрипты.
Все слова в словаре в верхнем регистре, а также в нем буквы «Е» и «Ё» считаются за одну (как «Е»).

В результате была создана следующая схема:

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

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

Возможна ли мультипроцессорная обработка в UEFI?

Время на прочтение3 мин
Охват и читатели9K
Согласно спецификации Unified Extensible Firmware Interface программная среда, обеспечивающая выполнение инициализационных процедур до загрузки операционной системы, не поддерживает многопотоковую обработку. Основная причина – однопотоковая идеология UEFI и, как следствие, нереентерабельность сервисных процедур UEFI API. Вместе с тем, ряд задач не связанных с вызовом сервисных функций (например, тестирование оперативной памяти) не только допускают параллельное выполнение несколькими программными потоками, но и получают от такого похода прибавку производительности.
Читать дальше →

J: программирование на смайликах

Время на прочтение2 мин
Охват и читатели10K
Язык J многими, в том числе и на хабре, считается write-only language (что, в общем-то, неправда) или программированием через регэкспы. Важно помнить, что J — это ASCII-версия математической нотации Айверсона, лежащей в основе APL. Точно так же, как невозможно прочесть Хиндли-Милнера, не зная математической нотации, код вроде value =: [:(]`{.@.([:1&=#))[:,[:>[((([:<[)=[:{.])#[:{:])[:>] не может быть понятен человеку, незнакомому хотя бы со словарём языка.

Под катом небольшая подборка учебников и туториалов по теме для заинтересовавшихся. (Внимание: все ресурсы на английском языке)
Читать дальше →

Динамическое программирование в шаблонах

Время на прочтение2 мин
Охват и читатели14K
Есть такой чудный сайт выходного дня, как codeeval.com. На котором неплохая коллекция небольших алгоритмических задачек и удобная система проверки, позволяющая занимательно провести вечер скучающим программистам. Как правило в качестве входных данных используется файл с тестовыми данными. Однако мне попалась одна задача, в которой тестовые данные известны заранее. Загружать программу, которая будет просто выводить правильный ответ не спортивно, а вот вычислять его на этапе компиляции — самое то.

Что из этого получилось можно посмотреть внутри.
Читать дальше →

Автоматизация однотипных операций при настройке коммутаторов через telnet без программирования

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

Вступление


Добрый день уважаемые хабражители!

Описанные ниже способ поможет сократить количество рутинной работы при настройке коммутаторов (например Planet, D-Link и др.) в случаях, когда необходимо выполнить несколько десятков — сотен однотипных операций вроде объявления виланов, добавления их на интерфейсы, экспорта конфигурационных файлов на tftp сервер. Безусловно решение далеко не оптимальное и рациональное, но, надеюсь, имеет право на жизнь.
Настройка производится через подключение по протоколу telnet. Увы, не смотря на то что современные свитчи поддерживают ssh и snmp, многие старые железки разумеют только telnet. Способ подойдет для среднего пользователя Windows, не программиста, т.к. используется всего лишь блокнот и пакетные bat файлы (просьба неровнодышащим к параолимпийским играм программистов дальше не читать).
Читать дальше →

Автоматическое добавление keywords к файлам в TortoiseSVN под Windows

Время на прочтение3 мин
Охват и читатели2.4K
В Subversion существует функциональность автоматической подстановки встроенных ключевых слов. Данная возможность позволяет добавить в файл, например, такую информацию как последний пользователь редактировавший файл, ревизию и дату модификации.
В данный момент эта функциональность сильно ограничена, но тем не менее может быть весьма полезной. Одно из основных ограничений – необходимость добавлять обработку ключевых слов для каждого нового файла. Это же относится к переименованным и перемещенным файлам (SVN обрабатывает их как новые).
Подробности

Мое видение универсального языка программирования

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

Язык программирования, даже общего назначения, - это инструмент. Каждый язык хорош в решении задач своей сферы: C++ позволяет писать эффективные программы, Haskell - писать элегантный параллельный и математический код, C# - создавать программы на гибкой масштабируемой архитектуре. Современные языки заставляют нас мириться с их недостатками: отсутствие нужной системы типов, нехватка синтаксического сахара, отсутствие парадигмы X. Все хоть раз мечтали о языке, который удобен для решения любой задачи.

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

Читать далее

Эндрю Ын в защиту «вайб-кодинга»: программирование с ИИ — это не расслабленное хобби

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

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

Читать далее

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