Как понять, что матрица монитора повреждена
Обновлено: 23.11.2024
В python-2.x есть два типа, которые работают с текстом.
-
для строк байтов. По своей природе они очень похожи на то, как обрабатываются строки в C.
- Unicode предназначен для строк кодовых точек в формате Unicode.
Что, черт возьми, такое «Юникод»?
Одна из ошибок, которую совершают люди, впервые сталкивающиеся с этой проблемой, заключается в том, что они путают тип unicode и кодировки unicode, хранящиеся в типе str. В python тип unicode хранит абстрактную последовательность кодовых точек. Каждая кодовая точка представляет собой графему. Напротив, байт str хранит последовательность байтов, которая затем может быть сопоставлена с последовательностью кодовых точек. Каждая кодировка Юникода (UTF-8, UTF-7, UTF-16, UTF-32 и т. д.) сопоставляет различные последовательности байтов с кодовыми точками Юникода.
Что это значит для вас как программиста? Когда вы имеете дело с текстовыми манипуляциями (определение количества символов в строке или обрезка строки по границам слов), вы должны иметь дело со строками unicode, поскольку они абстрагируют символы способом, подходящим для мышления. из них в виде последовательности букв, которую вы увидите на странице. Имея дело с вводом-выводом, чтением на диск и с диска, печатью на терминал, отправкой чего-либо по сети и т. д., вы должны иметь дело с байтом str, так как этим устройствам потребуется иметь дело с конкретными реализациями того, какие байты представляют ваши абстрактные символы.
В мире python2 многие API-интерфейсы взаимозаменяемо используют эти два класса, но есть несколько важных API-интерфейсов, где только один или другой будет работать правильно. Когда вы указываете неверный тип строки в API, которому нужен другой тип, может возникнуть исключение ( UnicodeDecodeError или UnicodeEncodeError ). Однако эти исключения не всегда вызываются, потому что python неявно выполняет преобразование между типами. иногда.
Хотя преобразование, когда это возможно, кажется правильным, на самом деле это первый источник разочарования. Программист может протестировать свою программу с помощью такой строки: Быстрая коричневая лиса перепрыгнула через ленивую собаку и не столкнуться с какими-либо проблемами. Но когда они выпускают свой софт на волю, кто-то вводит строку: Я сел пить кофе в кафе и вдруг выбрасывается исключение. Причина? Механизм преобразования между двумя типами может работать только с символами ASCII. Как только вы добавили в свои строки символы, отличные от ASCII, вам придется начать заниматься преобразованием вручную.
Итак, если я вручную преобразую все в байтовые строки str или unicode, все ли будет в порядке? Ответ. иногда.
Проблема, с которой вы сталкиваетесь при преобразовании всего в байтовые строки str или unicode, заключается в том, что вы будете довольно часто использовать чужой API (включая API в стандартной библиотеки python) и обнаружите, что API будет принимать только байтовые str или только строки unicode. Или, что еще хуже, код примет и то, и другое, когда вы имеете дело со строками, состоящими исключительно из ASCII, но выдаст ошибку, если вы дадите ему строку, которая содержит не ASCII. персонажи. Когда вы сталкиваетесь с этими API, вам сначала нужно определить, какой тип будет работать лучше, а затем вы должны преобразовать свои значения в правильный тип для этого кода. Таким образом, программист, который хочет заблаговременно исправить все ошибки Юникода в своем коде, должен сделать две вещи:
- Вы должны отслеживать, к какому типу относится ваша последовательность текста. Содержит ли my_sentence unicode или str? Если вы этого не знаете, вас ждет много боли.
- Каждый раз, когда вы вызываете функцию, вам нужно оценить, будет ли эта функция правильно работать со значениями str или unicode. Отправка здесь неправильного значения приведет к возникновению ошибки UnicodeError, если строка содержит символы, отличные от ASCII.
Здесь есть один смягчающий фактор. Сообщество разработчиков Python стандартизировало использование unicode во всех своих API. Хотя есть некоторые API, которым вам нужно отправить байт str, чтобы быть в безопасности (включая такие вездесущие вещи, как print(), как мы увидим в следующем раздел), становится все проще и проще использовать строки Unicode с большинством API.
Хорошо, так как сообщество Python переходит к повсеместному использованию строк Unicode, мы могли бы также преобразовать все в строки Unicode и использовать их по умолчанию, верно? Звучит хорошо в большинстве случаев, но есть по крайней мере одно огромное предостережение, о котором следует знать. Каждый раз, когда вы выводите текст на терминал или в файл, текст должен быть преобразован в байт str .Python попытается неявно преобразовать unicode в byte str . но это вызовет исключение, если байты не ASCII:
Хорошо, это достаточно просто решить: просто преобразуйте в байт str, и все готово:
Значит, это было просто, верно? Хорошо. есть одна ошибка, которая иногда усложняет отладку. Когда вы пытаетесь записать строки, отличные от ASCII unicode, в файлоподобный объект, вы каждый раз получаете обратную трассировку. Но что происходит, когда вы используете print()? Терминал представляет собой файлоподобный объект, поэтому он должен вызывать исключение, верно? Ответ на это. иногда:
Не исключение. Хорошо, тогда все в порядке?
До тех пор, пока кто-нибудь не сделает одно из следующих действий:
Запускает скрипт в другой локали:
Перенаправляет вывод в файл:
Хорошо, проблема с локалью неприятна, но понятна: локаль C не понимает никаких символов за пределами ASCII, поэтому, естественно, попытка отобразить их не сработает. Теперь, почему перенаправление на файл вызывает проблемы? Это потому, что print() в python2 обрабатывается особым образом. В то время как другие файловые объекты в python всегда преобразуются в ASCII, если вы не настроите их по-другому, использование print() для вывода на терминал будет использовать языковой стандарт пользователя для преобразования перед отправкой вывода на терминал. Когда print() не выводит на терминал (например, перенаправляется в файл), print() решает, что не знает, какую локаль использовать для этот файл, поэтому он пытается преобразовать его в ASCII.
Что это значит для вас как программиста? Если вы не можете позволить себе роскошь контролировать то, как ваши пользователи используют ваш код, вы должны всегда, всегда, всегда преобразовывать в байт str перед выводом строк на терминал или в файл. Python даже предоставляет вам возможность сделать именно это. Если вы знаете, что каждая строка unicode, которую вы отправляете в определенный файловый объект (например, stdout ), должна быть преобразована в определенную кодировку, вы можете использовать codecs.StreamWriter для преобразования строки unicode в байт str . В частности, codecs.getwriter() вернет класс StreamWriter, который поможет вам обернуть файловый объект для вывода. Используя наш пример print():
В английском языке есть поговорка "ждать, пока упадет другой ботинок". Это означает, что когда происходит одно событие (как правило, плохое), вы ожидаете, что за ним последует другое событие (обычно худшее). В данном случае у нас есть две другие туфли.
Если вы обертываете sys.stdout с помощью codecs.getwriter() и считаете, что теперь можете безопасно печатать любую переменную без проверки ее типа, боюсь, я должен сообщить вам что вы не уделяете должного внимания закону Мерфи. StreamWriter, предоставляемый codecs.getwriter(), будет принимать строки unicode и преобразовывать их в байтовые str до того, как они получат в sys.stdout . Проблема в том, что если вы дадите ему что-то, что уже является байтом str, он попытается преобразовать и его. Для этого он пытается преобразовать байт str, который вы ему даете, в unicode, а затем преобразовать его обратно в байт str. а так как для этих преобразований используется кодек ASCII, есть вероятность, что при их выполнении произойдет сбой:
Чтобы обойти это, кухня предоставляет альтернативную версию codecs.getwriter(), которая может работать как с байтовыми строками str, так и со строками Unicode. . Используйте kitchen.text.converters.getwriter() вместо версии codecs следующим образом:
Хорошо, мы зашли так далеко. Мы конвертируем все в строки unicode. Мы знаем, что нам нужно преобразовать обратно в байт str, прежде чем мы начнем запись в терминал. Мы поработали над тем, что стандартная функция getwriter() не может работать как с байтовыми строками str, так и со строками Unicode. Все готово? Что ж, есть по крайней мере еще одна проблема: создание исключений с сообщением unicode. Взгляните:
Нет, я не обрезал последнюю строку; создание исключений действительно не может обрабатывать символы, отличные от ASCII, в строке unicode и будет выводить исключение без сообщения, если сообщение их содержит. Что произойдет, если мы попытаемся использовать удобную хитрость денди getwriter(), чтобы обойти это?
Это не только не удалось, но и поглотило символ новой строки в конце, который обычно присутствует. Итак, как заставить это работать? Преобразование строк unicode в байтовые str вручную перед выводом:
Если вы используете codecs.getwriter() для sys.stderr , вы обнаружите, что создание исключения с байтом str также не работает StreamWriter по умолчанию.Не делайте этого, иначе у вас не будет возможности выводить символы, отличные от ASCII. Если вы хотите использовать StreamWriter для кодирования других вещей в stderr, сохраняя рабочие исключения, используйте kitchen.text.converters.getwriter() .
Иногда вы все делаете правильно в своем коде, но чужой код подводит вас. С проблемами юникода это случается чаще, чем нам хотелось бы. Ярким примером этого является то, что вы возвращаете значения из функции, которые не всегда являются строкой unicode или байтом str .
Примером из стандартной библиотеки Python является gettext . Функции gettext помогают переводить сообщения, которые вы показываете пользователям, на их родные языки. Поскольку большинство языков содержат буквы вне диапазона ASCII, возвращаемые значения содержат символы Юникода. gettext предоставляет вам ugettext() и ungettext() для возврата этих переводов в виде строк unicode и gettext() , ngettext() , lgettext() и lngettext(), чтобы вернуть их в виде закодированного байта стр . К сожалению, несмотря на то, что задокументировано, что они возвращают только один тип строки или другой, реализация имеет крайние случаи, когда может быть возвращен неправильный тип.
Это означает, что даже если вы правильно разделите строку Unicode и байт str перед передачей строк функции gettext, впоследствии, возможно, вам придется еще раз проверить правильность типа строки.
kitchen.i18n предоставляет альтернативные объекты преобразования gettext, которые возвращают только байтовую str или только строку unicode.
Несколько решений¶
Теперь, когда мы определили проблемы, можем ли мы определить комплексную стратегию их решения?
Преобразование текста на границе¶
Если вы получаете фрагмент текста из библиотеки, читаете из файла и т. д., немедленно преобразуйте его в строку Unicode. Поскольку python повсеместно движется в сторону строк Unicode, работать со строками Unicode в коде будет проще.
Если ваш код сильно связан с использованием байтов, вы можете сделать наоборот и преобразовать весь текст в байты str на границе и преобразовать только в unicode когда вам это нужно для перехода к другой библиотеке или выполнения над ней строковых операций.
В любом случае важно выбрать тип строк по умолчанию и придерживаться его во всем коде. Когда вы смешиваете типы, становится намного проще работать со строкой с помощью функции, которая может использовать другой тип только по ошибке.
В python3 абстрактный тип Unicode становится гораздо более заметным. Тип с именем str является эквивалентом unicode в python2, а тип bytes в python3 заменяет str в python2. Большинство API имеют дело со строкой типа Unicode только с некоторыми низкоуровневыми фрагментами, работающими с байтами. Неявные преобразования между байтами и юникодом удалены, и всякий раз, когда вы хотите сделать преобразование, вам нужно сделать это явно.
Когда данные должны обрабатываться как байты (или юникод), используйте соглашение об именах¶
Иногда вы преобразовываете почти все свои данные в строки Unicode, но у вас есть одно или два значения, где вы должны сохранить байт str. Это часто бывает, когда вам нужно использовать значение дословно с каким-то внешним ресурсом. Например, имена файлов или значения ключей в базе данных. При этом используйте соглашение об именах для данных, с которыми вы работаете, чтобы вы (и другие, читающие ваш код позже) не запутались в том, что хранится в значении.
Если вам нужна как текстовая строка для представления пользователю, так и байтовое значение для точного совпадения, рассмотрите возможность сохранения обеих версий. Вы можете использовать для этого либо две переменные, либо dict, ключом которого является значение байта.
Вы можете использовать соглашение об именах, используемое на кухне, в качестве руководства для реализации собственного соглашения об именах. Он префикс байтовых переменных str неизвестной кодировки с b_ и байта str известной кодировки с именем кодировки, например: utf8_ . Если бы значение по умолчанию обрабатывало str и сохраняло только несколько значений unicode, эти переменные имели бы префикс u_ .
При выводе данных конвертировать обратно в байты¶
Когда вы отправите свои данные обратно за пределы вашей программы (в файловую систему, по сети, для отображения пользователю и т. д.), преобразуйте данные обратно в байт str . Как вы это сделаете, будет зависеть от ожидаемого формата вывода данных. Для отображения пользователю вы можете использовать пользовательскую кодировку по умолчанию, используя locale.getpreferredencoding() . Для входа в файл лучше всего выбрать одну кодировку и придерживаться ее.
При использовании кодировки, установленной пользователем (например, с помощью locale.getpreferredencoding() , помните, что у него может быть установлена кодировка, которая не может отображать каждый символ Юникода. Это означает, что при преобразовании из unicode в байтовую str вам нужно решить, что должно произойти, если значение байта недопустимо в кодировке пользователя. пользователю обычно можно использовать обработчик ошибок кодирования replace, чтобы заменить недопустимые символы знаком вопроса или другим символом, означающим, что символ не может быть отображен.
Вы можете использовать kitchen.text.converters.getwriter(), чтобы сделать это автоматически для sys.stdout . При создании сообщений об исключениях обязательно конвертируйте их в байты вручную.
При написании юнит-тестов включайте значения, отличные от ASCII, и типы unicode и str¶
Если вы не знаете, что определенная часть вашего кода будет работать только с ASCII, обязательно включите в свои модульные тесты значения, отличные от ASCII. Настоятельно рекомендуется также включать несколько символов из нескольких разных шрифтов, потому что в некоторых кодах могут быть специальные латинские символы с диакритическими знаками, но не известно, как обрабатывать символы, используемые в азиатских алфавитах.
Точно так же, если вы не знаете, что этой части вашего кода будут предоставлены только строки unicode или только байты str, обязательно попробуйте переменные обоих типов в своих юнит-тестах. При этом убедитесь, что переменные также не являются ASCII, так как неявное преобразование Python скроет проблемы с чистыми данными ASCII. Во многих случаях имеет смысл проверить, что произойдет, если заданы строки byte str и unicode, которые не будут декодироваться в текущей локали.
Будьте бдительны, выявляя плохие API¶
Убедитесь, что используемые вами библиотеки возвращают только строки unicode или байты str . Юнит-тесты могут помочь вам обнаружить здесь проблемы, пропустив множество вариантов данных через ваши функции и проверив, что вы по-прежнему получаете ожидаемые типы строк.
Пример: объединение всего этого с кухней¶
Кухня предоставляет широкий набор функций, которые помогут вам работать с байтовыми строками str и Unicode в вашей программе. Вот небольшой пример, в котором для выполнения своей работы используется множество кухонных функций:
Мы подробно разобрали маркировку матриц, но иногда бывают ситуации, когда нужной модели матрицы нет в наличии и в этом случае есть возможность подобрать ее аналог - благо, многие модели полностью совместимы с друг друга. При выборе матрицы необходимо обращать внимание на ее диагональ, разрешение, разъем и его расположение, толщину и крепление — именно эти характеристики крайне важны для правильного подбора аналогов.
Диагональ матрицы указывается в ее артикуле - это первые три цифры. Например, матрица, изображенная на фото выше, имеет диагональ 15,6 дюйма: на это указывают цифры 156. Разрешение матрицы также иногда отражается в ее маркировке, но рекомендуем узнать ее с помощью нашего сайта или документации к вашему устройству: Зная модель ноутбука или артикул матрицы, можно легко узнать ее разрешение.
Разъем матрицы используется для подключения к материнской плате с помощью шлейфа: В современных моделях используются разъемы LVDS (есть модели с 20, 30, 40 или 50 контактами) или EDP (только 30 или 40-контактные), а сам разъем может располагаться справа или слева, в зависимости от модели ноутбука. Рекомендуем самостоятельно посмотреть расположение разъема на матрице (например, на фото он расположен справа), а его тип и количество контактов лучше узнать из спецификации матрицы по ее артикулу - эту информацию можно легко найти на нашем сайте или в Интернете. Также стоит упомянуть, что разъемы LVDS обычно обозначаются только цифрами (например, 40), а в случае разъемов EDP указывается еще и их тип (например, EDP 30).
С появлением компактных ноутбуков и ультрабуков, помимо стандартных матриц, производители стали устанавливать более тонкие модели SLIM или Ultraslim. Визуально различить друг друга вполне возможно, однако на всякий случай лучше переустановить и посмотреть толщину вашей матрицы на нашем сайте или в интернете.
Ну и последний важный параметр при выборе аналога - крепления матрицы. Как правило, большинство матриц не имеют дополнительных креплений, но некоторые модели могут быть оснащены ушками, расположенными сверху-снизу, как на нашем первом фото матрицы, или слева-направо.
Подводя итог, можно сказать, что все эти параметры важны для правильного выбора аналога, но они не гарантируют нормальной работы выбранной вами матрицы: дело в том, что у каждой матрицы свой EDID - информация о параметрах и возможности, хранящиеся на отдельном чипе. В некоторых случаях эта информация не позволяет нормально работать экрану в вашем ноутбуке, поэтому необходимо перепрограммировать эту микросхему матрицы для правильной работы - такую услугу предоставляют многие сервисные центры.
Матрица называется прямоугольной таблицей из чисел с некоторым количеством m. строк и с некоторым количеством n. столбцов. Числа m. и n. называются порядками или измерениями Matrix.
Матрица порядка m × N. Записывается в виде:
или (I =. 1,2, . m; J =. 1,2, . n).< /p>
Числа a ij. Входящие в эту матрицу называются ее элементами. В записи a ij. Первый индекс i. означает номер строки, а второй индекс j.— номер столбца.
Матричная строка
Размер матрицы 1. × N.. состоящая из одной строки, называется строкой матрицы. Например:
Столбец матрицы
Размер матрицы m × 1.. состоящая из одного столбца, называемого матрицей столбцов. например
Нулевая матрица
Если все элементы матрицы равны нулю, то матрица называется нулевой матрицей. например
Квадратная матрица
Матрица A. порядка m × N. называется квадратной матрицей, если количество строк и столбцов совпадают: M = N.. Число m = N. вызывается процедурой Квадратная матрица. Например:
Главная диагональная матрица
а 11, А 22, . NN Сформируйте матрицу главной диагонали. Например:
При m × N. Удовлетворение элементов a II (I = 1,2 , . min (m, n)) Также образуют главную диагональ. Например:
Элементы, расположенные на главной диагонали, называются элементами главной диагонали или просто диагональными элементами.
Боковая диагональ матрицы
Элементы, расположенные на земле a 1N, A 2N-1, . Матрица формы N1 по диагонали. Например:
Диагональная матрица
Квадратная матрица называется диагональной, если элементы, расположенные вне главной диагонали, равны нулю. Пример диагональной матрицы:
Одна матрица
Квадратная матрица n.-o порядка, у которой на главной диагонали стоят единицы, а все остальные элементы равны нулю, называется одинарной матрицей и обозначается через E. или E. N, где n. — порядок матрицы. Единичная матрица порядка 3 имеет следующий вид:
Матрица следа
Сумма элементов главной диагонали матрицы A. называется следующей матрицей и обозначается sp A. или tr A.. Например:
Полностью функционален со следами ограниченного использования — Очень небольшой износ. Любые экраны свободны от недостатков.
Косметическая марка B
Полностью функционален со следами нормального использования. Чаще всего небольшие царапины и/или небольшие вмятины. Любые экраны будут иметь очень незначительные дефекты, которые не повлияют на отображение.
Косметическая марка C
Полностью функционален со следами значительного использования — чаще всего большими царапинами, вмятинами, сколами/сломанным пластиком, трещинами, изношенными углами и/или обесцвечиванием. Любые экраны будут иметь заметные дефекты.
Включено
Не включено
Метод печати | 9-контактная последовательная точечная матрица |
---|---|
Максимальная скорость печати | 4,70 lps |
Максимальное разрешение печати | 16 cpi |
Цветной вывод | Два цвета |
Последовательный порт(ы) | Да |
Параллельный порт(ы) th> | Да |
USB-порт(ы) | Да |
USB-порт с питанием (s) | Нет |
Порт(ы) Ethernet | Нет |
Нет | |
Порт(ы) Ethernet Micros | Нет | tr>
Беспроводное подключение | Нет |
Подключение Bluetooth | Нет |