Pull to refresh
4
0

Пользователь

Send message

Interrupt-интерфейс человеческой психики

Reading time8 min
Reach and readers6.9K

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

Это можно сравнить с тем, как если бы вы, постоянно, каждую секунду, открывали и закрывали входную дверь в квартиру, непрерывно проверяя, не пришёл ли кто-нибудь? 

Согласитесь, что мы так не делаем, так как это было бы нерационально.

Забавно, но, уже достаточно давно, я отслеживаю один любопытный феномен, который я для себя назвал «interrupt-интерфейс человеческой психики»...

Читать далее

Фокусы, хаки, магия и прочее ненормальное программирование на C

Level of difficultyMedium
Reading time9 min
Reach and readers12K

Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но помогает развлечься. И я — не исключение. В этой статье я хочу рассказать вам о лайфхаках, трюках (магических и не очень), алгоритмах на языке C!

Идея написать эту статью зародилась из моего поста, после него я написал статью «Математика, биты, магия и немного ненормального программирования на C», которая раскрывала много интересных моментов. Увидев, что многим понравилась, я задумался: почему бы не изучить еще какие-нибудь трюки, заодно практикуясь в программировании на C? В этой статье мы погрузимся глубже и раскроем больше тем, такие как генераторы псевдослучайных чисел, трюки с побитовыми сдвигами и прочие быстрые алгоритмы на C!

Всех, кто заинтересовался — прошу под кат.

Читать далее

Марсианские страсти: DOS, любовь и С++

Level of difficultyMedium
Reading time13 min
Reach and readers13K

У нас было 640Кб памяти, CGA-экран, 20-мегабайтовый диск и целых четыре мегагерца тактовой частоты. А еще старые пятидюймовые дискеты на 360кб. Не то чтобы это был необходимый набор для современного разработчика C++, но если уж начал коллекционировать дичь, то сложно остановиться..

Читать далее

2000 лет назад греки создали первую вычислительную машину

Level of difficultyEasy
Reading time21 min
Reach and readers12K

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

Хотя большинство кораблей в конечном итоге достигают своего пункта назначения в порту Остия, к юго-западу от Рима, один греческий корабль, загруженный драгоценностями, монетами, статуями, стеклянными изделиями и бронзовыми шедеврами, так и не прибывает. Когда судно пересекает Эгейское море, сильная буря бросает его на скалистый берег острова под названием Антикитера. Столкновение разорвало корпус корабля толщиной 13 см, в результате чего он погрузился на глубину более 30 м под воду и в конце концов упокоился на подводном склоне у побережья острова.

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

Читать далее

«Логикомикс»: драма логики, математики и философии

Reading time7 min
Reach and readers12K

Статья посвящена графической новелле «Логикомикс. Поиск истины» Апостолоса Доксиадиса — произведению о математике, логике, философии и человеческих драмах, возникающих вокруг стремлений обрести интеллектуальную опору.

Читать далее

Chrome, Xfce и очень страшное кино

Level of difficultyMedium
Reading time8 min
Reach and readers17K

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

Читать далее

Тайна самой дешевой Linux-консоли с Ozon

Level of difficultyEasy
Reading time9 min
Reach and readers72K

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

Сейчас консоль стоит на маркетплейсах всего 1.800 рублей. Но если бы всё так было просто... Если вам интересно узнать, откуда в 2025 году взялся 2х-ядерный MIPS с частотой 1ГГц, что представляет из себя R36s на практике и как не запутаться в великом множестве ревизий — жду вас под катом!

Читать далее

Специальные функции-члены в C++

Level of difficultyMedium
Reading time25 min
Reach and readers5.7K

Продолжаем серию «C++, копаем вглубь». Цель этой серии — рассказать максимально подробно о разных особенностях языка, возможно довольно специфичных. Это девятая статья из серии, список предыдущих статей приведен в разделе 6. Серия ориентирована на программистов, имеющих определенный опыт работы на C++. Данная статья посвящена специальным функциям-членам.

В C++ жизненный цикл экземпляра класса/структуры/объединения (объект, представляемый в коде переменной) начинается с инициализации, то есть задания его начального состояния. Далее, почти всегда, объект копируется, выполняются присваивания или их перемещающие аналоги. Эти операции необходимы для работы функций, контейнеров, алгоритмов. Финальной точкой жизненного цикла объекта является его уничтожение. Именно для поддержки этих операций в C++ и предназначены специальные функции-члены.

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

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

Читать далее

Форматируем строку по-человечески: C++ и его <format>

Level of difficultyEasy
Reading time8 min
Reach and readers9.5K

Когда-то давным-давно (то есть до C++20) мы форматировали вывод либо по-старинке через printf, либо используя громоздкие стримы ввода-вывода из <iostream>. Оба подхода, мягко говоря, не очень. printf работал шустро и лаконично, но требовал строгого соответствия типов, забудешь правильный %d или %s в формате, и получишь неопределённое поведение вплоть до падения программы. Компиляторы иногда предупреждают о несоответствиях, но полностью проблему не решают (особенно если форматируемая строка не литерал). Кроме того, printf не умеет выводить пользовательские классы, только примитивы.

Сейчас ситуация изменилась. В C++20 завезли библиотеку <format>, современный подход к форматированию строк, сочетающий лаконичность printf с безопасностью iostream. Инструмент называется std::format и объявлен в заголовке <format>. По сути, это адаптация популярной библиотеки fmt.

Читать далее

Алгоритмы на графах

Level of difficultyMedium
Reading time8 min
Reach and readers11K

Краткое и доступное руководство по базовым алгоритмам на графах: BFS, DFS, топологической сортировке и алгоритму Дейкстры. Чёткие объяснения, примеры и код на C++ — для тех, кто хочет быстро и уверенно освоить фундамент графовых алгоритмов.

Узнать больше об алгоритмах

Retro68: если вам скучно жить на свете

Level of difficultyHard
Reading time18 min
Reach and readers8.6K

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

Видимо по этой причине, одним мрачным осенним днем мне захотелось создать графическое приложение на современном C++ под.. классический Mac из 90х.

Читать далее

Часы, минуты и секунды: как люди нарезали сутки с древности до наших дней?

Level of difficultyEasy
Reading time11 min
Reach and readers17K

Как и семидневная неделя, о которой мы говорили в прошлый раз, разделение суток на 24 часа, в каждом из которых по 60 минут, давно уже стало мировым стандартом. Но почему часов ровно 24, а минут в них — именно 60? И почему при этом на циферблатах почти всех механических часов не 24, а 12 делений? Попробуем разобраться.

Читать далее

Логическая головоломка из университетского квеста

Level of difficultyEasy
Reading time2 min
Reach and readers11K

Психоаналитикс – одна из интересных головоломок игры Puzzle Hunt Мельбурнского университета 2013 года. Сюжет игры в том году был основан на персонажах комиксов про Астерикса и Обеликса, а каждая ее головоломка была связана с одним из жителей деревни галлов или одним из римлян. Психоаналитикс – один из жителей деревни. Его головоломка была частью пятого акта игры. Ей предшествовало изображение этого персонажа, а также его краткое описание: «Друид-первопроходец Психоаналитикс пришел к выводу, что именно взаимодействие между левым и правым полушариями мозга играет ключевую роль в формировании мыслей».

Читать далее

Искусство выжить. Простое руководство для настоящих программистов

Level of difficultyMedium
Reading time15 min
Reach and readers19K

Задача Эдсгера Дейкстры о философах – великая задача великого программиста. Уж сколько лет, а она актуальна. Решая ее, прикасаешься к этому величию. И вот, перефразируя известное, «давно не было такого и вот опять», можно познакомиться с ее «новым прочтением» на Хабре[1].

Ну, как новое?… Но она стала тем триггером, который подвигнул меня к очередной попытке ее решения. Тем более, что с момента знакомства с философами пролетела уйма лет, а в  багаже - опыт применения автоматной модели и значительно усовершенствованная среда их реализации.

Познакомился с проблемой обедающих философов – Dinning Philosopher Problem (DPP), я более двадцати лет тому назад (про DPP см. [2]). Результатом стала статья, в которой философы выполняли поставленную задачу, как минимум, не хуже, чем классические алгоритмы сортировок[3]. Позднее был сделан доклад на конференции по параллельным вычислениям в Саратове, где на суд научной общественности была предъявлена модель автоматных параллельных вычислений и пример ее приложения - задача Дейкстры[4].  

Замечание 1. В рамках обсуждения статьи на Хабре было проигнорировано  предложение поручить сортировку философам. Зря, конечно, т.к. надо же как-то убедиться, что предлагаемое решение работает хотя бы в первом приближении. К примеру, тот же DeepSeek, моментально выдавший свое решение DPP, так и не смог заставить их сортировать.

Не знаю, считается ли данная задача решенной, но то, с чем я знаком, по большей части беглое рассмотрение проблем, которые она отражает. У задачи есть теория, которая представлена монографией Хоара[5], или моделями сетей Петри у Питерсона[6] и В.Е. Котова[7] или другими подобными публикациям. Но, повторюсь, все это по большей части достаточно краткий анализ свойств модели и/или даже конкретного решения. Статья на Хабре из этой же серии. Все это ни как не окончательное решение описываемых ею проблем параллелизма. Правда, может, [авторами] вопрос так и не ставился, но все же ответ на него весьма желательно иметь.

Читать далее

Вайб-кодим локальный мультимедийный сервер на C++ и Vue.js

Level of difficultyMedium
Reading time4 min
Reach and readers7.3K

У каждого из нас на жестких дисках копятся терабайты контента. Фильмы, скачанные «про запас», архивы семейных видео, гигабайты музыки во FLAC, которую жалко удалять, и тысячи фотографий. Но есть проблема: потреблять этот контент локально — неудобно. Когда дома лежит большой медиа‑архив — фотографии за годы, фильмы, музыка, куча видео — начинаешь задумываться, что работать с этим напрямую через файловую систему совсем не удобно. Особенно в эпоху, когда интерфейсы крупных медиа‑сервисов настолько продуманы, что сами по себе стали стандартом UX.

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

Читать далее

«Паяем правильно и точно» — тест-драйв набора DIY для детей

Level of difficultyEasy
Reading time5 min
Reach and readers19K

Привет, хабровчане! На связи руководитель проектов редакции компьютерной литературы издательства «БХВ» @Holmogorov Признаюсь честно: паять я люблю, но не сказать, что умею это делать профессионально. Так, в состоянии починить ёлочную гирлянду или водрузить на место отвалившийся конденсатор в блоке питания. Поэтому когда у нас в «БХВ» придумали детский набор «Паяем правильно и точно. Уроки мастера + 4 набора для пайки», я сразу решил взять его на тест-драйв. Благо, все необходимое для «ходовых испытаний» у меня в наличии имеется: ребенок мужского пола, никогда до этого не державший паяльник в руках, и я, который хотя бы приблизительно помнит, как этот самый паяльник выглядит. Тем более, набор изобретали совершенно другие люди в совершенно другом подразделении нашей компании, поэтому я могу без особых угрызений совести изучать его более-менее непредвзято и писать про него гадости обзоры.

Погнали!

Зоопарк строк в вашем C++ коде?

Reading time26 min
Reach and readers25K

CryEngine2 использовал класс собственный CString для реализации работы со строками и немного использовал строки из стандартной строковой библиотеки Windows. Насколько я помню, последняя версия CryEngine всё ещё использует те же самые CString, она кардинально поменялась внутри, но как дань истории название класса менять не стали, зато сильно расширили функционал. Я не на 100% уверен, применялся ли CString только в редакторе или в рантайме игры тоже, вы можете сами это посмотреть в исходниках, которые все еще доступны на гитхабе. Это один подход к работе со строками, довольно распространенный в мире игростроя - когда мы все нужное пишем сами, не оглядываясь... хотя, тут больше уместно слово поглядывая, на существующие реализации и утаскивая в проект все самое лучшее.

Есть и другой подход... Я работал в команде над некоторым проектом, который должен был выйти на консолях, и в какой‑то момент на проект пришел эффективный тимлид, который хорошо умел в красивые презентации, и продавил использование std::string из sdk. Все очень опытные программисты, синьоры и руководство важно кивали на совещании и согласились всё перевести на std::string… не такие уж они оказались опытные, как выяснилось. В итоге мы заменили большую часть CString на std::string. Не сказал бы, что это сильно повлияло на время компиляции — плюс‑минус минута к проекту, который собирается двадцать минут, особой погоды не делают, но это также превратило наш довольно понятный базовый код в запутанный кошмар. Возможно, для переносимости это было лучше, но ни наш проект, ни CryEngine2 Editor так и не были портированы ни на Linux, ни на какую‑либо другую платформу.

Прошло десять лет, я вижу ровно туже ситуацию на текущем проекте — новый тимлид решил перевести местный MySuperPupeString на std::string, уже предчувствуя «нижней чуйкой» последствия — запасаюсь попкорном и беру отпуск на следующий месяц после принятия решения. Но не это интересно, а то — какие вообще строки могут быть в вашем с++ коде.

Строка, на строке и строкой погоняет

Три интересные логические задачи

Level of difficultyMedium
Reading time2 min
Reach and readers10K

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

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

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

Читать далее

Гипотеза о роли скрытого описательного языка в механизмах мышления и о том, как у этого языка появляется смысл

Level of difficultyMedium
Reading time42 min
Reach and readers15K

 Я знаю, это будет звучать громко и самонадеянно, но все-таки я это скажу: мне кажется, я нашел ключик к проблеме объяснения и конструирования мышления. Нет, это еще не решение всей проблемы, но многообещающая возможность к нему приблизиться. Полгода назад у меня возникла идея, что в основе феномена мышления (даже у «низкоразвитых» животных вроде крабов или мышей) может лежать оперирование особого класса описательной языкоподобной структурой. Я попытался развить этот подход и обнаружил, что он как будто бы позволяет сформулировать много важных философских проблем о мышлении в виде точных математических вопросов. С тех пор мне удалось продвинутся в решении некоторых из них и получить несколько интересных, на мой взгляд, результатов на стыке логики и психологии. Я собираюсь написать серию статей, чтобы поделиться своими находками и привлечь энтузиастов вместе исследовать возможности, которые они открывают. Перед вами первая статья из этой серии.

Познакомиться с исследованием

Ликбез о плавающей точке: сложение, катастрофическое сокращение и бабушка Кэхена

Level of difficultyEasy
Reading time14 min
Reach and readers11K

Давайте продолжим обсуждение самой неоптимизированной в мире 32-битной библиотеки для работы с плавающей запятой TinyFloat. Библиотека написана на C++ и намеренно избегает встроенных типов плавающей запятой, полагаясь исключительно на 32-битные целые числа. Цель состоит в том, чтобы сделать код максимально читабельным — без бит-хаков и хитроумных уловок.

Библиотека пишется в рамках борьбы с неграмотностью населения, поэтому, я хочу иметь подробную документацию о том, что происходит «под капотом». Оказалось, что лучший способ документировать код C++ — это полностью переписать его на Python :-)

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

Читать далее
1
23 ...

Information

Rating
Does not participate
Registered
Activity