Главная Юзердоски Каталог Трекер NSFW Настройки

Дневнички

Ответить в тред Ответить в тред
Check this out!
<<
Назад | Вниз | Каталог | Обновить | Автообновление | 126 99 40
Я вообще не знаю, чего я хочу, не понимаю. wawawa !V4ELguMZ7k 04/12/22 Вск 21:31:52 644092 1
v.png 12Кб, 200x200
200x200
Я вообще не знаю, чего я хочу, не понимаю.
wawawa !V4ELguMZ7k 05/12/22 Пнд 00:42:27 644155 2
untitled.png 1752Кб, 1920x1080
1920x1080
wawawa !V4ELguMZ7k 06/12/22 Втр 12:28:08 644478 3
untitled.png 4808Кб, 3952x1080
3952x1080
wawawa !V4ELguMZ7k 06/12/22 Втр 14:43:21 644504 4
image.png 238Кб, 1920x904
1920x904
untitled.png 1530Кб, 1920x1080
1920x1080
Да что не так-то.
Аноним 06/12/22 Втр 17:47:29 644546 5
>>644504
Откуда диаграмма с блоками?
wawawa !V4ELguMZ7k 07/12/22 Срд 13:15:41 644726 6
image.png 113Кб, 1099x611
1099x611
0001-0120.webm 87Кб, 853x480, 00:00:02
853x480
>>644504
Я забыл вычесть координаты точки до смещения.

>>644546
Блендор.
wawawa !V4ELguMZ7k 10/12/22 Суб 02:34:45 645282 7
x.png 25Кб, 200x200
200x200
Аноним 10/12/22 Суб 07:55:41 645298 8
Что зочнаил
wawawa !V4ELguMZ7k 10/12/22 Суб 17:07:28 645380 9
1.webm 552Кб, 1320x770, 00:00:09
1320x770
wawawa !V4ELguMZ7k 11/12/22 Вск 03:07:30 645458 10
0001-0360.webm 6322Кб, 1080x1080, 00:00:06
1080x1080
Хуже нет
wawawa !V4ELguMZ7k 16/12/22 Птн 03:24:47 646280 11
0001.webm 737Кб, 480x480, 00:00:05
480x480
Пока что не очень понял
Аноним 29/12/22 Чтв 05:16:37 649207 12
image.png 45Кб, 749x396
749x396
Мб на этомм писать а мб нет, не знаю он слишком располагает к тому чтобы писать шизу типа https://paste.ee/p/FIZkH И ансейф немного сложно, например я очень не сразу понял почему https://paste.ee/p/dpYPe эта прога на скрине крашится
wawawa !V4ELguMZ7k 04/01/23 Срд 13:08:26 650387 13
Более лимение жсон парсер https://godbolt.org/z/6PWhTT8r6 на самом деле мне он не нужен, а нужен хмл парсер, просто я ничего никогда не парсил, поэтому попробовал сначала что-то попроще. Получилось ужасно если честно
Рируру !!7MEYf11KLdyuyS8t 04/01/23 Срд 17:57:32 650428 14
050833d826ecf0c[...].jpg 101Кб, 480x640
480x640
>>650387
Вообще в идеале твой парсер должен уметь работать, не имея всю строку в памяти, а читая куски по мере необходимости. Я себе сделал гибридный вариант:

— У парсера есть поля s: StringView (текущий буфер) + sp: SizeUint (позиция в буфере), через которые ты можешь удобно работать с куском текста в памяти. 99,8% времени этого достаточно; типичная ситуация — это тебе нужно прочитать число из 4 цифр, при этом sp = 1000, а s.n (размер буфера) = 65536, то есть всё число присутствует в памяти, и для осуществления желаемого можно так же, как с единственной строкой, натравить стандартную функцию преобразования строки в число на 4 символа в буфере, s.chars[sp..sp+3].

— Если ты достигаешь конца буфера (нужно прочитать число, но sp = 65534 и s.n = 65536 — доступны только 2 символа, и все они являются цифрами, так что неизвестно, это всё число или нет), ты вызываешь функцию ReadMore, которая читает новый блок — и, если нужно (если sp < s.n), переносит хвост старого блока, начиная с sp, в начало нового. Так что после неё s.chars[sp] продолжает указывать на начало числа, и в конце концов ты всё-таки заимеешь всё число в памяти, сведя случай к предыдущему.

Например, при разборе текста «someNumber = 1234; someOtherNumber = 5678» до ReadMore ситуация может быть
>s = "someNumber = |12"
(где | — позиция sp.)
После ReadMore она станет
>s= "|1234; someOthe"
— s[sp] продолжает указывать на начало числа, а части перед sp полагаются больше никого не интересующими и разрешёнными для отбрасывания.
Аноним 07/01/23 Суб 17:20:34 651047 15
1.jpg 108Кб, 1022x960
1022x960
Я купил это и мне вообще всё равно, мне вообще всё равно
Аноним 10/03/23 Птн 00:10:08 666460 16
.mp4 2303Кб, 600x200, 00:00:07
600x200
.mp4 1013Кб, 600x200, 00:00:03
600x200
Ещё не очень понял, в чём конкретно проблема. То ли в том, что невозможно нормально реализовать автозакрытие кавычек, то ли в том, что невозможно реализовать нормальный редактор текста с фичами сложнее подстветки синтаксиса.

Я не знаю, у меня проблемы с мозгом. Ну точнее знаю. Что они есть.
Аноним 11/03/23 Суб 02:49:56 666702 17
Я вообще не понимаю, неужели нет никакого нормального способа без макросов достать из дженерик параметра какие-то компайл-тайм данные. Как вот это, например, https://paste.ee/p/acGQ1 переписать так, чтобы не приходилось вручную повторять всё. Я максимум додумался так сделать https://paste.ee/p/ChBMj, но тут проблема в том, что мне нужна эта константа при определении метода в трейте.

Я вообще не понима, неужели нет никакого нормального способа перестать быть лоу айкью дауном.
Аноним 11/03/23 Суб 22:17:14 666906 18
.png 8Кб, 1120x1120
1120x1120
Аноним 12/03/23 Вск 01:29:27 666969 19
image.png 22Кб, 549x408
549x408
Это то, как отображаются жсоны в фаерфоксе, абсолютно бесполезный визуальный мусор двоеточие в конце каждого ключа, которое выглядит как часть самого ключа, потому что оно даже цветом не отличается. Особенно плохо выглядит когда сам ключ может содержать на конце что-то вроде двоеточия.

Я не знаю, я постоянно на подобное напарываюсь, и можно было бы списать на то, что софт слишком сложный, чтобы избегать даже таких очевидных проблем, что это и не проблемы вовсе, а я просто придираюсь, но я сейчас задумался, что я так-то сам часть проблемы, потому что я в жизни своей никогда не создавал никаких баг репортов после того, как напарывался на подобные вещи. Ну я на английском просто плохо говорю ещё, умереть хочется, короче.
Аноним 19/03/23 Вск 16:01:51 668663 20
Я не могу, у меня болит голова от раста, я хочу выпилиться как минимум из-за того, что там это, например, не реализовано https://rust-lang.github.io/rfcs/1210-impl-specialization.html я не понимаю, а зачем вообще нужны все эти трейты, писать код, абстрагированный от реализации, если я не могу банально сделать две реализации одного метода в зависимости от того, какие трейты имплементирует какой-то дженерик параметр. Это всё просто слишком сложно для моего мозга, какой-то бред, можно тогда не использовать трейты в принципе и прописывать конкретные типы, и тогда уже можно не писать на расте, а писать просто на си, даже не на плюсах, шаблоны же тоже тогда не потребуются.

Я не знаю, что делать с таким критическим падением айкью, мне плохо, постоянно какие-то нечитаемые ошибки с борров чекером, я устал, я хочу подохнуть. Я не чувствую, что пишу то, что хочу, я чувствую, что пишу то, что хочет rustc. Вот, небольшой кусок мусорного кода https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d997d44761f61669b3546aa13ee3c7bf я хотел сделать, чтобы advance мог скипать байты, если он выходит за границы того, что уже прочитано. Я не понимаю, как это сделать без чтения ненужных байтов в буфер и без io::Seek. Окей, есть io::copy и io::sink(), попробовал переписать https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d6593f809fcc6f260a0d6f0e39db994c всё у меня слишком маленький айкью, чтобы понять, а что не так, зачем take мувает внутрь себя источник, откуда он читает, что вообще происходит.

Что вот мне делать, переписать, чтобы он не сам читал, а у него спрашивали, что он хочет сделать: скипнуть байты, прочесть сколько-то байтов, и потом пушили в него байты что ли, но это же бред, а может лучше просто выпилиться, потому что жить с таким маленьким айкью это просто уже невозможно.
Аноним 19/03/23 Вск 18:17:26 668693 21
>>668663
Ну так и не пиши на расте, зачем так мучиться?
Аноним 25/03/23 Суб 15:51:46 670092 22
>>668663
Если прописать use std::io::Read, то всё будет работать. Или если вместо
> self.source.by_ref().take(...)
писать
> io::Read::take(self.source.by_ref(), ...)
то тоже будет работать.

Я понятия не имею, почему так. Проблема, видимо, в том, что в трейте Read есть только take(self, ...). Но в этом файле std::io::impls https://github.com/rust-lang/rust/blob/9fa6b3c15758e85657d5be051cfa57022a8bbe57/library/std/src/io/impls.rs#L17 есть отдельно реализация трейта Read для &mut Read. Но почему он сам не может разобраться, что можно использовать реализацию из impls, я не понимаю.

Минимальный пример как-то так выглядит:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=46d6d0474f2dd91d1b0bc33de05225b5

>>668693
Проблема не столько в расте, сколько в слишком низком айкью, который ещё и продолжает уменьшаться.
Аноним 26/03/23 Вск 21:16:13 670349 23
>>668663
У меня появилось в мыслях, что можно было бы маркерами сделать два отдельных типа и в них сделать две отдельных реализации одного и того же метода. Но там всё равно без макросов в итоге не обойтись для реализации остальных методов, которые не зависят от того, какие трейты реализованы, но хотят вызывать методы, которые от реализованных трейтов зависят https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=52707488453b2530ddf0d268a505c477. Ну либо так https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=52707488453b2530ddf0d268a505c477 и я даже не знаю, что из этого хуже.

Но это даже не решение проблемы, что два отдельных типа приходится делать — это так-то бред.
29/03/23 Срд 01:13:38 670968 24
29/03/23 Срд 01:38:00 670971 25
>>670968
Вообще ещё одна шизо-идея — это заставить самого пользователя реализовывать трейт Skippable. Сделать просто два макроса с двумя реализациями. Ну как, просто, там нужно будет как минимум заморочиться, если у структуры, для которой трейт реализуется, есть дженерик параметры, например. И вроде как вместе с min_specialization, которая вроде как по крайней мере не unsound, можно сделать одну дефолтную реализацию и пользователь может через макрос уточнить её https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=b878b49b9ef2210b03a6163e1c887f27. То есть в худшем случае используется дефолтная реализация.
02/04/23 Вск 18:11:01 672094 26
>>668663
>переписать, чтобы он не сам читал
Ну в смысле, что он не будет вызывать read, не будет владеть буфером, куда читает, а будет только по указателю, который ему дают. Наверное, это лучше, не знаю, потому что более гранулярное апи получится, которое проще переиспользовать и бла-бла-бла https://youtu.be/ZQ5_u8Lgvyk, но важнее, что мне тогда не приходится использовать трейты.

Ещё в предыдущем >>650387 варианте у меня в голове была какая-то стрёмная идея, что токенизатор должен по очереди пытаться распарсить токены, про которые он знает, и, наверное, я думал, что это сделает реализацию довольно прямолинейной и будет легко добавлять новые типы токенов, но по факту получился довольно нечитабельный код.

Во-первых, жсон токенизатор всё не должен беспокоится о валидности строк, чисел и ключевых слов по типу true или false, он просто должен проглатывать все эти вещи до следующей кавычки или до следующего разделительного символа. То есть опять же, более гранулярное апи, пусть пользователь сам разбирается с валидацией utf-16 булшита в жсон строках, что там с числами и так далее.

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

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

В общем, токенизатор становится просто функцией от указателя на байты и текущего контекста.

https://godbolt.org/z/88Kfaj9os

Ну это в первом приближении, я просто хотел проверить, смогу ли я хотя бы прожевать тот же жсон.

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

Но это всё кривые решения, которые реализованы как какие-то исключения из правил, я хочу умереть.
08/04/23 Суб 15:18:51 673553 27
https://github.com/rust-lang/rust/blob/c49c4fba1168d8a776ef5207ec28000112191ae2/library/core/src/str/validations.rs#L210-L237

Это типо эвристическая оптимизация, из предположения, что рядом с ASCII символами будут с большой вероятностью другие ASCII символы?

Ещё я как-то, мне надо было хотя бы немного пролистнуть RFC у UTF-8, потому что всё же, например, не любые три байта вида
> 1110xxxx 10xxxxxx 10xxxxxx
являются валидным код поинтом. Правда, я чего-то не знаю, почему так сделали.

https://www.rfc-editor.org/rfc/rfc3629#section-4

Например, E0 80 80 — это невалидный код поинт.

Я ещё заметил, что from_utf8 возвращает в ошибке то, до какого момента байты валидны, и там есть ещё unchecked версия, которая просто каст делает. Короче, наверное, лучше этим пользоваться, если использовать std в принципе, чем городить ту кривую ерунду, которую я написал выше.

Нашёл очень доступное для лоу айкью даунов объяснение про LR(0), SLR(1) и LR(1) парсеры:
https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/handouts/100%20Bottom-Up%20Parsing.pdf
https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/handouts/110%20LR%20and%20SLR%20Parsing.pdf

Но я не знаю, хватит ли у меня айкью, чтобы реализовать генерацию action/goto таблиц хотя бы для LR(0) грамматик, а LR(0)-парсинг, если что, это когда ты применяешь правило из грамматики к последовательности символов только лишь основываясь на том, какие символы ты успел прочитать, без учёта того, что за ними идёт. То есть, например, в такой грамматике, как я понимаю, невозможно нормально реализовать оператор постинкремента или operator[].

>>672094
Нет, короче, это бред, в этом JsonTokenizerMode нет никакого смысла, усложнение кода ради ничего, в итоге получается одна жирная функция, которая обрабатывает все ситуации, вместо нескольких небольших на каждую отдельную ситуацию, да, очень ГРАНУЛЯРНО, какой же я тупорылый даун. Так, всё, я перепишу нормально, как было с самого начала, только, возможно, без шизомакросов и всё же с фиксированным буфером, куда читается входная строка.
09/04/23 Вск 16:48:48 673873 28
11/04/23 Втр 01:37:43 674394 29
Всегда казалось, что нет лучше чувства, чем когда осознанно отлыниваешь от каких-то навязанных тебе "обязанностей", не делаешь того, что ты якобы должен делать. Но, на самом деле, это просто обычное состояние, когда тебя не ничего беспокоит, а во все остальные моменты в мыслях крутится постоянно, что а вот завтра придётся что-то делать или что кто-то от меня что-то ожидает, это портит жизнь, это портит моё настроение. Я не могу спокойно жить с осознанием, что моё время мне не принадлежит мне целиком и полностью, что кому-то от меня что-то надо, что кто-то претендует на то, чтобы отнимать у меня жизнь. Всё, чего я когда-либо действительно хотел — это проснуться с осознанием, что я свободен от выдуманных какими-то идиотами обязанностей, никому от меня ничего не надо и у меня в голове не скребутся посторонние мысли на фоне. Да-да, никому и так от меня ничего не надо, если бы я лёг под мостом и помер бы там, никто бы до меня не докопался, всем было бы наплевать. Но меня вынуждают встраиваться в эту долбаную систему, где всем от всех что-то нужно, а потом ещё пытаются внушить, что я это, оказывается, сделал по своей воле, вот захотелось мне повесить на шею цепи, а теперь жалуюсь, что мне тяжело, и вообще нам тоже тяжело, а чем ты лучше? Да в жизни я бы не сделал этого выбора, если бы мог вообще сделать выбор в пользу чего-то другого. Я не могу уже так жить, в какой-то момент становится невозможно терпеть и ты просто бросаешь то, что тебя заставляли делать. А потом тебя спрашивают, а почему так, ну ты же так старался, а теперь всё дропнул, как будто я делаю что-то нелогичное. Как будто то, что я перестал отпиливать себе ногу — это что-то неразумное и раз начал пилить, то надо пилить до конца. А это именно отпиливание своей ноги, нет никакой конечной цели, у меня нет никаких амбиций, мне не нужно ничего этого, меня просто заставляют страдать ради ничего. Это не обмен ресурсов моей силы воли ради достижения какого-то результата, это просто растрата моих сил в никуда, я ничего от этого не получаю, я только теряю. Я не могу так жить, мне нужен отдых, мне нужно, чтобы от меня все отстали, это невозможно больше терпеть, мне не помогает никакой копинг, это просто патовая ситуация, в которой мне, как жертве пыток, привязанной ко стулу, остаётся только ждать, когда смерть освободит меня от страданий.
12/04/23 Срд 01:46:50 674677 30
Не могу переступить через себя, нет сил на это, в какой-то момент всегда иссякает сила воли и всё. Не становится со временем легче. Когда нет никакого смысла в страданиях, через время устаёшь и не можешь продолжать. У большинства нет таких проблем, я уверен, большинство делают то, что им либо хочется, либо то, что они по крайней мере не против делать, а страдаю я один. Я не знаю, может быть, разломать телефон и комп, забиться в угол и там сидеть, это, возможно, лучше, чем каждый день страдать. Мне просто нужно спокойствие, но большинству людей, видимо, этого не нужно и вообще они делают всё, чтобы его избегать, я не хочу, я устал, почему это всё должно происходить со мной, когда это закончится.
13/04/23 Чтв 00:37:39 674921 31
Я не могу, я не спал нормально несколько дней из-за того, что постоянно в напряжении из-за того, что мне якобы надо что-то сделать, но я не могу себя пересилить и я в итоге ничего не делаю, сегодня весь день болела голова, болели глаза и хотелось спать, сегодня снова не высплюсь, потому что буду сидеть и пытаться себя заставить себя что-то сделать, но я снова ничего не сделаю, потому что я просто не могу, у меня внутри всё противится, это невозможно побороть. Я не могу, мне нужно просто, чтобы кто-то извне обрубил этот цикл и я освободился от этих страданий.
Аноним 29/05/23 Пнд 01:46:03 683037 32
FxNfWfKaQAEKE7Z.jpg 506Кб, 1787x2048
1787x2048
Я, короче, буду тут писать сколько мне влезет вне зависимости от того, делаю ли я что-то или нет, и я буду постить картинки, какие захочу, мне вообще всё равно, потому что мне грустно, мне плохо, я, короче, сейчас посмотрел немного это https://www.w3.org/Graphics/GIF/spec-gif89a.txt и это должно быть не очень сложно сделать, там просто lzw сжатие, я не знаю зачем, но просто мемный формат: во-первых, в него официально можно пихать мусор (comment extension), во-вторых, можно сохранять rgb888 картинки, если распределить цвета на несколько кадров и рисовать новое поверх предыдущих кадров, в-третьих, это простейший способ сохранить видео.

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

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

Я начал сегодня писать читалку гифок, но пока что не успел написать даже прогу, которая бы просто проглатывала гифку без разбора. Я постараюсь найти завтра время, чтобы хотя бы просто проглотить гифку.
Аноним 30/05/23 Втр 02:42:50 683338 33
FxNuMe5agAEJHPU.jpg 642Кб, 1378x2039
1378x2039
Я, короче, не успел ничего. Нашёл такой мем https://rust-unofficial.github.io/too-many-lists/fourth-iteration.html связный список на идиоматичном расте, но у меня от него болит голова и я не до конца дочитал. Тут вроде типо в конечном счёте итерация по связному списку из элементов Rc<RefCell<Node>> упирается в то, что сначала тебе нужно запомнить, что ты одолжил голову у списка: Ref<'a, Node>, потом, что ты у одолженной у списка головы одолжил следующий за ней элемент: Ref<'b, Ref<'a, Node>>, потом, что одолжил следующий элемент у предыдущего, который был одолжен у головы, которая была одолжена у списка: Ref<'c, Ref<'b, Ref<'a, Node>>>. И ты при этом должен каким-то образом по ходу итерации держать на руках все эти промежуточные ссылки, а не только самую последнюю, потому что у последующих ссылок лайфтайм вложен в предыдущие, потому что 'a - это лайфтайм списка, 'b - это лайфтайм Ref<'a, Node>, 'c - это лайфтайм Ref<'b, Ref<'a, Node>>> и так далее. Ну вроде, я не до конца понял, короче, нужен гарбаж коллектор, получается. Это вообще просто мем, но там вроде дальше что-то про unsafe есть, но я не читал ещё.
Аноним 13/06/23 Втр 04:02:02 686709 34
FpZZWPRaEAYTnM.jpg 2166Кб, 3541x2508
3541x2508
Я не сделал, я слишком много думаю и ничего не делаю, а это бесполезно - думать, когда ты тупой, слишком маленький айкью, нет смысла, тем более, когда не особо много времени и есть, и осталось. Это даже не какие-то последовательные мысли, а просто обрывки, которые ни во что не складываются, примерно как когда утром наполовину просыпаешься и ты наполовину в сознании, а наполовину в башке крутятся бредовые остатки сна, который ты потом почти сразу забудешь. Я должен был умереть несколько лет назад, ничего хорошего не было и уже не будет, только страдания от низкого айкью, от тупости. Что, я не могу ничего пообещать. Мне кажется, что настолько всё плохо, что даже, если меня несмертельно ударить по голове молотком, то ничего не изменится, потому что максимум дальше можно только умереть и спрятаться в гроб, уже невозможно сделать хуже. Я купил себе новый проц, но вместе с ним нужна была и новая мать, старую вместе со старым процом положил в коробку, меня тоже нужно положить в горобку, нужно, чтобы кто-то спас меня от такой жизни.
Аноним 13/06/23 Втр 08:33:35 686725 35
>>686709
С возвращением тебя.

>нужно, чтобы кто-то спас меня от такой жизни.
Однажды я курил с обычным пацаном с района, мы стояли и был обычный диалог гоп-стиль ни о чём. Я вижу как к нам идёт один казах, я думаю что он такой же как другой чувак, дескать типичный пацанчик с района и он так себя и вёл, пока я что-то не сказанул про античную философию...

Я люблю поговорить, но глубоких познаний у меня нëт ни в чём, этот казах меня раскатал как ребёнка. У него даже тон изменился, он стал настоящий когда мы начали говорить про философию. А выглядел как обычный "четкий пацан". Я тогда особого внимания не это не обратил.

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

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

Бог тебе в помощь.
Аноним 18/06/23 Вск 02:35:47 687871 36
o.mp4 18792Кб, 854x480, 00:03:09
854x480
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=1a2cd6377a42dd7dc9df490bf9ddb102

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

В итоге я не знаю, как достать на этапе компиляции размер массива, мне кажется, это невозможно. В плюсах это можно сделать просто через constexpr метод, а здесь результат выполнения const функции считается константным только, если все аргументы у неё константные. Нужен хотя бы аналог decltype.

Вообще с массивами невозможно нормально работать из-за того, что слайсы теряют свой размер даже, если он известен: если array - это [T; N], то array[..] - это всё равно просто &[T]. Можно сделать .get(...).as_ptr().cast::<[T; N]>(), но проверки на то, что слайс не выходит за границы, похоже невозможно сделать в компайл-тайме из-за проблем выше.

Да, клиппи предупреждает, если слайс выходит за границы массива, но клиппи - это не компилятор, что там случилось с if it compiles, it works, это типо всё приколы и несерьёзно что ли. Причём просто доставание элемента по индексу, который выходит за границы - это rustc считает ошибкой, но если слайс выходит за границы - то уже нет.

И что, и какой смысл во всём этом тогда.
Аноним 03/07/23 Пнд 02:36:25 692316 37
Fz3z5C9akAE39u0.jpg 519Кб, 2152x4082
2152x4082
>>683037
Позавчера вчера сегодня написал всё же что-то короче декодирование, но у меня нет сейчас доделывать, как есть в общем https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=fa66d48c734dcceb560a79a232760999 это какая-то дефолтная гифка с википедии, я не знаю, зачем я храню lzw коды в хештаблице, ну и бред, вот это эффекты низкого iq, но я не могу уже сейчас доделывать, я рандомно раскрасил, там даже яркость пикселей не вычисляется, я даун тупой

Я не понимаю, почему Rc<[u8]> не хочет становиться владеющим итератором, разве он не владеет данными, постоянно ошибки какие-то, что я ссылку на временное значение делаю. Я просто хотел из impl Iterator<Item = Rc<[u8]>> сделать impl Iterator<Item = u8>, но не выходит, не знаю. С вектором вместо Rc работает, а в чём принципиальная разница между ними - я не понимаю. Наверняка снова какой-то кринж раст момент, который где-то мельком упоминается, что ты какой-то трейт не импортировал или что-то в этом духе, и максимально бесполезное сообщение об ошибке, я бесполезное хочу подохнуть, мне испортили жизнь, руки чешутся что-нибудь разбить + сломать

Винда мусор, всё, она взяла сама по себе ночью всё позакрывала и ребутнулась, чтобы установить апдейт, если у меня будет новая видеокарта, то это будет амд, и я больше не хочу на винде сидеть, просто бред, неюзабельно. Гит тоже помойка неюзабельная, stash push по умолчанию туда пихает и не staged изменения, и staged, и потом после stash pop они объединённые, спасибо огромное, как же тяжело в гите потерять данные, ага, да вообще не понятно что какие команды делают со стейджем

Да всё, ничего хорошего, я хочу подохнуть, потому что слишком низкий iq + мне испортили жизнь + я тупой даун + я тупой даун, я не знаю, что мне делать, я никак не могу дождаться, когда все сдохнут и я тоже, очень нужно уничтожение всех людей, пожалуйста
Аноним 09/07/23 Вск 17:27:43 694315 38
F0kT9vyaEAE4N0b.jpg 436Кб, 1603x2048
1603x2048
Я хочу, наверное, написать препроцессор + парсер сишных хедеров, но это выглядит как что-то слишком сложное и я, наверное, слишком тупой для этого. Типа вообще какой смысл жить если у меня плохой мозг, я каждый день от этого страдаю. Я просто не знаю, как это нормально сделать, ещё и макросы в си слишком сложные, потому что

во-первых, их не отличить от вызова обычных функций, то есть если ты увидел что-то вроде "do_something()", то, не прочитав весь код (все дефайны) до этого момента, ты не можешь знать, это макрос или вызов функции, и нужно ли его раскрывать

во-вторых, у функциональных макросов сначала полностью раскрываются аргументы и потом они подставляются в функциональный макрос, то есть ты не сможешь просто по очереди всё раскрывать, придётся вперёд смотреть, например, в "a(b(c(d)))" нужно будет сначала раскрыть d, потом c(раскрытое d), в раскрытии которого тоже могут быть макросы, которые придётся раскрыть

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

> #define first a, b
> #define second c, d
> #define test(a, b, c, d) (a) (b) (c) (d)
>
> test(first, second)

это при раскрытии не должно выдать (a), (b), (c), (d), нужно запомнить, что "a, b" - это первый аргумент у test, а "c, d" - второй. Придётся как-то это учитывать, короче, макросы это не просто search and replace как в текстовых редакторах

И ещё в расте в std нет нормального связного списка, там нет способа вставить в середину за O(1): нельзя разбить связный список на два по позиции курсора, пришлось бы писать свой.

Наверное, придётся делать что-то древовидное и постепенно его раскрывать, типа, если есть такое:

> #define add(a, b) a + b
> #define f3(f, a, b, c) f(f(a, b), c)
> #if f3(add, 1 + 1, 2, 3) == 7
> idk
> #endif

Ну, наверное, читаешь все определения и сохраняешь их в каком-то виде, например

название макроса, названия параметров, определение макроса для function-like макросов:
> (String, Vec<String>, Vec<Token>)

или название макроса + определение для object-like макросов:
> (String, Vec<Token>)

а токены в определении макроса сохраняются так:
> enum Token {
> Obj(String),
> Func(Obj(String), Vec<Vec<Token>>),
> Seq(Vec<Token>),
> Other(...),
> }

И тут Func - это просто что угодно, что выглядит как f(x, y, z), но мы не знаем, это вызов функции или макрос. А Obj - это какой-то идентификатор, за которым нет круглых скобок. И название Func хранится как Obj, потому что оно в теории тоже может раскрыться:

> #define add(a, b) a + b
> #define test(a, b) f(a, b)
> #define f add
> test(1, 2)

Типа, add сохранился бы как (add, [a, b], [Obj(a), +, Obj(b)]) и потом, когда надо будет делать подстановку, просто меняем Obj(a) на аргументы-последовательности-токенов внутри первого аргумента.

Ну, допустим, пришло время развернуть "f3(add, 1 + 1, 2, 3) == 7". Ты сначала парсишь это как Vec<Token>, ничего не раскрывая:
> [Func(Obj(f3), [Obj(add), Seq([1, +, 1]), 2, 3]), ==, 7]

Потом идёшь и раскрываешь все аргументы у Func, раскрываешь Obj в названиях Func, и просто все Obj макросы тоже раскрываешь. И если попадаются названия макросов у Func, то раскрываешь это всё как function-like макрос:

> [Func(Obj(f3), [Obj(add), Seq([1, +, 1]), 2, 3]), ==, 7]
> [Seq([Func(Obj(add), [Func(Obj(add), [Seq([1, +, 1]), 2]), 3])]), ==, 7]
> [Seq([Func(Obj(add), [Seq([Seq([1, +, 1]), +, 2]), 3])]), ==, 7]
> [Seq([Seq([Seq([Seq([1, +, 1]), +, 2]), +, 3])]), ==, 7]

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

> #define z 42
> #define y z
> #define x y
> x

Выглядит тупо, но я не знаю, как нормально сделать без этого древовидного бреда и вообще даже так, я не представляю, как это написать более-менее нормально и не совсем длинно
Рируру !!7MEYf11KLdyuyS8t 09/07/23 Вск 18:45:11 694324 39
7314870aadc53b9[...].jpg 641Кб, 1119x800
1119x800
>>694315
Во Free Pascal макросы (там нет функциональных, но функциональные должны делаться несложной модификацией, заключающейся в том, что на время их непосредственного раскрытия их аргументы тоже считаются специальными макросами; лет через 10 сам сделаю... ... ...) сделаны следующим образом: штука, которая читает токены (на самом деле символы, но, наверное, это естественно делать на уровне токенов, чтобы проще обрабатывать пустые макросы, конкатенации и т. п.), может быть переключена на новый файл, а по его завершении возвращается к предыдущему. Само по себе это реализует инклюды, но и макросы реализованы как псевдо-файлы, на которые сканер переключается и затем возвращается к предыдущему (настоящему файлу или внешнему макросу). То есть мы работаем не со связным списком токенов, в середине которого периодически устраиваем разворачивания, а со стеком файлов и единственным токеном, читаемым в данный момент.

Это позволяет результату разворачивания макроса быть сколь угодно большим, его существование в памяти целиком не требуется. Конечно, в зависимости от того, в какие конструкции он разворачивается и что с ними происходит дальше, это может не помочь, но, во всяком случае, даже тогда препроцессору делает честь, что с нехваткой памяти упал не он.
11/07/23 Втр 14:08:08 694861 40
Разбил стекло на телефоне, кинув его об пол, теперь на пальцах постоянно какие-то мелкие крошки от растрескавшегося стекла, надеюсь, они попадут мне в глаза и я ослепну
Аноним 23/07/23 Вск 18:10:33 697838 41
F1AdTaRaMAA1xzL.jpg 373Кб, 1448x2048
1448x2048
Аноним 25/07/23 Втр 05:49:54 698185 42
Аноним 29/07/23 Суб 19:15:43 699433 43
F2JcnRWaYAEIPX3.jpg 61Кб, 675x911
675x911
Аноним 30/07/23 Вск 17:05:25 699641 44
F2NMoN-a4AAQTf5.png 648Кб, 629x880
629x880
ffi кринж + аутизм https://gist.github.com/poppyfanboy/30221b602f688faf3ff6903ce89ba878 Ну вроде вручную делать это даже не очень болезненно, но всё равно аутизм. И естественно микрософт выбрали какой-то непонятный формат для описания апи https://learn.microsoft.com/en-us/uwp/winrt-cref/winmd-files почему нельзя было просто хмл какой-нибудь использовать, даже лень смотреть, что это

Ещё этот непонятный wWinMain, но вроде можно ориентироваться на то, как сделано в вайне https://github.com/wine-mirror/wine/blob/master/dlls/winecrt0/exe_wmain.c
Аноним 31/07/23 Пнд 14:59:43 699958 45
F2WK1E8aQAU9MbX.jpg 376Кб, 1761x1761
1761x1761
Мемно

https://godbolt.org/z/7n15qWd3E

Я вообще не знал, что у std::span есть второй шаблонный параметр и по дефолту он максимальный size_t и по дефолту std::span - жирный указатель, но если его размер известен в компайл тайме, то он просто указатель

Ну как бы понятно, что надо просто использовать метод .size(), но просто

Но даже с такими возможностями выстрелить себе в голову мне это больше нравится, чем
чем раст с его трейтами >>668663 и с его const функциями >>687871
Аноним 13/08/23 Вск 22:08:07 703767 46
F2ni3o5bQAALsYk.jpg 407Кб, 2000x3000
2000x3000
Написал типо читалку UTF-8 символов, которая читает их постепенно откуда-то. И использюущийся в ней аналог BufReader, который может только чуть-чуть консюмить и чуть-чуть дочитывать. В интерфейсе, короче, функции такие, отчасти выбранные под влияением https://github.com/tsoding/sv/blob/master/sv.h:

- посмотреть строку в буфере

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

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

- посмотреть/откусить следующий символ (просто вообще минимум, что от читалки требуется)

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

- откусить от начала буфера до подстроки-разделителя (например, можно откусить до конца многострочного коммента)

- посмотреть, начинается ли буфер с какой-то строки (например, посмотреть, начался ли многострочный коммент)

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

Я думал добавить ещё вариант предиката не по отдельным символам, а по окну из нескольких символов, но, во-первых, я пока что не вижу, где такое могло бы мне пригодиться, а, во-вторых, такая функция слишком сложная, чтобы использовать её в простых ситуациях, но недостаточно сложная, чтобы применять её в сложных ситуациях. Типо, если тебе что-то такое нужно, то, скорее всего, тебе этого не хватит и нужны уже будут полноценные паттерны какие-то или регекспы.

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=4ddd00c02b50063955816444b441ee70

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

Я знаю про существование BufReader в std раста, но его проблема в том, что у него какой-то не очень интерфейс: там fill_buf читает больше байтов только, если ты буфер полностью законсюмил. То есть нельзя чуть-чуть законсюмить байтов и чуть-чуть дочитать, если что-то не влезло в буфер.

Ещё я чёто, листая код std, понял, что read в трейте Read так-то требует того, чтобы ему давали инициализированную память, куда он будет писать то, что прочёл. Потому что в теории реализацию read ничего не останавливает просто вернуть Ok(42), ничего не записать, и ты потом прочтёшь мусор в буфере, который так и остался незаполненным, и в расте подобные вещи называют unsound, типо, что можно либу каким-то неправильным образом использовать и получить какую-то уязвимость. Но там сделали вот это https://rust-lang.github.io/rfcs/2930-read-buf.html, частично, пока до не доделали.

Там и до этого в рамках std был костыль, чтобы избегать излишних инициализаций буферов https://github.com/rust-lang/rust/pull/81156/files#r766012221, но теперь типо заменили на костыль, который может использовать кто угодно. Но проблема в том, что теперь им, видимо, придётся везде добавлять эти функции, которые принимают https://doc.rust-lang.org/nightly/std/io/struct.BorrowedCursor.html, чтобы явно показать, что сюда можно передавать неинициализированную память. Тут например https://doc.rust-lang.org/stable/std/net/struct.UdpSocket.html#method.recv_from.

Не знаю, правда, действительно ли стоит с этим заморачиваться, это ещё к тому же чисто типичные растопроблемы, какой ужас, я прочитаю мусор. Ну хотя это может вызвать даже UB вроде, но я не понимаю, почему https://rust.godbolt.org/z/Y9rL-5

Очень много unsafe, но я поэтому написал тесты. Единственное нужно с алиасингом осторожнее быть, например, вот это вроде как UB:

> use std::ptr;
>
> let mut test: [u8; 3] = [0, 1, 2];
> unsafe {
> ptr::copy(
> test.as_ptr().add(1),
> test.as_mut_ptr(),
> 2,
> );
> }

А так вроде как нормально, потому что не создаются промежуточные ссылки, когда ты берёшь второй указатель, после того, как ты взял первый указатель. Типо получается, что у тебя есть, например, одновременно константный указатель и мутабельная ссылка. Что-то такое, короче, я не до конца понимаю https://doc.rust-lang.org/stable/std/ptr/macro.addr_of.html:

> use std::ptr;
>
> let mut test: [u8; 3] = [0, 1, 2];
> unsafe {
> ptr::copy(
> ptr::addr_of!(test).cast::<u8>().add(1),
> ptr::addr_of_mut!(test).cast(),
> 2,
> );
> }

Вот можно ли так кастить указатель на слайс я тоже не уверен.

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

И это всё компилятор не отлавливает никак. Если у тебя где-то есть указатели, то сам ломай голову с этим, раст сложнее плюсов в разы. Есть miri, но он медленный, не умеет интерпретировать произвольные программы (вроде, например, в FFI он не умеет совсем сейчас) и выдаёт сообщения об ошибках нечитаемые для low iq дебила типа меня.
13/08/23 Вск 22:10:26 703768 47
U+3000 больше не работает, а U+2800 в спам-листе, ясно
Аноним 25/09/23 Пнд 05:48:19 713297 48
Untitled.png 26Кб, 990x684
990x684
Untitled2.png 83Кб, 990x684
990x684
>>666460
У меня снова началась эта шиза, потому что мне хуёво блять и я либо сижу и нихуя не делаю, либо занимаюсь хуйнёй, заново переписал конфиг, не глядя на старый-старый, который я даже не использовал в пользу старого более минималистичного. Но получил в итоге примерно то же самое, но на этот раз более-менее разобрался с ленивой загрузкой плагинов, благодаря чему оно хотя бы стартовый экран с меню относительно быстро почти мгновенно открывает, тупо потому что почти ничего не грузит. Корову не я нарисовал, я её украл

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

https://github.com/stevearc/oil.nvim вот это вот прикольно, можно редактировать дерево файлов так же, как текстовые буферы в виме, не надо разбираться со всякими непонятными биндингами

https://github.com/andymass/vim-matchup и это, но только из-за того, что % из дефолтного вима не работает нормально в некоторых ситуациях

https://github.com/debugloop/telescope-undo.nvim и это, но это по сути просто более удобный интерфейс для взаимодействия со встроенной фичей в виме undolist. Типа у меня постоянно проблема в том, что я что-то пишу, потом делаю несколько раз undo, потому что написал кринж, пишу снова, а потом вспоминаю, что я хочу скопировать что-то из текста, который я убрал через undo, и в любом нормальном текстовом редакторе этот текст безвозвратно пропадает

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

Но я не знаю, стоит ли оно вообще того, есть ли смысл в более сложном автодополнении, чем просто по словам в текущем файле. Я до сегодняшнего сколько-то месяцев использовал максимально минималистичный конфиг неовима, где из плагинов были только vim-surround и цветовая схема, и не то чтобы чувствовал себя сильно обделённым. И то, я думаю, не должно быть сложно написать свой примитивный кеймап для того, чтобы поставить скобки или кавычки вокруг выделения. Типа в виме просто автоматом есть маркеры < и > вокруг последнего выделения, просто на них прыгаешь, вставляешь символы, прыгаешь на изначальную позицию и всё.

С использованием netrw тоже, наверное, можно смириться.

В виме даже греп есть встроенный. Поиск и замену на несколько файлов немного неудобно делать (нужно сначала через vimgrep добавить файлы в quickfix, а потом cdof сделать), но тоже терпимо

https://neovim.io/doc/user/digraph.html#digraphs-use и про это тоже не знал, полезно для меня, потому что я слишком тупой, чтобы запомнить даже несколько юникодовых кодов для часто исопльзуемых символов, которых нет на клаве

Для дебаггинга есть просто gdb, там, оказывается, тупо есть графический режим, где показывается исходный код и для того же раста можно даже настроить сорсмапы для стд. И оно даже на винде почти работает (старая 12 версия работает нормально, а 13 версия и актуальный на сегодня trunk - нет, ну это вот типичный виндовс экспириенс, что ничего не работает). В виме даже есть встроенный плагин для gdb (termdebug), но он как-то не очень работает. Этот получше https://github.com/sakhnik/nvim-gdb и поддерживает lldb ещё

Мне, наверное, надо просто сделать опцию в конфиге, чтобы можно было либо выключить все плагины, либо оставить только минимальный набор (точно без LSP).

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

Ну разъебал я телефон окончательно об стену, купил новый, но мне телефон так-то не очень-то нужен. Болезни в большинстве случаев сами проходят, зубы, да похуй на зубы: их просто год не чистишь, они обрастают защитой из зубного камня и всё. Что блять на них покупать, шоколадки? да в рот я ебал шоколадки, они все на вкус говно и меня тошнит от них, я не хочу нихуя, я ебал всё и всех в рот, ненавижу. Охуенная трата сил и часов своей жизни в никуда

https://github.com/PowerShell/PowerShell/issues/1908 на это наткнулся, в cmd это просто работало. Я не буду больше пользоваться павершелом, это невозможно. И вингетом тоже, потому что он легко может рандомно заруинить установленную прогу при обновлении. Или установить что-то без нужных зависимостей, но это вообще на винде всегда так, что устанавливаешь что-то, а потом разбираешься, каких dll не хватает. И вскодом, потому что обычно это ещё более худший опыт настройки плагинов, чем в неовиме: куча каких-то жсонов, в которые иногда можно встраивать ${переменные}, нельзя прописать в жсоне просто список плагинов, чтобы вскод сам их установил, нужно обязательно мышкой прокликивать установку.

Микрософт портит мне жизнь. И скриптовые языки тоже, я ненавижу питон, я не понимаю, зачем он существует, ты пробуешь что угодно установить, написанное на нём, и выясняется, что у него есть какие-то платформозависимые зависимости, колёса какие-то, что они то ли компилируются, то ли там бинарники скачиваются, что тебе нужен мейк, сишный компилятор и что в итоге оно всё равно не компилится и выдаёт километр ошибок. Это просто типичный опыт вызова pip install, на винде так точно. На линуксе наверняка иногда тоже, потому что у тебя необязательно установлены все зависимости и естественно pip install не может их подтянуть, это же всего лишь пакетный менеджер для кроссплатформенного языка

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

У меня типа просто есть скрипт, который скачивает всякую ерунду, но из-за того, что он написан на жс, я не могу его запустить, мне придётся устанавливать ноду и я так думаю, что ну это слишком сложно, обойдусь
Аноним 04/10/23 Срд 17:42:07 714458 49
1696430524319.jpeg 1942Кб, 4080x3072
4080x3072
Каждый ёбаный день состоит из страданий
Аноним 05/10/23 Чтв 01:34:56 714531 50
11.mp4 14865Кб, 1280x1024, 00:04:15
1280x1024
Я обязательно нарисую треугольник, вот завтра начну, честно, если нахуй не сдохну от сердечного приступа завтра, что очень вероятно, потому что жизнь хуйня и я хочу умереть, не получается, нет времени ни на что, потому что его не очень много, я не умею пользоваться доступным и мне слишком хуёво, блять, каждый божий день.mp4
Аноним 06/10/23 Птн 04:03:07 714653 51
111111111111111[...].mp4 19941Кб, 1280x1024, 00:06:17
1280x1024
Не хочется жить больше, я не чувствовал себя живым весь день, вечером сильно болела голова из-за страданий, и только ночью стало лучше
Аноним 08/10/23 Вск 05:54:08 715034 52
111.mp4 15458Кб, 1280x1024, 00:05:34
1280x1024
Я ненавижу себя и свою жизнь
Аноним 09/10/23 Пнд 03:54:48 715224 53
1.mp4 17729Кб, 1280x1024, 00:05:59
1280x1024
Я хочу умереть
Аноним 12/10/23 Чтв 03:30:34 715644 54
11.mp4 19583Кб, 1280x1024, 00:08:20
1280x1024
Лайк, если хочешь нахуй сдохнуть блять
Аноним 12/10/23 Чтв 03:33:51 715645 55
>>715644
Твой голос буквально АСМР.
А я люблю АСМР.
Не знаю о чем ты там пиздишь, но годно.
Латгардис !!gfK0R8pET4G4HpXN 12/10/23 Чтв 03:34:45 715646 56
.
Аноним 15/10/23 Вск 15:42:37 716209 57
1.mp4 20225Кб, 1280x1024, 00:08:36
1280x1024
Я ненавижу жить блять я блять ненавижу, хочу нахуй сдохнуть уже блять пожалуйста
Аноним 15/10/23 Вск 16:26:43 716221 58
>>716209
То ли мне показалось, что ли у тебя расхождение с тем, что ты пишешь и тем, как ты говоришь. У тебя вполне спокойный нормальный голос, не подавленный какой-то, рассказываешь интересно.
Ты это просто так пишешь, про сдохнуть, типа прикол такой?
Аноним 18/10/23 Срд 03:56:47 716563 59
1.mp4 19890Кб, 1280x1024, 00:08:37
1280x1024
Ненавижу свою ебаную жизнь блять
Аноним 22/10/23 Вск 05:11:13 717072 60
1.mp4 17820Кб, 1280x1024, 00:07:44
1280x1024
Я уёбище блять
Аноним 23/10/23 Пнд 05:02:13 717196 61
1.mp4 9483Кб, 1280x1024, 00:03:32
1280x1024
Я хочу куда-нибудь спрятаться блять я у меня руки чешутся что-нибудь разъебать и спрятаться и чтобы меня никто не нашёл я ненавижу свою ебаную жизнь, блять я не хочу так жить больше сука, я куплю участок земли с деревянным полусгнившим домом, поселюсь там и нахуй замёрзну насмерть или случайно спалю его вместе с собой. НИчего блять хорошего, всем блять что-то надо от меня идите нахуй, я хочу просто сидеть и сидеть в экран, я не хочуть блять ничего больше
Аноним 24/10/23 Втр 21:39:47 717359 62
05ff5642cb3eefd[...].mp4 9786Кб, 640x360, 00:02:03
640x360
Я не могу делать то, что мне не хочется (то есть почти что всё), мне становится плохо и со временем я не привыкаю, а становится только хуже, у меня начинают чесаться руки, чтобы сломать что-то что попадётся под руку или ударить себя по башке. И в какой-то момент я просто физически не могу себя заставить вообще ни минуты больше делать то, что мне не хочется, мне физически плохо. Это примерно то же ощущение, когда берёшь нож с мыслями, ну вот ща всажу его поглубже, но как только доходит до дела, то всё внутри противится, потому что ну объективно нельзя такое делать, если ты нормальный человек, а не ебучая школьница

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

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

Я могу уехать от них месяца на 4 максимум, а потом, видимо, лечь на пол, сдохнуть от голода и мумифицироваться, потому что абсолютно все работы доступные человеку с низким айкью - это подобное дегроидное говно, от которого мне хочется залезть на потолок. Либо притворяться, что работаю, блять, подделывать скрины из бансковского приложения
Аноним 29/10/23 Вск 01:34:49 717803 63
1.mp4 19157Кб, 1280x1024, 00:08:19
1280x1024
Мне хуёво блять
Аноним 04/11/23 Суб 19:23:46 718445 64
1.mp4 19966Кб, 1280x1024, 00:14:12
1280x1024
Я хочу нахуй сдохнуть блять
Аноним 07/11/23 Втр 02:35:17 718610 65
1.mp4 14637Кб, 1280x1024, 00:05:54
1280x1024
Ничего хорошего не будет, ничего хорошего не было, я блять уёбище я хочу чтобы всё закончилось, я хочу один раз удариться головой об стену и чтобы она раскололась как скорлупа у яйца и всё блять сука блять сука
!LLucyYYYHM 09/11/23 Чтв 04:04:55 718760 66
Вот, видите. Именно такие мысли продуцирует неовим у каждого его пользователя.
Аноним 14/11/23 Втр 02:20:03 719293 67
1AV1.mp4 18900Кб, 1280x1024, 00:09:40
1280x1024
Я блять не могу больше
Аноним 14/11/23 Втр 02:22:17 719295 68
2AV1.mp4 20104Кб, 1280x1024, 00:13:35
1280x1024
Я уёбище
Аноним 25/11/23 Суб 17:11:03 720336 69
1AV1.mp4 20251Кб, 1280x1024, 00:12:56
1280x1024
Аноним 30/11/23 Чтв 00:44:33 720767 70
FIQVntaMAAfb78.jpg 462Кб, 2028x2048
2028x2048
Я ненавижу свою ебучую жизнь блять, я тупорылое уёбище и это само по себе причиняет страдания и я не могу выдерживать того, что мне сверху испортили всю мою ебаную жизнь и впереди нихуя не будет абсолютно ничего хорошего никогда, потому что физически невозможно, чтобы что-то хорошее произошло это всё равно что мне ногу отрубили и я теперь всю оставшуюся жизнь вынужден вприпрыжку передвигаться на одной сука блять ноге блять сука и давай, привыкай, живи с одной ногой и вообще тебе повезло ещё или якобы и нет никакой проблемы, а вообще одни плюсы в том, чтобы с одной ногой жить, на что ты жалуешься, блять идите нахуй сука вы ненавижу я хочу, чтобы вы все умерли
Аноним 03/12/23 Вск 04:17:56 721013 71
1.webm 15871Кб, 1920x1440, 00:00:31
1920x1440
Я не знаю, что мне делать, все мысли в моей голове - ебаное говно, я тупой долбоёб
Аноним 04/12/23 Пнд 01:33:02 721104 72
F52w4-FWIAANGie.jpg 2592Кб, 2383x2157
2383x2157
Я эту ебаную зиму не переживу, ну почему так ебано то, блять, почему настолько безнадёжно, просто всё, всё, нихуя не будет всё
Аноним 06/12/23 Срд 14:30:57 721347 73
1701862255988.jpeg 1356Кб, 4080x3072
4080x3072
почему всё так
Аноним 10/12/23 Вск 01:40:55 721706 74
image.png 69Кб, 552x747
552x747
image.png 79Кб, 424x448
424x448
image.png 8Кб, 424x44
424x44
Я пять секунд попробовал гитхаб копилот, короче, он буквально сразу же нагенерил мне заведомо нерабочий мусор, причём выглядит правдоподобно, но всё равно бред. Короче, юзлесс, как и чатгпт
Аноним 10/12/23 Вск 22:13:50 721791 75
mp4omp 134Кб, 844x426, 00:00:02
844x426
Я сейчас на работе буквально ничего не делаю и каждый день придумываю оправдания, почему я что-то не сделал, создаю видимость, что я что-то делаю, кормлю завтраками и тд. Не могу себя заставить, потому что мне не хочется, мне не интересно, мне противно, нет никакого положительного стимула это делать.

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

У тебя просто нет возможности в течение, например, недели делать только что-то одно, без переключения на другие вещи. А как-то пытаться совмещать - это бесполезно, я пытался, у меня не хватает сил ни физических, ни моральных. Получалось так, что я ничего не успевал, тот треугольник рисовал почти два месяца, например.

Я в итоге сейчас просто целыми днями сижу и ничего не делаю, в состоянии ступора какого-то, я не знаю. Я всегда хотел только одного - чтобы я мог проснуться, осознавая, что никому от меня ничего не надо, что я могу потратить своё время так, как мне вздумается. Но этого просто никогда не будет, потому что, видимо, абсолютное большинство людей всё устраивает, возможно, им даже нравится, когда им нон-стоп ебут мозг.
Аноним 14/12/23 Чтв 00:14:24 722169 76
GBOIgthbAAAxCuM.jpg 697Кб, 3090x4096
3090x4096
>>721791
Если я так и не начну сегодня ничего делать, то возможно меня уволят, потому что я ничего не делаю уже достаточно времени, чтобы это вызвало недовольство. Но проблема в том, что мне как-то всё равно, я хочу, чтобы всё как-нибудь просто закончилось, но мне никто не поможет, просто проблема в том, что меня потом снова погонят в рабство в стойло, либо у меня просто деньги закончатся, если я съеду от них, чтобы они меня не трогали. А откуда брать деньги, не прикладывая никаких усилий, или как жить без потребности в деньгах, при этом пользуясь интернетом и электричеством и не имея своего дома, я не знаю, я слишком тупой и бесполезный для этого

Почему я просто не родился красивой женщиной, всё было бы настолько проще, вот вообще тупо всё, а так это просто бесполезно жить так нет смысла никакого, не на что надеяться, ничего из более-менее вероятного в теории не может произойти, что могло бы исправить моё положение, и я сам ничего сделать не могу, ничего хорошего не будет
Аноним 16/12/23 Суб 18:50:45 722500 77
video2023-12-16[...].mp4 3848Кб, 1280x720, 00:00:13
1280x720
Аноним 17/12/23 Вск 03:20:14 722587 78
oo.mp4 14391Кб, 1280x1024, 00:00:46
1280x1024
cos(колво рукавов × угол + направление закручивания × 2π × (колво оборотов × расстояние от центра + время))

Я бы не додумался сам потому что я тупорылый долбоёб

Фликеринг жёсткий

Похуй
блять мне
Аноним 17/12/23 Вск 05:08:03 722589 79
>>722169
Какая зп, какой потолок в конторе, скока получают топманагеры, главхуй, скока оборот, какая продукция производится, куда сбывается?
Сори за такие интимные вопросы, но ответь хоть на что-то, раз ты дневниковод.
Аноним 17/12/23 Вск 16:10:08 722633 80
F8hLDLcacAAQRpr.png 29Кб, 546x546
546x546
>>722589
>Какая зп
Недостаточно большая, чтобы можно было за год рабства ХОТЯ БЫ накопить на покупку своего участка с домом, то есть обоссанные копейки. Как и на большинстве работ: хватает только на то, чтобы покупать всякую потреблядскую парашу, но не на нормальные вещи.

>какая продукция производится, куда сбывается
Это всё не имеет значения. Если у тебя IQ <130, то тебе доступны только бесполезные бессмысленные говноработы, от которых течёт мозг и на которых ты деградируешь, просто впустую всираешь часы своей жизни, свои силы.

И мне похуй на то, что там другие люди считают "полезным" трудом, я, например, в рот ебал центральное водоснабжение. Наверняка дохуя сложно поддерживать в нормальном состоянии всю эту ебаную систему, наверняка нужны какие-то специальные знания и далеко ненулевой интеллект, наверняка большинство людей считают её даже не просто полезной, а жизненно необходимой, но в моих глазах она не нужна, потому что Я НЕ МОЮСЬ БЛЯТЬ.

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

Я ебал всё в рот, мне похуй, ему похуй, похуй похуй похуй
Аноним 21/12/23 Чтв 17:48:12 723147 81
GB3Qa5saMAAdlpg.jpg 171Кб, 1000x1000
1000x1000
Не, это вообще полностью бесполезно, у меня дни слились просто в один длинный, ещё и солнце не светит никогда и я не понимаю, что вокруг происходит и мне просто постоянно плохо, физически тоже постоянно ощущение сдавленности в грудной клетке, сижу ничего не делаю.

Я скорее всего, съеду от родителей в январе и тогда же стану безРАБотным с 90% вероятностью. И не знаю, что буду делать дальше, не знаю, на сколько месяцев хватит денег. Пытаться снова лезть в говнокодинг за деньги нет никакого желания, не хочу работать, работа - это рабство, мне внутри всё внутри грудной клетки прогрызли крысы
Аноним 21/12/23 Чтв 22:56:20 723200 82
1.mp4 149Кб, 500x374, 00:00:01
500x374
Впереди нет ничего, просто чернота, я не могу ни на что повлиять, не могу ничего сделать. Неважно, например, даже если я себя сейчас убью, то это буквально тот же самый исход, как если я не сделаю этого. Ни в чём нет смысла
Аноним 23/12/23 Суб 20:21:12 723469 83
без отдельного.mp4 3097Кб, 1280x1024, 00:00:11
1280x1024
отдельный скрин[...].mp4 4910Кб, 1280x1024, 00:00:16
1280x1024
Короче эта тема с якобы двойной буферизацией через сделать два скринбуфера CreateConsoleScreenBuffer и потом их по очереди показывать через SetConsoleActiveScreenBuffer как будто всё же немного улучшает, но только на conhost.exe, в виндовс терминале - без разницы, в алакрити оно как будто вообще только хуже делает. К тому же когда перезапускаешь в той же консоли заново, то во варианте с двумя скринбуферами почему-то всё неправильного размера начинает рисоваться, короче, это бред пытаться это использовать

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

Единственное, что стоило сделать - это заменить растовый print! на WriteConsoleW, потому что раст похоже делает какую-то буферизацию и непонятно как преобразовывает utf8 строки в utf16 для винды, а я использую юникодовые символы, мне лень разбираться, проще самому сделать, вроде немного лучше (ну точнее в conhost.exe print вообще адекватно не работал, а виндовс терминалу было болееменее нормально с самого начала), но тоже вырвиглазно, короче бесполезно

А я просто что-то подумл зачем нужны все эти графические апи, если есть консоль, в которой можно рисовать квадратики и к тому же ещё и рендеринг текста есть, но не знаю короче
Аноним 24/12/23 Вск 03:28:02 723511 84
t.mp4 9863Кб, 1280x1024, 00:00:27
1280x1024
Скрыть виндовый курсор, пока он находится над конолью, вроде как нельзя
Аноним 24/12/23 Вск 21:13:36 723590 85
GCCp2zVb0AA7Xkb.jpg 296Кб, 1378x2039
1378x2039
Не хочется жить, не на что надеяться, почему всё настолько плохо, никто не поможет
Аноним 08/01/24 Пнд 01:07:02 725094 86
Untitled1.png 5410Кб, 1920x1080
1920x1080
Untitled3.png 4719Кб, 1920x1080
1920x1080
Мне абсолютно ничего не интересно, кроме как сидеть дома и играть в игры
Аноним 11/01/24 Чтв 02:21:02 725344 87
GDgw89JacAAhLwr.jpg 335Кб, 1943x2048
1943x2048
Всё бесполезно, никаких вариантов нет. Я не верю в то, что людей со временем начинается принятие смирение и бла бла бла, все люди пиздят, я их всех ненавижу, принятия не существует, существует, что какая-то хуйня случилась и ты со временем её забыл, а когда хуйня происходит каждый день, ты её не можешь забыть блять. Все живут и всем нормально живётся, всё устраивает, всё нравится, а кому не нравится - они спиваются, старчиваются и сдыхают. Я один страдаю, мне одному плохо
Аноним 11/01/24 Чтв 05:33:52 725351 88
e268b303-4832-4[...].png 905Кб, 1834x1021
1834x1021
Подписался на тред
Аноним 13/01/24 Суб 16:49:41 725548 89
Untitledddddd.png 478Кб, 824x1002
824x1002
Ну и хуета, в пизду короче
Аноним 13/01/24 Суб 17:39:19 725552 90
>>725548
Неплохо. Текстурки порельефнее сделать, (типо "запечь" но без запекания, а вручную всё отрисовав) как в старых играх типо варкрафта.
хуй !OuMK5wJFd2 13/01/24 Суб 18:51:55 725563 91
>>644092 (OP)
вот бы поюлозить своим хреном у тебя между сисек
Аноним 21/02/24 Срд 22:04:44 730346 92
.mp4 19899Кб, 960x1034, 00:14:11
960x1034
Давайте все убьём себя или друг друга пожалуйтса
Аноним 22/02/24 Чтв 23:58:24 730443 93
>>730346
блина, такой голос милый..
Аноним 23/02/24 Птн 00:36:35 730446 94
>>730346
>выделение памяти для структуры через VirtualAlloc
хм, а разве в винде нет malloc? я мало под неё писал, вернее вообще не писал, так что не знаю

>PeekMessage
какое же winapi все таки странное, капетс

даже как-то сказать нечего, графика как была для меня темным лесом, так наверно и останется
Аноним 29/02/24 Чтв 21:02:11 731147 95
GHhGF3RbYAAhoIq.jpg 461Кб, 1358x2048
1358x2048
Ебучие родаки за каким-то хуем решили порыться в моём столе и нашли заявление на увольнение. Двух недель не прошло, эти пидарасы уже успели узнать
Аноним 29/02/24 Чтв 21:11:14 731152 96
>>731147
В чём проблема? Тебе сколько годиков? Родители нашли заявление на увольнение... ХОСПАДЕ ИСУСИ
Аноним 29/02/24 Чтв 21:16:48 731157 97
GHgzYawAAhoSh.jpg 476Кб, 1378x2039
1378x2039
>>731152
Проблема в том, что я не могу больше притворяться, что всё ещё работаю и эти хуесосы теперь снова будут трахать мне мозг тем, чтобы я снова шёл работать каким-нибудь долбоёбом
Аноним 29/02/24 Чтв 21:17:40 731158 98
>>731157
Стань мужиком и выйди на работу делов-то, все хватит ныть возьми себя в руки !!!
Аноним 29/02/24 Чтв 21:25:44 731162 99
Fdo3NWWQAgodrX.png 504Кб, 1665x1665
1665x1665
>>731158
Работа - это рабство и деградация, если у тебя iq < 115, то не существует интересных работ, существует только унылое бессмысленное дерьмо, которым я не хочу заниматься и мне хуёво
Аноним 29/02/24 Чтв 21:48:45 731169 100
>>731162
Зачем ты привязываешь свой пессимизм к IQ? Боишься чего-то и пытаешься защититься?
yumi !1GkE/KTbhU 29/02/24 Чтв 21:56:23 731170 101
>>731162
Братан ну еду готовить и мусор выносить так-то тоже уныло.
Аноним 01/03/24 Птн 02:29:49 731223 102
e268b303-4832-4[...].png 905Кб, 1834x1021
1834x1021
01/03/24 Птн 13:04:50 731263 103
Вот это забавно https://github.com/rust-lang/rust/issues/25860

Я не сразу понял, в чём вообще проблема, вот в более понятной для меня форме https://play.rust-lang.org/?version=stable&mode=release&edition=2021&gist=0449b79fa65e5d294f220a4d58dfb95e

Если попробовать на 12 строке вызвать function, то это не скомпилируется, потому что в теле функции попытка вернуть ссылку с более маленьким лайфтаймом, чем 'static, очевидно.

Если попробовать на 12 строке вызвать f1, то тоже не сработает, потому что хоть f1 и указатель на функцию и мы не знаем, что там на самом деле конкретно внутри возвращается с каким лайфтаймом, но из того, что в самой сигнатуре есть параметр типа "&'a &'b ()", следует, что 'b должен пережить 'a. Но у нас 'a = 'static, а 'b - нет, поэтому тоже скомпилируется.

Проблемы начинаются на 9 строке из-за того, что контравариантность типов параметров функции позволяет переход от "&'a &'b" к "&'a &'static". Тут с самой контравариантностью всё в порядке: если в функцию можно передать ссылку с лайфтаймом 'b, то туда тем более можно передать ссылку со 'static лайфтаймом. Но проблема в том, что при этом теряется информация о том, что 'b должен пережить 'a.

Не знаю, почему ещё не поправили это всё, лень читать тред, там непонятно ничего и слишком сложно для понимания

Ещё такой пример есть https://github.com/rust-lang/rust/issues/25860#issuecomment-1680007800 там как будто используется ковариантность типов возвращаемых значений, но я вообще не понимаю этот пример, слишком запутанный
12/03/24 Втр 01:30:58 733017 104
У меня с lazy.nvim (который менеджер плагинов) были две проблемы,

что не работали плагины, зависящие от триситтера (matchup, например), если грузить их лениво,

и что когда открываешь файл напрямую командой через консоль так `nvim file` (а не внутри самого нвима через :e), то почему-то все лениво загружаемые плагины (триситтер, лсп, например) не давали сразу вывести на экран содержимое файла до того, как они все полностью загрузятся. Видимо, это из-за того, что BufReadPost, который триггерит загрузку большинства моих плагинов, триггерится до загрузки UI, из-за чего ждёшь лишние десятки миллисекунд смотря на чёрный экран, пока грузятся плагины.

Только сейчас попробовал посмотреть подробнее код LazyVim (который готовый конфиг, который я сам по себе не использую, только частично смотрел в нём, как настроить некоторые плагины), в общем,

первая проблема решается тем, чтобы предварительно добавить плагин триситтера в runtimepath https://github.com/LazyVim/LazyVim/blob/78e6405f90eeb76fdf8f1a51f9b8a81d2647a698/lua/lazyvim/plugins/treesitter.lua#L11 Чтобы для других плагинов стали по крайней мере видны все скомпилированные парсеры, и этого вроде достаточно, потому что триситтер частично встроен в нвим, но плагин всё равно нужен, чтобы делать через него подсветку кода, но этим другим плагинам, которые используют триситтер, сам плагин не очень нужен? Там вообще какая-то странная двухсторонняя зависимость между ними бывает.

вторая проблема решается тем, чтобы создать кастомный ивент, который при условии триггера BufReadPost триггерится уже только после загрузки UI https://github.com/LazyVim/LazyVim/blob/78e6405f90eeb76fdf8f1a51f9b8a81d2647a698/lua/lazyvim/util/plugin.lua#L114 и грузить большинство плагинов по этому кастомному ивенту, а не по BufReadPost/BufNewFile/BufWritePre.

Из этого выводы, что

дерево зависимостей глубже одного уровня - это зло,

UI, построенный на колбэках/ивентах с непонятно каким порядком выполнения кода - это зло,

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

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

Или что мне нужно начать пользоваться блокнотом вместо нвима?
Аноним 19/03/24 Втр 04:08:29 735071 105
.mp4 13426Кб, 960x1034, 00:09:33
960x1034
Я в 10 раз бросил кофе но всё ещё не хочу ничего, нет смысла жить никакого
Аноним 19/03/24 Втр 04:37:05 735089 106
e268b303-4832-4[...].png 905Кб, 1834x1021
1834x1021
>>735071
Зачем бросил? Хуевит с него?
21/03/24 Чтв 17:35:11 735955 107
Пытался читать это https://pages.cs.wisc.edu/~david/courses/cs552/S12/handouts/goldberg-floating-point.pdf но в итоге не осилил полностью и тем более не понял большинство доказательств. Это просто реальность существования с низким IQ: сидишь, перечитываешь что-то один раз, второй и не понимаешь ничего, по отдельности вещи делают смысл, но не выстраиваются ни во что цельное.

Я вообще просто хотел понять, что такое машинный эпсилон, потому что когда увидел его случайно в std раста, то подумалось, что а вдруг это то самое, что нужно использовать когда сравниваешь флоаты, но, короче, нет, это вообще дебильное предположение. Он связан с относительной погрешностью, но я так и не понял, какой смысл у того, чтобы взять абсолютную погрешность (например, выраженную в ULP) и поделить её на "настоящее" значение. Видимо, для того, чтобы сделать результат независимым от экспоненты?

Допустим, есть "настоящее" значение 1.0 × 10^{-42} и "вычисленное" значение 1.1 × 10^{-42}. Абсолютная погрешность равна 0.1 × 10^{-42}, что, наверное, ни о чём не говорит, потому что ну типа погрешность выглядит маленькой, но проблема в том, что сами числа тоже маленькие. А относительная погрешность будет равна просто 0.1, наверное, это даёт лучшее представление о точности, не знаю. И если мы работаем с флоатами (β = 10, p = 2), то можно сказать, что ε = 0.05 и оценить количество потенциально неверных знаков с конца через log_β{относительная погрешность / ε}? (p - это размер мантиссы, причём он в том числе включает единицу, которая в IEEE 754 неявная.)

Как я понял, в целом связь машинного эпсилона и относительной погрешности в том, что вот абсолютная погрешность представления флоата максимум равна 1/2 ULP = ((β / 2) · β^{-p}) × β^{e} для какой-то экспоненты e. И эта погрешность верна для всех флоатов в промежутке [β^{e} .. β^{e + 1}) . Но относительная погрешность зависит от "настоящего" вещественного значения, поэтому на этом промежутке она находится где-то в промежутке ((1 / 2) · β^{-p} .. (β / 2) · β^{-p}] - от экспоненты, получается, не зависит. И типо вот как раз верхняя граница этой оценки относительной погрешности определяется как машинный эпсилон. Ну и типо тогда, видимо, имеет смысл измерять погрешность вычислений во флоатах как n × ε, потому что ε - это максимальная точность, которую можно достичь, представляя результат во флоате?

Непонятно, почему-то иногда машинный эпсилон определяется как расстояние от 1.0 до следующего флоата, а иногда как половина от этого расстояния, причём в википедии тоже написано, что это либо то, либо это. Не понимаю.

Ещё один момент, о котором не думал: что во флоатах так-то всякие базовые операции (плюс, минус, умножить, поделить и как минимум вроде ещё квадратный корень) выполняются с максимальной точностью: то есть как если бы флоаты перевели в вещественные числа, сделали вычисления, а потом округлили бы обратно к флоатам. И, как я понял, для этого во внутренней реализации для таких точных вычислений не хватает использования только лишь p цифр мантиссы, нужна хотя бы одна дополнительная цифра (guard digit), чтобы, например, выполнять вычитание двух флоатов с точностью < 2ε (теорема 2 из статьи).

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

Допустим, вычисляем 1.01 × 10^{1} - 9.93 × 10^{0}, (β = 10, p = 3)

1.01 × 10^{1} - 0.99 × 10^{1} = 0.02 × 10^{1} = 0.2 × 10^{0}, если не использовать guard digit.
1.010 × 10^{1} - 0.993 × 10^{1} = 0.017 × 10^{1} = 0.17 × 10^{0}, если добавить guard digit.

Но вроде как только одной дополнительной цифры недостаточно для максимальной точности, нужна как минимум ещё вторая дополнительная цифра round digit (видимо, чтобы округление было всегда в правильную сторону, судя по названию? возможно, нужен, потому что когда складываешь или умножаешь нормализованные флоаты, то целая часть может перевалить за 2 цифры?) Sticky bit не знаю, как определяется для произвольного β, в случае с β = 2 вроде как это просто OR всех битов, которые не уместились при сдвиге мантиссы, видимо, чтобы их тоже хотя бы как-то учесть?. Немного более подробно про это я нашёл только тут https://pages.cs.wisc.edu/~markhill/cs354/Fall2008/notes/flpt.apprec.html не знаю, короче.

И, как я понял, этих трёх дополнительных битов должно быть достаточно как для сингловых флоатов, так и для даблов? По крайней мере во всех теоремах про точность вычислений в статье погрешность указывается в машинных эпсилонах, то есть оно не должно зависеть от того, насколько большой сам машинный эпсилон? Вот не знаю, это, наверное, самый непонятный момент для меня.
21/03/24 Чтв 17:50:21 735957 108
Дальше там в статье обсуждаются разные примеры того, когда точность вычислений во флоатах может сильно пострадать. Если кратко, то

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

- Даже если финальный результат вычисления умещается во флоат, не факт, что уместятся промежуточные результаты вычислений, из-за чего можно получить вообще неправильный результат (что, наверное, верно не только для флоатов, но и для интов). И ещё, промежуточные результаты могут поместиться во флоат, но быть слишком большими, из-за чего слишком неточными. Чтобы предотвратить это при умножении, можно, например, сделать так (теорема 6): x · y = (x_h + x_l) · (y_h + y_l) = расписать как сумму из чётырёх чисел. В x_h - верхняя половина цифр из мантиссы, в x_l - нижняя. И типо после этого результат не сразу складывать, а попытаться что-нибудь ещё так разложить и сложить члены с одинаковыми экспонентами? Вроде что-то похожее можно сделать, чтобы эмулировать большие инты через маленькие?

- У флоатов нет ассоциативности. И деление не всегда обратимо даже для целых чисел, записанных во флоаты 1002.0F / 100.0F * 100.0F != 1002.0F. Но, что интересно, деление целого числа, записанного во флоате, например, на 10, вроде как почти всегда обратимо умножением на 10 (теорема 7, верно для деления на что угодно вида 2^{i} + 2^{j}, непонятно, правда, в чём смысл и как это хотя бы в теории можно использовать).

- Чем больше флоатовых операций делаешь, тем больше накапливается погрешность, из-за чего, например, вычислять (1 / x)^{n} лучше как 1 / x^{n} (потому что тогда в промежуточных вычислениях степени будет использоваться точный x, а не 1 / x, вычисленный с погрешностью). И эта проблема есть даже с вычислением суммы массива флоатов. Мне это немного ломает мозг с учётом предыдущего утверждения о том, что сумма двух флоатов вычисляется точно, но тут проблема в том, что суммируются не 2, а много флоатов, и на каждом шаге делается округление вместо того, чтобы сложить всё как вещественные числа и потом округлить к флоату. Вроде как есть такой алгоритм, который компенсирует эту погрешность https://en.wikipedia.org/wiki/Kahan_summation_algorithm я не сильно разбирался.

- Флоаты округляются к ближайшему чётному, типо смысл в том, что тогда в 50% случаев в спорной ситуации будет округление вниз, в остальных случаях - вверх. В статье есть вырожденный пример того, что может случиться, если вместо этого округлять всегда вверх (теорема 5), там итеративно прибавляется и вычитается флоат и в итоге результат постепенно смещается, а если округлять к чётным, то остаётся на месте. Интересно, можно ли подобрать такой же вырожденный пример, где бы округление к ближайшему чётному так фейлилось.

И ещё один момент, все эти разговоры о погрешностях имеют смысл только, если входные данные для вычислений - точные. Если они сами по себе вычислены с погрешностью, то не имеет смысла, например, переписывать x^{2} - y^{2} как (x - y) · (x + y), потому что сама разность x - y уже страдает от того, что в статье называется catastrophic cancellation (при условии близости x и y друг к другу), если x и y сами по себе вычислены с погрешностью.

Поэтому, наверное, все вот эти трюки имеют смысл только во всяких библиотечных функциях? В тригонометрических там, например.

Ещё там совсем немного о переводе флоатов в десятичный вид, но не даётся конкретного алгоритма. Только говорится о том, что типа 9 десятичных знаков для сингловых флоатов и 17 для даблов достаточно для того, чтобы перевести флоат в десятичный вид и обратно без потерь. Но это верхняя оценка, на практике может понадобится меньше знаков. Обоснование типо такое, что флоаты вида β = 10, p = 9 на одном и том же промежутке, что флоаты β = 2, p = 24 расположены плотнее, благодаря чему не будет ситуации, когда несколько бинарных флоатов отобразятся в один и тот же десятичный, но при этом может быть наоборот, что два разных десятичных флоата отображаются в один и тот же бинарный - отсюда потенциальная возможность выбрать более короткий вариант десятичного представления, чем 9 знаков.

А как, собственно, переводить флоат в десятичный вид я так особо и не понял. Я пытался читать эту статью https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf но я не осилил, я просто в какой-то момент перестаю понимать, что происходит, я слишком тупой. Ещё такой вариант https://blog.benoitblanchon.fr/lightweight-float-to-string но не знаю, насколько он точный. Там идея в том, чтобы отрубить у флоата экспоненту и потом дробную часть умножить на 10^{9}, привести к инту и привести к десятичному виду. А целая часть после обрубания экспоненты уже должна быть достаточно маленькой, чтобы поместиться в обычный инт. Вроде такая идея.

Тут https://randomascii.wordpress.com/2012/03/08/float-precisionfrom-zero-to-100-digits-2 вроде бы описывается способ точно перевести флоат в десятичный. Там идея в том, чтобы представить флоат как гигантское число с фиксированной точкой (128 бит на целую часть, 149 бит на дробную), чтобы в него записать флоат (по сути достаточно на нужное в соответствии с экспонентой смещение скопировать мантиссу). И потом вроде целую часть итеративно делишь на 10, записывая остатки в целую часть результата. А дробную умножаешь на 10 с переполнением, записывая это переполнение. Типо вроде когда умножаешь в столбик, то обрубаешь всё, что вылезло слева за пределы 149 бит. Я, если честно, ни разу вроде не писал ни деление, ни умножение в столбик.

Ещё у этого же чела в комментариях нашёл про генерацию рандомных флоатов от 0 до 1 https://randomascii.wordpress.com/2012/01/11/tricks-with-the-floating-point-format/#comment-573 В общем, проблема в том, что между 0 и 0.5 флоатов больше, чем между 0.5 и 1 (только лишь между 0.25 и 0.5 их столько же, сколько между 0.5 и 1), из-за чего, если просто взять рандомный u32 и поделить его на u32_max, то на второй половине промежутка некоторые рандомные u32 будут отображаться в одни и те же флоаты, потому что там просто мантиссы не хватает, и это несимметрично с первой половиной промежутка, где флоатов больше. Ну и короче решение просто в том, чтобы обрезать u32 до 23 битов.

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

И последнее, вроде как IEEE 754 ничего не говорит о порядке байтов в записи флоатов. По крайней мере в википедии так написано https://en.wikipedia.org/wiki/Endianness#Floating_point Из-за чего в теории порядок байтов у флоатов и интов может отличаться и старший бит инта необязательно соответствует знаковому биту флоата, из-за чего мой abs может в теории не работать. Но, по-моему, всё же на большинстве компов у них порядок байтов совпадает.
26/03/24 Втр 04:14:51 736667 109
Я чего-то заметил, что под виндой, если клангом компилировать напрямую без прокладки в виде симейка, то он выдаёт более крупные экзешники (на ~100 дополнительных килобайтов), чем те, что получаются с симейком. Короче, проблема в том, что по дефолту он тебе в экзешник добавляет кучу какого-то непонятного кода и реализации некоторых функций из стандартной библиотеки. Видимо, это всё часть сишного рантайма, ну как минимум для парсинга аргументов из командной строки что ли?

А симейк по дефолту линкует весь этот код динамически + использует ucrt через параметр `-Xclang --dependent-lib=msvcrt`. Тут по размеру получается совсем немного больше, чем с -nostdlib. Мне не то чтобы есть дело до того, что экзешник на 100 килобайтов больше или меньше, но типо я просто не понимал, почему у симейка получается меньше размер. Но, с другой стороны, такой экзешник, наверное, не будет работать на винде, где нету ucrt, плюс типичные дебильные ошибки с тем, что не найден vcruntime какой-то версии.

Я, наверное, разучился пользоваться гуглом, но я не понимаю, откуда я вообще должен узнать, что мне надо добавить этот магический параметр и что он означает. Особенно с учётом того, что как будто более очевидное решение передать в линкер `/defaultlib:ucrt.lib` тупо не работает и выдаёт какие-то стрёмные duplicate symbol ошибки.

Если полностью отказываться от линкования с сишной библиотекой на винде, то достаточно просто определить memcpy и memset и поменять main на mainCRTStartup (если subsystem console). Вызовы memset и memcpy компилятор (по крайней мере кланг точно) может сам вставлять в сгенерированный код, поэтому они нужны. Такое есть в том числе в расте, там есть даже отдельная библиотека со всеми подобными функциями https://github.com/rust-lang/compiler-builtins Для x86 ещё какие-то детали с выравниванием стека есть https://nullprogram.com/blog/2023/02/15/#stack-alignment-on-32-bit-x86

Ещё на винде может понадобиться функция chkstk https://stackoverflow.com/questions/8400118/what-is-the-purpose-of-the-chkstk-function но вроде кланг сам что-то делает с троганьем стека и не нужно её определять.

Меня ещё просто бесит симейк и я его использую только из-за того, что он генерирует compile_commands.json (там просто описание как компилировать все юниты), который использует clangd в основном, чтобы знать дефайны, где хедеры лежат и другие параметры компилятора. Может быть, можно его и вручную попробовать генерировать. А так я бы, может быть, просто одной командой все файлы каждый раз бы компилировал.
Аноним 26/03/24 Втр 17:29:52 736748 110
2.jpg 158Кб, 828x892
828x892
Земленика

Но там всего лишь штук 10 ягод на пакет в 100 граммов и у ароматизатора слишком приторный запах какой-то. У меня изначально сложилось неоправданно положительное впечатление от ароматизированных чаёв из-за того, что первым попался очень вкусно пахнущий. А все последующие, что пробовал, были в лучшем случае терпимыми. Может быть, лучше пить без ароматизаторов и купить каких-нибудь сублимированных ягод. Не знаю, будут ли они сами по себе хотя бы запах давать в чае, не пробовал ни разу.
Аноним 30/03/24 Суб 07:35:41 737395 111
1.mp4 6576Кб, 960x1034, 00:01:37
960x1034
https://zingl.github.io/bresenham.html#line он такой компактный и элегантный, он выбирает пиксель с самым маленьким |f(x, y)|, но там ещё по-умному раскрываются модули. Слишком мало iq, чтобы понять остальные

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

https://en.wikipedia.org/wiki/Cohen–Sutherland_algorithm это типа самый тупой вариант, вроде можно умнее, но я не смотрел и сам не придумаю потому что я ебаный даун

https://git.musl-libc.org/cgit/musl/tree/src/math/floorf.c избегают того, чтобы просто взять и сделать каст к инту и обратно, вместо этого находят, где запятая и вручную делают -1 для отрицательных нецелых, вручную зануляют биты мантиссы

Я не знаю, как должен выглядеть ui код, пока что бред какой-то получается

Я как-то не задумывался, что можно сделать round просто через целочисленное деление, если просто (делимое + делитель / 2) / делитель, но если учитывать отрицательные числа, то получится слишком громоздко, тогда неинтересно

Из CMAKE_C_FLAGS_DEBUG и CMAKE_C_FLAGS_RELEASE убрать все дефолтные флаги и прописывать все флаги вручную. Для мультиконфиг билдов нужно это https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html потому что на момент конфигурации ты не знаешь, билдишь релиз или дебаг и не можешь просто сделать if(CMAKE_BUILD_TYPE ...). add_compile_options и add_link_options зачем-то выпиливают дубликаты флагов. Нужно делать, например, add_compile_options("SHELL:-Xlinker ..." "SHELL:-Xlinker ..."), иначе он выпилит второй -Xlinker.

Пытаться настроить симейк - ещё более бесполезное занятие, чем сидеть писать конфиги к текстовому редактору
Аноним 30/03/24 Суб 07:43:20 737397 112
GJ33RmVXUAAdcOC.jpg 11Кб, 400x300
400x300
Я пробовал добавлять сублимированную клубнику и смородину в чай, но они не дают ни вкуса, ни запаха, а просто размокают, но есть их интереснее сухими. Ещё в морозилке валяются какие-то замороженные ягоды, но, я думаю, проще просто умереть
Аноним 02/04/24 Втр 19:21:32 738008 113
.mp4 1108Кб, 960x1034, 00:00:08
960x1034
Купил эрл грей, потому что просто слышал название, оказалось, что он с какими-то цитрусовыми кожурками и пахнет омерзительно, теперь мне его пить непонятно сколько времени, пока не закончится

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

И что некоторые операции над младшими кусками регистров зануляют верхние, в том числе у xmm. Но только некоторые, mov al, например, остальные байты не трогает. Поэтому, видимо, если функция, возвращает bool, то проверять нужно именно al, а не rax целиком

И что на винде перед вызовом функций нужно на стеке выделить как минимум 32 байта, но я не понял, зачем. И что стек должен быть выровнен на 16 байт перед вызовом функций, но в начале функции он сдвинут на 8 байт из-за того, что call запушил адрес, куда возвращаться

Квадраты рисую не я, и даже нахождение внутри квадрата не я проверяю, это вот это https://www.raylib.com/cheatsheet/cheatsheet.html Виндовое ABI вроде более-менее простое
Аноним 04/04/24 Чтв 18:27:00 738203 114
.mp4 1716Кб, 824x574, 00:00:06
824x574
Я ничего не делал ни вчера, ни сегодня, ни в чём не вижу смысла, нету смысла жить, ничего хорошего никогда не будет
Аноним 05/04/24 Птн 21:51:31 738305 115
.jpg 285Кб, 1080x1350
1080x1350
https://youtu.be/JtgQJT08J1g?t=2003 прикольное видео, короче там примерно те же идеи используются, что и тут для прямых >>737395 когда раскрываются модули в неравенстве, когда выбирается, какая следующая точка ближе к линии, которую рисуешь. Я это имел в виду тогда, но в контексте прямых

И прикольная идея с тем, что можно несколько раз применить DDA. Типо, что если вычисляем функцию f(x, y) для последовательных точек, прибавляя постепенно D(x, y) = f(x + 1, y) - f(x, y), то эту D(x, y) можно тоже вычислять так последовательно что-нибудь прибавляя.

Я не знаю, как сделать клиппинг для окружностей. Я нагуглил только это https://theswissbay.ch/pdf/Gentoomen%20Library/Game%20Development/Programming/Graphics%20Gems%203.pdf (IV.3 A fast circle clipping algorithm), но это как будто бред какой-то бессодержательный, арккосинусы ещё зачем-то

Типо просто наивно найти точки пересечения прямоугольника и окружности, наверное, и нарисовать видимые куски. Для нахождения точек пересечения с точностью до пикселя нужен квадратный корень с округлением к ближайшему целому. Тут https://en.wikipedia.org/wiki/Integer_square_root#Algorithm_using_Newton's_method пишут, что для округления вниз метод Ньютона для квадратного корня достаточно остановить в момент, когда |x_{k+1} - x_k| < 1 и вернуть floor(x_{k+1}) как результат.

Для округления до ближайшего целого вроде как достаточно остановиться в момент |x_{k+1} - x_k| < 0.5 и вернуть round(x_{k+1}), но я не понимаю, как это формально доказать. Я не понимаю, как с погрешностью связана эта разность предыдущего и следующего приближений

У меня чувство, что по крайней мере залитые одним цветом круги проще рисовать просто проходясь по всем пикселям внутри квадрата
Аноним 06/04/24 Суб 23:18:05 738389 116
.mp4 1288Кб, 960x1032, 00:00:09
960x1032
Я хотел типо нарисовать крестик через triangle fan и чтобы можно было независимо менять ширину и длину палок, чтобы типа можно было сделать анимацию появления. Нарисовать анимированный нолик будет проще, потому что есть просто это https://www.raylib.com/examples/shapes/loader.html?name=shapes_draw_ring Но я не знаю, буду ли я дальше делать, мне слишком тяжело чего-то

Но в самом triangle fan в контексте рейлиба смысла мало, потому что DrawTriangleFan на самом деле в любом случае там куда-то внутри себя собирает вершины треугольников, чтобы когда-то потом в одном батче их все нарисовать. И там внутри нигде не используется GL_TRIANGLE_FAN, не делается ничего через рестарт индекс.

Я не ожидал, что в xmm похоже вообще нельзя загружать immediate значения, только из памяти или из других регистров. То есть приходится придумывать названия для каждой константы. И что пользоваться fpu сложнее, чем другими инструкциями: там какой-то свой отдельный стек, в который ты пушишь аргументы, делаешь операции и потом достаёшь результат. И похоже, что доставать/класть аргументы можно только промежуточно положив их в память, нельзя из обычного регистра положить что-то на fpu стек или наоборот перенести из fpu стека в регистр.

И я всё ещё не понимаю, как прочитать в регистр что-то по абсолютному 64-битному адресу, nasm обрезает адрес до 32 бит и sign экстендит эту половину до 64 бит, когда я пишу "mov r, [abs qword label]". При этом как будто бы оно существует "Move r/m64 to r64" https://www.felixcloutier.com/x86/mov но почему у меня ничего не получается. И не получается даже через lea положить в регистр абсолютный адрес, там то же самое.

И адресовать массив, расположенный в data секции, я тоже не понимаю как (ну типа label + регистр умножить на размер элемента), у меня тоже ничего не работает
Рируру !!7MEYf11KLdyuyS8t 07/04/24 Вск 01:30:32 738399 117
17b4e6cf2e1c076[...].jpg 738Кб, 909x1400
909x1400
>>738389
Не нужно читать по абсолютным 64-битным адресам, доступ к глобальным переменным в x64 почти всегда (когда их меньше 2 Гб; PE EXE в Windows >2 Гб принципиально не поддерживает, и нормально) делается как RIP-relative. Если нужно больше 2 Гб (не нужно, такое нужно динамически выделять и из внешнего файла загружать), есть модели с «абсолютными» адресами: https://wiki.osdev.org/X86-64#Text_Segment_Types, https://eli.thegreenplace.net/2012/01/03/understanding-the-x64-code-models, я не знаю, как они работают, но по логике ты кладёшь адреса в регистр через mov r64, imm64, И — это важно — добавляешь эту инструкцию в relocations, чтобы загрузчик в условиях ASLR и прочего поменял адрес в этой инструкции на настоящий. В “FPC-flavored GNU assembler” это каким-то таким заклинанием делается: https://gitlab.com/freepascal.org/fpc/source/-/blob/139f2dfe84cf07d03e461e50097a426cd88a0797/rtl/x86_64/x86_64.inc#L341 (помещаем адрес переменной fast_large_repmovstosb: boolean в r9 через mov r64, imm64 с добавлением этой инструкции в список релокаций, затем работаем по адресу в r9), в NASM тоже гуглится что-то на тему got / gotpcrel. Короче говоря, лучше не вскрывать эту тему, смысл RIP-relative как раз в том, что фишка напрямую поддерживается набором инструкций, позиционно-независимый код без необходимости вписывать правильные адреса получается автоматически, а 2 (4?) Гб хватит всем.

Чтобы «адресовать массив, расположенный в data-секции», ты сначала помещаешь его адрес в регистр соответствующим способом (RIP-relative — lea reg, [rel arr]; это отдельный способ адресации, несовместимый с base + index × scale в рамках одной и той же инструкции, размечтался), и уже потом используешь его как base в base + index × scale.
Аноним 08/04/24 Пнд 03:49:31 738492 118
image.png 305Кб, 638x765
638x765
Дизайн украл
Аноним 08/04/24 Пнд 04:10:42 738493 119
GJXdTmjbsAARjXP.jpg 807Кб, 1564x2048
1564x2048
>>738399
Ну да, понятно вообщем спасибо, у меня как-то не зарегистрировалось в голове, что абсолютные адреса же ещё будут на каждом запуске разными и непредопределёнными (несмотря на то, что, запуская код в дебаггере, видел, что адреса каждый раз разные)

>сначала помещаешь его адрес в регистр соответствующим способом (RIP-relative — lea reg, [rel arr]; это отдельный способ адресации, несовместимый с base + index × scale в рамках одной и той же инструкции
Ну да, я догадался сделать так и до того, что оно не будет работать с относительными адресами, поэтому снова вспомнил, что у меня не получалось mov использовать с абсолютными в более простом варианте адресации
Аноним 13/04/24 Суб 04:15:28 739238 120
.jpg 281Кб, 1411x1852
1411x1852
Похоже, что на винде нету нормального способа сделать экзешник, который при открытии из эксплорера создаёт гуишное окно, а при запуске из консоли тоже создаёт гуишное окно, но также умеет писать в консоль (из которого он был запущен).

Если делаешь subsystem windows, то приложение сразу же отсоединяется от консоли и шелл уже показывает промпт для ввода следующей команды, не дожидаясь закрытия гуишного окна. AttachConsole(ATTACH_PARENT_PROCESS) позволяет что-то писать в оторванную консоль из приложения, но это всё ещё конфликтует с шеллом, который рисует следующий промпт, затирает то, что пишет приложение, и обрабатывает инпут из консоли.

Если делаешь subsystem console, то вместе с гуишным окном неизбежно создастся консольное окно, когда запускаешь экзешник из эксплорера. Можно закрыть через FreeConsole, но оно всё равно на мгновение появится. Нужно понять, запустили ли тебя из эксплорера или консоли, чтобы делать FreeConsole только в первом случае. Я видел, люди предлагают смотреть на возвращаемые значения GetConsoleTitle, GetConsoleScreenBufferInfo, AttachConsole(ATTACH_PARENT_PROCESS), но для меня они все не работают вместе с subsystem console. Это https://devblogs.microsoft.com/oldnewthing/20160125-00/?p=92922 вроде работает.

Как это обходят другие люди - делают два экзешника: один - гуишное приложение, второй - консольный враппер. Например, у mpv есть "mpv.com" для консоли - он запускает основное приложение "mpv.exe", передавая информацию о том, что юзер запустил приложение из консоли через переменную среды https://github.com/mpv-player/mpv/blob/e42a8d537f575cf61747e9f67c5a9e34f511cb2b/osdep/win32-console-wrapper.c#L95

"mpv.exe" - полностью отдельный экзешник со своей отдельной точкой входа https://github.com/mpv-player/mpv/blob/e42a8d537f575cf61747e9f67c5a9e34f511cb2b/osdep/main-fn-win.c#L60

"mpv.exe" по дефолту запускается в гуишном режиме, но, если задана та переменная среды внутри консольного враппера, то он аттачит консоль родительского процесса "mpv.com" и использует его хэндлы на stdout, stdin, stderr. И тут избегается проблема subsystem windows с тем, что шелл не дожидается закрытия гуишного окна, потому что "mpv.com" висит и ждёт завершения дочернего процесса.

И ещё "mpv.com" почему-то имеет больший приоритет, чем "mpv.exe", когда пишешь "mpv" что в павершелле, что в cmd (алфавитный порядок?) А когда в поиске пишешь mpv, то приоритет у "mpv.exe". То есть оно работает бесшовно, если ты везде пишешь "mpv" без расширения.

Вообще я не знаю, что такое COM, https://devblogs.microsoft.com/oldnewthing/20080324-00/?p=23033 вроде какой-то старый формат экзешников, который просто содержит машинный код с первого же байта. Но в случае с mpv всё же "mpv.com" - это не COM, а PE экзешник с переименованным расширением, но винда умеет такое корректно такое загружать, поэтому всё в порядке, кроме того, что мне очень хочется уже умереть
Аноним 15/04/24 Пнд 05:33:38 739489 121
image.png 51Кб, 807x465
807x465
image.png 62Кб, 807x486
807x486
Шизофрения

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

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

Я хотел бы попробовать написать решение этого https://adventofcode.com/2023/day/1 на саммсебреле, но я слишком тупой и мне страшно. Я так понимаю, когда я буду искать цифры, после сравнения, чтобы достать первую или последнюю цифру в строке, мне нужно будет перевести маску в более удобный вид https://www.felixcloutier.com/x86/pmovmskb и понять, какой по счёту байт мне нужен (через инструкции LZCNT или TZCNT)? Я думал, может быть, есть инструкция, которая бы позволила по маске извлечь один байт из SIMD регистра и положить этот один единственный байт куда-то в память, но не могу найти такое. Самое близкое это https://www.felixcloutier.com/x86/maskmovdqu но это вроде не то, оно сохранит замаскированные байты сохраняя смещения. Shuffle инструкции вроде работают только с immediate, blend - тоже что-то не то, наверное, нет такого, не знаю.

Не хочется жить
Аноним 15/04/24 Пнд 07:51:11 739492 122
Рируру !!7MEYf11KLdyuyS8t 15/04/24 Пнд 08:41:23 739498 123
e34be925eca873c[...].png 1081Кб, 1000x1414
1000x1414
>>739489
Если ты прочитал вектор по адресу A, что-то насравнивал, и из результата сравнения получил смещение через pmovmskb + bsf/tzcnt (положим i), то для извлечения значения по этому смещению ты перечитываешь его с адреса A + i. :) Я так делал в CompareByte (memcmp), вот здесь https://gitlab.com/freepascal.org/fpc/source/-/blob/b3c1f294ba4b69f2d3bee53730c86af204e456b9/rtl/x86_64/x86_64.inc#L856 перечитываются и вычитаются два байта по смещению, полученному из pmovmskb + bsf.
Аноним 22/04/24 Пнд 17:46:59 740665 124
.jpg 288Кб, 1377x2048
1377x2048
Я не могу, я пытался что-то начинать делать, но мне слишком паршиво, постоянно какая-то тяжесть в груди и я тупой, всё из рук валится, и зачем уже так жить, нету никакого смысла жить, если ты тупой, всратый и не свалилось на голову никаких богатств, я уже устал ждать смерти
Аноним 22/04/24 Пнд 23:31:01 740700 125
.png 67Кб, 1171x840
1171x840
Я почти допил эрл грей, который на вкус и запах так и остался для меня омерзительным. Я теперь ещё меньше верю в то, что можно так насильно изменить свои вкусовые предпочтения.

Теперь попробовал это:
>An aromatic blend of premium Ceylon black tea, raisins and soursop infused with the fruity flavour of white grape wine. With Nuwara Eliya tea, you are offered a fruity taste of grape and soursop with a hint of floral taste. Enjoy every sip.

Он просто невкусный. Меня от него не передёргивает, как от эрл грея после каждого глотка, но он просто пахнет как будто грязной половой тряпкой, а на вкус почти никакой, как будто его и нет почти.

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

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

Про всякие дополнительные вещи, которые обычно пихают в беспроводные наушники, вроде микрофона, шумодава, режима прозрачности, жестов для управления, с моей стороны было бы говорить нечестно с учётом того, что я купил дешёвые наушники. Может быть, в каких-нибудь более дорогих есть, например, волшебный шумодав, который реально все звуки извне блокирует, а не просто давит шипением на барабанные перепонки, как мой китайский кусок мусора хуавей 5i. Но я тут и не рассчитывал ни на что с самого начала.

Короче, беспроводные устройства - это похоже просто очередной гиммик
Аноним 27/04/24 Суб 02:36:38 741361 126
image.png 68Кб, 1118x693
1118x693
image.png 115Кб, 1154x895
1154x895
image.png 153Кб, 1411x895
1411x895
image.png 163Кб, 700x955
700x955
Мне на глаза снова попалось обсуждение того, что кто-то там в коде своей игры сделал длинный свитч кейс на тысячу значений, и я на этот раз всё же решил посмотреть, во что это может компилироваться, потому что мне стало немного менее страшно читать асемблер

В общем, если кейсов мало, то if-else.

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

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

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

Вроде как кланг в случае со свитчем на 100к кейсов генерирует (очень долго, я не замерял, но минут 5-10) табличку (в коде на 4 картинке видно, что он что-то читает из памяти, там адрес из .rdata секции, и там дальше ниже уже идут разные кейсы почему-то в рандомном порядке). Кстати, сейчас подумал, что может быть, тут можно было бы обойтись и без таблички с учётом того, что размер кода во всех кейсах одинаковый и кейсы идут от 0 до 100к без дырок? Может быть, можно было бы вычислять нужный адрес напрямую, а не индексировать сначала таблицу.

Макросы в виме с навешанными на него плагинами как-то совсем дико медленно работают (я ими генерировал файл со свитчем на много кейсов) и я не уверен, какой конкретно плагин является причиной, было лень разбираться, просто все отключил, когда это делал.

Странно слышать после этого, что вим с плагинами какой-то по-особенному крутой по сравнению с другими редакторами, когда плагины убивают одну из самых прикольных фич вима. Я сомневаюсь даже, что за счёт отсутствия нормального GUI он работает быстрее других редакторов, которые зачастую внутри используют те же самые лсп, что и вим. То есть это уже даже не вим по своей сути, а очередной унылый редактор, у которого единственная отличительная бесполезная особенность - что его внутри терминала можно запустить.

Я какое-то время назад добавил в вим команду, чтобы переключаться между разными шеллами (cmd, pwsh, msys2, wsl) и заметил, что почему-то в как будто рандомные моменты меня начало переключать в wsl-ный шелл. До меня очень не сразу дошло, что я иногда случайно пишу :W вместо :w для сохранения файла, и эта :W выполняет мою кастомную команду :WSL. Потому что виме, если ты пишешь неполное уникальное начало команды, то он её без вопросов выполняет, и так получилось, что единственная команда, начинающаяся на W - это моя кастомная для переключения шелла на wsl-левский.

Короче, я решил это так, что просто назначил на :W тоже сохранение файла
Ответить в тред Ответить в тред

Check this out!

Настройки X
Ответить в тред X
15000
Добавить файл/ctrl-v
Стикеры X
Избранное / Топ тредов