Generic Containers in C: Safe Division Using Maybe
Показываю, как в C сделать обобщённый контейнер maybe
, который безопасно возвращает результат, если он есть, и сообщает об ошибке, если её нет.
#define maybe(T) struct { bool ok; T value; }
#define maybe_just(T,x) { .value = (x), .ok = true }
#define maybe_nothing(T) { .value = (T){}, .ok = false }
static maybe(int) divide(int a, int b) {
return (b != 0) ? maybe_just(int, a / b) : maybe_nothing(int);
}
Вызов:
maybe(int) p = divide(6, d);
if (p.ok) printf("%d\n", p.value);
else puts("division by zero");
Чтобы не забыть проверку, добавляем макрос maybe_value
, который при ошибке возвращает нулевой указатель, ловим его санитайзером:
#define maybe_value(x) \
(*({ auto _p = &(x); _p->ok ? &_p->value : (void*)0; }))
Но деление на ноль — не единственная проблема. При делении INT_MIN / -1
возникает переполнение. Исправляем:
maybe(int) safe_divide(int a, int b) {
if (b == 0 || (b == -1 && a == INT_MIN))
return maybe_nothing(int);
return maybe_just(int, a / b);
}
Компилируем с -fsanitize=signed-integer-overflow,integer-divide-by-zero -fsanitize-trap=undefined -O2
. В ассемблере не остаётся пути к ud2
, то есть оптимизатор доказал: переполнения и деления на ноль нет.
Это не делает весь C «безопасным» (жизненный цикл указателей и арифметика не покрыты), но для ограниченных задач подход работает.
Комментарии (46)
- Критика: реализация не заставляет проверять результат, теряя главное преимущество Maybe.
- Ассемблер: GCC выдаёт почти тот же код, что и для std::optional, но не возвращает результат в регистре.
- UB: «пустой» lvalue в случае ошибки вызывает неопределённое поведение; автор полагается на null-sanitizer.
- Эргономика: предлагают добавить and_then/or_else и сделать тип непрозрачным через макросы.
- Почему не другой язык: встраиваемые/фирменные проекты часто ограничены только C или ASM.
Going faster than memcpy
Как обогнать memcpy
Профилируя Shadesmar, увидел: при больших (>512 КБ) сообщениях 97 % времени уходит на memcpy
между процессной и разделяемой памятью. Решил ускорить копирование.
Разбор memcpy
perf
показал:
__memmove_avx_unaligned_erms
— это memcpy
через memmove
, AVX, 32 байта за раз, поддержка не выровненных блоков и ERMS (железный цикл REP MOVSB
).
memmove
выбран, т.к. допускает перекрытие.- Для <4 КБ используется SSE2, иначе —
REP MOVSB
+ AVX. - Не-временные (
NT
) инструкции иprefetcht0
уменьшают кэш-промахи.
Способ 1: простой REP MOVSB
void _rep_movsb(void *d, const void *s, size_t n) {
asm volatile("rep movsb"
: "=D"(d), "=S"(s), "=c"(n)
: "0"(d), "1"(s), "2"(n)
: "memory");
}
Тот же цикл, что и в glibc
, но без лишней логики.
Комментарии (63)
- Часть выгоды даёт отказ от лишнего копирования: часто данные можно использовать на месте.
- Несколько участников отмечают, что без контроля кэшей и правильной сериализации бенчмарки теряют смысл.
- График в конце вызывает сомнения: скачки пропускной способности выглядят неправдоподобно.
- Для IPC обсуждают zero-copy через размещение данных сразу в shared memory (Iceoryx, Boost.Interprocess, DPDK).
- Большинство сходится к выводу: для обычных задач лучше довериться стандартному
memcpy
/std::memcpy
, особенно в glibc.
Making reliable distributed systems in the presence of software errors (2003) [pdf]
%PDF-1.3
5 0 obj
<< /Length 737 /Filter /FlateDecode >>
stream
xڵUKO0WHc;>@b% eiEд;~4PV\\V=رy|̸0q"e\\%\*H-YD 9Ze2& Őg¨Ҡ3D=>mErX\\/ )=9>8IrA3H³J>\['\[R{89CRԿ8EXDMkUĿKRcRIX|m8vcM"mc-jjb|4ӍYJ+{A=4e16}{gρ\`sa(w 1}@+\\\\pȜc5AKt!}'n\\\[M8pe$ZQdP\`N\]͚Lۛ쨣Hg6GsBxfܱ ?jQ<ߵT{P̯?c)n\[y%̲OprN5~qxvHrz:T:vT7Q Iɩw4fQ+8V\[ %ͅt-x^\]z\]>ä́^ukK!zvXh#O&gCT fqkk5
endstream
endobj
4 0 obj
<< /Type /Page /Contents 5 0 R /Resources 3 0 R /MediaBox \[0 0 595.276 841.89\] /Parent 12 0 R >>
endobj
1 0 obj
<< /Type /XObject /Subtype /Form /FormType 1 /Matrix \[1 0 0 1 0 0\] /BBox \[0 0 143 73\] /Resources << /ProcSet \[ /PDF \] /ExtGState << /R8 13 0 R /R4 14 0 R >> >> /Length 15 0 R /Filter /FlateDecode >>
stream
xYn-;mVzn2#m@sǀ\\R#E?ſ߿GJm>k?kZ\_cߏҾv>K~Rr~>8J?3x>jK\_cxy+e\*o뫔/|篲g=|jv~PUOWW9K<+;><c϶\_kQZag<xk쉳q?(w ֝ Ip\_\`; }T?q\_ugnkQy߹uei<qw;a=pL\]'j\*#@=k5BLv~&4<yyZ:1y!&F|@yQU,8} 7q=6Aݶ\*g95\]\\T7Ky1PO9yb~nw.ڸQ~QzP· DZs«rUC\] 0C!K83{0\\ЮѪ\]C!S s+B/qҺsCrvks6}MYX=HPпC<Ӈs3?3Ϸa!9OM·ΎXŞ8|h'湻.3>-C @:k1>@y˹C\*X>p"ۂ @owԩv!X8a5-z-:Ʋyӛ2=;d\*繲9oAkY\_;,,=ᰐ3>R;"8l=ׄ>@>xݞ\\FyV!vY\]1w1ޘML9JJv9&#qzGmr>9E/ϓdྟ\_ov9, \]:$玚"#jyH灈Dsd@f"T~Gf\[tV">ƟWћňq\[qJ\[$V,KD)Q!xg\\ܚtpv7ҘBudm.$0#HKg8G V5lC/u9 l{ihs9C ;ajB٪> t|^P4vfAu$F0P ʥ.hDA9GyhȑtR 7 ښ^՟66:lĕb<Ү.$Jɻ(Ʋ~hAόBs~Q^|j9Xꂥ.~u:,%MT(zϰL:"(:t4݇/vk|eQq}t%I9jBY9L9\]N& #QK;bggwcYjUh\\PM8-Z%d3x~خ"+,Π£n zo~?^'-BZ}C0^bUq\[$"Jދ鳣&mu(0AP/dm{ę3>rP1-$$2đ7;TƃAg\\R$1#) mh 3~.b8fK'C/x9#\*N,}v89\`sb3\`8 \[S\*7g,v?3?ܷ ʾJ \[A?tSKBs\`y$Xu4ٟ|HdoܥfaDX%39.L=a\*0 #RnI0葡L&u;Ce+JMI\_Z^8tT0wJ#g|q2!3mԹ3"O~e;,D)Rı΅P# \[@y/.ϹG6s:t? eMf,\_B;PAXHG뇫b/+D<cflI.:eLט/l'B-HR \]$agra;{9rrs;UPymX4)iEf㕇qjS(;bedȑLtˆ &>߫HŖ)8퇀ˡeGA 9ݹ.\_U(61,%#t$gC&ʄ+SA)SHݍ\_NE%d̨RZpf ?dAH,͜c\*g(|@'13sdg\]\[Lw"{"hx<.#ob@E4$ i=ǃ4#{,<Y f^a&mVFS$dG2 hAB:Z{Q\_F т1>P$9PA<X{TdMBt=\\{9=CvOtO&E^JwM6'\]!9V|rɟTEyQX/> -|0&u$)i5,yץ}ceCGw\_ړm$)5 |>s"dؒdthjziYF%\\~ˤyKΈ+bK0g\\qtOT%,\*\_\\~9pϊBpCkB+@$\_s}Op^5efJDM\]-n. p)Rd7>Od0 \`J7Dmbs}t|)\`n3h\[V!ueX Cװd\`~>G:EͰ6q@cvKl |6\`ldwBÉo T=Iiw#Ar#tV:ܒA\`;\_J\`樼:4{OSH!H8!c3vavg{rmS<3,r8!UD0^0 1\`\`Nz\`{ſb$R\`wZ5~9kf\*OpZ |=,w$M x%;L%6R\_ :BYqOHRŬ.sw5g+(%h1y6\*kyVES\]@E,;DFxKY1oEnSeKz&Ƙ':rxwEb1\\!^pX\]=}2x7\_^v+\*~EU;A9-IIKTP,c(0v4@,8f qIwy-<@!Yg Վ.S4 2E\]AgG<dXY3<9\_5U>2|kӏ4^\[Gbڗa@h<)Y&\*bpG'td:\*o}탌Otda 2hyL\\Xdif\\ۀ-ZS#2 &h\\Yo~!7z8 LuÅCP\]k?}C0 F>Jз;,) Qb\[:ӬT\_n@@!=\`5^/Ed/pveU&lB>TVD-r3: \]pLE@lvIMd5Q{yœܰ'T~a >x @u\\8qhjqc 7 E \*\]Jʭ\`(2/ W%Wi:=PRB,+$ >;9HR\[,fßfRDʽdmܺ/<yE%<{8@Hшxvi}ό\_HEE-"-XJt6m}Fn{~gӼgŌ0~s|kW|b4wH5ﱥמo ڵ7JH@~(abe3Ы-nWNjNR1,dg|LBq+&\*BWiƥԕBJiʲcؽkl➱7&x\\B 5q.9:\]mRף>aFybU{r@aR=B~Q2p\\kRgƻ}2aax\`5Vq4\[0?&G'K$\[TѸQv&xZ Y/ឨ {^zVE\\̵Pp\] O;5k-5C+ 1.p{|do@սV,L>{X&ևɓB|CR/\*3>.sMX!G!P(8Z/ o}X< K)!?'Jx-->c TAi\_""GAyK~yw낇35>yR#?Grig\\3 ·0\\,sE 'Ss,GP83nbby@zqy\[@gL>+?O(hX={UL;m dI! FMV70\[w\_fW+E1sxbP,#\[BWpo\*I\[b"kD,?zoqr{BC-礌\*Y!Ԫ\*96͑k.?Ŕ(%z,MJйL0A:/{<+b<,@W>PmEkxX<bLqSDZMY=êbOÚֈsAe8CTuvYq\]Ѷ7pp 4' =LLo@xĸ?AӝEVXEaԲ5
Комментарии (16)
- Участники вспоминают Джо Армстронга и его ссылки на работу Джима Грея о Tandem.
- Отмечают, что Erlang/Elixir были технологически опережающими, но не стали массовыми.
- Идеи Erlang постепенно проникают в .NET и Java через Akka и Orleans.
- Удивляются, почему Erlang не используется даже в новых коммутаторах Ericsson, хотя был создан для них.
- Считают, что полное внедрение Erlang угрожает существующим бизнесам и рабочим местам, а рынок предпочитает «хуже, но дешевле».
Vanishing from Hyundai’s data network 🔥 Горячее 💬 Длинная дискуссия
Kona EV: отключение BlueLink
Цель — исчезнуть из сети Hyundai: не быть отслеженным и не допустить удалённого вмешательства. Tesla, например, требует постоянного онлайна — здесь же я хочу полного контроля. BlueLink умеет дистанционно открывать двери, глушить мотор и многое другое по одному VIN — этого достаточно, чтобы отказаться.
-
Отказ от активации
Попросил дилера не подключать BlueLink. Проверил: по VIN никаких данных не внесено. Но машина всё равно лезет в сеть — значит, нужно найти и вырубить встроенный модем. -
Микрофон
Выдернул микрофон в плафоне: разговоры остаются в салоне. Bluetooth- handsfree тоже умер, но мне не жалко. -
Съём мультимедийного блока
- Отковырял декоративную накладку за час — клипсы держат крепко.
- Открутил 4 винта (два под накладкой, два под длинной панелью до бардачка).
- Аккуратно выдвинул блок: сзади куча антенных разъёмов LTE, CDMA, GPS и т.д.
-
Внутри блока
На отдельной плате — модем Continental (IMEI на этикетке). Корпус не припаян, только закручен. Выпрямил ушки, снял крышку, выдернул модем. SIM-карты нет, скорее eSIM.
Результат: машина больше не звонит в облако Hyundai.
Комментарии (200)
- Пользователи жалуются: при покупке машины нет нормального согласия на сбор данных, а позже навязывают гигантские T&A, которые никто не читает.
- Многие опасаются, что современные авто превращаются в «смартфоны на колёсах» с коротким сроком поддержки и принудительным трекингом.
- Обсуждают способы отключения модемов, антенн, микрофонов и даже целых телематических блоков, чтобы вернуть контроль над машиной.
- Участники считают, что короткий жизненный цикл ПО — это намеренная «фича», чтобы гнать людей на новые модели.
- Звучит призыв к регуляции: штрафы за взломы, признание односторонних соглашений недействительными, создание open-source-альтернатив и вики-гайдов.
Nyxt: The Emacs-like web browser
Nyxt — браузер в духе Emacs, написанный на Common Lisp под BSD-лицензией. Цель — клавиатурное управление и полная расширяемость для разработчиков; Linux — приоритетная платформа.
Проект запущен в 2017 г. Джоном Меркурисом, спонсируется двухчеловечной Atlas. Идея — дать «хороший Emacs-опыт в интернете», но без самого Emacs: технический долг и ограничения плагинов не позволили реализовать задумку иначе. Поддерживаются vi- и CUA-схемы клавиш.
Стабильная ветка 3.12.0 (октябрь 2024) использует WebKitGTK, экспериментально Blink. Обновления безопасности только для последней стабильной версии.
Разрабатывается 4.0: рендер-агностик, WebKitGTK + Electron (из-за производительности и поддержки macOS/Windows). Пока доступен превью-AppImage на Electron; WebKitGTK требует сборки из исходников. Основные изменения — рефакторинг, багфиксы, улучшения UI.
Установка стабильной версии в Linux — Flatpak.
Комментарии (35)
- Пользователи восторжены идеей «Emacs для браузера», но ждут стабильной 4.0 и полной совместимости с сайтами.
- Основные тормозы: отсутствие uBlock Origin/umatrix, странный поиск в модальном окне, проблемы с Electron и сборкой под Guix/Mac.
- Движок — Chromium через Electron, поэтому sandbox-защита сопоставима с Chrome, но «взлом» вне песочницы пугает.
- Критики считают проект хакерским, а не продуктовым: мало внимания UX и «обычным» пользователям.
- Сторонники отвечают: целевая аудитория — энтузиасты Emacs/Luakit, а не массовый рынок.
Optimizing my sleep around Claude usage limits
Прошлый месяц я подстроил сон под лимиты Claude Pro: счётчик обнуляется каждые 5 ч. Раньше в самый продуктивный момент всплывало «лимит до 7:00» — и flow пропадал.
Параллельно учусь ходить под парусом в одиночку: там спят по 20–30 мин, чтобы не пропустить суда и ветер. Я решил применить тот же принцип к Claude.
Теперь трачу токены 1–3 ч, затем 2-часовой «морской» сон. REM успевает накопиться, скорость разработки выросла в 10×, фичи льются.
Когда Anthropic поднимет цены или урежет лимиты, буду готов: поставлю будильник, который разбудит, как только счётчик сбросится.
Комментарии (116)
- Автор экспериментирует с полифазным сном, чтобы не сталкиваться с лимитами Claude, вызвав шквал реакций.
- Комментаторы спорят: кто-то восхищается «продуктивностью», кто-то уверен, что это сатира.
- Многие советуют просто купить подписку Claude Max, взять API-ключ или запустить локальную модель, чтобы не разрушать здоровье.
- Повторяется предупреждение: здоровье важнее денег и кода; перегрузки рано или поздно аукнутся.
- В итоге обсуждение превратилось в смесь шуток, здравого смысла и сомнений, где реальность трудно отличить от сатиры.
1976 Soviet edition of 'The Hobbit' (2015) 🔥 Горячее
- В 1976 г. в СССР вышло «Хоббит» с иллюстрациями М. Беломлинского.
- Издание отличается яркими, почти сюрреалистичными рисунками: Голлум — полупрозрачный, дракон Смауг — гипнотически зелёный, эльфы — в восточных мотивах.
- Книга стала культовой у советских детей и до сих пор вызывает ностальгию у коллекционеров.
Комментарии (84)
- Иллюстрации Туве Янссон к «Хоббиту» 1960-х вызвали споры: Голлум изображён гигантом, хотя Толкин изначально не уточнял его размер и позже внёс правки.
- На обложке имя автора записано как «Д-ж. Р. Р. Толкин» — участники обсудили, как русская транскрипция передаёт начальный согласный кластер.
- Билбо у Янссон списан с актёра Евгения Леонова; для многих пост-советских детей это стало каноническим образом.
- Упомянуты альтернативные иллюстрации: Ингахильд Гратмер (королева Маргрете II), болгарский комикс «Дъга», венгерский перевод Гёнца Арпада.
- Кто-то впервые прочёл «Хоббита» именно в этом издании, кто-то вспомнил «The Last Ringbearer» как «ответ» с точки зрения Мордора.
Compiling a Lisp: Lambda lifting
Переписал Ghuloum-туториал на Python (~300 строк). Убрал читалку S-выражений и бинарный код — теперь текстовая ассемблерная печать.
Lambda-lifting требует:
- знать связанные переменные;
- собирать свободные переменные лямбд;
- накапливать создаваемые
code
-объекты.
Связывают let
и lambda
; для них обновляем окружение.
Lifter
class LambdaConverter:
def __init__(self):
self.labels = {}
def convert(self, expr, bound, free):
match expr:
case int() | Char() | bool():
return expr
case str() if expr in bound or expr in BUILTINS:
return expr
case str():
free.add(expr)
return expr
case ["if", t, c, a]:
return ["if",
self.convert(t, bound, free),
self.convert(c, bound, free),
self.convert(a, bound, free)]
lift_lambdas
запускает обход и возвращает (labels …)
.
Lambda
Лямбда:
- связывает параметры;
- выделяет код;
- захватывает внешнее окружение.
Пример:
(lambda () x) ; x свободна
превращается в
(labels ((f0 (code () (x) x)))
(closure f0 x))
Даже если x
связан снаружи, внутри лямбды он считается свободным.
Комментарии (15)
- Участники рекомендуют три современные книги по компиляторам, вдохновлённые статьёй Ghuloum: «Writing a C Compiler» (Sandler), «Essentials of Compilation» на Racket и Python (Siek).
- Обсуждали «lambda lifting»: преобразование, выносящее замыкания наверх, уменьшая их размер вплоть до полного исчезновения.
- Уточнили, что «lambda lifting» в статье связан с разделом 3.11 о сложных константах в Scheme.
- Разбирали, почему современный ИИ использует Python, а не Lisp: удобство как «клея» для C++/CUDA, упадок доли рынка Lisp и смена парадигмы ИИ.
1910: The year the modern world lost its mind 🔥 Горячее 💬 Длинная дискуссия
1910: когда мир сошёл с ума
Французский писатель Октав Мирбо в 1910-м назвал автомобилизм «психической болезнью» — люди не могли остановиться, нервы были натянуты, всё время хотелось «куда-то ещё».
Эпоха 1890–1910 годов — мой любимый исторический срез. За 30 лет мир преобразился:
- 1875: нет электричества, машин, аспирина, «скейтбордов»; самое высокое здание — церковь.
- 1905: небоскрёбы, автомобили, самолёты, кока-кола, кино, фонограф, «кеды».
Лучшая книга о том времени — «Головокружение лет: Европа 1900–1914» Филиппа Блома. Она показывает, как технологии вызвали массовую тревогу:
- Скорость разрушала человечность.
- Нервные болезни росли рекордными темпами.
- Художники отвечали кубизмом и футуризмом, пытаясь угнаться за новым ритмом.
Параллели сегодня
Тогда, как и сейчас, казалось, что мир «слетел с катушек». Изобретения меняют нас, но наша тревога — не новость. Изучая 1910-й, мы понимаем: человечество уже проходило «потерю разума» и выжило.
Комментарии (262)
- Участники обсуждают, как технологический взрыв XIX–XX вв. (велосипед, телеграф, авто, авиация) вызывал культурный шок, тревогу и даже «болезни скорости».
- Подчеркивают ужасные условия жизни в городах: перенаселённые комнаты, кровати «по сменам», грязь, шум.
- Вспоминают, что новинки воспринимались как угроза норме: женщины в брюках на велосипедах, «нервные вибрации» от далёких машин, радиоактивные рекламы.
- Отмечают параллели с сегодняшним AI-бумом: каждая революция кажется «последней», но история показывает череду подъёмов.
- Приводят культурные источники: стих «Mulga Bill’s Bicycle», романы Пинчона, сериал «The Knick», книги о телеграфе и кокаине.
One Million Screenshots
Миллион скриншотов
Увеличьте главные страницы интернета.
Поиск сайта: ⌘K или случайный выбор.
Комментарии (83)
- Проект OneMillionScreenshots показывает скриншоты топ-1 000 000 сайтов в виде интерактивной «карты».
- Часть пользователей жалуется на SSL-ошибки, блокировку DNS и поломку кнопки «Назад».
- Большинство отмечает однообразие современного веб-дизайна и коммерциализацию интернета.
- Некоторые просят фильтров по нишевым или старым сайтам, а также API-фич и мозаичных раскладок.
- Создатели подтвердили, что визуализация устарела, но данные обновляются ежемесячно и доступны через ScreenshotOf.com.