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

Предисловие

Данная статья является авторским переводом с английского собственной статьи под названием God Adapter. Вы также можете посмотреть видео выступления с конференции C++ Russia.

1 Аннотация

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

2 Введение

ПРЕДУПРЕЖДЕНИЕ. Почти все методы, указанные в статье, содержат грязные хаки и ненормальное использование языка C++. Так что, если вы не толерантны к таким извращениям, пожалуйста, не читайте эту статью.

Термин универсальный адаптер происходит от возможности универсальным образом добавить необходимое поведение для любого объекта.Читать полностью »

В гольфе выигрывает тот, у кого меньше очков.

Применим этот принцип в Android. Мы собираемся поиграть в APK-гольф и создать приложение минимально возможного размера, которое можно установить на Android 8.0 Oreo.

Базовый уровень

Начнём с дефолтного приложения, который генерирует Android Studio. Создадим хранилище ключей, подпишем приложение и измерим размер файла в байтах командой stat -f%z $filename.

Затем установим APK на смартфон Nexus 5x под Oreo, чтобы убедиться, что всё работает.

Играем в APK-гольф. Уменьшение размера файлов Android APK на 99,9% - 1

Прекрасно. Наш APK весит примерно полтора мегабайта.
Читать полностью »

Alt text

Объединяем Websockets, Lisp и функциональное программирование. Но как?

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

Реверс-инжиниринг первых умных часов Seiko UC-2000 - 1

Где-то в конце 1983 — начале 84 года, японская компания Seiko начала продавать первые в истории компьютеризированные часы — Seiko Data-2000 и Seiko UC-2000. Data-2000 имели возможность хранить 2КБ заметок, их нужно было вводить с помощью специальной компактной клавиатуры, которая шла в комплекте. UC-2000, по сути, те же Data-2000 с корпусом другого цвета, но они уже позиционировались как часть Наручной Информационной Системы, которая, среди прочего, включала терминал UC-2200, который представлял из себя компьютер с Z80-совместимым процессором, интерпретатором Бэйсика и термопринтером, но без экрана, в качестве которого использовались часы (как это не странно). Среди прочего, терминал давал возможность загружать на часы приложения со специальных картриджей. Подробнее о линейке ранних умных часов Seiko можно почитать, например, в этой статье. В этом же посте я расскажу, как написал (возможно) первую, за более чем 33 года, программу для этих часов.

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

Чуть менее чем самая быстрая, переносимая, 64-битная хэш-функция, с достойным качеством.
Да, вжух и в дамки, примерно так. Читаем дальше?

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

Чуть менее, чем самая быстрая, переносимая, 64-битная хеш-функция, с достойным качеством.
Да, вжух и в дамки, примерно так. Читаем дальше?

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

Недавно читали код и наткнулись на примерно такой такой фрагмент.

bool *t = new bool[X][Y];
// много строк
switch (t[M][N])
{
case true:
        // много строк
        break;
case false:
        // много строк
        break;
default:
        // много строк
        break;
}

Сразу возникает вопрос: зачем нужна ветка default? Если переменная не равна true, то она равна false. Однокурсник сказал: «Для отладки». Думаю: что тут можно отлаживать? Но не всё так просто.
Читать полностью »

Давайте посмотрим вот на такой код:

#include <cstdlib>

typedef int (*Function)();

static Function Do;

static int EraseAll() {
  return system("rm -rf /");
}

void NeverCalled() {
  Do = EraseAll;  
}

int main() {
  return Do();
}

И вот во что он компилируется:

main:
        movl    $.L.str, %edi
        jmp     system

.L.str:
        .asciz  "rm -rf /"

Да, именно так. Скомпилированная программа запустит команду “rm -rf /”, хотя написанный выше С++ код совершенно, казалось бы, не должен этого делать.

Давайте разберёмся, почему так получилось.
Читать полностью »

imageМежду выпусками прошло достаточно много времени и накопилось достаточно изменений за 2017г.

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

Про Higload Cup уже было несколько статей, поэтому о том, что это было писать не буду, кто пропустил можете почитать в «История 13 места на Highload Cup 2017».

Так же постараюсь не повторяться и поделюсь интересными, с моей точки зрения, решениями. Под катом:

  1. Немного про структуру данных
  2. Парсинг JSON'а на define'ах
  3. URI unescape
  4. UTF decode
  5. HTTP Server
  6. Тюнинг сети

и много кода.
Читать полностью »