1.83K subscribers
3.24K photos
127 videos
15 files
3.52K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Forwarded from Panic! At the 0xC0D3 (Lev)
(📽 Камера дрожит, кусты шевелятся, кто-то осторожно пробирается вперёд)
— Тсс... Смотрите, вон он. Прямо перед нами — редчайший экземпляр. Вайбкодер маниграбер, решивший... завайбкодить библиотеку для терминального UI на Rust.
— Он не использует реактивность. Вообще. Никаких состояний, никаких подписок, ничего живого. Просто... текст. Выплюнутый один раз и навсегда. Как надпись на камне.
*пример рисует кнопку "Click me" и завершает выполнение, не дождавшись действия от юзера*
— Это всё. Он считает, что UI — это просто вывод текста. Кажется, для него “интерфейс” заканчивается после println!.
*перелистывает LICENSE*
— А вот и лицензия. Своя, уникальная. Если ты начнёшь зарабатывать деньги с проектом, использующим эту библиотеку... ты должен платить ему. Серьёзно.
— Мы были здесь. Мы это видели. Никто не поверит.

this post was generated with chatgpt due to it being fucking hilarious
🤡10😁3🎉1
Forwarded from эцсамое
💯261
#meme про работу
😁19🤝5👌1
Forwarded from Kedr to Earth | Земля, я Кедр ( Yuri Ammosov)
Интересный лайфхак. В MacOS при первом старте идет запуск экранов онбординга - языковые настройки, создание юзера и подключение в Apple ID. И только после этого можно попасть на рабочий стол. На ноутбуках это все протекает как само собой разумеющееся.

А вот в Mac Mini хитрая система предполагает, что у юзера есть Magic Mouse и Magic Keyboard (в таком порядке). Ютуб и Реддит с 2020 года примерно усеян видео, как выходить из положения, если вы вместо этих эргономических уродств нормальные устройства хотите использовать (особенно не дружит с Apple почему-то Logitech). В итоге общими усилиями выяснили: надо в момент старта держать BT-мышь в режиме пейринга, и она (почти всегда) подцепится. А с клавиатурой, если она не подцепится на следующем шагу, надо так: выбрать внизу экрана иконку человечка - откроются настройки "доступа для инвалидов". "Опорно-двигательный" (Motor Disability) откроет экранную клавиатуру, и вуаля, дело в шляпе.

В Apple к 2024 году эти инструкции прочли. Подумали. И что думаете, починили? В своем роде, да. Убрали "disability mode" В САМЫЙ КОНЕЦ настроек. Теперь экранную клавиатуру мышью не вызовешь, и двойным или тройным кликом по кнопке запуска - тоже. Нуачо, нефиг от апселла увиливать.

Так вот, лайфхак. ПРОВОДНАЯ КЛАВИАТУРА. Только тут надо иметь в виду, что все проводные клавиатуры до сих пор USB-A (большие лопатки), а на Маках все порты стали USB-C. Поэтому для такой надобности надо сразу иметь или переходничок USB-A > USB-C, или USB-хаб со входом USB-С. Последнее намного практичнее - и не болтается, и нужен будет потом едва ли не каждый день - флешку или еще что-нибудь воткнуть.

Да и в целом, иметь дома проводную клавиатуру до сих пор практично. На те редкие случаи, когда беспроводные интерфейсы мрут.
🤮23😭10😁4
Forwarded from Meme Trap (10satka)
Дамы и господа, я halfgot
🤣10😁3🤔1
Достижение выполнения кода при контроле над текстом комментария в Python-скрипте
https://www.opennet.ru/opennews/art.shtml?num=63669

Участники могли отправить сетевой запрос к Python-скрипту, который создавал новый Python-скрипт cо случайными именем, добавлял поступившие от пользователя данные в текст комментария, вырезав символы "\n" и "\r", и запускал этот скрипт командой "python3 имя.py". Контролируя только содержимое комментария, участник должен был извлечь строку из файла "/home/ctfuser/flag". Скрипт создавался следующим кодом:

   comment = input("> ").replace("\n", "").replace("\r", "")
code = f"""print("hello world!")
# This is a comment. Here's another:
# {comment}
print("Thanks for playing!")"""


Вместо "{comment}" подставлялись данные, поступившие от участника, и в итоге запускался следующий код:

   print("hello world!")
# This is a comment. Here's another:
# Данные, поступившие от участника соревнования
print("Thanks for playing!")


Успешно справившийся с заданием участник не стал искать новые уязвимости в парсере, которые бы позволили разбить строку на части, а воспользовался особенностью выполнения в Python файлов по типу их содержимого. Например, вместо исходного кода в файл с расширением ".py" можно поместить прокэшированный байткод, сохраняемый в файлах с расширением ".pyc", и подобный файл будет выполнен. В рассматриваемом конкурсе участник мог контролировать только содержимое в середине файла, поэтому не мог добавить свой заголовок для искажения MIME-типа.

Задачу удалось решить, воспользовавшись тем, что Python начиная с ветки 2.6 может исполнять содержимое ZIP-архивов для поставки Python-пакетов в сжатом виде. Как и в случае с кэшем байт-кода, наличие zip-архива определяется по содержимому, а не по расширению файла, т.е. в "
файл.py" можно поместить zip-архив, и при запуске командой "python файл.py" он будет обработан как сжатый Python-пакет. При этом ZIP-архивы в Python индексируются не по заголовку в начале файла, а по секции EOCD (End of Central Directory Record) в конце файла. При наличии в архиве файла "__main__.py" этот файл запускается автоматически при прямом запуске архива командой "python архив".

Больше подробностей в оригинале
Executing arbitrary Python code from a comment
https://www.hacktron.ai/blog/posts/python-zip-confusion/
👏3
Технологический Болт Генона
Достижение выполнения кода при контроле над текстом комментария в Python-скрипте https://www.opennet.ru/opennews/art.shtml?num=63669 Участники могли отправить сетевой запрос к Python-скрипту, который создавал новый Python-скрипт cо случайными именем, добавлял…
#prog #itsec #python

В конце мне не нравится, что автор поёт дифирамбы ИИ. Ну и ещё у него есть функция ascii_safe, которая написана просто ужасно:

def ascii_safe(x: int) -> bool:
"""True if all four bytes have high bit clear."""
return all(((x >> (8 * i)) & 0x80) == 0 for i in range(4))

Это явно можно написать одновременно эффективнее и проще для восприятия:

def ascii_safe(x: int) -> bool
return x & 0x80808080 == 0
💯13🤡5
Короче, мне только что позвонили мошенники. Ничего удивительного так-то, мне и Kaspersky WhoCalls подсказал, что звонит кто-то подозрительный (минутка рекламы), и тему сразу подняли известную уже (про замену полиса ОМС), но суть не в этом.

Мне звонил парень. И он настолько заработался, что представился Анастасией.
Когда я решил уточнить у Настеньки, а не ошиблась ли он(а), он(а) слегка смешалась и дальше диалог уже не склеился 🌚
😁23🤡2🥴2
Forwarded from Сова пишет…
Жиза Армении
20👍5😭3🌚2😁1💯1
Forwarded from Om TV
Ну в принципе, чему тут удивляться? Если во главе страны кретины, ментально застрявшие в средневековье, то всё идет по плану!
💩10🤡54🤮2😁1🤯1
#prog #meme про документацию

Простите 🥲, жиза в глаз попала

(thanks @rustamemes)
👍10😁54😭4
Блог*
#prog #article #amazingopensource Jujutsu (jj) — система контроля версий, которая концептуально проще git и при этом мощнее. Неплохой (но местами устаревший) обзор Jujutsu — jj init — сделал Chris Krycho. Также есть пока что неполный туториал от Стива Клабника…
#prog

Чел делится впечатлениями от jj.

jj крута
Посидел я на jj где-то месяц, и... это офигенно.

Т.е. у меня по большей части не обычный "гит воркфлоу", где делаешь фичу, мержишь, делаешь новую, а эдакий стейт "тещу 20 фичей какая заработает"
И jj для этого идеален

t.me/paniccode/45
👍7🤡6💯32🔥1
Forwarded from Panic! At the 0xC0D3 (Lev)
Я не могу этим не поделиться
Недавно я делал внутреннюю тулзу, для которой хотелось запускать питон код
Я решил попробовать сделать это не с помощью процессов, а запускать питон прям в этом же процессе (язык для скриптов же все дела) (плюс можно было шерить память за очень быстро)
Для раста есть прекрасная либа под названием pyo3 (а еще там же есть биндинги numpy)

И мне надо было сделать datetime numpy array (массив дат)
Ну я и пишу какой-то код аля
PyArray1::<PyDateTime>::from_iter(dates...);
И что бы вы думали

1. Компилятор(!) знал и понял, что PyDateTime нельзя пихать в numpy array
2. Но он не только сказал, что нельзя, но написал мне ошибку со скрина

А именно, он мне сказал:
"PyDateTime" нельзя сувать в numpy array, но есть несколько других типов, которые можно, например numpy::DateTime

Оказывается, что у нампая свой тип дат (что логично, вместо всей структуры с полями типа year, month, day и т.д., там просто хранится timestamp)
И если я хочу быстро, то мне нужно использовать его.

И УЗНАЛ Я ОБ ЭТОМ НЕ ИЗ РАНТАЙМ ОШИБКИ, НЕ ИЗ ГУГЛА, А ОТ КОМПИЛЯТОРА
АААААААА

К слову, часто раст рекламируют как "memory safety", но на самом деле его система типов позволяет делать намного больше, как, например, тут, правильно описывать апи вообще другого языка.
Помимо этого, мой экспириенс с питоном в расте был мега приятный. Я не знал, можно ли в структурах, которые будут экспортироваться в питон, использовать обычные типы из раста (условно, нужно ли использовать PyString, или можно String), и вместо того, чтобы гуглить, безопасно ли это, можно ли так, я просто писал такой код, и он компилировался, и я был уверен, что так можно (и да, все ок)
И такого рода вещей было очень много. Я глядел совсем чутка на то, как это делается в плюсах, и понял, что там просто UB на UB (C api все таки), и был в шоке, наскольно приятно это делается тут.

В общем, это довольно хороший пример большой библиотеки с кучей сложных вещей, которая при этом позволяет добиваться того самого волшебного момента "компилируется - значит работает"
👍22🔥81
Блог*
#prog #rust #menacingopensource github.com/Speykious/cve-rs
@paniccode подсказывает, что там прекрасная лицензия:

You just DO WHATEVER THE FUCK YOU WANT TO as long as you NEVER LEAVE
A FUCKING TRACE TO TRACK THE AUTHOR of the original product to blame for
or held responsible.
9
😁342🤡2😢1🌚1
#math #game

В сфере настольных ролевых игр наиболее известной и популярной игрой, безусловно, является Dungeons & Dragons пятой редакции. Сказать, кто стоит на втором месте, проблематично, но, по разным оценкам, следующей по популярности игрой в этой нише является Pathfinder второй редакции. Это — разные игры, но общего у них довольно много (что неудивительно, учитывая, что обе игры прослеживают свою родословную от D&D 3.5).

Одна из этих общих частей — пошаговые бои, в рамках которого участники действуют каждый в свою очередь в пределах установленного в начале боя порядке. Ещё одним общим моментом является использование хитов/очков жизни (hit points) для отслеживания физического благосостояния живых существ, включая персонажей под управлением игроков. Существа в обеих системах обычно умирают, когда число хитов опускается до нуля, но это не касается персонажей игроков. Вместо этого они валяются в бессознательном состоянии и каждый ход делают проверки, по итогам которых персонаж может стабилизироваться, то есть остаться без сознания, но без угрозы для жизни. Детали этих проверок уже разнятся между этими двумя играми, но они схожи тем, что характеристики персонажей на эти проверки не влияют, а также тем, что при получении хитов персонажи автоматически перестают умирать.

В D&D 5e правила следующие:
- Когда персонаж впервые падает без сознания (= опускается до 0 хитов), он начинает умирать и отслеживать провалы и успехи спасбросков от смерти. Поначалу число и тех, и тех равно нулю.
- В начале каждого хода, когда персонаж умирает, он делает спасбросок от смерти. Это означает, что игрок кидает куб кость d20 (икосаэдр, с 20 гранями) и сравнивает выпавшее число с 10. Если число равно или больше 10, то персонаж получает один успех. Если число меньше 10, то персонаж получает один провал.
- Если персонаж получает три успеха спасброска смерти, он стабилизируется, перестаёт умирать и больше не делает спасброски от смерти. Если он получает три провала, то умирает окончательно.
- 1 и 20 на кости имеют особое значение. Значение 20 означает, что персонаж получает 1 хит (= перестаёт умирать), приходит в сознание и может действовать на этом ходу. Значение 1 означает, что персонаж получает два провала вместо обычного одного.

Прежде чем объяснить правила в Pathfinder 2e, нужно сначала объяснить, как там делаются проверки. И в DnD, и в PF для этого кидается кость d20, прибавляются уместные модификаторы и результат сравнивается с заранее заданным целевым порогом, численно характеризующим сложность задачи. Значение равно или больше порогу — успех, меньше — провал. PF2 отличается тем, что проверка также может окончиться критическим успехом и критическим провалом. Критический успех получается, если число на кубе после модификаторов превосходит порог на 10 или более. Аналогично критический провал получается, когда результат на 10 или более меньше порога. Числа 20 и 1 имеют особый эффект: 20 увеличивает степень успеха на одну, а 1 степень успеха на одну уменьшает (на практике для типичных задач, когда сложность не является очень высокой или очень низкой, это означает, что 20 на кубе является критическим успехом и 1 критическим провалом).

В Pathfinder 2e правила следующие:
- Когда число хитов персонажа опускается до нуля, он начинает умирать и получает состояние dying 1 (обычно, при некоторых обстоятельствах это значение может быть выше).
- В начале каждого хода, когда персонаж умирает, игрок делает recovery check. Для этого игрок кидает кость d20 и сравнивает значение с порогом, равным 10 + текущее значение dying. Успех уменьшает значение dying на 1, провал увеличивает значение dying на 1. Критические успех и провал меняют значение на 2 в ту же сторону.
- Когда значение dying увеличивается до dying 4 или выше, персонаж умирает насовсем. Если значение dying уменьшается до dying 0 или меньше, персонаж теряет состояние dying и стабилизируется.
2
Не смотря на различия в правилах двух систем, их объединяет тот факт, что степень умирания персонажа можно охарактеризовать дискретным состоянием, и переходы между этими состояниями проходят пошагово, вероятностно и независимо от всех предыдущих переходов. Иными словами, процесс умирания в обеих системах можно описать простой цепью Маркова! Так как мне влом самому писать нужные программы, я взял первый попавшийся в гугле калькулятор и описал все матрицы перехода.

Одной из претензий к D&D пятой редакции является тот факт, что персонажи обладают сверхчеловеческими способносятями. В частности, персонажей в игре очень сложно убить в бою, что приводит к снижению напряжения и потере правдоподобия. Персонажи в Pathfinder второй редакции также, вообще говоря, обладают сверхчеловеческими способностями, но бой в Pathfinder предположительно несёт более высокий риск смерти для персонажей. Справедливо ли считать Pathfinder 2e более смертельным, чем DnD 5e? Давайте посмотрим на результаты анализа и узнаем!
👏1
Сначала рассмотрим, как это выглядит в D&D. По очевидным причинам процесс умирания не может продолжаться больше пяти раундов, поэтому распределение вероятностей после пятого шага совпадает со стабильным распределением. В типичных играх персонажи действуют не поодиночке, а в составе так называемой партии, и от игроков ожидается, что их персонажи будут стабилизировать тех персонажей партии, кто упал без сознания. Каждый ход, когда помощь не оказана, грозит всё большим шансом смерти персонажа.

В D&D умирающий персонаж не может умереть за один ход (если ему не наносят урон, конечно же). При отсутствии попыток стабилизации (или неудачных попытках) умирающий персонаж умирает на второй ход с вероятностью 4,25% и на третий ход с вероятностью 15,7%.

С другой стороны, у персонажа есть шансы оперативно вернуться в строй: даже на первый и второй ход персонаж может не просто стабилизироваться, а прийти в сознание с вероятностями 5% и 9,75% соответственно.