The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Раздел полезных советов: Создание QR-кода в консоли, чтобы б..., auto_tips (?), 15-Июн-17, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


20. "Создание QR-кода в консоли, чтобы быстро перенести текст на ..."  +/
Сообщение от igor_chubin (ok), 19-Июн-17, 21:32 
> Автор, зачем писать что-то типа многопоточное-событийное, если в результате оно запускает
> бинарник в системе? Не использует биндинг (как тут http://search.cpan.org/~kurihara/Text-QRCode-0.01/lib/Text/Q...),
> а именно запускает процесс и читает его вывод.
> Не проще ли сразу в inetd прописать? Убрать ненужный здесь http. Открывать
> сокет, пишешь туда что нужно закодировать, читать обратно. И все. В
> качестве клиента неткат или телнет. Было бы более портабельно, чем курл.

В данном случае стоит действительно использовать вызов библиотеки, а не запускать напрямую

Про xinetd — нет, не пойдёт, потому что нужно ещё поддерживать браузеры, а не только консольные клиенты. + xinetd, напомню, это TCP, а не HTTP.

А про библиотечный вызов правильно совершенно, полностью с вами согласен.

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

Ответить | Правка | К родителю #10 | Наверх | Cообщить модератору

25. "Создание QR-кода в консоли, чтобы быстро перенести текст на ..."  +/
Сообщение от Аноним (-), 19-Июн-17, 23:32 
Для задачи "кодировать строку из консольки в QR код" HTTP нафиг не нужен. Да и поверх xinetd тривиально дописывается обертка на sed, которая выдернет строку из запроса.

Будет интересно сравнить производительность конфигурации на xinetd (вместе с оберткой) и оригинальной поделки. Ожидаю разницу в 2-5 раз.

Ответить | Правка | Наверх | Cообщить модератору

26. "Создание QR-кода в консоли, чтобы быстро перенести текст на ..."  +/
Сообщение от Аноним (-), 19-Июн-17, 23:56 
Обертка

head -n1 |
  grep -oP '(?<=GET \/)(.*?)(?= )' |
    qrencode -t UTF8 -o -

Остальная требуха аналогична. Я гарантирую, что это быстрее, чем питон.

Ответить | Правка | Наверх | Cообщить модератору

27. "Создание QR-кода в консоли, чтобы быстро перенести текст на ..."  +/
Сообщение от igor_chubin (ok), 20-Июн-17, 07:37 
И меньше места занимает!
Это прорыв

Как насчёт поддержки embedded PNG-объектов (<img src='png.qrenco.de/.../'>), опций запроса, виртуальных хостов, HTTPS, прокси, различного поведения для различных user-agent'ов,
которые есть в оригинальной версии?

Вообще ничего не виже в плохого в попытках заменить питоновский werkzeug shell'ом (и nginx заменить xinetd), только понимаю, что работать это будет если HTTP свести до уровня TCP, и с каждой добавляемой функцией типа виртуальных хостов или аргументов URL-строки, сложность кода будет увеличиваться экспоненциально.

Ответить | Правка | Наверх | Cообщить модератору

30. "Создание QR-кода в консоли, чтобы быстро перенести текст на ..."  +/
Сообщение от Аноним (-), 20-Июн-17, 11:09 
Я не nginx заменил, а питон с кучей тормозного барахла. Если вы не заметили.
Nginx можно поставить перед xinetd и я бы даже так и сделал, если бы захотел выставить Http версию в интернет.
Моя поделка из трех строк имеет 99% функциональности оригинальной и при этом не содержит ни строчки программного кода.
PNG генерировать - на слабо берете? Могу хоть потоковое видео вывести. И обертка будет не сложнее.

Ответить | Правка | Наверх | Cообщить модератору

32. "Создание QR-кода в консоли, чтобы быстро перенести текст на ..."  +/
Сообщение от igor_chubin (ok), 20-Июн-17, 11:44 
nginx там и так стоит перед сервисом (если мы про qrenco.de говорим).

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

Вы предложили заменить полноценную имплементацию HTTP-протокола (которая есть в nginx и в стоящим за ним werkzeug) его простой имплементацией поверх xinetd, по большому счёту просто заменить чистым TCP.

Какие минусы и плюсы имеет это решение?

1. (+) Простота, надёжность, отсутствие ошибок, скорость
2. (-) Экспоненциальный рост сложности, изобретение велосипеда (HTTP) при появлении новых требований; требование знания дополнительной информации (пара "хост:порт" в случае TCP, против "хост" в случае HTTP).

То есть, если нас не интересуют дополнительные приятные возможности HTTP, мы вполне можем обойтись одним TCP (xinetd) как простым, надёжным и быстрым решением, но как только мы хотим дополнительных возможностей, мы очень быстро приходим к тому, что нам нужно полноценно работать с HTTP (а не сводить работу с ним к работе с "TCP с фиксированным портом").

Какие возможности HTTP я имею в виду?

1. Стандартное кодирование данных (GET + POST);
2. Шифрование из коробки;
3. Заголовки (например, язык и другие; не так важно в данном сервисе, но в других важно);
4. Content-Type ответа (пример с PNG).

Можно ли это всё реализовать на xinetd? Конечно же да. Просто добавить HTTP-враппер вокруг вашего скрипта, который всё это дело правильно распарсит и представит вашему скрипту, но в конечном итоге вы быстро придёте к реализации nginx с помощью xinetd.

Можно ли всё это реализовать на голом TCP (xinetd + netcat), не переходя на уровень HTTP? Да, можно, но в итоге вы начнёте изобретать свой собственный HTTP, не имеющий своей экосистемы (ни клиентов, ни серверов). То есть, лучше, конечно, использовать HTTP.

В целом считаю ваш подход очень здравым (там где он применим, а именно — где входом сервиса является одна только строка, и выходом тоже одна строка).

Я так же полностью согласен с вами в том, что неоправданное усложнение кода (серверной части) бессмысленно и даже очень вредно. Одна строка на шелле всегда лучше одной страницы кода на питоне или программы на Си (за исключением случаев, где важна производительность или есть другие существенные причины).

Так что предлагаю разделить дискуссию на две:

1. (интерфейс) TCP (netcat) против HTTP (curl) при создании консольных сервисов.
2. (имплементация) Кривизна сервиса qrenco.de и его слабые стороны (например: ненужный форк там где можно использовать библиотечный вызов).

Я считаю, что дискуссия по первой теме представляет значительно больший интерес для сообщества чем вторая (там и так всё понятно; простейшая werkzeug/flask обёртка с очевидными плюсами и минусами; хотя и по второй теме может быть интересно — например, как реализовать аналогичный сервис (не урезанную netcat-замену!) средствами nginx + shell).

В общем, очень интересные темы вы поднимаете

Ответить | Правка | Наверх | Cообщить модератору

34. "Создание QR-кода в консоли, чтобы быстро перенести текст на ..."  +/
Сообщение от Аноним (-), 20-Июн-17, 13:34 
Я здесь в сущности отказываюсь от некритичных вещей и за счет этого значительно все упрощаю.
HTTP на уровне примитивных GET запросов вполне можно "делать" регулярками на коленке.
Если расширять требования и делать их специфичными, довольно быстро перестанет хватать HTTP и поверх вырастет какой-нибудь JSON-RPC протокол. И так далее сложность будет увеличиваться до бесконечности.

Я в обертке забыл сделать корректный HTTP ответ :)

head -n1 |
  grep -oP '(?<=GET \/)(.*?)(?= )' |
    ( qr=`qrencode -t UTF8 -o -` ;\
      echo "HTTP/1.0 200 OK" ;\
      echo "Content-Type: text-plain" ;\
      echo "Content-Length: "$(echo "$qr" | wc -c ) ;\
      echo "" ;\
      echo "$qr" )

HTTP достаточно простой, особенно 1.0.

1. Для консоли TCP сокет однозначно роднее, чем HTTP API, сколь угодно хорошее. Легче интегрировать в пайп и меньше накладухи. Гибкости можно достичь, развесив дополнительные варианты сервиса по разным портам ( практически аналогия микросервисов против монолитных приложений).
2. В форках не вижу проблемы. Расход памяти на qrencode очень маленький и время жизни процесса мало. Это совсем не то же, когда копируется огромное приложение и работает по несколько секунд.
Вижу проблему в не самом удачном для написания сетевых сервисов языке. Кроме очевидной проблемы (необходимости) доверия к такому сервису.

Ответить | Правка | Наверх | Cообщить модератору

35. "Создание QR-кода в консоли, чтобы быстро перенести текст на ..."  +/
Сообщение от igor_chubin (ok), 20-Июн-17, 15:38 
Насчёт доверия это не так критично как кажется. Сервисы pastebin, sprunge.us, ix.io прекрасно используются, просто, конечно, никто не пересылает через них чувствительную информацию.

Вообще, этот отдельно взятый сервис никакого принципиального значения не имеет. Это просто пример сервиса для консоли (для человека, работающего в консоли). Можно взять для примера какой-нибудь другой, давайте возьмём wttr.in.

Мне кажется, что использование TCP-интерфейса (netcat) наряду с HTTP очень важно для таких сервисов. Выбрасывать HTTP неправильно, но и ограничиваться HTTP тоже нельзя.

Другое дело, что при использовании голого TCP встают такие вопросы, как:

* как передавать параметры;
* как передавать заголовки;
* как передавать виртуальные адреса.

Эти все вопросы открыты.

Например, с помощью http всё это сделать легко:

  curl ru.wttr.in/Москва

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

Как это сделать с помощью netcat?

  echo Москва | nc wttr.in 1024

Неплохо, но нет языка.

Тогда так:

  echo ru.wttr.in/Москва | nc wttr.in 1024

получается по сути реализация HTTP-протокола заново.

Моё решение здесь: отказаться от передачи параметров (использовать дефолтные):

   echo Москва | nc wttr.in 1024

или, для определения положения по IP-адресу,

   nc wttr.in 1024

(кстати, вот вам интересная загадка: как на серверной стороне распознать,
собирается клиент передавать ему какие-то данные или нет; грубо говоря
как сделать так чтобы оба вышепреведённых варианта работали).

TCP-вариант хорош (по сравнению с HTTP-вариантом) ещё и тем, что вообще не требует
никаких клиентов. То есть, работать будет и так:

    cat < /dev/tcp/wttr.in/1024

(пока что TCP-интерфейс ещё не реализован, поэтому тест этот не отработает).


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

Ответить | Правка | Наверх | Cообщить модератору

36. "Создание QR-кода в консоли, чтобы быстро перенести текст на ..."  +/
Сообщение от Аноним (-), 20-Июн-17, 17:21 
>Например, с помощью http всё это сделать легко:
>Как это сделать с помощью netcat?

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

Можно выгружать по TCP grepable текст с прогнозом по всем городам, чтобы юзер мог сам выдернуть нужные данные.
Или интерактивный телнет-интерфейс с обработкой набора команд.

>(кстати, вот вам интересная загадка: как на серверной стороне распознать,
>собирается клиент передавать ему какие-то данные или нет; грубо говоря
>как сделать так чтобы оба вышепреведённых варианта работали).

По таймеру - если сразу ничего не пришло, обрабатывать отсутствие ввода.

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

Вот определитель IP.

service myip
{
        disable = no
        socket_type = stream
        user = user
        wait = no
        port = 9999
        protocol = tcp
        server = /usr/local/bin/myip
}

#!/bin/sh
echo "$REMOTE_HOST"

cat < /dev/tcp/127.0.0.1/9999
cat < /dev/tcp/xhost/myip

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру