А помните некоторое время назад была новость о том как гугл удалил аккаунт UniSuper (компания управляющая активами на $80 миллиардов) в облаке? Тут оказывается они написали «постмортем» про это и запостили в пятницу вечером прямо перед длинными выходными (в понедельник будет Memorial Day в США), в котором оправдывались за то что случилось
tldr: клиенту настраивали услугу на ручной тяге, забыли один параметр у которого дефолт был «удалить спустя 1 год», что собственно потом другая автоматизация и сделала (без всяких варнингов, soft-delete и возможности поговорить с живым человеком)
Ну и вся реакция на инцидент такого масштаба это «ту услугу больше на ручной тяге не настраивают» и «мы проверили остальных пользователей этой услуги, больше никому не снесет молча после одного года»
И особенно забавна эта цитата
Интересно знают ли они что значит 7 в 24x7 или это «как же нам похуй, мы прикрыли жопу контрактом и что вы нам сделаете». Да и работали то в основном SRE UniSuper которые имели рабочие оффсайт бекапы и быстро развернули все с нуля
https://cloud.google.com/blog/products/infrastructure/details-of-google-cloud-gcve-incident/
Как же легко щас сейлзам амазона будет переманивать клиентов говоря «мы вам выделим отдельного кожаного который сможет вмешаться даже если вы сами проиграете в терраформ и попытаетесь дропнуть прод»
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/
Как же легко щас сейлзам амазона будет переманивать клиентов говоря «мы вам выделим отдельного кожаного который сможет вмешаться даже если вы сами проиграете в терраформ и попытаетесь дропнуть прод»
Google Cloud Blog
Details of Google Cloud GCVE incident | Google Cloud Blog
Google Cloud shares details of an incident impacting one Australian customer's use of Google Cloud VMware Engine. Learn what happened and how we're preventing it from happening again.
👍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
Собственно почему этот результат неожиданный? Когда сравниваешь 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) весьма интересным способом (код вместе с оригинальными комментами настолько растекся по интернетам, что копилот одно время даже воспроизводил его слово в слово). Трюк этот нужен был потому что данная операция активно использовалась в расчете освещения, но честная реализация была очень медленной, и поэтому делался такой трюк дававший довольно близкие значения
Собственно под капотом этого немного математики и понимание того как представляются в памяти числа, целые и с плавающей точкой
https://github.com/francisrstokes/githublog/blob/main/2024/5/29/fast-inverse-sqrt.md
Правда некоторое время спустя выхода Quake 3 процессоры освоили инструкцию RSQRTSS, которая считала данную функцию более точным и оптимальным способом
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, которая считала данную функцию более точным и оптимальным способом
GitHub
githublog/2024/5/29/fast-inverse-sqrt.md at main · francisrstokes/githublog
I'm sick of complex blogging solutions, so markdown files in a git repo it is - francisrstokes/githublog
🔥14👍4🤯1
Во всех гошных проектах у меня один из этапов для линтеров состоял из вот таких двух команд:
Собственно идея в том, чтобы проверить что go.{mod,sum} соответствуют актуальному состоянию проекта и там не осталось какого-то мусора, а в противном случае зафейлить сборку
И тут недавно вмержили (и будет доступно начиная с 1.23) поддержку флага
https://go-review.googlesource.com/c/go/+/585401
https://go-review.googlesource.com/c/go/+/587695
https://go-review.googlesource.com/c/go/+/587941
- 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 (отпишите только кто возьмет, а то он одноразовый) (забран, но если вдруг хотите аналогичное на следующие сезоны тоже пишите)
Да, сезон уже стартанул и прямо сейчас я делаю запись доклада про оптимизацию (там конечно же уже упомянут раст, куда щас без него), но я так и не отдал никому один из промокодов на 100% дискаунт на вход:
podlodka.io
Онлайн-конференция Podlodka Python Crew, сезон #5
Недельное мероприятие от команды Podlodka: ежедневные интерактивные сессии в Zoom по актуальным вопросам Python-индустрии, нон-стоп общение с экспертами и звёздами индустрии, закрытое профессиональное сообщество в Telegram.
🔥11
Примерно с самого момента как я пересел на мак я пользовался тулзой Bartender, ну потому что аппл не смогли ни в скрытие иконок в менюбаре (это даже в WinXP уже было!), ни их двигание (ну это хоть они потом сделали).
Проблема в другом, как оказалось (после того как люди заметили что новый апдейт подписан другим сертом) он продался и теперь принадлежит какой-то мутной студии которая первым делом в апдейте втащила либу аналитики. И которая уже сказала что разделяют "vision" исходного автора и будут развивать дальше (переводя с булшитного на обычный - версия под следующую макось будет по подписке)
Все это к чему, к тому что надо заменить эту тулзу (у которой к слову есть пермишен на screen recording) на что-то более доверяемое. Многие озадачившиеся такой задачей пошли смотреть на Ice, который и опенсорсный, и активно допиливается (в отличие от пары других аналогов), собственно и я сам на него перешел теперь
https://github.com/jordanbaird/Ice
Проблема в другом, как оказалось (после того как люди заметили что новый апдейт подписан другим сертом) он продался и теперь принадлежит какой-то мутной студии которая первым делом в апдейте втащила либу аналитики. И которая уже сказала что разделяют "vision" исходного автора и будут развивать дальше (переводя с булшитного на обычный - версия под следующую макось будет по подписке)
Все это к чему, к тому что надо заменить эту тулзу (у которой к слову есть пермишен на screen recording) на что-то более доверяемое. Многие озадачившиеся такой задачей пошли смотреть на Ice, который и опенсорсный, и активно допиливается (в отличие от пары других аналогов), собственно и я сам на него перешел теперь
https://github.com/jordanbaird/Ice
GitHub
GitHub - jordanbaird/Ice: Powerful menu bar manager for macOS
Powerful menu bar manager for macOS. Contribute to jordanbaird/Ice development by creating an account on GitHub.
👍16🔥1
На аппловой конфе много говорили что AI, но после первого Keynote некоторые все прослушали где оно работает и пошли писать в твиттор "аппл теперь сливают все в OpenAI, запрещу у себя в компании ифоны". Хотя даже там они упоминали что сначала делают все на девайсе, а только если там ресурсов не хватит уже идут на свои сервера.
Собственно в этой статье они рассказали что, и как они наворотили на серверной стороне (коротко: сервера stateless, все ключи обновляются при ребуте, девайс шифрует свой запрос под конкретный сервер, весь код подписан, какого-то ssh на сервера нет). И самое интересное, они будут выкладывать образа всего софта (часть даже с исходниками), а девайс перед тем как общаться с сервером проверяет что там запущена версия которая публично опубликована (лог всех задеплоенных сделан по схеме как у Certificate Transparency)
https://security.apple.com/blog/private-cloud-compute/
Собственно в этой статье они рассказали что, и как они наворотили на серверной стороне (коротко: сервера stateless, все ключи обновляются при ребуте, девайс шифрует свой запрос под конкретный сервер, весь код подписан, какого-то ssh на сервера нет). И самое интересное, они будут выкладывать образа всего софта (часть даже с исходниками), а девайс перед тем как общаться с сервером проверяет что там запущена версия которая публично опубликована (лог всех задеплоенных сделан по схеме как у Certificate Transparency)
https://security.apple.com/blog/private-cloud-compute/
Private Cloud Compute: A new frontier for AI privacy in the cloud - Apple Security Research
Secure and private AI processing in the cloud poses a formidable new challenge. To support advanced features of Apple Intelligence with larger foundation models, we created Private Cloud Compute (PCC), a groundbreaking cloud intelligence system designed specifically…
🔥11👍2🌚1
Еще одно что рассказывали аппл это как они хотят сделать 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