Еще одно что рассказывали аппл это как они хотят сделать Swift языком под все платформы и поэтому расширяется поддержка линуксов (и вообще сделали LSP чтобы в вскод/вим интегрироваться). И даже завезли кросскомпиляцию статичных бинарей под них (раньше оно было только между аппловых платформ).
Собственно тут товарищ поэкспериментировал со своим небольшим плагином на свифте и как его собрать, чтобы запускать на алпайне (к слову аппл взяли musl для такой статичной сборки, правда сам компилятор еще на алпайне не запускается) и поделился и результатами, и скриптами которые пригодятся если захочется что-то еще подобным образом собрать
https://mko.re/blog/swift-alpine-packaging/
Собственно тут товарищ поэкспериментировал со своим небольшим плагином на свифте и как его собрать, чтобы запускать на алпайне (к слову аппл взяли musl для такой статичной сборки, правда сам компилятор еще на алпайне не запускается) и поделился и результатами, и скриптами которые пригодятся если захочется что-то еще подобным образом собрать
https://mko.re/blog/swift-alpine-packaging/
mko.re
Packaging Swift apps for Alpine Linux
👍9🔥3
Тут товарищ обнаружил что в новой visionOS проц иногда очень агрессивно тротлится и причина в демоне userexperienced, который ограничивает скорость кулеров в зависимости от уровня окружающего шума. Ну т.е. в шумном самолете он будет крутить как может, а вот в тихой комнате затротлится так что даже на глаз заметно. Идея то хорошая, еще бы доработать так, чтобы вот настолько сильно не ограничивало, ибо лучше потерпеть немного шума
К слову уже не первый раз аппл делает такие маневры с кулерами, раньше макбуки с интелом на несколько секунд выключали кулеры в момент активации сири, чтобы записать звук без лишних помех
https://x.com/ShinyQuagsire/status/1804688365905756564
К слову уже не первый раз аппл делает такие маневры с кулерами, раньше макбуки с интелом на несколько секунд выключали кулеры в момент активации сири, чтобы записать звук без лишних помех
https://x.com/ShinyQuagsire/status/1804688365905756564
😁7🔥1
Любители поработать из Тайланда с нестабильным интернетом, конечно, слышали и используют штуки типа tmux/mosh. Но оба этих варианта обрабатывают выхлоп на серверной стороне и отдают уже готовый view на клиент, из-за чего ни локально в своем iterm не поискать, ни копипаста привычно не работает. Да и вообще тащить полноценный мультиплексер чисто ради session persistence кажется избыточно
Собственно тут кто-то сделал тулзу shpool (конечно же на расте) которая делает исключительно это, не переизобретает сетевую часть (в отличие от mosh) и просто прокидывает все туда-сюда (из-за чего для айтерма это ничем не отличается от классического ssh), да и в использовании прост как железная дорога (одна основная команда которую можно запихать в RemoteCommand своего конфига)
https://github.com/shell-pool/shpool
Собственно тут кто-то сделал тулзу shpool (конечно же на расте) которая делает исключительно это, не переизобретает сетевую часть (в отличие от mosh) и просто прокидывает все туда-сюда (из-за чего для айтерма это ничем не отличается от классического ssh), да и в использовании прост как железная дорога (одна основная команда которую можно запихать в RemoteCommand своего конфига)
https://github.com/shell-pool/shpool
GitHub
GitHub - shell-pool/shpool: Think tmux, then aim... lower
Think tmux, then aim... lower. Contribute to shell-pool/shpool development by creating an account on GitHub.
👍9🔥7
Тут в питонячем клубе решили немного пошатать устои и поменять формат версионирования. Потому что все равно семвера уже нет — 3 на 4 никогда не поменяют, а в минорной версии не стесняются депрекейтить и удалять старое. Да и учитывая текущий график релизов удобно будет прибить версию к году, т.е. вместо 3.15 будет 3.26. И бонусом проще считать когда версия будет EOL — 26 + 5 = [20]31
А почему это предлагается сделать с 26 года? Ну потому что релиз с мемным номером 3.14 таки надо сделать в 25 году, а потом уже можно менять
https://peps.python.org/pep-2026/
https://discuss.python.org/t/pep-2026-calendar-versioning-for-python/55782
А почему это предлагается сделать с 26 года? Ну потому что релиз с мемным номером 3.14 таки надо сделать в 25 году, а потом уже можно менять
https://peps.python.org/pep-2026/
https://discuss.python.org/t/pep-2026-calendar-versioning-for-python/55782
Python Enhancement Proposals (PEPs)
PEP 2026 – Calendar versioning for Python | peps.python.org
This PEP proposes updating the versioning scheme for Python to include the calendar year.
👍18😁5🌚2
Тут недавно в твитторах запостили вот такой скриншот сишного кода, и типа смотрите, в switch case необязательно использовать break в каждом case (примерно все кто писал на си хоть раз совершали ошибку забыв его). Собственно небольшая статья которая рассказывает почему это валидный код и как это работает. Ну и бонусом как еще сделать такое-же, но вообще без switch, а только с case и goto.
https://lcamtuf.substack.com/p/weekend-projects-getting-silly-with
https://lcamtuf.substack.com/p/weekend-projects-getting-silly-with
🔥5🤔3😁2
В постгрес у команды TRUNCATE есть очень полезный флаг CASCADE который снесет не только указанную таблицу, но и все на которые есть связи. Собственно тут один товарищ делал фичу, там в процессе были миграции в которых он делал truncate на новые таблицы, чтобы подчистить временные тестовые данные, а при выкатке на прод остался без всей базы
https://twitter.com/mokevnin/status/1807778797933957553
А проблема в том что query builder внутри laravel подкидывает этот флаг CASCADE (вместо дефолтного поведения RESTRICT который запрещает это делать на таблицах с foreign key) если в качестве драйвера используется постгря. Ну и это менять не планируют, ибо не ломать же обратную совместимость для проверенного способа оторвать ноги
https://github.com/laravel/framework/issues/35157
https://twitter.com/mokevnin/status/1807778797933957553
А проблема в том что query builder внутри laravel подкидывает этот флаг CASCADE (вместо дефолтного поведения RESTRICT который запрещает это делать на таблицах с foreign key) если в качестве драйвера используется постгря. Ну и это менять не планируют, ибо не ломать же обратную совместимость для проверенного способа оторвать ноги
3 years passed, Laravel users still truncates their entire databases...
Guess how I found out about this issue? Table::truncate() inside the migration deleted our production database yesterday :D
https://github.com/laravel/framework/issues/35157
X (formerly Twitter)
Kirill (hexlet.io) (@mokevnin) on X
Как я положил продакшен базу на выходных
Вчера произошла эпическая история. После планового деплоя в субботу вечером (так было нужно), мне прилетело сообщение “кирилл, у нас почему-то не показываются заявки”. Наверное фильтры слетели, подумал я и пошел проверять.…
Вчера произошла эпическая история. После планового деплоя в субботу вечером (так было нужно), мне прилетело сообщение “кирилл, у нас почему-то не показываются заявки”. Наверное фильтры слетели, подумал я и пошел проверять.…
🤯16🔥5😁4
В грядущем Go 1.23 будет включена по умолчанию поддержка того что сейчас находиться за фича-флагом GOEXPERIMENT=rangefunc. Собственно теперь циклы for ... := range ... {} будут уметь не только поверх слайсов/словарей, но и специальных функций итераторов. Пока официальная документация этого дела раскидана по разным местам и особо без примеров, поэтому один товарищ собрал все в одну статью, накидал разных примеров из которых отлично видно что это второй шаг после дженериков в сторону от того, за что люди любили Go
https://www.dolthub.com/blog/2024-07-12-golang-range-iters-demystified/
https://www.dolthub.com/blog/2024-07-12-golang-range-iters-demystified/
Dolthub
Go range iterators demystified
How the new range iterators in the upcoming Go 1.23 release work, with examples
🔥7🤔3😁2
И в продолжение того что будет в Go 1.23, там немного интересным образом поменяли как работают таймеры. Раньше была проблемная ситуация с переиспользованием таймера, когда на нем вызывали .Reset(), но таймер не остановлен/канал не вычитан. Да, про это было написано в доке, но все равно многие ошибались и получали сложновоспроизводимые баги.
https://github.com/golang/go/issues/11513
Собственно в 1.23 это поправили сделав timer.C небуферизированным каналом (не честно, а хитрыми рантайм хаками) и поправив нутро так что сбрасывание правильно зачистит его внутреннее состояние. А еще бонусом теперь когда пропала последняя ссылка на таймер его сразу сможет зачистить GC, а не ждать срабатывания/сброса. Ну т.е. вот такой кусок больше не будет провоцировать утечку держа в памяти кучу неиспользуемых таймеров:
https://github.com/golang/go/issues/61542
Ну и собственно статья с подробным описанием изменений и ссылками на все доки/коммиты
https://antonz.org/timer-reset/
https://github.com/golang/go/issues/11513
Собственно в 1.23 это поправили сделав timer.C небуферизированным каналом (не честно, а хитрыми рантайм хаками) и поправив нутро так что сбрасывание правильно зачистит его внутреннее состояние. А еще бонусом теперь когда пропала последняя ссылка на таймер его сразу сможет зачистить GC, а не ждать срабатывания/сброса. Ну т.е. вот такой кусок больше не будет провоцировать утечку держа в памяти кучу неиспользуемых таймеров:
for {
select {
case <-in:
// do stuff
case <-time.After(timeout):
// log warning
case <-ctx.Done():
return
}
}
https://github.com/golang/go/issues/61542
Ну и собственно статья с подробным описанием изменений и ссылками на все доки/коммиты
https://antonz.org/timer-reset/
GitHub
time: Timer.C can still trigger even after Timer.Reset is called · Issue #11513 · golang/go
A common idiom is to keep a single timer and extend its use by calling Timer.Reset. From a naive reading of the documentation, these two lines are equivalent except for saving some garbage: t.Reset...
🔥12👍5
Небольшой полезный сайт для тех кому приходится что-то ковырять около ядра — список всех syscalls со ссылкой на то место где лежит его реализация в исходниках. Знает про основные архитектуры (все равно скорее всего нужны x86_64 или arm) и версии ядра от 4.0
https://syscalls.mebeim.net/?table=x86/64/x64/latest
https://syscalls.mebeim.net/?table=x86/64/x64/latest
syscalls.mebeim.net
Linux syscall tables
High-quality browsable Linux kernel syscall tables for multiple architectures
👍17🔥3
Что-то давно не писал, поэтому будет июньская статья которую заметил только щас. В далеком Go 1.14 было изменено как работает скедулер горутин, и если раньше он был только кооперативным и переключал горутины в некоторые моменты (такие, как блокировка на сискол) то тогда его научили еще и прерывать горутины прям посередине какого-нибудь числодробительного цикла. Собственно в этой небольшой статье рассказывается как эти два способа реализуются в рантайме и где если что почитать исходники реализации
https://unskilled.blog/posts/preemption-in-go-an-introduction/
https://unskilled.blog/posts/preemption-in-go-an-introduction/
unskilled.blog
Preemption in Go: an introduction
A short explanation of what is preemption and how it works
🔥8👍3🌚2
Не думал конечно что буду постить тут такие новости, но оно напрямую влияет на то где существует этот уютный канал
Павел с командой в полтора человека сделал лучший мессенджер и платформу свободную от цензуры без которой сейчас не представляют своей жизни миллионы людей. И сейчас его судят, за свободу и успешность
https://xn--r1a.website/TuckerCarlsonNetwork/49
Павел с командой в полтора человека сделал лучший мессенджер и платформу свободную от цензуры без которой сейчас не представляют своей жизни миллионы людей. И сейчас его судят, за свободу и успешность
https://xn--r1a.website/TuckerCarlsonNetwork/49
Telegram
Tucker Carlson
Pavel Durov left Russia when the government tried to control his social media company, Telegram. But in the end, it wasn’t Putin who arrested him for allowing the public to exercise free speech. It was a western country, a Biden administration ally and enthusiastic…
6🤯6👍3🔥1
У SQL есть одно неудобство, которое одновременно мешает автокомплитам (какие колонки должна показать IntelliJ когда ты написал select, но еще не написал where?), так и создает вопросы "а почему постгря не дает мне отфильтровать результаты по колонке из window function?".
Причина в том что по историческим причинам синтаксис запроса не совпадает с порядком обработки запроса (FROM+JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT (window functions) -> ORDER BY -> LIMIT), и были разные попытки что-то с этим сделать
Собственно гугл тут недавно выдал такой пропозал с добавлением оператора
Довольно быстро автор SQLite соорудил тестовую ветку где можно поиграться с таким вариантом синтаксиса. Потом правда он написал что в основной ветке этого не будет (если это не будет добавлено в стандарт или PostgreSQL), ибо поддерживать неудобно, а польза в основном для аналитических запросов
А если хочется такого же, но не экспериментального, уже какое-то время существует PRQL, который позволяет писать запросы в похожем виде, а потом компилировать их в SQL (но например ClickHouse умеет его нативно), например
будет скомпилирован в
Причина в том что по историческим причинам синтаксис запроса не совпадает с порядком обработки запроса (FROM+JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT (window functions) -> ORDER BY -> LIMIT), и были разные попытки что-то с этим сделать
Собственно гугл тут недавно выдал такой пропозал с добавлением оператора
|> (любители лигатур открывают пивасик в этот момент) который позволяет писать запрос в таком виде:FROM ticketing_system_table
|> WHERE
assignee_user.email = 'username@email.com'
AND status IN ('NEW', 'ASSIGNED', 'ACCEPTED')
|> AGGREGATE COUNT(*)
GROUP AND ORDER BY component_id DESC;Довольно быстро автор SQLite соорудил тестовую ветку где можно поиграться с таким вариантом синтаксиса. Потом правда он написал что в основной ветке этого не будет (если это не будет добавлено в стандарт или PostgreSQL), ибо поддерживать неудобно, а польза в основном для аналитических запросов
А если хочется такого же, но не экспериментального, уже какое-то время существует PRQL, который позволяет писать запросы в похожем виде, а потом компилировать их в SQL (но например ClickHouse умеет его нативно), например
from employees
filter start_date > @2021-01-01
group country (
aggregate {max_salary = max salary}
)
filter max_salary > 100_000будет скомпилирован в
SELECT country, MAX(salary) AS max_salary FROM employees WHERE start_date > DATE '2021-01-01' GROUP BY country HAVING MAX(salary) > 100000GitHub
zetasql/docs/pipe-syntax.md at 2024.08.2 · google/zetasql
ZetaSQL - Analyzer Framework for SQL. Contribute to google/zetasql development by creating an account on GitHub.
👍11🔥1
Дочитал тут одну длинную, но интересную статью. Товарищ проделал большую работу по тому, чтобы рассказать о внутреннем устройстве VM в CPython: том как кодируется байткод, как выполняется, какими трюками обходят то что процессоры не любят большие switch-case, и собственно ссылки на места, где это смотреть в коде
https://blog.codingconfessions.com/p/cpython-vm-internals
https://blog.codingconfessions.com/p/cpython-vm-internals
Codingconfessions
The Design & Implementation of the CPython Virtual Machine
A deep dive into CPython's bytecode instruction format and execution engine internals
🔥18👍1🌚1
Тут в интернетах снова откопали одну интересную ссылку, в которой FBI рекомендует установить adblock. Ну потому что вот гуглишь что-то, а в первой ссылке будет проплаченный кем-то фишинг. Для иллюстрации этого вот скриншот того как разные компания вынуждены выкупать рекламу по exact match со своим брендом чтобы в поисковой выдаче не висело что-то левое (а в худшем случае зловредное)
https://www.ic3.gov/Media/Y2022/PSA221221
https://www.ic3.gov/Media/Y2022/PSA221221
👍4🌚3
Тут Armin Ronacher написал небольшую заметку о том как он видит поддержку импорта одновременно нескольких версий одной зависимости. Ну т.е. например мы можем в самом приложении уже перейти на pydantic 2, когда внутри какой-то нашей зависимости продолжает жить первая версия. Такое уже есть в Go, но там это сделано максимально отвратительным образом вынеся мажорную версию в имя импорта (например
github.com/go-chi/chi/v5/middleware это кусок версии, но вот github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs уже нет). Надеюсь если это и притащат в питон то будет сделано более эргономично и с учетом, что практически всегда тебе нужна только одна версияArmin Ronacher's Thoughts and Writings
Multiversion Python Thoughts
A braindump on how to make multi version in Python work.
🔥8👍2
Люблю читать статьи, где мнение противоположное моему, потому что отличный повод потом посраться в твитторе. Собственно тут вот товарищ топит за исключения вместо error value. Доводы автора пересказывать не буду, лучше напишу почему я за противоположный подход (который большинству, скорее всего, известен из Errlang Go):
- необходимость явно проигнорировать (или обработать) ошибку принуждает думать о возможных non-happy path, в то время как с исключениями все забивают на них (а потом у тебя прод падает с NullPointerException)
- нет нужды в отдельных синтаксических конструкциях для этого, что делает язык проще, да и логичнее
- выбрасывание исключения усложняет понимание кода из-за того что неожиданный early return может быть в любом месте; а из места, где бросается исключение не очевидно куда мы дальше попадем
- ошибка это не всегда исключительная ситуация: при открытии файла мы вполне можем ожидать что его не будет и пойдем его создавать. В том же эликсире например даже есть File.read/1 который вернет :ok или :error, и File.read!/1 который выбросит исключение чтобы разделить эти варианты
- таки придерусь к пункту в статье: чувак утверждает что без исключений про некоторые ошибки никто даже не подозревает, как пример такой то что память не выделилась, и типа вот только щас в расте сделали Box::try_new() чтобы это проверить. Ну типа да, но это как раз такой класс ошибок, после которых дальнейшая работа бессмысленна и правильно падать (так то можно и SIGSEGV перехватить и обработать, только получим ли мы из этого что-то хорошее) чтобы тебя systemd перезапустил. А try_new() появился после того как Линус сказал что в ядре нельзя вот так паниковать и oom это штатная ситуация с которой надо работать
- в некоторых языках (всякие компилируемые плюсы) выбрасывание эксепшена имеет сильный overhead в рантайме — это ок если мы просто логгируем ошибку и окончательно падаем, но не ок для ожидаемых ошибок
https://cedardb.com/blog/exceptions_vs_errors/
- необходимость явно проигнорировать (или обработать) ошибку принуждает думать о возможных non-happy path, в то время как с исключениями все забивают на них (а потом у тебя прод падает с NullPointerException)
- нет нужды в отдельных синтаксических конструкциях для этого, что делает язык проще, да и логичнее
- выбрасывание исключения усложняет понимание кода из-за того что неожиданный early return может быть в любом месте; а из места, где бросается исключение не очевидно куда мы дальше попадем
- ошибка это не всегда исключительная ситуация: при открытии файла мы вполне можем ожидать что его не будет и пойдем его создавать. В том же эликсире например даже есть File.read/1 который вернет :ok или :error, и File.read!/1 который выбросит исключение чтобы разделить эти варианты
- таки придерусь к пункту в статье: чувак утверждает что без исключений про некоторые ошибки никто даже не подозревает, как пример такой то что память не выделилась, и типа вот только щас в расте сделали Box::try_new() чтобы это проверить. Ну типа да, но это как раз такой класс ошибок, после которых дальнейшая работа бессмысленна и правильно падать (так то можно и SIGSEGV перехватить и обработать, только получим ли мы из этого что-то хорошее) чтобы тебя systemd перезапустил. А try_new() появился после того как Линус сказал что в ядре нельзя вот так паниковать и oom это штатная ситуация с которой надо работать
- в некоторых языках (всякие компилируемые плюсы) выбрасывание эксепшена имеет сильный overhead в рантайме — это ок если мы просто логгируем ошибку и окончательно падаем, но не ок для ожидаемых ошибок
https://cedardb.com/blog/exceptions_vs_errors/
Cedardb
Why I Prefer Exceptions to Error Values
CedarDB is a database system that delivers unmatched performance for transactions and analytics, from small writes to handling billions of rows. Built on cutting-edge research to power today’s tools and tomorrow’s challenges.
👍12🔥2🤔1🌚1
Пока уже второй день все обсуждают взрывные новости с middle east, расскажу что вообще это уже было в симпсонах на DEFCON. В 2014 известный в определенных кругах Patrick Wardle вместе с Colby Moore показывали как контролируя supply chain можно допихнуть в девайс немного дополнительных штук, подправить прошивку, добавив туда RCE (Remote Controlled Explosion) так сказать, и при этом сохранить все исходные функции так, чтобы никто не подозревал о бонусной фиче. А для демонстрации выбрали популярную в те года камеру которая как раз задумана что будет воткнута в интернеты для удаленного просмотра
https://www.youtube.com/watch?v=8PXHhGa5k8g (та самая демка на 29:10)
https://defcon.org/images/defcon-22/dc-22-presentations/Moore-Wardle/DEFCON-22-Colby-Moore-Patrick-Wardle-Synack-DropCam-Updated.pdf
https://www.youtube.com/watch?v=8PXHhGa5k8g (та самая демка на 29:10)
https://defcon.org/images/defcon-22/dc-22-presentations/Moore-Wardle/DEFCON-22-Colby-Moore-Patrick-Wardle-Synack-DropCam-Updated.pdf
YouTube
DEF CON 22 - Patrick Wardle & Colby Moore - Optical Surgery; Implanting a DropCam
Slides Here; https://defcon.org/images/defcon-22/dc-22-presentations/Moore-Wardle/DEFCON-22-Colby-Moore-Patrick-Wardle-Synack-DropCam-Updated.pdf
Optical Surgery; Implanting a DropCam
Patrick Wardle DIRECTOR OF RESEARCH, SYNACK
Colby Moore SECURITY RESEARCH…
Optical Surgery; Implanting a DropCam
Patrick Wardle DIRECTOR OF RESEARCH, SYNACK
Colby Moore SECURITY RESEARCH…
🔥10
На некоторых собесах по питону любят спросить про
Как пример разработчики Go пишут о том как это используется для zone identifier в net.IPAddr (это про ipv6), а другие гуглеры решили показать это более понятном примере со строками. Собственно строки наверное самое частое для чего этим будет пользоваться (хотя там можно любой
id() от переменных, где лежит число от -5 до 256. У этого фокуса есть умное слово interning, а пост этот про то что в Go 1.23 добавился пакет unique (на самом деле был и раньше, но как internal/intern, а перед тем как сделать публичным его зачистили от interace{} торчащих во все стороны) для того чтобы делать такой манёвр и в го. Как пример разработчики Go пишут о том как это используется для zone identifier в net.IPAddr (это про ipv6), а другие гуглеры решили показать это более понятном примере со строками. Собственно строки наверное самое частое для чего этим будет пользоваться (хотя там можно любой
comparable пихать), банально любой активное взаимодействие с http это куча одинаковых content-type: application/json в памяти, и например автор rclone уже немного поэкспериментировал и его код работы с S3 стал тратить на 30% меньше памяти. Осталось чутка подождать до 1.23.2, где доедет бекпорт одного бага с тем как оно сохраняло со строками больше необходимогоGitHub
go/src/net/netip/netip.go at release-branch.go1.23 · golang/go
The Go programming language. Contribute to golang/go development by creating an account on GitHub.
🔥10
А помните какое-то время назад некоторые бегали нахваливая браузер Arc, якобы уникальный экспириенс от интернета, нигде такого нет? (Примерно все файрфокс-бояре легко делали этот экспириенс у себя плагинами, но пост не про это)
Так вот, одна из фичей этого Arc - это возможность затюнить другие сайты (типа TamperMonkey который можете поставить в тот браузер что у вас сейчас) и потом пошарить их с другими. Ну и как все модные чуваки, "зачем нам бекендер", сложили все это в firebase, разумеется накосячив с пермишенами. Нет, достать чужие не выйдет, они тут проверяют creatorId, но для своего скрипта можно поправить creatorId и таким образом подкинув свой кусочек жс другому чуваку. И бонусом там нет никаких валидаций на каких типах страниц это работает, так что можно создать скрипт который будет выполняться на chrome://settings (где это произойдет с повышенными правами)
Остается только узнать айди пользователю кому подкинем "подарок", но это тоже делается просто: они же сделали браузер по инвайтам, можно просто спросить его у жертвы, а потом достать из апишки нужный айди. Ну или если чувак уже шарил свои кастомизации публично (айди будет в галлерее) или завести с ним общую easel (они там сделали whiteboard внутри браузера, через нее тоже можно выцепить айдишник).
Складывая все вместе, получаем RCE для эксплуатации которой даже не надо подкидывать подозрительный линк жертве. А нашедшей багу за это заплатили какие-то оскорбительные $2k, уверен что трехбуквенные агентства легко бы докинули минимум один ноль за такое
https://kibty.town/blog/arc/
Так вот, одна из фичей этого Arc - это возможность затюнить другие сайты (типа TamperMonkey который можете поставить в тот браузер что у вас сейчас) и потом пошарить их с другими. Ну и как все модные чуваки, "зачем нам бекендер", сложили все это в firebase, разумеется накосячив с пермишенами. Нет, достать чужие не выйдет, они тут проверяют creatorId, но для своего скрипта можно поправить creatorId и таким образом подкинув свой кусочек жс другому чуваку. И бонусом там нет никаких валидаций на каких типах страниц это работает, так что можно создать скрипт который будет выполняться на chrome://settings (где это произойдет с повышенными правами)
Остается только узнать айди пользователю кому подкинем "подарок", но это тоже делается просто: они же сделали браузер по инвайтам, можно просто спросить его у жертвы, а потом достать из апишки нужный айди. Ну или если чувак уже шарил свои кастомизации публично (айди будет в галлерее) или завести с ним общую easel (они там сделали whiteboard внутри браузера, через нее тоже можно выцепить айдишник).
Складывая все вместе, получаем RCE для эксплуатации которой даже не надо подкидывать подозрительный линк жертве. А нашедшей багу за это заплатили какие-то оскорбительные $2k, уверен что трехбуквенные агентства легко бы докинули минимум один ноль за такое
https://kibty.town/blog/arc/
🤯14🔥8👍3😁3
Тут вчера на гитхабе появился один репозиторий (там версия 5.9.2 если что) чтобы порадовать дедов, всегда же весело погрепать исходники чего-то легендарного, чтобы узнать сколько там "fuck" в комментариях. Правда там очень странная лицензия, которая запрещает даже модифицированные копии исходников (но при этом разрешает присылать им патчи, как это делать то не модифицируя исходники?). А еще чуваки умудрились закоммитить чутка проприетарных исходников, а потом пытались их удалить из репозитория, правда не очень успешно, по второй ссылке есть прям ссылки на нужные коммиты
https://github.com/WinampDesktop/winamp
https://github.com/WinampDesktop/winamp/issues/19#issuecomment-2372037868
https://github.com/WinampDesktop/winamp
https://github.com/WinampDesktop/winamp/issues/19#issuecomment-2372037868
👍4😁4🌚2
Как известно лучший способ разжечь дискуссию на питонячей конфе это вкинуть доклад про джангу. Собственно поэтому пост про джангу!
Тут товарищ на DjangoCon показал проект nanodjango, с которым можно накидать небольшой прототип прям в одном файле, а потом, если понадобится, сконвертировать в привычный джанго проект с раздельными urls, views, models. Покажу прям на примере честно скопированным из доки как неприлично просто теперь можно сделать однофайловый пикосервис с джангой:
Тут товарищ на DjangoCon показал проект nanodjango, с которым можно накидать небольшой прототип прям в одном файле, а потом, если понадобится, сконвертировать в привычный джанго проект с раздельными urls, views, models. Покажу прям на примере честно скопированным из доки как неприлично просто теперь можно сделать однофайловый пикосервис с джангой:
from django.db import models
from nanodjango import Django
app = Django()
@app.admin # Registers with the Django admin
class CountLog(models.Model):
timestamp = models.DateTimeField(auto_now_add=True)
@app.route("/") # Standard Django function view
def count(request):
CountLog.objects.create()
return f"<p>Number of requests: {CountLog.objects.count()}</p>"
@app.api.get("/add") # Django Ninja API
def count(request):
CountLog.objects.create()
return {"count": CountLog.objects.count()}
GitHub
GitHub - radiac/nanodjango: Full Django in a single file - views, models, API ,with async support. Automatically convert it to…
Full Django in a single file - views, models, API ,with async support. Automatically convert it to a full project. - radiac/nanodjango
👍10😁5