Set mode что это
Ваш смартфон способен на большее: функции, трюки, настройки инженерного меню Android
Новенький смартфон хорош со всех сторон. Но проходит время – и он уже не тот: звук в наушниках становится тише, микрофон – глуше, батареи хватает на полдня… Значит, пора старичку на свалку? Не торопитесь, он вам еще послужит: достаточно разбудить его скрытые резервы.
Аппаратная начинка большинства мобильных устройств используется лишь на 80-90% своего потенциала. А чтобы выжать из нее все 100, нужно попасть в одну секретную область – инженерное меню, которое… Поговорим, что представляет собой инженерное меню Android, как в него войти, какие в него заложены функции и как их использовать.
Они хотели скрыть это от нас
Инженерное меню – это сервисное приложение для тестирования, отладки и тонкой настройки аппаратных функций смартфона или планшета. Конечно, оно предназначено не для пользователей, а для разработчиков и сервисных специалистов, но пытливый юзерский ум не ведает покоя: как же не использовать этот кладезь в своих целях, если есть такая возможность?
А возможности инженерного меню действительно стоят внимания. Ведь в их числе:
Инженерное меню есть не на всех Android-телефонах и планшетах. На бюджетных девайсах сильно китайских брендов, а особенно «no name» зачастую его нет. Также его часто нет на устройствах с процессорами Qualcomm.
Набор доступных функций и сама организация инженерного меню зависят от марки процессора и оснащенности устройства тем или иным оборудованием. Основная масса смартфонов и планшетов базируется на процессорах MTK (MediaTek), поэтому знакомиться с ним будем на их примере.
Как попасть в «инженерку»
Войти в инженерное меню бывает не так-то просто. На одних гаджетах оно открывается только после получения прав суперпользователя (root), на других без root доступна часть функций, на третьих – все, достаточно включить режим разработчика (он активируется многократным касанием строки «Номер сборки» в разделе настроек «О телефоне»).
Для открытия меню используют специальные коды, которые набирают так же, как команды USSD – на телефонной клавиатуре, либо приложения из Google Play маркета.
В таблице ниже приведен список кодов для разных марок мобильных устройств:
А далее – приложения, которые создают ярлык на рабочем столе для быстрого доступа к «инженерке» смартфонов и планшетов на MTK:
К сожалению, универсально-совместимых приложений здесь нет, поскольку их не существует. Многие платформы, даже оснащенные процессорами MediaTek, не поддерживают часть программ из этого списка, а некоторые и вовсе ни одну.
Знакомство с инженерным меню смартфона MTK
Для входа в «инженерку» использовалось приложение MTK Engineer Mode, ссылка на которое приведена ваше.
Как видно на скриншоте, стартовая страница утилиты содержит кнопки перехода к трем основным разделам:
В Android Settings находятся разделы информации о телефоне, куда дополнительно входят средства проверки, включения и выключения некоторых функций, а также информация о батарее, WLAN (беспроводных соединениях) и статистика использования аппарата.
На тестовом смартфоне этот раздел выглядит так:
Но нас интересует не он, а то, что дальше – MTK Settings. Рассмотрим его разделы подробнее.
Telepfony
Установка в настройках Antenna Test (3G Fdd) опции Resume default setting – один из эффективных способов устранения провалов связи в сетях 3G.
Отключение полос частот, которые не использует ваш мобильный оператор, снижает расход заряда аккумулятора. Иногда весьма значительно.
Основная масса параметров этого раздела оптимально настроена по умолчанию, поэтому без уверенности в понимании своих действий лучше ничего здесь не менять.
Connectivity
Вкладка инженерного меню Connectivity содержит инструменты тестирования и управления работой беспроводной связи.
Hardware Testing
В Hardware Testing собраны инструменты проверки аппаратных устройств и интерфейсов Андроид-смартфона: звука, камер, дисплея, тачскрина, памяти, гнезда USB и т. д.
Для усиления звука из динамика громкой связи выберите в списке Type параметр Ring.
Для повышения чувствительности микрофона – mic.
Чтобы увеличить громкость в играх, при прослушивании музыки и просмотре видео, выберите Media. Остальное проделайте так же, как написано выше.
Уровни звучания на разных аппаратах заданы по-разному, единого стандарта нет. Поэтому искать оптимальные значения приходится экспериментальным путем.
Но если ваш аппарат сохраняет снимки только в формате JPG, что ограничивает возможности при обработке их в графических редакторах, откройте в разделе Camera список Capture Type и выберите формат RAW.
Остальное
Вкладка Location содержит средства управления системой геолокации смартфона. Работу некоторых опций этого меню мы рассматривали в статье о проблемах с GPS-навигацией.
В Log and Debudding собраны утилиты отладки и тестирования железа, а также их логи.
Others вмещает в себя всё, что не вошло в другие разделы инженерного меню. В частности, подраздел Setting Font, через который можно менять свойства системного шрифта; Thermal, где отображаются показания термодатчиков (функция мониторинга температур есть не на всех аппаратах); USB ACM, где собраны настройки подключения USB-модемов и многое другое. Функциональный набор этой вкладки на разных девайсах сильно различается.
К великому сожалению, официальной документации по работе с «инженеркой» Андроид-гаджетов в свободном доступе нет. И если вы всерьез настроились ее изучить, то действовать придется методом тыка на свой страх и риск. Да, основной функционал этого меню уже изучен и описан, и риск превратить телефон в кирпич относительно небольшой. Но все же проявляете осторожность и тщательно запоминайте, что делаете, ведь кнопки «Вернуть все обратно», если что-то пойдет не так, здесь не предусмотрено.
Раскрываем магию MySQL или о строгости и мягкости MySQL
Очень часто в интернете встречаюсь со статьями, в которых приводят кучу примеров с якобы странным поведением MySQL по сравнению с другими БД. Чтобы стало понятно, о чём я говорю, приведу несколько примеров:
1. Деление на ноль возвращает NULL вместо ошибки
2. Выход за диапазон допустимых значений неявно приводит число к допустимому значению, а не к ошибке и откату транзакции
3. Вставка неверного типа данных также приводит к неявному преобразованию и успешному выполнению операции
Таких примеров я могу привести огромное число, но цель статьи не сделать очередное собрание высосанных из пальца примеров, а объяснить, почему происходит то или иное действие. Вся эта мистика MySQL давно описана в документации и легко объяснима, в чём вы сможете убедиться сами, прочитав статью до конца.
Для меня эта первая статья на хабре, поэтому я старался писать дотошно подробно. Уверен, что она будет полезна всем, кто работает с MySQL. Большую помощь в написании статьи оказала подготовка к сдаче на сертификат разработчика MySQL, а точнее книга «MySQL Certification Study Guide».
Итак, мой друг, начнём!
SQL Modes
SQL modes – это настройка поведения работы сервера MySQL, состоящая из режимов, каждый из которых контролирует какой-либо один аспект обработки запроса.
Возможности SQL mode:
1. Устанавливает строгую или мягкую проверку входных данных
2. Включает или отключает следование SQL стандарту
3. Обеспечивает лучшую синтаксическую совместимость с другими БД
По сути, SQL mode очень мощный механизм тюнинга БД, позволяющий гибко манипулировать обработкой запросов и уведомлениями MySQL.
Прежде чем мы перейдём к последующей теории, вы должны строго-настрого уяснить, что изменение режима SQL mode после создания и вставки данных в партиционные таблицы (partitioning tables) может привести к существенным изменениям в поведении таких таблиц, что, в свою очередь, может привести к потере или повреждению данных. Настоятельно рекомендуется, чтобы вы никогда не изменяли SQL режим после создания партиционных таблиц.
При репликации партиционных таблиц, отличающиеся параметры SQL mode на Primary и Slave MySQL серверах также может привести к проблемам. Для стабильной работы репликации между серверами, настройки SQL mode должны быть идентичными.
Теперь, после того, как вы осознали всю ответственность в использовании SQL режимов, перейдём к его сути.
Контроль текущего SQL режима происходит через системную переменную sql_mode. Для задания значения используется команда SET. Ниже представлены возможные варианты установки данного режима.
1. Соответствует значению по умолчанию для только что установленной БД (никаких специальных режимов не установлено). Кавычки являются обязательными.
2. Установка одного режима sql_mode. Возможно два варианта – с кавычками и без них.
3. Установка нескольких режимов sql_mode. Указание кавычек является обязательным!
Несмотря на то, что названия режимов регистронезависимые, я для удобства прочтения буду везде в статье писать их в верхнем регистре.
В примерах выше мы устанавливали режимы для текущей сессии, но если вы обладаете привилегиями суперпользователя, то можно задать глобальный режим для всего сервера и всех текущих коннектов, указав параметр GLOBAL. Полный синтаксис установки sql_mode выглядит так:
Для просмотра текущих значений глобального и сессионного режима сервера используйте следующие запросы:
Краткий справочник режимов
ANSI_QUOTES
Заставляет сервер интерпретировать двойную кавычку ( » ) точно также, как и обратную кавычку ( ` ), при этом она теряет способность обрамлять строки. Как можно было догадаться, этот режим заставляет MySQL приблизиться к SQL стандарту.
IGNORE_SPACE
По умолчанию, между функцией и открывающейся круглой скобкой нельзя устанавливать пробелы. Включение этого режима разрешает серверу игнорировать пробелы, но платой за такую вольность станет то, что все функции станут зарезервированными словами, а значит, при совпадении имени столбца с именем функции придётся в обязательном порядке экранировать такой столбец.
ERROR_FOR_DIVISION_BY_ZERO
При делении на ноль в строгом режиме генерируется ошибка, а нестрогом — предупреждение при выполнении операторов INSERT или UPDATE. Без этого параметра деление на ноль возвращает предупреждение и вставляет в таблицу NULL. Про строгость будет сказано в следующем режиме, пока постарайтесь абстрагироваться.
В приведённых примерах мы получали исключительно предупреждения, потому что строгий режим был выключен. Понимание строгости очень важное понятие для БД MySQL, потому что в классических базах данных такого нет. Забегая вперёд, скажу, что все БД изначально строгие и не позволяют тех вольностей, которые есть в MySQL. Мягкость MySQL сложилась исторически, когда ещё не было InnoDB. Посудите сами, в нетранзакционных таблицах действуют совершенно другие правила, нежели чем в транзакционных, поэтому следование жестким правилам зачастую приводило бы к нежелательному результату.
STRICT_TRANS_TABLES
Включает «строгий режим» для всех таблиц, поддерживающих транзакции, т.е. на InnoDB и BDB. Этот режим возвращает ошибку, вместо предупреждения в следующих случаях:
1. Тип входных данных не соответствует заданному типу. Например, вставка строки в колонку c числовым типом
2. Число или дата находится вне допустимого диапазона. Диапазон определяется типом данных. Например, для типа unsigned tinyint допустимым диапазоном являются числа от 0 до 255
3. При вставке данных пропущено значение колонки, для которой не задано значение по умолчанию и имеет атрибут NOT NULL
4. Длина значения выходит за пределы заданного диапазона. Например, для колонки типа CHAR(5) вы не сможете вставить строку более 5 символов
5. Для типов ENUM и SET отсутствует вставляемое или обновляемое значение
Более подробно об особенностях работы данного режима будет рассказано отдельно в последующей ниже главе.
STRICT_ALL_TABLES
STRICT_ALL_TABLES полностью идентично STRICT_TRANS_TABLES, но действие режима уже распространяется на все таблицы MySQL, а не только на транзакционные.
Из-за разницы подходов к работе транзакционных и не транзакционных таблиц не всегда есть смысл использовать данный режим. Если это вам ещё не очевидно, то в главах о строгом и нестрогом режимах вы поймёте разницу.
TRADITIONAL
Композитный режим, включает в себя целый набор режимов, в который входит «строгий режим», а также ряд других режимов, налагающих ограничения на входные данные.
Заставляет MySQL вести себя как большинство «традиционных» баз данных SQL.
Посмотрим на полный перечень режимов, который содержит в себе данный режим.
Другой композитный режим, делающий MySQL «ANSI-подобным», т.е. приближенным к стандарту SQL.
Включает в себя следующие режимы: REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE.
Последние два режима были обсуждены ранее, поэтому кратко опишу первые два:
REAL_AS_FLOAT – тип данных real является синонимом float, а не double.
PIPES_AS_CONCAT – разрешает использовать для конкатенации строк ( || ), вместо логического ИЛИ.
ONLY_FULL_GROUP_BY
Генерирует ошибку в запросах, в которых GROUP BY имеет не полный список не агрегированных параметров из SELECT и HAVING.
Если вы желаете узнать обо всех SQL mode режимах и окунуться глубже в проблему, то милости прошу в официальную документацию http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html
Работа с SQL mode в PHP
По правде сказать, данную главу вряд ли можно назвать прикладной, потому что в реальных проектах конфигурировать нужно непосредственно на сервере MySQL, а не средствами языка программирования, поэтому глава скорее теоретическая, но для общего развития неплохо иметь ввиду и такой способ.
Чаще всего соединение с БД происходит через экземпляр класса PDO, поэтому рассмотрим его в деталях.
Есть два способа передать в БД специальные инструкции. Первый способ – передача в конструкторе. Посмотрим на полное описание конструктора:
Второй способ – конфигурирование на лету, через метод setAttribute;
Конечно, некоторые из вас могут возразить, что можно выполнять запросы методом query или exec, но поскольку изначально глава теоретическая, то не буду заострять внимание на таком способе.
Дополнительно о PDO можно прочитать в официальной документации php.net/manual/ru/book.pdo.php
Предопределённые PDO константы для работы с MySQL php.net/manual/ru/ref.pdo-mysql.php
Строгий режим
Мы уже немного познакомились со строгим режимом в главе SQL Mode, когда изучали режимы STRICT_TRANS_TABLES, STRICT_ALL_TABLES и композитный TRADITIONAL. Уже из самого названия легко догадаться, что все входные данные проверяются с особой тщательностью и в случае нарушений любых ограничений, вас неминуемо будет ждать ошибка.
Ошибка в транзакционных таблицах вызывает откат транзакции (rollback). Даже если ваши запросы не предварены командой start transaction, то неявно каждый запрос в отдельности по-любому будет обёрнут командами start transaction и commit. Так работают все традиционные БД, что в равной степени относится и к транзакционным таблицам MySQL. Из этого следует, что нарушив ограничение, вызывается rollback, который откатывает все изменения.
Для не транзакционных таблиц всё немного сложнее. Так, при вставке, обновлении или удалении нескольких строк, в случае ошибки отменяется только последнее действие, вместо полного отката. Проиллюстрирую это на примере.
Генерация ошибки происходит в следующих случаях:
1. Тип вставляемых данных отличается от заданного типа столбца
2. Опущено значение для столбца, которому не задано значение по умолчанию и имеет атрибут NOT NULL
3. Для чисел и дат – данные находятся вне диапазона допустимых значений
4. Для строк – превышение допустимой длины
5. Для типов ENUM и SET – значение не является допустимым для заданного перечисления
6. Для столбца, определённого как NOT NULL — вставка NULL
Дефолтные значения для типов данных
Если в insert запросе не указаны данные для одной из колонок, то MySQL будет обрабатывать эту ситуацию в следующем порядке:
1. Если столбец имеет значение по умолчанию, то используется это значение и на этом всё заканчивается, в противном случае происходит переход к следующему шагу
2. Если столбец не имеет параметр NOT NULL, то присваивается NULL и на этом всё заканчивается, в противном случае поведение зависит от переменной sql_mode, точнее от строгости самого режима.
Как можно было догадаться из предыдущей главы, строгий режим сразу вернёт ошибку, которая в свою очередь откатит транзакцию для транзакционных таблиц или отменит последнее действие для не транзакционных таблиц.
Нестрогий режим
Ура! Наконец-то, мы добрались до самой «загадочной» части статьи, которую некоторые освещают как некую магию MySQL, но, увы, это лишь фокусы на потеху детей. И так, поехали!
Возможно, нужно было ранее описать все случаи, для которых применяются правила проверки данных, но я решил сделать это только сейчас. Их всего три, но каждый из них требует отдельного рассмотрения.
Запросы на модификация данных: INSERT, UPDATE, REPLACE, LOAD DATA INFILE
Обновление описания схем таблиц: ALTER TABLE
Задание значения по умолчанию (DEFAULT) в описании колонки
Напоминаю, что в строгом режиме некорректные данные приведут к генерации ошибки и откат данных, а в нестрогом – значение будет не явно приведено к корректному значению и сгенерировано предупреждение. Для просмотра ошибок используйте SHOW WARNINGS.
Ниже будут подробно рассмотрены все случаи обработки некорректных значений и их разрешений на уровне БД.
Выход из диапазона допустимых значений
Если число меньше минимального значения допустимого диапазона, то присваивается минимально-допустимое число. Если больше максимального – максимально-допустимое.
Обработка строк
Строки длиннее заданной длины — усекаются.
ENUM и SET типы данных
Если присваиваемое значение колонке с типом ENUM не перечислено в определении ENUM, то MySQL преобразует его в пустую строку.
Если значение, которое присваивается SET столбцу содержит элементы, которые не перечислены в определении SET, то MySQL отбрасывает эти элементы, сохраняя значения только легальным элементам.
Преобразование в тип даты
При попытке сохранения значения, которое не может быть преобразовано в тип данных столбца, MySQL неявно преобразует его в значение по умолчанию для данного типа.
Таблица преобразований
STRING | DATE | INT |
‘2010-03-12’ | ‘2010-03-12’ | 2010 |
’03-12-2010′ | ‘0000-00-00’ | 3 |
‘0017’ | ‘0000-00-00’ | 17 |
‘500 hats’ | ‘0000-00-00’ | 500 |
‘bartholomew’ | ‘0000-00-00’ | 0 |
Присвоение NULL для колонки с NOT NULL
Результат зависит от того, будет вставлена одна строка или множество в INSERT запросе.
При вставке одной строки возникает ошибка и изменения не применяются. При множественной вставке — MySQL неявно преобразует значение по умолчанию для этого типа данных.
Обновление описания схем таблиц: ALTER TABLE
При изменении типа данных на колонку налагаются ограничения нового типа, что может привести к неожиданному изменению самих данных по правилам описанных выше.
Если на колонку налагается ограничение NOT NULL, то все NULL значения конвертируются в значения по умолчанию для заданного типа данных текущей колонки. Значения по умолчанию описаны в главе «Дефолтные значения для типов данных»
Задание значения по умолчанию (DEFAULT) в описании колонки
Вообще, всё уже было сказано в прошлой главе, поэтому здесь нечего добавить.
Ну что ж, мой дорогой читатель. Теперь ты можешь по-праву назваться настоящим джедаем и получить чёрный пояс)))
Извлекаем плюсы
IGNORE
Ключевое слово IGNORE заставляет MySQL включать для такого запроса нестрогий режим. Также его можно использовать для генерации предупреждения вместо ошибки, при нарушении целостности первичного ключа (PRIMARY KEY) или уникальности (UNIQUE).
ON DUPLICATE KEY UPDATE
Такой вид запроса не совсем идеальный пример, но включил, чтобы лишний раз вспомнить, что такое вообще существует. Используется для выполнения вставки данных, либо обновлении при нарушении ограничения целостности первичного ключа (PRIMARY KEY) или уникальности (UNIQUE).
Home Assistant: немного о шаблонах
Тема шаблонов (Templates) в HA всегда вызывает много вопросов, причем порой и у пользователей системы со стажем. Здесь я хочу собрать некоторое кол-во примеров с комментариями, которые помогут лучше понять принцип работы и синтаксис темплейтов.
Для погружения в тему, начать стоит как всегда с изучения официальной документации, а так же руководства на шаблонизатор Jinja2, именно его под капотом использует HA.
Шаблоны можно применять во множестве мест, начиная от объектов (например, создав собственный sensor или switch) и заканчивая скриптами, автоматизациями и интерфейсом lovelace. С их помощью можно получать необходимые данные из объектов (сущностей) — стейты и атрибуты, при необходимости модифицировать их, а так же реализовывать всевозможную логику (переменные, циклы, проверки и т.д.). Это по-настоящему мощный инструмент, открывающий массу возможностей.
Один из главных инструментов для работы с шаблонами находится в разделе «Панель разработчика» — «Шаблоны» (/developer-tools/template), здесь можно в он-лайн режиме проверить корректность составленного шаблона и оценить его результат. Не забывайте про него, это сохранит множество времени и нервов при отладке сложных конструкций, а так же поможет лучше понять как все это работает.
Коротко про синтаксис
Обратите внимание на оформление, в шаблонах могут использоваться строки с разным обрамлением:
По умолчанию, каждая строка шаблона на выходе будет оканчиваться символом новой строки «\n».
Причем даже те строки, которые ничего не выводят (например, объявление переменной — <% set a = 123 %>).
Об этом необходимо помнить и учитывать при составлении темплейта.
К примеру, если шаблон используется для вывода чего-либо на экран, можно потратить уйму времени в борьбе с лишними пустыми строками на выходе.
Для управления этим поведением в jinja2 существует специальный механизм:
Помимо этого, стоит уделить время ресурсу yaml-multiline.info, на котором можно наглядно разобраться с вопросом форматирования и переноса строк в YAML’е (символы |, > и т.д.), это бывает полезно при форматировании многострочных шаблонов.
Отдельно стоит упомянуть о том, какие операторы можно использовать в шаблонах.
Полную информацию об этом стоит искать в документации на jinja, а вкратце это:
Помимо этого, в выражениях можно использовать фильтры jinja и HA, передавая значения в них через символ «|».
Пример: ((states(‘sensor.0x158d0003230618_pressure’) | float) / 1.333) | round(2)
Важные моменты в документации, на которые стоит обратить особое внимание:
Примеры
Сенсоры и их атрибуты
С помощью шаблонов можно создавать как бинарные (on\off), так и обычные сенсоры:
В примерах выше используются простые выражения (Expressions) с использованием встроенных в HA функций is_state() и state_attr(). С полным перечнем функций и правилами их применения лучше всего ознакомится в документации.
Более интересный пример:
Здесь в качестве стейта (state) сенсора date_formatted будет выведен результат выражения
<< as_timestamp(states('sensor.date_time_iso')) | timestamp_custom('%d.%m.%Y') >> и дополнительно, в виде атрибута — день недели, получаемый с помощью ряда операций.
В качестве значения сенсора можно использовать произвольный текст, в этом примере в зависимости от состояния датчика двери (геркона) в стейт будет записан текст «Открыта» или «Закрыта» (речь про дверь):
Более комплексный пример:
Темплейты можно использовать практически во всех возможных местах, например в именах будущих сенсоров:
Или меняя иконку сенсора в зависимости от различных условий:
Switches
В выключателях так же есть возможность использовать шаблоны.
Например, можно создать выключатель телевизора с разными действиями на включение и выключение:
Скрипты и автоматизации
Самое широкое применение шаблоны встречают в скриптах и автоматизациях.
Скрипт для запуска уборки роботом-пылесосом конкретной комнаты (в интерфейсе input_select.room_to_vacuum это выпадающий список с комнатами):
Автоматизация, меняющая мощность работы робота-пылесоса:
Оповещение о произошедшей ошибке.
С помощью шаблона можно получить текст ошибки из атрибута error:
Автоматизация меняющая яркость лампы по двойному клику на кнопку (по кругу):
Плавное включение света в заданное в интерфейсе HA время (будильник):
Постепенное увеличение громкости:
Изменение громкости у выбранного из выпадающего списка источника:
Отправка оповещений о приходе или уходе из дома:
В примере выше сообщение будет выглядеть примерно так — «Александр скорее всего вне дома.»
Шаблон соберется в одну строку, т.к. перед ним указан символ «>», означающий замену символов новой строки на пробелы.
Еще одно оповещение, на этот раз о температуре в комнате (холодно или жарко):
Команда для телеграм-бота, возвращающая имена находящихся дома:
Здесь, в отличии от предыдущего примера, перед шаблоном указан символ «|», означающий сохранение всех переносов строк в шаблоне. Лишняя пустая строка из вывода убрана с помощью конструкции «<%-«.
Еще одна команда для бота, присылающая текущую погоду:
Здесь, в зависимости от стейта сенсора weather.gismeteo (sunny, rainy, snowy и т.д.) отправляется картинка соответствующая текущей погоде (картинки подготовлены заранее).
Я постарался собрать здесь как можно более разнообразные примеры использования шаблонов в HA, но т.к. эта тема невероятно обширная, получилось это у меня слабо… =)
В будущем я надеюсь дополнить заметку другими интересными (с разных точек зрения) примерами.