sudo fsck -t -y -f -c /dev/sda1
УСТАНОВКА JPEGOPTIM
sudo apt install jpegoptim
ГлавнаяМультимедиаОптимизация изображений Linux
ОПТИМИЗАЦИЯ ИЗОБРАЖЕНИЙ LINUXМультимедиа Август 24, 2015 7 admin
ubuntu
Если у вас есть очень много изображений на домашнем компьютере или сервере, и они занимают слишком много места, то их размер однозначно можно уменьшить даже без потери качества. Также это может быть очень полезным при загрузке изображений в облачное хранилище.
В этой статье мы рассмотрим как выполняется оптимизация изображений Linux. Существует очень много графических инструментов для решения этой задачи, но на самом деле все намного проще. Мы рассмотрим как сжать изображения с помощью двух простых, но очень эффективных консольных утилит командной строки. Вот они:
jpegoptim — утилита для оптимизации и сжатия изображений без потери качества в формате JPEG;
pptipng — это небольшая программа, которая позволяет уменьшить размер PNG изображений без потери качества.
JPEG и PNG — это наиболее распространенные форматы изображений в сети интернет, поэтому вы сможете оптимизировать почти все изображения.
Содержание статьи:
Оптимизация JPEG изображений
Установка Jpegoptim
Как использовать jpegoptim
Оптимизация изображений PNG в Linux
Установка optipng
Сжатие изображений с помощью optipng
Выводы
ОПТИМИЗАЦИЯ JPEG ИЗОБРАЖЕНИЙ
Утилита jpegoptim — это инструмент командной строки, который может использоваться для сжатия изображений в формате JPEG, JPG и JFIF без потери качества. Утилита оптимизирует изображения на основе таблиц Хаффмана. Как вы знаете, в алгоритме JPEG и так используется сжатие, но это сжатие достигается с помощью потери качества, а здесь мы можем оптимизировать размер не меняя картинку.
УСТАНОВКА JPEGOPTIM
Для установки утилиты в Ubuntu, Debian и основанных на нем дистрибутивах выполните:
sudo apt install jpegoptim
В Fedora, Red Hat, CentOS и других, основанных на них дистрибутивах дела обстоят немного сложнее, вам придется сначала добавить репозиторий epel-release. Вы можете сделать это с помощью такой команды:
sudo yum install epel-release
Или:
sudo dnf install epel-release
Затем вы можете установить jpegoptim из только что подключенного репозитория:
sudo yum install jpegoptim
Или:
sudo dnf install jpegoptim
КАК ИСПОЛЬЗОВАТЬ JPEGOPTIM
Давайте рассмотрим как пользоваться jpegoptim. Использовать утилиту для сжатия изображений linux очень просто. Для этого достаточно выполнить программу и передать ей имя файла. Вот такой синтаксис:
$ jpegoptim опции имя_файла.jpeg
Рассмотрим опции утилиты:
-d — указать папку, в которую нужно сохранять готовые изображения;
-f — принудительная оптимизация;
-m — показатель качества, отменяет сжатие без потерь и устанавливает уровень качества от 0 до 100, чем больше, тем лучше;
-n — не выполнять реальную оптимизацию, а только показать результат;
-S — задать размер готового изображения, можно указать в процентах или килобайтах;
-o — заменить исходный файл;
-p — сохранить временные метки;
-P — сохранить права файла.
Распознавание голоса и чтение текста в браузере в 3 строки на JavaScript: демонстрация и примеры кода
Оригинал статьи: https://tproger.ru/articles/speech-recoginition-in-the-browser/
Распознавание речи — одна из символизирующих современный мир возможностей, которой мы привыкли пользоваться благодаря Siri и Google Now.
Но она присутствует не только в мобильных ассистентах: вы замечали иконку микрофона справа от поля поиска Google?
Распознавание голоса в браузере доступно благодаря мощности нового экспериментального JavaScript API — webkitSpeechRecognition
. Другое API под названием speechSynthesis
позволяет озвучивать человеческим голосом любой текст. Читать далее «Распознавание голоса и чтение текста в браузере в 3 строки на JavaScript: демонстрация и примеры кода»
Установка MacOS 10.12 Sierra на VirtualBox
Генерация БД для MySql при помощи утилиты mysql-db-generator
Для быстрой генерации БД MySql применяется утилита:
git clone git://git.appcode.pw/mysql-db-generator.git
После выполнения указанной выше команду, выполнить следующую
node index dbname=[dbname] username=[username]
, где
- db:string — имя создаваемой БД
- username:string — имя пользователя для безопасности
В результате выполнения будет сформирован файл query.sql
Структура приложения
- templates — каталог для хранения шаблонов для создания запросов
- functions — функции
- tables — таблицы
- views — представления
- index — главный файл для формирования запроса
Утилита генерации схемы БД для MySql db-schema-mysql
git clone git://git.appcode.pw/db-schema-mysql.git
Модуль генерирует файлы *.schema с наименованием сущностей.
var main = require('db-schema-mysql'); main(connectionString, outputPath, override);
,где:
- connectionString: string — строка подключения к БД
- outputPath: string — выходной каталог для хранения *.schema
- override: boolean — необязательный параметр. Предназначен для указания принудительной перезаписи исходных файлов. Применяется в процессе настройки и тестирования
Структура файла *.schema
*.schema — файл типа json с комментариями. Хранит структуру таблицы, view, процедуры
//#overwrite { "TABLE_NAME": "application_projects", "TABLE_TYPE": "BASE TABLE", "TABLE_TITLE": "Тип приложения", "PRIMARY_KEY": "id", "TABLE_COMMENT": '', "FIELDS":[{ "COLUMN_NAME": "description", "COLUMN_DEFAULT_VALUE": , "IS_NULLABLE": "NO", "DATA_TYPE": "text", "CHARACTER_MAXIMUM_LENGTH": 65535, "NUMERIC_PRECISION": , "NUMERIC_SCALE": , "COLUMN_KEY": "", "EXTRA": "", "COLUMN_COMMENT": "Описание", "REFERENCED_COLUMN_NAME": , "REFERENCED_TABLE_NAME": }, { "COLUMN_NAME": "id", "COLUMN_DEFAULT_VALUE": , "IS_NULLABLE": "NO", "DATA_TYPE": "int", "CHARACTER_MAXIMUM_LENGTH": , "NUMERIC_PRECISION": 10, "NUMERIC_SCALE": 0, "COLUMN_KEY": "PRI", "EXTRA": "auto_increment", "COLUMN_COMMENT": "Идентификатор", "REFERENCED_COLUMN_NAME": , "REFERENCED_TABLE_NAME": }, { "COLUMN_NAME": "name", "COLUMN_DEFAULT_VALUE": , "IS_NULLABLE": "NO", "DATA_TYPE": "varchar", "CHARACTER_MAXIMUM_LENGTH": 255, "NUMERIC_PRECISION": , "NUMERIC_SCALE": , "COLUMN_KEY": "", "EXTRA": "", "COLUMN_COMMENT": "Наименование", "REFERENCED_COLUMN_NAME": , "REFERENCED_TABLE_NAME": }, { "COLUMN_NAME": "outputFileName", "COLUMN_DEFAULT_VALUE": , "IS_NULLABLE": "NO", "DATA_TYPE": "varchar", "CHARACTER_MAXIMUM_LENGTH": 255, "NUMERIC_PRECISION": , "NUMERIC_SCALE": , "COLUMN_KEY": "", "EXTRA": "", "COLUMN_COMMENT": "Имя выходного файла", "REFERENCED_COLUMN_NAME": , "REFERENCED_TABLE_NAME": }] }
, где:
- TABLE_NAME: string — наименование сущности
- TABLE_TYPE: string — тип сущности. Например BASE TABLE, VIEW, PROCEDURE
- TABLE_TITLE: string — заголовок таблицы
- TABLE_COMMENT: string — описание таблицы
- PRIMARY_KEY: string — первичный ключ. Может быть пустым для VIEW и PROCEDURE
- FIELDS: any[] — набор полей
- COLUMN_NAME: string — наименование колонки
- COLUMN_DEFAULT_VALUE: any — значение по умолчанию
- IS_NULLABLE: string — YES — может быть null’ом, NO — не может быть null’ом
- DATA_TYPE: string — тип колонки. Например text, int и т. д.
- CHARACTER_MAXIMUM_LENGTH: number — длина строки. Указывается только для строковых типов
- NUMERIC_PRECISION: number — длина числового поля
- NUMERIC_SCALE: number — количество знаков после запятой для числового поля
- COLUMN_KEY: string — тип колонки
- PRI — является первичным ключом
- MUL — является FK
- EXTRA: string тип генерации для первичного ключа. Например auto_increment
- COLUMN_COMMENT: string — описание колонки
- REFERENCED_COLUMN_NAME: string — связь с колонкой другой таблицы. Указывается наименование колонки
- REFERENCED_TABLE_NAME: string — наименование таблицы с которой происходит связь
Выполнение через командную строку
node index connection=[connectionString] output=[output] override=[true|false]
, где
-
- connection: string — строка подключения к БД
- output: string — выходной каталог
- override: boolean — переопределение данных
[e100] Раздел1
Тогда schema будет выглядеть следующим образом:
{ "TABLE_NAME": "application_projects", "TABLE_TYPE": "BASE TABLE", "TABLE_TITLE": "Тип приложения", "PRIMARY_KEY": "id", "TABLE_COMMENT": '', "FIELDS":[{ "COLUMN_NAME": "description", "COLUMN_DEFAULT_VALUE": , "IS_NULLABLE": "NO", "DATA_TYPE": "text", "CHARACTER_MAXIMUM_LENGTH": 65535, "NUMERIC_PRECISION": , "NUMERIC_SCALE": , "COLUMN_KEY": "", "EXTRA": "", "COLUMN_COMMENT": "Описание", "REFERENCED_COLUMN_NAME": , "REFERENCED_TABLE_NAME": , "ORDER": 100 // тут сортировка }, { "COLUMN_NAME": "id", "COLUMN_DEFAULT_VALUE": , "IS_NULLABLE": "NO", "DATA_TYPE": "int", "CHARACTER_MAXIMUM_LENGTH": , "NUMERIC_PRECISION": 10, "NUMERIC_SCALE": 0, "COLUMN_KEY": "PRI", "EXTRA": "auto_increment", "COLUMN_COMMENT": "Идентификатор", "REFERENCED_COLUMN_NAME": , "REFERENCED_TABLE_NAME": , "ORDER": 50 // тут сортировка } ...
Установка колонки по умолчанию
Для указания колонки по умолчанию применять:
[e100|d] Раздел1
В этом случаи для таблицы будет указан следующий параметр
{ "TABLE_NAME": "application_projects", "TABLE_TYPE": "BASE TABLE", "TABLE_TITLE": "Тип приложения", "PRIMARY_KEY": "id", "TABLE_COMMENT": '', "DEFAULT_PROPERTY": "name" ...
, а для колонок будет указана следующая информация
... "REFERENCED_COLUMN_NAME": "id", "REFERENCED_TABLE_NAME": "sys_users", "ORDER": 90, "REFERENCED_DEFAULT_PROPERTY": "name" ...
Правила переопределения шаблонов — утилита file-merge
git clone git://git.appcode.pw/file-merge.git
Специальные комментарии
- //#UPDATE — помечается начало обновления
- //#UPDATEEND — помечается завершение обновления
- //#ADD — помечается начало добавления
- //#ADDEND — помечается завершение добавления
Пример обновления данных
Оригинал:
Ext.define('PN.model.accesses', { extend: 'Ext.data.Model', idProperty: 'id' ...
В оригинальном файле нам требуется убрать свойство idProperty. Наличие пустой строки обязательно, т. к. таким образом сообщается, сколько строк нужно обновить.
Ext.define('PN.model.accesses', { extend: 'Ext.data.Model', //#UPDATE //#UPDATEEND ...
В оригинальном файле нам требуется обновить свойство idProperty
Ext.define('PN.model.accesses', { extend: 'Ext.data.Model', //#UPDATE idProperty: 'LINK' //#UPDATEEND ...
Пример добавления данных
Оригинал:
Ext.define('PN.model.accesses', { extend: 'Ext.data.Model', idProperty: 'id' ...
Требуется добавить еще одно свойство.
Ext.define('PN.model.accesses', { extend: 'Ext.data.Model', idProperty: 'id' //#ADD displayProperty: 'table_name', //#ADDEND ...
Или добавить новую функцию
validators: { user_id: 'presence', roles_id: 'presence', table_name: { type: 'length', max: 255 } } //#ADD , fio: function () { // '''тут запятая должна находиться именно здесь''' } //#ADDEND });
Принудительная генерация и запрет
Для принудительной перегенерации файла требуется указать в начале файла
//#overwrite Ext.define('PN.model.accesses', { extend: 'Ext.data.Model', idProperty: 'id' ...
Для отмены перезатирания данных указывать в начале файла
//#not overwrite Ext.define('PN.model.accesses', { extend: 'Ext.data.Model', idProperty: 'id' ...
Приложение для просмотра ошибок в Мобильном обходчике
По адресу http://vnext:3000 доступен сервис по просмотру ошибок в мобильных сервиса.
Логин: user
Пароль: user0
Приложение состоит из:
- Логирование
- Аудит — действия пользователя на устройстве
- Ошибки клиента — ошибки возникшие на клиентском устройстве
- Серверные ошибки — ошибки при синхронизации данных
Читать далее «Приложение для просмотра ошибок в Мобильном обходчике»
Модуль отправки сообщений через nodejs-email
Получение модуля:
git clone git://git.appcode.pw/nodejs-email.git или npm install git://git.appcode.pw/nodejs-email.git
Применение
Добавляем модуль:
var nodejsEmail = require('nodejs-email')(settingOrPath);
,где settingOrPath:any — путь к файлу с настройками, либо передается объект (см. ниже) с уже прочитанными данными
Затем в нужном месте вызываем метод:
nodejsEmail.send(subject:string, messages:any[]);
, где:
-
- subject: string — тема письма
- messages: any[] — список сообщений
Формат сообщений
[{ "body": "текст письма", "level": "error" // уровень }]
Настройки
Настройки модуля хранятся в файле в следующем формате:
{ "host": "you.smtp.ru", /// host: адрес smtp сервера; "port": 25, /// port: порт smtp сервера; "secure": false, /// secure: используется шифрование или нет; "user": "sender@smtp.ru", /// user: логин; "pass": "password", /// pass: пароль; "from": "\"Имя\" <sender@smtp.ru>", /// from: от кого; "to": "user@other.ru", /// to: через запятую указывается список адресов для отправки; "level": ["warn", "log", { "status": "error", "to": "spec@other.ru" }] /// level: warn, error, log, *; }
где, level — это уровни отправки сообщений. Доступны следующие уровни:
- log — уровень логирования, не является ошибкой
- warn — предупреждение
- error — ошибка
- * — все выше указанные
Например для отправки только сообщений с ошибками указывать:
level: ['error']
Для отправки только предупреждений и ошибок:
level: ['error', 'warn']
Для отправки сообщений определенного типа, определенным пользователям:
"level": ["warn", "log", { "status": "error", "to": "a-krasnov@it-serv.ru" }]
Синхронизация
Синхронизация
Синхронизация бывает нескольких типов:
- Полная или ручная (Full) – передаются на сервер все не переданные данные, очищается хранилище и загружаются все данные с сервера
- Обновление с учетом даты последней синхронизации (Medium) – передаются на сервер все не переданные данные и загружаются новые данные
- Сохранение выполненного задания (Lite) – передаются на сервер все не переданные данные
- Передача геоданных (Geo) – передаются на сервер геоданные на сервер. Может выполнятся параллельно
- Сохранение информации о пользователе (User) – передается на сервер информация о пользователе и загружается новая. Может выполнятся параллельно
Тип
синхронизации |
Выполняется при старте | Передача данных | Загрузка данных | Загрузка с учетом даты пред. синхронизации | Параллельное выполнение | Очистка данных после загрузки | Возможность отменить |
Full | + | + | + | — | + | + | + |
Meduim | + | + | — | + | — | — | — |
Lite | — | + | — | — | — | — | — |
Geo | — | + | — | — | + | — | — |
User | — | + | + | — | + | — | — |
Особенности:
- При первом запуске всегда выполняется Full – синхронизация
- При каждом запуске, но не первом, выполняется Medium-синхронизация
- После каждого выполнения задания запускается Lite-синхронизация
- Каждую N-секунд (по умолчанию 60 сек) выполняется Geo-синхронизация
- После создания аватарки выполняется User-синхронизация
- Одновременное выполнение Full, Medium, Lite невозможно
- Full – синхронизация может запускаться вручную независимо от других типов
Процесс
Синхронизация выполняется только при наличии интернет соединения.
Выполняется выборка из
локального хранилища
тех записей, которые,
нуждаются в добавлении,
обновлении, удалении
Количество передаваемых байт
зависит от типа соединения:
- wifi,4g,3g – 1 Мбит
- 2g — 9,6 кбит
После удачной передачи данных,
переданный пакет обрабатывается
на сервере, клиент ожидает
результат
Не зависимо от результата
выполнения информация
передается на устройство
Если в результат обработки
данных обнаруживается,
ошибка, то локальные данные
которые были переданы на
сервер помечаются как
«требующие повторной
передачи»