- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 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;
}
gost # 0
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. Можно определять операторы + и -.
gost # 0 ⇈
Теперь понятно, как нам реализовывать . и ,: просто делаем SpanPopFront и SpanPushBack на соответствующих массивах.
8. Определяем метафункции-операторы вот такого вида:
То есть эти метафункции получают на вход состояние и отдают его же, но изменённое. Какое ФП )))
9. Определяем метафункцию, принимающую на вход символ алфавита «Брейнфака» и состояние, и возвращающую изменённое в соответствии с символом состояние:
10. Определяем метафункцию EvalImpl, которая принимает состояние и будет выполнять текущий выделенный символ программы до тех пор, пока не дойдёт до конца. Когда дойдёт — возвратит вывод программы.
11. Определяем всяческие хелперы: вывод на экран, App<>, Input<>.
Вуаля!
К сожалению, более-менее сложные программы (особенно с циклами) компиляторы не тянут: «Visual Studio» представленный в ТС-коде хелловорлд вообще не компилирует, «GCC» требует «-ftemplate-depth=1024». Нативного преобразования строк в метастроки в кресты так и не завезли, поэтому программы придётся писать посимвольно.
bormand # 0 ⇈
Ну ты можешь операторами формировать метастроку. Примерно та же логика, что в моей версии. Просто завернуть это в decltype.
using code = decltype(+ + + BrainFuck);
gost # 0 ⇈
Добавляем:
И течём:
https://wandbox.org/permlink/tj9IUMB5WJ7WTrHu
Так даже реверсировать программу на BF не надо, просто посимвольно заменить.
Добрый вечер.
bormand # 0 ⇈
gost # 0 ⇈
bormand # 0 ⇈
gost # 0 ⇈
CHayT # 0 ⇈
nymuH_XyuJlo # 0 ⇈
CHayT # 0 ⇈
admin # 0 ⇈
MAKAKA # 0 ⇈
AHCKujlbHblu_netyx # 0 ⇈
:\
digitalEugene # 0
digitalEugene # 0 ⇈
gost # 0 ⇈
OCETuHCKuu_nemyx # 0
defecate-plusplus # 0
gost # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
http://web.archive.org/web/20190730212526/zhurnal.lib.ru/d/deathwisher/deprivation.shtml
Из заметки: «Но, конечно, самое интересное это визуальные галлюцинации. В основном, из-за того, что ДС это всё-таки не медикаментозный наркотик, галлюцинации носят ассоциативный характер, в частности, это нарушение (вследствие истощения психико-физиолгических резервов организма) в поступающем по зрительному нерву сигналу, перверсия изображения, среди охотников именуемая "глазной горячкой" - когда глаз видит одно, но из-за нарушения в психике, посылает в мозг сигнал о другом объекте.
Мои личные закидоны:
гниющий труп на улице (брезентовый мешок и полиэтиленовые пакеты)
движущиеся люди в магазине (манекены, стоявшие неподвижно)
черви в лапше (просто лапша)
замахивающийся чем-то человек на периферии зрения (никого не было)
обращающиеся ко мне люди (никто не обращался в действительности)
моя разлагающаяся рука (тень неудачно упала)
то же самое с лицом
плавящаяся в руке авторучка (ничего не было)
кровь, растекшаяся по поверхности (кусок красной ткани)
какие-то смутные фигуры в толпе, среди знакомых (никого не было)».
bormand # 0 ⇈
gost # 0 ⇈
defecate-plusplus # 0 ⇈
у меня был однажды недолго сотрудник, который за 3 месяца поехал
MAKAKA # 0 ⇈
defecate-plusplus # 0 ⇈
defecate-plusplus # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
Сиреневый сон.
Снится малине
Малиновый сон.
Рябине –—
Рябиновый снится...
И только колючке не спится:
Колючка боится,
Что сон ей приснится
Колючий-колючий,
Как спица.
defecate-plusplus # 0 ⇈
держится за сук е2-е2
HoBorogHuu_nemyx # 0 ⇈
И оркестр укрыт снегом,
Словно вата, глухим снегом,
И соната слышна e2-e2.
Только что это значит? Передумал ходить?
defecate-plusplus # 0 ⇈
Desktop # 0 ⇈
guest # 0
CHayT # 0
Pig # 0
bormand # 0 ⇈
gost # 0 ⇈
bormand # 0 ⇈
guest # 0 ⇈
bormand # 0 ⇈
bootcamp_dropout # 0 ⇈
CHayT # 0 ⇈
bormand # 0 ⇈
CHayT # 0 ⇈
Sers # 0 ⇈
defecate-plusplus # 0 ⇈
Кстати в постгресе бесит недостаточный градус метуха. Хотя он там несомненно больше, чем в прости господи оракле.
Давно уже пора шаблонные таблицы уметь делать, живёшь как в каменном веке
DypHuu_niBEHb # 0 ⇈
bormand # 0 ⇈
DypHuu_niBEHb # 0 ⇈
template table foo id(...)
table bar:foo
так?
сейчас в постгре есть наследование таблиц, но Д++ говорит, это харам
bormand # 0 ⇈
DypHuu_niBEHb # 0 ⇈
и вообще
мне таблицы джанга генерит
defecate-plusplus # 0 ⇈
приведи реальный пример, где тебе оно пригодилось
сегодня вот, например, программист, ранее предварительно согласовав вариант с применением наследования в логической иерархии типов, поел говна, напомнив, что наследование это отрыжка (я вчера забыл про такой кейс, когда перечислял, почему наследование это харам)
DypHuu_niBEHb # 0 ⇈
Я про ситуацию, когда у меня есть много похожих кусков в субд. Хотя по в идеале их нужно выносить в отдельные таблицы, и делать внешний ключ (этакое делегирование).
Ну вот наш вчерашний разговор про архивы постов: если у поста 10 полей, и есть архив, то было бы удобно использовать что-то, чтобы поля не писались два раза.
Другой вопрос, что у наследования есть побочные эффекты, которые (как я понял) перекрывают плюсы
bormand # 0 ⇈
> выносить в отдельные таблицы
Джойн на ровном месте? Свалить не связанные друг с другом данные в одну таблицу (шапки постов и шапки комментов, лол)? Нахуй и в пизду. Это реально рак.
Наследование - это "является". Т.е. например "чайник" является "товаром". Вот тут, наверное, оно ещё как-то будет работать если ты породишь таблицу чайников от таблицы товаров. Но скорее всего проще какую-нибудь динамическую колонку добавить для таких свойств (json?)
guest # 0 ⇈
bootcamp_dropout # 0 ⇈
DypHuu_niBEHb # 0 ⇈
Desktop # 0 ⇈
- малость общих свойств, многость разных
bormand # 0 ⇈
А у чайника мощность и объём какие-нибудь в добавок.
Хотя хуйня это всё, конечно. Никто такие детали в структуру базы не тащит походу, задолбаешься таблицы править.
З.Ы. Пусть д++ рассудит.
DypHuu_niBEHb # 0 ⇈
Да, я бы тоже наверное не стал добавлять отдельную колонку "вид подошвы", если мой магазин начал бы завтра продавать ботнки
defecate-plusplus # 0 ⇈
DypHuu_niBEHb # 0 ⇈
по счастью, удаляются товары редко
Потому что с ними и заказы удаляются, лол
defecate-plusplus # 0 ⇈
DypHuu_niBEHb # 0 ⇈
но да, без триггера никак не гарантировать, что ты не сможешь удалить доп информацию, оставив основную:(
А можно еще пойти дальше, и проверять триггером, что если у тебя тип товара (поле такое) равно "чайник", то у него обязана быть запись именно в чайнике.
Ну либо положить всё это на бекенд, но если не дай бог у тебя два разных продукта ходят в базу напрямую, то получается что никак кроме как через тригеры это не гарантировать.
Я еще видел базу, куда люди ходили исключительно через хранимые процедуры, и эти процедуры гарантировали консистентность, но это адский оверкил
defecate-plusplus # 0 ⇈
но сначала ты инсертишь базовый товар, лишь вторым - чайник (он ведь ожидает существование товара)
даже если ты скильный питух и умеешь в insert в несколько таблиц в одном стейтменте (полагаю никакой орм это не может), без вчера обсужденных деферред этого не достичь
слишком сложно для простой задачи не обосраться на бекенде
DypHuu_niBEHb # 0 ⇈
НУ вообще всегда лучше наверное поверх базы иметь бекенд, и пускать в него разные приложения через какойнить RPC, чтобы всю эту логику писать на человеческом языке
defecate-plusplus # 0 ⇈
и именно вот тут постгрес тебе поднасрет, ведь в корзину ты хочешь положить что? товар? т.е. FK на "товар", даже если он "чайник", верно? бугога, обломись, в таблице "товар" нет id=13, хотя он и есть в таблице "чайники"
DypHuu_niBEHb # 0 ⇈
teapots_info
вид_ручки: ..
item_id: FK to items
Вообще есть мнение, что реляционные СУБД плохо ложатся на ирерахии объектов)
DypHuu_niBEHb # 0 ⇈
нормализация, чувак)
Джойны это конечно зло для перформанса, потому для отчетов используют денормализованные таблицы, которые генерят например раз в час по данным.
>Свалить не связанные друг с другом данные в одну таблицу (
см пример с архивом
defecate-plusplus # 0 ⇈
для этого идеально, если бы таблица active и archive имели идентичный набор И порядок полей
тогда можно в триггере писать и течь
если в archive есть все поля, что в active, но их может быть больше, и/или порядок хуевый, тогда придется сначала поселектить колонки (с учетом порядка) из information_schema, получить строку вида "id,name,foo,bar" (это несложно), и исполнять уже динамический куери типа это уже не так красиво выглядит, но всё ещё можно жить
а если у тебя набор колонок или семантика уплыла в archive, то, скорее всего, тебе придется руками наебенить по-чесноку, а не писать универсальный триггер
но вообще завтра попробую в мичети с наследованием кое-что, посмотрю как будет влиять на порядок полей в дочке, если делать альтер для родительской таблы (думаю, чуда не будет и получится дефрагментация)
DypHuu_niBEHb # 0 ⇈
>но вообще завтра попробую в мичети с наследованием
о, круто)
defecate-plusplus # 0 ⇈
как и предполагалось, альтер общего родителя будет вмешиваться в порядок полей, и порядок полей будет зависеть от последовательности, где когда кто был создан (хз как оно должно было бы быть иначе, это ведь база, а не жсон)
Desktop # 0 ⇈
defecate-plusplus # 0 ⇈
это важно, если ты на это хотел бы опираться
но единственный надёжный способ этого добиться - делать иерархию партициями
это неплохо работает на проде, но не между несколькими инстансами
gost # 0 ⇈
Аллах един!
guest # 0 ⇈
DypHuu_niBEHb # 0 ⇈
guest # 0 ⇈
DypHuu_niBEHb # 0 ⇈
bormand # 0 ⇈
DypHuu_niBEHb # 0 ⇈
https://regulation.gov.ru/projects#npa=108513
bormand # 0 ⇈
DypHuu_niBEHb # 0 ⇈
bormand # 0 ⇈
DypHuu_niBEHb # 0 ⇈
Ттогда ок
bormand # 0 ⇈
З.Ы. Кстати, провайдер получается может просто стрипнуть эту запись (е сли не DNSSEC). И всё будет работать прекрасно. И товарищ майор доволен и юзеры.
Остаётся DNSSEC запретить.
DypHuu_niBEHb # 0 ⇈
это разве не про то, что имя домена я шлю уже зашифрованным?
типа я с сервером сначала выработал тайный ключ (диффихельманом или там вывел его как-то иначе) и потом послал имя уже шифрованное в хеллоо?
bormand # 0 ⇈
Поэтому они тупо привернули ебучий костыль с ключом сервера в DNS.
А самое забавное, что при этом DNS запросы и ответы все прекрасно видят. Т.е. вообще не понятно что скрыть то пытались в этом ESNI.
DypHuu_niBEHb # 0 ⇈
потом шифрнуть им имя домена
потом послать его
потом получить серт
потом проверить его
ну и дальше поехало
bormand # 0 ⇈
Именно поэтому SNI и был реализован плейнтекстом.
DypHuu_niBEHb # 0 ⇈
а зачем мне такой пруф?
ну попижжу я с хакером, выработаю с ним приватный ключ, а откуда он серт возьмет?
напомни, как работает IKE в IPSec? Там разве не DH сначала, а потом уже аутентификация по серту?
bormand # 0 ⇈
Потому что ты ссышь отправить имя домена открытым текстом! А без пруфа ты его отправишь прямо в лапы хакера, с которым согласовал ключ. А дальше он тебя тупо дропнет.
Ну т.е. твоя схема для защиты SNI не защищает от раскрытия SNI.
Ты думаешь чуваки реально от хорошей жизни попёрлись в DNS ключи добавлять?
DypHuu_niBEHb # 0 ⇈
Если спуфать каждый мой запрос -- никаких цпу не хватит, пользователей же охулион. А читать плейнтекст легко
>Ты думаешь чуваки реально от хорошей жизни попёрлись в DNS ключи добавлять?
Я пытался понять, почему они не сделали через DH. Ну вот твой аргумент мне понятен: от спуфа это не спасет (а от снифа спасет)
bormand # 0 ⇈
В гипотетической ситуации, когда ты вписал маппинг домена на айпишку себе в hosts (чтобы не делать DNS запрос), а на серваке тыща разных доменов крутится (т.е. по айпишке домен не узнать)?
Блин, я параноик но я реально не вижу никакой проблемы в открытом SNI.
DypHuu_niBEHb # 0 ⇈
С ESNI ему сделать это будет трудно
А со SNI -- нет
bormand # 0 ⇈
З.Ы. Уже проходили со всякими ЖЖ экстремистов, серваки целиком только так отлетали, тогда более тонкий бан по SNI ещё никто не умел.
DypHuu_niBEHb # 0 ⇈
ну пускай он забанит мне ALB* в AWS, лол) Потом у людей будет jupyter.org не открываться
*это такой лоад балансер -- фронтэнд, где терминируется HTTPS, им управляет AWS, а дальше он идет на мою виртуалку по внутреннему IP уже плейнтекстом.
Причем AWS может поменять IP не ставя меня в известность, и DNS сам проапдрейтить
bormand # 0 ⇈
З.Ы. А всякие восьмёрки просто забанить. Ибо нехуй.
DypHuu_niBEHb # 0 ⇈
Если он его всегда по DNS делает, то да: проще фильтровать DNS.
Даже если у меня он 8.8.8.8, то он же плейнтекстовый
bormand # 0 ⇈
Не помню, если честно.
DypHuu_niBEHb # 0 ⇈
сначала DH и темпоральные ключи
А потом уже поверх auth
Но тут другое дело: ты не передаешь ему вообще никакой информации, кроме поддерживаемых шифров и желания подключиться
CHayT # 0 ⇈
DypHuu_niBEHb # 0 ⇈
А мутить как? А то вот некоторые языки позволяют мутить абстракции копи-пастом, и пусть бы лучше они умели метушню
bootcamp_dropout # 0 ⇈
в других языках не так?