Блог* @dereference_pointer_there Channel on Telegram

Блог*

@dereference_pointer_there


Блог со звёздочкой.

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

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here

Блог* (Russian)

Добро пожаловать в блог со звёздочкой! Этот канал на Telegram предлагает множество интересных репостов и немного программирования для тех, кто увлечён этой областью. Здесь вы найдете много полезной информации и возможность обсудить ее в небольшом, но дружелюбном комьюнити по программированию. Кроме того, наш канал связан с чатом @decltype_chat_ptr_t, где можно общаться с единомышленниками и делиться своим опытом. Автор канала - @insert_reference_here, который радует читателей своими умными и остроумными постами. Присоединяйтесь к нашему каналу и окунитесь в мир программирования и интересных обсуждений!

Блог*

13 Feb, 19:19


#suckassstory

Resigning as Asahi Linux project lead

Гектор Мартин снял с себя полномочия главы проекта Asahi Linux. Сам проект продолжит жить без его участия.

I cannot work with those who say I’m the problem and everything is going great, while major supporters and maintainers are actively resigning and I keep receiving messages from all kinds of people saying they won’t touch the Linux kernel with a 10-foot pole.

Блог*

13 Feb, 17:22


#prog #meme про null

Блог*

13 Feb, 12:39


Выяснилось, что гетеросексуальные люди не существуют.

Блог*

12 Feb, 21:51


Ну я

Блог*

12 Feb, 18:10


#prog #cpp #article

Carbon is not a programming language (sort of)

TL;DR: Carbon не столько про сам язык, сколько про процесс эволюции языка.

Блог*

12 Feb, 04:06


#game #meme

Блог*

11 Feb, 21:40


😒

Блог*

11 Feb, 18:27


На созвоне по работе на новом проекте сказали: "Давайте представимся, чтобы лучше понимать кто что делает. Я вот не знаю что делает Антон, но знаю, что его надо звать на все митинги". В общем, репутация сложилась крепкая. Работаем дальше.

Блог*

11 Feb, 18:01


#prog #rust #article

Revisiting random number generation

Автор сделал сайт для генерации случайных чисел, который работает на краудсорсинге. Сделал и забыл.

А спустя несколько месяцев о сайте рассказали на lobste.rs, и из-за внезапно свалившегося трафика ему пришлось этот сайт чинить. Статья рассказывает о том, как это происходило

Блог*

10 Feb, 20:51


#gamedev

Блог*

10 Feb, 20:51


"An Architectural Approach to Level Design" — первая книга про связь архитектуры и левел-дизайна, которая попалась мне в руки ещё в 2014 году, и с тех пор я считаю её одной из важнейших работ в этой сфере. Почему? Потому что она не просто учит применять архитектурные принципы в геймдизайне, но и позволяет взглянуть на архитектуру через призму видеоигр.

Левел-дизайн — это упрощённая модель архитектуры, где чётче видны её ключевые приёмы. Изучая, как пространство влияет на игрока, можно понять, какие элементы архитектуры действительно работают — и усилить их в реальном мире.

Автор книги, архитектор и геймдизайнер Кристофер Тоттен, рассматривает игровые уровни не просто как фон для геймплея, а как архитектурные пространства, формирующие нарратив и эмоции.

🔷 Архитектура в левел-дизайне
💜Как исторические здания помогают создавать эффективные игровые уровни.
💜Что из планировки, зонирования и направляющих линий можно перенести в геймдизайн.

😒 Как пространство управляет вниманием
💜 Визуальные символы, цвет, освещение и текстуры как инструменты навигации.
💜 Как эмоции игрока формируются через композицию уровней.

🐶 Повествование через пространство
💜 Как архитектура рассказывает истории без слов.
💜 Методы нарративного дизайна в игровых мирах.

👋 Городская среда и социальные взаимодействия
💜 Применение принципов урбанистики в мультиплеерных картах.
💜 Как левел-дизайн формирует способы взаимодействия игроков.

❤️ Музыка и звук как часть левел-дизайна
💜Как ритм и аудиодизайн влияют на восприятие пространства.

Тоттен объясняет базовые принципы проектирования, которые понятны и архитекторам, и геймдизайнерам. Это отличное чтение для всех, кто хочет глубже понять, как пространство влияет на восприятие человека — и в виртуальном, и в физическом мире.

Но самое интересное — через левел-дизайн можно переосмыслить саму архитектуру. Это зеркало, в которое архитектура может заглянуть и увидеть в своём отражении что-то новое.

Вся книга целиком доступна бесплатно в PDF по ссылке 🤓

Блог*

10 Feb, 17:52


#prog #python #suckassstory

Блог*

10 Feb, 17:52


добро пожаловать в питон, у нас в 2к25 до сих пор

Блог*

10 Feb, 14:17


Impossible

Блог*

10 Feb, 01:15


Кто скажет, что я выкладываю херню, тот будет абсолютно прав

Блог*

09 Feb, 18:59


notably, this does not compile
playground

Блог*

09 Feb, 18:59


the problem is that dbg!() expands to something like
match 42 { tmp => ..., }

where tmp now parses as a constant pattern instead of a variable binding

Блог*

09 Feb, 17:47


Мой мозг словно гений, он покончил с собой в молодости и больше не работает.

Блог*

08 Feb, 16:27


#itsec #suckassstory #suckassstory #suckassstory

Блог*

08 Feb, 16:27


Subaru ImpressUs, или как открыть машину, зная только ее номер

https://samcurry.net/hacking-subaru

Прочитал недавно вышедший баг-репорт Сэма Карри - очень крутого баг-баунти хантера, который специализируется на поиске уязвимостей в компаниях-производителях автомобилей.
Сэм рассказывает о том, как год назад купил маме Subaru Impreza нового поколения, к которой по умолчанию прилагается сервис “Starlink” - нет, не спутниковый интернет Маска, а всего лишь умная система управления машиной + ее отслеживания, что-то вроде Find My, но для машин.
Оказалось, что зная номера машины, через эту систему ее можно отследить, открыть и угнать без шума.

Как это часто бывает, самая опасная часть айти-системы - админка для сотрудников, так как защищена она бывает плохо (ну а кто зайдет), а возможностей там просто дохрена.
Вот и в этой истории обнаружилось, что в админке крайне уязвимая апишка, если конкретнее - есть эндпоинт “resetPassword”, который ведет себя вот так:


POST /forgotPassword/resetPassword.json HTTP/1.1
Host: portal.prod.subarucs.com

{
"email": "[email protected]",
"password": "Example123!",
"passwordConfirmation": "Example123!"
}


{
"error": "Invalid email"
}


Дело за малым - нужно найти подходящий емейл сотрудника.
Естественно, корп емейл у Субару, как практически у всех, имеет формат [first_initial][last]@subaru.com, так что достаточно найти ФИО любого сотрудника на линкдине.

Но все-таки, не может же все быть так легко?

И да, и нет.
Для того, чтобы пользоваться функционалом админки после того, как мы вошли туда, сбросив пароль, надо также ввести 2FA - в данном случае, секретный вопрос, вроде “имя первой собаки”. бтв, ужасное решение, никогда не делайте так )
Но вскоре выяснилось, что функционал 2FA реализован… на фронте.
То есть, просто закомментив на уже отрисованном сайте 1 строчку:
//$(‘#securityQuestionModal').modal('show’);, можно спокойно пользоваться всем функционалом сайта.

Итак, мы внутри админки. Что дальше?

Начнем с того, что сотрудник имеет доступ к данным всех покупателей в США, Канаде и Японии (пиздец) - и ему доступен поиск по фио, телефону, и даже номерам машины. Как пишет Сэм, сложно сделать систему безопасной, если в ней предусмотрен такой уровень доступа для любого 18-ти летнего интерна в компании.

Одна из возможностей сотрудника в админке - добавлять верифицированного пользователя в систему Starlink… без уведомления текущих оунеров и юзеров. Ни смс, ни письма на почту, вообще ничего!
То есть, имея доступ в админку, я могу выдать себе доступ к вашей машине, а вы этого даже не узнаете.

А из самой системы Старлинк, наконец, можно:

- Удаленно заводить и останавливать, открывать, закрывать и отслеживать машину. А еще бибикать :)
- Вытащить историю перемещений машины ЗА ПОСЛЕДНИЙ ГОД, размеченную по времени + с информацией о том, когда машину заводили и глушили.
- Получить все персональные данные владельца, включая имена других авторизованных пользователей, домашний адрес и т д.
Хотя кому нужен домашний адрес, когда есть годовая история всех перемещений…

Дальше Сэм с коллегой сделали proof of concept, объединив все находки в одну консольную утилиту: вводишь номер машины, тебя редиректит на Starlink с полным доступом к машине.
Посмотрите видео, это просто полный треш: https://youtu.be/0i8juy6RPBI.

Заключение

Если вы думаете, что такие приколы бывают только с Субару, то можете посмотреть на аналогичную историю с KIA, а также на открытую базу данных Volkswagen, в которой хранится история перемещения ВСЕХ машин марки, включая машины полицейских и сотрудников спецслужб.

А еще советую всем интересующимся посмотреть выступление Сэма на DEFCON (он взломал все модемы очень крупного интернет-провайдера) и подкаст Critical Thinking с его участием: там он, например, рассказывает, к чему приводят его находки (его недавно арестовали на границе в аэропорту и обвинили в какой-то жести. но все хорошо закончилось).

Блог*

08 Feb, 11:16


#meme про... Тьюринга

Src

Блог*

07 Feb, 21:40


A perfectly reasonable development workflow

(часть треда с патчами в drm_sched от Asahi Lina (которые по итогу не приняли))

Блог*

07 Feb, 17:32


Из чуть менее важных новостей: nom ориентирован больше на написание парсеров для машинно-читаемых форматов, где в приоритете быстродействие. Для написания парсеров конфигов и языков программирования больше нужны другие вещи, которые в библиотеке для написания парсеров общего назначения не очень уместны. С релизом nom 8 также появился новый крейт nom-language, в котором в дальнейшем и будет добавляться код под такие нужды.

В настоящий момент там две вещи. VerboseError собирает все ошибки дерева парсеров и потому больше подходит для диагностирования ошибок в человеко-читаемом формате. Функция precedence позволяет разбирать выражения, учитывая приоритеты операторов, без их кодирования в грамматике:

// пачка импортов, которые не имеет смысла показывать

fn parser(i: &str) -> IResult<&str, i64> {
precedence(
unary_op(1, tag("-")),
fail(),
alt((
binary_op(2, Assoc::Left, tag("*")),
binary_op(2, Assoc::Left, tag("/")),
binary_op(3, Assoc::Left, tag("+")),
binary_op(3, Assoc::Left, tag("-")),
)),
alt((
map_res(digit1, |s: &str| s.parse::<i64>()),
delimited(tag("("), parser, tag(")")),
)),
|op: Operation<&str, &str, &str, i64>| {
use nom_language::precedence::Operation::*;
match op {
Prefix("-", o) => Ok(-o),
Binary(lhs, "*", rhs) => Ok(lhs * rhs),
Binary(lhs, "/", rhs) => Ok(lhs / rhs),
Binary(lhs, "+", rhs) => Ok(lhs + rhs),
Binary(lhs, "-", rhs) => Ok(lhs - rhs),
_ => Err("Invalid combination"),
}
}
)(i)
}

assert_eq!(parser("8-2*2"), Ok(("", 4)));
assert_eq!(parser("4-(2+2)"), Ok(("", 0)));
assert_eq!(parser("3-(2*3)+7+2*2-(2*(2+4))"), Ok(("", -4)));


(Если вы задаётесь вопросом, что там делает fail: этот аргумент функции precedence описывает, как парсить постфиксные выражения. В этой грамматике постфиксных операторов нет, поэтому попытка распарсить что-то, как постфиксное выражение, должно всегда завершаться ошибкой)

Блог*

07 Feb, 17:32


#prog #rustlib #article

parser combinators with nom 8 are here!

(восьмая мажорная версия — это прям дофига для Rust-библиотек)

Geoffroy Couprie рассказывает о новой архитектуре nom. В этой версии он позаимствовал из chumsky подход к архитектуре парсеров. Про этот подход ещё в 2022 году писал Niko Matsakis в статье Many modes: a GAT pattern, которая демонстрировала, как GAT могут пригодиться в реальных библиотеках, и таким образом обосновывала необходимость иметь GAT в языке.

В nom 8 парсером является то, что реализует трейт Parser. Вот как выглядит его определение за вычетом методов с реализацией по умолчанию:

trait Parser<Input> {
type Output;
type Error: ParseError<Input>;

fn process<OM: OutputMode>(
&mut self,
input: Input,
) -> PResult<OM, Input, Self::Output, Self::Error>;
}


Параметр OM реализует трейт OutputMode, реализации которого являются фактически type-level конфигом парсера:

trait OutputMode {
type Output: Mode;
type Error: Mode;
type Incomplete: IsStreaming;
}


Трейт Mode является ключом к новым возможностям. Реализации этого трейта позволяют абстрагироваться над "выходом парсера, имеющего отношение к T":

trait Mode {
type Output<T>;
// методы для комбинирования и преобразовывания Output
}


Для чего всё это нужно? Дело в том, что в nom есть комбинаторы, которые используют переданный аргументом парсер, но при этом не используют то, что этот парсер выдаёт в качестве результата. В качестве примера таких комбинаторов можно назвать preceded и delimited. Если конструирование значения является дорогим (скажем, это условный separated_list0, который собирает результаты разбора под-парсеров в вектор), то запускать парсер только ради того, чтобы отбросить его значение, будет довольно расточительно.

В самом nom определены два типа, которые реализовывают Mode: Emit и Check. Emit реализовывает Mode с type Output<T> = T, то есть парсер работает, как обычно. Check же реализовывает Mode с type Output<T> = (), то есть парсер работает, но отбрасывает результаты. Именно такое поведение годится для комбинаторов, которым не нужен результат под-парсера. Так как конечный парсер имеет методы, обобщённые по параметру OM, реализующему OutputMode, парсер не может сконструировать результат напрямую, а вынужден использовать для этого методы Mode, определённые на OM::Output. В случае Emit эти методы просто применяют переданные функции к аргументам, а для Check эти методы просто дропают переданные функции и возвращают ().

Так как ошибка парсера тоже может дорого конструироваться, тип OutputMode::Error по аналогичным причинам также реализует Mode. Это нужно, например, для opt, который делает парсер опциональным и по понятным причинам отбрасывает и разобранный результат, и ошибку.

Как вы могли заметить, у OutputMode также есть параметр Incomplete, реализующий трейт IsStreaming. Он отвечает за то, является ли недостаточный вход фатальной ошибкой или же одним из вариантов ошибки, от которой можно восстановиться. Раньше почти каждый базовый комбинатор nom существовал в двух версиях: streaming и complete. Это было нежелательно по нескольким причинам, главная из которых — разные сорта парсеров очень легко перепутать при написании своих парсеров и потом долго ловить непонятные ошибки. Ещё одним нежелательным следствием этого подхода стало, очевидно, дублирование кода. Разные версии этих парсеров по разному обрабатывали неполный вход, но за вычетом этого аспекта логика там была одинаковая.

Новый подход позволяет написать ветвление по OM::IsIstreaming::is_streaming() и обработать оба варианта в одной функции, естественным образом собирая разные варианты реагирования на ошибку неполного входа в одном месте. Так как в nom оба типа, реализующих IsStreaming — Streaming и Complete — в соответствующих методах просто возвращают true и false соответственно, компилятор может увидеть ветвление по константному значению и просто убрать одну из веток, избежав генерации ненужного кода.

Блог*

06 Feb, 23:09


Bait and switch

Блог*

06 Feb, 21:52


https://stackoverflow.com/questions/39863255/repz-ret-why-all-the-hassle
Процессорная архитектура - это магия. Без шуток.

(речь в вопросе о том, что в сгенерированном компилятором коде (и не только) нередко можно встретить вместо обычной инструкции RET (возврат из функции) бессмысленно выглядящую конструкцию REPZ RET (REPZ повторяет инструкцию после неё определённое кол-во раз и актуальна только для работы со строками; для RET она, очевидно, ничего не делает, это всё равно, что написать while(true) { return; })

Блог*

06 Feb, 20:24


Fuck Zodiac signs.

Tell me your TF2 class.

Блог*

06 Feb, 19:02


Блог* pinned «»

Блог*

06 Feb, 18:53


#music

Больше всего, конечно, пытался выбить S+ с full combo на Ravevenge

Блог*

06 Feb, 18:50


#game

Вчера вышла Rift of the Necrodancer, спинофф Crypt of the Necrodancer. Эта игра ближе к традиционным ритм-играм, но при этом всё равно имеет свои фишки, перешедшие из прошлой игры.

Брать, скорее всего, стоит — я в своё время демку с жалкими четырьмя треками до дыр заиграл, а на фестивале Steam next fest демка вошла в топ 50 наиболее играемых (из более чем 3000!).

Ну и да, до 11 февраля на игру скидка 10%.

Блог*

06 Feb, 17:59


Решил протестировать сборку компилятором из коробки на Apple M1 Pro vs Ryzen 9 7900X3D (конечно же не холивара ради):

- Finished `release` profile [optimized] target(s) in 1m 47s
- Finished `release` profile [optimized] target(s) in 4m 35s

Угадайте какой процессор где?

Ответ: M1 4 минуты против AMD за 1 минуту

Блог*

05 Feb, 19:49


Кого-то всё-таки достало

Блог*

05 Feb, 19:24


В калькуляторе Windows 11 есть построение графиков а-ля Desmos.

Я даже не могу затянуть старую песню про bloatware, это неиронично круто.

Блог*

04 Feb, 19:00


Нашел золото: перевод слова "Нет" на офисный булшит.

Избранное (жизненное):
- Interesting idea, let's explore that next quarter
- What problem are we trying to solve?
- Let’s gather more data before moving forward
- Let’s keep this in mind for future consideration

Блог*

03 Feb, 16:08


Шаман и Мизулина поцеловались. Теперь официально можно сказать, что они могут трансформироваться в сушество по имени Шизулина.

#mems

Блог*

02 Feb, 22:22


#prog #meme про FP vs OOP

Блог*

02 Feb, 06:13


Я тут подумал, что если у вас, дорогие подписчики и не только, есть какой-то проект (+/- релевантный с тематикой канала: железо, код, журналы, инфраструктура, игры и т.д. и т.п.), то пишите мне в личку @rusdacent, я буду рассказывать о них. Мне оно не сложно, а вдруг кому-то полезно и интересно будет.

Днём проектов объявляю четверг!

Так что если чего будет публиковать, то по четвергам буду выкладывать посты о вас и ваших проектах ❤️

Давно хотел такое заанонсить, но чего-то всё забывал, а тут и момент подходящий.

Блог*

01 Feb, 15:25


✍️ кек #vercheniye_advice

Блог*

01 Feb, 13:48


Ах да, #abnormalprogramming

Блог*

01 Feb, 13:47


Ждём, когда запустят DoomPDF в LinuxPDF
Разработчик под ником ading2210 представил проект LinuxPDF — Linux в PDF в браузере. Проект открывается только в браузерах на базе Chromium, использующих движок PDFium. Код написан на C и опубликован на GitHub по лицензией GNU General Public License v3.0.

«Это Linux, работающий внутри PDF‑файла через эмулятор RISC‑V, основанный на TinyEMU», — пояснил автор решения.
. . .
Полная спецификация для JS в PDF была реализована только Adobe Acrobat, и она содержит некоторые нелепые вещи, такие как возможность выполнять 3D-рендеринг, делать HTTP-запросы и обнаруживать каждый монитор, подключенный к системе пользователя. Однако в Chromium и других браузерах была реализована только крошечная часть этого API из-за очевидных проблем безопасности. Благодаря этому мы можем выполнять любые вычисления, которые захотим, просто с очень ограниченным вводом-выводом.

Код C можно скомпилировать для запуска в PDF с использованием старой версии Emscripten, которая нацелена на asm.js вместо WebAssembly. С его помощью я могу скомпилировать модифицированную версию эмулятора TinyEMU RISC-V в asm.js, который можно запустить в PDF. Для ввода и вывода я повторно использовал тот же код отображения, который я использовал для DoomPDF. Он работает, используя отдельное текстовое поле для каждой строки пикселей на экране, содержимое которого задаётся различными символами ASCII. Для ввода есть виртуальная клавиатура, реализованная с кучей кнопок, и текстовое поле, в котором вы можете ввести текст, чтобы отправить нажатия клавиш в виртуальную машину.

Самая большая проблема здесь связана с производительностью эмулятора. Например, ядру Linux требуется около 30-60 секунд для загрузки в PDF, что более чем в 100 раз медленнее, чем обычно. К сожалению, нет способа исправить это, поскольку версия V8, которую использует движок PDF Chrome, имеет отключённый JIT-компилятор, что разрушает его производительность.

Для корневой файловой системы возможны как 64-, так и 32-битные версии. По умолчанию используется 32-битная система buildroot (которая была предварительно собрана и взята из оригинальных примеров TinyEMU), а также 64-битная система Alpine Linux. Однако 64-битный эмулятор примерно в два раза медленнее, поэтому обычно он не используется.

Представлен проект LinuxPDF — Linux в PDF в браузере
https://habr.com/ru/news/878542/

GitHub
https://github.com/ading2210/linuxpdf

Demo
https://linux.doompdf.dev/linux.pdf

Он же в прошлом году запускал DOOM на POS-терминале
https://t.me/tech_b0lt_Genona/4308

А недавно в PDF
https://github.com/ading2210/doompdf

Блог*

01 Feb, 03:30


Зачем вообще в русском языке "жениться" и "выйти замуж"? Они означают по факту одно и то же, но при этом:

— Одно — просто глагол, второе — устойчивое словосочетание, глагол с дополнением.
— У них разные корни.
— Они требуют разных падежей от прямых дополнений (предложный и винительный).

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

Для сравнения, в английском языке есть глагол "marry", и он абсолютно симметричен при употреблении к обоим партнёрам.

Блог*

31 Jan, 23:03


В СМЫСЛЕ УЖЕ ФЕВРАЛЬ

Блог*

31 Jan, 18:38


#kbd

Блог*

31 Jan, 18:12


#kbd

Блог*

31 Jan, 17:53


Этим человеком на табуретке был я

Блог*

31 Jan, 17:53


#meme-открыточка любителям вахи:

Блог*

31 Jan, 16:31


#prog #rust #rustlib

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

Блог*

30 Jan, 19:19


#prog #rust #article

Prototyping in Rust

I’ve found that my prototypes in other languages often hit a wall where I need to switch to something more robust. With Rust, I can start simple and gradually turn that proof-of-concept into production code, all while staying in the same language and ecosystem.

Блог*

30 Jan, 19:02


— Слушай, а почему ты никогда свою помощь мне не предлагаешь?
— А то я тебя не знаю: если тебя спросить, можно ли тебе помочь, ты не вежливо откажешься, а реально скажешь, чем тебе можно помочь.

Блог*

30 Jan, 03:32


Блог* pinned «Блог*: высокоинтеллектуальный контент. ...иногда»

Блог*

30 Jan, 03:32


Блог*: высокоинтеллектуальный контент.

...иногда

Блог*

30 Jan, 03:04


put.buttplug.in

Блог*

28 Jan, 16:30


Да, плюсовики тоже ругают плюсы. Но растовики их ругают, потому что у них скилл ишью. А плюсовики — потому что скилл ишью

Блог*

28 Jan, 12:28


Китайский ИИ DeepSeek за один день покорил Уолл-Стрит, потому что упорно отказывается программировать на С++, а значит имеет сознание

Блог*

27 Jan, 15:15


Real-Time Trading Signals aka dev/urandom as a Service

Блог*

23 Jan, 16:50


#prog #amazingopensource

DWARF Explorer (dwex)

A cross-platform GUI utility for visualizing the DWARF debugging information in executable files, built on top of pyelftools and filebytes. Runs on Windows, MacOS X, and Linux.

Ввиду того, что написано на Python, пользоваться этим может быть не очень удобно, особенно на Windows.

Блог*

23 Jan, 16:45


#prog #article

The hunt for error -22

Детективная история про гейзенбаг и его фикс. Железо, на котором был баг — модем с двумя ядрами. Одно может использовать пользовательское firmware (в данном случае написанное на Rust), а второе может использовать только пропиетарную прошивку от производителя. Прошивка поставляется исключительно в виде набора интерфейсных заголовочных файлов и блоба скомпилированного сишного кода.

TL;DR: "No way to prevent this, says only language where this regularly happens"

Блог*

23 Jan, 16:11


#prog #db

DBReader — программа для чтения файлов баз данных напрямую, без поднятия сервера БД

Блог*

23 Jan, 16:04


И нет, мне не жалко, GCC-rs и так непонятно кому нужен

Блог*

23 Jan, 13:45


#rust #meme про gcc-rust

Блог*

22 Jan, 15:36


#prog #meme про scratch

Блог*

21 Jan, 20:40


Любишь деньги? 💸🔥😏 Тогда почему не меня? 🥺

Блог*

21 Jan, 18:23


Истории от коллег

Блог*

21 Jan, 16:08


История одного дебага.

https://marcan.st/2017/12/debugging-an-evil-go-runtime-bug/

TL;DR - как определенное сочетание опций сборки ядра и версий GCC ломало go runtime.

Блог*

21 Jan, 13:30


#meme про бекон против женщин

Блог*

20 Jan, 19:18


Невыносимая лёгкость кошелька

Блог*

20 Jan, 16:58


#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 генерирует документацию только для конкретного набора фич и потому не может дать информации о всех фичах в манифесте.

Блог*

20 Jan, 14:23


И ещё пачка #prog #abnormalprogramming от этого же человека:

Чат, работающий на одном CSS на клиенте

Спеллчекер на тайпчекере Typescript (так что, видимо, #typescript?)

База данных на вкладках браузера

Блог*

20 Jan, 14:10


#prog #abnormalprogramming #article

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

Работает без базы данных, если что

Блог*

19 Jan, 20:12


#prog #ml #article

Can LLMs write better code if you keep asking them to “write better code”?

TL;DR: да, но это не монотонный процесс.

Блог*

19 Jan, 19:36


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 не заработало. Было ожидаемо 🌝

Блог*

19 Jan, 19:36


#prog #game #abnormalprogramming

Блог*

07 Jan, 14:02


A/B testing — Anton bisexual testing

Блог*

07 Jan, 13:44


(не моё)

Как называется самолёт, перевозящий фембоев?

Фембоинг

Блог*

07 Jan, 10:17


#prog #csharp #c #python #meme

Блог*

06 Jan, 14:17


#prog #java #meme

Блог*

06 Jan, 13:08


🛷Gay_Mems

Блог*

05 Jan, 22:53


#prog #typescript #article

How types make hard problems easy (перевод)

Статья ценна тем, что демонстрирует выгоды на Typescript и относительно реалистичных примерах. Отправьте знакомому фронтендеру, может, научиться программировать наконец

Блог*

05 Jan, 22:22


#prog #article

Preemptive Pluralization is (Probably) Not Evil

Before you write any code — ask if you could ever possibly want multiple kinds of the thing you are coding. If yes, just do it. Now, not later.

<...>It is a LOT easier to scale code from a cardinality of 2 to 3 than it is to refactor from a cardinality of 1 to 2. This is a fundamentally under-appreciated nonlinearity. In other words, Preemptive Pluralization can make the difference between “sure, I’ll add that today” and “this is going to take us 2 months and we’ll introduce merge conflicts with every other in-progress feature.”

Блог*

05 Jan, 20:56


#ml #article

The Bitter Lesson

Прочитайте, если вы хоть немного заинтересованы в машинном обучении, это весьма короткий текст.

The biggest lesson that can be read from 70 years of AI research is that general methods that leverage computation are ultimately the most effective, and by a large margin.

<...>researchers always tried to make systems that worked the way the researchers thought their own minds worked---they tried to put that knowledge in their systems---but it proved ultimately counterproductive, and a colossal waste of researcher's time, when, through Moore's law, massive computation became available and a means was found to put it to good use.

<...>We want AI agents that can discover like we can, not which contain what we have discovered. Building in our discoveries only makes it harder to see how the discovering process can be done.

Блог*

05 Jan, 20:49


#prog #ml #article

Reverse Engineering a Neural Network's Clever Solution to Binary Addition (перевод)

<...> So, I started trimming the network down - removing layers and reducing the number of neurons in each layer.

To my continued surprise, it kept working! At some point perfect solutions became less common as networks become dependent on the luck of their starting parameters, but I was able to get it to learn perfect solutions with as few as 3 layers with neuron counts of 12, 10, and 8 respectively. That's just 422 total parameters!


Автор ожидал, что нейросеть изобретёт что-то вроде двоичного сумматора. Он ошибся.

Блог*

05 Jan, 20:19


#prog #article #abnormalprogramming

Can you fit Minecraft in a QR code?

Answer: Yes! Here it is:

Блог*

05 Jan, 16:39


Официантка сделала комплимент моим ноготочкам 🥰

Блог*

05 Jan, 16:33


Дегенеративное поделие Паши Дурова, в котором я сейчас посщу, настойчиво отказывает мне в загрузке видео с котами через Bot API, после того, как мне пришлось перелезть через три костыля, чтобы заставить инлайн-бот работать

Других новостей у меня для вас нету

Блог*

05 Jan, 13:39


Я здесь

Блог*

04 Jan, 15:02


С сегодняшнего дня этот канал доступен только пользователям Telegram

Блог*

04 Jan, 10:10


Почему "наложить на себя руки" в русском языке — это про суицид, а не мастурбацию?

Блог*

03 Jan, 15:34


Как же тяжело яндексу даётся иметь больше одного приложения. Вот, уведомление про кино зачем-то в приложении недвижимости завели

Ну ничего, объединят всё в яндекс гооол — заживут

Блог*

03 Jan, 15:28


Я плохо понимаю, как вообще создаются инди-видеоигры.

Почему? Потому что инди-игры делают в основном художники и программисты. При этом художники не умеют программировать, а программисты не умеют делать собственно игру вместо игрового движка.

Блог*

03 Jan, 10:30


Статический анализ GitHub Actions

Сразу после релиза новой версии линтера, я задался вопросом обновления своего шаблона для создания новых питоновских библиотек: https://github.com/wemake-services/wemake-python-package

И я понял, что я несколько отстал в вопросе стат анализа GitHub Actions и прочей инфраструктуры.
Расскажу о своих находках.

pre-commit ci

Все знают про пакет pre-commit? Несколько лет назад он получил еще и свой собственный CI, который умеет запускаться без дополнительного конфига. И автоматически пушить вам в ветку любые изменения. Что супер удобно для всяких ruff / black / isort и прочего. У нас такое стоит в большом количестве проектов. Вот пример из typeshed. Вот что поменялось автоматически.

Строить CI на базе pre-commit очень удобно, потому что тебе просто нужно скопировать пару строк в конфиг. А плюсов много:
- Автоматически исправляются многие проблемы
- Автоматически запускается CI, 0 настроек
- Локально все тоже работает одной командой: pre-commit run TASK_ID -a

actionlint

Первый раз я увидел actionlint внутри CPython и затащил его в mypy. Actionlint на #go, он предлагает набор проверок для ваших GitHub Actions от безопасности до валидации спеки вашего yml. Довольно полезно, позволяет найти много мест для улучшений.


test.yaml:3:5: unexpected key "branch" for "push" section. expected one of "branches", ..., "workflows" [syntax-check]
|
3 | branch: main
| ^~~~~~~
test.yaml:10:28: label "linux-latest" is unknown. available labels are "macos-latest", ..., "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file [runner-label]
|
10 | os: [macos-latest, linux-latest]
| ^~~~~~~~~~~~~
test.yaml:13:41: "github.event.head_commit.message" is potentially untrusted. avoid using it directly in inline scripts. instead, pass it through an environment variable. see https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions for more details [expression]
|
13 | - run: echo "Checking commit '${{ github.event.head_commit.message }}'"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Даже умеет автоматом shellcheck запускать на ваши run: скрипты!

zizmor

Исходники. Уже на #rust, он более злой. Делает похожие вещи: находит проблемы безопасности. Находит много проблем.

Вот пример, сколько всего он нашел в mypy.


warning[artipacked]: credential persistence through GitHub Actions artifacts
--> mypy/.github/workflows/mypy_primer.yml:37:9
|
37 | - uses: actions/checkout@v4
| _________-
38 | | with:
39 | | path: mypy_to_test
40 | | fetch-depth: 0
| |________________________- does not set persist-credentials: false
|
= note: audit confidence → Low

error[dangerous-triggers]: use of fundamentally insecure workflow trigger
--> mypy/.github/workflows/mypy_primer_comment.yml:3:1
|
3 | / on:
4 | | workflow_run:
... |
7 | | types:
8 | | - completed
| |_________________^ workflow_run is almost always used insecurely
|
= note: audit confidence → Medium


check-jsonschema

Еще есть вот такой проект, он в основном полезен за счет доп интеграций: можно проверять dependabot.yml, renovate.yml, readthedocs.yml и многое другое.

Ставится просто как:


- repo: https://github.com/python-jsonschema/check-jsonschema
rev: 0.30.0
hooks:
- id: check-dependabot
- id: check-github-workflows


Выводы

Как всегда – статический анализ многому меня научил. Я узнал много нового про безопасность GitHub Actions, про вектора атаки, про лучшие практики. А сколько проблем в ваших actions?

Скоро ждите весь новый тулинг в python шаблоне v2025 😎

Блог*

27 Dec, 20:32


Куплю на Новый год много шоколадных яиц

Съем их все

И буду говорить, что полон сюрпризов

Блог*

27 Dec, 15:41


#prog #rust #article

Four limitations of Rust's borrow checker

In this post, I’ll cover four surprising limitations of the borrow checker that I ran into in the course of my work.

Also note that when I say something can’t be done, I mean that it can’t be done in a way that leverages Rust’s type system, i.e. with static type checking.
<...>. It’s never the case that you literally can’t solve a problem at all, since there are always those escape hatches (and I’ll even show examples of an escape hatch I used below), but it is impossible to solve the problem in a way that makes Rust Rust.

Блог*

27 Dec, 13:53


"Маленький принц" Антуана де Сент-Экзюпери очень переоценён

Блог*

27 Dec, 12:55


Итоги года для канала "Блог*" от @TGStat

Блог*

27 Dec, 08:32


#meme про споры

Блог*

26 Dec, 21:20


#music

Это эпично

youtube.com/watch?v=66M8NwkRmew

Блог*

26 Dec, 17:43


Короче.
У нас по соседству с кладбищем находится цирк.
И если это не объясняет всю нашу жизнь, то что тогда.

Блог*

26 Dec, 09:30


#prog #rust #article

Thoughts on Rust hashing

Или о том, как дизайн API для хеширования в Rust напрямую ведёт к неэффективностям.

Блог*

25 Dec, 22:19


Блог* pinned «#prog #article Storing currency values: data types, caveats, best practices This article is not the final source of the truth, but it contains useful information that you should take into consideration when designing software. (thanks @badassorange)»

Блог*

25 Dec, 18:09


#prog #article

Storing currency values: data types, caveats, best practices

This article is not the final source of the truth, but it contains useful information that you should take into consideration when designing software.

(thanks @badassorange)

Блог*

25 Dec, 17:18


#meme про меня, буквально. И я уверен в этом, потому что мой email содержит число 10 — мой возраст, когда я его создавал. А это мой главный аккаунт в Google, между прочим, у меня к нему смартфон привязан

Блог*

25 Dec, 13:50


#prog #rust хайлайты

Пару недель назад из лексера убрали зависимость от парсера. Почему эта зависимость была? Один из методов для восстановления от незакрытого разделителя полагался на создание временного парсера для того, чтобы давать диагностику получше. Как следствие, после этого изменения для парочки крайних случаев качество диагностик несколько снизилось.

Блог*

25 Dec, 13:42


#meme
https://t.me/rational_memology/2967

Блог*

24 Dec, 21:38


#ml #suckassstory?

Блог*

24 Dec, 20:42


#video

Рейган рассказывает советские анекдоты

Блог*

24 Dec, 16:37


#этотравля #vercheniye_season

Блог*

23 Dec, 07:32


#банантона

Блог*

22 Dec, 18:33


#prog #article (и #performancetrap, видимо?)

The RAM myth (перевод)

Или о оптимизационных трюках, которые позволяют шардировать данные в RAM значительно быстрее наивного подхода (спойлер: они лучше утилизируют кэш). Бенчмарки наглядно показывают, насколько неадекватным является представление о RAM как о линейной памяти с константным доступом.

Блог*

22 Dec, 16:56


#prog #article

Bunnyhopping from the Programmer's Perspective

Или про то, как реализовать багофичу "банни-хопинг" в коде

Блог*

22 Dec, 16:19


https://www.ryanliptak.com/blog/every-rc-exe-bug-quirk-probably/

Не знаю, как вы, а я просто обожаю такие посты.

Здесь автор попытался написать альтернативную реализацию компилятора ресурсов Windows. Это программа, которая принимает текстовый .rc файл с описанием менюшек, кнопочек, окошек, иконок, курсоров и прочего, и компилирует это описание в бинарный .res файл, который потом встраивается в бинарник приложения под Windows.

Альтернативных реализаций компилятора ресурсов много, но у автора была цель, которой не добивались остальные: написать все на новом модном современном Zig как можно точнее сохранить совместимость с оригинальной версией от Microsoft, вплоть до багов и незадокументированного поведения.

Как достичь этой цели? Например, можно написать код, а затем пофаззить оригинальную реализацию с альтернативной и найти, на каких данных они выдают разные результаты. В результате этого процесса автор нашел горы странного поведения в компиляторе ресурсов от Microsoft.

Пост длинный; если хотите посмотреть только самое интересное, можно поискать по странице по словам utterly baffling. Если же у вас много времени и вам не лень, можно прочесть и все :)

Блог*

22 Dec, 15:49


⚡️Хочешь крутить слоты 🎰 ПРЯМО В TELEGRAM? 💎🥵🥵

Если да, то... Что с тобой, блин, не так?

Блог*

22 Dec, 14:08


Еще про проклятые фичи баша

https://yossarian.net/til/post/some-surprising-code-execution-sources-in-bash

tl;dr: вот эта функция на баше при передаче «правильного» аргумента может привести к выполнению произвольного кода:
function guess() {
num="${1}"
if [[ "${num}" -eq 42 ]]
then
echo "Correct"
else
echo "Wrong"
fi
}


Мораль проста: не пишите на баше не передавайте в bash-скрипты недоверенные данные

Блог*

22 Dec, 13:29


Сейчас мы можем делать все, что захотим, но скоро Бог будет судить нас.

Блог*

22 Dec, 08:00


Жалобы на пустопорожние ТГ-каналы (которые я полностью разделяю): https://t.me/trueresearch/1899
Не репостом, потому что пост крупноват.

(thanks @tech_priestess)

Блог*

07 Dec, 12:44


В этом году уже седьмого числа(

Блог*

07 Dec, 12:24


Блин, надо зарабатывать на жизнь. Лучше закричать.

Блог*

06 Dec, 18:53


Три уровня погружения в статическую типизацию:


sqlx::query("SELECT keys.hex");
...
let key = row.try_get(hex)?;



sqlx::query!("SELECT keys.hex");
...
let key = Key::from_hex(row.hex)?;



sqlx::query!(r#"SELECT keys.hex as "hex: Key""#);
...
let key = row.hex;

Блог*

06 Dec, 17:38


a16z выкатили примечательный блогпост про big ideas in tech 2025.

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

Блог*

05 Dec, 11:34


#meme

За что так точно 😢

Блог*

05 Dec, 11:34


#нуя #этотравля

Блог*

04 Dec, 22:15


#prog #rust хайлайты

We are currently unconditionally verifying the LLVM IR in the backend (twice), ignoring the value of the verify-llvm-ir option. This has substantial compile-time impact for debug builds.

На скриншоте — результаты бенчмарков после мерджа.

github.com/rust-lang/rust/pull/133499

Блог*

03 Dec, 18:34


ИИ - это не только ценный смех, это еще и способ вернуть возможность говорить немым пациентам.

Говорить - это доводить до озвучки свои попытки в голове что-то сказать.

Если эксперимент удастся воспроизвести на более разнообразных текстовых данных, а не только для тех, что использовались в статье, то это (мне кажется) невыносимо круто, учитывая заявленную точность в 90% и выход на 97% после дотренировки.

Если на TLDR-пальцах:
Человеку имплантировали 4 электрода, которые регистрировали его нейроактивность. За 30-минут обучили ИИ превращать эти сигналы в текст. Текст озвучили с помощью text-2-speech. Это на словарном запасе 50 слов.
Но.
Потренировали еще полтора часа и вот уже словарный запас 125 000 слов (больше чем у любого школьника) и точность 90.2 процента.

Как тут не вспомнить про пластичность мозга, который может использовать новые сигналы взамен потерянных (кохлеарные имплантанты, писал тут 1 2 3), чтобы расшифровывать их в нужный канал восприятия (слух речь).
ИИ и есть эта пластичность в данном примере.

Для гиков.
Пациенту была проведена хирургическая имплантация четырех микроэлектродных массивов в левую прецентральную извилину, которые регистрировали нейронную активность с 256 внутрикорковых электродов. Такой нейропротез, декодировал его нейронную активность, когда он пытался говорить в условиях как заданной, так и неструктурированной беседы. Декодированные слова отображались на экране, а затем озвучивались с помощью text2speech. В первый день использования системы, после 30 минут попыток обучения речи, нейропротез достиг точности 99.6% при словарном запасе в 50 слов. На второй день объем возможного словарного запаса увеличился до 125 000 слов, и после 1.4 дополнительных часов обучения нейропротез достиг точности 90.2%. При дальнейшем обучении нейропротез сохранял точность 97.5% в течение восьми месяцев после хирургической имплантации. Участник использовал нейропротез для самостоятельного общения в течение более 248 часов. У человека с ALS и тяжелой дизартрией внутрикорковый речевой нейропротез достиг уровня производительности, пригодного для восстановления естественного общения, после короткого периода обучения.

Когда Маск сделает свою иголочку доступной на уровне амбулаторного укола в голову для всех, можно будет набирать текстовые сообщения молча. Нет, общаться с chatGPT молча. А еще круче - тихие Zoom-коллы. Все сидят в наушниках и молчат.

Если вы думаете, что все это шуточки, поглядите видео:
https://www.youtube.com/watch?v=thPhBDVSxz0

Немного не по себе после просмотра.
https://pubmed.ncbi.nlm.nih.gov/38645254/

А, самое значимое, код есть на Гитхабе.

@cgevent

Блог*

02 Dec, 17:32


#web #meme (и, пожалуй, #suckassstory)

5snb.club/posts/2023/do-not-stab

(thanks @installationwizard)

Блог*

01 Dec, 20:21


Пара новостей про Хабр.

1. На Хабре теперь есть эмодзи для статей.

2. Часть из них залочены за сторонним рекламным квестом.

Блог*

01 Dec, 19:57


Напоминаю

Блог*

01 Dec, 10:14


И да, раз декабрь начался, знаете, что это означает? Всё правильно, это означает Advent of code

Блог*

01 Dec, 10:13


В СМЫСЛЕ УЖЕ ДЕКАБРЬ

Блог*

30 Nov, 15:08


Последние полторы недели я пилила Lithium — крейт для работы с исключениями в расте.

Exceptions? In my monadic language? It's more likely than you think!

Исключения хороши тем, что они, по сравнению с Result, добавляют меньше оверхеда в success path, и поэтому, если ошибки случаются достаточно редко, оказывается выгодным их использовать для передачи ошибок.

Если оставить в стороне вопрос идиоматичности, проблем с исключениями в Rust две: эргономика и производительность. К решению их обеих Lithium подступается, но не завершает, потому что это низкоуровневый крейт с фиксированным скоупом, который должен стать одним кирпичиком, а не быть идеальным решением.

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

- Эргономика

Для эргономики предоставляются функции throw и catch, аналогичные конструкциям из других языков. throw бросает произвольный T, catch ловит произвольный T, никакой проверки типов нет.

С одной стороны — это требует делать функции unsafe, с другой — если смотреть на существующий растовый код, опирающийся на Result, то там это требование всегда исполняется, поэтому проверка типов только добавила бы оверхед.

По сравнению с Rust-паниками снимается еще одно требование — бросаемый тип не обязан быть Send + 'static, поэтому можно спокойно бросать, например, ссылки на Cell.

- Производительность

Для производительности пробрасывание исключений идет через наиболее низкоуровневые доступные API, а не через panic!. В случае большинства платформ это Itanium EH, на Windows это SEH. Это несколько уменьшает оверхед от вызовов, а также в большинстве случаев позволяет снизить количество аллокаций до нуля.

В API есть еще одна особенность: интерфейс позволяет поймать исключение, промодифицировать его payload и перевыбросить исключение более эффективно, чем в два шага через catch + throw. Такое переиспользование буфферов тоже несколько увеличивает перф.

Итоговый результат — на большинстве платформ идиоматичный код на Lithium работает в 2.5 раза быстрее идиоматичного кода на паниках, не теряя в экспрессивности.

Блог*

28 Nov, 22:59


Пока готовил список — узнал, что есть нестабильная фича для того, чтобы указывать выравнивание для функций

Блог*

28 Nov, 22:53


#prog #rust #rustreleasenotes

Вышла версия Rust 1.83.0! Как всегда, тут только избранные части, а всё остальное в детальных заметках.

▪️В const-контекстах теперь можно использовать &mut-ссылки, а также &-ссылки на типы с внутренней изменяемостью!

const fn inc(x: &mut i32) {
*x += 1;
}

const C: i32 = {
let mut c = 41;
inc(&mut c);
c
};


Написание const-кода серьёзно упростилось. Само итоговое значение константы, впрочем, не может быть изменяемой (в том числе через внутреннюю изменяемость) ссылкой.

Также итоговое значение константы теперь может содержать &-ссылку на static, если в типе нет внутренней изменяемости.

static S: i32 = 25;
const C: &i32 = &S;


По понятным причинам итоговое значение константы не может содержать изменяемую (в том числе через внутреннюю изменяемость) ссылку на static.

▪️Как прямое следствие предыдущего пункта — кучу функций можно теперь использовать в const-контексте, включая множество операций над сырыми указателями (в том числе NonNull) и различные функции для разбиения мутабельных слайсов на части.

▪️Также стабилизировали кучу новых вариантов io::ErrorKind. Забавный факт: эти варианты были и раньше и использовались в std, и в теории по ним можно было матчиться, используя реализацию Display. Ещё забавный факт: стабилизацию всех этих вариантов и ещё некоторых запланировали 23 месяца назад, но первый PR со стабилизацией застопорился из-за некоторых вариантов, которые были слишком специфичны для конкретных операционных систем. Собственно, новый PR со стабилизацией приняли лишь потому, что эти варианты из списка на стабилизацию выкинули.

▪️Ещё в число стабилизированных API вошли hash_map::{Entry, VacantEntry}::insert_entry. Эти методы вставляют переданное значение, но, в отличие от insert возвращают не мутабельную ссылку на значение, а OccupiedEntry.

▪️Одновременные атомарные и неатомарные доступы на чтение из одной локации в памяти одного размера теперь не считаются гонкой данных и потому не являются UB (в C++ — является, поскольку атомарные доступы в C++ происходят через создание atomic_ref, абстрактная машина C++ оперирует типизированной памятью).

▪️Предыдущие версии языка ошибочно считали #[non_exhaustive]-структуры с ненаселёнными полями населёнными типа вне крейта, в которых они определены. В этой версии это странное поведение исправили. Для пользователей языка это означает, что, например, с вот таким определением:

enum Empty {}

#[non_exhaustive]
struct Foo(Empty);


, то следующая функция скомпилируется вне зависимости от того, определена ли она в том же крейте, что и Foo, или нет:

fn eliminate<T>(f: Foo) -> T {
match f {}
}


▪️Из забавного: компилятор теперь выдаёт ошибку на атрибут #[repr(Rust)], применённый на определение, которое не является перечислением, структурой или объединением.

Блог*

28 Nov, 13:51


#math #лингво #meme, видимо

Блог*

28 Nov, 13:50


не баян а классика #трудовыебудни

Блог*

27 Nov, 15:16


Я ненавижу ошибки верификатора BPF

Блог*

26 Nov, 20:43


В Армении в последние дни последнего месяца осени пошёл снег. Немыслимо!

Блог*

26 Nov, 18:15


#ml и... #suckassstory?

Блог*

26 Nov, 18:15


Раньше чтобы тебя не детектили системы как человека надо было носить одежду как справа. Теперь достаточно одежды как слева.

Я напомню что среди DSов есть секта:

ОБУЧЕНИЕ ВСЕ, вам достаточно сделать import openai и все. И почему они все ведут какие то курсы... На работу их не берут что ли...

Блог*

26 Nov, 12:40


Армянская бабушка на улице отругала меня по-армянски за серёжку в ухе. Мол, ай-яй-яй, в наше время такого ужаса не было.

Узнав, что я из России, переобулась и сказала уже по-русски: "А, ну вам можно". И пошла дальше. Типа, вас уже не спасти, что с вами поделаешь...

Какая-то очень сложная схема сегрегации 😅

Блог*

25 Nov, 13:50


McMaster-Carr - американская компания, которая продает
фабричное оборудование, от гаек до защитных шлемов. У них есть каталог из более 700,000 наименований. В твиттере заметили и обсуждают, что их сайт - один из самых быстрых в интернете, каталог и страницы в нем загружаются моментально, реакция на любое нажатие мгновенная, просто кайф зайти на него, даже если не нужны гайки.

https://www.mcmaster.com/

Я когда зашел, сначала подумал, что это просто чистый HTML с картинками, но потом решил, что нет, неправдоподобно быстро даже из Израиля. Наверное, они делают всяческую предварительную загрузку, оптимизируют CSS, возможно нарезают большие картинки на иконки итд. И действительно, кто-то записал видео с подробным разбором сайта, и там много разных трюков специально для быстрого рендеринга и быстрой реакции:

https://www.youtube.com/watch?v=-Ln-8QM8KhQ

При этом вся технология была стандартной уже лет 10 назад, а то и больше. Никаких реактов-шмеактов, разумеется. Скелет сайта вообще спаян на Asp.net, похоже (!).

Много респекта.

Блог*

24 Nov, 18:39


#prog #amazingopensource

ripgrep-all — ripgrep, but also search in PDFs, E-Books, Office documents, zip, tar.gz, etc.

Поддерживает добавление пользовательских адаптеров для поиска внутри файлов других типов.

Блог*

23 Nov, 16:45


Технологический болт Генона и commit -m "better": рекомендуют канал про IT

Канал про IT:

Блог*

23 Nov, 16:26


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

Блог*

22 Nov, 18:06


После того, как следующие времена наступят, вы увидите, что все было не так плохо.

Блог*

21 Nov, 19:33


#life #video

Люди очень нерационально моют посуду по сравнению с посудомоечными машинами.

youtube.com/watch?v=SDfeLICMfNc

Блог*

21 Nov, 19:28


#prog #amazingopensource

Automatically inferring file syntax with afl-analyze

Инструмент для фаззинга AFL использует покрытие потока исполнения для того, чтобы генерировать новые кандидаты тестовых данных. Это позволяет эффективно фаззить софт. Однако оснастка для анализа покрытия может быть использована и для других целей.

Один из инструментов, который использует эту оснастку — afl-analyze. Мутируя входные данные и наблюдая за поведением программы, обрабатывающей вход, он может автомагически до некоторой степени разобрать структуру входа на уровне до байтов.

На скриншоте представлен результат запуска этого инструмента на файле PNG и программе для его чтения.

Блог*

21 Nov, 18:19


#prog #parsing #article

LL and LR in Context: Why Parsing Tools Are Hard

Блог*

20 Nov, 17:07


#meme

Блог*

19 Nov, 18:36


Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешников" и "айтишников" заменят "роботы" 🌝

Сегодня мы с радостью готовы поделиться первой уязвимостью из реального мира, обнаруженной агентом Big Sleep: отрицательным переполнением (underflow) буфера стека с возможностью реализации эксплойтов в SQLite, — широко используемом опенсорсном движке баз данных. Мы обнаружили уязвимость и сообщили о ней разработчикам в начале октября, и они устранили её в тот же день. К счастью, мы обнаружили эту проблему до её появления в официальном релизе, так что она не затронула пользователей SQLite.

Как мы нашли уязвимость в SQLite при помощи LLM
https://habr.com/ru/articles/855882/

Оригинальный пост
https://googleprojectzero.blogspot.com/2024/10/from-naptime-to-big-sleep.html

Но я сейчас хотел бы не про это.

SQLite знаменит тем, что они очень трепетно относятся к тестированию своего кода.

В частности, тестового кода в 590 (пятьсот девяносто) раз больше, чем кода самого проекта

As of version 3.42.0 (2023-05-16), the SQLite library consists of approximately 155.8 KSLOC of C code. (KSLOC means thousands of "Source Lines Of Code" or, in other words, lines of code excluding blank lines and comments.) By comparison, the project has 590 times as much test code and test scripts - 92053.1 KSLOC.

Думаю говорить о том, что там 100% покрытие ветвлений не надо.

SQLite активно использует fuzzing. Использовать они его начали после того исследователь Михал Залевски (Michał Zalewski) нашёл 22 бага с помощью фаззера

Фаззинг нашёл 22 бага в SQLite за полчаса
https://xakep.ru/2015/04/16/fazzing-sqlite/

Оригинальный пост
Finding bugs in SQLite, the easy way
https://lcamtuf.blogspot.com/2015/04/finding-bugs-in-sqlite-easy-way.html

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

SQLite делает ещё кучу всего, что бы сделать свой продукт лучше. Подробней можно почитать на отдельной странице - https://www.sqlite.org/testing.html

И в таких условиях всё равно находятся регулярно баги, что-то нужно править и т.д.

А теперь посмотрите на весь остальной код, который используется вами, пишется вами и в целом существует вокруг вас. Много ли проектов так же щепетильно подходят к его качеству? 🌝

Блог*

19 Nov, 18:07


#prog #db #menacingopensource

github.com/frectonz/pglite-fusion

Embed an SQLite database in your PostgreSQL table. AKA multitenancy has been solved.

(thanks @nosingularity)

Блог*

19 Nov, 12:38


Сегодня отмечается Международный мужской день

Блог*

18 Nov, 08:44


З коментів

Блог*

17 Nov, 16:43


Чуть-чуть старая (октябрьская) #successstory

Patent troll Sable pays up, dedicates all its patents to the public!

Это — заключение судебного процесса, в ходе которого патентный тролль Sable пыталась стрясти денег с Cloudflare.

(thanks @itpgchannel)

Блог*

16 Nov, 17:44


#itsec #suckassstory

Блог*

16 Nov, 17:18


Статья называется Modern C# Techniques, Part 2: Value Records, если что

(#prog #csharp #suckassstory)

Блог*

16 Nov, 17:15


arewemodulesyet.org

(Нет)

Блог*

16 Nov, 16:09


damn

Блог*

16 Nov, 15:27


Мифические существа:

* Единороги
* Йети
* Пришельцы
* Модули в C++

Блог*

16 Nov, 14:38


🤑Gay_Mems

Блог*

16 Nov, 06:35


https://security.googleblog.com/2024/11/retrofitting-spatial-safety-to-hundreds.html

Ну и в догонку очень быстрый апдейт. Включить bound checks отразилось всего в 0.3% регрессии по всему C++ гугла в среднем. Чтобы было так мало, мы ждали пока FDO (feedback driven optimizers) возьмут новые профили. В итоге кто-то меньше, кто-то больше, но я был доволен результатом. Количество сегфолтов в проде стало на 30% меньше. Сегфолты по разным причинам бывают и из-за тестовых бинарей в том числе (другой метрики у нас нет, поэтому репортим что есть).

Блог*

15 Nov, 20:34


TIL что для #cpp есть предложение закрепить в стандарте тот факт, что в байте ровно 8 бит. Сейчас это не так: стандарт (и сишный тоже) требует, чтобы в char было минимум 8 бит, но точное их количество может быть больше, и это количество записано макросом CHAR_BIT из limits.h/climits.

Блог*

15 Nov, 17:44


#prog #cpp

doctest is a new C++ testing framework but is by far the fastest both in compile times (by orders of magnitude) and runtime compared to other feature-rich alternatives. It brings the ability of compiled languages such as D / Rust / Nim to have tests written directly in the production code thanks to a fast, transparent and flexible test runner with a clean interface.

Советую также посмотреть, чем отличается от прочих фреймворков для тестирования в C++.

Блог*

15 Nov, 16:15


#prog

GPU — вещь своеобразная, из-за отличной от CPU архитектуры преобразования кода имеют не самые очевидные последствия.

На странице Check if your performance intuition still works with CUDA перечислено несколько вопросов, каждый из которых демонстрирует два куска кода и предлагает угадать, насколько отличаются их производительность. Догадку потом можно проверить.

Учтите, изменения могут быть в обе стороны.

Блог*

15 Nov, 16:09


#лингво

Серия постов про изменение лексики в новостях России.

t.me/anthro_fun/2882

Блог*

14 Nov, 18:59


Однажды ты спросишь меня, что у меня на первом месте: ты или программирование. Я отвечу "программирование". И ты уйдёшь, так и не узнав, что я допустил ошибку на единицу и на первом месте — ты.

А программирование — на нулевом.

Блог*

14 Nov, 15:42


Я написал очень длинный и очень интересный текст про Юникод. Поскольку в Telegram пост такого размера не помещается, выложил на сайт:

https://blo.gepar.do/v0/unicode.html

Все бегом читать :)

Блог*

14 Nov, 15:13


Доброе утро всем, кто не фреш

Блог*

13 Nov, 17:39


#prog #cpp

В стандартной библиотеке C++ есть unordered контейнеры, которые для проверки принадлежности элементов контейнеру используют хэш-функции (помимо равенства, разумеется). Для того, чтобы хэшировать значение, нужно знать, как это делается.

В C++ операции хеширования можно переопределять для конкретных контейнеров (это один из шаблонных параметров), но по умолчанию используется std::hash. Для того, чтобы определить операцию хеширования для своего типа, нужно написать специализацию std::hash для своего типа (обязательно в пространстве имён std) и написать свою реализацию operator(), которая будет принимать хэшируемый объект и возвращать std::size_t в качестве результата.

Пусть у нас вот такой простой тип:

struct Point {
int x;
int y;
};


Попробуем сделать его хешируемым:

#include <cstddef>
#include <functional>

template <> struct std::hash<Point> {
std::size_t operator()(const Point& p) {
// а как...
}
};


И вот тут мы сталкиваемся с проблемой: при условии, что у нас все поля хэшируемые, как нам получить хэш от всех них? Увы, std тут вообще никак не помогает. Максимум, что могут предложить на просторах интернета — это использовать boost::hash_combine (это даже рекомендуют на cppreference.com). Мало того, что тащить буст ради этого не хочется, так ещё и комбинирование происходит на уровне готовых хэшей. Это фактически приводит к двойному хэшированию, что обычно на качестве хэш-функции сказывается не в лучшую сторону.

В теории можно было бы организовать разделение на саму хэш-функцию и на описание того, какие и в каком порядке поля типа хэшируются... То есть сделать так, как в Rust. И это даже предлагали сделать для C++ в предложении N3980 aka Types Don't Know #. И подано это предложение было... 24 мая 2014 года. То есть десять лет назад, да. А воз и ныне там.

Блог*

05 Nov, 13:07


Открыточка фронтендерам:

<center><div></div></center>

Блог*

04 Nov, 21:42


#go

Мамой клянусь

Source

Блог*

04 Nov, 19:44


Женщины: мужики хотят только одного

Мужики:

Блог*

04 Nov, 11:22


TL;DR: Для масштабирования gRPC в K8s, следует взять linkerd или нечто подобное.

Есть некий клиент (c) и некий сервер (s) в K8s, линия обозначает TCP соединение.
+--+   +--+
|c +---> s|
+--+ +--+


Используя K8s можно достаточно легко горизонтально масштабировать приложение:
- Руками изменить scale.
- Настроить HPA (Horizontal Pod Autoscaling)

И вроде все хорошо — у нас n-ое количество подов, и нагрузка должна автоматом распределятся по round-robin, ведь так?
+--+   +--+         
|c +---> s|
+--+ +--+
| +--+
+-----> s|
| +--+
| +--+
+-----> s|
+--+


Тут уже начинаются детали.

Распределение нагрузки будет работать, в зависимости от того, по какому именно транспорту будут общаться сервисы.

K8s использует iptables как балансировщик, а он работает на уровне TCP соединений, то есть может балансировать TCP соединения.

HTTP/1.1: TCP соединения переиспользуются только после завершения HTTP запроса, то есть: в одно и тоже время в одном TCP соединении может обрабатываться только один HTTP запрос.
HTTP/2: Позволяет использовать одно и тоже TCP соединения для нескольких одновременных HTTP запросов (multiplexing).

Следовательно, при HTTP/2 у нас используется одно TCP соединение, внутри которого проходят множество запросов.

Балансировка будет выглядеть так:
+--+   +--+         
|c +---> s|
+--+ +--+
+--+
| s|
+--+
+--+
| s|
+--+


Все запросы будут идти на первый сервер.

А gRPC использует HTTP/2 для транспорта.

——
То есть: балансировщик из коробки в K8s для gRPC трафика будет некорректно балансировать нагрузку, иначе говоря: балансировать TCP соединения, а не gRPC запросы.
——

Что делать?
Есть пару вариантов:
1. Взять Linkerd, он умеет балансировать gRPC с коробки.
*ИМХО самый корректный*

2. Так же, можно чуть чаще пересоздавать gRPC соединения, тут про это пишут.
*ИМХО самый простой*

2. Внутри самого сервиса: README.md.
*ИМХО самый странный*

Блог*

03 Nov, 17:11


Попав в Яндекс, мы получили проект от Ильи Сегаловича. Илья умел очень классно делиться идеями и объяснять суть. Он нам рассказал, что на самом деле Гугл в своё время выиграл у всех предыдущих поисковиков за счёт хорошо сделанных сниппетов. А теперь для нас самое главное — сделать так, чтобы поисковые результаты не были сплошь одинаковыми. Надо бороться с полу-дублями.

Только сделать это у нас не удалось. Зато мне удалось получить свою первую психологическую травму на работе.

В Яндексе тогда не было почти никакой документации. Даже как собирать проект — было тайным знанием, передающимся из уст в уста.

Когда нужно было разобраться в каком-то куске поискового кода, Макс сказал:
— Ну давай посмотрим, кто автор этого кода... Ага, некий Антон с ником pg@. Просто сходи и спроси у него, что здесь происходит.

Я сходил и спросил. Антон с ником pg@ ответил мне, чтобы я просто прочитал код.

Прочитать и понять код у меня не получилось. А так как работали мы на четверть ставки, то в следующий раз мы с Максом встретились примерно через неделю. Узнав, что прогресса особо нет, Макс сказал:
— Нет, ну так дело не пойдёт. Пойдём вместе сходим и спросим.

Сходили и спросили. На что Антон с ником pg@ просто накричал на нас обоих: какого чёрта какие-то стажёры его отвлекают и не могут даже за неделю самостоятельно прочитать код?!

С тех пор ни я, ни Макс уже больше никогда не хотели работать в Яндекс.Поиске.

#lifestories

Блог*

03 Nov, 16:20


Мужчину-гетеросексуала, который увлечён женщинами (и часто много занимается с ними сексом), зовут бабниками. Слово, очевидно, образовано от "баба".

А как назвать гея, сильно увлечённого мужчинами? По идее, следуя той же логике, "мужник"?

А как тогда назвать любвеобильного би/пансексуала?

Блог*

03 Nov, 15:20


#prog #haskell

Coreutils in Haskell

github.com/Gandalf-/coreutils

(thanks @itpgchannel)

Блог*

03 Nov, 11:05


#politota #meme

Блог*

03 Nov, 10:03


Решившему зарегистрироваться в реестре Роскомнадзора блогеру прислали повестку в военкомат

Автор телеграм-канала «Духи наизнанку» Кирилл Хайкин подал заявку на включение в реестр блогеров и всего через шесть часов получил повестку в военкомат с требованием пройти призывную комиссию, рассказал сам Хайкин.

«За меня не волнуйтесь, я окончил военную кафедру», — отметил он, обращаясь к своим подписчикам. При этом блогер уточнил, что произошедшее может быть совпадением.

Блог*

02 Nov, 19:25


#music

clarkaboudmusic.bandcamp.com/track/the-city

Блог*

02 Nov, 19:15


#itsec #meme

Блог*

02 Nov, 18:04


Круглый дурак — это тот, кто записывает кружочки в телеге

Блог*

02 Nov, 16:48


Группа «Алиса» перенесла три концерта тура «Гойда», потому что билеты плохо продаются.

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

Блог*

01 Nov, 11:52


#ml #prog #meme

Блог*

31 Oct, 23:00


В СМЫСЛЕ УЖЕ НОЯБРЬ

Блог*

31 Oct, 17:27


#prog #rust #rustlib

walkdir — кросс-платформерная библиотека для рекурсивного обхода директорий от Andrew Gallant aka Burntsushi.

use walkdir::WalkDir;

for entry in WalkDir::new("foo").min_depth(1).max_depth(3) {
println!("{}", entry?.path().display());
}


Библиотека умеет обнаруживает циклы символьных ссылок и сообщать в этих случаях об ошибке.

Небольшое неудобство заключается в том, что .filter() на итераторе не будет предотвращать заход в пропущенные директории, для этого нужно на итераторе вызвать .filter_entry(). Пример из документации для пропуска скрытых файлов на *nix-системах:

use walkdir::{DirEntry, WalkDir};

fn is_hidden(entry: &DirEntry) -> bool {
entry.file_name()
.to_str()
.map(|s| s.starts_with("."))
.unwrap_or(false)
}

for entry in WalkDir::new("foo")
.into_iter()
.filter_entry(|e| !is_hidden(e)) {
println!("{}", entry?.path().display());
}

Блог*

31 Oct, 11:36


Четверть кода! Программист не нужон! Мы кнопочку ткнем "сделать заебись", а нейросеть достроит нам... И вот запрос превращается! И вот запрос превращается... Запрос превращается в...

actually the word 'strawberry' has two 'R's in it

Блог*

31 Oct, 11:23


Поздравляю с Тыквенным Спасом

Блог*

25 Oct, 14:11


#prog #abnormalprogramming #article

Vim is Turing-Complete

No, not VIMSCRIPT. Vim KEYSTROKES are Turing-complete.

(thanks @devballet)

Блог*

24 Oct, 20:42


#algo #article

Пусть у нас есть n элементов, каждый из которых указывает сам на себя. Как мы можем поменять связи так, чтобы объединить эти элементы в некий один цикл, и при этом мы могли бы получить каждый из вариантов перестановки связей с одинаковой вероятностью?

Про это есть Sattolo's algorithm, про который пишет небезызвестный Dan Luu. Он рассказывает не только о самом алгоритме, но и о том, почему он достигает поставленной цели — и при этом не предполагает наличия знаний по комбинаторике (как про это рассказывают в других источниках). Как ни странно, алгоритм Саттоло является минимальной модификацией алгоритма Фишера-Йетса — алгоритма для построения случайной перестановки.

Блог*

24 Oct, 16:52


Что примечательно — вся конструкция работает от кручения одного вала, и при этом даёт достаточно мало сопротивления, чтобы её можно было приводить в действие вручную. Рекомендую посмотреть видео с объяснением и демонстрацией в действии

Блог*

24 Oct, 16:49


Оу вау. Машина Тьюринга из лего! Все эти звёзды смерти и соколы тысячелетия просто встали и вышли.

#cs #lego

Блог*

24 Oct, 11:57


#meme про теорию заговора

Блог*

23 Oct, 20:17


#prog #go #suckassstory

Пусть есть вот такая простая программа на Go:

package main

import (
"fmt"
"net"
)

func main() {
func() {
f, err := net.Dial("tcp", "1.1.1.1:443")
defer f.Close()

fmt.Println(err)
}()
}


Если запустить эту программу при отсутствии сетевого подключения (например, на Go playground), то программа печатает ошибку и... Валится с nil pointer dereference:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4d0adb]

goroutine 1 [running]:
main.main.func1()
/tmp/sandbox1770654708/prog.go:11 +0x3b
main.main()
/tmp/sandbox1770654708/prog.go:14 +0xf


Почему так — в Go же в целом методы обычно не паникуют с nil-ресивером? Функция net.Dial из стандартной библиотеки возвращает (Conn, error), где Conn — не конкретный тип, а интерфейс (почему он включает в себя методы Read и Write вместо включения интерфейсов io.Reader и io.Writer — отдельный вопрос).

Так вот, как пояснено в 50 shades of Go, у присваивания интерфейсам nil есть два значения. Если интерфейсу присваивается nil-значение некоего не-интерфейсного типа, который может быть nil (скажем, некий указатель), то значимая часть интерфейса также будет nil, но указатель на таблицу методов будет заполнен от типа присваиваемого значения. Такая переменная будет давать false при тестирование на равенство с nil. Если же значению интерфейсного типа присвоить литерал nil напрямую (или просто не инициализировать явно), то тип нижележащего значения вывести неоткуда, а потому и значимая часть интерфейса, и указатель на таблицу методов будут nil. Такое значение будет давать true при тестировании на равенство с nil.

net.Dial, как и большинство функций в Go, возвращают первым значением nil в случае ошибки. В коде выше в конце main после Println срабатывает код в defer, который пытается вызывать метод Close, и так как у nil-интерфейса указатель на таблицу методов является nil, рантайм паникует, так как вытащить метод из ниоткуда, очевидно, нельзя.

Да, это значит, что поведение может поменяться, если net.Dial начнёт возвращать первое значение при ошибке иначе.

(thanks @HowToGoWrong)

Блог*

23 Oct, 16:19


#justrusteceanthings

Блог*

22 Oct, 22:08


Эта картинка ждала 4 года

Блог*

22 Oct, 22:06


#bio #article

Репушко пишет про эксперимент, показавший у каракатиц наличие бинокулярного зрения.

Блог*

22 Oct, 16:52


А теперь вопрос: каким образом эти действия помогут Украине в войне против России?

Блог*

22 Oct, 16:37


🫡

Removal of (mostly Russian) email addresses from MAINTAINERS

Posted Oct 21, 2024 13:57 UTC (Mon) by paulbarker (subscriber, #95785)
Parent article: Kernel prepatch 6.12-rc4

This was merged for v6.12-rc4: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/...
"Remove some entries due to various compliance requirements. They can come
back in the future if sufficient documentation is provided."

I guess this is something to do with sanctions, but I think the folks removed from the MAINTAINERS file deserve a little more informative notice than that!

https://lwn.net/Articles/994868/

Коммит
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6e90b675cf942e50c70e8394dfb5862975c3b3b2

Блог*

22 Oct, 11:40


А как гетеро вообще занимаются сексом? 😳 Ну типа… кто из них парень и кто другой парень? 🤔

Блог*

21 Oct, 19:39


А тем временем число подписчиков перевалило за 1600. Спасибо, что читаете Блог*!

Блог*

21 Oct, 17:28


Эм...

Source

Блог*

21 Oct, 15:27


#prog #menacingopensource

git-blame-someone-else

(thanks @its200but500)

Блог*

20 Oct, 18:56


#meme, которому неплохо было бы последовать

Блог*

20 Oct, 17:35


#prog #rust #article

TwoVec: A Very Silly Container

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

To be clear, I don't think this container is very practical. If you find a usecase for it, please do not tell me. Whatever problem you're solving is unbelievably cursed and I don't want it anywhere near me.

Блог*

20 Oct, 17:00


#prog #rust

Rust to .NET compiler update - f128, f16, and beginnings of SIMD and async

В этот раз небольшой апдейт, так что он на реддите. Автор планирует написать ещё о паниках в Rust, но это несколько затруднительно из-за количества тем, которые нужно покрыть для объяснения.

Блог*

20 Oct, 13:22


Есть только два гендера

Блог*

20 Oct, 13:06


r/malepolish

Блог*

20 Oct, 12:45


Немного забавного Твиттера. Джонатан Блоу, программист и геймдизайнер Braid, пожаловался, что каждый раз, как ему присылают ссылку на GitHub, то у людей могут быть месяцы или годы без коммитов. После этого Джонатану начали пояснять, что у людей бывает работа, семья и прочие радости жизни, и они не могут 24/7 работать на какими-то неоплачиваемыми проектами, чтобы заливать их на ГитХаб.

И данный Твит просто забавен в свете того, что переиздание Braid, Anniversary Edition, было отложено на ТРИ ГОДА после анонса даты выхода, а основная критика переиздания состояла в том, что создатель пообещал отдельный мир с новыми головоломками, и расширенные комментарии, но на деле новые уровни были либо ни о чём, либо вообще ранними версиями уже существующих.

Быть может, если не тратить всё своё время на GitHub, то получится успешно заниматься реальной работой.

Блог*

19 Oct, 20:43


Девушка из Китая увидела мои ногти и спросила, гей ли я 🙄

Блог*

19 Oct, 19:42


Аааааааа!

Пруфы не искала, но знаете, верю))

Блог*

19 Oct, 19:14


🤖Депутатские хроники🤖

🍏«ГОСТ на единый подарок для всех новорожденных страны разработают в России в 2025 году. Об этом сообщила Татьяна Буцкая».

🇷🇺«На форуме "Моя семья - моя крепость" в Тюмени она представила каталог, в котором указаны товары с государственной символикой, отечественного производства, которые могут войти в набор для новорожденного».

🇷🇺"Это не просто российские производители, это когда патриот с рождения, это когда у тебя триколор, герб, уже первая твоя одежда, которая говорит о том, что ты родился в России, что ты нужен для России, ты важен, тебя уже с рождения любят. <…> Мы очень хотим, чтобы каждый ребенок, который родился в любом регионе, мог получить такой подарок", - сказала она.

🎉Шутки про патриотизм с роддома вышли на новый уровень.
😌

📎Источник

Блог*

19 Oct, 12:51


#prog #js #ml #abnormalprogramming

github.com/rhettlunn/is-odd-ai

Блог*

18 Oct, 23:22


https://x.com/archieemwood/status/1847400245799407741

Блог*

18 Oct, 21:56


#неігрове не забути потім в журнал обліку журналів записати😐

Блог*

18 Oct, 19:55


Друзья, до RustCon еще полтора месяца и наверняка кое-кто из вас думает, что времени для покупки билетов достаточно. Это правда, но хотим напомнить, что через две недели цена на них увеличится.

Лучше забронировать себе место на конференции прямо сейчас. Сэкономленная сумма наверняка пригодится вам на афтепати 😊 Билеты пока-еще-со-скидкой на сайте.

А еще вы можете посмотреть доклады с прошлого года — они выложены в нашем канале на YouTube и до сих пор причиняют немало пользы. До встречи 6 декабря в Москве!

Блог*

18 Oct, 11:51


#meme о полном запрете

Блог*

18 Oct, 00:08


#meme, от которого больно

Блог*

17 Oct, 23:09


▪️Стабилизировали пачку API. Некоторые из них:
🔸{Rc,Arc}::make_mut() теперь работает с другими unsized типами: Path, OsStr и CStr.
🔸std::thread::Builder::spawn_unchecked — unsafe функция для запуска потоков без проверки времени жизни. Не очень нужная функция сама по себе, но позволяет строить поверх API, работающий с потоками — такие, как scoped threads, например — без грязных хаков с transmute-ом в 'static-типы.
🔸is_sorted (включая *_by и *_by_key варианты) на слайсах и итераторах.
🔸Временами нужная std::iter::repeat_n. В отличие от repeat(x).take(n) может не клонировать на последней итерации.
🔸...Но чуть менее нужная, поскольку Take<Repeat<T>> и Take<RepeatWith<T>> теперь реализуют ExactSizeIterator, а Take<Repeat<T>> ещё и DoubleEndedIterator.
🔸Функции на умных указателях для выделения неинициализированной памяти (new_uninit/new_uninit_slice) и соответствующие небезопасные функции для утверждения инициализированности (assume_init/assume_init). Есть для Box, Rc и Arc.
🔸from_str_radix в const-контексте

▪️Для cargo теперь доступна команда cargo info для отображения информации о пакете. Удобнее, чем читать непосредственно манифест.

Блог*

17 Oct, 23:08


#prog #rust #rustreleasenotes

Вышла версия Rust 1.82.0! Как всегда, тут только избранные части, а полный ченджлог отдельно.

▪️Теперь в некоторых случаях можно использовать pattern matching, не упоминая ненаселённые паттерны:

enum Void {}

fn foo() -> Result<u32, Void> {
todo!()
}

fn main() {
let Ok(x) = foo();

match foo() {
Ok(x) => {}
}
}


▪️Добавили новый синтаксис, который позволяет явно указать, какие лайфтайм-параметры будут использованы для обобщённых параметров типа impl Trait в возвращаемой позиции: + use<'a>. Это позволяет, в частности, убрать из списка лайфтайм-параметров те, которые по факту не используются в возвращаемом типе. У меня не получилось кратко объяснить, для чего это нужно, читайте блогпост. Из досадных ограничений: анонимный тип обязан перечислять в use все обобщённые типы и константные параметры из окружения, даже если они не используются. Это планируют исправить в будущих версиях.

▪️Стабилизировали операции на числами с плавающей точкой в const fn. В качестве не вполне приятного дополнения const fn теперь могут возвращать разные результаты в о время компиляции и в рантайме. С другой стороны, в настоящий момент эта оговорка существует лишь из-за тонкостей насчёт гарантий битового представления NaN. Если вас это не интересует (а так оно, скорее всего, и есть), то const fn продолжают сохранять равенство рантайм и компилтайм поведения.

▪️Стабилизировали операции для взятия адреса place expression без создания промежуточной ссылки: &raw const и &raw mut, ранее доступные через макросы std::ptr::addr_of{, _mut}. Также в качестве багфикса их использование на static определениях теперь не триггерит сообщение о небезопасной операции.

▪️В Rust добавили ключевое слово safe... Ну, почти. extern-определения по определению не могут быть проверены компилятором на корректность, поэтому в общем случае доступ к ним требует unsafe-блока. Начиная с этой версии определение в extern-блоке можно пометить, как safe, обозначая тем самым, что доступ к определению не требует соблюдения каких-либо специальных предусловий. Например, таковыми можно пометить большинство функций из libm — математической составляющей стандартной библиотеки C.

▪️Макрос offset_of! теперь можно использовать для вычисления сдвига вложенного поля:

struct Inner {
field: u32,
}

struct Outer {
inner: Inner,
}

const _: usize = std::mem::offset_of!(Outer, inner.field);


▪️Некоторые атрибуты — например, #[no_mangle] и #[export_name] — могут приводить к некорректным программаv даже в отсутствие какого-либо unsafe кода. Например, вот эта простая программа при запуске на *nix-системе почти наверняка упадёт с SIGSEGV:

fn main() {
println!("Hello, world!");
}

#[no_mangle]
fn malloc() -> usize { 1 }


С edition 2024 (да, ещё не стабилизированной) подобные атрибуты нужно будет помечать, как unsafe:

#[unsafe(no_mangle)]
fn this_is_not_in_global_namespace() {}


В предыдущих edition по соображениям обратной совместимости это не требуется, но есть соответствующий линт (по умолчанию выключенный).

⬇️⬇️⬇️

Блог*

17 Oct, 17:10


#prog #rust #rustlib #article

Designing A Fast Concurrent Hash Table

Статья о дизайне papaya, многопоточной в основном lock-free хэш-мапы с упором на пропускную способность на операциях чтения из мапы и предсказуемые задержки (без пиков). Также пока что является, кажется, единственной подобной структурой данных, которую можно использовать из асинхронного кода.

Для того, чтобы избежать пиков задержки, использует инкрементальное изменение размера — и это одно из немногих мест, где используются блокировки.

Так как многопоточная мапа по определению не может иметь аналог entry API (по край мере, без кучи тонкостей из-за потенциальных гонок с другими потоками), papaya предоставляет операции по атомарной модификации отдельных записей, использующие переданные коллбеки для выполнения нужной операции. Для наиболее ходовых операций есть отдельные методы, а для тех, которые в эти методы не укладываются, есть операция compute. Коллбек, переданный в этот метод, должен возвращать значение типа Operation, описывающий требуемое действие:

enum Operation<V, T> {
Insert(V),
Remove,
Abort(T),
}


В конце автор сравнивает свою реализацию с другими подобными библиотеками для Rust и поясняет, почему может иметь смысл использовать их вместо papaya.

Блог*

16 Oct, 23:05


🫡

В Госдуме и ФСБ поддержали предложение о том, чтобы исключить использование российскими операторами измерителя скорости интернета SpeedTest американской компании Ookla. 
. . .
Ookla работает в тесной связи со спецслужбами США — американцы смогли создать по всему миру систему тестового контроля сетей связи, объясняет свою обеспокоенность президент Международной академии связи Анастасия Оситис в своем обращении в Госдуму (документ есть у «Известий»).
. . .
Системы тестового контроля позволяют получить информацию о сетях связи: их конфигурации, используемом на них оборудовании, нагрузке, пропускной способности и многом другом, перечисляет академик МАС Сергей Мельник. По его словам, эти данные, попав в руки иностранных спецслужб, могут быть использованы, к примеру, для организации адресных DDoS-атак.

Скорость отступа: в РФ хотят запретить использование сервиса SpeedTest
https://iz.ru/1775426/valerii-kodacigov/skorost-otstupa-v-rf-hotat-zapretit-ispolzovanie-servisa-speedtest

Блог*

16 Oct, 16:39


#prog #article

You Really Shouldn't Roll Your Own Crypto: An Empirical Study of Vulnerabilities in Cryptographic Libraries (pdf)

<...> Among our most interesting findings is that only 27.2% of vulnerabilities in cryptographic libraries are cryptographic issues while 37.2% of vulnerabilities are memory safety issues, indicating that systems-level bugs are a greater security concern than the actual cryptographic procedures

<...>

Of the most severe CVEs, just 3.57% were cryptographic, a substantially lower percentage compared to 27.24% of all CVEs.

Блог*

15 Oct, 12:31


#meme про айтишников

Блог*

14 Oct, 17:39


#bio #video

youtu.be/MzLe0Zk31_U

Блог*

14 Oct, 15:52


#prog #python

Причём в Python 2.x можно было писать код вида

lambda (x, y): (y, x)

, а в Python 3 это убрали после PEP 3113, причём по причинам, которые, на мой взгляд, можно было бы и исправить.

Блог*

14 Oct, 14:35


#prog #cpp #python

Что общего у C++ и Python?

Правильно: что в C++, что в Python нельзя распаковывать кортежи в аргументах лямбды.