УСТАНОВКА 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 — сохранить права файла.

https://losst.ru/szhatie-png-v-linux

Распознавание голоса и чтение текста в браузере в 3 строки на JavaScript: демонстрация и примеры кода

Оригинал статьи: https://tproger.ru/articles/speech-recoginition-in-the-browser/

Распознавание речи — одна из символизирующих современный мир возможностей, которой мы привыкли пользоваться благодаря Siri и Google Now.

Но она присутствует не только в мобильных ассистентах: вы замечали иконку микрофона справа от поля поиска Google?

Распознавание голоса в браузере доступно благодаря мощности нового экспериментального JavaScript API — webkitSpeechRecognition. Другое API под названием speechSynthesis позволяет озвучивать человеческим голосом любой текст. Читать далее «Распознавание голоса и чтение текста в браузере в 3 строки на JavaScript: демонстрация и примеры кода»

Генерация БД для 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 — переопределение данных
Сортировка колонок
Первичную сортировку колонок можно производить, если в наименовании колонки указывать будет указан префикс [e000]
Например:
[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 кбит

 

 

 

 

После удачной передачи данных,

переданный пакет обрабатывается

на сервере, клиент ожидает

результат

 

 

 

Не зависимо от результата

выполнения информация

передается на устройство

 

 

 

 

 

Если в результат обработки

данных обнаруживается,

ошибка, то локальные данные

которые были переданы на

сервер помечаются как

«требующие повторной

передачи»