Блог*
前往频道在 Telegram
Блог со звёздочкой. Много репостов, немножко программирования. Небольшое прикольное комьюнити: @decltype_chat_ptr_t Автор: @insert_reference_here
显示更多1 948
订阅者
+124 小时
+237 天
+2430 天
数据加载中...
吸引订阅者
七月 '26
七月 '26
+44
在1个频道中
六月 '26
+29
在2个频道中
Get PRO
五月 '26
+45
在4个频道中
Get PRO
四月 '26
+51
在3个频道中
Get PRO
三月 '26
+31
在4个频道中
Get PRO
二月 '26
+34
在3个频道中
Get PRO
一月 '26
+56
在9个频道中
Get PRO
十二月 '25
+76
在11个频道中
Get PRO
十一月 '25
+106
在7个频道中
Get PRO
十月 '25
+56
在10个频道中
Get PRO
九月 '25
+46
在6个频道中
Get PRO
八月 '25
+44
在5个频道中
Get PRO
七月 '25
+62
在9个频道中
Get PRO
六月 '25
+42
在2个频道中
Get PRO
五月 '25
+85
在6个频道中
Get PRO
四月 '25
+52
在5个频道中
Get PRO
三月 '25
+62
在3个频道中
Get PRO
二月 '25
+57
在4个频道中
Get PRO
一月 '25
+90
在6个频道中
Get PRO
十二月 '24
+61
在4个频道中
Get PRO
十一月 '24
+167
在5个频道中
Get PRO
十月 '24
+95
在5个频道中
Get PRO
九月 '24
+84
在4个频道中
Get PRO
八月 '24
+98
在9个频道中
Get PRO
七月 '24
+66
在8个频道中
Get PRO
六月 '24
+59
在3个频道中
Get PRO
五月 '24
+47
在4个频道中
Get PRO
四月 '24
+73
在10个频道中
Get PRO
三月 '24
+65
在7个频道中
Get PRO
二月 '24
+88
在1个频道中
Get PRO
一月 '24
+80
在3个频道中
Get PRO
十二月 '23
+88
在5个频道中
Get PRO
十一月 '23
+59
在2个频道中
Get PRO
十月 '23
+46
在2个频道中
Get PRO
九月 '23
+93
在0个频道中
Get PRO
八月 '23
+78
在0个频道中
Get PRO
七月 '23
+59
在0个频道中
Get PRO
六月 '23
+57
在0个频道中
Get PRO
五月 '23
+41
在0个频道中
Get PRO
四月 '23
+55
在0个频道中
Get PRO
三月 '23
+39
在0个频道中
Get PRO
二月 '23
+36
在0个频道中
Get PRO
一月 '23
+118
在0个频道中
Get PRO
十二月 '22
+56
在0个频道中
Get PRO
十一月 '22
+48
在0个频道中
Get PRO
十月 '22
+62
在0个频道中
Get PRO
九月 '22
+24
在0个频道中
Get PRO
八月 '22
+46
在0个频道中
Get PRO
七月 '22
+34
在0个频道中
Get PRO
六月 '22
+34
在0个频道中
Get PRO
五月 '22
+36
在0个频道中
Get PRO
四月 '22
+49
在0个频道中
Get PRO
三月 '22
+19
在0个频道中
Get PRO
二月 '22
+41
在0个频道中
Get PRO
一月 '22
+49
在0个频道中
Get PRO
十二月 '21
+88
在0个频道中
Get PRO
十一月 '21
+75
在0个频道中
Get PRO
十月 '21
+172
在0个频道中
Get PRO
九月 '21
+63
在0个频道中
Get PRO
八月 '21
+130
在0个频道中
Get PRO
七月 '21
+74
在0个频道中
Get PRO
六月 '21
+79
在0个频道中
Get PRO
五月 '21
+66
在0个频道中
Get PRO
四月 '21
+100
在0个频道中
Get PRO
三月 '21
+81
在0个频道中
Get PRO
二月 '21
+42
在0个频道中
Get PRO
一月 '21
+103
在0个频道中
Get PRO
十二月 '20
+663
在0个频道中
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 14 七月 | +1 | |||
| 13 七月 | +3 | |||
| 12 七月 | +21 | |||
| 11 七月 | +1 | |||
| 10 七月 | +1 | |||
| 09 七月 | +2 | |||
| 08 七月 | 0 | |||
| 07 七月 | +2 | |||
| 06 七月 | +1 | |||
| 05 七月 | +1 | |||
| 04 七月 | +1 | |||
| 03 七月 | +1 | |||
| 02 七月 | +5 | |||
| 01 七月 | +4 |
频道帖子
| 2 | #prog #article
How to recover lost files added to Git but not committed | 466 |
| 3 | спасибо за рекомендации, ютуб | 487 |
| 4 | #rust
crates.io: development update
Из заметного: на crates.io теперь можно смотреть исходники, в том виде, в котором их скачивает cargo! | 512 |
| 5 | #prog #article
pre-commit hooks are fundamentally broken
Please just don't use pre-commit hooks. Use pre-push instead. pre-push hooks nearly avoid all of these issues. | 535 |
| 6 | Тупае на днях стукнуло 10 лет | 638 |
| 7 | 没有文字... | 637 |
| 8 | если антоха - это антон, то
картоха - картон?
#quotes | 643 |
| 9 | #prog #article
Abstraction: Not What You Think It Is
As the quoted writers show, people do not even agree what abstraction means. <...>
This situation is particularly sad for me as someone with a background in PL theory. There are a lot of topics in software engineering that are the result of accumulated intuition over decades. But we've had a pretty good definition of abstraction since 1977, originally in the context of program analysis, and — I claim — it actually translates quite well into a precise definition of “abstraction” in engineering.
TL;DR: абстракции — это сугубо умозрительные конструкции, которые не отображаются ни на какую конкретную конструкцию языка программирования напрямую, и в силу своей природы разные абстракции можно строить, не трогая исходный код вообще. Перед тем, как показать определение, автор также перечисляет вещи, которые часто называют абстракцией, но не являются ей в смысле приведённого им определения. | 657 |
| 10 | However, we can make the fopen function appear to be pure, at least to certain observers, by ensconcing it in another function that hides the side effect.
void openAndDo(char* fileName, void (*doTo)(FILE*)) {
FILE* f = fopen(fileName, "r+");
doTo(f);
fclose(f);
}
Это из критики второй редакции Clean code. Дядя Боб не умеет программировать | 677 |
| 11 | Мужчинам полезно, а женщинам крайне интересно
У нас в культуре писать стоя это незыблемый символ маскулинности. Мальчиков с детства учат попадать точно в цель, а привычка сидеть на унитазе часто высмеивается как что то исключительно женское.
Гендерные стереотипы предлагаю отложить в сторону и посмотреть на процесс мочеиспускания чисто с урологической точки зрения.
Женщины сейчас будут торжествовать (и дело не только в чистом стульчаке), а мужчинам желательно переосмыслить свои туалетные ритуалы.
Чтобы мочевой пузырь полностью и без усилий опорожнился, нужно выполнить одно главное условие - максимально расслабить мышцы тазового дна.
А что происходит, когда мужчина стоит? Чтобы удерживать вертикальное положение тела, мышцы ног, пресса, спины и того самого тазового дна находятся в постоянном фоновом тонусе. Сфинктеру приходится работать с усилием, преодолевая это напряжение.
Когда мужчина садится, постуральные (удерживающие позу) мышцы выключаются. Тазовое дно полностью расслабляется, и мочевой пузырь спокойно сдувается, как воздушный шарик, не оставляя внутри ни капли.
Поверьте, это не просто красивые теории. В авторитетнейшем научном журнале PLOS One был опубликован крупный метаанализ, который поставил точку в этом вопросе.
Если молодому и абсолютно здоровому парню физиологически без разницы, как ходить в туалет, то для мужчин старше 40 лет или тех, у кого есть хоть малейшие проблемы с простатой (аденома, простатит), поза сидя имеет критическое значение.
Ученые статистически верифицировали, что в положении сидя кратно снижается объем остаточной мочи.
А остаточная моча - это та самая теплая питательная лужица, которая остается на дне пузыря, если он не сократился до конца. Именно в ней потом размножаются бактерии, приводя к хроническим циститам, простатитам и ночным забегам в туалет.
Про преимущество женщин я не забыл!
Физики из Университета Бригама Янга провели прикольный эксперимент со скоростными камерами и выяснили: при мочеиспускании стоя (даже если вы снайпер и целитесь строго в воду) образуются тысячи невидимых глазу микрокапель. Этот аэрозоль разлетается в радиусе до 1,5 метров, оседая на стенах, полотенцах и ваших зубных щетках.
Есть над чем подумать.
Спасибо, Док! в MAX | 687 |
| 12 | Весьма самодостаточным будет сказать, что из драконьей пасти вырывался флогистон. | 644 |
| 13 | #prog #rust #rustreleasenotes
Вышла версия Rust 1.97.0! Как всегда, тут только части, а остальное там.
▪️Для манглинга символов теперь используется собственная версия манглинга v0. Изначально rustc использовал схему манглинга, описанную в Itanium ABI, но со временем эта схема была закостылена для поддержки Rust-специфичных фич и потому всё равно требовала специальной поддержки со стороны отладчиков.
Новая схема обладает рядом преимуществ. Среди них — в отличие от старой схемы, не теряется информация об обобщённых аргументах, и в символ не протекает хэш из компилятора, который за пределами самого компилятора не имеет смысла.
▪️cargo теперь может контролировать влияние предупреждений на компиляцию, в частности, останавливать компиляцию при их наличии. До этого соответствующую настройку нужно было прокидывать непосредственно до rustc.
▪️Result<T, Uninhabited> и ControlFlow<Uninhabited, T> теперь триггерят линт must_use, если им помечен сам T.
▪️Добавили новый линт, который предупреждает о неиспользуемых pub-определениях в бинарных крейтах (к сожалению, allow by default)
▪️Добавили (точнее, стабилизировали) cfg(target_has_atomic_equal_alignment = N), который позволяет удостовериться, что примитивный численный тип указанной ширины и соответствующий Atomic*-тип имеют одинаковое выравнивание. Да, это не всегда так, особенно на 32-битных платформах.
▪️Стабилизировали несколько методов на примитивных числовых типах для битосовокупления: highest_one, isolate_highest_one, lowest_one, isolate_lowest_one и bit_width (этот только на беззнаковых). Эти же методы доступны и на NonZero.
▪️Компилятор теперь предупреждает, когда тип выводится, как f32, если о нём известно только то, что он реализует From<{float}>. Сейчас тип выводится однозначно, но после добавления примитивного типа f16 (да, на это есть планы) он уже перестанет таким быть.
▪️На Windows попытка обратиться к сокету после вызова shutdown теперь возвращает ошибку с io::ErrorKind::BrokenPipe. | 671 |
| 14 | #prog #java #бомбёжкипост
В статье от PVS-Studio пишут про ошибку, найденную анализатором. Именно, в строке 8 исключение создаётся, но не выбрасывается. Я, признаться честно, это пропустил, но заметил (как и другой комментатор в оригинальном канале) другую ошибку: в строке 6 записывается индекс символа = в строке setting, которая является обрезанной settings[i], но в условии в строке 7 этот индекс проверяется в settings[i], изначальной, необрезанной строке. Намерение этого кода в данном блоке заключается в том, чтобы разбить строку на две половины до и после = и убедиться, что обе части непустые, однако из-за ошибки в условии проверка может пропустить пустую строку после =.
Я решил было написать код на Rust и продемонстрировать, насколько сложнее там допустить такую ошибку банально из-за более вменяемого API, но потом я решил глянуть на этот метод немного более широко. Именно, что этот код вообще делает? Он на каждый вызов разбирает строку от начала до конца, чтобы найти нужную подстроку. Он делает лишнюю работу, если вызывается больше хотя бы раза. Разумно было бы сделать этот разбор только один раз и сложить результаты в словарь. Это убрало бы оверхед разбора и заодно переместило бы валидацию значений с каждого вызова метода на единственное создание мапы.
Я решил посмотреть, как этот метод используется. И после этого у меня начало бомбить.
Так как это приватный метод, все его использования должны быть в этом же файле. И действительно, этот метод вызывается два раза, в package-private геттере getStorageEndpoint. И знаете, с чем он вызывается? С константами BLOB_ENDPOINT_NAME и BLOB_SECONDARY_ENDPOINT_NAME, определёнными несколькими строками выше, как "BlobEndpoint" и "BlobSecondaryEndpoint"! Окей, два вызова — это не настолько плохо (при условии, что сам getStorageEndpoint вызывается один раз), но, вероятно, строка для разбора передаётся извне, поэтому сам разбор имеет смысл?
А вот и нет! Именно, строка, разбираемая в getProperty — это результат вызова getConnectionString, тривиального геттера, возвращающего поле connectString. Значение этого поля, ожидаемо, выставляется в конструкторе (типа AzureStorageSettings), через вызов статического метода buildConnectString. Этот метод составляет строку вида key=value;key=value;... из переданных аргументов, и в число этих аргументов входят endpoint (который записывается после BlobEndpoint=) и secondaryEndpoint (который записывается после BlobSecondaryEndpoint=). Знакомые строки? Да, это именно те константы, которые используются для лукапа в getStorageEndpoint. Иными словами, в getStorageEndpoint вызывается код, который разбирает строку, чтобы получить оттуда значения, которые были переданы в конструктор типа напрямую! Просто сохранив значения аргументов, можно было бы выкинуть весь метод getProperty целиком и заменить его вызовы на два доступа к полям.
Но и это ещё не всё. В методе getStorageEndpoint возвращается запись StorageEndpoint, которая является просто парой строк. Даже имена полей дают понять, что эти два значения — URI. Хранятся ли они в виде URI (этот тип даже импортируется в начале файла)? Нет, они хранятся в типе String. Как тогда код валидирует, что это действительно URI? Никак... Точнее, не всегда. Именно, StorageEndpoint создаётся в двух местах в этом файле, как раз в методе getStorageEndpoint. В первом случае строки передаются напрямую, а во втором передаются результаты вызова метода deriveURIFromSettings. Этот метод конструирует строку из полей AzureStorageSettings, а в конце там вот такой восхитительный код:
try {
return new URI(uriString).toString(); // validates the URI
} catch (URISyntaxException e) {
throw new IllegalArgumentException(e);
}
URI создаётся только для того, чтобы немедленно перевести его в строку и потерять гарантии валидности!
P. S.: посылаю лучи ненависти разработчикам нового UI GitHub, где визуальное отображения выделения текста не совпадает с реально выделенным текстом, а ссылки на результаты поиска символа не всегда переходят к нужной строке. | 710 |
| 15 | Проверили Elasticsearch и нашли ошибку. Сможете отыскать ее в этом фрагменте?
#java #ошибка | 684 |
| 16 | daily reminder that you can use LLMs to scan this kilometer-long Terms of Service agreements and find some nasty shit that they do with your data | 697 |
| 17 | Официально лучшая переписка с клиентом, обменивались заказом истерично хихикая | 827 |
| 18 | #prog #rust
В новой версии Rust 1.97 (надо, кстати, написать про релиз) обнаружилась мискомпиляция, которая приводит к сегфолту (regression-from-stable-to-stable 😱). Судя по всему, проблема с кривой кодогенерацией была с версии 1.87. Корень проблемы, однако, кроется в баге в LLVM, где некорректная трансформация превращает нормальный код в код с безусловным UB. Ошибка произошла из-за неправильной обработки poison. Никита Попов уже открыл PR с фиксом.
Почему сегфолт появился только сейчас, если баг существовал так долго? Дело в том, что в случаях, когда баг проявляется, в машинном коде использовался mov из памяти по указателю с составным индексным выражением, и в этом выражении использовался тег enum-а (считай, дискриминант, но на уровне представления). Недавно в rustc завезли изменение, из-за которого компилятор стал предпочитать для None тег -1. Раньше выбирался ближайший из ниши. При использовании в машинном коде отрицательное число реинтепретировалось, как большое положительное, что приводило к out of bounds чтению и, ожидаемо, сегфолту. Из-за упомянутого бага LLVM чтение вне границ было и раньше, но из-за того, что используемый тег для вычисления адреса был близок к набору валидных значений, к проблемам на практике оно не приводило: доступ было в пределах страницы памяти. | 816 |
| 19 | #prog #rust #article
It's not me, it's the compiler!
TL;DR: чел писал парсер и обнаружил, что rustc неправильно компилирует код, в котором есть прямой каст из bool в u32 (а если семантически эквивалентный if, то нормально). Баг подтвердили, причиной была некорректная оптимизация на уровне MIR. | 3 001 |
| 20 | И к важным новостям: завтра заканчивается летняя распродажа в Steam | 1 051 |
