windows

Отмена пуска

Недавно, в связи с обсуждением адекватности перевода кнопки «Start» → «Пуск» в «Виндоуз 95» в одном из телеграмных чатов, я вспомнил, что в ранних версиях этой системы был забавный баг — кнопку «Пуск» можно было убрать с экрана, закрыв как приложение.

Для этого надо было установить на ней фокус, нажать Alt+- и выбрать пункт «Закрыть». Мы в те годы иногда так подшучивали над друг другом или над студентами в компьютерных классах Университета, где я тогда лаборантил.

Кроме этого «Пуск» можно было ещё и двигать. Например, поставив её посередине панели задач. И это задолго до «Виндоуз 11»! Правда нормально это не работало — при запуске приложений «Пуск» пропадала за ними.

Скриншот рабочего стола Windows 95: иконки «Мой компьютер», «Входящие», «Корзина», «Настройка сети Microsoft» и открытое контекстное меню с выделенной командой «Закрыть Alt+F4».

1 комментарий

«Гопник-2»: адаптация под Windows

В итоге, вчерашняя мысль адаптировать «Гопника-2» под Виндоуз меня не отпустила. Открыл вечером «ЧатГПТ» и попробовал с его помощью сделать первые шаги.

Несмотря на то, что «Чат» у меня последней, четвёртой версии, всё равно, даже на простых примерах он допускает совершенно детские ошибки, — не подключает нужные заголовочные файлы (мы программировали на Си), упускает важные части.

ChatGPT объясняет, что код на C с Unix-вызовами не переносится на Windows, но предлагает аналог через conio.h: функцию get_key с _setmode и _getch для чтения символа без эха.
Пытаемся программировать на пару с «ЧатГПТ-4»; подсказанный пример не скомпилируется

На скриншоте у меня как раз такой пример — он не скомпилируется из-за отсутствия констант и не содержит условия для обработки комбинации Ctrl+C, как было в том коде, который я попросил «ЧатГПТ» переписать.

Вот как в итоге стал выглядеть этот кусок после нескольких уточняющих вопросов и гуглежа:

#ifdef __MINGW32__
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode = 0;
    GetConsoleMode(hStdin, &mode);
    if (echo) {
        mode &= ~ENABLE_ECHO_INPUT;
    } else {
        mode |= ENABLE_ECHO_INPUT;
    }

    SetConsoleMode(hStdin, mode);

    int ch = _getch();
    if (ch == 0x03) // Ctrl+C
    {
        printf("Ctrl+C hit, exiting...\n");
        gracefulexit();
    }

    return ch;
#endif

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

#ifdef __MINGW32__
    SetConsoleCP(CP_UTF8);
    SetConsoleOutputCP(CP_UTF8);
    setvbuf(stdout, nullptr, _IONBF, 0);

    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD mode = 0;
    GetConsoleMode(handle, &mode);
    SetConsoleMode(handle, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
#endif

Пришлось полностью выключить буферизацию, чтобы нормально отрабатывал printf с UTF-8. Работает на троечку — вывод текста стал подтормаживать, такое себе.

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

Из заметных багов — игра падает при попытке загрузки сохранения и совсем не работает ввод русских букв. Второе мне нужно только одном месте (где запрашивается ввод имени игрока), так что есть надежда это починить. Остальное как будто работает.

2 комментария

Как открыть файл в формате HLP

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

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

diff --ignore-blank-lines --minimal -urd a/winhelpcgi/dib2png.c b/winhelpcgi/dib2png.c
--- winhelpcgi-1.0/winhelpcgi/dib2png.c	2004-06-15 11:38:40.000000000 +0400
+++ winhelpcgi-1.0-patched/winhelpcgi/dib2png.c	2018-11-03 13:59:03.405031382 +0300
@@ -85,7 +85,7 @@
   /* Set error handling.  REQUIRED if you aren't supplying your own
 	* error hadnling functions in the png_create_write_struct() call.
 	*/
-  if (setjmp(png_ptr->jmpbuf))
+  if (setjmp(png_jmpbuf(png_ptr)))
 	 {
       /* If we get here, we had a problem writing the file */
       png_destroy_write_struct(&png_ptr,  (png_infopp)NULL);
@@ -93,7 +93,7 @@
 	 }

   /* Set the I/O callback function to transfer directly to memory */
-  png_set_write_fn(png_ptr, (voidp) sbout, user_write_data, NULL);
+  png_set_write_fn(png_ptr, (png_voidp) sbout, user_write_data, NULL);

   /* Get access to the windows DIB data */
   lpbmi = (LPBITMAPINFOHEADER) GlobalLock(hDIB);

Утилита с грехом пополам преобразовала файл в нечитаемый ХТМЛ, который пришлось перекодировать:

/usr/local/bin/winhelpcgi.cgi --tar HELP.HLP |
php -r 'echo mb_convert_encoding(strtr(stream_get_contents(STDIN), ["\0"=>""]),
"CP1252", "HTML-ENTITIES");' > help.html

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

7 комментариев

Windows 10

Проблема с запуском компонента (62.93КиБ)
Типичная проблема пользователей «десятки»

Ну слушайте, «Виндоуз 10» — это какое-то злое зло, я устал с ней бороться. У нас она дома используется чтобы запускать «Офис» и прочее, что требует именно эту операционную систему.

История началась одним прекрасным вечером, когда «восьмёрка» превратилась в «десятку» и первым делом выкинула драйверы обоих наших принтеров. Прекрасно, я водрузил их обратно.

Потом она решило, что нашего у монитора (LG 29EA93) какое-то неправославное разрешение и сменило 2560×1080 на 1920×1080, что на пользу изображению не пошло. Я скачал соответствующую утилитку и вернул разрешение обратно.

В декабре перестала работать клавиатура. Причём как-то странно — при логине давала набрать пароль, потом отрубалась. Я психанул и оставил этот проклятый компьютер в покое. В праздники разобрался — включилась какая-то «Фильтрация ввода», если её вырубить, клавиатура работает. Заодно поставил автологин.

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

29 комментариев

Windows XP живее всех живых

Windows XP (105.07КиБ)

Сериал «Светлячок», действие которого происходит в 2517 году. На экране управления мусоровозом — Виндоуз ЭксПи (если не ошибаюсь), мастер настройки принтера. Так что, ребята, эта ОС (и шестой эксплорер с ней), не умрёт никогда, по предсказанию фантастов!

8 комментариев

Windows Powershell

Вчера ночью смотрел на Windows Powershell. Красивый, мощный, удобный язык командной строки («песню о пиве» я уже написал). Очень понравился, изучается очень быстро, позволяет многое. Основная идея — конвееры, по которым ходят не строки (как в Linux/Unix), а объекты. То есть вы можете получить список процессов, отфильтровать их не как текстовые строки, а как набор объектов — по свойствам, дальше, ну, к пример, отсортировать по какому-то свойству и выгрузить в XML.

Очень хорошо называются командлеты, например, «Get-Process», правда, сразу понятно что делает эта команда. Причём, у команд есть алиасы, которые порадуют любителей Unix: можно написать «Get-Help Get-Process» или «man ps». Где «man» — алиас для «Get-Help», «ps» — алиас для «Get-Process».

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

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

12 комментариев

Windows 7: repair screen

Ну, раз так, давайте я что-нибудь про Windows 7 расскажу, тем более повод есть: сегодня мой ноут вдруг резко вырубился, с ним такое бывает, а после включения «Винда» сказала, что загрузиться не может. После чего, немного почесала винтом и показала repair screen, там пару десятков минут что-то делала и запустилась. Один из экранов я сфоткал.

Repair screen (44.72КиБ)

Кардинальное различие в том, что когда раньше Windows из NT-ветки (т. е. NT, 200x, XP, Vista) у меня падала, она, либо выводила диагностику («нет такого-то файла, ничего не поделаешь») и останавливалась, либо требовала установочного или восстановочного диска.

Видимо, сейчас (по крайней мере, если физически всё исправно и загрузочный сектор винта цел) ничего такого не надо. Ура.

P.S. Чтобы не гадали из-за чего вырубается у меня комп, я скажу сразу, так как причину знаю. Я случайно сломал USB-разъём (пластмастка выпала), но иногда, по привычке, туда что-то включаю, устройство работает, но иногда коротит питанием на корпус, у компа срабатывает защита.

Мне интересно, что бы мне потребовалось сделать, если бы у меня сломался (единственный) USB-порт на Mac Air? Тут я просто забил — у меня ещё четыре исправных есть, а там?

28 комментариев

DLL попадают в ад, а SO — в рай

Когда я установил Windows XP (6.93КиБ)

На блоге «Дурдом 2.0» автор критикует замшелую точку зрения, согласно которой, Windows приходится переставлять каждые пару месяцев. И правда — у меня Windows XP, на компьютере за котором я сейчас сижу, установлен с первого мая 2004-го года, т. е. 3.5 года назад! Это при том гигантском количестве софта, который я на него поставил (большая часть из которого — кривой мусор). При этом uptime — 5 дней, 12 часов, после последнего случайного отключения.

12 комментариев

Бесполезная надстройка

Не могу не украсть с Cooler:

Источник: «Персональные ЭВМ в инженерной практике». — М.: Радио и связь, 1989г.

«…Одним из примеров громоздкой и, по мнению авторов, бесполезной надстройки является интегрированная система WINDOWS фирмы Microsoft. Эта система занимает почти 1 Мбайт дисковой памяти и рассчитана на преимущественное использование совместно с устройством типа „мышь“… …Таким образом, читатель уже понял, что среди надстроек над ДОС бывают довольно бесполезные системы, которые только выглядят красиво, а на самом деле отнимают время пользователя, память на дисках и оперативную память ЭВМ.

Обманчивая красота таких систем, однако, сильно воздействует на неискушенных пользователей, которые не имели практики работы на машине. Инерция мышления бывает столь сильна, что авторам приходилось наблюдать, как люди, начавшие работать с подобной настройкой, впоследствии с трудом заставляют себя изучать команды ДОС. Хочется предостеречь от этой ошибки читателей…

Оставить комментарий

Отключение Caps в Windows

Я печатаю вслепую, но не десятипальцевым методом, а… в общем, задействую я, в лучшем случае, пальцев шесть и, редко, но бывает — промахиваюсь. Более всего раздражает, когда я промахиваюсь по Shift и попадаю на Caps Lock — особенно, если смотрю не на экран и клавиатуру, а на какую-либо бумагу, например. Или на собеседника.

Для меня Caps Lock — клавиша бесполезная, когда мне нужен верхний регистр, я просто зажимаю клавишу Shift и преспокойно печатаю текст оставшимися пальцами. Поэтому, когда я случайно наткнулся на способ программного отключения клавиши Caps Lock в Windows, я немедленно скачал соответствующий файл.

Вкратце: идём в реестр, находим там ключ

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout

и записываем туда ключ «Scancode map» (тип — бинарный) со следующим значением:

00,00,00,00,00,00,00,00,02,00,00,00,00,00,3a,00,00,00,00,00

Оставить комментарий

Хардлинки в WinXP

Я очень часто начинаю разрабатывать проект под Windows и заканчиваю — под Linux или freeBSD. Конечно, даже на уровне PHP, между этими группами операционных систем есть существенные различия. Обычно, они легко преодолеваются. В последнем проекте мне более всего не хватало функции link.

Поэкспериментировав с w32api и ffi, я понял, что этот путь — тупиковый. Побродив по поисковикам, я выяснил, что простейший выход — использовать в качестве заглушки утилиту fsutil из Windows XP. У неё есть параметр «hardlink create», позволяющий создавать ссылки.

if (PHP_OS == 'WINNT' && file_exists($_ENV['windir'].'\system32\fsutil.exe'))
{
    function link($target, $link)
    {
        $cmd = $_ENV['windir'].'\system32\fsutil.exe hardlink create';
        exec ($cmd.' "'.$link.'" "'.$target, $out, $ret);

        return !$ret;
    }
}

В случае, если вы будете использовать эту функцию в проекте, будьте осторожны — это всего лишь заглушка. Во-первых, одна ссылка создаётся примерно за 0.6 — 1сек, во-вторых, в ней нет проверки на наличие специальных символов в переменных $target и $link — если там попадётся кавычка, возникнет опасность внедрения вредоносного кода.

Оставить комментарий

WinAPI и PHP

Так случилось, что в PHP существует три модуля расширения — два для PHP4 и один для PHP5, позволяющих обращаться к Windows API. Способы их вызова различны, плюс ко всему, положение усугубляется тем, что модули расширения имеют одинаковые имена, документация есть только по первому из них, тогда как в комплект PHP включается второй.

Ниже — результат моей потребности выяснить как же это всё работает. Прежде всего стоит заметить, что w32api не работает с mod_php, если старая версия вызывает ошибку при попытке повторного вызова в то же child, то новая вызывает ошибку сразу. В режиме CGI и с PHP5 я таких экспериментов не проводил.

Итак, ниже — реализация функции link (hard link) для Windows NT. Под CLI пример работает как с PHP5, так и с PHP4. Конечно, для того, чтобы пример заработал, нужна файловая система, поддерживающая hard links. Под моей NTFS5 (Windows XP) ссылки ставятся.

// Written by Evgeny Stepanischev (aka BOLK)
if (PHP_OS == 'WINNT') {
    // Модуль расширения FFI для PHP5
    if (extension_loaded('ffi') || intval(PHP_VERSION) >= 5 && @dl('php_ffi.dll')) {
        function link($target, $link) {
            $api = & new ffi("[lib='kernel32.dll'] int " . "CreateHardLinkA( char *link, char *target, long *attr);");
            return (bool)$api->CreateHardLinkA($link, $target, NULL);
        }
    } else
    // Модуль расширения w32API для PHP4
    if (extension_loaded('w32api') || @dl('php_w32api.dll')) {
        // Старая версия модуля
        if (function_exists('w32api_register_function')) {
            if (!function_exists('CreateHardLinkA')) {
                @w32api_register_function('kernel32.dll', 'CreateHardLinkA', 'bool');
            }
            if (function_exists('CreateHardLinkA')) {
                function link($target, $link) {
                    return CreateHardLinkA($link, $target, NULL);
                }
            }
        } else {
            // Новая (примерно с версии PHP 4.3.0)
            function link($target, $link) {
                $api = & new win32;
                $api->registerfunction("bool CreateHardLinkA" . "(string &link, string &target) From kernel32.dll");
                return $api->CreateHardLinkA($link, $target);
            }
        }
    }
}

Оставить комментарий

Что отвалится после SP2

Документ от Microsoft «Programs that may behave differently in Windows XP Service Pack 2» («Программы, которые, возможно, будут работать иначе в Windows XP после установки SP2). По-русски говоря, что у вас может не заработать после установки SP2 для Windows XP. Много игр, в списке есть Corel Draw 9, Diet KaZaa и KaZaa, DivxPlayer, Adobe PageMaker, AOL IM, AutoCAD 2004, Cute FTP 5.0, ICQ Pro, WinRoute, Live Journal Semagic, Outlook, некоторые компоненты MS Office, Visual Studio и многое другое.

У меня есть подозрение, что всё дело во встроенном в Windows XP firewall, который несколько расширил свои функции в SP2. В списке есть почти все наиболее известные программы для работы с Сетью — firewall, прокси, IM, FTP-клиенты и прочее, а остальные программы, скорее всего, просто пытаются проверить нет ли в Сети новых версий или предлагают какие-то другие возможности для работы или развлечения в интернете.

Оставить комментарий

У комсомольцев своя правда

Из «Комсомольской правды»:

Программисту важно уметь разрабатывать приложения Microsoft. NET (MCAD) и знать один из языков программирования — С++, C# или Java — базовые знания по ним дают в вузах. Системный администратор должен уметь обслуживать компьютерные сети, а для этого получить сертификат Microsoft по Windows Server 2003.

Студентам-«лирикам» тоже не стоит отчаиваться: есть программы, которые рассчитаны на тех, кто с <компом> не дружит, но очень хочет. Для начала стоит освоить базовый уровень компьютерной грамотности (офисные программы, Интернет и Web-технологии) — это довольно просто.

Так мы узнали, что языка программирования всего три, системные администраторы — это те, кто имеют сертификат Microsoft по Windows 2003, а Интернет и Web-технологии — это довольно просто.

Оставить комментарий

Хибер. Нате

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

Жаль, но в то время эта задача была практически невыполнимой, а то бы я, возможно, уже сказочно разбогател. :) Или не я. Вряд ли мне принадлежит первенство в рождении этой идеи. Как показала практика, трудность не в сохранении дампа базовой (как тогда это называлось) памяти и содержимого XMS, да и с сохранением состояния контролера клавиатуры и прерываний (как не странно некоторые игры перепрограммировали и то и другое) я бы справился. Мне помешал защищенный режим и оставшееся оборудование.

Сначала на моем пути встал EMM386, этот менеджер VCPI— и EMS-памяти переводил процессор в защищенный режим (protected mode). Программировать под него я не умел, но из того, что знал, я сделал, может быть ошибочный, вывод — я не смогу после восстановления состояния компьютера сделать «так как было». Я решил на защищенный режим «забить» и загружать содержимое EMS уже после старта DOSа и самого EMM386. VCPI я не трогал, да он нигде и не использовался.

Потом появился DOS4GW. Его требовали DOOM и другие игрушки. Эта библиотека (или как это еще назвать?) так же использовала для своих темных дел защищенный режим. Я узнал слово «DPMI». С DPMI так же легко как с EMS я работать не умел, не было документации. Это стало первым гвоздем в гроб моей идеи.

Вторым, и последующими гвоздями, оказалось оборудование. Слово драйвер тогда рождало несколько другие ассоциации, ни о какой универсализации работы с оборудованием речи не шло. Так что нелегкий труд по опросу и сохранению состояния какой-нибудь карточки ложился целиком на плечи программиста. Для примера, со своей видеокарточкой, монстром от фирмы Trident с 512К на борту я бы еще как-то справился, но поддержка видеокарт всех фирм и моделей — задача для меня одного непосильная. То же и с другими компонентами.

Шли годы…

Незаметно появилась и вошла в нашу жизнь ОС Windows. Операционная система встала над защищенным режимом. Слово «драйвер» получило другой смысл, прослойка между операционкой и оборудованием… Слова XMS, EMS и VCPI стали забываться, а DPMI — расшифровываться по-другому. Появился ACPI и, как его часть, «OnNow». И Windows2000, как первая, по крайней мере в линии Windows, которая умеет его поддерживать. Ну хотя бы часть — ту что, «suspend-to-disk». И при условии поддержки ACPI оборудованием. Мы, не все конечно, узнали слово «Hibernate».

Идея «suspend-to-disk» или, как он называется в W2K, «Hibernate» недалека от того, что придумал в свое время я. На диске создается файл, куда после входа в этот режим за 10—20 секунд сбрасывается все, включая содержимое памяти машины и состояние его многочисленных компонентов, после чего предлагается нажать на кнопку «Откл.». После включения, компьютер говорит «Hibernating» и примерно за полминуты (у кого как) загружается. WinAmp продолжает играть с того места, где вы его «схибернатили», Word показывает содержимое ранее открытого документа, браузер — страницу… В общем все так, как будто компьютер и не отключали.

«Здорово», — подумал я, и отправился в недра настроек своей W2K — искать, где у меня спрятан этот самый режим. Найти с первого раза мне его не удалось. Пришлось идти в большой Интернет и читать. Все оказалось просто. Оказывается, по умолчанию возможность использования этого режима отключена. Так исторически сложилось. А для его включения необходимо выполнение двух условий:

  • все оборудование, включая материнскую плату, должно уметь работать с ACPI;
  • BIOS, который на этот самой плате стоит так же должен знать, что это такое.

Выяснить, как дело обстоит у вас просто — достаточно зайти на «Панель управления» («Control Panel»), там найти «Управление энергопитанием» («Power») и посмотреть, есть ли у вас закладка «Hibernate». Если есть — включайте режим, в списке «Lock-Restart-Shutdown» появится новый элемент. Если нет, вам не повезло, но не отчаивайтесь, возможно, не все еще потеряно, перейдите по первой ссылке внизу страницы и попробуйте поэкспериментировать.

Мне повезло. У меня машина «белой сборки» IBM-IntelliStation-чего-то-там и «Hibernate», теперь одна из причин, которая примеряет меня с существованием Windows 2000. :)

Ссылки по теме

Hibernate и Win2000
Hibernate и Windows 98
Технология Hibernate и Win2000

Оставить комментарий

Windows 2000. Впечатления

С появлением Windows 2000 все как будто сошли с ума. Даже те, кто до сих пор морщился при слове Microsoft, как будто надели на глаза розовые очки. Я, проработавший на этой системе со времени ее появления, совершенно не замечаю плюсов ее использования перед гораздо более стабильной Windows 95 OSR2.

Что же приводится в качестве аргументов? Система сделана по технологии и на ядре NT. Это не аргумент. Это сообщение, причем несущее очень мало информации. Один тот факт, что первое сделано по технологии второго или с использованием его части, еще ни о чем не говорит.

Монтирование. Первое, что люди вспоминают. Лично мне, наличие этого самого монтирования глубоко фиолетово. Тем более, что эта «новая возможность» на самом деле довольна бородата. В UNIX’ах и прочих *INIX’ах эта возможность была с рождения, так же как и в MS-DOS’е (правда, не на уровне ядра и версии так до 5-й). Помните маленькую такую утилитку JOIN?

Стабильность. Об этом я мог бы сказать много. Матерных слов. Но не буду. Windows 2000 зависает по самым невероятных причинам. Мне, как человеку работающему еще и с Linux Slackware, где крутится Apache, Postgres, MySQL, miniSQL, Sendmail, FTP и т. д., есть с чем сравнивать.

Многопользовательская система. Это вы зря. Для безопасности нужно ограничить запись в реестр. Без возможности записи многие приложения (Photoshop, например) работать не будут. Приходится разрешать запись в некоторые ветки. Вы просто не представляете во сколько разных веток пишут свои данные некоторые приложения. Случается так, что программы буквально прячут свои данные в этом необъятном дереве. Например, серийный номер. Таким образом получается, что нормально работать под ней можно только с правами администратора.

Что еще? Защита от DLL Hell? Не смешите. Через пол-года эксплуатации на мою систему перестали инсталлироваться некоторые нужные мне программы. TheBAT!, WinAMP, Netscape инсталлируются через версию. Появился странный глюк. Есть файлы, открыть которые на моем компьютере стало невозможно. Система сообщает, что файл уже открыт. Чего я только не пробовал. Перезагружал систему, пробовал переписать через FTP и сетевой диск. Две вещи которые сделать получается — переименовать и удалить. Только толку от этого мало.

Microsoft в очередной раз сделала рывок. Только опять не вперед, а в сторону.

Оставить комментарий