Делаю вид что разбираюсь
584 subscribers
24 photos
2 videos
388 links
Ведет @Pr0Ger
Download Telegram
А помните некоторое время назад была новость о том как гугл удалил аккаунт UniSuper (компания управляющая активами на $80 миллиардов) в облаке? Тут оказывается они написали «постмортем» про это и запостили в пятницу вечером прямо перед длинными выходными (в понедельник будет Memorial Day в США), в котором оправдывались за то что случилось

tldr: клиенту настраивали услугу на ручной тяге, забыли один параметр у которого дефолт был «удалить спустя 1 год», что собственно потом другая автоматизация и сделала (без всяких варнингов, soft-delete и возможности поговорить с живым человеком)

Ну и вся реакция на инцидент такого масштаба это «ту услугу больше на ручной тяге не настраивают» и «мы проверили остальных пользователей этой услуги, больше никому не снесет молча после одного года»

И особенно забавна эта цитата 
The customer and Google teams worked 24x7 over several days

Интересно знают ли они что значит 7 в 24x7 или это «как же нам похуй, мы прикрыли жопу контрактом и что вы нам сделаете». Да и работали то в основном SRE UniSuper которые имели рабочие оффсайт бекапы и быстро развернули все с нуля

https://cloud.google.com/blog/products/infrastructure/details-of-google-cloud-gcve-incident/

Как же легко щас сейлзам амазона будет переманивать клиентов говоря «мы вам выделим отдельного кожаного который сможет вмешаться даже если вы сами проиграете в терраформ и попытаетесь дропнуть прод»
👍9🔥9
Тут на днях в интернетах был небольшой наброс с немного неожиданным результатом

Собственно почему этот результат неожиданный? Когда сравниваешь int и float большинство языков выбирают из двух стульев: запретить без явного приведения одного из операндов или неявно скастовать int в float. Во втором случае, хоть и сравнение float дело неблагодарное, ожидаешь что в обоих случаях точность потеряется одинаково (число 9007199254740993.0 не представимо в float64/double и на самом деле там будет 9007199254740992.0) и результат совпадет. Но они не совпадают, ибо питон не делает такое приведение типов и сравнивает значения напрямую внутри функции с комментарием "comparsion is pretty much a nightmare"

Узнать подробнее как в питоне реализована та самая float_richcompare, а заодно освежить в памяти как IEEE-754 представляет числа с плавающей можно в этой небольшой статье:

https://blog.codingconfessions.com/p/how-python-compares-floats-and-ints
👍13🌚4🤯1
В продолжении темы про IEEE-754, когда-то давно господин Джон Кармак написал одну странную функцию которая считает 1/sqrt(x) весьма интересным способом (код вместе с оригинальными комментами настолько растекся по интернетам, что копилот одно время даже воспроизводил его слово в слово). Трюк этот нужен был потому что данная операция активно использовалась в расчете освещения, но честная реализация была очень медленной, и поэтому делался такой трюк дававший довольно близкие значения


float Q_rsqrt(float number)
{
long i;
float x2, y;
const float threehalfs = 1.5F;

x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed

return y;
}


Собственно под капотом этого немного математики и понимание того как представляются в памяти числа, целые и с плавающей точкой
https://github.com/francisrstokes/githublog/blob/main/2024/5/29/fast-inverse-sqrt.md

Правда некоторое время спустя выхода Quake 3 процессоры освоили инструкцию RSQRTSS, которая считала данную функцию более точным и оптимальным способом
🔥14👍4🤯1
Во всех гошных проектах у меня один из этапов для линтеров состоял из вот таких двух команд:
- go mod tidy -v
- git diff --exit-code

Собственно идея в том, чтобы проверить что go.{mod,sum} соответствуют актуальному состоянию проекта и там не осталось какого-то мусора, а в противном случае зафейлить сборку

И тут недавно вмержили (и будет доступно начиная с 1.23) поддержку флага go mod tidy -diff, которая из коробки дает это поведение: если запуск tidy приводит к изменениям в go.{mod,sum} то вместо того чтобы применить их, оно выплюнет дифф и завершится с ошибкой

https://go-review.googlesource.com/c/go/+/585401
https://go-review.googlesource.com/c/go/+/587695
https://go-review.googlesource.com/c/go/+/587941
🔥16
Возможно кто-то уже знает, но последний год я еще состою в программном комитете Podlodka Python Crew и помогаю с подготовкой и проведением уже третьего сезона. В этот раз сезон про инфраструктурную сторону: как делать мониторинг и трейсинг, оптимизировать приложения и не косячить с безопасностью. Полная программа тут https://podlodka.io/pythoncrew

Да, сезон уже стартанул и прямо сейчас я делаю запись доклада про оптимизацию (там конечно же уже упомянут раст, куда щас без него), но я так и не отдал никому один из промокодов на 100% дискаунт на вход: python_crew_3_GTM4oC (отпишите только кто возьмет, а то он одноразовый) (забран, но если вдруг хотите аналогичное на следующие сезоны тоже пишите)
🔥11
Примерно с самого момента как я пересел на мак я пользовался тулзой Bartender, ну потому что аппл не смогли ни в скрытие иконок в менюбаре (это даже в WinXP уже было!), ни их двигание (ну это хоть они потом сделали).

Проблема в другом, как оказалось (после того как люди заметили что новый апдейт подписан другим сертом) он продался и теперь принадлежит какой-то мутной студии которая первым делом в апдейте втащила либу аналитики. И которая уже сказала что разделяют "vision" исходного автора и будут развивать дальше (переводя с булшитного на обычный - версия под следующую макось будет по подписке)

Все это к чему, к тому что надо заменить эту тулзу (у которой к слову есть пермишен на screen recording) на что-то более доверяемое. Многие озадачившиеся такой задачей пошли смотреть на Ice, который и опенсорсный, и активно допиливается (в отличие от пары других аналогов), собственно и я сам на него перешел теперь

https://github.com/jordanbaird/Ice
👍16🔥1
На аппловой конфе много говорили что AI, но после первого Keynote некоторые все прослушали где оно работает и пошли писать в твиттор "аппл теперь сливают все в OpenAI, запрещу у себя в компании ифоны". Хотя даже там они упоминали что сначала делают все на девайсе, а только если там ресурсов не хватит уже идут на свои сервера.

Собственно в этой статье они рассказали что, и как они наворотили на серверной стороне (коротко: сервера stateless, все ключи обновляются при ребуте, девайс шифрует свой запрос под конкретный сервер, весь код подписан, какого-то ssh на сервера нет). И самое интересное, они будут выкладывать образа всего софта (часть даже с исходниками), а девайс перед тем как общаться с сервером проверяет что там запущена версия которая публично опубликована (лог всех задеплоенных сделан по схеме как у Certificate Transparency)

https://security.apple.com/blog/private-cloud-compute/
🔥11👍2🌚1
Еще одно что рассказывали аппл это как они хотят сделать Swift языком под все платформы и поэтому расширяется поддержка линуксов (и вообще сделали LSP чтобы в вскод/вим интегрироваться). И даже завезли кросскомпиляцию статичных бинарей под них (раньше оно было только между аппловых платформ).

Собственно тут товарищ поэкспериментировал со своим небольшим плагином на свифте и как его собрать, чтобы запускать на алпайне (к слову аппл взяли musl для такой статичной сборки, правда сам компилятор еще на алпайне не запускается) и поделился и результатами, и скриптами которые пригодятся если захочется что-то еще подобным образом собрать

https://mko.re/blog/swift-alpine-packaging/
👍9🔥3
Тут товарищ обнаружил что в новой visionOS проц иногда очень агрессивно тротлится и причина в демоне userexperienced, который ограничивает скорость кулеров в зависимости от уровня окружающего шума. Ну т.е. в шумном самолете он будет крутить как может, а вот в тихой комнате затротлится так что даже на глаз заметно. Идея то хорошая, еще бы доработать так, чтобы вот настолько сильно не ограничивало, ибо лучше потерпеть немного шума

К слову уже не первый раз аппл делает такие маневры с кулерами, раньше макбуки с интелом на несколько секунд выключали кулеры в момент активации сири, чтобы записать звук без лишних помех

https://x.com/ShinyQuagsire/status/1804688365905756564
😁7🔥1
Любители поработать из Тайланда с нестабильным интернетом, конечно, слышали и используют штуки типа tmux/mosh. Но оба этих варианта обрабатывают выхлоп на серверной стороне и отдают уже готовый view на клиент, из-за чего ни локально в своем iterm не поискать, ни копипаста привычно не работает. Да и вообще тащить полноценный мультиплексер чисто ради session persistence кажется избыточно

Собственно тут кто-то сделал тулзу shpool (конечно же на расте) которая делает исключительно это, не переизобретает сетевую часть (в отличие от mosh) и просто прокидывает все туда-сюда (из-за чего для айтерма это ничем не отличается от классического ssh), да и в использовании прост как железная дорога (одна основная команда которую можно запихать в RemoteCommand своего конфига)

https://github.com/shell-pool/shpool
👍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
👍18😁5🌚2
Тут недавно в твитторах запостили вот такой скриншот сишного кода, и типа смотрите, в switch case необязательно использовать break в каждом case (примерно все кто писал на си хоть раз совершали ошибку забыв его). Собственно небольшая статья которая рассказывает почему это валидный код и как это работает. Ну и бонусом как еще сделать такое-же, но вообще без switch, а только с case и goto.

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) если в качестве драйвера используется постгря. Ну и это менять не планируют, ибо не ломать же обратную совместимость для проверенного способа оторвать ноги

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
🤯16🔥5😁4
В грядущем Go 1.23 будет включена по умолчанию поддержка того что сейчас находиться за фича-флагом GOEXPERIMENT=rangefunc. Собственно теперь циклы for ... := range ... {} будут уметь не только поверх слайсов/словарей, но и специальных функций итераторов. Пока официальная документация этого дела раскидана по разным местам и особо без примеров, поэтому один товарищ собрал все в одну статью, накидал разных примеров из которых отлично видно что это второй шаг после дженериков в сторону от того, за что люди любили Go

https://www.dolthub.com/blog/2024-07-12-golang-range-iters-demystified/
🔥7🤔3😁2
И в продолжение того что будет в Go 1.23, там немного интересным образом поменяли как работают таймеры. Раньше была проблемная ситуация с переиспользованием таймера, когда на нем вызывали .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/
🔥12👍5
Небольшой полезный сайт для тех кому приходится что-то ковырять около ядра — список всех syscalls со ссылкой на то место где лежит его реализация в исходниках. Знает про основные архитектуры (все равно скорее всего нужны x86_64 или arm) и версии ядра от 4.0

https://syscalls.mebeim.net/?table=x86/64/x64/latest
👍17🔥3
Что-то давно не писал, поэтому будет июньская статья которую заметил только щас. В далеком Go 1.14 было изменено как работает скедулер горутин, и если раньше он был только кооперативным и переключал горутины в некоторые моменты (такие, как блокировка на сискол) то тогда его научили еще и прерывать горутины прям посередине какого-нибудь числодробительного цикла. Собственно в этой небольшой статье рассказывается как эти два способа реализуются в рантайме и где если что почитать исходники реализации

https://unskilled.blog/posts/preemption-in-go-an-introduction/
🔥8👍3🌚2
Не думал конечно что буду постить тут такие новости, но оно напрямую влияет на то где существует этот уютный канал

Павел с командой в полтора человека сделал лучший мессенджер и платформу свободную от цензуры без которой сейчас не представляют своей жизни миллионы людей. И сейчас его судят, за свободу и успешность

https://xn--r1a.website/TuckerCarlsonNetwork/49
6🤯6👍3🔥1
У SQL есть одно неудобство, которое одновременно мешает автокомплитам (какие колонки должна показать IntelliJ когда ты написал select, но еще не написал where?), так и создает вопросы "а почему постгря не дает мне отфильтровать результаты по колонке из window function?".
Причина в том что по историческим причинам синтаксис запроса не совпадает с порядком обработки запроса (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) > 100000
👍11🔥1
Дочитал тут одну длинную, но интересную статью. Товарищ проделал большую работу по тому, чтобы рассказать о внутреннем устройстве VM в CPython: том как кодируется байткод, как выполняется, какими трюками обходят то что процессоры не любят большие switch-case, и собственно ссылки на места, где это смотреть в коде

https://blog.codingconfessions.com/p/cpython-vm-internals
🔥18👍1🌚1
Тут в интернетах снова откопали одну интересную ссылку, в которой FBI рекомендует установить adblock. Ну потому что вот гуглишь что-то, а в первой ссылке будет проплаченный кем-то фишинг. Для иллюстрации этого вот скриншот того как разные компания вынуждены выкупать рекламу по exact match со своим брендом чтобы в поисковой выдаче не висело что-то левое (а в худшем случае зловредное)

https://www.ic3.gov/Media/Y2022/PSA221221
👍4🌚3