Делаю вид что разбираюсь
585 subscribers
24 photos
2 videos
388 links
Ведет @Pr0Ger
Download Telegram
Еще одно что рассказывали аппл это как они хотят сделать 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
Тут Armin Ronacher написал небольшую заметку о том как он видит поддержку импорта одновременно нескольких версий одной зависимости. Ну т.е. например мы можем в самом приложении уже перейти на pydantic 2, когда внутри какой-то нашей зависимости продолжает жить первая версия. Такое уже есть в Go, но там это сделано максимально отвратительным образом вынеся мажорную версию в имя импорта (например github.com/go-chi/chi/v5/middleware это кусок версии, но вот github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs уже нет). Надеюсь если это и притащат в питон то будет сделано более эргономично и с учетом, что практически всегда тебе нужна только одна версия
🔥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/
👍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
🔥10
На некоторых собесах по питону любят спросить про 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, где доедет бекпорт одного бага с тем как оно сохраняло со строками больше необходимого
🔥10
А помните какое-то время назад некоторые бегали нахваливая браузер 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
👍4😁4🌚2
Как известно лучший способ разжечь дискуссию на питонячей конфе это вкинуть доклад про джангу. Собственно поэтому пост про джангу!

Тут товарищ на 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()}
👍10😁5