Что делать – Telegram
Что делать
94 subscribers
207 photos
3 videos
4 files
126 links
Не смешно
Download Telegram
Та ебать
Вот у меня сущность приложения (indigo.App) довольно тупая, и принимает роутер только когда жмакают app.Serve(). Поэтому, на сколько портов индигу не вешай, роутер будет один и тот же использоваться. Из-за этого и появился virtual.Router, который берёт запрос, и перенаправляет его в соответствующий роутер. Но мне вот какая мысль пришла: это ведь можно и более элегантно реализовать!

Вот я навешиваю аппу на разные порты через App.Bind(addr). Я могу сюда же роутер и прокидывать! Всё равно на каждом порту свой листенер (каждый в своей горутине), тогда ещё и косты на виртуальный роутинг сводятся к нулю (сейчас там перебор массива на каждый запрос, в надежде, что доменов будет немного - если меньше 7, тогда норм). Но и прокидывать в прям каждый App.Bind() роутер отдельно не хочется (например, аргумент пришлось бы дублировать в ситуациях, когда я хочу навесить аппу на хттп и хттпс). Есть вариант - если в бинде не указан роутер, будет использован роутер, указанный в предыдущем бинде. Либо дефолтный (который будет передаваться так, как передается и сейчас - через App.Serve(r)). Сохраняется обратная совместимость, но общий Developer Experience ухудшается - какая-то магия, везде вариадики.

Но, сука, фича-то сладкая, так и манит гадина. Я сейчас и так тот единственный переданный роутер в аппу передаю каждому листенеру по отдельности, а листенер у меня - замыкание, поэтому, возможно, можно будет добавить какую-нибудь заглушку а-ля App.Bind(":8081", Virtual(TCP, r2)), где r2 - это роутер для какого-нибудь другого домена от переданного в последующий App.Serve(r). Не без дизайнерских проблем, но и с TLS тоже зафурыкает.

Но меня всё равно не покидает чувство, словно это можно разрешить более элегантным способом.
🌭3
Что делать
Вот у меня сущность приложения (indigo.App) довольно тупая, и принимает роутер только когда жмакают app.Serve(). Поэтому, на сколько портов индигу не вешай, роутер будет один и тот же использоваться. Из-за этого и появился virtual.Router, который берёт запрос…
За хотдоги спасибо, но у меня тут забавная ситуация. Я начал тыкать напрямую net.ListenTCP, чтобы иметь не-виртуальный метод SetDeadline() на листенере. Нюанс в том, что конструктор принимает *net.TCPAddr, который сначала надо ещё получить. Получаешь через net.ResolveTCPAddr(). А в него нельзя засунуть 0.0.0.0 - заглушка, которая слушает на всех интерфейсах - в отличии от net.Listen. Там, почему-то, всё работает нормально. И я всё никак вдуплить не могу, где именно здесь происходит эта магия
А, нет, я дегенерат. Я блять адрес передавал в ListenTCP() вместо network. А должен был литерал "tcp". Ну теперь-то ебать работает
На каждую операцию чтения либо записи в сокет, я указываю дедлайн - таймаут, после которого операция зафейлится. При чтении я, например, таким образом могу отсекать idle подключения. Там нужно указывать абсолютное значение: ну, то есть, вот это вот time.Now().Add(90*time.Second). И я заметил, что это как-то... Дороговато! 50нс, если быть точным. Дорого, потому что я обычно в 500-600нс суммарно укладываюсь, вместе с парсингом, обработкой и формированием ответа

Не то, чтобы это особо интересно было, просто довольно занятный кейс. Я это дело оптимизировал посредством atomic.Int64, в который кладу раз в 500мс текущее время из отдельной горутины. 55нс превратились в 5.6нс. Нраица!
🔥2👏1
Forwarded from ⚠️Invalid Handle (kᴄ (ᴄarbonated))
this is REAL Unicode emoji proposal done by REAL people
3 лучших контрибьютора в индиго
💯7
Да это же литералли ми
https://zero.sci-hub.se/5268/7dda7cee52d7eb3ec606a82d0f1b9a61/giertsen1988.pdf

Забавная ситуация с мгновенной декомпрессией 9 атмосфер. А вот фото человека, в следствии поместившегося в зазор 12.7см, уже не такое забавное
🔥11
Что делать
https://zero.sci-hub.se/5268/7dda7cee52d7eb3ec606a82d0f1b9a61/giertsen1988.pdf Забавная ситуация с мгновенной декомпрессией 9 атмосфер. А вот фото человека, в следствии поместившегося в зазор 12.7см, уже не такое забавное
У двоих, которые спали в соседней камере, в мгновение вскипела кровь и мозги. Интересно, можно ли это записать в тихую смерть во сне?
🔥3
Вот, кстати, один из двух человек, которые стояли снаружи. Второго фотографировать не стали, помер ведь
🌚2
Pentium 1993 года, 3.1млн транзисторов. Над непосредственно кремнием 3 слоя проводок и соединений
👍2🤔1
concurrency-primer.pdf
1.3 MB
What every systems programmer should know about concurrency
👍2🔥1
Нашёл тут интересный пост про RSA. Сам нихуя не понял, но выглядит интересно. Автор - @ruheight

Первого марта Клаус Шнорр (ему мы обязаны цифровыми подписями) наделал шороху, загрузив препринт "Быстрая факторизация чисел алгоритмами SVP". В первой версии статьи есть приписка "это уничтожае криптосистему RSA". Именно "уничтожае", и я полагаю, что фраза "this destroyes RSA" станет мемом. Мне всегда нравился фильм "Sneakers", но так как RSA (пока) ничего не угрожает, то поговорим о факторизации и линейной алгебре.

Уже триста лет назад Ферма обратил внимание на то, что если представить составное число в виде разности квадратов, то его можно разложить на множители. n = a^2 - b^2 = (a + b) * (a - b). Например, 8051 = 8100 - 49 = 90^2 - 7^2 = (90 + 7) * (90 - 7) = 97 * 83. Поэтому числа p и q в модуле RSA не должны быть близко друг к другу. Для произведения двух простых 1024-битных чисел, разность которых 2^514, алгоритм Ферма находит множители за три шага. И это далеко не единственный способ закосячить RSA.

Затем, всего-то через пару сотен лет, Крайчик предложил новое условие u^2 ≡ v^2 (mod n), и u ≢ ±v (mod n). Дальше примеры из отличной статьи Померанца "A tale of thow sieves" http://www.ams.org/notices/199612/pomerance.pdf Для числа 2041 начинаем с √n и считаем q(x) = x^2 - n, если x = 46, 47, 48, ..., то q(x) = 75, 168, 263, ... Пока никакими квадратами и не пахнет.

Но если перемножить 46 * 47 * 49 * 51 и 75 * 168 * 360 * 560, то их квадраты (по модулю 2041) равны. 311^2 (mod 2041) = 1416^2 (mod 2041) = 794, и 311 != 1416, условие Крайчика соблюдено. Находим множитель, GCD(1416 - 311, 2041) = 13, и 2041 = 13 * 157. Осталось понять что на что умножать.

У квадрата любого числа показатели степеней простых множителей четные. (a * b * c ...)^2 = a^2 * b ^2 * c^2 ... 10 = 2^1 * 5^1. 10^2 = 2^1 * 2^1 * 5^1 * 5^1 = 2^2 * 5^2. Это сложный способ сказать, что десять в квадрате, то же, что и дважды два, дважды умноженное на пять. Слово "дважды" появляется перед каждым умножением.

Некоторые из чисел (x^2 - n) состоят только из небольших множителей. 75 = 3 * 5^2, 360 = 2^3 * 3^2 * 5, если число не содержит множителей больших, чем B, то такие числа называют B-гладкими. В числах 75, 168, 360 и 560 нет множителей больше 7, они гладкие. Погладьте их.

Можно записать степени в виде вектора 75 = 2^0 * 3^1 * 5^2 * 7^0. v(75) = (0, 1, 2, 0), v(168) = (3, 1, 0, 1). Так как нас интересует только четность, то степени можно записать по модулю 2: v(75) = (0, 1, 0, 0) mod 2; v(168) = (1, 1, 0, 1) mod 2, так как числа у нас B-гладкие, и операции по модулю два, то получившаяся хрень - векторное пространство размерности B над полем F_2.

(Я отчетливо слвшу, как некоторые из вас горестно вздыхают на словах "векторное пространство", но в том, чтобы записать единички и нолики через запятую, ничего сложного нет)

Для того, чтобы найти нужные числа, нужно подобрать вектора, которые в сумме (по модулю два) дают (0, 0, 0, 0). Если записать вектора (0,1,0,0),(1,1,0,1),(1,0,1,0),(0,0,1,1) один под другим и сложить столбцы, то получится нулевой вектор. В QS и GNFS, есть еще много тонкостей и хитростей, но речь не о них.

В этом месте Шнорр пришел к логичному выводу, что если что-то выглядит как вектор, то можно попробовать применить алгоритмы относящиееся к векторам. А именно CVP и SVP (поиск ближайшего и кратчайшего вектора в решетке), чтобы ускорить процесс поиска. А точнее приблизительных решений, потому что обе сучки в NP-hard (факторизация NP-intermediate). Потому их, кстати, и используют в пост-квантовой криптографии.

Умные дядьки, которые занимаются решетками порылись в статье Шнорра, и из неё отнюдь не очевидно, что таким способом вобще можно что-то найти. Так же там есть ошибка в оценке сложности, то есть даже, если таким способом можно что-то найти, то совсем не факт, что быстрее, чем уже существующие методы. Речь идёт о решетках ебанистических размерностей. https://github.com/lducas/SchnorrGate
Так что ваши p и q спрятанные в "зеленных замочках" сайтов, роботах-пылесосах и мобильниках могут спать спокойно.
👍2😁1
Бензофурран Нейроцикл
http://www.stargrave.org/Harmful.html
чому клоунов наставили.
🍌2🌭1🗿1
Немного контента о том, что происходит до того как выполнится ваш код в main. Рассматриваются как бинарники и запуск с линукса, так и embedded системы (аля esp32)

- How Programs Get Run
- How Programs Get Run: ELF Binaries
- Linux x86 Program Start Up or – How the heck do we get to main()?


- A General Overview of What Happens Before main() (тут целая серия статей)
- From Zero to main(): Bare metal C
🥰2🤩1