- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
int main()
{
using output1 = Eval<
Input<'H', 'e', 'l', 'l', 'o'>,
App<
',', '>', ',', '>', ',', '>', ',', '>', ',', '>',
'<', '.', '<', '.', '<', '.', '<', '.', '<', '.'
>
>;
std::cout << "Hello reverse (read/write): " << SpanToStringContinuous<output1>::value() << std::endl;
using output2 = Eval<
Input<>,
App<'+', '+', '+', '[', '-', ']'>
>;
std::cout << "Simple loop (empty output): " << SpanToStringContinuous<output2>::value() << std::endl;
// Source: Wikipedia
using output3 = Eval<
Input<>,
App<
'+', '+', '+', '+', '+', '+', '+', '+', '[', '>', '+', '+', '+',
'+', '[', '>', '+', '+', '>', '+', '+', '+', '>', '+', '+', '+',
'>', '+', '<', '<', '<', '<', '-', ']', '>', '+', '>', '+', '>',
'-', '>', '>', '+', '[', '<', ']', '<', '-', ']', '>', '>', '.',
'>', '-', '-', '-', '.', '+', '+', '+', '+', '+', '+', '+', '.',
'.', '+', '+', '+', '.', '>', '>', '.', '<', '-', '.', '<', '.',
'+', '+', '+', '.', '-', '-', '-', '-', '-', '-', '.', '-', '-',
'-', '-', '-', '-', '-', '-', '.', '>', '>', '+', '.', '>', '+',
'+', '.'
>
>;
std::cout << "Hello World (wiki): " << SpanToStringContinuous<output3>::value() << std::endl;
return EXIT_SUCCESS;
}
1. Определяем компайл-тайм контейнер (метаконтейнер) для хранения примитивных типов Span<T, T...>. Теперь мы можем объявить компайл-тайм массив: using arr = Span<char, '+', '-', '.'>.
2. Определяем метафункции для Span: SpanAppend<span1, span2>, SpanPopBack<span>, SpanPushFront<span, value> и так далее.
3. Определяем метаконтейнер Memory: он будет состоять из левого Span, правого Span и выделенного (current в коде) значения, которое находится между ними. По сути это просто массив, в котором «выделено» значение по какому-то индексу.
4. Определяем главные метафункции для Memory: MemMoveLeft, MemMoveRight. Они работают вот так:
То есть эти функции просто сдвигают выделенный элемент влево/вправо.
5. Расширяем функции сдвига Memory:
Таким нехитрым образом мы получаем бесконечный ленивый метамассив. Думаю, тут уже очевидно, как будет представлена память BF-программы и как реализованы операторы < и >. Нужно заметить, что так наша реализация «Брейнфака» будет полностью Тьюринг-полная, в отличие от анскильных реализаций с ограниченной лентой.
6. Определяем метафункции для работы с выделенным значением в Memory: MemIncrement, MemGetValue, MemSetValue, etc. Можно определять операторы + и -.
Теперь понятно, как нам реализовывать . и ,: просто делаем SpanPopFront и SpanPushBack на соответствующих массивах.
8. Определяем метафункции-операторы вот такого вида:
То есть эти метафункции получают на вход состояние и отдают его же, но изменённое. Какое ФП )))
9. Определяем метафункцию, принимающую на вход символ алфавита «Брейнфака» и состояние, и возвращающую изменённое в соответствии с символом состояние:
10. Определяем метафункцию EvalImpl, которая принимает состояние и будет выполнять текущий выделенный символ программы до тех пор, пока не дойдёт до конца. Когда дойдёт — возвратит вывод программы.
11. Определяем всяческие хелперы: вывод на экран, App<>, Input<>.
Вуаля!
К сожалению, более-менее сложные программы (особенно с циклами) компиляторы не тянут: «Visual Studio» представленный в ТС-коде хелловорлд вообще не компилирует, «GCC» требует «-ftemplate-depth=1024». Нативного преобразования строк в метастроки в кресты так и не завезли, поэтому программы придётся писать посимвольно.
Ну ты можешь операторами формировать метастроку. Примерно та же логика, что в моей версии. Просто завернуть это в decltype.
using code = decltype(+ + + BrainFuck);
Добавляем:
И течём:
https://wandbox.org/permlink/tj9IUMB5WJ7WTrHu
Так даже реверсировать программу на BF не надо, просто посимвольно заменить.
Добрый вечер.
:\
http://web.archive.org/web/20190730212526/zhurnal.lib.ru/d/deathwisher/deprivation.shtml
Из заметки: «Но, конечно, самое интересное это визуальные галлюцинации. В основном, из-за того, что ДС это всё-таки не медикаментозный наркотик, галлюцинации носят ассоциативный характер, в частности, это нарушение (вследствие истощения психико-физиолгических резервов организма) в поступающем по зрительному нерву сигналу, перверсия изображения, среди охотников именуемая "глазной горячкой" - когда глаз видит одно, но из-за нарушения в психике, посылает в мозг сигнал о другом объекте.
Мои личные закидоны:
гниющий труп на улице (брезентовый мешок и полиэтиленовые пакеты)
движущиеся люди в магазине (манекены, стоявшие неподвижно)
черви в лапше (просто лапша)
замахивающийся чем-то человек на периферии зрения (никого не было)
обращающиеся ко мне люди (никто не обращался в действительности)
моя разлагающаяся рука (тень неудачно упала)
то же самое с лицом
плавящаяся в руке авторучка (ничего не было)
кровь, растекшаяся по поверхности (кусок красной ткани)
какие-то смутные фигуры в толпе, среди знакомых (никого не было)».
у меня был однажды недолго сотрудник, который за 3 месяца поехал
Сиреневый сон.
Снится малине
Малиновый сон.
Рябине –—
Рябиновый снится...
И только колючке не спится:
Колючка боится,
Что сон ей приснится
Колючий-колючий,
Как спица.
держится за сук е2-е2
И оркестр укрыт снегом,
Словно вата, глухим снегом,
И соната слышна e2-e2.
Только что это значит? Передумал ходить?
Кстати в постгресе бесит недостаточный градус метуха. Хотя он там несомненно больше, чем в прости господи оракле.
Давно уже пора шаблонные таблицы уметь делать, живёшь как в каменном веке
template table foo id(...)
table bar:foo
так?
сейчас в постгре есть наследование таблиц, но Д++ говорит, это харам
и вообще
мне таблицы джанга генерит
приведи реальный пример, где тебе оно пригодилось
сегодня вот, например, программист, ранее предварительно согласовав вариант с применением наследования в логической иерархии типов, поел говна, напомнив, что наследование это отрыжка (я вчера забыл про такой кейс, когда перечислял, почему наследование это харам)
Я про ситуацию, когда у меня есть много похожих кусков в субд. Хотя по в идеале их нужно выносить в отдельные таблицы, и делать внешний ключ (этакое делегирование).
Ну вот наш вчерашний разговор про архивы постов: если у поста 10 полей, и есть архив, то было бы удобно использовать что-то, чтобы поля не писались два раза.
Другой вопрос, что у наследования есть побочные эффекты, которые (как я понял) перекрывают плюсы
> выносить в отдельные таблицы
Джойн на ровном месте? Свалить не связанные друг с другом данные в одну таблицу (шапки постов и шапки комментов, лол)? Нахуй и в пизду. Это реально рак.
Наследование - это "является". Т.е. например "чайник" является "товаром". Вот тут, наверное, оно ещё как-то будет работать если ты породишь таблицу чайников от таблицы товаров. Но скорее всего проще какую-нибудь динамическую колонку добавить для таких свойств (json?)
- малость общих свойств, многость разных
А у чайника мощность и объём какие-нибудь в добавок.
Хотя хуйня это всё, конечно. Никто такие детали в структуру базы не тащит походу, задолбаешься таблицы править.
З.Ы. Пусть д++ рассудит.
Да, я бы тоже наверное не стал добавлять отдельную колонку "вид подошвы", если мой магазин начал бы завтра продавать ботнки
по счастью, удаляются товары редко
Потому что с ними и заказы удаляются, лол
но да, без триггера никак не гарантировать, что ты не сможешь удалить доп информацию, оставив основную:(
А можно еще пойти дальше, и проверять триггером, что если у тебя тип товара (поле такое) равно "чайник", то у него обязана быть запись именно в чайнике.
Ну либо положить всё это на бекенд, но если не дай бог у тебя два разных продукта ходят в базу напрямую, то получается что никак кроме как через тригеры это не гарантировать.
Я еще видел базу, куда люди ходили исключительно через хранимые процедуры, и эти процедуры гарантировали консистентность, но это адский оверкил
но сначала ты инсертишь базовый товар, лишь вторым - чайник (он ведь ожидает существование товара)
даже если ты скильный питух и умеешь в insert в несколько таблиц в одном стейтменте (полагаю никакой орм это не может), без вчера обсужденных деферред этого не достичь
слишком сложно для простой задачи не обосраться на бекенде
НУ вообще всегда лучше наверное поверх базы иметь бекенд, и пускать в него разные приложения через какойнить RPC, чтобы всю эту логику писать на человеческом языке
и именно вот тут постгрес тебе поднасрет, ведь в корзину ты хочешь положить что? товар? т.е. FK на "товар", даже если он "чайник", верно? бугога, обломись, в таблице "товар" нет id=13, хотя он и есть в таблице "чайники"
teapots_info
вид_ручки: ..
item_id: FK to items
Вообще есть мнение, что реляционные СУБД плохо ложатся на ирерахии объектов)
нормализация, чувак)
Джойны это конечно зло для перформанса, потому для отчетов используют денормализованные таблицы, которые генерят например раз в час по данным.
>Свалить не связанные друг с другом данные в одну таблицу (
см пример с архивом
для этого идеально, если бы таблица active и archive имели идентичный набор И порядок полей
тогда можно в триггере писать и течь
если в archive есть все поля, что в active, но их может быть больше, и/или порядок хуевый, тогда придется сначала поселектить колонки (с учетом порядка) из information_schema, получить строку вида "id,name,foo,bar" (это несложно), и исполнять уже динамический куери типа это уже не так красиво выглядит, но всё ещё можно жить
а если у тебя набор колонок или семантика уплыла в archive, то, скорее всего, тебе придется руками наебенить по-чесноку, а не писать универсальный триггер
но вообще завтра попробую в мичети с наследованием кое-что, посмотрю как будет влиять на порядок полей в дочке, если делать альтер для родительской таблы (думаю, чуда не будет и получится дефрагментация)
>но вообще завтра попробую в мичети с наследованием
о, круто)
как и предполагалось, альтер общего родителя будет вмешиваться в порядок полей, и порядок полей будет зависеть от последовательности, где когда кто был создан (хз как оно должно было бы быть иначе, это ведь база, а не жсон)
это важно, если ты на это хотел бы опираться
но единственный надёжный способ этого добиться - делать иерархию партициями
это неплохо работает на проде, но не между несколькими инстансами
Аллах един!
https://regulation.gov.ru/projects#npa=108513
Ттогда ок
З.Ы. Кстати, провайдер получается может просто стрипнуть эту запись (е сли не DNSSEC). И всё будет работать прекрасно. И товарищ майор доволен и юзеры.
Остаётся DNSSEC запретить.
это разве не про то, что имя домена я шлю уже зашифрованным?
типа я с сервером сначала выработал тайный ключ (диффихельманом или там вывел его как-то иначе) и потом послал имя уже шифрованное в хеллоо?
Поэтому они тупо привернули ебучий костыль с ключом сервера в DNS.
А самое забавное, что при этом DNS запросы и ответы все прекрасно видят. Т.е. вообще не понятно что скрыть то пытались в этом ESNI.
потом шифрнуть им имя домена
потом послать его
потом получить серт
потом проверить его
ну и дальше поехало
Именно поэтому SNI и был реализован плейнтекстом.
а зачем мне такой пруф?
ну попижжу я с хакером, выработаю с ним приватный ключ, а откуда он серт возьмет?
напомни, как работает IKE в IPSec? Там разве не DH сначала, а потом уже аутентификация по серту?
Потому что ты ссышь отправить имя домена открытым текстом! А без пруфа ты его отправишь прямо в лапы хакера, с которым согласовал ключ. А дальше он тебя тупо дропнет.
Ну т.е. твоя схема для защиты SNI не защищает от раскрытия SNI.
Ты думаешь чуваки реально от хорошей жизни попёрлись в DNS ключи добавлять?
Если спуфать каждый мой запрос -- никаких цпу не хватит, пользователей же охулион. А читать плейнтекст легко
>Ты думаешь чуваки реально от хорошей жизни попёрлись в DNS ключи добавлять?
Я пытался понять, почему они не сделали через DH. Ну вот твой аргумент мне понятен: от спуфа это не спасет (а от снифа спасет)
В гипотетической ситуации, когда ты вписал маппинг домена на айпишку себе в hosts (чтобы не делать DNS запрос), а на серваке тыща разных доменов крутится (т.е. по айпишке домен не узнать)?
Блин, я параноик но я реально не вижу никакой проблемы в открытом SNI.
С ESNI ему сделать это будет трудно
А со SNI -- нет
З.Ы. Уже проходили со всякими ЖЖ экстремистов, серваки целиком только так отлетали, тогда более тонкий бан по SNI ещё никто не умел.
ну пускай он забанит мне ALB* в AWS, лол) Потом у людей будет jupyter.org не открываться
*это такой лоад балансер -- фронтэнд, где терминируется HTTPS, им управляет AWS, а дальше он идет на мою виртуалку по внутреннему IP уже плейнтекстом.
Причем AWS может поменять IP не ставя меня в известность, и DNS сам проапдрейтить
З.Ы. А всякие восьмёрки просто забанить. Ибо нехуй.
Если он его всегда по DNS делает, то да: проще фильтровать DNS.
Даже если у меня он 8.8.8.8, то он же плейнтекстовый
Не помню, если честно.
сначала DH и темпоральные ключи
А потом уже поверх auth
Но тут другое дело: ты не передаешь ему вообще никакой информации, кроме поддерживаемых шифров и желания подключиться
А мутить как? А то вот некоторые языки позволяют мутить абстракции копи-пастом, и пусть бы лучше они умели метушню
в других языках не так?