1.84K subscribers
3.27K photos
130 videos
15 files
3.55K links
Блог со звёздочкой.

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

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Технологический Болт Генона
Rust and Go are both awesome
🔫
Please open Telegram to view this post
VIEW IN TELEGRAM
😁11🤡5🍌1🤝1
#prog #rust хайлайты.

TL;DR: тык.

Среди многих хороших вещей, которые есть в Rust — указание версии, начиная с которой определение стабильно. Главным образом это относится к API в стандартной библиотеке, но эта информация также хранится и для фич компилятора — это позволяет компилятору указывать на то, что #![feature(...)] уже стабилизирована и потому не требует аннотаций в коде.

Долгое время эта версия указывалась вручную. Это обычно не так сложно — новое определение попадает в stable-версию, которая на три версии старше текущей. Однако PR в Rust имеют свойство затягиваться — особенно для больших и сложных фич типа non-lexical lifetimes — и потому эти атрибуты требовалось периодически обновлять. Так как это не очень интересная работа, а упустить эти атрибуты при работе очень легко, часто в master эти указания на стабильную версию попадали неверными, из-за чего их приходилось править задним числом после мерджа (например).

Для того, чтобы избежать подобных происшествий, в конце августа 2022 года est31 добавил поддержку заменителя версии. Именно, все новые стабильные фичи должны теперь вместо конкретной версии использовать строку "CURRENT_RUSTC_VERSION", и tidy (линтер компилятора) в CI проверяет, что это действительно так. Для того, чтобы менять версию на актуальную, этот же PR добавил для этого автоматический инструмент — replace-version-placeholder — который запускается каждый раз, когда отпочковывается новая бета-версия. Это очень тупой инструмент, который использует простую текстовую замену (буквально str::replace)

Однако определение этого шаблона нужно иметь и в сорцах компилятора — для того, чтобы корректно распознавать определения с указанием этой строки в качестве стабильной версии и давать связанные с версиями диагностики. По понятным причинам это определение используется в коде компилятора, ответственного за парсинг атрибутов. Чтобы избежать перезаписывания определения шаблона, в replace-version-placeholder был захардкожен путь до файла, отвечающего за эту часть компилятора. Однако структура компилятора не является отлитой в граните, и периодически файлы перемещают или переименовывают. Иногда меняется путь и до файла, содержащего определение шаблона, из-за чего инструмент для замены версий начинает заменять то, что не надо, и его надо править, чтобы поменять путь, который исключается из обработки.

Чтобы исключить подобную чехарду, Pietro Albini придумал гениальный ход с заменой определения шаблона в коде. Вот как определение VERSION_PLACEHOLDER выглядело до его PR:

pub const VERSION_PLACEHOLDER: &str = "CURRENT_RUSTC_VERSION";


А вот как оно же выглядит после:

pub const VERSION_PLACEHOLDER: &str = concat!("CURRENT_RUSTC_VERSIO", "N");


Несмотря на то, что определение де-факто осталось тем же, исходники теперь не содержат строку CURRENT_RUSTC_VERSION, а потому replace-version-placeholder файл не меняет. Это изменение позволило не только свободно перемещать исходники, но и убрать фильтрацию по имени файла из инструмента. Естественно, Pietro написал в комментариях, зачем это надо.

Но всё равно смешно.
😁20👍2😱1
Блог*
периодически файлы перемещают или переименовывают
Кто скажет, что это одно и то же — буду бить руководством по UX по голове
🌚4🤡2
#prog #amazingopensource

Josh — Just One Single History

README:

Combine the advantages of a monorepo with those of multirepo setups by leveraging a fast, incremental, and reversible implementation of git history filtering.

Из руководства пользователя:

The idea behind josh started with two questions:

1. What if history filtering could be so fast that it can be part of a normal, everyday workflow, running on every single push and fetch without the user even noticing?
2. What if history filtering was a non-destructive, reversible operation?


Что позволяет сделать этот инструмент? Например, склонировать отдельную директорию из репозитория, как отдельный репозиторий, который содержит только коммиты, связанные с этой директорией и её содержимым (первый пример в README). Причём директория может быть произвольной, а не из какого-то заданного заранее списка. josh даже позволяет сделать репозиторий из директории, которая в репозитории пока отсутствует!

Подобный склонированный под-репозиторий ведёт себя так же, как обычный git-репозиторий, и поддерживает тот же набор операций. В частности, новые коммиты будут видны в его истории, но при этом будут прозрачно интегрированы в историю исходного репозитория.

Josh также поддерживает более продвинутую функциональность для переобозначения директорий, когда, например, каждый подпроект содержится в отдельной директории, но при этом требует файлы из некой общей директории (второй пример в README).

Бонусом josh также даёт возможность делать запросы по содержимому репозитория через GraphQL API без необходимости клонирования репозитория целиком. Даже если вы не собираетесь использовать трюки с переписыванием истории, одно это уже может быть полезно.

Узнал про этот инструмент из этого PR в репу Rust, который преобразовал rustc-dev-guide из сабмодуля в директорию в составе основной репы с использованием josh.
🤯4👍3
Forwarded from Хреногубка
Практически в каждой мужской руке, которую ты жал, когда-то был член. Спустя время Хреногубка вернется к вам с новыми фактами.
🤝18👌3😁2👎1
🌚15😁11💯2💩1
#prog #rust #rustasync

Async Rust is about concurrency, not (just) performance
(Alternative title: In defense of async (Rust))

TLDR: I think that the primary benefit of async/await is that it lets us concisely express complex concurrency; any (potential) performance improvements are just a second-order effect. We should thus judge async primarily based on how it simplifies our code, not how (or if) it makes the code faster.
😁3👍2🤔1
Forwarded from Сова пишет…
Вот в ЭКОСИСТЕМЕ APPLE есть такое приложение как iPhone Mirroring

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

Что интересно, эта фича работала несколько недель сразу после релиза, а потом перестала.

Месяцем позже Apple выкатили апдейт для всех устройств и вроде заработало.

Сейчас я решил снова воспользоваться этой фичей: мне пришло уведомление с айфона, тыкнул, открылось iPhone Mirroring.

Но! Apple предлагает мне встать, найти айфон и разблокировать его, чтобы использовать эту фичу!

Но тогда нафига мне эта фича? Как так?
👍5🍌1
Сова пишет…
Вот в ЭКОСИСТЕМЕ APPLE есть такое приложение как iPhone Mirroring Его суть в том, чтобы я мог лежа на диване с ноутбуком потыкать в нужные мне приложения на айфоне не вставая, особенно полезно, если айфон на зарядке в другой комнате. Что интересно, эта фича…
Фейл примерно на уровне десктопного WhatsApp. Для контекста: десктопное приложение WhatsApp есть, но для того, чтобы им пользоваться, нужно иметь под рукой рабочий и подключённый к интернету телефон с установленным и залогиненым WhatsApp
👍4🤯3
💩14😁13🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Doom в Word'е

How it works

The Word document contains the library doomgeneric_docm.dll and doom1.wad game data encoded in base 64, which a VBA macro extracts onto the disk and then loads. Every game tick, doomgeneric.dll creates a bmp image containing the current frame and uses GetAsyncKeyState to read the keyboard state. The main VBA macro's game loop runs a tick in doom, then replaces the image in the document with the latest frame.


GitHub
https://github.com/wojciech-graj/doom-docm

ЗЫ У меня LibreOffice не заработало. Было ожидаемо 🌝
👍7🤯4
#prog #abnormalprogramming #article

Building a url-shortener with Lambda — JUST Lambda
(и немного Python)

Работает без базы данных, если что
😁28😭53👍1🔥1
#prog #rust #article

Breakage! in the Cargo.toml — How Rust Package Features Work (And Break)

Самое важное:

In some cases, you may not want to expose a feature that has the same name as the optional dependency. For example, perhaps the optional dependency is an internal detail, or you want to group multiple optional dependencies together, or you just want to use a better name. If you specify the optional dependency with the dep: prefix anywhere in the [features] table, that disables the implicit feature.

Поэтому добавление фичи с указанием опциональной зависимости через dep: удаляет неявную одноимённую фичу, связанную с зависимостью, и из-за этого является потенциально ломающим изменением.

Добавление обнаружения этой ситуации в cargo-semver-checks потребовало довольно много работы, поскольку до этого вся кодовая база опиралась на предположение, что вся информация для проверок идёт из JSON, который выдаёт rustdoc. Эта же проверка требует смотреть в Cargo.toml и в набор фич, поскольку rustdoc генерирует документацию только для конкретного набора фич и потому не может дать информации о всех фичах в манифесте.
👍6😭2
Невыносимая лёгкость кошелька
😁12😭7😐61