GoGPT Best VPN GoSearch

Значок OnWorks

SWISH-БИБЛИОТЕКА - Онлайн в облаке

Запустите SWISH-LIBRARY в провайдере бесплатного хостинга OnWorks через Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.

Это команда SWISH-LIBRARY, которую можно запустить в провайдере бесплатного хостинга OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.

ПРОГРАММА:

ИМЯ


SWISH-LIBRARY - Интерфейс к библиотеке Swish-e C

О проекте


Библиотека C в интерфейсе к поисковому коду Swish-e. Он позволяет встроить
Swish-e в свои приложения. Этот API основан на Swish-e версии 2.3.

Примечание: Это НОВЫЙ API Swish-e версии 2.3. Интерфейс языка C изменился
как и интерфейс Perl для Swish-e. Новый интерфейс Perl - это модуль SWISH :: API и
входит в состав Swish-e. Старый модуль SWISHE perl был переписан
для работы с новым API. Модуль SWISHE perl больше не входит в состав Swish-e.
распространение, но его можно загрузить с веб-сайта Swish-e.

Преимущество библиотеки в том, что индексные файлы или файлы можно открывать один раз и
много запросов, сделанных по открытому индексу. Это экономит время запуска, необходимое для разветвления и запуска.
двоичный файл swish-e и дорогостоящее время открытия индексного файла. Некоторые тесты
показали трехкратное увеличение скорости.

Обратной стороной является то, что ваша программа теперь содержит больше кода и данных (индексные таблицы могут
использовать довольно много памяти), и если в swish произойдет фатальная ошибка, это приведет к выходу из строя вашего
программа. Об этом следует подумать, особенно если встраивать swish в веб-сервер.
например, Apache, где есть много процессов, обслуживающих запросы.

Лучший способ узнать о библиотеке - просмотреть два файла, включенных в Swish-e.
дистрибутив, использующий библиотеку.

src / libtest.c
Этот файл дает общий обзор связывания программы C с библиотекой Swish-e. Нет
в этом примере используются все доступные функции, но он должен дать вам хороший
обзор создания программы на языке C с помощью swish-e.

Чтобы собрать и запустить libtest chdir в каталог src и выполнить команды:

$ сделать libtest
$ ./libtest [необязательное имя индексного файла]

Вам будет предложено ввести слова для поиска. По умолчанию используется индекс index.swish-е.
Это можно изменить, поместив список индексных файлов в строку, защищенную кавычками.

$ ./libtest 'индекс1 индекс2 индекс3'

perl / API.xs
The API.xs файл представляет собой интерфейс Perl "xsub" для библиотеки C и является частью
SWISH :: API Perl-модуль. Это объектно-ориентированный интерфейс к библиотеке Swish-e.
и демонстрирует, как различные поисковые "объекты" создаются вызовами C и как они
уничтожаются, когда больше не нужны.

Установка Свиш-э библиотеки


Библиотека Swish-e устанавливается при запуске "make install" при сборке Swish-e. Нет
требуются дополнительные шаги по установке.

Библиотека состоит из файла заголовка «swish-eh» и библиотеки «libswish-e. *», Которая может
либо статическая, либо общая библиотека в зависимости от вашей платформы.

Библиотека Обзор


Когда вы впервые присоединяетесь к индексному файлу (или индексным файлам), вам возвращается «дескриптор взмаха».
С помощью дескриптора вы создаете один или несколько «объектов поиска», которые содержат параметры для
запросить индекс, например строку запроса, порядок сортировки, разделитель поисковой фразы, ограничение
параметры и биты структуры HTML. "Объект" на самом деле просто указатель на C
структуру, но полезно думать об этом как об объекте, в котором данные и функции
связанные с ним.

Объект поиска используется для запроса индекса. Запрос возвращает «объект результатов». В
Объект результатов содержит количество совпадений, проанализированный запрос по индексу и набор результатов.
Объект результатов отслеживает текущую позицию в наборе результатов. Вы можете «искать»
к определенной записи в наборе результатов (полезно для отображения страницы результатов).

Наконец, объект результата представляет собой единственный результат из списка результатов. Объект результата
обеспечивает доступ к свойствам результата (таким как имя файла, рейтинг и т. д.).

Помимо результатов, доступны функции для доступа к сохраненным значениям заголовков.
в индексном файле функции для проверки и сообщения об ошибках, а также несколько служебных функций.

Доступен функции


Ниже приведен список доступных функций, включенных в языковой API Swish-e C.

Эти функции (и определения типов) определены в свиш-а заголовочный файл. Общее
Используемые объекты (например, конструкции):

SW_HANDLE - дескриптор swish, который ассоциируется с индексным файлом
SW_SEARCH - поисковый "объект", содержащий параметры поиска
SW_RESULTS - "объект" результатов, содержащий набор результатов
SW_RESULT - единственный результат, используемый для доступа к свойствам результата
SW_FUZZYWORD - используется для нечеткого преобразования слов

Поиск

SW_HANDLE SwishInit (символ * IndexFiles);
Эта функция открывает и считывает информацию заголовков индексных файлов, включенных в
Строка IndexFiles. Строка должна содержать список индексных файлов, разделенных пробелами.

SW_HANDLE мой дескриптор;
myhandle = SwishInit ("file1.idx");

Обычно вы открываете дескриптор в начале своей программы и используете его для создания
несколько запросов по индексу.

Эта функция всегда будет возвращать дескриптор взмаха. Вы должны проверить на наличие ошибок, и на
освобождает от ошибок память, используемую дескриптором, или прекращает работу.

Вот пример прерывания:

SW_HANDLE swish_handle;
swish_handle = SwishInit ("file1.idx file2.idx");
если (SwishError (swish_handle))
SwishAbortLastError (swish_handle);

А вот пример отлова ошибки:

SW_HANDLE swish_handle;
swish_handle = SwishInit ("file1.idx file2.idx");
если (SwishError (swish_handle))
{
printf ("Не удалось подключиться к swish.% s \ n", SwishErrorString (swish_handle));
SwishClose (swish_handle); / * освобождаем используемую память * /
0 вернуться;
}

У вас может быть несколько активных дескрипторов одновременно.

Swish-e не сообщит вам, изменился ли индексный файл на диске (например, после
переиндексация). В постоянной среде (например, mod_perl) вызывающая программа должна
проверьте, не изменился ли индексный файл на диске. Обычный способ сделать это -
сохраните номер inode перед открытием индексного файла (ов), а затем укажите имя файла
время от времени и повторно открывайте индексные файлы, если номер inode изменяется.

void SwishClose (дескриптор SW_HANDLE);
Эта функция закрывает и освобождает память дескриптора Swish. Каждый взмах ручки
должен быть освобожден после завершения поиска по индексу. Неспособность закрыть ручку приведет к
приведет к утечке памяти.

SW_SEARCH New_Search_Object (дескриптор SW_HANDLE, const char * query);
Возвращает новый поисковый «объект». Объект поиска содержит параметры, используемые для
поиск по индексу. Один объект поиска можно использовать для запроса нескольких индексов.
раз. Доступные настройки, перечисленные ниже, являются "закрепленными" в том смысле, что они остаются включенными.
объект поиска до изменения.

int SwishGetStructure (SW_SEARCH srch);
Возвращает флаг "структура" переданного объекта поиска или 0, если объект поиска
НОЛЬ.

void SwishPhraseDelimiter (SW_SEARCH srch, символ-разделитель);
Устанавливает символ-разделитель фраз. По умолчанию используются двойные кавычки.

char SwishGetPhraseDelimiter (SW_SEARCH srch);
Возвращает символ-разделитель фраз, используемый в объекте поиска, или 0, если поиск
объект NULL.

void SwishSetStructure (SW_SEARCH srch, int структура);
Устанавливает флаг «структура» в поисковом объекте. Флаг структуры используется для ограничения
выполняет поиск по частям файлов HTML (например, по заголовку или заголовкам). По умолчанию
не предел. Это обеспечивает функциональность переключателя командной строки -H.

void SwishPhraseDelimiter (SW_SEARCH srch, символ-разделитель);
Устанавливает символ-разделитель фраз. По умолчанию используются двойные кавычки.

void SwishSetSort (SW_SEARCH srch, char * sort);
Устанавливает порядок сортировки результатов. Это то же самое, что ключ -s, используемый с
swish-e двоичный.

void SwishSetQuery (SW_SEARCH srch, char * query);
Устанавливает строку запроса в поисковом объекте. Обычно в этом нет необходимости, так как он может
быть установленным при создании объекта поиска или при выполнении запроса.

void SwishSetSearchLimit (SW_SEARCH srch, char * propertyname, char * low, char * hi);
Устанавливает параметры ограничения для поиска. Обеспечивает ту же функциональность, что и -L
переключатель командной строки. Вы можете указать диапазон значений свойств, по которым выполняется поиск
должно быть внутри. Вы можете позвонить SwishSetSearchLimit () только один раз для каждого объекта
(но можно установить ограничения для более чем одного свойства за раз).

В отличие от других настроек объекта поиска, после выполнения запроса в поиске
объект, который вы должны назвать SwishResetSearchLimit () для изменения или сброса параметров ограничения.

void SwishResetSearchLimit (SW_SEARCH srch);
Сбрасывает ограничения, установленные для объекта поиска, установленные SwishSetSearchLimit ().

void Free_Search_Object (SW_SEARCH srch);
Освобождает объект поиска. Это должно быть вызвано при выполнении с объектом поиска.
Как правило, вы можете повторно использовать поисковый объект для нескольких запросов, поэтому обычно вы
позвони прямо перед звонком SwishClose ().

Вы можете освободить объект поиска перед освобождением и созданными объектами результатов.

SW_RESULTS SwishExecute (поиск SW_SEARCH, запрос const char *);
Выполняет поиск по индексу или индексам на основе параметров в объекте поиска. Возвращает
объект результатов. См. Ниже функции для доступа к данным, хранящимся в результатах.
объект.

Вы всегда должны проверять наличие ошибок после звонка SwishExecute ().

SW_RESULTS SwishQuery (SW_HANDLE, const char * words);
Это сокращенная функция, которая обходит создание поискового объекта (на самом деле,
избавляет от необходимости создавать и освобождать поисковый объект). Это позволяет передавать только
Строка запроса; другие параметры поиска не могут быть установлены. Результаты отсортированы по рангу.

Вы всегда должны проверять наличие ошибок после звонка SwishQuery ().

Reading Результаты

int SwishHits (результаты SW_RESULTS);
Возвращает количество результатов в объекте результатов.

SWISH_HEADER_VALUE SwishParsedWords (SW_RESULTS, const char * index_name);
Возвращает токенизированный запрос. Слова разбиваются по символам слов, а игнорируемые слова
удаленный. Проанализированные слова полезны для выделения условий поиска в вашей программе.

"Index_name" - это имя индекса, представленного в SwishInit () вызов функции.

Возвращает объединение SWISH_HEADER_VALUE типа SWISH_LIST, которое является символом **. Видеть
src / libtest.c для примера доступа к строкам в этом списке, но в целом вы
может преобразовать это в (char **).

SWISH_HEADER_VALUE SwishRemovedStopwords (SW_RESULTS, const char * index_name);
Возвращает список игнорируемых слов, удаленных из входного запроса.

Возвращает объединение SWISH_HEADER_VALUE типа SWISH_LIST, которое является символом **. Видеть
src / libtest.c для примера доступа к строкам в этом списке, но в целом вы
может преобразовать это в (char **).

int SwishSeekResult (SW_RESULTS, целое положение);
Устанавливает текущую позицию поиска в списке результатов, при этом нулевая позиция является
первая запись (в отличие от -b, где первый результат).

В случае ошибки возвращает позицию или отрицательное число.

SW_RESULT SwishNextResult (SW_RESULTS);
Возвращает следующий результат или NULL, если других результатов нет.

Возвращенный объект результата не нужно освобождать после использования (в отличие от swish
дескриптор, объект поиска и объект результатов).

const char * SwishResultPropertyStr (SW_RESULT, char * имя свойства);
Эта функция в основном полезна для тестирования, поскольку она возвращает нечетные результаты при ошибках.

Прерывается, если вызывается с нулевым объектом SW_RESULT

Возвращает строковое значение указанного свойства.

Возвращает пустую строку "", если текущий результат не имеет указанного свойства.
назначены.

Возвращает строку "(null)" при недопустимом имени свойства (т.е. имя свойства не
определено в индексе) и устанавливает ошибку (см. ниже), указывающую на недопустимое свойство
имя.

Возвращенную строку не нужно освобождать, она действительна только для текущего
результат. Если вы хотите сохранить строку, вы должны скопировать ее локально.

Даты форматируются с использованием жестко заданной строки формата: "% Y-% m-% d% H:% M:% S" в
местное время.

unsigned long SwishResultPropertyULong (SW_RESULT r, char * имя свойства);
Возвращает числовое свойство в виде длинного числа без знака. Числовые свойства используются как для
Тип свойств PropertyNamesNumeric и PropertyNamesDate. Даты возвращаются как
временная метка unix, сообщенная системой при создании индекса.

Swish-e прекратит работу, если будет вызван с объектом NULL SW_RESULT. Без SW_RESULT
объект swish-e не может устанавливать никаких кодов ошибок.

При ошибке возвращает UMAX_LONG. Обычно это определяется в limits.h. Проверять SwishError ()
(см. ниже) тип ошибки.

If SwishError () возвращает false (ноль), тогда это просто означает, что этот результат не
иметь какие-либо данные для указанного свойства.

If SwishError () возвращает истину (ненулевое значение), тогда либо указанное имя свойства равно
недействителен, или запрошенное свойство не является числовым (или датским) свойством (например, это
строковое свойство).

См. Ниже, как получить конкретное сообщение об ошибке, когда SwishError () правда.

PropValue * getResultPropValue (SW_RESULT r, char * propertyname, int ID);
Это низкоуровневая функция для получения свойства независимо от типа. Это вероятно
лучшая функция для доступа к свойствам.

Swish-e прекратит работу, если будет вызван с объектом NULL SW_RESULT. Имя свойства - это имя
собственности. ID - это идентификационный номер собственности, если он известен. ID обычно не
используется в API, но его цель - избежать поиска идентификатора свойства для каждого
отображается результат.

Возвращаемое значение PropValue - это структура, которая содержит флаг, указывающий тип, и
объединение, содержащее значение свойства. Их флаги и структура определены в
свиш-а

Свойство необходимо скопировать локально, а возвращаемое значение "PropValue" должно быть освобождено.
позвонив по телефону freeResultPropValue () чтобы избежать утечки памяти.

При ошибке возвращает NULL. Проверять SwishError () (см. ниже) тип ошибки.

Если возвращает NULL, но SwishError () возвращает false (ноль), тогда это просто означает, что это
Результат не содержит данных для указанного свойства.

If SwishError () возвращает истину (ненулевое значение), тогда указанное имя свойства недействительно
(т.е. не определено для индекса).

См. Ниже, как получить конкретное сообщение об ошибке, когда SwishError () правда.

См. Пример использования этой функции в perl / API.xs.

void freeResultPropValue (недействительно)
Освобождает "PropValue", возвращенное после вызова getResultPropValue ().

void Free_Results_Object (результаты SW_RESULTS);
Освобождает объект результатов (освобождает набор результатов). Это должно быть вызвано, когда это будет сделано
читаем результаты и перед звонком SwishClose ().

Доступ к Индекс заголовок Наши ценности

Каждый индексный файл имеет связанные значения заголовка, которые описывают индекс. Эти функции
предоставить доступ к этим данным. Данные заголовка возвращаются как объединение SWISH_HEADER_VALUE,
и передается указатель на SWISH_HEADER_TYPE, и возвращаемое значение указывает
тип возвращаемых данных. См. Примеры src / libtest.c и perl / API.xs.

const char ** SwishHeaderNames (SW_HANDLE);
Возвращает список возможных имен заголовков. Этот список одинаков для всех индексных файлов.
данной версии Swish-e. Это дает возможность получить доступ ко всем заголовкам
без необходимости перечислять их в вашей программе.

const char ** SwishIndexNames (SW_HANDLE);
Возвращает список открытых индексных файлов. Это просто список указанных индексных файлов
в SwishInit () вызов. Вам нужно имя индексного файла для доступа к определенному
значения заголовка индекса.

SWISH_HEADER_VALUE SwishHeaderValue (SW_HANDLE, const char * index_name, const char
* cur_header, SWISH_HEADER_TYPE * тип);
Получает значение заголовка для данного индексного файла и имя заголовка. Наборы вызовов
"тип" передается типу возвращаемого значения.

См. Примеры src / libtest.c и perl / API.xs.

SWISH_HEADER_VALUE SwishResultIndexValue (SW_RESULT, const char * name, SWISH_HEADER_TYPE
*тип );
Это похоже на SwishHeaderValue () выше, но вместо того, чтобы указать имя индексного файла и
дескриптор взмаха, предоставьте объект результата, и значение заголовка будет извлечено из
связанный с результатом индексный файл.

Доступ к недвижимость Мета Данные

В дополнение к предопределенным стандартным свойствам у вас есть возможность добавить
дополнительные "мета" свойства, которые должны быть проиндексированы и / или добавлены в список возвращаемых свойств
с каждым результатом. См. Разделы о директивах MetaNames и PropteryNames в
КОНФИГУРАЦИОННЫЙ ФАЙЛ для объяснения того, как это сделать.

Эти функции обеспечивают доступ к метаданным, хранящимся в индексе. Вы можете использовать их для
определить, какая метаинформация / информация о свойствах доступна для индекса, включая все предварительные
определены стандартные свойства. См. Пример в libtest.c.

SWISH_META_LIST SwishMetaList (SW_HANDLE, const char * имя_индекса);
Возвращает список мета-записей для данного индексного файла в виде массива с завершающим нулем.
объектов SW_META. Используйте функции ниже, чтобы извлечь определенные поля из
Структура SW_META. Мета отличаются от свойств.

SWISH_META_LIST SwishPropertyList (SW_HANDLE, const char * имя_индекса);
Эта функция аналогична SwishMetaList () но он возвращает массив свойств как
в отличие от метаобъектов. Атрибуты свойства могут быть извлечены так же, как и в мета
объекты, используя функции, указанные ниже.

SWISH_META_LIST SwishResultMetaList (SW_RESULT);
Это похоже на SwishMetaList () выше, но определяет индекс для использования из результата
объект.

SWISH_META_LIST SwishResultPropertyList (SW_RESULT);
Это похоже на SwishPropertyList () выше, но нравится SwishResultMetaList () использует результат
объект вместо имени индекса.

const char * SwishMetaName (SW_META);
Учитывая объект SW_META, возвращенный одним из вышеперечисленных, эта функция вернет
мета / название свойства. Вы можете использовать это имя для доступа к значению свойства для данного
как описано выше.

int SwishMetaType (SW_META);
Получить тип данных для данного мета / свойства. Известные типы перечислены в swish-eh

SwishMetaID (SW_META);
Получите внутренний идентификационный номер для данного мета / свойства. Эти идентификаторы уникальны для
индексный файл, но не уникальны для каждого результата.

Контроль для ошибки

После всех звонков следует проверять наличие ошибок. Последняя ошибка сохраняется в дескрипторе swish.
объект и действителен только до следующей операции (которая сбрасывает флаги ошибок).

В настоящее время некоторые ошибки помечены как «критические». В этих случаях вам следует
уничтожить (вызвав SwishClose () функция) текущий маркер поворота. Если у вас есть
другие объекты в области видимости (например, объект поиска или объект результатов) уничтожают их первыми.

Типы критических ошибок можно увидеть в src / error.c. В настоящее время список
включает в себя:

Не удалось открыть индексный файл
Неизвестный формат индексного файла
Индексный файл (ы) пуст
Ошибка индексного файла
Недействительный маркер взмаха
Недействительный объект результатов

int SwishError (SW_HANDLE);
Это возвращает истину, если существует условие ошибки. Он возвращает номер ошибки, который
целое число меньше нуля при ошибке. Это следует проверить перед вызовом любого из
другие функции ошибок ниже.

const char * SwishErrorString (SW_HANDLE);
Это возвращает общее текстовое описание текущей ошибки.

const char * SwishLastErrorMsg (SW_HANDLE);
В некоторых случаях будет возвращена строка с подробностями о текущей ошибке. Для
пример, SwishErrorString () может возвращать "Неизвестное метанаме", но SwishLastErrorMsg ()
вернет строку с именем неизвестного метанимя.

int SwishCriticalError (SW_HANDLE);
Возвращает истину, если текущее состояние ошибки является критической. О критических ошибках
вы должны освободить все текущие объекты и вызвать SwishClose () как swish может быть в
нестабильное состояние.

void SwishAbortLastError (SW_HANDLE);
Это удобная функция, которая отформатирует и распечатает последнее сообщение об ошибке и
затем прервите программу.

void set_error_handle (ФАЙЛ * где);
Устанавливает, где печатаются ошибки и предупреждения (при печати swish). Для исторического
Причины, по которым при первом запуске swish-e на стандартный вывод отправляются ошибки и предупреждения.

void SwishErrorsToStderr (void);
Удобный метод отправки ошибок на stderr вместо stdout.

утилита функции

const char * SwishWordsByLetter (SWISH * sw, char * indexname, char c);
Возвращает все слова в индексе indexname, начинающиеся с переданной буквы.
Возвращает NULL, если имя индексного файла недействительно.

Эта функция может измениться в будущем, поскольку в настоящее время можно использовать только 8-битные символы.

символ * SwsishStemWord (SW_HANDLE sw, char * in_word);
Устаревшее

Это можно использовать для преобразования слова в его основу. Используется только оригинальный Портер.
Штеммер.

SW_FUZZYWORD SwishFuzzyWord (SW_RESULT r, символ * слово);
Основа «слово» основана на нечетком режиме, выбранном при индексировании.

Нечеткий режим, используемый при индексировании, сохраняется в индексном файле. Поскольку каждый результат
связанный с заданным индексным файлом, этот метод позволяет выделить слово на основе его индекса
.

Одним из возможных способов использования этого является выделение условий поиска в сводке документа, что
будет основываться на заданном результате.

Приведенные ниже методы можно использовать для доступа к возвращаемым данным. Объект SW_FUZZYWORD
должен быть освобожден, когда это будет сделано, чтобы избежать утечки памяти.

const char ** SwishFuzzyWordList (SW_FUZZYWORD fw);
Возвращает список строк с завершающим нулем, возвращенный стеммером. В большинстве случаев это
будет одной строкой.

Вот пример:

SW_FYZZYWORD fuzzy_word = SwishFuzzyWord (результат);
const char ** word_list = SwishFuzzyWordList (fuzzy_word);
в то время как (* список_слов)
{
printf ("% s \ n", * список_слов);
word_list ++;
}
SwishFuzzyWordFree (нечеткое_слово);

Если стеммер не преобразует строку (например, попытка стебля числового
data) word_list будет содержать исходное слово. Чтобы узнать, действительно ли стеммер
остановил слово проверить возвращаемое значение с помощью SwishFuzzyWordError ().

int SwishFuzzyWordError (SW_FUZZYWORD fw);
Это возвращает ноль, если операция стемминга была успешной, в противном случае возвращается
значение, указывающее причину, по которой слово не было сокращено. Возвращаемые значения определены
в файле swish-e src / stemmer.h.

Не все стеммеры устанавливают это значение правильно. Но с тех пор SwishFuzzyWordList () вернется
допустимая строка независимо от возвращаемого значения, вы часто можете просто игнорировать этот параметр.
Это то, чем я занимаюсь.

int SwishFuzzyWordCount (SW_FUZZYWORD fw);
Возвращает количество строк в списке слов, доступных при вызове
SwishFuzzyWordList ().

Обычно это всего один, но в случае с DoubleMetaphone это может быть один или два
(т.е. DoubleMetaphone может возвращать одну или две строки).

const char * SwishFuzzyMode (SW_RESULT r);
Возвращает имя стеммера, использованного для данного результата (который связан с
индекс).

void SwishFuzzyWordFree (SW_FUZZYWORD fw);
Освобождает память, используемую SW_FUZZYWORD.

Сообщения об ошибках


Сообщайте отчеты об ошибках в группу обсуждения Swish-e. Не стесняйтесь улучшать или
улучшить эту функцию.

Автор


Исходный интерфейс: август 2000 г., Хосе Руис [электронная почта защищена]

Обновлено: 22 августа 2002 г. - Билл Мозли

Интерфейс обновлен для Swish-e версии 2.3 17 октября 2002 г. - Билл Мозли

Документ Инфо


$ Id: SWISH-LIBRARY.pod 1906 2007-02-07 19: 25: 16Z moseley $

.

Используйте SWISH-БИБЛИОТЕКУ онлайн через сервисы onworks.net


Бесплатные серверы и рабочие станции

Скачать приложения для Windows и Linux

Команды Linux

Ad




×
Реклама
❤️Совершайте покупки, бронируйте или заказывайте здесь — никаких затрат, что помогает поддерживать бесплатность услуг.