Я портировала утилиту Fetch на ReactOS

Я портировала утилиту Fetch на ReactOS

Если вы не верите, что я это сделала - то, вот вам полный скриншот:

Я портировала утилиту Fetch на ReactOS

Оглавление:

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

Учитывайте, что я не умею программировать и никогда не программировала.

Что такое Fetch?

Я портировала утилиту Fetch на ReactOS

На самом деле с таким названием существуют как минимум две подобные утилиты - ScreenFetch и Neofetch. Fetch-like утилиты консольные, то есть работают без GUI и в терминале. Fetch-подобные утилиты слева выводят ASCII-логотип операционной системы, справа выводят информацию о компьютере.

Fetch-подобные утилиты доступны на современных системах. Есть на MacOS:

Я портировала утилиту Fetch на ReactOS

Есть на FreeBSD:

Я портировала утилиту Fetch на ReactOS

Есть на DOS:

Я портировала утилиту Fetch на ReactOS

Есть на KolibriOS:

Я портировала утилиту Fetch на ReactOS

Есть и на Windows 10/11:

Я портировала утилиту Fetch на ReactOS

На современных Windows 10 и Windows 11 утилита Neofetch доступна из коробки. По крайней мере мне не надо ничего делать, а neofetch у меня есть на Windows 10 (я использую ванильный и официальный Windows 10 LTSC).

Я портировала утилиту Fetch на ReactOS

На дистрибутивах Linux утилита Neofetch обрела сумасшедшую популярность. Каждый третий пост в Reddit в разделе LinuxPorn демонстрирует информацию о своей системе на Neofetch.

Мне кажется, ReactOS - единственная ОС, в которой нет утилиты Fetch. И я решила портировать утилиту Fetch на ReactOS.

Что такое ReactOS?

Я портировала утилиту Fetch на ReactOS

Если описать коротко, ReactOS - это урезанная Windows XP с открытым исходным кодом. Цель ReactOS: полноценная поддержка программ, игр и драйверов Windows XP. Разработка ReactOS идёт с начала 2000-х.

Кто-то из вас спросит "Чего добились ReactOS за много лет?". На самом деле и да и нет. У ReactOS есть хорошие достижения:

  • Полная поддержка тем оформления Windows XP
  • Появилась рабочая кнопка "свернуть все окна" на панели задач. Привет Windows 10.
  • Тайлинг на уровне Windows 7 (до Windows 7 тайлинга в Windows не было).
  • В последней версии 0.4.15 наконец-то начал работать звук в виртуалке
  • Поддержка файловой системы NTFS на уровне чтения
  • Добавлен LiveCD в ReactOS, что позволяет установить/загрузить ReactOS с флешки.

Не всё так хорошо в ReactOS. Даже на старых компьютерах с помойки ReactOS очень плохо работает, про ReactOS на RTX-ПК просто забудьте. 75% или 95% игр и программ не работоспособны на ReactOS.

Провал с ИИ

Теперь переходим к кухне разработки. Изначально я хотела (в качестве эксперимента) использовать ИИ-чатботы для написания утилиты для ReactOS.

Я портировала утилиту Fetch на ReactOS

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

Я портировала утилиту Fetch на ReactOS

В начале эксперимента я считала ChatGPT лучшим ИИ для программирования. Потому что я смотрела видео ютубера DepoSit, ChatGPT написал код, который скачивает все карты из мастерской CS:GO. То, что он задумал, явно уровнем выше HelloWorld. Вот его видео:

Но и с ChatGPT что-то пошло не так. Код, который написал ChatGPT, не что не собирается в ReactOS, он не запускался. Плюс ChatGPT написал непонятную тягомотину.

Я разочарована в ИИ для написания кода. Теперь понятно, почему среди разработчиков ReactOS ии аля ChatGPT не стал популярен.

Как я кодила?

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

Я портировала утилиту Fetch на ReactOS

Как я писала выше, многие Windows-приложения без проблем работают на ReactOS. Одно из них - IDE Code:Blocks. Данное IDE настолько хорошо и без проблем работает в ReactOS, что доступен для скачивания в официальном менеджере приложений ReactOS. Именно это IDE я и использовала.

Ещё одна важная причина почему я использовала Code::Blocks - это тот факт, что в комплекте Code::Blocks из коробки есть компилятор MinGW. MinGW - это порт компилятора GNU GCC, который компилирует как минимум половину линукса и UNIX. MinGW используется для компиляции и сборки ReacOS из исходного кода.

Я портировала утилиту Fetch на ReactOS

Так работоспособность ReactOS на реальных компьютерах плохая, то я использовала эмулятор. В данном случае виртуальная машина VirtualBox 7.0. У VirtualBox самый низкий порог входа, потому что: VirtualBox - бесплатный, а VMWare - платный. Плюс VirtualBox может освоить даже самый глупый пользователь ПК, в отличии от QEMU.

Весь код, который я писала, он в одном единственном файле. Все используемые в коде .h-файлы - это стандартные файлы из компилятора. Скажу проще: я не использовала никаких внешних/дополнительных .h или .c-файлов, весь функциональный код написан в одном файле.

Я портировала утилиту Fetch на ReactOS

Исходный код

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

Вот сам исходный код.

#include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #include <cpuid.h> #include <tchar.h> const char *Logo[9]; void ros_logo(){ Logo[0]=" $$ $$ $$$ $$$ $$ $$ "; Logo[1]=" $ $$$$$$$$$ $ "; Logo[2]=" $$ $$$$$$$$$$$$$$$ $$ "; Logo[3]=" $$$$$$$$$$$$$$$$$$$$$ "; Logo[4]=" $ $$$$$$$$$$$$$ $ "; Logo[5]=" $$$$ $$$$$$$$$ $$$$ "; Logo[6]="$ $$$$ $$$$$$$ $$$$ $"; Logo[7]="$ $$$$$ $$$ $$$$$ $"; Logo[8]="$ $$ $ $$ $"; Logo[9]=" $$ $ $$ $$ $ $$ "; } void kernelver() { DWORD dwVersion = 0; DWORD dwMajorVersion = 0; DWORD dwMinorVersion = 0; DWORD dwBuild = 0; dwVersion = GetVersion(); dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); if (dwVersion < 0x80000000) dwBuild = (DWORD)(HIWORD(dwVersion)); printf("Kernel: %d.%d (%d)\n", dwMajorVersion, dwMinorVersion, dwBuild); } void uptime(){ DWORD ticks = GetTickCount(); DWORD milliseconds = ticks % 1000; ticks /= 1000; DWORD seconds = ticks % 60; ticks /= 60; DWORD minutes = ticks % 60; ticks /= 60; DWORD hours = ticks; // may exceed 24 hours. printf("Uptime: %d hours, %02d minutes, %02d seconds\n", hours, minutes, seconds); } void screen(){ DWORD xsize = GetSystemMetrics(SM_CXSCREEN); DWORD ysize = GetSystemMetrics(SM_CYSCREEN); printf("Resolution: %dx%02d\n", xsize, ysize); } void get_cpuid(int code, unsigned int* a, unsigned int* b, unsigned int* c, unsigned int* d) { __asm__ __volatile__ ( "cpuid" : "=a" (*a), "=b" (*b), "=c" (*c), "=d" (*d) : "a" (code) ); } void ram(){ MEMORYSTATUS statex; statex.dwLength = sizeof(statex); GlobalMemoryStatus(&statex); DWORD totalPhys = statex.dwTotalPhys; DWORD usedPhys = statex.dwTotalPhys - statex.dwAvailPhys; printf("RAM: %.2f Mb /", (double)usedPhys / (1024 * 1024)); printf(" %.2f Mb ", (double)totalPhys / (1024 * 1024)); printf("(%lu%%)\n", statex.dwMemoryLoad); } void main(){ int i; ros_logo(); for (i=0; i<=sizeof(Logo)/sizeof(Logo[0]); i++) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); printf(Logo[i]); if (i>=0 && i<=5) { printf(" "); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); } if (i==0) { printf("OS: ReactOS\n"); } if (i==1) { kernelver(); } if (i==2) { uptime(); } if (i==3) { screen(); } if (i==4) { unsigned int a, b, c, d; char cpu_brand[49] = {0}; get_cpuid(0x80000000, &a, &b, &c, &d); if (a >= 0x80000004) { unsigned int* brand = (unsigned int*)cpu_brand; get_cpuid(0x80000002, &brand[0], &brand[1], &brand[2], &brand[3]); get_cpuid(0x80000003, &brand[4], &brand[5], &brand[6], &brand[7]); get_cpuid(0x80000004, &brand[8], &brand[9], &brand[10], &brand[11]); } printf("CPU: %s\n", cpu_brand); } if (i==5) { ram(); } if (i>5) { printf("\n"); } SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); } }

Результат

Я портировала утилиту Fetch на ReactOS

Код полностью рабочий на ReactOS. Работает утилита без проблем.

Это мой первый опыт в кодинге, при чём интересный опыт. Мой эксперимент по программированию оказался удачным. Надеюсь, вы оцените.

8
2
1
1
18 комментариев