— это тег абзаца. делает текст жирным. Существует множество языков разметки, таких как XML, HTML, и тема этой статьи — Markdown. Разработчики обычно используют Markdown для документации, и он часто включается в большинство репозиториев. Например, я использовал Markdown для написания этой статьи на freeCodeCamp. Давайте посмотрим, что можно сделать с Markdown. Важно: нет единого органа или спецификации, которая стандартизировала бы Markdown — есть лишь некоторые широко принятые лучшие практики. Поэтому ваш опыт может отличаться в зависимости от того, какой парсер Markdown вы используете для этой шпаргалки. Шпаргалка по Markdown Вот некоторые из наиболее часто используемых способов работы с текстом в Markdown. Как создавать заголовки в Markdown Существует шесть заголовков в Markdown — от H1 до H6. Я покажу, как они отображаются визуально, а также как их создавать с помощью Markdown. Заголовки H1 самые большие и обычно являются "основными", а каждый последующий заголовок меньше по размеру. H1 tag # H1 tag H2 tag ## H2 tag H3 tag ### H3 tag H4 tag #### H4 tag H5 Tag ##### H5 tag H6 tag ###### H6 tag Как добавить типографическое выделение в Markdown Наиболее распространенные способы выделения текста — это жирный, курсив и зачеркнутый текст. Слишком много выделений может затруднить восприятие текста, поэтому внимательно выбирайте, как выделять различные части текста. Также существуют обозначения для подстрочного и надстрочного текста, которые вы можете использовать для записи химических формул или математических выражений. Как сделать текст жирным: Добавьте двойные звездочки вокруг текста. Это сделает его жирным, как так: **Жирный текст**. Как сделать текст курсивом: Добавьте одиночные звездочки вокруг текста, чтобы он стал курсивом, как так: *Курсив*. Как зачеркнуть текст: Если вы хотите "перечеркнуть" текст, используйте метод зачеркивания, так: ~~Зачеркнутый текст~~. Как писать подстрочный текст в Markdown Если вы хотите записать химический символ воды, например, вы можете сделать подстрочный "2", набрав так: H~2~O. Это даст: H?O. Как писать надстрочный текст в Markdown Допустим, вам нужно записать степень — или надстрочный текст. Вы можете сделать это так: X^2^, что даст: X?. Как создавать списки в Markdown В Markdown можно создавать несколько типов списков. Например, существуют нумерованные и ненумерованные списки. Нумерованные списки обычно используются, когда нужно следовать шагам в определённой последовательности (например, в рецепте: приготовить курицу... подать блюдо). А ненумерованные списки подходят для вещей, которые не требуют последовательных шагов (например, список покупок). Как создать ненумерованный список в Markdown Вот как выглядит ненумерованный список: Чилийское масло Рис Зеленый лук А вот как создать его в Markdown: - Чилийское масло - Рис - Зеленый лук Как создать нумерованный список в Markdown Вот как выглядит нумерованный список: Первый элемент Второй элемент А вот как создать его в Markdown: 1. Первый элемент 2. Второй элемент Как создать ссылки в Markdown Два наиболее распространенных способа создания ссылок в Markdown-документах — это гиперссылки и изображения. Оба способа помогают сделать ваш текст более четким и выразительным и должны использоваться по мере необходимости. Вот как выглядит гиперссылка в тексте: Сайт Кейлана А вот как создать такую ссылку в Markdown: [Сайт Кейлана](https://www.kealanparr.com) Вы помещаете текст, который хотите сделать ссылкой, в квадратные скобки (здесь "Сайт Кейлана"), а затем сразу за ними следуют круглые скобки с URL. Допустим, вы хотите включить в статью изображение. Чтобы оно выглядело следующим образом: Вы просто используете следующую нотацию: ![Вид природных скальных образований, образующих долину, через которую проходит дорога на фоне голубого неба.](https://images.unsplash.com/photo-1660866838784-6c5158c0f979?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=387&q=80) Это похоже на обычную ссылку, но перед квадратными скобками ставится восклицательный знак. Как использовать HTML в Markdown Вы можете использовать обычный HTML в документах Markdown (в зависимости от используемого парсера). Так что можете просто ввести любой действительный HTML-код, который вам нужен. Как добавить отступы в Markdown Если вы хотите добавить горизонтальную линию для разделения секций документа, вы можете сделать это так: С помощью трёх тире: --- Как создавать таблицы в Markdown Таблицы очень полезны в статьях. Чтобы создать таблицу, которая выглядит так: Имя Возраст Кейлан 25 Джейк 28 Вот нотация, которую вы бы использовали: | Имя | Возраст | | ------ | --- | | Кейлан | 25 | | Джейк | 28 | Единственное, о чём нужно помнить при создании таблицы в Markdown — это то, что вертикальные линии (|) должны быть выровнены по вертикали. Тогда ваша таблица будет отображаться как выше. Чтобы сделать это нагляднее, можно использовать изображение: Таблица Markdown отображена с заголовками "Имя" и "Возраст", где указаны Кейлан, Джейк и их возраст — 25 и 28 соответственно. Как добавить код и синтаксис в Markdown Добавление фрагментов кода в Markdown может быть очень полезным, например, при создании документации для разработчиков. Ниже приведён очень простой пример на JavaScript, но почти все современные языки программирования поддерживаются (включая подсветку синтаксиса). console.log('example log') Просто введите три обратные кавычки, укажите язык программирования, а затем нажмите Enter, чтобы начать писать код. Завершите блок кода тремя обратными кавычками. Как добавлять цитаты в Markdown Когда вы ссылаетесь на чью-то работу, важно и вежливо указывать авторство. Один из простых способов сделать это — процитировать их. Если вы хотите добавить цитату в Markdown: "Это цитата от очень мудрого человека" — Аноним Просто добавьте этот символ, который отформатирует текст как цитату: > "Это цитата от очень мудрого человека" — Аноним Подведем итог Надеюсь, эта статья стала для вас полезной справкой, и вы узнали о новой возможности Markdown, которую не видели раньше. Существует ещё множество функций (не считая всех вариаций HTML), но в этой статье мы рассмотрели наиболее часто используемые.
Типы данных в Python
Кортежи в Python – это один из четырех встроенных типов данных, которые используются для того, чтобы хранить наборы данных. К остальным типам данных относятся списки, множества и словари. У каждого из типов данных есть свои уникальные особенности, и каждый из них используется по-своему.
Иллюстрация списка, кортежа и множества
Списки
– это
изменяемые упорядоченные
последовательности элементов. Как правило, они используются для того, чтобы хранить однотипные данные. Тем не менее, их также можно использовать для хранения элементов, которые имеют разные типы данных.
my_list = [1, 2, 3, 4, 5]
print(my_list)
Списки в Python
Множества
– это
изменяемые неупорядоченные
наборы уникальных элементов. Этот тип данных полезен для выполнения математических операций с данными.
my_set = {"apple", "banana", "cherry", "apple"}
print(my_set)
Множества в Python
Если вы выполните код, приведенный выше, второе вхождение слова
"apple"
в множестве будет проигнорировано, так как множества хранят только уникальные элементы.
Словари
– это
изменяемые неупорядоченные
наборы пар ключ-значение. Они используются для того, чтобы можно было связать ключ со значением (все как в реальном словаре).
my_dict = {"Alice": 25, "Bob": 30, "Charlie": 35}
print(my_dict)
Словари в Python
Кортежи
– это
неизменяемые упорядоченные
последовательности элементов. Они полезны для хранения и передачи связанных фрагментов данных, которые не подлежат изменениям после того, как они были созданы.
my_tuple = ("apple", "banana", "cherry")
print(my_tuple)
Кортежи в Python
Если вы создаете кортеж с несколькими элементами, то скобки можно не использовать, хотя их довольно часто используют для того, чтобы внести ясность.
my_tuple = 1, 2, 3
print(my_tuple)
При создании кортежи могут быть записаны как с помощью круглых скобок, так и без них
Что такое кортеж?
Как мы уже говорили выше, кортеж – это упорядоченная и неизменяемая последовательность элементов. Это значит, что после того, как кортеж будет создан, элементы в нем менять будет нельзя.
Ниже приведен код для создания кортежа:
my_tuple = (1, 2, 3, 'four', 5.0)
В нашем случае
my_tuple
- это кортеж, который содержит пять элементов. Обратите внимание, что элементы в кортеже могут быть разных типов. Например, в примере выше кортеж содержит три значения типа integer, одно – типа string, и одно – типа float (или double).
Получить доступ к элементам кортежа довольно просто. Для того, чтобы это сделать, вам нужно их просто проиндексировать, как в обычном списке.
print(my_tuple[0]) # outputs 1
print(my_tuple[3]) # outputs 'four'
Обращение к элементу в кортеже
Можно обратиться сразу к нескольким элементам кортежа. Сделать это можно с помощью срезов.
print(my_tuple[1:3]) # outputs (2, 3)
Срезы кортежа
Возьмите код, который приведен выше, и попробуйте получить доступ к элементу, чей индекс выходит за пределы диапазона кортежа. Например, попробуйте обратиться к элементу с индексом 6. Получите ли вы ошибку? Попробуйте выяснить!
Одно из основных преимуществ использования кортежей (по сравнению со списками) заключается в том, что их можно быстрее перебирать, и они более эффективно используют память. Именно поэтому они считаются отличным вариантом для хранения какого-то фиксированного набора значений, который не нужно менять.
Но, поскольку кортежи неизменяемы, то после его создания вы не сможете изменять элементы. В связи с этим, если ваша задача подразумевает изменение набора элементов, то вместо кортежей вам придется использовать списки.
Основные функции
Ниже перечислены некоторые примеры использования функций и методов для кортежей в Python:
len(tuple)
: возвращает длину кортежа.
my_tuple = (1, 2, 3, 'four', 5.0)
print(len(my_tuple)) # outputs 5
Получение длины кортежа
tuple(seq)
: преобразует последовательность (например, список или строку) в кортеж.
my_list = [1, 2, 3]
my_tuple = tuple(my_list)
print(my_tuple) # outputs (1, 2, 3)
my_string = 'hello'
my_tuple = tuple(my_string)
print(my_tuple) # outputs ('h', 'e', 'l', 'l', 'o')
Преобразование последовательности в кортеж
tuple.count(value)
: возвращает количество вхождений указанного значения в кортеж.
my_tuple = (1, 2, 3, 2, 2, 'hello')
print(my_tuple.count(2)) # outputs 3
print(my_tuple.count('goodbye')) # outputs 0
Подсчет количества вхождений указанного значения
Так как в кортеже
my_tuple
нет слова
goodbye
, то вывод для конкретно этого оператора равен
0
(
строка 3
).
tuple.index(value)
: возвращает индекс первого вхождения указанного значения в кортеж.
my_tuple = (1, 2, 3, 2, 2, 'hello')
print(my_tuple.index(2)) # outputs 1
print(my_tuple.index('hello')) # outputs 5
#print(my_tuple.index(4)) # will throw an error
Получение индекса указанного значения
Обратите внимание, что если вы будете выполнять поиск для значения, которого нет в кортеже
my_tuple
, то вы получите сообщение об ошибке
"x not in tuple"
. Если вы раскомментируете последнюю строку кода, то сможете это увидеть.
Функции
max(tuple)
и
min(tuple)
возвращают максимальное и минимальное значения в кортеже соответственно. Если кортеж состоит только из строк, то функция
min(tuple)
вернет строку, которая будет первой в алфавитном порядке, а функция
max(tuple)
- ту, которая будет последней. И последнее, если кортеж состоит как из чисел, так и из строк, то обе функции выдадут ошибку.
my_tuple = (1, 2, 3, 4, 5)
print(max(my_tuple)) # outputs 5
print(min(my_tuple)) # outputs 1
alphabetical_tuple = ("apple", "banana", "giraffe", "fox", "eel")
print(max(alphabetical_tuple)) # outputs giraffe
print(min(alphabetical_tuple)) # outputs apple
alphanumeric_tuple = (1, "apple", 2, "dog")
#print(max(alphanumeric_tuple)) # error
#print(min(alphanumeric_tuple)) # error
Получение максимального и минимального значения в кортеже
sorted(tuple)
: возвращает новый отсортированный список из элементов кортежа.
my_tuple = (3, 1, 4, 1, 5, 9, 2)
sorted_tuple = sorted(my_tuple)
print(sorted_tuple) # outputs [1, 1, 2, 3, 4, 5, 9]
Сортировка элементов в кортеже
any(tuple)
: если хотя бы один элемент в кортеже истинен, возвращает
True
, в противном случае -
False
.
Примечание
: многие значения в Python могут расцениваться как
True
или
False
.
True
и
False
– это логические литералы, которые определяют истину и ложь соответственно.
Целые числа 0 и 1 расцениваются как
False
и
True
соответственно.
Пустая срока
""
расценивается как
False
, а любая непустая строка – как
True
.
Пустой кортеж
()
или список
[]
расценивается как
False
, а любой непустой кортеж или список – как
True
.
None
расценивается как
False
.
Получается, что для такого кортежа, как
(0, False, "", None)
, функция
any()
вернет
False
, так как все элементы кортежа расцениваются как
False
. Однако для такого кортежа, как
(1, True, "hello")
, функция
any()
вернет
True
, так как хотя бы один элемент кортежа имеет значение
True
.
my_tuple1 = (False, 0, None, '', ())
my_tuple2 = (False, 0, None, '', (), True)
print(any(my_tuple1)) # outputs False
print(any(my_tuple2)) # outputs True
Применение функции
any()
all(tuple)
: если все элементы кортежа истины, возвращает
True
, в противном случае -
False
. Обратите внимание, что пустая строка считается ложным значением (
False
).
my_tuple1 = (True, 1, 'hello', [1, 2, 3])
my_tuple2 = (True, 1, '', [1, 2, 3])
print(all(my_tuple1)) # outputs True
print(all(my_tuple2)) # outputs False
Применение функции
all()
Сложение кортежей применяется для объединения двух и более кортежей в один.
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
tuple3 = tuple1 + tuple2
print(tuple3) #outputs (1, 2, 3, 4, 5, 6)
Сложение двух кортежей
Умножение кортежа на число применяется для создания нового кортежа, который будет состоять из элементов уже существующего кортежа, повторенных определенное количество раз.
my_tuple = ("apple", "banana")
new_tuple = my_tuple * 3
print(new_tuple) # outputs ('apple', 'banana', 'apple', 'banana', 'apple', 'banana')
Умножение кортежа на целое число
В примере выше мы определили кортеж
my_tuple
, который содержит два строковых значения. После чего мы используем оператор * для того, чтобы создать новый кортеж
new_tuple
путем трехкратного повторения элементов кортежа
my_tuple
.
Обратите внимание, что
tuple1 + tuple2
и
tuple1 * n
в приведенных выше примерах – это обычные выражения, которые объединяют или делают срезы кортежей и не требуют использования каких-то дополнительных функций или методов.
Упаковка и распаковка кортежей
Упаковка
подразумевает объединение последовательности значений в один кортеж. Для того, чтобы это сделать, необходимо записать значения через запятую в круглых скобках.
my_tuple = (1, 2, 'three')
Упаковка кортежа
В данном случае значения
1
,
2
и
'three'
были объединены в кортеж, который, в свою очередь, был присвоен переменной
my_tuple
.
Что же касается
распаковки
, то она подразумевает извлечение значений из кортежа и присваивание их отдельным переменным. Это можно выполнить, указав в левой части оператора присваивания несколько имен переменных через запятую и присвоив им кортеж. В предыдущем примере мы присваивали некоторые значения переменной
my_tuple
. В данном примере кортеж
my_tuple
распаковывается, и эти значения присваиваются переменным
a
,
b
и
c
соответственно.
a, b, c = my_tuple
print(a) #outputs 1
print(b) #outputs 2
print(c) #outputs 'three'
Распаковка кортежа
Что произойдет, если мы в приведенном выше коде для распаковки значений кортежа
my_tuple
будем использовать только переменные
a
и
b
? Напомню, что кортеж
my_tuple
содержит три элемента. Если вы так сделаете, то получите сообщение об ошибке
ValueError: too many values to unpack (expected 2)
. Вы можете попробовать это сами, подкорректировав приведенный выше код. Также можете посмотреть, что будет, если вы будете использовать четыре переменные -
a
,
b
,
c
и
d
.
Упаковка и распаковка
Вложенные кортежи
Вложенные кортежи – это кортежи, которые в качестве элементов содержат другие кортежи.
Для того, чтобы создать вложенный кортеж, нужно просто добавить один или несколько кортежей через запятую в другой кортеж:
my_tuple = ((1, 2), (3, 4), (5, 6))
Вложенный кортеж
my_tuple
в примере выше – это вложенный кортеж, который в качестве элементов содержит три кортежа, каждый из которых, в свою очередь, содержит по два целых числа.
Для того, чтобы обратиться к элементам вложенного кортежа, используется либо обычное индексирование, либо вложенное.
print(my_tuple[0]) # outputs (1, 2)
print(my_tuple[1][0]) # outputs 3
print(my_tuple[2][1]) # outputs 6
Обращение к элементам во вложенном кортеже
Первый оператор
print
печатает первый элемент кортежа
my_tuple
, то есть кортеж
(1, 2)
. Во втором операторе используется вложенная индексация, с помощью которой мы обращаемся к первому элементу второго кортежа, то есть
3
. В третьем операторе также используется вложенная индексация, но здесь мы обращаемся ко второму элементу третьего кортежа, то есть
6
.
Кортежи как ключи в словаре
Помимо всего прочего, кортежи можно использовать в качестве ключей в словаре. Так как кортежи не могут быть изменены после того, как будут созданы, их можно смело использовать в качестве надежного и неизменяемого ключа в словаре.
Ниже приведен пример создания словаря с кортежами в качестве ключей:
my_dict = {('apple', 1): 'red', ('banana', 2): 'yellow', ('orange', 3): 'orange'}
Ключ в данном случае – это кортеж, который содержит некоторый фрукт и число. А значения – это строки, которые определяют цвета фруктов.
Обратиться к значениям словаря можно с помощью кортежей, которые выступают в роли ключей:
print(my_dict[('apple', 1)]) # outputs 'red'
print(my_dict[('banana', 2)]) # outputs 'yellow'
print(my_dict[('orange', 3)]) # outputs 'orange'
Использование кортежей в качестве ключей в словаре
Преимущества кортежей
Кортежи имеют ряд преимуществ в сравнении с другими типами данных, например,
Неизменяемость
. Кортежи неизменяемы, то есть вы не можете изменить их содержимое после того, как создадите. За счет этой особенности кортежи считаются более безопасным типом данных, который не подвержен частым ошибкам в отличие от изменяемых типов данных, таких как списки. Последние могут быть непреднамеренно изменены в других частях программы.
Кортежи неизменяемы
Упорядоченность
. Кортежи – это упорядоченные наборы элементов, которые могут оказаться очень полезными, если вам нужно хранить связанные фрагменты данных, обращаться к которым нужно в определенном порядке.
Лучшая производительность
. Кортежи работают куда быстрее, чем списки, так как требуют меньшего объема памяти и могут быть оптимизированы интерпретатором Python.
Подходят в качестве ключей
. Кортежи можно использовать в качестве ключей в словарях, а вот списки – нельзя. А значит, если вы хотите создать словарь, который бы сопоставлял связанные фрагменты данных друг с другом, то в качестве ключей словаря вы можете использовать кортежи.
Результаты работы функции
. Зачастую кортежи используют для того, чтобы функция могла возвращать несколько значений, так как они могут содержать любое количество элементов и легко подлежат распаковке. Ниже приведен пример, в котором функция возвращает несколько значений, упакованных в кортеж
return_tuple
.
def calculate_statistics(numbers):
n = len(numbers)
total = sum(numbers)
mean = total / n
variance = sum((x - mean) ** 2 for x in numbers) / n
stdev = variance ** 0.5
return_tuple = (total, mean, stdev)
return return_tuple
my_numbers = [1, 2, 3, 4, 5]
total, mean, stdev = calculate_statistics(my_numbers)
print("Total:", total)
print("Mean:", mean)
print("Standard deviation:", stdev)
Недостатки кортежей
Несмотря на то, что у кортежей есть несколько преимуществ (по сравнению с другими типами данных в Python), у них также есть и недостатки. Вот некоторые из них:
Неизменяемость
. Неизменяемость может быть как преимуществом, так и недостатком. Так как кортежи неизменяемы, то для того, чтобы внести в него некоторые изменения, приходится создавать новый кортеж. И если вы будете создавать много кортежей, это может оказаться довольно затратным по времени и привести к увеличению количества используемой памяти.
Ограниченная функциональность
. Если сравнивать кортежи с другими типами данных, например, списками, то они имеют ограниченную функциональность. Например, у кортежей нет таких методов, как
append()
,
insert()
или
remove()
, которые есть у списков.
Не подходят для больших наборов данных
. Кортежи не подходят для больших наборов данных, так как они хранятся в памяти и, если они будут содержать слишком большое количество элементов, то будут занимать много места. В ситуациях с большими наборами данных, больше подойдут такие типы данных, как массивы или генераторы.
Не подходят для больших наборов данных
Неудобны для чтения
. В некоторых ситуациях кортежи читать труднее, чем другие типы данных, например, списки (особенно если в кортеже содержится много элементов). Это объясняется тем, что кортежи, как правило, записываются в круглых скобках и через запятые, что может зрительно сбивать с толку некоторых программистов.
Заключение и основные моменты
Кортежи – это основной тип данных Python, с помощью которого можно хранить наборы значений и управлять ими. В этой статье мы рассмотрели основные принципы создания обычных и вложенных кортежей, обращения к ним, упаковки и распаковки кортежей, а также использования кортежей в качестве ключей в словарях.
Вот некоторые ключевые моменты, о которых не стоит забывать:
Кортежи неизменяемы.
Доступ к отдельным элементам кортежа можно получить с помощью индексов (как и в случае со списками).
Кортежи можно использовать в качестве ключей в словарях, что делает их отличным инструментом для управления данными.
Упаковка кортежей позволяет объединять несколько значений в один кортеж.
Распаковка кортежей позволяет присваивать элементы кортежа нескольким переменным за раз.
Вложенные кортежи могу использоваться для представления более сложных структур данных.
Как разработчик, вы знаете, что HTML расшифровывается как HyperText Markup Language (язык разметки гипертекста).
HTML — это язык, используемый для создания веб-сайтов. Но что означает "разметка"?
Языки разметки — это языки, которые используют теги для определения различных элементов в текстовом документе. Большинство людей знакомы с редакторами с расширенным форматированием (Rich Text Editors) — программами, которые позволяют пользователям добавлять дополнительное форматирование, изображения и ссылки в свои документы.
Скриншот графического интерфейса программы Microsoft Word (редактора с расширенным форматированием).
Языки разметки используют теги, такие как:
В начале 2000-х, когда идея мессенджеров только формировалась, расширяемый протокол обмена сообщениями и информацией о присутствии (XMPP) позволял разработчикам создавать интерактивные чат-приложения. С момента своего появления этот протокол прошел долгий путь и теперь включен в технический стек (или фреймворк), рекомендованный для разработки высококачественных веб-приложений, таких как WhatsApp (принадлежит компании Meta, деятельность которой признана в России экстремистской и запрещена).
Спустя более двух десятилетий этот протокол все еще не утратил своей актуальности и значимости среди множества других протоколов. Почему это так? Что делает XMPP актуальным? Какие ключевые особенности? Давайте лучше познакомимся с ним.
Что такое XMPP
Extensible Messaging and Presence Protocol (расширяемый протокол обмена сообщениями и присутствием)? Это протокол, основанный на XML, который обычно используется в открытых стандартах связи. Если сказать кратко, это чат-протокол, который позволяет легко и беспрепятственно передавать XML-компоненты, такие как данные. Помимо обеспечения обмена мгновенными сообщениями и реальных разговоров в режиме реального времени, XMPP также применяется для управления списком контактов и информации о статусе присутствия.
Где используется протокол
XMPP чаще всего используется для прямого обмена сообщениями между двумя точками, проверки статуса пользователя и передачи этой информации серверу. Протокол также отвечает за хранение статуса сервера, управление подписками, обновление списка контактов и блокировку определённых пользователей.
Характеристики XMPP
Протокол является децентрализованным.
Поддерживает асинхронный обмен данными/информацией.
Передает небольшие фрагменты данных вместо отправки больших блоков.
Работает поверх TCP.
Его сетевая конфигурация и компоненты (аппаратные/программные) не влияют на передачу данных на основе XMPP.
Разработан для модели "клиент-сервер".
Использует три статуса: «офлайн», «занят» или «онлайн» для указания статуса пользователя или сети.
Передает данные между двумя конечными точками.
Архитектура XMPP
На структурном уровне XMPP имеет много общего с протоколами, работающими на уровне приложений. Например, он также касается уникально названных клиентов, которые общаются через связанный сервер. Реализуя протокол для обоих клиентов, XMPP отслеживает и управляет маршрутизацией данных для них.
На схеме выше наглядно показана архитектура XMPP.
Однако в сложной реализации могут существовать несколько XMPP-шлюзов. В таком случае протокол также должен обеспечивать междоменную маршрутизацию. Шлюзы выполняют роль переводчика между различными протоколами и доменами, участвующими в обмене информацией.
Кроме того, XMPP-шлюз обрабатывает задачи, такие как запуск и завершение сеансов "клиент-сервер" для соответствующего протокола, включая необходимые элементы перевода протоколов.
Даже при использовании значительного количества шлюзов и доменов можно добиться постоянной связи между всеми точками сети с помощью XMPP.
Для лучшего понимания архитектуры XMPP важно разобраться в некоторых терминах.
Например, вам нужно знать о XMPP-станзах. Это небольшие XML-фрагменты, используемые для начала сеанса связи. Существует три типа станз:
Станза присутствия (presence stanza) определяет текущий статус сети или пользователя для других. Например, пользователь/сеть онлайн или офлайн.
Станза сообщения (message stanza) — это инструмент, необходимый для обмена сообщениями в чате.
Станза запроса информации (IQ stanza) — элемент, который XMPP использует для запроса или изменения данных. Аналогично тому, как HTTP использует методы GET и POST, XMPP использует станзу IQ.
Как работает протокол XMPP?
Вся обработка XMPP основана на архитектуре "клиент-сервер", где сообщения сначала передаются на сервер, а затем клиентам.
Чтобы определить, какому клиенту отправить сообщение, XMPP-сервер использует уникальный ID получателя. Уникальный ID или Jabber ID очень похож на адрес электронной почты с незначительными изменениями.
Формат Jabber ID: user@domain.com/resource.
Здесь user — это имя пользователя, domain.com — это домен отправителя, а resource — это тип устройства получателя сообщения. Например:
John@technology.testing/terminal.
В этом примере John — имя пользователя, technology.testing — домен, а terminal — это тип устройства или ресурса, используемого Джоном. Часть "resource" является необязательной, в то время как предыдущие две части обязательны.
XMPP-сервер использует этот Jabber ID для правильной маршрутизации сообщения по TCP-соединению. Как только начинается сеанс связи, XML-поток отправляется на сервер, и идентификация клиента выполняется с помощью Jabber ID.
После идентификации сервер получит запрос и инициирует передачу еще одного XML-потока. Этот поток будет отправлен обратно от сервера к клиенту. Таким образом, каждый XML-поток становится двунаправленным.
XMPP позволяет создать масштабную сеть обмена сообщениями, называемую федерацией. С помощью федерации клиенты могут взаимодействовать с несколькими XMPP-серверами одновременно.
Особенности XMPP
Основные особенности, которые выделяют XMPP среди других протоколов:
Асинхронная Передача Сообщений
С XMPP возможно непрерывное и асинхронное получение сообщений. Это означает, что сообщения отправляются последовательно, без ожидания ответа от получателя или отправителя и без необходимости быть онлайн для получения сообщения. Сообщения передаются в виде XML-станз — уникальных информационных единиц, содержащих такие сегменты, как метаданные, текст сообщения и уникальный ID отправителя и получателя.
Отличие XMPP от других клиент-серверных систем заключается в том, что XMPP не поддерживает опрос (polling). Опрос — это процесс, при котором клиент постоянно запрашивает сервер, есть ли новая информация. Так как опрос происходит с определёнными интервалами, для конечного пользователя отсутствует моментальный опыт общения. Кроме того, это приводит к чрезмерному потреблению полосы пропускания.
Вместо этого XMPP автоматически передаёт новое сообщение на сервер, даже если предыдущий запрос ещё не обработан или получен сервером. Это происходит и в обратном направлении, от сервера к клиенту. Это создаёт моментальный опыт общения для пользователей.
Архитектура Клиент-Сервер
Это основная архитектура, которую использует XMPP. В этой архитектуре XMPP передает лишь небольшую часть XML-элементов. Этот портативный XML-элемент сначала доходит до сервера, а затем до пользователя.
Клиентам XMPP присваиваются уникальные имена, подобно электронной почте. Этот уникальный ID используется для идентификации клиента и маршрутизации сообщения в правильном направлении. Таким образом, XMPP гарантирует, что каждый клиент XMPP использует фиксированный и стандартный маршрут для подключения к серверу.
Постоянные TCP-соединения
Изначально XMPP может передавать данные или устанавливать соединение только через TCP. Соединение, установленное таким образом, является постоянным и не требует повторного установления при передаче нового сообщения.
Таким образом, XMPP создает XML-поток, поддерживающий свободный обмен XML-данными. Однако некоторые современные расширения XMPP теперь также используют TLS и WebSockets.
Децентрализованный хостинг
Под децентрализованным хостингом понимается отсутствие центрального управляющего сервера. Любой может управлять, запускать и обслуживать XMPP-серверы. Кроме того, предоставлена свобода установки серверов как в облаке, так и на собственных серверах. Это похоже на электронную почту, где каждый владелец почты может настроить почтовые ящики по своему усмотрению, установив логин, пароль и другие параметры.
Шлюзы
Еще одной отличительной особенностью XMPP является наличие шлюзов для множества чат- и мессенджер-протоколов. XMPP совместим с различными протоколами и может подключаться к сетям на длительное время.
Например, одна и та же XMPP-сеть может получить доступ к SMS-домену, когда сообщение отправляется на мобильный телефон, и одновременно к SMTP-домену, чтобы доставить то же сообщение на электронную почту получателя. Также XMPP может использовать другие протоколы сообщений, такие как IRC, для передачи сообщения в другой форме.
Примеры Протокола XMPP
XMPP стал основой для многих популярных коммуникационных приложений. Вот некоторые из них:
WhatsApp использует собственную версию XMPP.
Возможности чата Zoom обеспечены XMPP.
Для мгновенных push-уведомлений Apple использует XMPP как в iPhone, так и в Mac.
Grindr использует XMPP для своей функциональности чата.
Для разработки высокофункциональных чатов XMPP является одним из множества предложений, но продолжает быть предпочтительным благодаря своим уникальным особенностям и преимуществам.
Преимущества XMPP
Поддерживаемый IETF и принятый тысячами разработчиков, XMPP стал основным открытым стандартом для разработки чатов.
С отличными характеристиками XMPP заполнил пробелы, оставленные строгими протоколами, и утвердился как необходимость для одноранговой связи и не только.
Вот основные преимущества использования протокола XMPP:
Надежность
Этот протокол служит сообществу разработчиков более 20 лет. За это время протокол укрепил свою инфраструктуру и получил большую поддержку сообщества. В настоящее время существует множество XMPP-серверов, и он является основой для многих приложений. Это подтверждает, что протокол испытан временем и имеет отличную техническую поддержку. Если это вас не впечатляет, то бесплатность и простота XMPP наверняка понравятся.
Улучшенная коммуникационная инфраструктура
Как высоко расширяемый протокол, XMPP позволяет пользователям обмениваться различными видами медиа и сообщений. Он поддерживает создание эффективной коммуникационной инфраструктуры независимо от типа передаваемых данных.
Гарантия доставки
С XMPP можно быть уверенным в доставке сообщений, так как он использует постоянное соединение через TCP. Протокол практически не пропустит ни одного XML-фрагмента, независимо от его размера.
Поддержка большинства языков программирования
Массовое принятие и глобальный спрос привели к поддержке различных языков. Библиотеки XMPP доступны на многих популярных языках, таких как Perl, C++, C#, Java, Python и многих других. Вы назовите язык, и библиотека XMPP, скорее всего, будет с ним совместима. Это позволило разработчикам работать в удобной и совместимой экосистеме.
Децентрализованность
XMPP децентрализован и допускает множество реализаций. Нет ограничений на настройку серверов и библиотек. Каждый может использовать XMPP, что предоставляет больше свободы и гибкости.
Повышенная безопасность
Улучшенная безопасность является дополнительным преимуществом XMPP. При настройке различных XMPP-серверов разработчики могут выбирать шифрование, протоколы безопасности и предпочтения доступа по своему усмотрению. Безопасность находится под полным контролем, что снижает количество кибератак и повышает уровень доверия.
Непрерывная передача данных
Производительность можно легко поддерживать, так как если один XMPP-сервер пострадает или выйдет из строя, независимо от причин, пострадают только соответствующие пользователи. Остальные будут продолжать пользоваться бесперебойной связью и передачей данных. Это позволило добиться 100-процентной непрерывности работы.
Передача данных с сервера на сервер
Объединение серверов - необязательный выбор. Благодаря этому разработчики могут закрыть передачу данных между серверами по соображениям безопасности, назначая серверам конкретные задачи.
Совместимость
Одним из главных преимуществ XMPP на стороне клиента является обилие клиентов. Не существует недостатка в клиентах XMPP. Независимо от типа устройства вы найдете XMPP-клиент. Для систем Windows и Unix он предлагает командную строку. Кроме того, один пользователь может быть зарегистрирован на разных устройствах, что повышает доступность.
Кратко
XMPP (Extensible Messaging & Presence Protocol - расширяемый протокол обмена сообщениями и присутствия) имеет огромное значение для создания приложений, умеющих общаться в режиме реального времени. Прочитайте статью и узнайте другие подробности об этом оригинальном протоколе. Мы постарались осветить его во всех подробностях.