Своя виртуальная машина на C за 200 строк
Каждый раз, когда мы запускаем inference LLM, мы на самом деле гоняем программу в виртуальной машине. PyTorch крутит граф вычислений, llama.cpp интерпретирует GGUF, vLLM гоняет свой движок поверх CUDA. Мы живём в мире абстракций настолько глубоких, что уже забыли, как это всё работает на уровне байтов.
Ребята, рекомендую статью от Scarlett. Она показывает, как написать полноценную виртуальную машину на чистом C меньше чем за 200 строк. Без фреймворков, без зависимостей, без магии. Только память, регистры и опкоды. И это самая освежающая вещь, которую я читал на этой неделе.
Почему AI-специалисту стоит уделить этому вечер. Мы постоянно работаем с абстракциями поверх абстракций. Python вызывает CUDA-ядра, которые транслируются в PTX, который превращается в SASS, который исполняется на SM. Когда что-то падает с out of memory или внезапно становится в десять раз медленнее, мы открываем Nsight и видим непонятные буквы. Понимание того, как вообще работает машина, отдельная суперсила, которая окупается на каждом продакшен-инциденте.
Если кратко, что там внутри. Автор строит VM по образу LC-3, это учебная архитектура фон-Неймана. 65 536 ячеек памяти по 16 бит, 10 регистров, включая программный счётчик и регистр условных флагов. Вся инструкция это 16 бит, где первые 4 бита опкод, остальные параметры. Поддерживается 14 команд: арифметика, загрузка и сохранение памяти, переходы, вызовы подпрограмм и trap для ввода-вывода.
Самое интересное это цикл fetch decode execute. Три строки кода. Читаем инструкцию по адресу из RPC, увеличиваем RPC, вызываем обработчик по индексу опкода из таблицы указателей на функции. Всё. Вот так работает любой процессор в мире, только сложнее и с миллиардами транзисторов. Когда вы понимаете это на уровне C, архитектурные особенности Transformer runtime перестают казаться чёрной магией.
Ещё из приятного. Есть подробный разбор битовых полей инструкций, объяснение sign extension, работа с условными флагами N, Z, P и аккуратная реализация trap-таблицы через массив указателей на функции вместо гигантского switch. Этот приём напрямую переиспользуется, когда вы пишете свой интерпретатор графа или custom kernel dispatcher.
Что из этого вытаскивает AI-инженер. Во-первых, интуицию по поводу того, как устроен любой runtime, от TensorRT до ONNX. Во-вторых, понимание, почему arena-аллокаторы и заранее выделенная память бьют malloc в цикле. В-третьих, это лучший антидот от выученной беспомощности на фоне LLM-ассистентов. Пока Cursor пишет вам код на TypeScript, вы садитесь и руками собираете VM на C, которая исполняет машинный код. Мозг перезагружается, руки помнят, что такое настоящая инженерия.
Совет. Не просто читайте. Откройте файл, начните с main memory и регистров, добавляйте по одной инструкции. Сверяйтесь с постом, когда застряли. К концу вечера у вас будет рабочая VM, в которую можно загрузить свой собственный hex-файл и выполнить сложение двух чисел с клавиатуры. Это тот самый момент, ради которого мы когда-то пошли в инженерию.
Источник и полный разбор: https://x.com/Zyara_1ot/status/2045916052559900725
Для любителей побарабанить
Mah и WMWare
Привет, пикабушники. Настало время для очередного (я бы не сказал что мудрого) поста. Но тем не менее.
Давным-давно, в далёкой я работал в одной конторке, где мы использовали виртуалки для кликов. И тут я вспомнил, что можно было бы попробовать виртуалку использовать для Maha. Суть вот в чём.
Хочу спросить совет о том, как "изолировать" всем приевшийся мессенджер Mah (Маh - потому что именно так он называется по-русски, чтоб больше не путали))) )
Установил я себе Виртуальную машину на ВМВар. Собственно, только для того, чтоб там пользоваться Максом. Ведь неумолимо всё шло к тому, чтоб ы домашние задания для детей и чатики родительские обосновались в этом говномессенджере.
Итак! Достаточно ли просто установки Макса в чистую виртуалку или нужно ещё над чем-то там внутри виртуалки поколдовать?
Гугл я спрашивал про форум виртуалок. Но я не нашёл ответа на конкретный вопрос. И решил, что пост тут даст больше ответов.
Конечно, для того, чтоб использовать макс в виртуальной машине, нужен интернет в ней же. И тут, всплывает вопрос. А не будет ли присутствие соединения между физическим компьютер и виртуальным давать максу возможность проникать в физическую среду?
Я установил ВМВар и на компьютер сына, но пока не залил в него макс. Но очень бы хотелось разобраться, что нужно ещё ВМВар 'у, чтоб он не предоставлял доступ максу в физ. среду. Подскажите, что делать, как действовать.
Верю в силу пикабу!!!
Виртуальная машина на android
Подскажите хорошую виртуальную машину на android, чтобы можно было нормально устанавливать приложения и работать с ними.
Виртуальная машина на Андроид
Посоветуйте пожалуйста максимально защищённый виртуальную машину или другими словами максимально изолированную виртуальную машину для Андроида от обычной системы.
Можно просто примеры виртуальных машин
Как я получаю халяву с авито в 2026 году
История вопроса
Получением халявы сначала с юлы, потом с авито я начал интересоваться лет 5 назад. Поначалу я застал времена, когда даже номер телефона я реально вытаскивал с авито, потом это уже стало невозможно. Но если это сталоневозможно мне, то стало невозможно и моим конкурентам. Так что не все так старшно. За эти годы я получил много всякого, чтобы вы не думали, что бесплатно отдают всякую хрень (а ее конечно тоже отдают). Например:
"фурнитуру" от убитых ботинок - грязные шнурки и крючки для их продевания
втулки от туалетной бумаги
картон, обрезки тряпок
приведу несколько наиболее интересных отдач:
2 бытовки с самовывозом
2 токарных станка (1И611П и настольный самодельный)
лазерный станок (поле 40 на 40 см, лазер 50 Вт) с чиллером (это холодильник на 5 КВт для охлаждения лазера)
стройматериалы (фанера и осб (десятки листов), железо, строительные леса)
фуговальный станок с циркуляркой диаметром 40 см - страшная штука
газовые баллоны разные
кондиционеры и отдельно внешние блоки от них
печь-камин на дровах "Бавария 3 стекла"
кассеты от банкоматов, где хранится наличка. Из них получаются отличные системы хранения инструментов, деталей и всяких мелочей
промышленные холодильники со стеклянной дверью, морозильные камеры
компьютеры вплоть до iMac 24"
Но постепенно задача поиска нужных мне объявлений в интересных категориях усложнялась. Т.к. авито целенаправленно усложняет алгоритмы запросов к их сайту. Заставляет переходить на платные услуги.
Можно платить и просто иметь api для доступа даже не к сайту, а к их базе, откуда гораздо проще делать запросы и обрабатывать результаты.
Препоны авито
Сначала все было просто. Я имитировал post и get запросы которые делал браузер при поиске объявлений. Отлавливал куки, ключи всякие чтобы авито принимало меня и мои запросы как родные ;-) Но постепенно эта лавочка закрылась. Стал получать ответы, типа каптчу решите, или ваш IP заблокирован, в общем может один запрос из 10 проходил.
Я начал искать новые пути, установил питон и там использовал хромиум который маскируясь под реальный браузер получал содержимое страницы со списком интересующих меня объявлений. Но и этот метод вскоре перестал работать надежно. Почитав инеты, я узнал что есть всякие "невидимые" хромиумы, которые наиболее полно прикидываются реальным браузером и авито не ругается на запрос через них, но и это решение не давало нормального результата, хотя если просто запустить браузер, то все было нормально - авито выдавало список объявлений на мой запрос. Т.е. вывод напрашивался один - хочешь иметь доступ к списку объявлений - пользуйся обычным браузером.
Поиск работающего решения
Так я и решил поступить. Задача была следующая: написать программу, которая:
запускала нужный мне браузер
открывала в нем нужную ссылку (типа найти на авито бесплатную бытовую технику)
дождаться пока страница загрузится
сохранить страницу в файл
дождаться пока страница полностью сохранится
закрыть браузер
Первые 2 пункта решаются легко. Я делаю так: создал ini файл, в котором, в числе прочего, прописан путь к браузеру.
-----------------------------------------------------------------------
[settings]
;Application = "C:\Program Files\Mozilla Firefox\firefox.exe"
Application = "C:\Program Files\Google\Chrome\Application\chrome.exe"
-----------------------------------------------------------------------
Для запуска программы использую командную строку, аргументом передаю ссылку.
-----------------------------------------------------------------------
wcscpy(strLink, argv[1]);
GetPrivateProfileString(L"settings", L"Application", L"", strApp, 320, pbuf);
wcscat(strApp, L" ");
wcscat(strApp, strLink);
// Запускаем процесс
CreateProcessW(NULL, strApp, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
-----------------------------------------------------------------------
Первое что делает программа (я назвал ее sendkey) это создает строку запуска браузера из пути к браузеру и открываемой ссылки. В итоге я вижу браузер с результатом моего запроса. Осталось самое главное - программно сохранить эту страницу в файл. К сожалению ни у хрома, ни у мозиллы нет никаких аргументов запуска чтобы они там что-то сами сохранили, хотя это было бы конечно офигенно удобно. Ну что ж, придется выкручиваться самому. Я знаю, что если нажать сочетание клавиш "ctrl+S" то появляется окно сохранения открытой страницы.
-----------------------------------------------------------------------
// имитировать нажатие клавиш CTRL+S
PrintDebugInfo("Begin press CTRL+S!");
keybd_event(VK_CONTROL, 0, 0, 0);
Sleep(100);
keybd_event(83, 0, 0, 0);
Sleep(100);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
Sleep(100);
PrintDebugInfo("End press CTRL+S!");
Sleep(iWaitSecAfterCtrlS * 1000);
-----------------------------------------------------------------------
Далее вводим имя файла и жмем кнопку "Сохранить". Но это все надо сделать программно! В этом-то и есть вся загвоздка. Я начал с того, что запустил программу "spy++" это из поставки visual c++ такая утилита, которя ловит сообщения разных окон когда что-то в этих окнах происходит, например, мы тыкаем или водим мышью или нажимаем всякие кнопки. Так я и подглядел что там происходит на уровне сообщений windows когда я просто руками сохраняю страницу. Осталось эту последовательность симитировать из моей программы. Сразу скажу, это было очень непросто. Если просто так захотеть послать все сообщения, возникат куча вопросов:
кому посылать? надо сначала программно найти сначала оконо браузера, потом окно диалога сохранения, потом кнопку "Сохранить"
задержки это просто беда, браузеры штуки не очень быстрые. То быстро страница грузится, то медленно, то вообще не грузится
в браузерах постоянно выскакивают всякие левые окна. То предложат что-то, то скажут что закрыли аварийно и давайте восстановим ранее открытые страницы?
в разных браузерах много чего отличается, например заголовок окна сохранения страницы. Это тоже надо учитывать.
файл который я сохраняю (точнее старую версию) сначала надо удалить, иначе опять лишние вопросы типа "файл существует, что делать будем?"
обязательно надо выбирать тип сохраняемого файла. Мне же картники и всякие сценарии из него не нужны, надо выбрать "только html"
Повторяю - все это делать программно. Т.е. от запуска браузера до его закрытия происходит туча операций. Есть еще одна очень неприятная хрень. Предположим, в окне сохранения я хочу задать (программно конечно) имя файла. Я нашел именно этот EDIT CONTROL и посылаю ему соответствующее сообщение (WM_SETTEXT) и да, все круто! Мое имя файла встает куда надо. Потом программно нажимаю кнопку "сохранить" и тут страшный облом - хотя имя файла на экране мое, но браузер сохраняет файл со старыми именем! Т.е. если я руками имя ввожу, все ОК, а если программно меняю, где-то там внутри в потрохах хрома да и мозиллы тоже остается старое имя. Я с этим убился просто бороться, но в итоге победил. А чего стоило установка типа файла. Полдня промучился. Дело в том, что если задать нужный формат и успешно сохранить, то выбор типа файла запоминается. Но иногда бывает слетает. И хром начинает тормозить, сохраняя десятки мегабайт всякой хрени, естественно дальнейшая работа встает. Но и эту проблему я решил. Теперь программа запускается так:
getpage.bat "www.avito.ru/sankt_peterburg_i_lo/garazhi_i_mashinome..."
где getpage.bat это вспомогательный файл он прибивает возможно зависшие экземпляры браузеров, удаляет старые версии сохраненных страниц, еще хотел в него еще добавить переключение вывода на дополнительный монитор, потом передумал. На выходе имеем html файл со списком объявлений, дальше с ним разбирается моя программа на 1С. Она разбивает файл на отдельные объявления, для кажого определяет ID, название, текст, цену, местоположение и прочее. Потом, по результатм делает рассылку в телеграмм. Проверяя на то что в объявлении нет слов из черного списка, попадает в интервал цен и ранее не было отослано.
Как сейчас работает мой парсер
Как показала практика, мой метод парсинга нормально работает неделями подряд и не вызывает появления капчи. Но меня не устраивала общая скорость работы. У меня же не один запрос. Их около десятка:
бытовая техника
комплектующие для компьютера
просто компьютеры
телефоны
для дома и дачи
ремонт и строительство
оборудование для бизнеса
инструменты
аудио/видео техника
и т.д. Если все эти запросы крутить на одном компе, то частота каждого сильно уменьшается. Может это будет раз в 10...15 минут. Очень медленно, часто за секунды что-то ценное уходит, а тут 10 минут! Надо было что-то придумать. Я понимал что неплохо бы создать целую кучу компов и распределить запросы между ними. Но эта куча должна же где-то стоять, шуметь, жрать электроэнергию, да еще следить надо за всем этим. В итоге, я собрал себе сервер и решил создать на нем кучу виртуальных машин. Я купил корпус огромный десктопный супермикро причем с лицензионной наклейкой, т.е. лицензию получил практически даром. В корпус поставил материнку тоже супермикро двухпроцессорную на сокетах 2011. Не люблю всякие хунаны и прочую галимую китайчатину. Всего у меня 24 ядра (48 потоков), 128 гигов оперативки модулями по 32 гига, SAS диски на аппаратном raid контроллере. 2 диска SAS твердотельных и два SAS обычных для хранения виртуальных машин. В общем, работает такой сервер очень неплохо, шумит только и греет воздух, поэтому собираюсь перевезти его на дачу, там делаю себе волокно и фиксированный IP адрес. Бесперебойник есть APC на 2.2 Квт, места полно. Пусть гараж отапливает в процессе работы.
Теперь об организации парсинга. Сначала я решил сделать одну образцовую виртуальную машину (далее ВМ) и потом ее тиражировать. На каждой ВМ ставил sendkey, 1C и конфу. На каждой ВМ настроенную на определенный запрос. Но быстро понял что так никакой скорости не напасешься, 1С работала не очень быстро. Просто запуск длился до 30 секунд, я хотел чтобы все было намного быстрее. Тогда мне пришла в голову такая мысль: а что если база 1С будет одна, а в ней разные пользователи. Каждому будет соответствовать свой запрос. База будет крутиться на SQL сервере на самом главном сервере, а на виртуалках будут тонкие клиенты. И еще браузеры. Т.е. софта всего - ничего. Виртуалки запускаются автоматически при запуске главного сервера, в них через автозагрузку запускается моя конфигурация 1С, и она уже начинает крутить свой запрос. И так все виртуальные машины. Сначала погонял одну ВМ, потом две, сегодня 4 штуки. Стали вылезать кое-какие проблемы. Типа места на диске перестало хватать, но я все лишнее потер, 20 гигов дискового пространства хватает. Для нормальной работы воткнул в сервер usb шный ключ защиты от 1с (купил его на юноне :-))) как дохлую флешку за недорого), поставил драйвера, зато теперь у меня лицензионная 1С! На эту тему еще вспомнилось. Как-то раз в Шушарах отдавали целую гору компьютерного барахла, поехал с прицепом. Барахла было столько что в прицеп не влезло, частично загрузил машину, но все вывез: системные блоки, МФУ, бесперебойники, клавы, мыши, какие-то на первый взгляд непонятные штуки. Потом в гараже, при разборе, я нашел в одном компе тоже ключ защиты. Как оказалось это страшно дорогая хрень - ключ для программы автоматизации автозаправочной станции (управление топливными колонками, расчеты, учет прихода/расхода топлива и т.д.). Такая прога стоит реально сотни тысяч. Я смог продать ключ за 12000.
Паралельно я занимаюсь реализацией полученного даром. Особенно мне нравится продавать газовые плиты. Они круты тем что:
не очень тяжелые, я один на телеге спокойно спускаю газовую плиту с 5 этажа без лифта
занимают не очень много места (на крайняк, складирую их в 2 этажа если у нижней железная крышка)
легко чинятся. В основном все проблемы это: прочистить форсунки, прочистить расворителем или бензином краны и кнопки электроподжига
иногда что-то отваливается типа крышки, все чистится и клеится силиконовым герметиком
не нужна вода (и положительная температура!) для демонстрации работы
потенциальному покупателю могу показать плиту в работе (все конфорки и духовку). Вам даже в магазине никто и никогда плиту не включит и не покажет
если мне везет, то вместе с плитой отдают ее паспорт - это увеличивает стоимость плиты примерно в 2 раза!
на прицепе могу перевезти за раз 6 плит + 2 в машине, если сложить заднее сиденье
если плита совсем в паршивом состоянии, то разбираю ее на запчасти: конфорки, форсунки, ручки, кнопки, провода, свечи электроподжига и т.д. Оставшееся железо идет на сдачу.
плиты нужны почти всем. Если ее нормально отмыть, легко продается за несколько дней.
Выхлоп (окупаемость идеи)
За несколько лет такого бизнеса (продажа техники и прочего полученного бесплатно) и выручка от клиентов которым я делаю рассылки по их запросам, есть выгодные приобретения. Вначале я купил гараж в пригороде СПб всего за 65000 руб.
Сам гараж деревянный, но обшит железными листами. Ворота были в убитом состоянии, провисли, низы гнилые, но каким-то чудом я бесплатно получил гаражные железные ворота. Очень тяжелые, еле смог увезти на прицепе. В них была калитка, замки, изнутри пеноплекс и вагонка. Также в комплекте были боковые части коробки с петлями. За 15000 руб я нанял каких-то мастеров и мне эти ворота приделали к гаражу. И они даже по размеру подошли!!! Старые ворота отдал мастерам. В гараже провел косметический ремонт, перекрасил ворота, подлатал крышу. Сам забетонировал подъезд. Гараж сразу же сдал в аренду. Не помню точно, но вроде первому арендатору за 5500 в мес, потом ко мне заехал новый и стал платить больше и сразу за год вперед. С первой же оплаты гараж окупился. В общем каждые полгода я теперь покупаю по гаражу с доходов от моего бизнеса, и сразу же сдаю в аренду. Новые гаражи начинают помогать окупать ранее приобретенные.
Казалось бы хорошая идея поставить сервер в гараж, но там на ночь отрубают электричество, а бывает и днем, если в гараже есть счетчик, то цена квт*ч побольше чем в городе, так что идея не очень.
Сейчас мне и гаражи новые программа помогает искать. До этого упустил пару очень вкусных предложений, локти кусал. Теперь я вижу каждый попадающий в мои параметры гараж не позже чем через 2...3 минуты после появления объявления на авито. Как только вижу что это мне подходит, моментально созваниваюсь. А ведь так и машины и недвижимость можно искать.
Помогите установить ubuntu-25.10-live-server на HiperV
UPD:
решил проблему. все вылечилось назначением 2 виртуальных процессоров и 4гб озу на время установки
Здравствуйте, имеется WS2019St сделал в HV новый виртуальный диск, скачал образ, смонтировал, начал установку. Все шаги проходят штатно до окна "Profile configuration"
при попытке ввода проходит зависание, пробовал первый раз пройти все окна для ввода с помощью TAB, также зависание, скачивал образы 24 и 22 таже проблема. Максимум что успеваю заполнить - это одну из граф. Может были у кого такие проблемы? как решили?
Смена поколения виртуальной машины не привело к результату, поведение не меняется, так же не помогло изменения языка установки русский/английский
alt+ctrl+f2 выбрасывает на черный экран с курсором, который так же не реагирует
















