СЛЕГ! <Z> ️
524 subscribers
678 photos
20 videos
12 files
307 links
Здесь создают авторских телеграм-ботов. Когда не справляются конструкторы и веб-студии - есть СЛЕГ.

Статистика ботов:
https://ssleg.tech/bots_view.html

Написать автору: @yesitsnew

TW: ещё тут политота, утечки баз и игры в товарища майора на минималках
加入频道
На днях утомился от питона и слегка восстановил навыки C++, который я лет 15 не трогал, как и программирование в целом.

Получилась простенькая черепо пиписькомерка для процессоров. Перемножение двух массивов рандомных чисел в памяти и складывание результата в третий. Эдакий линпак для ленивых.

В итоге оказалось, что моя VPSка за 250 рублей это две трети мощи моего домашнего core i7 4771, что очень неплохо.

P. S. Естественно это одноядерный режим, то есть измерялась производительность одного ядра процессора.
И чтобы два раза не вставать. Почему питон - отстой для вычислительных задач? Потому что ровно в сто раз медленнее любого нормального языка.

Эту программу я писал в феврале, когда только начал учить 🐍. В результате я сначала офигел, потом научил питошу многопроцессорности (да, питон умеет в многопоточные приложения, в интернете херня написана неграмотная, читайте доки и будет вам тру многопроцессорность без GIL) и выжал на четырёх ядрах аж 22 МФлопа. 😅

Комп тот же, что и в предыдущем посте слева.

У питона есть только одно преимущество - сверхпростота для освоения самым неискушенным человеком. Все остальное - недостатки, вытекающие из этого достоинства.
Попросили порекомендовать канал начинающего питониста, пока совсем меленький:
@pythoninmyheart

Пожелаем человеку творческих узбеков и освоения этой развесёлой профессии. Идущий осилит дорогу.
Я лично подписался.
А вы знали, что список недействительных паспортов от МВД сам полон мусорных записей (10 095 штук) типа тех, что на картинке? Теперь живите с этим. 😂

А самое интересное, что в этом списке 128 миллионов строк. Поскольку гипотеза, что каждый взрослый россиянин потерял по одному паспорту, кажется несколько натянутой, можно предположить, что это паспорта 20/45лет, утерянные и умерших.

Так же забавно, что МВД официально не считает только серию и номер паспорта персональными данными, о чем открыто пишет: «Список также размещен на сайте МВД России в формате открытых данных, является обезличенным и не нарушает действующее законодательство в области персональных данных.»
С четверга пошла по инету БД избирателей Москвы и Новгорода (зарегистрированных для электронного голосования). Серия, номер паспорта и флаг факта голосования. Исходно паспорта были хэшированы, но прямая атака перебором всего-то 10 миллиардов вариантов напрашивалась сама собой. В итоге все паспорта успешно восстановлены за 7 часов. Даже не привлекая многопоточность, ибо лень. Единственное, что пришлось сделать, реализовать бинарное дерево, чтобы перебор не увяз в сравнении каждого сгенерированного хэша с миллионом нужных.

Исходники программы на C++ и уже нормальную базу смотрите ниже.

Поля в базе: серия, номер, голосовал да/нет, признак дублированной записи в оригинальной базе, признак недействительного паспорта по базе МВД. Формат sqlite.
vote_hash.zip
4.7 KB
Программа для перебора паспортов. Исходные хэши из текстового файла, вывод в csv
vote_passport.zip
12.3 MB
База данных электронного голосования по конституции с расшифрованными паспортами. Не является перс. данными, см. выше. 😜
Теперь немного цифр о том, что происходило на выборах.

Дублированные записи: 97 штук, каждая из них дублирована 1 раз, сразу, в следующей строке. У всех инвертирован флаг голосования, т.е. если сначала был 0, то в дубле 1 и наоборот. Соответственно в базу они мной внесены один раз, с флагом по второй записи и флагом doubled=1. Всего 69 из 97 имели возможность проголосовать второй раз, потому что у них инверсия 1->0.

Недействительные паспорта, самое интересное: Всего 6 048 штук (0,5% общего числа), проголосовало 5 437 (89.9%, при общей явке голосовавших 93%). Доля недействительных, по регионам выпуска, колеблется от 0,18% (2 на 1095, 14 регион, 5 на 2707, 39 регион) до 0,91% (11 на 1203, 4 регион), среднее 0,56%. Москва - 4817 на 921101, 0.52%, МО - 256 на 47458, 0.54%, Новгород - 444 на 135721, 0.33%.

То есть и поведение и распределение недействительных паспортов соответсвует обычным, что позволяет выдвинуть гипотезу, что целенаправленного вброса не было и мы имеем дело с просроченными паспортами 20/45. Да и кому нужен вброс размером в 0,5%.🥴

Проголосовавших с валидными паспортами (по регионам выпуска бланков паспорта) :
Нижегородская область - 124 598.
Москва - 854 809.
МО - 43 890.
В сумме эта тройка дает 92.85% от всего проголосовавших (1 102 094 человек).

Забавно, что эта цифра на 11 883 человека больше, чем насчитал ЦИК. Видимо какая-то борьба с голосующими электронно и на участке одновременно была проведена при подведении итогов.
Ещё мне подсказали посмотреть по годам изготовления бланков (вторые две цифры серии). И нашлась ещё одна аномалия. 89 паспортов, с годами от 21 до 96. Причём пик её на 45 году - 22 паспорта.

Что не помешало 67 из 89 "успешно" проголосовать. 😅

То есть к госуслугам есть все же вопросы. При каких-то редких (на фоне миллиона регистраций) условиях они допускают явные опечатки к голосованию.

Опечатки, потому что пик на 45 очень характерен, 45 в первых двух цифрах серии это код Москвы, то есть наиболее часто вводимая серия.

Все 89 паспортов не имеют признака invalid, что очевидно, у МВД свои опечатки, другие :)

P. S. Неверную расшифровку хэша я сразу отметаю, потому что ни один из хэшей не имел двух решений, это контролировалось в процессе. И сама по себе неверная расшифровка имеет микроскопическую вероятность, количество вариантов хэша алгоритма sha256 - 1.16x10^77. 😉
Как раскрутить свой чатик, рассказывает нам канал МДК. Более шести тысяч человек за сутки зашли в чат, чтобы поучаствовать в розыгрыше PlayStation 5. 😂

Таким образом, чуваки обогнали Соловьева (16 673 VS 14 876 рыл) и стали крупнейшим чатиком политотной телеги.

P. S. известным узким местом запроса client.iter_participants является выдача не более 10к участников больших чатов, это ограничение телеграм. Но огорчаться не стоит, потому что выдача идёт по нарастанию времени последней активности. То есть от свежих к старым. И хотя запрос вернул 9997 юзеров, все свежие в него, как видите, попали.
Тут у makecloud.ru обновились тарифы до уровня "халява". Кто примеривался к своей vps хватайте, не пожалеете.

Я уже писал про этот домик для моих ботов.

По состоянию на сейчас - идут 32 сутки с момента переезда туда. Сбоев не было. Простой - 22 секунды на 1 перезагрузку сервера по моей инициативе (обновление убунту).
Тем временем, база тг-политоты доросла до 400 тысяч людей.

Ради интереса, сопоставил её с базой телефонов. Определилось 93 410 штук. 23%

То есть, по каждому четвёртому человеку в политчатиках, можно опеределить как минимум регион по номеру телефона, как максимум реальное имя и соцсети.

Напомню, проверить есть ли вы там, вы можете здесь, спросив Фому :)
Алгоритмы сравнения больших данных могут быть разными. Хорошо, когда все влезает в оперативную память, тогда можно загрузить все в один словарь и по нему пробежать. Это алгоритм раз (слева)

Второй (справа) немного сложнее, но в десятки раз экономнее. Юзерайди в телеграм это целое число в диапазоне от 0 до 1,4 млрд. Соответственно диапазон разбивается на 1400 кусочков по миллиону возможных айди в каждом и сравнивается частями. 1400 запросов к бд, загрузка словаря, сравнение, очистка.

В результате имеем.
Курсор 1 - 400к строк
Курсор 2 - 12М строк
Алгоритм 1 - 2Гб оперативки, 38 секунд.
Алгоритм 2 - 54Мб оперативки, 1 минута, 52 секунды.
Минутка плохих и очень плохих алгоритмов.

Спрашивает приятель:
- глянул твой канал, зачем тебе словари, если можно списки использовать или numpy? (речь идет о задаче сопоставления баз юзеров политоты и телефонов)

Ок, используем списки (сверху, алгоритм 1):
принадлежность проверяем через row[0] in list
1.6Гб памяти, обрабатывает 500 записей за 39 секунд, то есть работа будет сделана всего за 8.7 часа.

Списки (внизу слева, алгоритм 2):
те же списки, принадлежность проверяем через list.count(row[0]). Еще хуже, 500 записей за 56 секунд. Вся задача - 12.5 часов (потому что count всегда пробегает весь list, в отличии от in)

Numpy (внизу справа, алгоритм 3):
640Мб памяти, 10 000 записей за 53 сек. Общее время - 35 минут. Хахалити. 😂

Словари начинают и выигрывают в питоне везде, где больше 1000 элементов. Напомню, что словари решали задачу за 38 секунд. Потому что они не то, чем кажутся. Внутри у них хэши и небинарные люди бинарные деревья.