пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ
Слишком длинный поисковый запрос.
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
Сегодня бы хотелось рассказать об IVR (Interactive Voice Response).
IVR – автоматическая система обслуживания клиентского обращения. С его помощью, повышается качество и скорость обслуживания клиентов, следовательно, растет лояльность по отношению к компании. IVR позволяет сегментировать клиентские обращения, тем самым, оптимизирует работу операторов и уменьшает время решения клиентского запроса.
Безусловно, IVR – системы бывают разные. В крупном бизнесе, дорогие IVR - системы имеют возможность в реальном времени синтезировать речь (ASR), проговаривать текст (TTS), имеют интерфейсы к базам данных (DB), через которые «парсят» запрашиваемую информацию. Такие решения предлагают крупные игроки рынка контактных центров, такие как Cisco Systems, Genesys и Avaya. IVR – системы в таких случаях состоят из сложных скриптов, созданных в специальных графических редакторах.
В малом и среднем бизнесе, зачастую, потребности в сложных системах нет. В большинстве случаев, голосовое приветствие с предложением нажать одну из кнопок на телефоне, чтобы соединиться с отделом, или ввести номер для соединения с конкретным сотрудником – является самым оптимальном в соотношение стоимости к результативности.
Давайте рассмотрим технологию VXML (Voice eXtensible Markup Language). Язык программирования XML является гибким инструментом для решения ряда задач. Благодаря не сложному синтаксису, нашел повсеместное применение. VXML – это адаптация XML для голосовых приложений.
Давайте взглянем на схему ниже.
Этот пример реализован на базе технологий Cisco. На базе шлюза, функционирует телефонная платформа CME (Call Manager Express). Предположим, к нам приходит звонок из ТфОП c номера +7-495-2234567 (Телефонная сеть общего пользования), я входящий Dial-Peer видит совпадение.
gateway#configure terminal
gateway(config)#dial-peer voice 100 pots
gateway(config-dial-peer)#description VXML-IVR-TEST
gateway(config-dial-peer)#incoming called-number 74952234567
gateway(config-dial-peer)#service VXML-IVR
Как только dial-peer совпал, шлюз обращается к flash памяти и запускает выполнение скрипта с названием VXML-IVR. При нажатии кнопок телефона события обрабатываются по DTMF.
Ниже показан простейший пример:
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.1" xmlns="http://www.w3.org/2001/vxml" xml:lang="ru-RU">
<form id=" Greeting">
<block>
<prompt>
Здравствуйте! Вы позвонили в компанию…
</prompt>
</block>
</form>
</vxml>
Логика обработки входящего звонка диктуется только заказчиком. Стоимость такого решения гораздо ниже, чем серьезные голосовые платформы специально разработанные вендорами.
IVR позволяет массово информировать клиентов о каких-либо изменениях, сокращает время обслуживания, повышает лояльность клиента.
Мы с радостью поможем создать для Вашего бизнеса голосовое меню, составить техническое задание, написать VXML скрипты.
Я всегда мечтал создавать видео, связанные с моим хобби – программированием. Но я понимал, что я не являюсь носителем языка, что меня пугало, и я не решался пробовать.
Но пару недель назад, когда я готовил несколько полезных советов по JavaScript для начала своего путешествия в мир YouTube, я написал вот этот список советов, которые могут сэкономить ваше время. Я надеюсь, что они помогут вам также, как и мне когда-то.
В этой статье я хочу поделиться с вами пятью полезными советами по JavaScript (готовы окунуться?)
Деструктуризация объектов
Деструктуризация – это функция, которая появилась в ES6. Это одна из тех функций, которой вы будете пользоваться постоянно, стоит вам только узнать, как она работает.
Она поможет вам справиться с тремя главными вопросами:
Повтор
. Каждый раз, когда вы извлекаете свойство какого-либо объекта и создаете новую переменную, вы записываете все это в новую строку.
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
};
// Wow... should we display
// John's password like that?
{ // Ну и ну… неужели мы должны выводить
// пароль Джона вот таким образом? }
const firstName = user.firstName;
const lastName = user.lastName;
const password = user.password;
Доступность
. Каждый раз, когда вы пытаетесь получить доступ к свойству какого-либо объекта, вы должны указать путь до него (например,
user.firstName, user.firstName
и т.д.).
Использование
. Скажем, вы создали новую функцию и при этом работаете лишь с одним свойством объекта.
Итак, теперь вы знаете, что это за проблемы, связанные с объектами. Так, как же их можно решить?
Как решить вопрос с повтором?
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
};
const { firstName, lastName, password } = user;
console.log(firstName, lastName, password);
// Output: 'John', 'Doe', '123' { // Вывод: 'John', 'Doe', '123' }
Деструктуризация – это процесс извлечения свойства объекта по его ключу. Если вы возьмете существующий ключ, который есть у объекта, и поместите его в скобки
(
{ firstName }
)
, то, таким образом, сообщите JavaScript следующее:
«Эй, JavaScript, я хочу создать переменную с таким же именем, как у моего свойства. Я хочу создать переменную под названием
firstName
для свойства под названием
firstName
, которое есть у моего объекта.»
Примечание
: если вы хотите произвести деструктуризацию объекта, то вам в любом случае нужен существующий ключ. При ином раскладе такой подход работать не будет.
Как решить вопрос с доступностью?
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
family: {
sister: {
firstName: "Maria",
},
},
};
// We access to the nested object `sister`
// and we extract the `firstName` property
{ // Мы получаем доступ к вложенному объекту sister
// и извлекаем свойство firstName }
const { firstName } = user.family.sister;
console.log(firstName);
// Output: 'Maria'
Если вы работаете с вложенными объектами и постоянно пытаетесь получить доступ к одному и тому же свойству, это может вам наскучить и, кроме того, занять слишком много времени.
Однако у вас есть возможность сократить путь к свойству до одной переменной. Для этого вам нужно воспользоваться деструктурированием, и все это можно сделать в одну строку.
Как решить вопрос с использованием?
Вы уже знаете, как деструктурировать объект, а теперь я хочу вам показать, как можно извлекать свойства прямо в определении параметра функции.
Если вы знакомы с React, то, скорее всего, вы уже знаете, как это делать.
function getUserFirstName({ firstName }) {
return firstName;
}
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
};
console.log(getUserFirstName(user));
// Output: 'John'
В примере выше у нас есть функция
getUserFirstName
, и при этом мы знаем, что она будет использовать лишь одно свойство нашего объекта -
firstName
.
И в данном случае вместо того, чтобы передавать весь объект или создавать новую переменную, мы можем просто деструктурировать параметры функции объекта.
Как можно объединять объекты в ES6?
В программировании довольно часто возникают проблемы, связанные со структурами данных, и их нужно как-то решать. Благо, в ES6 появился spread-оператор и упростил манипуляции с объектами и массивами.
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
};
const userJob = {
jobName: "Developer",
jobCountry: "France",
jobTimePerWeekInHour: "35",
};
Давайте представим, что у нас есть два объекта:
User
. Это объект, который определяет общую информацию о пользователе.
UserJob
. Это объект, который определяет информацию о работе пользователя.
Наша задача – создать один объект, который бы содержал свойства только этих двух объектов.
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
};
const userJob = {
jobName: "Developer",
jobCountry: "France",
jobTimePerWeekInHour: "35",
};
const myNewUserObject = {
...user,
...userJob,
};
console.log(myNewUserObject);
// Output:
//{
// firstName: 'John',
// lastName: 'Doe',
// password: '123',
// jobName: 'Developer',
// jobCountry: 'France',
// jobTimePerWeekInHour: '35'
//}
С помощью spread-оператора (…) мы можем извлечь все свойства из одного объекта и поместить их в другой.
const user = {
firstName: "John",
lastName: "Doe",
password: "123",
};
const userJob = {
jobName: "Developer",
jobCountry: "France",
jobTimePerWeekInHour: "35",
};
const myNewUserObject = {
...user,
...userJob,
};
console.log(myNewUserObject);
// Output:
//{
// firstName: 'John',
// lastName: 'Doe',
// password: '123',
// jobName: 'Developer',
// jobCountry: 'France',
// jobTimePerWeekInHour: '35'
//}
Как объединять массивы?
const girlNames = ["Jessica", "Emma", "Amandine"];
const boyNames = ["John", "Terry", "Alexandre"];
const namesWithSpreadSyntax = [...girlNames, ...boyNames];
console.log(namesWithSpreadSyntax);
// Output: ['Jessica', 'Emma', 'Amandine', 'John', 'Terry', 'Alexandre']
Как и в случае с объектами, spread-оператор (…) извлекает все элементы из одного массива и помещает их в другой.
const girlNames = ["Jessica", "Emma", "Amandine"];
const newNewArray = [
...girlNames,
// We extract: { // Мы извлекаем следующие элементы: }
// - 'Jessica'
// - 'Emma'
// - 'Amandine'
// and send them to { // и отправляем их }
// a new array `[]` { // в новый массив }
];
Как удалять дубликаты в массиве?
Массивы – это те же списки, а значит, в них может присутствовать большое количество одинаковых элементов. Если вы хотите избавиться от дубликатов в своем массиве, то можете воспользоваться одним из способов, которые мы привели ниже.
Один из способов позволяет сделать это в одну строку (благодаря ES6), но мы привели и «старый» способ для сравнения.
Как удалять дубликаты: старый способ
const animals = ["owl", "frog", "canary", "duck", "duck", "goose", "owl"];
const uniqueAnimalsWithFilter = animals.filter(
// Parameters example: 'owl', 0, ['owl', 'frog', 'canary', 'duck', 'duck', 'goose', 'owl']
{ // Пример параметров: 'owl', 0, ['owl', 'frog', 'canary', 'duck', 'duck', 'goose', 'owl'] }
(animal, index, array) => array.indexOf(animal) == index
);
console.log(uniqueAnimalsWithSet);
// Output: ['owl', 'frog', 'canary', 'duck', 'goose']
Давайте посмотрим на пример выше. Здесь мы хотим очистить массив под названием
animals
от всех дубликатов.
Мы можем сделать это с помощью функции
filter
и метода
indexOf
внутри нее.
Функция
filter
берет все элементы из массива
animals
(
animals.filter
). После чего для каждого вхождения предоставляются следующие данные:
Текущее значение (
пример
:
duck
)
Индекс (
пример
:
0
)
Первоначальный массив (
пример
: массив
animals
=>
['owl', 'frog', 'canary', 'duck', 'duck', 'goose', 'owl']
)
Мы применяем метод
indexOf
к каждому вхождению исходного массива и передаем переменную
animal
(текущее значение) в качестве параметра.
indexOf
вернет первый индекс текущего значения (пример: для значения «owl» индекс будет 0).
Затем внутри функции
filter
мы сравниваем значение
indexOf
с текущим индексом. Если они совпадают, то мы возвращаем
true
, в противном случае -
false
.
Функция
filter
создаст новый массив, в котором будут только те элементы, для которых было возвращено значение
true
.
То есть в нашем случае:
['owl', 'frog', 'canary', 'duck', 'goose']
.
Как удалять дубликаты: новый способ
Ну скажем так, «старый» способ довольно интересный, но при этом долгий и немного сложный. Так что, давайте посмотрим на «новый» способ:
const animals = ["owl", "frog", "canary", "duck", "duck", "goose", "owl"];
const uniqueAnimalsWithSet = [...new Set(animals)];
console.log(uniqueAnimalsWithSet);
// Output: ['owl', 'frog', 'canary', 'duck', 'goose']
Давайте посмотрим на каждый шаг в отдельности:
// 1
const animals = ["owl", "frog", "canary", "duck", "duck", "goose", "owl"];
// 2
const animalsSet = new Set(animals);
console.log(animalsSet);
// Output: Set { 'owl', 'frog', 'canary', 'duck', 'goose' }
// 3
const uniqueAnimalsWithSet = [...animalsSet];
console.log(uniqueAnimalsWithSet);
// Output: ['owl', 'frog', 'canary', 'duck', 'goose']
У нас есть массив под названием
animals
, и мы преобразуем его в тип
Set
– специальный тип объектов в ES6.
Что его отличает от остальных, так это то, что он позволяет создавать набор уникальных значений.
Примечание
:
Set
– это набор уникальных значений, но это не массив.
Раз уж мы имеем объект типа
Set
с уникальными значениями, мы должны преобразовать его обратно в массив.
Для этого мы должны воспользоваться spread-операторами, которые позволят нам деструктурировать объект и отправить все свойства в новый массив.
За счет того, что объект типа
Set
имеет только уникальные свойства, наш новый массив также будет иметь только уникальные значения.
Как использовать тернарный оператор?
Вы слышали когда-нибудь о таком способе, который позволяет писать небольшие условия в одну сроку?
Если нет, то настало время избавиться от блоков if-else и начать использовать вместо них небольшие тернарные операторы.
Давайте для начала взглянем на пример с
console.log
. Идея здесь вот в чем: мы должны проверить значение переменной и при определенных условиях отобразить на экране вывод.
const colour = "blue";
if (colour === "blue") {
console.log(`It's blue!`);
} else {
console.log(`It's not blue!`);
}
Данный пример – это типичный случай использование тернарного оператора, который позволяет заменить 5 строк всего одной!
Всего одна строка!
const colour = "blue";
colour === "blue" ? console.log(`It's blue!`) : console.log(`It's not blue!`);
// [condition] ? [if] : [else] { // [условие] ? [if] : [else] }
Тернарный оператор может заменить
if
и
else
в случае небольших условий.
Примечание
: в ситуациях со сложными условиями, тернарный оператор лучше не использовать, поскольку он может снизить читаемость.
Ниже есть еще один пример, в котором используется тернарный оператор. Здесь он применяется в операторе
return
внутри функции.
function sayHelloToAnne(name) {
return name === "Anne" ? "Hello, Anne!" : "It's not Anne!";
}
console.log(sayHelloToAnne("Anne"));
// Output: 'Hello, Anne!'
console.log(sayHelloToAnne("Gael"));
// Output: "It's not Anne!"
Заключение
Надеюсь, что эта статья стала для вас полезной и вы смогли узнать что-то новое о JavaScript.
Перед использованием раздел диска необходимо отформатировать и смонтировать. Процесс форматирования также может быть выполнен по ряду других причин, таких как изменение файловой системы, исправление ошибок или удаление всех данных.
В этом руководстве вы узнаете, как форматировать и монтировать разделы диска в Linux с использованием файловой системы ext4, FAT32 или NTFS.
Проверка разделов
Перед форматированием найдите раздел, который хотите отформатировать. Для этого запустите команду lsblk, которая отображает блочные устройства. Блочные устройства - это файлы, которые представляют такие устройства, как жесткие диски, RAM-диски, USB-накопители и CD/ROM.
lsblk
Терминал покажет список всех блочных устройств, а также информацию о них:
NAME - имена устройств
MAJ:MIN - старший или младший номер устройства
RM - является ли устройство съемным (1, если да, 0, если нет)
SIZE - размер устройства
RO - доступно ли устройство только для чтения
TYPE - тип устройства
MOUNTPOINT - точка монтирования устройства
В качестве примера мы будем использовать раздел /dev/sdb1.
Команда lsblk без дополнительных параметров не отображает информацию о файловых системах устройств.
Чтобы отобразить список, содержащий информацию о файловой системе, добавьте параметр -f:
lsblk -f
Терминал покажет список всех блочных устройств. Разделы, не содержащие информации об используемой файловой системе, являются неформатированными разделами.
Форматирование раздела диска в Linux
В зависимости от типа файловой системы существует три способа форматирования разделов диска с помощью команды mkfs:
ext4
FAT32
NTFS
Общий синтаксис форматирования разделов диска в Linux:
mkfs [options] [-t type fs-options] device [size]
Форматирование раздела диска с файловой системой ext4
1. Отформатируйте раздел диска с файловой системой ext4, используя следующую команду:
sudo mkfs -t ext4 /dev/sdb1
2. Затем проверьте изменение файловой системы с помощью команды:
lsblk -f
Терминал покажет список блочных устройств.
3. Найдите нужный раздел и убедитесь, что он использует файловую систему ext4.
Форматирование раздела диска с файловой системой FAT32
1. Чтобы отформатировать диск в файловой системе FAT32, используйте:
sudo mkfs -t vfat /dev/sdb1
2. Снова запустите команду lsblk, чтобы проверить изменение файловой системы и найти нужный раздел в списке.
lsblk -f
Ожидаемый результат:
Форматирование раздела диска с файловой системой NTFS
1. Запустите команду mkfs и укажите файловую систему NTFS для форматирования диска:
sudo mkfs -t ntfs /dev/sdb1
Терминал покажет подтверждающее сообщение, когда процесс форматирования завершится.
2. Затем проверьте изменение файловой системы, используя:
lsblk -f
3. Найдите нужный раздел и убедитесь, что он использует файловую систему NFTS.
Монтирование раздела диска в Linux
Перед использованием диска создайте точку монтирования и смонтируйте к ней раздел. Точка монтирования - это каталог, используемый для доступа к данным, хранящимся на дисках.
1. Создайте точку монтирования, введя:
sudo mkdir -p [mountpoint]
2. После этого смонтируйте раздел с помощью следующей команды:
sudo mount -t auto /dev/sdb1 [mountpoint]
Примечание. Замените [mountpoint] предпочтительной точкой монтирования (пример: /usr/media).
Если процесс завершился успешно, вывода нет.
3. Убедитесь, что раздел смонтирован, используя следующую команду:
lsblk -f
Ожидаемый результат:
Понимание файловой системы Linux
Выбор правильной файловой системы перед форматированием диска для хранения имеет решающее значение. Каждый тип файловой системы имеет разные ограничения размера файла или разную совместимость с операционной системой.
Наиболее часто используемые файловые системы: FAT32, NTFS и ext4
Их основные особенности и отличия:
Файловая система
Поддерживаемый размер файла
Совместимость
Идеальное использование
FAT32
до 4 ГБ
Windows, Mac, Linux
Для максимальной совместимости
NTFS
16 EiB - 1 КB
Windows, Mac (только для чтения), большинство дистрибутивов Linux
Для внутренних дисков и системного файла Windows
Ext4
16 GiB - 16 TiB
Windows, Mac, Linux (для доступа требуются дополнительные драйверы)
Для файлов размером более 4 ГБ
