💾 Archived View for ps.cities.yesterweb.org › uk › gemini-protocol-as-http-alternative.gmi captured on 2024-05-12 at 15:13:23. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2024-05-10)
-=-=-=-=-=-=-
Gemini - мережний протокол прикладного рівня, в своїй основі є спадкоємцем протоколу Gopher.
Орієнтований на мінімалізм та конфіденційність, оскільки виключає використання таких веб-технологій як Cookies та JavaScript, а формат даних, що передається - обмежений текстом або бінарними даними без підтримки стиснення та фонового завантаження зі сторонніх ресурсів. Обов'язковим є захист трафіку сертифікатом TLS.
Не зважаючи на простоту, протокол цілком багатофункціональний і дозволяє працювати з різними типами ресурсів: от як хостинг статичних файлів для персональних сторінок так і системи з авторизацією та обробкою запитів користувача - форуми, пошукові системи, організація радіо та відео стрімів, обмін зображеннями та іншими мультимедійними даними.
Враховуючи архітектуру, Gemini здебільшого буде цікавий тим, кого не влаштовує "роздутість" сучасного HTTP; стане в нагоді користувачам командного рядка, E-ink планшетів.
Як і в багатьох екосистемах, для Gemini характерна своя термінологія, знання якої допоможе краще розуміти контекст і формувати пошукові запити:
Текстові ресурси gemtext - це звичайний текст (MIME text/gemini), схожий до Markdown. Опціонально містить наступні мета-теги на початку кожного рядка (без зворотнього слешу):
# h1 ## h2 ### h3 => url [заголовок] > цитата
Деякі браузери підтримують розмітку inline:
\``` заголовок неформатованого блоку
У розмітці Gemtext не використовуються декоративні технології накшталт CSS, при цьому завдання відображення ресурсу повністю делеговане клієнтові.
Різні браузери по-різному декорують вміст, деякі додають відступи.
Тому головний принцип створення крос-браузерних сторінок простий: розмітка має зручно читатися у вигляді початкового коду.
Оскільки текстовий регламент протоколу не передбачає використання мета-тегів, такі стандарти сповіщень як Atom та RSS, без зовнішніх засобів інтеграції, в Gemini - не застосовні.
Незважаючи на це, підписки можливі, зокрема - засобами стандарту Gemfeed для інтерпретації браузером змін документу Gemtext.
Наприклад, в браузері Lagrange, відстежувати оновлення сторінки можна за допомогою меню Bookmarks - Subscribe to page… і обрати відповідний сторінці спосіб - підписка при зміні заголовків на сторінці або за зміною дат у посиланнях.
Відстеження за датою посилань
У цьому підході здійснюється відстеження за датою, що вказана наступною за посиланням у форматі ISO 8601 (Y-m-d), наприклад:
# Заголовок сторінки виконує роль заголовка стрічки Вміст параграфа ігнорується у відстеженні => /index.gmi будь-яке посилання, ігнорується ## Підрозділ сторінки, ігнорується Довільний вміст підрозділу, що ігнорується ## Публікації => /pub1.gmi 2024-01-28 Посилання на першу публікацію - відстежується => /pub2.gmi 2024-01-29 Посилання на другу публікацію - відстежується => /pub3.gmi Посилання публікацію - не відстежується (оскільки не містить дати) => /pub4.gmi Посилання публікацію - не відстежується (оскільки дата є частиною заголовка і розташована зправа) 2024-01-30
Таким чином, документ не втрачає зручності для візуального сприйняття людиною і при цьому містить мета-інформацію, зрозумілу для програмного інтерпретатора в браузері, що відслідковує сторінку.
Єдиний недолік такого підходу полягає в тому, що оновлення не можна отримувати частіше ніж раз на добу. Як заявлено в документації, це пов'язано з часовими зонами.
Відстеження заголовків
Альтернативний підхід, який відстежує зміни у заголовках документу:
# Мій блог, заголовок стрічки Параграф опису ## Перша публікація - відстежується Опис першої публікації => /pub1.gmi Читати ## Друга публікація - відстежується Опис другої публікації => /pub2.gmi Читати ...
Протокол Gemini має власний реєстр кодів заголовків, відмінний від типових для HTTP 200, 301, 404, 500, тощо
Клієнт зобов'язаний відхиляти будь-який код менше 10 або більше 69, при цьому повідомити користувача.
У невизначених випадках пріоритет буде відданий коду з початковим значенням діапазону, наприклад, 10 для 11 або 20 для 27.
Протокол передбачає обмін пакетами із заголовками довжиною максимум 1024 байт. У цю довжину необхідно вмістити мета інформацію про пакет - наприклад рядок URI та/або дані введення користувача.
Текстові дані мають бути закодовані у стандарт RFC 3986 (відомий такими функціями, як urlencode). Якоюсь мірою це скорочує корисний обсяг заголовка при використанні наприклад кирилиці.
Тіло пакету складається із "сирих" текстових або бінарних даних без стиснення; сервер закриває з'єднання після надсилання останнього байту.
За допомогою статусів групи "10", що відправляються клієнту, сервер здатний запитувати введення користувача (замість звичних форм, у браузерах Gemini - це спливаюче текстове вікно)
Після отримання та обробки даних, сервер зазвичай повертає статус "20", статус "51" (не знайдено) або переадресацію на цільову сторінку з кодом "30".
Приклад типового пакету для текстової сторінки "Hello World":
20 text/gemini; charset=utf-8; lang=en\r\nHello%20world%21
Щоб відкрити ресурс з адресою `gemini://` потрібен спеціальний браузер, що стандартно працює з портом `1965`
Користувачі GUI можуть почати з популярних Lagrange, Eva, Kristall, Castor і т.д.
Що варто знати:
Поняття "сервер" у середовищі Gemini може бути не звичним для користувачів веб, які звикли до поширених веб проксі Nginx або Apache "на всі випадки". Термін часто передбачає повноцінний сервіс для конкретного завдання, що резервує за собою окремий системний хост і порт.
У каталозі "awesome-gemini" представлено велику кількість таких рішень:
https://github.com/kr1sp1n/awesome-gemini
Наприклад, для запуску простої статики підійде сервер Agate (Rust). При цьому назва звичного index.html залежатиме від обраного рішення, для Agate - це index.gmi але для іншого серверу постфікс може відрізнятись.
Запуск динамічних ресурсів часто передбачає розробку власного сокет-серверу для реалізації специфіки окремо взятої програми.
Веб-розробникам простіше зрозуміти принцип роботи "server-side" на прикладі декількох файлів gemini-php:
https://github.com/eapl-gemugami/gemini-php
Утім, в нових проектах краще використовувати більш актуальні рішення, наприклад, з простих - форк бібліотеки Titan-II:
https://github.com/YGGverse/titan-II
Приклади реалізації можна подивитись у коді β-Doku - Gemini-проксі для DokuWiki:
https://github.com/YGGverse/bdoku
Щоб запускати різні сервіси на одному IP (не змінюючи стандартний порт), зручно встановити загальний проксі-сервер, який здійснюватиме маршрутизацію запитів на відповідну адресу/інтерфейс або на зовнішній сервер.
Якщо в HTTP - це Apache / Nginx, то для протоколу Gemini підійдуть Gmid (C):
або Twins (Go):
https://code.rocket9labs.com/tslocum/twins
З другим помічені деякі проблеми з передачею довгих текстів, тому для початківців, бажано розпочати роботу з Gmid, який наразі активно розвивається та має дружній фідбек від розробника.
Соціальна мережа за типом twitter
Найпростіший спосіб опублікувати свої сторінки в мережі Gemini
Хостинг з піддоменом, підтримкою Titan і WebDAV
Хостинг з агрегатором останніх записів, є SFTP
ASCII гра з догляду за рослинами, що затягує :)