Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр

Экран блокировки windows 10. основные настройки.

Для настройки экрана блокировки необходимо попасть в окно Персонализация в параметрах Windows 10. Для этого на пустом месте рабочего стола нажмите правой кнопкой мышки и из контекстного меню выберите пункт Персонализация.настройки экрана блокировки windows Далее перейдите в пункт Экран блокировки. Здесь находятся его основные настройки.
Фон. Здесь выбирается тип фона. На выбор есть 3 типа фона:

  • Windows: интересное. Картинки подбираются непосредственно с сервера Microsoft. Они будут меняться с каждым включением компьютера.
  • Фото. Можно выбирать картинки непосредственно с вашего компьютера либо картинки по умолчанию из темы.
  • Слайд шоу. Выбирается определённая папка с изображениями. Изображения из папки будут меняться через определённый интервал времени.

типы фонов на экране блокировки в Windows 10
Далее идут пункты, названия которых говорят сами за себя. Например пункт “Отображать забавные факты, шутки, подсказки и другую информацию на экране блокировки”. Единственное на чем стоит остановиться – это пункт Параметры заставки. Вот о нём и поговорим ниже.

Cmd: изменение кодировок консоли |

Многие скажут — в PowerShell нет таких проблем как в CMD, юникод поддерживается из коробки!
И будут правы:)
Но мне быстрее и проще что-то простое сделать с помощью batch файла.
Мы используем русский язык в Windows.
Windows же использует несколько кодировок для русского языка:
CP1251 — Windows кодировка
CP866 — используется в консольных приложениях
UTF-8 — Юникод

В консоли CMD по умолчанию используется кодировка CP866.

Поэтому для вывода русского текста в cmd, batch файлах необходимо русский текст перекодировать в CP866 кодировку.

Узнать какая кодировка установлена в консоли позволяет команда chcp

chcp
Текущая кодовая страница: 866

Попробуем вывести текст в кодировке CP1251
batch файл cp1251

>test.bat
C:Usersvino7>echo "╧ЁютхЁър Ёєёёъюую  ч√ър"
"╧ЁютхЁър Ёєёёъюую  ч√ър"

Изменим кодировку терминала командой:

@echo off
chcp 1251
echo "Проверка русского языка"

Выполним скрипт:

test.bat
Текущая кодовая страница: 1251
"Проверка русского языка"

Теперь русский выводится правильно.

Варианты установок:

  • chcp 1251 — Установить кодировку в CP1251
  • chcp 866 — Установить кодировку в CP866
  • chcp 65001 — UTF-8

Stdin, stdout, конвейеры (пайпы)

С каждой исполняющейся программой связаны 3 стандартных потока данных: поток входных данных

STDIN

, поток выходных данных

STDOUT

, поток для вывода ошибок

STDERR

Запустите программу wc, введите текст Good day today, нажмите Enter, введтие текст good day, нажмите Enter, нажмите Ctrl d. Программа wc покажет статистику по количеству букв, слов и строк в вашем тексте и завершится:

> wc
good day today
good day
      2       5      24

В данном случае вы подали в

STDIN

программы двухстрочный текст, а в

STDOUT

получили три числа.

Теперь запустите команду head -n3 /etc/passwd, должно получиться примерно так:

> head -n3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

В этом случае программа

head

ничего не читала из

STDIN

, а в

STDOUT

написала три строки.

Можно представить себе так: программа — это труба, в которую втекает STDIN, а вытекает STDOUT.

Важнейшее свойство юниксовой командной строки состоит в том, что программы-«трубы» можно соединять между собой: выход (STDOUT) одной программы передавать в качестве входных данных (STDIN) другой программе.

Такая конструкция из соединенных программ называется по-английски pipe (труба), по-русски — конвейер или пайп.

Объединение программ в конвейер делается символом | (вертикальная черта)

Выполните команду head -n3 /etc/passwd |wc, получится примерно следующее:

> head -n3 /etc/passwd |wc
      3       3     117

Произошло вот что: программа

head

выдала в

STDOUT

три строки текста, которые сразу же попали на вход программе

wc

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

В конвейер можно объединять сколько угодно программ. Например, можно добавить к предыдущему конвейеру еще одну программу wc, которая подсчитает, сколько слов и букв было в выводе первой wc:

> head -n3 /etc/passwd |wc |wc
      1       3      24

Составление конвейеров (пайпов) — очень частое дело при работе в командной строке. Пример того, как это делается на практике, читайте в разделе «Составление конвейера-однострочника».

Графический интерфейс идёт в мейнстрим

Добро пожаловать в

, изобретённый в

Вскоре после изобретения появилось много конкурирующих GUI на компьютерах Lisa и Macintosh от Apple, Commodore Amiga (Workbench), Atari ST (DRI GEM), Acorn Archimedes (Arthur/RISC OS), Sun Workstation, X11/X Windows и многих других, в том числе Microsoft Windows.

Windows 1.0 вышла в 1985 году и являлась по сути приложением MS-DOS, которое предоставляло простое окружение GUI с плиточным окном, позволяя пользователям запускать несколько приложений бок о бок:

Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр
Windows 1.01 на MS-DOS

Windows 2.x, 3.x, 95 и 98 работали на базе MS-DOS. Более поздние версии Windows начали заменять некоторые функции MS-DOS альтернативами Windows (например, операции с файловой системой), но все они полагались на фундамент MS-DOS.

Примечание: Windows ME (Millennium Edition) стала интересным гибридом. В ней наконец-то заменили поддержку MS-DOS и поддержку реального режима из предыдущих версий Windows несколькими новыми функциями (особенно технологии Gaming & Media). Некоторые функции позаимствованы из Windows 2000 (например, новый стек TCP/IP), но настроены для работы на домашних ПК, которым трудно запустить полноценную NT.

Но Microsoft понимала, что не может бесконечно растягивать архитектуру и возможности MS-DOS и Windows. Требовалась новая операционная система с прицелом на будущее.

Давным-давно в далёкой-далёкой серверной…


С первых дней развития информатики людям нужен был эффективный способ передавать компьютеру команды и данные и видеть результат выполнения этих команд/вычислений.

Одним из первых по-настоящему эффективных человеко-машинных интерфейсов стал Tele-Typewriter или «телетайп». Это электромеханическая машина с клавиатурой для ввода данных и каким-нибудь устройством вывода — сначала использовался принтер, позже экран.

Вводимые оператором символы локально буферизуются и отправляются с телетайпа на соседний компьютер или мейнфрейм в виде серии сигналов по электрическому кабелю (например, RS-232) со скоростью 10 символов в секунду (110 бод, бит в секунду, bps):

Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр
Телетайп Model 33 ASRПримечание: Дэвид Гессвейн ведёт отличный сайт по PDP-8, где можно найти больше информации об ASR33 (и соответствующей технологии PDP-8), в том числе фотографии, видео и др.


Программа на компьютере получает введённые символы, решает, что с ними делать, и, возможно, асинхронно отправляет ответ на телетайп. Телетайп может напечатать/показать оператору полученные символы.

Затем технология улучшилась, скорость передачи выросла до 19200 bps, а шумные и дорогие принтеры заменили ЭЛТ-дисплеями (широко распространённый тип дисплеев в 80-е и 90-е годы), как на популярном терминале DEC VT100:

Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр
Терминал DEC VT100

Хотя технология улучшилась, но эта модель — терминал отправляет символы программе на компьютере, а он выдаёт текст для пользователя — осталась и сегодня как фундаментальная модель взаимодействия всех командных строк и консолей на всех платформах!

Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр
Архитектура терминала и командной строки

Модель по-своему элегантна. Одна из причин — в сохранении простоты и цельности каждого компонента: клавиатура выдаёт символы которые буферизуются как электрические сигналы. Устройство вывода просто выдаёт на дисплей (бумагу/экран) символы, полученные с компьютера.

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

Дело во внешней акустике?

Некачественные колонки первыми приходят на ум. Действительно, аудиодорожку в фильмах сводят, в первую очередь держа во внимание зрителя в кинотеатре с исполинскими колонками и сабвуферами. Домашняя же акустика может играть звук неровно из-за искажений в амплитудно-частотной характеристике (АЧХ).

Например, из-за горба в районе 100 Гц, который часто встречается в дешевых колонках, чтобы басы «качали», низкочастотные взрывы и дропы будут бубнить и сотрясать мебель. Возможны и провалы в чувствительности акустики на определенных участках АЧХ. В этом случае не будет хватать разборчивости на малой громкости, например, тихие диалоги будут мутными и глухими.

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

Тяжкое наследие прошлого. Проблемы командной строки Windows / ХабрСтудия для сведения объемного звука в кино сама похожа на кинозал

Как проверить:

  • Нужно посмотреть АЧХ акустики на сайте производителя и убедиться в отсутствии больших провалов и пиков. Для хорошей разборчивости чувствительность акустики должна быть не менее 90 Дб.
  • В большой комнате с малым количеством мебели и голыми стенами звук будет гулять и скапливаться в стоячие волны, выражающиеся в потере читаемости. Причем чем громче звук, тем больше искажений в него будет вносить помещение. Проверить очень просто: достаточно хлопнуть в ладоши в точке прослушивания, если ответом будет короткое звонкое «металлическое» эхо — это может влиять на проблему.
  • Все рассуждения об акустике можно пресечь простой проверкой звука в наушниках. Если там присутствует та же проблема, то корень зла следует искать где-то в другом месте.

Замена/установка иконок для windows 7 и 8

Операционная система Windows 7 и 8 поддерживает иконки в формате .ico. На нашем сайте

иконки

в наборах могут содержаться как и в .ico так и в .png форматах. Для того чтоб конвертировать иконки с .png в .ico можно воспользоваться маленькой простой программой

Aveiconifie

. Качаем программу и смотрим как конвертировать.

Конвертация иконок с .png в .ico формат.
Конвертация с помощью программы Aveiconifie происходит всего простым движением мыши. Запускаем программу и перетягиваем иконку в поле PNG, после чего в поле ICO у нас появится конвертированная иконка в формате .ico. С этого поля просто берем иконку, и перетягиваем туда, где вы хотите ее сохранить. (смотрим скриншот)

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

Установка/замена стандартных иконок Windows 7.
Для замены иконок можно воспользоваться стандартными функциями Windows 7. Правый щелчок мыши по любому ярлыку, свойства -> вкладка “ярлык” -> сменить значок, после чего выбираем иконку в формате ICO. (смотрим скриншот)

:/>  Как изменить пароль входа в Windows 10. 4 способа

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

Запускаем программу, в меню выбираете где нам надо поменять иконки меню, после чего в контекстном меню правой кнопки мыши выбираем пункт Change Icons, откроется проводник и в нем уже указываем путь к иконке.

Думаю проблем с установкой иконок не возникнет, а для комплексной замены всех иконок можем предложить посмотреть разделы иконки для Iconpackager или пакеты иконок 7tsp.


Запуск консоли… или нет!

Когда пользователь *NIX хочет запустить инструмент командной строки, то сначала запускает терминал. Тот затем запускает оболочку по умолчанию или может быть настроен для запуска определённого приложения/инструмента. Терминал и приложение командной строки взаимодействуют потоками символов через

Однако в Windows всё работает иначе: пользователи Windows никогда не запускают консоль (conhost.exe) — они сразу запускают оболочки командной строки и приложения, например, Cmd.exe, PowerShell.exe, wsl.exe и прочее. Windows подключает запущенное приложение к текущей консоли (если оно запущено из командной строки) или к вновь созданному экземпляру консоли.

#SAYWHATNOW?

Да, в Windows пользователи запускают приложение командной строки, а не саму консоль.

Если пользователь запускает приложение командной строки из существующей оболочки командной строки, то Windows обычно присоединяет вновь запущенный .exe к текущей консоли. В противном случае Windows запустит новый экземпляр консоли, к которому будет присоединено только что запущенное приложение.

Немного занудства: многие говорят, что «приложения командной строки запускаются в консоли». Это не так и приводит к большой путанице относительно того, как в реальности работает консоль и приложения командной строки! Приложения командной строки и их консоли запускаются в независимых процессах Win32. Помогите исправить это заблуждение. Всегда говорите, что «средства командной строки/приложения выполняются с подключением к консоли». Спасибо!

Звучит неплохо, правда? На самом деле… нет. Есть некоторые проблемы:

  1. Консоль и приложение командной строки взаимодействуют сообщениями IOCTL через драйвер, а не через текстовые потоки
  2. Windows указывает, что ConHost.exe — это консольное приложение, подключенное к приложениям командной строки
  3. Windows создаёт «каналы» (pipes), по которым взаимодействуют консоль и приложение командной строки

Это существенные ограничения. Что если вы хотите создать альтернативное консольное приложение для Windows? Как отправить события с клавиатуры/мыши и прочие действия пользователя в приложение командной строки, если нельзя получить доступ к каналам, соединяющим консоль с этим приложением?

Увы, ситуация тут не очень хорошая. Есть отличные сторонние консоли и серверные приложения для Windows (например, ConEmu/Cmder, Console2/ConsoleZ, Hyper, Visual Studio Code, OpenSSH и т. д.), но им приходится прибегать к изощрённым трюкам, чтобы работать как обычная консоль!

Например, сторонним консолям приходится запускать приложение командной строки вне экрана, скажем, с координатами (-32000, -32000). Затем отправлять нажатия клавиш на внеэкранную консоль, скрапить с экрана текстовое содержимое внеэкранной консоли — и повторно выводить его в собственном пользовательском интерфейсе!

Какое-то безумие, верно?! Тот факт, что эти приложения вообще работают — лишь доказательство изобретательности и целеустремленности их создателей.

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

Ищем решение


Очевидно, чтобы избавиться от всех этих проблем, надо как-то привести их к единообразию.

И вот тут начинается самое интересное:

# -*- coding: utf-8 -*-
>>> import sys
>>> import locale
>>> print sys.getdefaultencoding()
ascii
>>> print locale.getpreferredencoding() # linux
UTF-8
>>> print locale.getpreferredencoding() # win32/rus
cp1251
# и самое интересное:
>>> print sys.stdout.encoding # linux
UTF-8
>>> print sys.stdout.encoding # win32
cp866

Ага! Оказывается «система» у нас живёт вообще в ASCII. Как следствие — попытка по-простому работать с вводом/выводом заканчивается «любимым» исключением

UnicodeEncodeError/UnicodeDecodeError

Кроме того, как замечательно видно из примера, если в linux у нас везде utf-8, то в Windows — две разных кодировки — так называемая ANSI, она же cp1251, используемая для графической части и OEM, она же cp866, для вывода текста в консоли. OEM кодировка пришла к нам со времён DOS-а и, теоретически, может быть также перенастроена специальными командами, но на практике никто этого давно не делает.

До недавнего времени я пользовался распространённым способом исправить эту неприятность:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ==============
#      Main script file
# ==============
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
# или
import locale
sys.setdefaultencoding(locale.getpreferredencoding())
# ...

И это, в общем-то, работало. Работало до тех пор, пока пользовался

print

-ом. При переходе к выводу на экран через

logging

всё сломалось.


Угу, подумал я, раз «оно» использует кодировку по-умолчанию, — выставлю-ка я ту же кодировку, что в консоли:

sys.setdefaultencoding(sys.stdout.encoding or sys.stderr.encoding)

Уже чуть лучше, но:

Присмотревшись к первому примеру, нетрудно заметить, что так желаемую кодировку «cp866» можно получить только проверив атрибут соответствующего потока. А он далеко не всегда оказывается доступен.

Вторая часть задачи — оставить системную кодировку в utf-8, но корректно настроить вывод в консоль.


Для индивидуальной настройки вывода надо переопределить обработку выходных потоков примерно так:

import sys
import codecs
sys.stdout = codecs.getwriter('cp866')(sys.stdout,'replace')

Этот код позволяет убить двух зайцев — выставить нужную кодировку и защититься от исключений при печати всяких умляутов и прочей типографики, отсутствующей в 255 символах cp866.

Осталось сделать этот код универсальным — откуда мне знать OEM кодировку на произвольном сферическом компе? Гугление на предмет готовой поддержки ANSI/OEM кодировок в python ничего разумного не дало, посему пришлось немного вспомнить WinAPI

UINT GetOEMCP(void); // Возвращает системную OEM кодовую страницу как число
UINT GetANSICP(void); // то же для ANSI кодовой странцы

… и собрать всё вместе:

# -*- coding: utf-8 -*-
import sys
import codecs

def setup_console(sys_enc="utf-8"):
    reload(sys)
    try:
        # для win32 вызываем системную библиотечную функцию
        if sys.platform.startswith("win"):
            import ctypes
            enc = "cp%d" % ctypes.windll.kernel32.GetOEMCP() #TODO: проверить на win64/python64
        else:
            # для Linux всё, кажется, есть и так
            enc = (sys.stdout.encoding if sys.stdout.isatty() else
                        sys.stderr.encoding if sys.stderr.isatty() else
                            sys.getfilesystemencoding() or sys_enc)

        # кодировка для sys
        sys.setdefaultencoding(sys_enc)

        # переопределяем стандартные потоки вывода, если они не перенаправлены
        if sys.stdout.isatty() and sys.stdout.encoding != enc:
            sys.stdout = codecs.getwriter(enc)(sys.stdout, 'replace')

        if sys.stderr.isatty() and sys.stderr.encoding != enc:
            sys.stderr = codecs.getwriter(enc)(sys.stderr, 'replace')

    except:
        pass # Ошибка? Всё равно какая - работаем по-старому...

Как изменить время блокировки экрана windows – софтандроид

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

 Для начала, стандартной опции для изменения времени блокировки экрана на Windows нет. Точнее она есть, но скрыта от пользователей. При этом сама настройка блокировки находится в таких дебрях, что просто так ее не всегда найдешь.

Во-первых, для того чтобы изменить время блокировки Windows 10, нужно внести информацию в реестр и разблокировать атрибут, который отвечает за отображение настройки. Для этого открываем меню пуск, пишем cmd и открываем приложение Командная строка.

Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр

Откроется консоль, где нужно написать команду и нажать Enter (можно просто скопировать и вставить)

powercfg -attributes SUB_VIDEO 8EC4B3A5-6868-48c2-BE75-4F3044BE88A7 -ATTRIB_HIDE

Это необходимо для разблокировки настройки, которая отвечает за настройку времени блокировки экрана.

  • После этого идем в настройки системы. Открываем пуск и выбираем настройки.
Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр

Дальше раздел персонализация.

Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр
Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр
  • Листаем вниз и находим и переходим в раздел Параметры времени ожидания для экрана.
Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр

В этом разделе можно настроить параметры отключения экрана при работе от сети и аккумулятора, а также настроить время перехода в спящий режим на Windows 10.

  • Чтобы изменить время блокировки экрана на Windows 10 переходим в раздел Дополнительные параметры питания.
Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр
  • Это еще не все. В открывшемся окне выбираем Настройка схемы электропитания.
Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр
  • А теперь в раздел Изменить дополнительные параметры питания.
Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр
  • После этого, в разделе Экран находим параметр Время ожидания до отключения экрана блокировки.
Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр

Указываем нужное время и все.

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

powercfg -attributes SUB_VIDEO 8EC4B3A5-6868-48c2-BE75-4F3044BE88A7 ATTRIB_HIDE

Важное замечание, работающие в фоне приложения иногда не дают уходить системе Windows 10 в режим ожидания, блокировать экран или уходить в спящий режим. Особенно это актуально для различных торрент приложений на Windows.

Как сменить кодировку в консоли windows?

Файл должен выводиться в utf-8, а в консоли – 866, в итоге в браузере отображаются ромбы.

После команды chcp 65001 ничего не поменялось.

Поскольку в консоли используется кодовая страница 866, то если в реестре поменять значение REG_SZ-параметра “866” под ключом [HKLMSYSTEMCurrentControlSetControlNlsCodePage] с “C_866.nls” (по умолчанию) на иное, то и кодировка в cmd также должна измениться.

Но у меня в CodePage таких файлов нет. Есть типы REG.SZ по умолчанию и 4 файла с номерами 932 936 949 950

Вариант постоянно изменять в консоли chcp не подходит, но и не работает. Lucida console подключен в консоли. Cygwin64 Terminal и Gitbash не запускает python server

Какие-то ещё есть варианты?

generate.py

spoiler

# coding: utf-8

from horoscope import generate_prophecies
from datetime import datetime as dt


def generate_page(head, body):
    page = f"<html>{head}{body}</html>"
    return page


def generate_head(title):
    head = f"""<head>
    <meta charset='utf-8'>
    <title>{title}</title>
    </head>
    """
    return head


def generate_body(header, paragraphs):
    body = f"<h1>{header}</h1>"
    for p in paragraphs:
        body = body   f"<p>{p}</p>"
    return f"<body>{body}</body>"


def save_page(title, header, paragraphs, output="index.html"):
    fp = open(output, "w")
    today = dt.now().date()
    page = generate_page(
        head=generate_head(title),
        body=generate_body(header=header, paragraphs=paragraphs)
    )
    print(page, file=fp)
    fp.close()

#####################


today = dt.now().date()

save_page(
    title="Гороскоп на сегодня",
    header="Что день "   str(today)   " готовит",
    paragraphs=generate_prophecies(),
)

:/>  Logging — библиотека для удобного ведения логов в Python / Хабр

horoscope.py

spoiler

# coding: utf-8

from horoscope import generate_prophecies
from datetime import datetime as dt


def generate_page(head, body):
    page = f"<html>{head}{body}</html>"
    return page


def generate_head(title):
    head = f"""<head>
    <meta charset='utf-8'>
    <title>{title}</title>
    </head>
    """
    return head


def generate_body(header, paragraphs):
    body = f"<h1>{header}</h1>"
    for p in paragraphs:
        body = body   f"<p>{p}</p>"
    return f"<body>{body}</body>"


def save_page(title, header, paragraphs, output="index.html"):
    fp = open(output, "w")
    today = dt.now().date()
    page = generate_page(
        head=generate_head(title),
        body=generate_body(header=header, paragraphs=paragraphs)
    )
    print(page, file=fp)
    fp.close()

#####################


today = dt.now().date()

save_page(
    title="Гороскоп на сегодня",
    header="Что день "   str(today)   " готовит",
    paragraphs=generate_prophecies(),
)

При запуске кода (python generate_all.py из командной строки или Ctrl B в саблайме) в этой же папке генерируется файл index.html, и, если поднять сервер в этой же директории (python -m http.server) из консоли win, то в браузере ромбы.

Меняем язык интерфейса, или как обмануть windows 7

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

Совсем недавно в продаже появилась новая операционка от мелкомягких – Windows 7. Замечательно. Я её уже обкатал на своём домашнем компе. Работает стабильно и довольно шустро. Получше чем Vista. Поэтому выбор предустановленной операционки был определён. Оставалось только одно хитрое НО. У Windows 7 существует несколько редакций, которые различаются набором различных возможностей…

Пользователи Windows 7 Ultimate (Максимальная) или Windows 7 Enterprise (Корпоративная) знают, что поменять язык интерфейса дело простецкое. Заходишь в панель управления, тыкаешь “Часы, язык и регион”, а дальше выбираешь “Изменение языка интерфейса”. Ну а дальше просто выбираешь из приведённого списка, на каком языке ты хочешь созерцать свой интерфейс. Если нужного языка в списке нет, то надо выбрать “Установка или удаление языков интерфейса” и установить новый язык из пакетного файла. Файл можно скачать с сайта майкрософт или через Windows Update из раздела “необязательные обновления”. Всё просто.

Пользователям же других редакций Windows 7 как то Starter (Начальная), Home Basic (Домашняя базовая), Home Premium (Домашняя расшиненная) и Porfessional (Профессиональная) менять язык интерфейса не разрешено. Если вы зайдёте в панель управления, выберете “Часы, язык и регион”, а затем “Изменение языка интерфейса”, то самого раздела, где меняется язык не обнаружите.

В справке Windows говорится следующее:

Примечание

Вот на этих граблях я и споткнулся, так как не знал, что возможность смены языка для Windows 7 Professional, вместе с которой я купил ноутбук не предусмотрена.

Что же делать? Обмену ноутбук не подлежит, на другой ноут денег нет. Удалять существующую операционку и ставить выкачанную из Интернета Windows 7 Ultimate и подсовывать ей левый ключ, а потом ещё взламывать защиту мелкомягких, чтобы прокатила активация тоже не особо хотелось.

Как обычно в таких ситуациях обращаемся к ораклу всея Интернет господину Яндексу или Гуглу, кому что больше нравится. Бегая по разным форумам и статьям в интернете, мне к своему большому счастью удаётся наткнуться на одну статью на сайте www.thevista.ru. Надо отдать должное, молодцы ребята, выручили в трудную минуту. Кто желает более детально получить информацию, те могут сходить по этой ссылке. А здесь я приведу туже информацию, но в сокращённом варианте.

Итак. Существует 2 метода смены языка интерфейса.

Вариант №1. Подходит для всех редакций, кроме Sarter (Начальная).

Чтобы сменить язык интерфейса с Русского на Английский необходимо выполнить следующие действия:

1. Загрузить Windows 7 в режиме восстановления (Repair Your Computer) через F8 на этапе начальной загрузки.
2. Открыть окно коммандной строки (Command Prompt)
3. Ввести команду dism /image:D: /Set-SKUIntlDefaults:en-US

Будьте внимательны в слове SKUIntlDefaults. Не перепутайте буквы. INTL, а не INITL.

4. Перезагрузить компьютер и загрузить Windows 7 в нормальном режиме.
5. Открыть окно коммандной строки (Command Prompt)
6. Ввести команду bcdedit /set {current} locale en-US
7. Ввести команду bcdedit /set {bootmgr} locale en-US
8. Перезагрузиться

Английский язык, как вы могли заметить, я не устанавливал, так он уже был установлен ранее. Дело в том, что когда производилась предустановка операционки на ноутук Английский язык был базовым и вместе с ним ставился дополнительный язык – Русский. Проверить это можно, зайдя в панель управления, выбрав “Часы, язык и регион”, затем “Установка или удаление языков интерфейса” и пункт “Удалить языки интерфейса”. В полученном списке вы увидите Английский и Русский.

Таким хитрым образом, мы поменяли язык интерфейса и остались при легальной активации.

Вариант №2. Подходит для всех редакций Windows 7.

1. Установить программу Vistalizator www.froggie.sk/
2. Скачать с того же сайта нужный языковой пакет MUI
3. Загрузить MUI в программе Vistalizator и применить новый языковой пакет.
4. Перезагрузиться.

Обработка юникода


К сожалению, консоль Windows и её API появились до изобретения Юникода!

Консоль Windows хранит текст (который впоследствии выводится на экран) как символы кодировки UCS-2 с двумя байтами на символ. Эта кодировка поддерживает кодирование первых 65536 позиций символов, что известно как плоскость 0 или основная многоязычная плоскость (Basic Multilingual Plane, BMP).

Приложения командной строки выводят текст в консоли с помощью Console API. Обрабатывающие текст интерфейсы, бывают двух видов: функции с суффиксом А обрабатывают однобайтовые/символьные строки, функции с суффиксом W обрабатывают двухбайтовые (wchar)/символьные строки.

Например, функция WriteConsoleOutputCharacter компилируется в WriteConsoleOutputCharacterA() для проектов ASCII или в WriteConsoleOutputCharacterW() для проектов на Юникоде. Код может напрямую вызвать функцию с суффиксом …A или …W, если необходима обработка конкретного типа.

Примечание: каждый W API поддерживает UCS-2, потому что это всё, что существовало в момент разделения на A/W, и мы думали, что так будет хорошо. Но многие W API уже обновились для поддержки ещё и UTF-16 на том же канале.

Не все W API понимают UTF-16, но все они знают хотя бы UCS-2.

Кроме того, консоль не поддерживает некоторые новые функции Юникода, включая соединительные символы нулевой ширины (

), которые используются для объединения отдельных символов в арабских и индийских письменностях, а также для объединения символов эмодзи в один визуальный глиф.

Как же ввести эмодзи кота-ниндзя или сложные многобайтовые китайские/арабские символы в консоль? К сожалению, никак!

Мало того что консольный API не поддерживает символы Юникод больше двух байт на глиф (эмодзи NinjaCat требует 8 байт!), но внутренний буфер UCS-2 консоли тоже не может хранить дополнительные байты данных. Что ещё хуже, текущий GDI-рендерер консоли не сможет отрисовать глиф, даже если тот поместится в буфер!

Эх… Таковы радости legacy-кода.

Здесь опять я намерен прервать рассказ — вернёмся к этой теме в следующей статье. Оставайтесь с нами!

Перезагрузка и капитальный ремонт windows console

В конце 2021 года проект по созданию подсистемы Windows для Linux (WSL) шёл полным ходом, и на фоне взрыва оживлённого интереса пользователей к командной строке стало очевидно, что консоль Windows явно нуждается в некотором апгрейде.

В частности, консоли не хватало многих функций, привычных для современных *NIX-совместимых систем, таких как возможность парсинга и вывода последовательностей ANSI/VT, широко используемых в мире *NIX для вывода насыщенного и подсвеченного текста и текстовых UI.

В чём тогда смысл разработки WSL, если пользователь не сможет корректно использовать инструменты Linux?

Ниже пример того, что отображает консоль Windows 7 и Windows 10: обратите внимание, что Windows 7 (слева) не в состоянии правильно отобразить VT, сгенерированный линуксовыми программами tmux, htop, Midnight Commander и cowsay, но они корректно выглядят в Windows 10 (справа):

Тяжкое наследие прошлого. Проблемы командной строки Windows / Хабр
Сравнение консоли Windows 7 и Windows 10

Так, в 2021 году была сформирована небольшая «группа Windows Console». На неё возложили задачу распутать, понять и улучшить кодовую базу Windows Console… которой к этому времени было около 28 лет — больше, чем программистам, которые работают над этим проектом.

Как подтвердит любой разработчик, которому когда-либо приходилось брать старый, грязный, плохо поддерживаемый код, улучшение такого кода представляет собой сложную задачу. Ещё сложнее не нарушить существующее поведение. Для обновления самой часто запускаемой программы в Windows, не нарушив работу миллионов клиентских скриптов, инструментов, скриптов авторизации, систем сборки, производственных систем, систем анализа и прочих, требуется немало «внимания и терпения». 😉

Для разработчиков проблема усугубилась, когда они поняли всю строгость требований к консоли со стороны клиентов. Например, если производительность консоли изменялась на 1−2% от сборки к сборке, то срабатывали сигналы тревоги в группе Windows Build, что приводило… гм… к «быстрой и прямой обратной связи», то есть требованию немедленного исправления.

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

  1. НЕ допускать новых уязвимостей
  2. НЕ ломать инструменты, скрипты, команды и т. д. у существующих клиентов (внутренних или внешних)
  3. НЕ снижать производительность и не увеличивать потребление памяти/IO (без чётких и хорошо доведённых причин)

За последние три года команда Windows Console провела следующую работу:


И работа продолжается! В настоящее время мы завершаем реализацию нескольких захватывающих новых функций.

К чему был этот урок истории?

Я надеюсь, вы поняли, что командная строка остаётся ключевым компонентом стратегии, платформы и экосистемы Microsoft.

Хотя для конечных пользователей Microsoft продвигала графический интерфейс, сама компания и её технические клиенты/пользователи/партнёры в значительной степени полагались на командную строку для выполнения множества технических задач.

На самом деле Microsoft буквально не смогла бы создать ни Windows, ни любой другой из своих программных продуктов без быстрой, эффективной, стабильной и безопасной консоли!

На протяжении эпох MS-DOS, Unix, OS/2 и Windows командная строка оставалась, пожалуй, самым важным инструментом в наборе инструментов каждого технического пользователя. Даже многие пользователи, которые никогда не вводили команды в окно, в реальности используют консоль каждый день!

:/>  Как показать или скрыть информацию о погоде на панели задач Windows 10

Переход в известные папки

Более известный способ запуск команд основан на использовании кодовых слов, т.е. текстовых идентификаторов папок, которые понятны системе. Например, избранное проводника можно создать открыть так.

shell:Links

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

  • быстрого перехода в скрытую или системную папку, если их отображение отключено в проводнике
  • объяснений, как добраться до какой-либо папки, что экономит время при оказании помощи (удобство, например, заключается в том, что нужная пользовательская папка открывается вне зависимости от имени учетной записи)
  • создания ярлыков к часто используемым папкам

Так, для создания ярлыка, щелкните правой кнопкой мыши на рабочем столе и выберите Создать — Ярлык. Затем введите команду:

explorer shell:Links

Команды shell
Увеличить рисунок

Все кодовые слова для команд можно найти в разделе реестра

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionexplorerFolderDescriptions

Заглянув в его подразделы, можно подметить два момента:

  • значение параметра Name является кодовым словом для запуска
  • некоторые подразделы содержат параметр ParsingName, и его значение также можно использовать для запуска

Во втором случае мы как раз имеем дело с элементами ActiveX, а GUID в значении параметра указывает на подраздел в HKLMSOFTWAREClassesCLSID, o котором шла речь выше. Теперь вы видите, почему при запуске команд путем вызова GUID используется дополнительная пара двоеточий.

Команды shell
Увеличить рисунок

Подсистема windows для linux (wsl)

Основанные на GNU/Linux «дистрибутивы» (сочетания ядра Linux и коллекций инструментов пользовательского режима) становятся всё популярнее, особенно на серверах и в облаке. Хотя в Windows имелась POSIX-совместимая среда выполнения, но SFU не мог запускать многие инструменты и двоичные файлы Linux из-за дополнительных системных вызовов и различий в поведении по сравнению с традиционной Unix/POSIX.

После анализа обратной связи от разработчиков и технически подкованных пользователей Windows, а также в связи с растущим спросом внутри самой Microsoft, компания изучила несколько вариантов, и в конечном итоге решила позволить на Windows запуск оригинальных немодифицированных бинарных файлов Linux!

В середине 2021 года Microsoft сформировала группу разработки того, что станет подсистемой Windows для Linux (WSL). WSL впервые анонсировали в сборке Build 2021, а вскоре предварительная версия вышла на канале Windows 10 Insider.

С тех пор WSL обновляется в большинстве инсайдерских сборок и в каждом крупном выпуске ОС с момента Anniversary Update осенью 2021 года. В каждой новой версии увеличивается функциональность, совместимость и стабильность WSL: в первой версии это был интересный эксперимент, который мог запускать лишь несколько распространённых программ Linux.

Сегодня (середина 2021 года) WSL запускает большинство двоичных файлов Linux, программы, компиляторы, компоновщики, отладчикии т.д. Многие разработчики, IT-специалисты, инженеры DevOps и многие другие, кому необходимо запускать или создавать инструменты, приложения, службы Linux и т. д., получили резкое повышение производительности и возможность запускать свои любимые инструменты Linux вместе с любимыми инструментами для Windows на одном компьютере, без загрузки двух операционных систем.

Команда WSL продолжает улучшать WSL в части выполнения задач Linux, повышения производительности и интеграции с Windows.

Создание «заметок» (стикеров) в windows 10

Хотя ОС Windows 10 и не имеет встроенных гаджетов, в ней всё же присутствует одно известное приложение из Windows 7 — «Заметки». В Windows 10 оно называется Sticky Notes. Чтобы добавить виджет на рабочий стол, необходимо:

  1. Открыть меню «Пуск — Все приложения» и, промотав список до английской буквы S, щёлкнуть по приложению Sticky Notes.
    Меню «Пуск» в Windows 10
    «Заметки» можно также открыть, воспользовавшись поисковой строкой Windows (для поиска ввести Sticky Notes)
  2. Виджет «Заметки» автоматически появится на рабочем столе.
    Приложение «Заметки» в WIndows 10
    Изменять размер стикера можно, растягивая его границы (зажимая левую кнопку мыши)
  3. Для добавления ещё одной заметки достаточно кликнуть по значку « ».
    Несколько стикеров для рабочего стола в Windows 10
    Чтобы изменить цвет стикера, нажмите на значок в виде трёх точек «…»

Помимо этого, виджет «Заметки» поддерживает стандартные функции редактирования текста:

  • CTRL B — выделение текста жирным;
  • CTRL I — курсив;
  • CTRL U — выделенные символы будут подчёркиваться;
  • CTRL T — перечёркнутый текст;
  • CTRL SHIFT L — создание маркированного списка, двойное нажатие клавиш переключит на нумерованный список;
  • CTRL SHIFT > — увеличение размера шрифта на единицу;
  • CTRL SHIFT < — уменьшение размера шрифта на единицу.

Только для windows

Многие средства командной строки и приложения широко используют

В чём проблема? Они работают только под Windows.

Таким образом, в сочетании с другими различиями (например, в жизненном цикле и т.д.), приложения командной строки Windows не всегда легко переносятся под *NIX и наоборот.

Из-за этого в экосистеме Windows распространены свои собственные, часто похожие, но обычно отличающиеся средства командной строки и приложения. Это означает, что при использовании Windows пользователям приходится изучать один набор приложений и инструментов командной строки, оболочек, языков сценариев и т.д., а при использовании *NIX — другой набор.

У этой проблемы нет простого решения: консоль Windows и командную строку нельзя просто выбросить и заменить на bash и iTerm2 — существуют сотни миллионов приложений и сценариев, которые зависят от консоли Windows и оболочек Cmd/PowerShell.

Сторонние инструменты, такие как Cygwin, отлично переносят многие основные инструменты GNU и библиотеки совместимости в Windows, но не могут запускать непортированные, неизменённые бинарники Linux. Это очень важно, так как многие пакеты и модули Ruby, Python, Node зависят от бинарных файлов Linux и/или зависят от поведения *NIX.

Эти причины привели к тому, что Microsoft расширила совместимость с Windows, разрешив запуск аутентичных двоичных файлов и средств Linux в подсистеме Windows для Linux (WSL). С помощью WSL пользователи теперь могут загружать и устанавливать один или несколько дистрибутивов Linux бок о бок на одной машине, а также использовать apt/zypper/npm/gem/др. для установки и запуска подавляющего большинства инструментов командной строки Linux вместе с их любимыми приложениями и инструментами Windows.

Тем не менее, у нативной консоли остаётся функциональность, которая отсутствует в сторонних терминалах: в частности, Windows Console предоставляет сервисы command-history и command-alias, чтобы каждой оболочке (в частности) не пришлось повторно реализовать одинаковую функциональность.

Задача вторая. раскрашиваем вывод

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

выдаёт несколько проектов разной степени проработки и удобности — от простейшего наследника

logging.StreamHandler

, до некоего набора, при импорте автоматически подменяющего стандартный StreamHandler.

Попробовав несколько из них, я, в итоге, воспользовался простейшим наследником StreamHandler, приведённом в одном из комментов на Stack Overflow и пока вполне доволен:

class ColoredHandler( logging.StreamHandler ):
    def emit( self, record ):
        # Need to make a actual copy of the record
        # to prevent altering the message for other loggers
        myrecord = copy.copy( record )
        levelno = myrecord.levelno
        if( levelno >= 50 ): # CRITICAL / FATAL
            color = 'x1b[31;1m' # red
        elif( levelno >= 40 ): # ERROR
            color = 'x1b[31m' # red
        elif( levelno >= 30 ): # WARNING
            color = 'x1b[33m' # yellow
        elif( levelno >= 20 ): # INFO
            color = 'x1b[32m' # green
        elif( levelno >= 10 ): # DEBUG
            color = 'x1b[35m' # pink
        else: # NOTSET and anything else
            color = 'x1b[0m' # normal
        myrecord.msg = (u"%s%s%s" % (color, myrecord.msg, 'x1b[0m')).encode('utf-8')  # normal
        logging.StreamHandler.emit( self, myrecord )

Однако, в Windows всё это работать, разумеется, отказалось. И если раньше можно было «включить» поддержку ansi-кодов в консоли добавлением «магического» ansi.dll из проекта symfony куда-то в недра системных папок винды, то, начиная (кажется) с Windows 7 данная возможность окончательно «выпилена» из системы. Да и заставлять юзера копировать какую-то dll в системную папку тоже как-то «не кошерно».

Снова обращаемся к гуглу и, снова, получаем несколько вариантов решения. Все варианты так или иначе сводятся к подмене вывода ANSI escape-последовательностей вызовом WinAPI для управления атрибутами консоли.

Побродив некоторое время по ссылкам, набрёл на проект colorama. Он как-то понравился мне больше остального. К плюсам именно этого проекта ст́оит отнести, что подменяется весь консольный вывод — можно выводить раскрашенный текст простым print u”x1b[31;40mЧто-то красное на чёрномx1b[0m” если вдруг захочется поизвращаться.

Сразу замечу, что текущая версия 0.1.18 содержит досадный баг, ломающий вывод unicode строк. Но простейшее решение я привёл там же при создании issue.

Собственно осталось объединить оба пожелания и начать пользоваться вместо традиционных «костылей»:

# -*- coding: utf-8 -*-
import sys
import codecs
import copy
import logging

#: Is ANSI printing available
ansi = not sys.platform.startswith("win")

def setup_console(sys_enc='utf-8', use_colorama=True):
    """
    Set sys.defaultencoding to `sys_enc` and update stdout/stderr writers to corresponding encoding

    .. note:: For Win32 the OEM console encoding will be used istead of `sys_enc`
    """
    global ansi
    reload(sys)
    try:
        if sys.platform.startswith("win"):
#... код, показанный выше
        if use_colorama and sys.platform.startswith("win"):
            try:
                # пробуем подключить colorama для винды и взводим флаг `ansi`, если всё получилось
                from colorama import init
                init()
                ansi = True
            except:
                pass

class ColoredHandler( logging.StreamHandler ):
    def emit( self, record ):
        # Need to make a actual copy of the record
        # to prevent altering the message for other loggers
        myrecord = copy.copy( record )
        levelno = myrecord.levelno
        if( levelno >= 50 ): # CRITICAL / FATAL
            color = 'x1b[31;1m' # red
        elif( levelno >= 40 ): # ERROR
            color = 'x1b[31m' # red
        elif( levelno >= 30 ): # WARNING
            color = 'x1b[33m' # yellow
        elif( levelno >= 20 ): # INFO
            color = 'x1b[32m' # green
        elif( levelno >= 10 ): # DEBUG
            color = 'x1b[35m' # pink
        else: # NOTSET and anything else
            color = 'x1b[0m' # normal
        myrecord.msg = (u"%s%s%s" % (color, myrecord.msg, 'x1b[0m')).encode('utf-8')  # normal
        logging.StreamHandler.emit( self, myrecord )

Дальше в своём проекте, в запускаемом файле пользуемся:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from setupcon import setup_console
setup_console('utf-8', False)
#...

# или если будем пользоваться раскрашиванием логов
import setupcon
setupcon.setup_console()
import logging
#...
if setupcon.ansi:
    logging.getLogger().addHandler(setupcon.ColoredHandler())

На этом всё. Из потенциальных доработок осталось проверить работоспособность под win64 python и, возможно, добаботать ColoredHandler чтобы проверял себя на isatty, как в более сложных примерах на том же StackOverflow.

Итоговый вариант получившегося модуля можно забрать на dumpz.org

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

Adblock
detector