Pull to refresh

Comments 62

Круто!
Остается то же самое провернуть на реальном железе.)

Про оператор switch Метанит по-видимому знаний не дает

И в правду, не дает......

Так работоспособность ReactOS на реальных компьютерах плохая, то я использовала эмулятор.

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

Прочитал пару слов об этой ReactOS - в альфа-версии с 98 года, 27 лет! А-фи-геть...

А по коду, вместо длинной цепочки if-ов и даже вместо потенциального switch сделать массив указателей на функции и вызывать их в цикле по индексу цикла. Будет существенно короче и изящнее.

Пока же код с таком виде не готов для публичного коммита (точнее, готов, но pull request не пройдет ревью).

UFO landed and left these words here

Да, вывод тоже можно оптимизировать, то есть, сделать только один вывод. вывод. Но цель всей утилиты, это всё-таки вывод на консоль.

UFO landed and left these words here

несколько 

Ключевое слово :) Если обратите внимание, то изменений там не так уж и много. По большей части имена функций изменены. Там даже форматирование скопировано в чистом виде.

Из изменений только вывод логотипа и вот этот участок кода:

 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);

Который по сути ничего нового тоже не делает. Просто ассемблерные инструкции заменяет на более читаемые, не более. Видимо тут поработал ChatGPT :) Он хорошо умеет "упрощать".

UFO landed and left these words here

на винде апи вызвать тоже копипаста )

Я понимаю, что функционал в сабже на уровне «Hello, World!», но тут даже упоротое форматирование сохранено, просто переименовали функции и переписали две с половиной ассемблерные вставки.

Если что, оригинал даже под какой-то лицензией.

UFO landed and left these words here

Ну, от HelloWorld эта утилита отличается чуть менее чем ничем ;) Строк больше.

UFO landed and left these words here

Выход за границу массива Logo. Его можно было объявить как двумерный и на месте инициализипрвать.

UFO landed and left these words here

Да, что-то типа того, только условие цикла стало совсем некорректным.

UFO landed and left these words here

Неправильное было, неправильное и осталось.

Да всё тут "норм", только если строки будут не размера 8, а разного размера, то такое условие будет некорректно:

sizeof(Logo)/sizeof(Logo[0])

Потому что sizeof(Logo[2]) может отличаться от sizeof(Logo[0]). А так-то всё работает как нужно.

Что? Не понял к чему Вы это.

Указатель на статический массив и указатель на динамический массив - это два разных указателя и для них вычисление размера (sizeof) происходит по разному.

Если для первого (const char* Logo[10], в данном случае) sizeof(Logo) будет равен действительно 80 (потому что Logo содержит 10 элементов, каждый из которых представляет собой строку из последовательности 8-ми байт (если CHAR_BIT == 8)), то для второго (const char** Logo) значение sizeof(Logo) будет равно размеру указателя на динамически выделенную кучу (4 это будет байта или 8 - зависит от системы). Вы в этом можете сами убедится, тут всё довольно просто:

#include <iostream>

int main()
{
    const char *LogoStatic[10] =
    {
        "  $$ $$ $$$ $$$ $$ $$  ",
        " $     $$$$$$$$$     $ ",
        " $$ $$$$$$$$$$$$$$$ $$ ",
        " $$$$$$$$$$$$$$$$$$$$$ ",
        "   $ $$$$$$$$$$$$$ $   ",
        " $$$$  $$$$$$$$$  $$$$ ",
        "$ $$$$  $$$$$$$  $$$$ $",
        "$   $$$$$ $$$ $$$$$   $",
        "$      $$  $  $$      $",
        " $$ $  $$     $$  $ $$ "
    };
    
    char** LogoDynamic = new char*[10];
    
    std::cout << sizeof(LogoStatic) << std::endl;
    std::cout << sizeof(LogoDynamic) << std::endl;
    
    delete[] LogoDynamic;
    

    return 0;
}

Так что вычисление длины массива LogoStatic по формуле sizeof(LogoStatic) / sizeof(LogoStatic[0])) будет корректным в том случае, если все элементы массива LogoStatic будут иметь один и тот же размер (потому что деление опирается на первый элемент массива, а значит все элементы должны иметь один и тот же размер). Если это не так - будет либо ошибка (попытка доступа к недоступному участку памяти), либо неопределённое поведение.

Однако выход за границы массива в условии действительно будет:

for (int i = 0; i <= sizeof(Logo)/sizeof(Logo[0]); i++)

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

LogoStatic -- это массив из 10 указателей на const char*, на 64-разрядной архитектуре 10*8 = 80 байт. LogoStatic[0] -- указатель на const char, 8 байт, от длины строки не зависит. Так что sizeof(Logo[2]) не может отличаться от sizeof(Logo[0]).

LogoDynamic -- указатель на char*, 8 байт.

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

Не вводите людей в заблуждение.

Да, Вы правы. Я тут действительно ошибся, немного невнимательно посмотрел на этот массив.

Один из признаков плохого кода - вот такие когнитивные искажения. Человек видит одно, компилятор другое. Код пишется для человека, не для компилятора.

А потом на этом нейросеть обучат.

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

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

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

Важно понимать, что любые ошибки можно исправить. Вот и всё.

Важно понимать, что любые ошибки можно исправить

Можно. Только этот код не затем писался, чтобы его рефакторили.

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

Рефакторинг - часть ЖЦ нормального проекта, особенно разработанного с нуля, потому что ошибок при разработке с нуля / доработки проекта может быть допущено много в силу различных обстоятельств. Если руководитель искренне считает, что рефакторинг не нужен - ок, пусть пишут тонны кода, пока разработчики не уведомят руководство о том, что связи между компонентами системы или ключевые механики настолько усложнились, что дальнейшая их доработка будет занимать пару месяцев, потом годы, а потом будут вообще невозможны - никто ж не против. Компания может загнуться, руководителей уволят, а специалист просто поменяет компанию и на новом проекте уже не допустит тех ошибок, которые ему "запретили" исправлять в прошлой компании. Вот и всё.

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

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

Всё так, только конкретно этот код, и вся статья - не про развитие.

UFO landed and left these words here

Присвоение в функции ros_logo() тоже с выходом за пределы массива.

на деле просто ищем апишки на получение

https://github.com/dylanaraps/neofetch?tab=readme-ov-file


исходя из того что на скрине просто поработать с апишками зачем лесть в лоулевл(не смотрел ваш код) тоесть для линукса там половина парсится в нужном месте(bash+awk), линукс сам всё сериализирует и уже имеет все имена, ну у виндоподобных ищем сколько файлов в апи, сколько памяти, какой аптайм, какой проц, там половина будет в апишках если не всё

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

Привет Автор.
Я горд за тебя. С полного ничего до fetch утилиты пусть для консоли это просто круто. Я хоть и немного умею программировать на C++ всё равно бы не написал такую утилиту.
Для простого написания программ для большинства современных ОС не требуется знания работы самой ОС. По этой причине я этого и не знаю и я больше могу сказать про сам язык чем про среду для которой пишу код.
Молодец. Если есть желание начать программировать хотя бы как хобби такие приложения куда лучше как и сказано в статье чем Hello World.

UFO landed and left these words here
UFO landed and left these words here
UFO landed and left these words here

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

Учитывая количество "плюсов" и "одобряющих комментариев" на этой платформе автор свою цель достиг :)

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

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

Будет вдвойне смешнее, когда окажется, что даже бритые ляжки и педикюр на фото принадлежали обладателю Y-хромосомы.

UFO landed and left these words here

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

UFO landed and left these words here

Плохо, что за три абзаца несколько раз читаем, что вы не умеете программировать, но так и не понятно, что собственно делает утилита fetch (я, например, не знал). В остальном все супер

Никогда раньше про нее не слышал. Где ее скачать под андроид, чтобы заценить полезность?

В остальном все супер

Вы серьёзно? Тут скорее бот хорошо поработал, чтобы эту статью опубликовать, а Вы пишете что "все супер", даже несмотря на то, что код тупо скопирован отсюда https://github.com/NikkiNext/ROS_Fetch/blob/main/fetch.c ?

Видимо в оценке Вы руководствовались сексистским принципом "ааа, женщина", а не объективным положением вещей. Как это вообще можно "плюсовать"?

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

UFO landed and left these words here

Тоже ничего не понимаю в программировании, но судя по коментам и статейке "автор_ка" что то нашлепала в чатгпт, напиздила чужой код и вывалила это сюда. Самое страшное что это плюсуется.

что то нашлепала в чатгпт, напиздила чужой код и вывалила это сюда

Не приходя в сознание.

Раньше этим не гордились (ц)

— Есть две "новости", плохая и хорошая, с какой начать?

— Давай с плохой...

— GetTickCount имеет период переполнения — примерно каждые ~49.7 суток (~2^32 мс). Это плохая "новость".

— Так, а хорошая?

— Ещё ни на одном скриншоте не было замечено, чтобы ReactOS работал столько суток без перезагрузки.

Ещё ни на одном скриншоте не было замечено, чтобы ReactOS работал столько суток без перезагрузки.

GetTickCount внутре переполняется потому что ;)

@moderator мы уже выяснили, "авторка" чуть подредактировала ворованный код и выдает это за свое, что это все ещё делает в публикациях?

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

Ну я написал модератору, толку то

@moderator мы уже выяснили, "авторка" чуть подредактировала ворованный код и выдает это за свое, что это все ещё делает в публикациях?

Можно попробовать позвать @Exosphere

Как же хорошо статья отражает нужду проверять информацию, прежде чем делать какие-либо выводы по поводу автора. Изначально, увидев этот рассказ, в голове засело то, что автор не умеет программировать, читая дальше удивило, что человек смог понять, как писать код за столь малое количество времени. Это заставило покраснеть. Минуя половину воды и прийдя к результату, немного прикурил. Задумался. Вышел в комментарии узнать, что думают по этому поводу другие люди и обнаружил, что люди ссылаются на код, очень уж похожий на этот: https://github.com/NikkiNext/ROS_Fetch/blob/main/fetch.c. И ахуел с того что этот пост все еще на плаву, так как помниться что годков так 3 назад я 2 недели сидел над реализацией BFS, набрался храбрости выложить на хабр, попросил конструктивной критики, и получил -карму +нормальнотак мнений по поводу наименований переменных. Интересно увидеть продолжение данных историй

Код в статье не принадлежит автору (оригинальный код https://github.com/NikkiNext/ROS_Fetch/blob/main/fetch.c и написан 4 года назад). Модератора уже тегнули где-то сверху, надеюсь, скоро статьи не станет.

Также в статье присутствуют логические ошибки: у обоих функций GlobalMemoryStatus и GlobalMemoryStatusEx минимальная версия — Windows XP / Windows Server 2003, так что их сравнение некорректно. При этом обе функции реализованы в ReactoOS.

Часть про поддерживаемые процессоры тоже неверна — ReactOS поддерживает как минимум все процессоры с SSE2. И вместо скрина с запущенной ReactOS внутри virtualbox автор любезно оставил(а) в статье картинку из интернета.

В одном из абзацем автор пишет, что перестал(а) использовать чатгпт, но уже в следующем гпт возвращается.

И в целом статья не похожа на читаемый текст: примечание о детали реализации кода (GlobalMemoryStatus) дано до ссылки на код / самого кода, мысли обрываются на половине, некоторые предложения разбиты на части.

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

Sign up to leave a comment.

Articles