Рубрика «ненормальное программирование» - 72

Погоня с препятствиями - 1 
           Какая медлительная страна! — сказала Королева. — Ну, а здесь,
знаешь ли, приходится бежать со всех ног, чтобы только остаться
на том же месте! Если же хочешь попасть в другое место, тогда
нужно бежать по меньшей мере вдвое быстрее! 
 
                        Льюис Кэрролл "Алиса в Зазеркалье

Сегодня, я хочу рассказать об удивительной и недооценённой игре, с которой я познакомился чуть менее двух лет назад. В каком-то смысле, именно с этой игры, а также с Ура, началось моё знакомство с Дмитрием Скирюком. В те дни я только начинал интересоваться настольными играми. Мои познания были скудны и, во многом, наивны. Такие игры как "Чейз", буквально открыли для меня новый необъятный мир. Даже сейчас, работа над этой игрой, в большой степени, напоминает детективную историю. В этом отношении, игра "Chase" полностью оправдала как своё название так и сходство с псевдонимом известного американского писателя.
Читать полностью »

Один из моих любимых развлекательных твиттеров – это @wacnt. Там появляются вопросы, на которые не может ответить математический поисковик Wolfram|Alpha. На некоторые, кстати, мне сумел дать ответ виртуальный ассистент Facebook M.

Вот штучка из недавних, которая заставила меня улыбнуться:

простое число, не большее 4000, получающееся самым широким при записи римскими цифрами шрифтом Times New Roman

Facebook M просто выдал самое большое из простых чисел, близких к 4000 – это 3989. Но это не обязательно так, ведь речь идёт о римской записи.

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

Для начала я составил список простых чисел, меньших 4000. Из-за лени я просто нагуглил их и вставил в скрипт.
Читать полностью »

Каждый интересующийся шаблонами в С++ скорее всего слышал об их Тьюринг-полноте и связанных с этим шутках про «we put a language in your language, so you can program while you program». В этом посте я расскажу как с помощью шаблонов и константных выражений построить настоящую машину Тьюринга, вычисляющую результат своей работы во время компиляции, на которой можно будет запускать уже существующие программы. Например усердный бобер с 4 состояниями и 2 символами выглядит как-то так:

ADD_STATE(A);
ADD_STATE(B);
ADD_STATE(C);
ADD_STATE(D);

ADD_RULE(A, Blank, 1, Right, B);
ADD_RULE(A, 1, 1, Left, B);

ADD_RULE(B, Blank, 1, Left, A);
ADD_RULE(B, 1, Blank, Left, C);

ADD_RULE(C, Blank, 1, Right, Stop);
ADD_RULE(C, 1, 1, Left, D);

ADD_RULE(D, Blank, 1, Right, D);
ADD_RULE(D, 1, Blank, Right, A);

using tape = Tape<Blank>;
using machine = Machine<A, 0, tape>;
using result = Run<machine>::type;

int main() {
    print(result());
    return 0;
}

На выходе, как и положено, получаем

1 _ 1 1 1 1 1 1 1 1 1 1 1 1 

Тут можно посмотреть на код: https://ideone.com/MvBU3Z. Желающие узнать как все устроено внутри, добро пожаловать под кат.
Читать полностью »

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

Предыдущие статьи были о небольших проектах, сделанных по одному и тому же принципу:

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

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

В качестве примера была выбрана игра «Электроника ИМ-04 — Веселый повар».

«Весёлый повар» на FBD шаг за шагом - 1

Под катом описание по шагам, как написать эту игрушку на языке программирования FBD.
Читать полностью »

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

Персистентная оперативка — очень простая и очень непростая вещь.

В целом, всё просто: представьте себе, что содержимое оперативной памяти не пропадает. Никогда. Например, при выключении компьютера. Или, например, при… исчезновении компьютера. «И души умерших программ носятся над водою.». :)

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

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

А задача — именно такова. Обеспечить программе среду, в которой остановка ОС и остановка компьютера для программы выглядели исключительно как нажатие на кнопку «пауза» при просмотре фильма. Во время паузы «под программой» можно даже компьютер поменять, но надо как-то обеспечить ситуацию, в которой продолжение работы для программы будет совершенно прозрачным.

Это недостижимо, если требование доводить до абсолюта. Состояние хардвера сохранить и полностью восстановить нельзя. Но и не надо. Программе не нужна видеокарта, ей нужен тот же API и сохранённая картинка на экране, а это — можно.

Что вырисовывается: сохранить состояние только оперативки — мало, а всего компьютера — нереально.

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

CLRium #3. Анонс докладчиков - 1

15 апреля в Санкт-Петербурге, 22 апреля — в Москве, 29 апреля — в Омске, 13 мая — в Екатеринбурге и 20 мая — в Новосибирске пройдет серия семинаров CLRium #3.

В прошлом году мы говорили об околохакерских штуках — разборе памяти .NET куч, приведение типов, между которыми приведение невозможно… Делили текущий поток на два… Говорили о ядре нового .NET Core и пытались понять, для чего нам нужен (и нужен ли?) Roslyn

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

Как и ранее, у нас будут:

  • Максимально глубокие, отборные доклады по редко-раскрываемым вопросам
  • Мы будем говорить только о том, о чем вы наверняка, до того не знали
  • Максимально-полезные доклады, которые усилят Вас как специалиста
  • Все доклады — от 1,5 часов. Что позволит докладчикам не экономить и рассказать все что они знают

Примечание к Nitra и Nemerle: эти два opensource проекта нынче разрабатываются в стенах компании JetBrains.
Доклады:

  • Андрей Акиньшин (JetBrains) Железные таймеры
  • Влад Чистяков (JetBrains) Nemerle — самая мощная альтернатива C# на .NET
  • Влад Чистяков (JetBrains) Nitra — средство разработки языков программирования и DSL
  • Станислав Сидристый (Luxoft)JetBrains Rider IDE: Java IDE для кросс-платформенного .NET
  • Станислав Сидристый (Luxoft) Автоматизация тестирования WPF/WinForms приложений через внедрение в процесс
  • Никита Цуканов Кроссплатформенная разработка UI приложений (Perspex UI, Eto.Forms, Xamarin Forms)

Когда и где?

Ссылки на регистрацию:

  • У нас есть отличный сайт, на котором можно почитать как про всех спикеров, так и про все доклады. Заходите, изучайте, берите билеты: http://qaconf.ru/

Что такое CLRium?? Видео записи семинара (собравшего в сумме 740 человек) с прошлого года — под катом.
Читать полностью »

Введение

Будучи студентом я посещаю занятия по криптографии. И разумеется этот курс не мог обойти вниманием стандарт AES.

При реализации данного алгоритма встает вопрос о реализации полей GF(2^8), что будет освещено в данной статье. Будут рассмотрены: битовая магия для умножения элементов поля, шаблоны для генерации таблиц замен на этапе компиляции.

Вторая часть предполагает, что читатель имеет доступ к компилятору с поддержкой C++14. Первая часть будет написана в стиле Си.
Читать полностью »

Кто-то парсирует текстовый файл программой на Питоне, другой пишет скрипт с регулярными выражениями на Перле, Си-программист стыдливо возится с буферами и указателями, иногда применяя Yacc и Lex.

А можно ли парсировать текст голым железом? Вообще без программы?

— А как это?, — спросил меня знакомый, — С помощью Ардуино?

— Внутри Ардуино стоит вполне фон-неймановский процессор и работает программа, — ответил я, — Нет, еще более голое железо.

— А-а-а-а, этот, микрокод?, — догадался мой товарищ и взглянул на меня победно.

— Нет, термин «микрокод» использовался для специфической организации процессоров в 1970-е годы, потом его использование сошло на нет, — ответил я и добавил, — Правда есть еще микрооперации в интеловских процессорах, в которые перекодируется x86, но это тоже другое. Нет, я имею в виду парсинг текста устройством, состоящим из логических элементов И-ИЛИ-НЕ и Д-триггерами, как на картинке ниже.

— Невозможно! — воскликнул мой приятель, — в таком устройстве где-то сбоку должен сидеть процессор и хитро подмигивать!

— Почему это невозможно?, — парировал я, — Вот машину Тьюринга знаешь? Парсирует текст на ленте, а сбоку никакие интелы и ардуино не подмигивают.

— Нуу, машина Тьюринга, — протянул приятель, — это абстракция, типа Демона Максвелла.

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

mfp_srec_parser_fragment
Читать полностью »

Помимо вполне понятной официальной документации (Chromium Wiki), существуют и статьи о том, как получить исходный код и собрать проект Chromium (например).

Я же хотел рассказать о том, как на основе этого кода можно создавать приложения на C++, способные компилироваться и выполняться на нескольких операционных системах и архитектурах. Конечно, для этой цели уже существуют библиотеки, такие как Qt и boost. Но именно поэтому данная статья относится к разделу 'ненормальное программирование', ведь никто всерьез не рассматривает код Chromium как основу для кроссплатформенного приложения.
Читать полностью »

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

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

Недавно с одним из коллег зашел разговор про начало двухтысячных, и почему-то вспомнились первые наши мобильные телефоны Siemens и игра Wappo. В итоге сама собой родилась идея написать эту игрушку использую средства проектирования ПТК «Квинт 7». Т.к. больших усилий и кучи времени на это не требовалось, то вот результат:

Игра «Wappo» на FBD или минутка доброты - 1

На все это дело затрачено две половинки обеденных перерывов (совместно с распитием кофе) и пара часов вечером на рисование картинок в MS Paint.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js