- 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;
}
gost 03.09.2020 08:03 # 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 03.09.2020 08:03 # 0
Теперь понятно, как нам реализовывать . и ,: просто делаем SpanPopFront и SpanPushBack на соответствующих массивах.
8. Определяем метафункции-операторы вот такого вида:
То есть эти метафункции получают на вход состояние и отдают его же, но изменённое. Какое ФП )))
9. Определяем метафункцию, принимающую на вход символ алфавита «Брейнфака» и состояние, и возвращающую изменённое в соответствии с символом состояние:
10. Определяем метафункцию EvalImpl, которая принимает состояние и будет выполнять текущий выделенный символ программы до тех пор, пока не дойдёт до конца. Когда дойдёт — возвратит вывод программы.
11. Определяем всяческие хелперы: вывод на экран, App<>, Input<>.
Вуаля!
К сожалению, более-менее сложные программы (особенно с циклами) компиляторы не тянут: «Visual Studio» представленный в ТС-коде хелловорлд вообще не компилирует, «GCC» требует «-ftemplate-depth=1024». Нативного преобразования строк в метастроки в кресты так и не завезли, поэтому программы придётся писать посимвольно.
bormand 03.09.2020 09:00 # +1
Ну ты можешь операторами формировать метастроку. Примерно та же логика, что в моей версии. Просто завернуть это в decltype.
using code = decltype(+ + + BrainFuck);
gost 03.09.2020 16:24 # +1
Добавляем:
И течём:
https://wandbox.org/permlink/tj9IUMB5WJ7WTrHu
Так даже реверсировать программу на BF не надо, просто посимвольно заменить.
Добрый вечер.
bormand 03.09.2020 16:29 # 0
gost 03.09.2020 16:33 # 0
bormand 03.09.2020 16:36 # 0
gost 03.09.2020 16:38 # 0
CHayT 03.09.2020 17:40 # 0
nymuH_XyuJlo 03.09.2020 17:54 # 0
CHayT 03.09.2020 18:24 # 0
defecatinho 03.09.2020 19:43 # −1
MAKAKA 03.09.2020 19:47 # −1
AHCKujlbHblu_netyx 04.09.2020 10:22 # 0
:\
digitalEugene 03.09.2020 08:09 # 0
digitalEugene 03.09.2020 08:11 # 0
gost 03.09.2020 08:21 # +1
OCETuHCKuu_nemyx 03.09.2020 10:13 # +2
defecate-plusplus 03.09.2020 10:57 # +3
gost 03.09.2020 16:31 # +2
HoBorogHuu_nemyx 03.09.2020 16:49 # +1
http://web.archive.org/web/20190730212526/zhurnal.lib.ru/d/deathwisher/deprivation.shtml
Из заметки: «Но, конечно, самое интересное это визуальные галлюцинации. В основном, из-за того, что ДС это всё-таки не медикаментозный наркотик, галлюцинации носят ассоциативный характер, в частности, это нарушение (вследствие истощения психико-физиолгических резервов организма) в поступающем по зрительному нерву сигналу, перверсия изображения, среди охотников именуемая "глазной горячкой" - когда глаз видит одно, но из-за нарушения в психике, посылает в мозг сигнал о другом объекте.
Мои личные закидоны:
гниющий труп на улице (брезентовый мешок и полиэтиленовые пакеты)
движущиеся люди в магазине (манекены, стоявшие неподвижно)
черви в лапше (просто лапша)
замахивающийся чем-то человек на периферии зрения (никого не было)
обращающиеся ко мне люди (никто не обращался в действительности)
моя разлагающаяся рука (тень неудачно упала)
то же самое с лицом
плавящаяся в руке авторучка (ничего не было)
кровь, растекшаяся по поверхности (кусок красной ткани)
какие-то смутные фигуры в толпе, среди знакомых (никого не было)».
bormand 03.09.2020 16:54 # 0
gost 03.09.2020 16:57 # 0
defecate-plusplus 03.09.2020 19:06 # 0
у меня был однажды недолго сотрудник, который за 3 месяца поехал
MAKAKA 03.09.2020 19:19 # 0
defecate-plusplus 03.09.2020 19:21 # 0
defecate-plusplus 03.09.2020 18:15 # 0
HoBorogHuu_nemyx 03.09.2020 18:20 # +1
Сиреневый сон.
Снится малине
Малиновый сон.
Рябине –—
Рябиновый снится...
И только колючке не спится:
Колючка боится,
Что сон ей приснится
Колючий-колючий,
Как спица.
defecate-plusplus 03.09.2020 18:21 # 0
держится за сук е2-е2
HoBorogHuu_nemyx 03.09.2020 18:24 # 0
И оркестр укрыт снегом,
Словно вата, глухим снегом,
И соната слышна e2-e2.
Только что это значит? Передумал ходить?
defecate-plusplus 03.09.2020 18:26 # 0
Desktop 03.09.2020 18:34 # 0
guest8 03.09.2020 11:21 # −999
CHayT 03.09.2020 17:37 # +2
Pig 21.09.2020 22:23 # +2
bormand 21.09.2020 22:25 # +1
gost 21.09.2020 22:30 # +2
bormand 21.09.2020 22:31 # 0
guest8 21.09.2020 22:39 # −999
bormand 21.09.2020 22:41 # 0
bootcamp_dropout 21.09.2020 22:43 # +3
CHayT 21.09.2020 22:50 # 0
bormand 21.09.2020 22:52 # +1
CHayT 21.09.2020 22:59 # +1
Sers 21.09.2020 23:01 # 0
defecate-plusplus 21.09.2020 23:13 # 0
Кстати в постгресе бесит недостаточный градус метуха. Хотя он там несомненно больше, чем в прости господи оракле.
Давно уже пора шаблонные таблицы уметь делать, живёшь как в каменном веке
DypHuu_niBEHb 21.09.2020 23:15 # 0
bormand 21.09.2020 23:17 # 0
DypHuu_niBEHb 21.09.2020 23:17 # 0
template table foo id(...)
table bar:foo
так?
сейчас в постгре есть наследование таблиц, но Д++ говорит, это харам
bormand 21.09.2020 23:18 # 0
DypHuu_niBEHb 21.09.2020 23:20 # 0
и вообще
мне таблицы джанга генерит
defecate-plusplus 21.09.2020 23:27 # 0
приведи реальный пример, где тебе оно пригодилось
сегодня вот, например, программист, ранее предварительно согласовав вариант с применением наследования в логической иерархии типов, поел говна, напомнив, что наследование это отрыжка (я вчера забыл про такой кейс, когда перечислял, почему наследование это харам)
DypHuu_niBEHb 21.09.2020 23:36 # 0
Я про ситуацию, когда у меня есть много похожих кусков в субд. Хотя по в идеале их нужно выносить в отдельные таблицы, и делать внешний ключ (этакое делегирование).
Ну вот наш вчерашний разговор про архивы постов: если у поста 10 полей, и есть архив, то было бы удобно использовать что-то, чтобы поля не писались два раза.
Другой вопрос, что у наследования есть побочные эффекты, которые (как я понял) перекрывают плюсы
bormand 21.09.2020 23:38 # 0
> выносить в отдельные таблицы
Джойн на ровном месте? Свалить не связанные друг с другом данные в одну таблицу (шапки постов и шапки комментов, лол)? Нахуй и в пизду. Это реально рак.
Наследование - это "является". Т.е. например "чайник" является "товаром". Вот тут, наверное, оно ещё как-то будет работать если ты породишь таблицу чайников от таблицы товаров. Но скорее всего проще какую-нибудь динамическую колонку добавить для таких свойств (json?)
guest8 21.09.2020 23:40 # −999
bootcamp_dropout 21.09.2020 23:41 # 0
DypHuu_niBEHb 21.09.2020 23:52 # 0
Desktop 21.09.2020 23:45 # 0
- малость общих свойств, многость разных
bormand 21.09.2020 23:50 # 0
А у чайника мощность и объём какие-нибудь в добавок.
Хотя хуйня это всё, конечно. Никто такие детали в структуру базы не тащит походу, задолбаешься таблицы править.
З.Ы. Пусть д++ рассудит.
DypHuu_niBEHb 21.09.2020 23:54 # 0
Да, я бы тоже наверное не стал добавлять отдельную колонку "вид подошвы", если мой магазин начал бы завтра продавать ботнки
defecate-plusplus 21.09.2020 23:56 # +2
DypHuu_niBEHb 21.09.2020 23:58 # 0
по счастью, удаляются товары редко
Потому что с ними и заказы удаляются, лол
defecate-plusplus 22.09.2020 00:04 # 0
DypHuu_niBEHb 22.09.2020 00:07 # 0
но да, без триггера никак не гарантировать, что ты не сможешь удалить доп информацию, оставив основную:(
А можно еще пойти дальше, и проверять триггером, что если у тебя тип товара (поле такое) равно "чайник", то у него обязана быть запись именно в чайнике.
Ну либо положить всё это на бекенд, но если не дай бог у тебя два разных продукта ходят в базу напрямую, то получается что никак кроме как через тригеры это не гарантировать.
Я еще видел базу, куда люди ходили исключительно через хранимые процедуры, и эти процедуры гарантировали консистентность, но это адский оверкил
defecate-plusplus 22.09.2020 00:13 # 0
но сначала ты инсертишь базовый товар, лишь вторым - чайник (он ведь ожидает существование товара)
даже если ты скильный питух и умеешь в insert в несколько таблиц в одном стейтменте (полагаю никакой орм это не может), без вчера обсужденных деферред этого не достичь
слишком сложно для простой задачи не обосраться на бекенде
DypHuu_niBEHb 22.09.2020 00:15 # 0
НУ вообще всегда лучше наверное поверх базы иметь бекенд, и пускать в него разные приложения через какойнить RPC, чтобы всю эту логику писать на человеческом языке
defecate-plusplus 21.09.2020 23:51 # +1
и именно вот тут постгрес тебе поднасрет, ведь в корзину ты хочешь положить что? товар? т.е. FK на "товар", даже если он "чайник", верно? бугога, обломись, в таблице "товар" нет id=13, хотя он и есть в таблице "чайники"
DypHuu_niBEHb 21.09.2020 23:57 # 0
teapots_info
вид_ручки: ..
item_id: FK to items
Вообще есть мнение, что реляционные СУБД плохо ложатся на ирерахии объектов)
DypHuu_niBEHb 21.09.2020 23:51 # 0
нормализация, чувак)
Джойны это конечно зло для перформанса, потому для отчетов используют денормализованные таблицы, которые генерят например раз в час по данным.
>Свалить не связанные друг с другом данные в одну таблицу (
см пример с архивом
defecate-plusplus 21.09.2020 23:48 # 0
для этого идеально, если бы таблица active и archive имели идентичный набор И порядок полей
тогда можно в триггере писать и течь
если в archive есть все поля, что в active, но их может быть больше, и/или порядок хуевый, тогда придется сначала поселектить колонки (с учетом порядка) из information_schema, получить строку вида "id,name,foo,bar" (это несложно), и исполнять уже динамический куери типа это уже не так красиво выглядит, но всё ещё можно жить
а если у тебя набор колонок или семантика уплыла в archive, то, скорее всего, тебе придется руками наебенить по-чесноку, а не писать универсальный триггер
но вообще завтра попробую в мичети с наследованием кое-что, посмотрю как будет влиять на порядок полей в дочке, если делать альтер для родительской таблы (думаю, чуда не будет и получится дефрагментация)
DypHuu_niBEHb 21.09.2020 23:52 # 0
>но вообще завтра попробую в мичети с наследованием
о, круто)
defecate-plusplus 22.09.2020 10:42 # 0
как и предполагалось, альтер общего родителя будет вмешиваться в порядок полей, и порядок полей будет зависеть от последовательности, где когда кто был создан (хз как оно должно было бы быть иначе, это ведь база, а не жсон)
Desktop 22.09.2020 15:26 # 0
defecate-plusplus 22.09.2020 15:47 # 0
это важно, если ты на это хотел бы опираться
но единственный надёжный способ этого добиться - делать иерархию партициями
это неплохо работает на проде, но не между несколькими инстансами
gost 22.09.2020 10:45 # +1
Аллах един!
guest8 21.09.2020 23:18 # −999
DypHuu_niBEHb 21.09.2020 23:20 # 0
guest8 21.09.2020 23:20 # −999
DypHuu_niBEHb 21.09.2020 23:21 # −1
bormand 21.09.2020 23:20 # 0
DypHuu_niBEHb 21.09.2020 23:37 # +1
https://regulation.gov.ru/projects#npa=108513
bormand 21.09.2020 23:48 # 0
DypHuu_niBEHb 21.09.2020 23:50 # 0
bormand 21.09.2020 23:55 # 0
DypHuu_niBEHb 21.09.2020 23:56 # 0
Ттогда ок
bormand 21.09.2020 23:57 # 0
З.Ы. Кстати, провайдер получается может просто стрипнуть эту запись (е сли не DNSSEC). И всё будет работать прекрасно. И товарищ майор доволен и юзеры.
Остаётся DNSSEC запретить.
DypHuu_niBEHb 22.09.2020 00:00 # 0
это разве не про то, что имя домена я шлю уже зашифрованным?
типа я с сервером сначала выработал тайный ключ (диффихельманом или там вывел его как-то иначе) и потом послал имя уже шифрованное в хеллоо?
bormand 22.09.2020 00:01 # +1
Поэтому они тупо привернули ебучий костыль с ключом сервера в DNS.
А самое забавное, что при этом DNS запросы и ответы все прекрасно видят. Т.е. вообще не понятно что скрыть то пытались в этом ESNI.
DypHuu_niBEHb 22.09.2020 00:02 # 0
потом шифрнуть им имя домена
потом послать его
потом получить серт
потом проверить его
ну и дальше поехало
bormand 22.09.2020 00:04 # +1
Именно поэтому SNI и был реализован плейнтекстом.
DypHuu_niBEHb 22.09.2020 00:08 # +1
а зачем мне такой пруф?
ну попижжу я с хакером, выработаю с ним приватный ключ, а откуда он серт возьмет?
напомни, как работает IKE в IPSec? Там разве не DH сначала, а потом уже аутентификация по серту?
bormand 22.09.2020 00:18 # 0
Потому что ты ссышь отправить имя домена открытым текстом! А без пруфа ты его отправишь прямо в лапы хакера, с которым согласовал ключ. А дальше он тебя тупо дропнет.
Ну т.е. твоя схема для защиты SNI не защищает от раскрытия SNI.
Ты думаешь чуваки реально от хорошей жизни попёрлись в DNS ключи добавлять?
DypHuu_niBEHb 22.09.2020 00:21 # +1
Если спуфать каждый мой запрос -- никаких цпу не хватит, пользователей же охулион. А читать плейнтекст легко
>Ты думаешь чуваки реально от хорошей жизни попёрлись в DNS ключи добавлять?
Я пытался понять, почему они не сделали через DH. Ну вот твой аргумент мне понятен: от спуфа это не спасет (а от снифа спасет)
bormand 22.09.2020 00:27 # 0
В гипотетической ситуации, когда ты вписал маппинг домена на айпишку себе в hosts (чтобы не делать DNS запрос), а на серваке тыща разных доменов крутится (т.е. по айпишке домен не узнать)?
Блин, я параноик но я реально не вижу никакой проблемы в открытом SNI.
DypHuu_niBEHb 22.09.2020 00:29 # +1
С ESNI ему сделать это будет трудно
А со SNI -- нет
bormand 22.09.2020 00:31 # 0
З.Ы. Уже проходили со всякими ЖЖ экстремистов, серваки целиком только так отлетали, тогда более тонкий бан по SNI ещё никто не умел.
DypHuu_niBEHb 22.09.2020 00:36 # 0
ну пускай он забанит мне ALB* в AWS, лол) Потом у людей будет jupyter.org не открываться
*это такой лоад балансер -- фронтэнд, где терминируется HTTPS, им управляет AWS, а дальше он идет на мою виртуалку по внутреннему IP уже плейнтекстом.
Причем AWS может поменять IP не ставя меня в известность, и DNS сам проапдрейтить
bormand 22.09.2020 00:38 # 0
З.Ы. А всякие восьмёрки просто забанить. Ибо нехуй.
DypHuu_niBEHb 22.09.2020 00:39 # 0
Если он его всегда по DNS делает, то да: проще фильтровать DNS.
Даже если у меня он 8.8.8.8, то он же плейнтекстовый
bormand 22.09.2020 00:20 # 0
Не помню, если честно.
DypHuu_niBEHb 22.09.2020 00:31 # 0
сначала DH и темпоральные ключи
А потом уже поверх auth
Но тут другое дело: ты не передаешь ему вообще никакой информации, кроме поддерживаемых шифров и желания подключиться
CHayT 22.09.2020 02:13 # 0
DypHuu_niBEHb 22.09.2020 02:19 # 0
А мутить как? А то вот некоторые языки позволяют мутить абстракции копи-пастом, и пусть бы лучше они умели метушню
bootcamp_dropout 22.09.2020 09:22 # 0
в других языках не так?