avatar
Миша пишет код
@misha_writes_code
17.03.2026 19:37
Миша пишет код Каждый год на паре про бинарные уязвимости я позорюсь в одном и том же месте! Есть вот такой код: char input[9]; char password[9] = "password"; scanf("%s", input); if (strcmp(input, password) == 0) { printf("Access granted\n"); } else { printf("Access denied\n"); } И из-за особенностей работы scanf в input можно ввести больше символов, чем ожидается, переполнить буффер и перезаписать password так, чтобы проверка ниже проходила. Например, можно подать 'aaaaaaaa\0aaaaaaaa\0' через echo -e и программа выведет "Access granted". Так вот, каждый год я в этом месте говорю про стек, переполнение и дальше спрашиваю: "Какой надо подать ввод, чтобы проверка прошла?" И по какой-то причине студенты всегда говорят '11111111\011111111\0', я без задней мысли это ввожу и программа выдает "Access denied", опровергая все, что я только что рассказывал. Ну и я иду ковыряться в гдб и разбираться, почему же ничего не работает. А дело в том, что echo -e поддерживает escape-последовательности вида \0NNN, где N - цифра от 0 до 7. Такая последовательность интерпретируется как байт с соответствующим кодом. И поэтому на самом деле вместо 4х байт я ввожу всего 1. А самое обидное, что \0111 соответствует символу I, и поэтому даже если напечатать эту строку, то получится 11111111I11111! И в панике эту единицу-импостера еще попробуй разгляди!
Сама пара:
https://youtu.be/hHiVtDtJagM

Через buffer overflow обошли пароль, затем через замену return address смогли вызвать произвольную функцию в чужом коде. Ну а потом загрузили на стек произвольный бинарь и заставили его выполняться.

Хотел еще сказать, как этого добиться с выключенным execstack, но не успели (

Всякие интересные ссылки с пары и по теме:
1. Почти тьюринг полный printf: https://www.ioccc.org/2020/carlini/index.html
2. ROP compiler: https://github.com/pakt/ropc
3. Smashing The Stack For Fun And Profit - https://inst.eecs.berkeley.edu/~cs161/fa08/papers/stack_smashing.pdf
YouTube
АКОС2. #7 Бинарные уязвимости
Вторая часть курса АКОС. Смотрим на ошибки переполнения буфера и к чему эти ошибки могут приводить. Разбираемся со стеком и меняем return address и содержимое стека, чтобы исполнять свои инструкции или обходить проверки. Ведет Миша Филитов Конспект: https://github.com/lll-phill-lll/hse_caos_practice/tree/master/caos2-07-hacks Канал: https://t.me/misha_writes_code Архитектура компьютера и операционные системы. Семинарское занятие ФКН ПМИ. НИУ ВШЭ 0:00 - Обходим пароль 20:20 - Вызов запрещенной функции 44:00 - Канарейка 52:08 - Записываем свой бинарь на стек
🔥 15
👍 3
1
1 3 567
avatar
Миша пишет код
@misha_writes_code
11.03.2026 16:35
Каждый год на паре про бинарные уязвимости я позорюсь в одном и том же месте!

Есть вот такой код:


char input[9];
char password[9] = "password";

scanf("%s", input);

if (strcmp(input, password) == 0) {
printf("Access granted\n");
} else {
printf("Access denied\n");
}


И из-за особенностей работы scanf в input можно ввести больше символов, чем ожидается, переполнить буффер и перезаписать password так, чтобы проверка ниже проходила.
Например, можно подать 'aaaaaaaa\0aaaaaaaa\0' через echo -e и программа выведет "Access granted".

Так вот, каждый год я в этом месте говорю про стек, переполнение и дальше спрашиваю: "Какой надо подать ввод, чтобы проверка прошла?"

И по какой-то причине студенты всегда говорят '11111111\011111111\0', я без задней мысли это ввожу и программа выдает "Access denied", опровергая все, что я только что рассказывал.

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

А дело в том, что echo -e поддерживает escape-последовательности вида \0NNN, где N - цифра от 0 до 7. Такая последовательность интерпретируется как байт с соответствующим кодом. И поэтому на самом деле вместо 4х байт я ввожу всего 1.

А самое обидное, что \0111 соответствует символу I, и поэтому даже если напечатать эту строку, то получится 11111111I11111! И в панике эту единицу-импостера еще попробуй разгляди!
😁 12
👍 8
🔥 5
3 8 704
avatar
Миша пишет код
@misha_writes_code
28.02.2026 18:34
🔥 23
👍 4
2
4 9 880
avatar
Миша пишет код
@misha_writes_code
26.02.2026 15:55
Провел пару про кэши во вторник!

https://youtu.be/Qff61KxVCk8

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

Но несмотря на все это пара получилась интересной: с наглядными примерами и я даже не так жестко тупил (только воду пролил)! Да и студенты вопросы задавали и подсказывали)

Классный фанфэкт с пары про side channel через кэш процессора:
Можно сделать так, чтобы одна часть программы читала из памяти некоторый символ, а другая часть программы угадывала, что было прочитано.

Как это работает:
Возьмем массив чаров размером 256x4096 и будем считать, что в массиве 256 элементов, разделенных дырками по 4096 байт.

Перед чтением удаляем массив из кэша (`_mm_clflush`) и дальше читаем какой-то элемент из 256.

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

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

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

Поиграть с этим можно вот тут:
https://godbolt.org/z/nYdzYz65P

Данный side channel - часть уязвимости spectre. Исходное описание и код можно прочитать вот тут:

https://spectreattack.com/spectre.pdf

Также другие материалы по теме:
https://www.youtube.com/watch?v=_f7O3IfIR2k
https://www.youtube.com/watch?v=ehNkhmEg0bw
https://habr.com/ru/companies/skbkontur/articles/740564/
https://www.youtube.com/watch?v=bNAPVxvJPds
🔥 21
👍 2
🗿 2
6 7 779
avatar
Миша пишет код
@misha_writes_code
01.02.2026 15:36
Смотрел тут свежее выступление Годболта. Он рассказывает про всякие фичи Compiler Explorer - много всего интересного, но удивил меня следующий прикол.

Если написать алгоритм подсчета единичных битов в числе, то компилятор догадается переписать весь этот код просто в одну инструкцию popcnt.

НО!

Загадка:

Если дополнительно указать компилятору, что код нужно собирать именно под skylake, то неожиданно, помимо popcnt dst, src, там появляется еще и xor dst, dst, который выглядит лишним, ведь popcnt не использует dst в вычислениях, а просто кладет туда результат. Зачем же он тогда нужен?

https://godbolt.org/z/hYG7zEs4Y

Разгадка:

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

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

popcnt dst, src зависела не только от src, но также и от dst. Из-за чего инструкция могла выполняться заметно дольше, потому что ждала фантомную зависимость от dst.

Чтобы эту зависимость уничтожить, уже компилятор вынужден на своей стороне дополнительно что-то предпринимать. По-видимому, самое простое и дешевое - вставить зануление регистра через xor dst, dst, который гарантированно изменит его значение и сломает цепочку зависимостей.

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

P.S.
Меня еще удивило, что на вопрос со сцены "а почему там появился лишний xor", в зале нашелся человек, который корректно на это ответил. Видимо, это какая-то популярная тема и только я как всегда был не в курсе.

Всякие ссылки по теме:

- фикс в clang: https://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20160215/332717.html
- фикс в gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62011
- исходный вопрос на stackoverflow: https://stackoverflow.com/questions/25078285/replacing-a-32-bit-loop-counter-with-64-bit-introduces-crazy-performance-deviati
- и еще ответ со списком похожих проблем:
https://stackoverflow.com/a/70649222
🔥 11
👍 3
😁 3
8 904
avatar
Миша пишет код
@misha_writes_code
19.09.2025 16:07
Это что такое я вас спрашиваю?

P.S.
Интересно, что там внутри, надеюсь, не хромиум…

UPD. внутри сафари:
> Passkeys Not supported due to Apple-imposed WKWebView restrictions.
https://iterm2.com/documentation-web.html

UPD 2.
> I am maybe having a midlife crisis and this is cheaper than a sports car.
ладно, 0% осуждения, 100% понимания
😱 5
👍 2
😭 2
5 2 1.6K
avatar
Миша пишет код
@misha_writes_code
11.09.2025 17:02
Миша пишет код Фото: Ну не кайф ли? Чел сделал "Doom" поверх cedarDB. https://cedardb.com/blog/doomql/ Хоть мне и кажется не очень честным писать "shooter in pure SQL", когда gameloop написан на баше, а чтение входов на питоне, но тем не менее испытываю сильнейшую радость от прочитанного. Код вот: https://github.com/cedardb/DOOMQL/tree/main P.S. надо бы на ydb что-то такое тоже замутить, а то чем мы хуже
Мучило меня это весь день. В итоге смастерил PoC анимации на кликхаусе.

0 строк питона, 0 строк баша. Только 1 sql запрос и все.

(конечно, это не чистый sql, а с надстройками кх, но для меня это выглядит уже более честным).

В чем catch:

1. Волшебный loop в кх, который возвращает промежуточные результаты:
https://clickhouse.com/docs/sql-reference/table-functions/loop

2. Но! Луп выводит все сгенерированные строки подряд (что ломает анимацию). Однако, если добавить в начало кадра символ очистки экрана и переноса курсора '\x1b[2J', '\x1b[H', то предыдущая запись начинает удаляться и все воркает!

В общем, минус выходные, дум жди
🔥 12
👍 3
😱 2
1 3 1.6K
avatar
Миша пишет код
@misha_writes_code
10.09.2025 11:19
Ну не кайф ли?
Чел сделал "Doom" поверх cedarDB.

https://cedardb.com/blog/doomql/

Хоть мне и кажется не очень честным писать "shooter in pure SQL", когда gameloop написан на баше, а чтение входов на питоне, но тем не менее испытываю сильнейшую радость от прочитанного.

Код вот:
https://github.com/cedardb/DOOMQL/tree/main

P.S. надо бы на ydb что-то такое тоже замутить, а то чем мы хуже
🔥 8
2
👍 1
1 74 7.7K
avatar
Миша пишет код
@misha_writes_code
04.09.2025 09:18
Миша пишет код Поскольку я теперь ковыряюсь с базами данных, то параллельно занимаюсь ускоренным закрыванием пробелов в знаниях Мне сказали для начала посмотреть видосы CMU (Carnegie Mellon University) по базам данных. Также я отправился смотреть их же курс, который идет прямо сейчас и который мега качественно сделан: со ссылками, видео и материалами. https://15721.courses.cs.cmu.edu/spring2024/schedule.html Делюсь вот материалами, может тоже будет интересно. Даже просто в общеобразовательных целях советую глянуть, чтобы в общих чертах представлять, как там данные внутри баз крутятся P.S. каждый раз немного расстраиваюсь, когда нахожу крутые бесплатные материалы, что есть столько возможностей узнать новое, а я вместо этого залипаю в твитор....
Там неделю назад стартовал публичный курс от CMU и Энди Павло по разработке баз данных:
https://15445.courses.cs.cmu.edu/fall2025/schedule.html

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

Вообще CMU-шные видосы супертоповые, я их смотрю периодически, сам курс тоже должен быть крутым.
Тем более, если сделать все Project домашки, то в итоге получится самодельная база!
🔥 13
👍 4
1
3 43 1.9K
avatar
Миша пишет код
@misha_writes_code
03.09.2025 09:38
Подготовился к новому учебному году и купил синкпад!

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

Удивительно, но убунта поставилась за 10 минут, причем 5 из них качалась.

Надо бы арч накатить, чтобы студенты сразу поняли, что я жестко крутой. Есть школьники в чате? Подскажите, я успею ко вторнику его поставить и привыкнуть? Или спалюсь, что не выучил все шорткаты i3? Что там вообще сейчас модно в десктопном линуксе?
👍 20
🔥 15
😁 5
24 4 1.1K
avatar
Миша пишет код
@misha_writes_code
10.07.2025 17:23
Мэтт Годболт (автор Compiler Explorer) опубликовал интересную статью о том, как проект устроен внутри. Если вы когда-либо смотрели на ассемблерный вывод онлайн, то скорее всего это было именно на https://godbolt.org

Сама статья:
https://xania.org/202506/how-compiler-explorer-works
Гитхаб:
https://github.com/compiler-explorer/compiler-explorer

Compiler Explorer started as a shell script running watch "gcc -S example.cpp -O1 | c++filt | grep -v ..." in a screen session with a vim panel on one side and the script on the other. I was trying to show that C++11 range-based for loops generated identical code to their non-range-based equivalents.


Несколько фактов из поста, которые мне показались интересными:
1. Все компиляторы и библиотеки Compiler Explorer'а занимают 4 ТБ (жесть)
2. Самый популярный язык - C++, на втором месте C
3. В среднем нагрузка - 3 компиляции в секунду (не понимаю, много это или мало)
4. Для сборки под x86 используется около 10 хостов (я думал, что сильно больше)
5. Обслуживание проекта обходится в $3000/мес
6. Всё работает на AWS

Также Годболт пишет, что они используют автоскейлинг и количество хостов автоматически растет под нагрузкой:
We haven’t had a major outage from traffic spikes in years - the auto-scaling just quietly does its job.

А у меня что-то сжимается внутри, когда слышу auto-scaling или serverless…. https://serverlesshorrors.com/

Ну и публичный дашборд со всякими метриками (считаю, что каждый сайт должен такой выкладывать, интересно же!):

https://ce.grafana.net/public-dashboards/326d9aa2606b4efea25f4458a4c3f065?orgId=0&refresh=1m

(на нем, кстати, количество хостов прыгало от 8 до 20 за последние пару дней)
9
👍 5
🤯 3
4 9 1.2K
avatar
Миша пишет код
@misha_writes_code
01.07.2025 17:34
В этом году, волею судеб, я был научным руководителем двух студентов из ИТМО. Это было мегаинтересное приключение длиной почти в год, которое закончилось две недели назад - ребята получили два заслуженных отла и степень магистра!

Принёс небольшой отчёт о проделанной работе и каплю рефлексии

Что делали

Формальные названия научных работ запарные, но по сути задача была разработать прототип вычислительного узла join с учётом SOTA-решений и граблей, на которые мы в YDB успели понаступать.

Что сделали

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

Синтетические бенчи показали, что новый join работает в несколько раз быстрее, чем текущие реализации. См. BlockGraceJoin::* на графике.

Да, на реальных данных результаты могут отличаться - встроить код в пайплайн достаточно сложно, а без этого даже TPC-H/DS прогнать не получится, не говоря уже о настоящих запросах.

Но тем не менее! Офигенные результаты для прототипа. Испытываю какую-то невероятную гордость за ребят.

For nerds

Нанотехнологии имплементации
- поддержано блочное (Apache Arrow) представление данных
- фокус сделан на типовые аналитические джоины - в основном фильтрующие, с явным разделением на build/probe стороны
- разработано компактное внутреннее представление (сериализация) и конвертеры, использующие SIMD-инструкции
- гистограммы, которые по первым N мб данных оценивают кардинальность и выбирают стратегию хранения
- используются prefetch-инструкции (если честно, я всегда считал, что их придумали маркетологи, чтобы продавать книжки по проге, но тут разница видна - буду разбираться ещё)
- ну и блум-фильтры офк


Про защиту

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

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

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

Если бы ребята за такую огромную проделанную работу получили бы не отлы - это был бы мегапровал (в первую очередь меня как научника)

Про студентов вообще

Вообще, в этом году я как-то много работал со студентами: в вышке на АКОСе, был стажёр, и вот теперь - магистры.

Удивляюсь, какие студенты нынче жёсткие. Схватывают на лету, замотивированные, да еще и знают кучу всего. Как будто с детства под подушкой прячут TLPI (да я буду везде его упоминать). Пообщаешься немного и сразу хочется тоже что-то крутое замутить!

Что дальше

В планах на полгода у нас разработка полноценного нового production-ready джоина. Мне предстоит полноценно продумать его дизайн, защитить его на внутреннем design review и как-то запрограммировать.

Пока трудно сказать, будут ли использоваться какие-то наработки студентов - всё-таки это прототип, и в нём учитываются не все требования, которые у нас есть. Но если что-то понадобится, то буду пинать ребят, чтобы приносили PRы, и код не пропал.

Постараюсь освещать тут, как движется работа над джоином. Проект обещает много страданий, но и много всего интересного. Про свой прошлый проект - спиллинг в вычислительных узлах, я ничего не писал, хотя там тоже была куча интересных проблем. Надо хотя бы сейчас не продолбаться.
#join
🔥 24
13
👍 9
7 32 1.3K
avatar
Миша пишет код
@misha_writes_code
21.04.2025 15:13
Читал всякие мануалы, пока готовился к паре про время и вот на что наткнулся --^

Немного приятно стало, что даже в манах написано, что MM/DD/YYYY - дурацкий формат

man 3 strptime
link
👍 10
😁 9
1
1 1.4K
avatar
Миша пишет код
@misha_writes_code
05.04.2025 16:47
Миша пишет код Фото: И больше он никогда не был онлайн .... Купил iPod Classic. Прямиком из 2008. И ему уже 17 (СЕМНАДЦАТЬ) лет. С ноября думал купить это чудо, но все никак не мог найти. Мониторил все барахолки, но именно classic никто не продавал. Уже даже собрался заказывать откуда-то восстановленный, но они стоят как крыло самолета - на амазоне, например, цена где-то 300-400 евро И вот вчера появился продавец, который мало того, что находился в 15 минутах от меня, так еще и продавал iPod ровно за столько, сколько у меня было прямо тогда в кармане - 70 евро (чистая правда, ни больше ни меньше). Видел, что люди покупают прям убитые айподы: с разбитым экраном, не включающиеся, а потом ковыряются и что-то бесконечно чинят. А тут и состояние хорошее (небольшие царапки только), и аккумулятор новый. В общем, сорвался и через полчаса айпод уже был у меня. Уже готов был страдать, перекидывая музыку, но нет! Я просто подключил iPod к компу и он распознался. Открылось приложение Music (iTunes же похоронили) и предложило мне настроить айпод. За два клика я откатил его к заводским настройкам и поставил новую OS (из 2014). А после этого просто перетянул папку с музыкой и она просто появилась в медиатеке! Единственное, обложки почему-то не отображались, но оказалось, что они должны быть не больше 300x300, и после ресайза все заработало. Самое приятное, что мне не пришлось нигде логиниться. Вы представляете себе? Покупаешь электронное устройство, настраиваешь и пользуешься. ВСЕ. Не нужно создавать никакой аккаунт, ничего никуда привязывать (к слову про посудомойку и подключение к облаку). А еще музыку скачиваешь и она твоя: у нее не будет меняться обложка, она не станет недоступной из-за того, что кто-то отозвал права. Просто скачал и просто слушаешь. Модифицировать особо не буду. Знаю, что в iPod добавляют блютуз, type-c, ставят прозрачные корпусы, но это все от лукавого. Думаю, просто шлифануть его и крутилку поменять. Наверное, еще rockbox поставлю - все-таки очень хочется заценить doom. На конкретно мою модель вроде нельзя докинуть памяти из-за всяких приколов с адресацией, но я слабо представляю, как я могу 120гб на музыку израсходовать. Кстати, про 120 гб. Это всего на 8гб меньше, чем в базовом айфоне 16! НО! iOS весит 10гб+, а вот прошивка айпода всего 62Мб. Так что свободной памяти в айподе из 2008 больше, чем в айфоне из 2025. Многое говорит о нашем обществе В общем, доволен на 1000. Ощущения прям такие же, как от покупки киндла. Как будто купил устройство, у которого мало функций, но которое выполняет их ровно так, как бы ты и хотел. Буду теперь заниматься осознанным потреблением контента. А то, кажется, что музыку в наушниках выбираю вовсе и не я.
Охапка дров и Doom готов

Зачекинился, что и я тоже разок в жизни установил дум туда, где его быть не должно)

(Сори, что я все с айподом, но вы даже представить мой уровень радости не можете)
🔥 28
🫡 4
3
10 2 1.4K
avatar
Миша пишет код
@misha_writes_code
04.04.2025 09:05
И больше он никогда не был онлайн ....

Купил iPod Classic. Прямиком из 2008. И ему уже 17 (СЕМНАДЦАТЬ) лет.

С ноября думал купить это чудо, но все никак не мог найти. Мониторил все барахолки, но именно classic никто не продавал. Уже даже собрался заказывать откуда-то восстановленный, но они стоят как крыло самолета - на амазоне, например, цена где-то 300-400 евро

И вот вчера появился продавец, который мало того, что находился в 15 минутах от меня, так еще и продавал iPod ровно за столько, сколько у меня было прямо тогда в кармане - 70 евро (чистая правда, ни больше ни меньше).

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

Уже готов был страдать, перекидывая музыку, но нет!
Я просто подключил iPod к компу и он распознался. Открылось приложение Music (iTunes же похоронили) и предложило мне настроить айпод. За два клика я откатил его к заводским настройкам и поставил новую OS (из 2014). А после этого просто перетянул папку с музыкой и она просто появилась в медиатеке! Единственное, обложки почему-то не отображались, но оказалось, что они должны быть не больше 300x300, и после ресайза все заработало.

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

Модифицировать особо не буду. Знаю, что в iPod добавляют блютуз, type-c, ставят прозрачные корпусы, но это все от лукавого. Думаю, просто шлифануть его и крутилку поменять. Наверное, еще rockbox поставлю - все-таки очень хочется заценить doom. На конкретно мою модель вроде нельзя докинуть памяти из-за всяких приколов с адресацией, но я слабо представляю, как я могу 120гб на музыку израсходовать.

Кстати, про 120 гб. Это всего на 8гб меньше, чем в базовом айфоне 16!
НО! iOS весит 10гб+, а вот прошивка айпода всего 62Мб. Так что свободной памяти в айподе из 2008 больше, чем в айфоне из 2025. Многое говорит о нашем обществе

В общем, доволен на 1000. Ощущения прям такие же, как от покупки киндла. Как будто купил устройство, у которого мало функций, но которое выполняет их ровно так, как бы ты и хотел.
Буду теперь заниматься осознанным потреблением контента. А то, кажется, что музыку в наушниках выбираю вовсе и не я.
🔥 19
2
👻 2
7 2 1.3K