The OpenNET Project / Index page

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



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

"Раздел полезных советов: Как получать ответы на вопросы по п..."  +1 +/
Сообщение от auto_tips (??), 06-Июл-18, 10:21 
В [[https://www.opennet.dev/tips/3018_help_cheat.shtml прошлой заметке]] было показано как, пользуясь сервисом cheat.sh, можно получить краткую справку практически по любой популярной команде UNIX/Linux. Сервис использует для этого популярные репозитории шпаргалок (cheat sheets), такие как tldr, cheat и прочие.

Возможности сервиса cheat.sh были расширены, и теперь с его помощью можно получать не только подсказки по командам UNIX/Linux, но и получать ответы на любые вопросы по программированию.

В простейшем случае использование сервиса выглядит следующим образом:

    curl cheat.sh/python/append+file

Этот запрос возвращает ответ на вопрос, как дописать файл (append file) в python.

Вместо python в запросе можно указать другой язык программирования (из 55 поддерживаемых
сервисом в настоящий момент):

    curl cheat.sh/js/append+file
    curl cheat.sh/go/append+file

Возвращаемые запросы отформатированы по умолчанию как код на соотвествующем
языке программирования: текстовые пояснения оформлены как комментарии языка.
Их можно убрать полностью (опция Q) или оставить как незакомментированный текст:

(с комментариями)

    $ curl cht.sh/lua/merge+tables
    -- Lua - merge tables?

    for k,v in pairs(second_table) do first_table[k] = v end

    -- [Doug Currie] [so/q/1283388] [cc by-sa 3.0]

(без комментариев)

    $ curl cht.sh/lua/merge+tables?Q
    for k,v in pairs(second_table) do first_table[k] = v end

Сервис поддерживает множество других опций, описание которых можно получить по запросу /:help

    curl cht.sh/:help

Обратите внимание, что к сервису можно обращаться как по полному имени (cheat.sh),
так и по краткому имени cht.sh. Для запросов можно использовать оба протокола HTTP и HTTPS.


Примеры запросов:

    curl cht.sh/go/reverse+a+list
    curl cht.sh/python/random+list+elements
    curl cht.sh/js/parse+json
    curl cht.sh/lua/merge+tables
    curl cht.sh/clojure/variadic+function

Демонстрация: https://www.opennet.dev/opennews/pics_base/0_1530858949.gif


++ cht.sh: Клиент для комадной строки


Сервис не требует инсталляции никакого дополнительного программного обеспечения
за исключением curl (или его альтернатив, таких как wget, httpie или fetch),
однако у него существует одноимённый клиент, cht.sh, который упрощает использование
сервиса и делает его использование более удобным:

    $ cht.sh python append file

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

    $ cht.sh --shell python
    python> append file
    ...
    python> generate random string
    ...
    python> parse json
    ...

В зкспериментальном режиме сервис поддерживает запросы и на других языках кроме английского:

    python> дописать файл
    python> скопировать файл
    python> переименовать файл
    python> рекурсивный обход каталога
    python> cd /lua
    lua> использовать внешнюю функцию
    lua> отсортировать таблицу
    js> cd /js
    js> асинхронное чтение файла

Все запросы, приведённые выше, произвольны (и все возвращают корректные ответы).

Сервис работает следующим образом: после получения запроса он пытается обработать его пользуясь
данными из доступных репозиториев шпаргалок, таких как tldr, cheat, learnxiny и так далее (а точнее,
их локальных копий, проиндексированных и находящихся в памяти, благодаря чему, в том числе,
достигается такая высокая скорость реакции). В простейших случаях, когда запросы односложны,
и являются, например, названием команд UNIX/Linux, этого оказывается достаточно.

Если же запрос обработать таким образом не удаётся, осуществляется поиск на внешних ресурсах
(в первую очередь stackoverflow.com и других сайтах stackexchange), и если подходящий ответ
найти удалось, он обрабатывается и возвращается пользователю. Код ответа форматируется,
как уже было сказано выше, таким образом, что текст в нём оформляется как комментарии,
код остаётся кодом, а внизу добавляется источник ответа, имя его автора и лицензия, по которой
он распространяется.

Если найденный для ответа вопрос не подходит, следующий можно посмотреть, добавив /номер после него:

    python> generate random string
    python> generate random string /1
    python> generate random string /2


Клиент cht.sh имеет предоставляет ряд других приятных возможностей, таких как:

* автопродолжение;
* история поиска;
* копирование в буфер обмена (C);

и ряда других (для просмотра нужно вызвать help в cht.sh).

Кроме этого к cheat.sh можно обращаться напрямую из текстового редактора.

Демонстрация: https://www.opennet.dev/opennews/pics_base/0_1530859122.gif


++ Доступ из редактора

Запросы к cheat.sh, а значит к StackOverflow и к прочим источникам информации, использующимся в cheat.sh,
можно отправлять напрямую из текстового редактора Vim или Emacs.

Для этого нужно установить дополнительные плагины (подробнее в cht.sh/:vim и в cht.sh/:emacs).

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

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

Традиционным решением было бы:

* открыть браузер,
* в нём — google,
* ввести "generate random string",
* получить ссылку на stackoverflow,
* перейти по ней,
* скопировать найденный ответ в буфер обмена,
* вставить его в редактор,
* подправить его под конкретную программу.

Вместо этого, используя плагин cheat.sh-vim:

* ввести запрос прямо в буфере редактора;
* нажать <leader>KP (или <leader>KB, или <leader>KK).

Ответ будет вставлен в код, показан в отдельном буфере редактора (<leader>KB)
или во внешнем пейджере (<leader>KK).

Демонстрация возможностей плагина: https://www.opennet.dev/opennews/pics_base/0_1530859160.gif

++ Альтернативные решения

Существуют альтернативные решения, которые позволяют достичь похожих результатов:

* tldr  — подсказки по командам UNIX/Linux;
* cheat — подсказкт по командам UNIX/Linux;
* how2  — поиск ответов на stackoverflow из командной строки;
* howdoi — поиск ответов на stackexchange из командной строки.

Все вышеназванные утилиты хорошо справляются с названными задачами.
При этом cheat.sh обладает рядом преимуществом в сравнении с каждой из них:

* Не требует инсталляции, может использоваться везде, где есть curl/wget/httpie или любой HTTP-клиент;
* Предоставляет доступ как к шпаргалкам, так и к ответам на вопросы;
* Намного быстрее чем how2 и howdoi;
* Комментирует пояснительный текст в ответах;
* Может использоваться для автоматических запросов;
* Не требует актуализации репозиториев шпаргалок (как в случае с tldr и cheat);
* Поддерживает запросы на разных языках, в том числе на русском;
* Интеграция с текстовыми редакторами Vim и Emacs;
* Поддерживает Tab-completion (для bash, zsh и fish).

Недостатки (на данный момент):

* Не может работать в оффлайн-режиме (tldr и cheat могут; howdoi и how2 тоже нет).


++ Ссылки

* https://github.com/chubin/cheat.sh    &n... главный репозиторий проекта
* https://github.com/dbeniamine/cheat.sh-vim   ... плагин для Vim
* https://github.com/davep/cheat-sh.el    ... плагин для Emacs

* https://twitter.com/igor_chubin     ... — твиттер главного разработчика проекта (используется для анонса существенных обновлений проектов и новых проектов)

Другие подобные проекты (подмножество функций cheat.sh):

* https://github.com/tldr-pages/tldr    &n... подсказки для командной строки
* https://github.com/chrisallenlane/cheat   &nb... — подсказки для командной строки
* https://github.com/adambard/learnxinyminutes-docs — краткие учебники по языкам программирования
* https://github.com/gleitz/howdoi    &nbs... поиск ответов на вопросы по языкам программирования из командной строки
* https://github.com/santinic/how2    &nbs... поиск ответов на вопросы по языкам программирования из командной строки

Сервисы для терминала:

* curl wttr.in  — погода из терминала
* curl rate.sx ; curl rate.sx/btc — курс валют и криптовалют из терминала
* curl qrenco.de — сервис для генерация QR-кода в терминале
* ix.io, sprunge.us, ptpb.pw, 0x0.st, clbin.com — Pastebin для терминала
* curl ifcfg.me, curl ip-addr.es и множество других — определение внешнего IP-адреса в терминале
* https://github.com/chubin/awesome-console-services/ — полный список сервисов для терминала

URL: https://github.com/chubin/cheat.sh
Обсуждается: http://www.opennet.dev/tips/info/3070.shtml

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

Оглавление

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


1. "Как получать ответы на вопросы по программирования прямо из ..."  +/
Сообщение от Аноним (1), 06-Июл-18, 10:21 
curl cheat.sh/npm/leftpad

Теперь если вдруг забудете, то ВСПОМНИТИ

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

3. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Alexander (ok), 06-Июл-18, 12:29 
$ curl cheat.sh/определение+внешнего+IP-адреса
Unknown topic.
Do you mean one of these topics may be?

    * reg-import 15
    * run-mailcap 15
    * scala/:main 15

$ curl cheat.sh/Pastebin+для+терминала
Unknown topic.
Do you mean one of these topics may be?

    * paste 37
    * update-rc.d 36
    * pbpaste 34

Недоработочка ;-)

Круто сервис, конечно. Спасибо!

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

4. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от igor_chubin (ok), 06-Июл-18, 12:52 
Такие запросы можно отправлять только для конкретного контекста (по крайней мере пока что).
Без указания контекста (языка программирования) можно указывать только односложные команды.

Попробуйте такие же запросы но с указанием контекста:

curl cheat.sh/python/определение+внешнего+IP-адреса
curl cheat.sh/bash/определение+внешнего+IP-адреса
curl cheat.sh/bash/Pastebin+для+терминала

Конечно, можно было бы всегда предполагать по умолчанию контекст bash, но это было бы не совсем правильно (потому что вы мысленно можете находиться в другом контесте, и тогда вы будете удивляться почему вам советуют такие ответы). То есть контекст введён намеренно и сознательно.

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

10. "Как получать ответы на вопросы по программированию прямо из ..."  –1 +/
Сообщение от pavlinux (ok), 07-Июл-18, 16:19 
Мальчеги, выдолб....

pavel@amd64:/tmp$ links https://www.google.ru/search?q='определение внешнего IP-адреса';
....

pavel@amd64:/tmp$ function google() { links "https://www.google.ru/search?q=$@"; };
pavel@amd64:/tmp$ google "определение внешнего IP-адреса"
....

Вместо links пихайте любую хрень для доставки HTML: lynx, curl, wget -O- | html2txt,....

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

11. "Как получать ответы на вопросы по программированию прямо из ..."  +1 +/
Сообщение от igor_chubin (ok), 07-Июл-18, 17:44 
Да ну, бросьте.

При всём уважении к вам, Pavlinux, на мой взгляд, вы тут категорически неправы.

То что предлагаете вы, это ещё хуже чем пользоваться графическим браузером. И единственное преимущество у вас в тут в том, что вы можете оставаться в консоли. Но дальше одним только минусы: медленно, неудобно, ненаглядно, никуда не интегрируется и так далее.

Сравните то, что предлагаете вы с тем, что предлагаем мы.

~~~
$ time curl cht.sh/bash/определение+внешнего+IP-адреса
# linux - Methods to detect public IP address in bash

curl ipinfo.io/ip

# Or

wget -qO- ipinfo.io/ip

# Or

lynx -source ipinfo.io/ip

# get public ip address (http://commandlinefu.com/commands/view/7368
# /get-you-pub)
#
# [Steven Penny] [so/q/14594151] [cc by-sa 3.0]

real    0m0.083s
user    0m0.008s
sys     0m0.000s
~~~

Готовый к использованию красиво отформатированный и откомментированный код,
полученный за 0.083s, с ссылками, указание авторства, лицензией и так далее.
Может быть напрямую получен из редактора.
Без необходимости установки html2txt, и тому подобного.

Предлагаемое решение с помощью google() по сути ничего не даёт, кроме того что
открывает поисковик google в links. Дальше нужно ходить и искать ответ как в обычном графическом браузере. Поиск на русском тоже сработает только если ответы есть на русском. А если нет?
Попробуйте поискать так на каком-то другом, менее распространённом языке,
или попробуйте поискать так что-то посложнее. Вы просто не найдёте ничего, потратите много времени на поиски.

Если по каким-то причинам вам не нравится cheat.sh, лучше тогда использовать howdoi или how2, которые тоже хорошо работают.

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

5. "Как получать ответы на вопросы по программированию прямо из ..."  +2 +/
Сообщение от Аноним (5), 06-Июл-18, 13:42 
Большое Вам спасибо за Ваш труд! Мне, как апологету CLI и нелюбителю раздутых современных браузеров, такое программное решение - как глоток воздуха.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. "Как получать ответы на вопросы по программированию прямо из ..."  +3 +/
Сообщение от igor_chubin (ok), 06-Июл-18, 15:44 
Истинно так!

И проблема даже не в том, что для того чтобы браузеру показать вам элементарную информацию типа текущего времени или погоды, или курса валюты, ему нужно загрузить кучу JS, CSS и HTML и потом всё это отрендерить, а в том, создатели сайтов в большинстве своём поставили своей задачей как можно на дольше вас привлечь и удержать, и они делают для этого всё возможное.

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

Соответственно, главной проблемой является,

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

2) во-вторых, не вы управляете своим вниманием, и соответственно тем о чём вы думаете, а некие внешние чуваки, соответственно косвенно получается так, что вы преследуете их интересы, а не свои (хорошо, если это win-win, а если нет?).

Последнее по сути означает, что браузер превращается в такой себе телевизор двадцать первого столетия, где роль зрителя, то есть пользователя сугубо пассивна (в отличие от веба на заре интернетостроения, скажем, даже в начале 2000х годов, не говоря уже о 90х). И браузер здесь даже в каком-то смысле опаснее чем телевизор, поскольку даёт значительно большее ощущение вовлечённости.
Вебдванольность даёт пользователю иллюзию сопричастности происходящему, иллюзию творческого процесса и иллюзию свободы. Пользователь пишет коммент, ставит где-то лайк или дислайк, и это — его вклад, "его борьба". "Он больше не тварь дрожащая, а право имеет". "Голоса в Интернете разговаривают со мной, и я им отвечаю. У нас диалог". В действительности, как вы прекрасно понимаете, никакого диалога нет, а свобода творчества у вебдванольного пользователя это свобода перемещения по аэропорту от зоны контроля безопасности к зоне паспортного контроля: хотите — идите по левой стороне коридора, хотите — по правой, а хотите — так можете и вообще постоять!

Вы можете возразить однако: "Но какое это имеет отношение к консольным сервисам? Ведь там всё то же самое, только информация представлена не в графическом, а в текстовом виде?". В общем-то это так, точнее почти так, но вот в этом "почти" всё и заключается.

Браузер это закрытая коробка, в которую вы хотя и можете залезть, но при нормальной эксплуатации этого не предполагается. Это телевизор. Вам сделали штуку — вы пользуйтесь и благодарите. Что-то поменять можете, но только в рамках предусмотренных производителем.

Консоль же — это ваша творческая мастерская, ваше творческое пространство, где всё остальное не более чем материал для вашего творчества. Хочу — беру консольный сервис, и соединяю его с другим, хочу — через grep пропускаю, хочу — запрашиваю те же данные в JSON, а если нет их, то и не страшно, распарсить всё равно работа двух секунд, и так далее.

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

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

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

7. "Как получать ответы на вопросы по программированию прямо из ..."  –1 +/
Сообщение от Онаним (?), 06-Июл-18, 21:12 
Отсыпь немного
Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Как получать ответы на вопросы по программированию прямо из ..."  +1 +/
Сообщение от igor_chubin (ok), 06-Июл-18, 22:20 
Мне кажется, что без этого вашего комментария в моей записи оставалась какая-то недосказанность, а вот сейчас всё стало просто отлично. Спасибо большое
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

45. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Michael Shigorinemail (ok), 15-Авг-18, 01:11 
На: http://www.wagner.pp.ru/~vitus/articles/user-friendly.html
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

33. "Как получать ответы на вопросы по программированию прямо из ..."  –1 +/
Сообщение от Аноним (33), 11-Июл-18, 06:36 
Странный опус, для когото компьютер = развлекаться, для кого-то работать, вэб уже стал заменой консоли, и выдавит ее, не сегодня, так завтра. Лично мне не нравятся железки/софт с онли-вэб, но таких все больше, и если в вэбе проще промазать по кнопке - например, когда правила фаервола прыгают в микротике, можно легко рубануть не то. То у консоли свои "особенности", скопирована строка с переносом строки или без. Но вэб оперирует структурированными данными, чего от грипа добится невозможно. При прочих равных, функционал одинаковый, скрипт на дерганье чего-то через консоль проще в разы, но правильный вэб-2.0 (с RESTful) не сильное усложнение, зато вытащить таблицу как таблицу, а не как html-месиво, которое распарсить 90% кода скрипта, который внезапно улетает за вторую тысячу строк.
Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

34. "Как получать ответы на вопросы по программированию прямо из ..."  +1 +/
Сообщение от igor_chubin (ok), 12-Июл-18, 02:35 
Я думаю, что вы ошибаетесь насчёт консоли, насчёт того, что веб её выдавит.

Моё мнение на этот счёт:

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

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

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

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

Вот вкратце, что я думаю об этом, и вот почему я считаю судьбу текста (а текст для меня = терминал + редактор) совершенно безоблачной.

Конечно, это не более чем моё мнение, и оно очень даже запросто может быть ошибочным.

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

35. "Как получать ответы на вопросы по программированию прямо из ..."  –1 +/
Сообщение от Аноним (33), 12-Июл-18, 04:57 
> у мыслящих людей текст является единственным прибежищем, соответственно они от него никак не откажутся, а будут всяческие его сохранять и развивать).

Ага, то-то на каждой первой железке консолька, то бэкспейс не умеет, то делет, а то и оба сразу.

> С появлением театра и кинематографа книги не исчезли

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

> Вот вкратце, что я думаю об этом, и вот почему я считаю судьбу текста (а текст для меня = терминал + редактор) совершенно безоблачной.

Сериализованные в текст структуры, это тоже текст, но грепать их уже не всегда можно, думаю придумают мутанта аля grep+xpath, и если на другом конце пайпы будет текстовый редактор, он будет уметь отображать дерево как дерево, но это уже не текст, это объекты ключ-значение, которые могут быть и в текстовом и бинарном представлении. Копирование такого объекта уже сейчас чаще перетаскивание во всяких студиях, а редактирование скорее правка параметра в поле ввода.

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

Но на наш век еще хватит, хорошо это или плохо.

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

46. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Michael Shigorinemail (ok), 15-Авг-18, 01:14 
> Но на наш век еще хватит, хорошо это или плохо.

Вы вообще ничего не поняли, "настрадамус".

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

9. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от pavlinux (ok), 07-Июл-18, 16:10 
man пробовали?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

12. "Как получать ответы на вопросы по программированию прямо из ..."  +1 +/
Сообщение от igor_chubin (ok), 07-Июл-18, 17:48 
> man пробовали?

Да

Как с помощью man ответить на вопросы по программированию?

Давайте возьмём какой-нибудь вопрос для примера.
Например, я хочу узнать как в

lua прочитать json

Какой man открывать и потом что там искать?

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

37. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от pavlinux (ok), 15-Июл-18, 02:54 
> Например, я хочу узнать как в
> lua прочитать json
> Какой man открывать и потом что там искать?

Это вопросы начинающих, а не программиста. А эти консоль уже не знают.

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

38. "Как получать ответы на вопросы по программированию прямо из ..."  +1 +/
Сообщение от igor_chubin (ok), 15-Июл-18, 05:09 
Да, так и есть, но только:

1) Можно хорошо разбираться в одном языке программирования, но быть начинающим в другом языке программирования, это довольно типичная ситуация;
2) Из всей консоли нужно знать только команду curl, что довпольно просто;
3) Собственно, с учётом, плагинов для редакторов даже и консоль знать не обязательно.

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

13. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Crazy Alex (ok), 08-Июл-18, 03:20 
А потом прилетит что-нибудь милое с ESC-последовательностями.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

14. "Как получать ответы на вопросы по программированию прямо из ..."  +1 +/
Сообщение от igor_chubin (ok), 08-Июл-18, 12:40 
Справедливое замечание. Спасибо.

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

https://unix.stackexchange.com/q/15101

Это касается, конечно, не только этого сервиса, но и в принципе использования команды curl, а так же cat, less -R и так далее, собственно любой, где у вас осуществляется вывод неких внешних данных на терминал (cheat.sh просто использует ANSI-последовательности по умолчанию и не скрывает этого, а другие нет, но это не означает, что они не могут их использовать).


Но в целом замечание очень справедливое, и мы предусмотрели несколько контрмер:

1) Для того чтобы полностью исключить опасность (как в этом, так и во всех остальных случаях), лучше всего удалять ANSI-последовательности из вывода:

curl -s https://cht.sh | sed -r 's/\x1b\[[0-9;]*m?//g'

или с помощью ansi2txt из пакета kbtin:

curl -s https://cht.sh | ansi2txt

2) Использовать https вместо http для того чтобы исключить возможность MITM-атак и внедрения ANSI-последовательностей в вывод.

3) Проинсталлировать cheat.sh у себя (cheat.sh это программа с открытым исходным кодом)
и или использовать https://cheat.sh в качестве аплинка (но рендеринг уже будет проводиться на вашей стороне, и вы в безопасности) или напрямую брать данные из источников (будет работать медленнее, но вы будете полностью независимы от центрального сервера cheat.sh).

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

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

15. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от aaaaaaaaaaaaaaaaaaaaaaaaaaaa (?), 08-Июл-18, 13:58 
Дополните пожалуйста ответом
http://cheat.sh/bash/офлайн+версия+cheat.sh+с+помощю+wget
если это реально...
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

17. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от igor_chubin (ok), 08-Июл-18, 14:20 
Не совсем понятно зачем тогда использовать wget, если это офлайн версия.
Или вы имеете в виде локальное зеркало?

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

https://github.com/chubin/cheat.sh/issues/14

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

19. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от aaaaaaaaaaaaaaaaaaaaaaaaaaaa (?), 08-Июл-18, 14:32 
>Не совсем понятно...

Если cheat.sh "Не может работать в оффлайн-режиме", в wget может делать локальные копии сайтов, то делитанство подсказывает, что возможно можно wget-ом создать офлайновую версию cheat.sh...

>Вообще, мы работаем...

Понял. Жду с нетерпением. Не всегда интернет под рукой...

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

20. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от igor_chubin (ok), 08-Июл-18, 14:43 
> Если cheat.sh "Не может работать в оффлайн-режиме", в wget может делать локальные
> копии сайтов, то делитанство подсказывает, что возможно можно wget-ом создать офлайновую
> версию cheat.sh...

Всё, теперь понятно, что имелось тут под "wget".

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

Дело в том, что тут так не получится сделать, потому что wget он просто идёт по ссылкам и рекурсивно вытаскивает страницы, создавая локальную копию сайта. Здесь гиперссылок в ответах вообще нет, соответственно wget не сможет рекурсивно обойти сайт и забрать контент, но это ещё полбеды,
теоретически можно было бы сделать так:

# условный код, потому что ещё нужно нормально обрабатывать страницы
# в подкаталогах, но идею вы поняли
curl cht.sh/:list | while read page; do
  curl "cht.sh/$page" > "$page"
done

Однако основная проблема тут в том, что так вы получите тут только страницы-шпаргалки,
а не динамически генерируемые ответы на вопросы (в которых и есть основная сила сервиса).
Если вам нужны одни только шпаргалки, то можно пока временно просто проинсталлировать tldr и cheat (не путать с cheat.sh) (ссылки в заметке).

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

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

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

16. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Аноним (16), 08-Июл-18, 14:20 
Раскраска вывода делает текст плохо читаемым на светлых темах.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

18. "Как получать ответы на вопросы по программированию прямо из ..."  +1 +/
Сообщение от igor_chubin (ok), 08-Июл-18, 14:31 
> Раскраска вывода делает текст плохо читаемым на светлых темах.

Да, это правда.

Вот здесь подробнее об этом:

https://github.com/chubin/cheat.sh/issues/5

Есть три способа временного решения данной проблемы:

1. Использовать опцию ?T для отключения раскраски:

curl cht.sh/python/zip+lists?T

2. Убирать ANSI-последовательности с помощью вышеописанных методов (если вы из соображений безопасности не выводите текст на консоль с помощью cat или curl):

curl cht.sh/python/zip+lists | sed -r 's/\x1b\[[0-9;]*m?//g'
curl cht.sh/python/zip+lists | ansi2txt # (из пакета kbtin)

3. Выбрать подходящую цветовую тему:

curl cht.sh/:styles-demo | less -R
curl cht.sh/python/zip+lists?style=autumn


Во всех случаях, конечно, лучше использовать клиент cht.sh (curl https://cht.sh/:cht.sh),
для того чтобы не дописывать каждый раз руками опции при запросах.
Тогда все опции один раз задаются в конфигурационном файле,
а вы потом просто вызываете:

cht.sh python zip lists

Использование клиента cht.sh имеет и множество других приятных возможностей по сравнению с использованием curl.

Ну и, конечно, (если вы пользователь vim) вы можете делать запросы напрямую из редактора
и получать ответы прямо в буфере (отдельном или текущем) или пейджере. Здесь цветовая гамма, естественно, будет вашей стандартной.

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

21. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Аноним (21), 08-Июл-18, 15:57 
Где можно подробнее узнать о конфигурационном файле? Тут - https://github.com/chubin/cheat.sh - не нашёл (может, просмотрел).
Ответить | Правка | ^ к родителю #18 | Наверх | Cообщить модератору

28. "Как получать ответы на вопросы по программированию прямо из ..."  +1 +/
Сообщение от igor_chubin (ok), 08-Июл-18, 22:22 
> Где можно подробнее узнать о конфигурационном файле? Тут - https://github.com/chubin/cheat.sh
> - не нашёл (может, просмотрел).

Да, там не было этого, я добавил.

Файл ~/.cht.sh/cht.sh.conf
Параметр называется QUERY_OPTIONS

То есть чтобы отключить раскраску:

~~~~
QUERY_OPTIONS="T"
~~~~

(и обновите, пожалуйста, клиент cht.sh, если вы его уже установили;
для этого выполните команду update режиме шелла или просто переустановите заново)

~~~~
$ cht.sh --shell
cht.sh> update
cht.sh is up to date. No update needed
cht.sh> ^D
$
~~~~

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

29. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Аноним (29), 08-Июл-18, 23:51 
Спасибо.
Ответить | Правка | ^ к родителю #28 | Наверх | Cообщить модератору

22. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Аноним (22), 08-Июл-18, 18:50 
Пожалуйста, рассмотрите возможность использования http://asciinema.org/ вместо гифок для создания текстовых скринкастов.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

23. "Как получать ответы на вопросы по программированию прямо из ..."  +1 +/
Сообщение от igor_chubin (ok), 08-Июл-18, 19:28 
Мы используем asciinema тоже, но гифки обладают тем преимуществом, что

1) они могут показываться в ленте твиттера и на гитхабе без перехода на сайт asciinema (для asciiname трансляций вам нужно сначала кликнуть по ней, чтобы её посмотреть, что останавливает многих пользователей);

2) в них можно показывать графические объекты, которые нельзя показывать в asciinema.

(если вы смотрели гифку про использование Vim-плагина, то вы видели такие графические объекты).

Я не знаю, обратилили ли вы внимание или нет, но гифки эти были созданы полностью автоматически, без участия человека, с помощью системы визуализации процесса работы в терминале (она будет опубликована в ближайшее время и пока что используется нами, мною и некоторыми другими разработчиками, только в тестовом режиме). То есть, никто на самом деле в терминале ничего не набирал и ничего не записывал. Так вот, эта система поддерживает ряд форматов вывода, GIF только один из которых; кроме того она поддерживает MP4, AVI, FLV, Asciinema и некоторые другие. Так что нам было бы несложно сгенерировать тот же вывод в Asciinema-формате (конечно же, графические элементы при этом пропадут).

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

24. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Аноним (22), 08-Июл-18, 19:46 
Понятно, спасибо.

>эта система поддерживает ряд форматов вывода, GIF только один из которых; кроме того она поддерживает MP4, AVI, FLV, Asciiname и некоторые другие

Это круто!

Правда, я не совсем понял, как именно это работает "без участия человека". То есть ей, грубо говоря, подается лог сессии терминала, и она на основании этого генерирует анимации печати и перемещения курсора - я уловил идею?

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

25. "Как получать ответы на вопросы по программированию прямо из ..."  +1 +/
Сообщение от igor_chubin (ok), 08-Июл-18, 20:26 
> Понятно, спасибо.
>>эта система поддерживает ряд форматов вывода, GIF только один из которых; кроме того она поддерживает MP4, AVI, FLV, Asciiname и некоторые другие
> Это круто!
> Правда, я не совсем понял, как именно это работает "без участия человека".
> То есть ей, грубо говоря, подается лог сессии терминала, и она
> на основании этого генерирует анимации печати и перемещения курсора - я
> уловил идею?

Да, почти, только ей передаётся не лог сессии терминала (потому что в том-то и идея, что никакой сессии терминала нет, потому что вы не набирали ничего в терминале, хотя впрочем это тоже было бы возможно, но это уже следующий шаг), а передаётся файл-сценарий (в нашей внутренней терминологии так называемый gifst файл, gifst это игра слов gif + gist; gist'ы на github'е вы знаете, это просто текстовые кусочки кода) состоящий из текста, который вводится в терминал, + специальных управляющих команд, которые описывают сцену и выполняют другие вспомогательные действия.

Например:

~~~~
g show intro.png
g sleep 10
g say-en Now I am editing a python file in Vim and making a cheat.sh query
g say-de Jetzt editiere ich eine python Datei in Vim. Dabei mache ich eine cheat.sh Anfrage
g say-ru Сейчас я редактирую некий Python-файл в Vim и делаю при этом запрос к cheat.sh
vi cheating.py
iappend file<[ Escape ]> KK<[ sleep 3 ]>q
g say-justify full
:q!
~~~~


Если вы мысленно уберёте строчки, начинающиеся с g (это метастрочки gifst'а, о которых я писал выше), то получится просто последовательность текста, которая вводится в виртуальный терминал (имитируя при этом ввод текста человеком с помощью случайных задержек между нажатиями и такого прочего): то есть открывается редактор, в нём переходим в режим вставки (i), набираем текст, нажимаем Esc (<[ ]> это специальные управляющие последовательности gifst, такие же как g-команды, только inline); нажимаем <leader>KK (в нашем случае это пробел KK), получаем описание как дописать в конец файла на Python; ждём 3 секунды; выходим из пейджера (q); выходим из Vim без сохранения.

Но это совмещается с g-командами, которые означают: показать сначала intro.png (там допустим какая-то интересная заставка), подождать 10 секунд, дальше происходит интересное:

сцена разделяется на три (которые в итоге сохраняются в трёх разных файлах, если необходимо, или в одном файле, если не поддерживается звук или если выбран только один язык), в каждой из которых голос за кадром говорит, что он делает (для этого по умолчанию используется генератор Amazon Polly, но можно использовать любой другой, хоть руками текст надиктовывать, тогда он берёт заранее подготовленные файлы с надиктованным текстом). При этом набирается текст.
Интересно, что скорость набора определяется тем, где стоит say-justify и значение после say-justify (left, right, center, full). Если full (как в нашем случае), то скорость набора подбирается исходя из скорости произнесения текста (звучит страшно, но на самом деле реализуется элементарно, потому что мы знаем количество нажатий и скольно длится звуковой фрагмент).

В итоге всё это дело собирается в единый файл или файлы с учётом поддерживаемых возможностей файла (MP4 или FLV или GIF поддерживают графику и звук; но из текстовых форматов, с другой стороны, можно копировать текст + показывать их в консоли; то есть тут нет единственно лучшего формата; собственно единственно лучший формат это gifst).

Вот, если вкратце, как оно работает

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

26. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Аноним (22), 08-Июл-18, 20:54 
Да, прикольно! Мощная штука у вас получилась.

>собственно единственно лучший формат это gifst

;)

И спасибо за подробное объяснение, было интересно читать. (Немного расширить, чуть-чуть подредактировать - и можно смело выкладывать в качестве анонса\введения. Короче, ждем релиза!)

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

27. "Как получать ответы на вопросы по программированию прямо из ..."  +2 +/
Сообщение от igor_chubin (ok), 08-Июл-18, 21:32 
> И спасибо за подробное объяснение, было интересно читать. (Немного расширить, чуть-чуть
> подредактировать - и можно смело выкладывать в качестве анонса\введения. Короче, ждем
> релиза!)

Немного многовато текста для анонса :)
Спасибо! Скоро зарелизим

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

30. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Michael Shigorinemail (ok), 09-Июл-18, 10:12 
Авторство заподозрил с первых строк ;-)
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

31. "Как получать ответы на вопросы по программированию прямо из ..."  +2 +/
Сообщение от igor_chubin (ok), 10-Июл-18, 00:17 
И ты не ошибся :)

Надеюсь, что сервис тебе понравился :)

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

32. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Алёша (?), 10-Июл-18, 10:08 
весьма полезный сервис.
хотелось бы еще подсказок из документаций по часто встречающимся серверам (демонам) и их конфигурациям - nginx, php.ini, httpd ну и так далее - все эти вещи есть онлайн.
а то сейчас nginx/limit_req выдает какой-то малополезный вопрос-ответ (со stackoverflow походу), а по limit_req_zone вообще ничиго не выдает, тогда как мог бы выдавать соответствующий раздел с оф.сайта и примеры...
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

39. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от igor_chubin (ok), 15-Июл-18, 05:18 
Да, правда. Справедливое замечание. Мы постараемся это сделать

(кстати nginx/limit_req_zone выдаёт ответ тоже, по-моему даже более-менее в тему, проверьте, пожалуйста, хотя официальная документация с примерами была бы лучше; и ещё, если вам ответ не нравится, то можно попробовать следующий добавив в конце /1, /2 и так далее)

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

36. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от robot228email (?), 13-Июл-18, 07:15 
Для Sublme Text есть решение?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

40. "Как получать ответы на вопросы по программированию прямо из ..."  +1 +/
Сообщение от igor_chubin (ok), 16-Июл-18, 12:27 
Мы работаем над ним, но пока оно не готово к релизу.
Пока что официально мы поддерживаем только Vim, Emacs и Visual Code.
Плагин для Sublime сейчас разрабатывается, и скоро будет доступен.
Основной репозиторий плагина:

https://github.com/gauravk-in/cheat.sh-sublime-plugin

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

41. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от mib (?), 19-Июл-18, 19:59 
Вы крутые. Спасибо вам :)
Ответить | Правка | ^ к родителю #40 | Наверх | Cообщить модератору

42. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от igor_chubin (ok), 20-Июл-18, 01:31 
На здоровье!
Ответить | Правка | ^ к родителю #41 | Наверх | Cообщить модератору

43. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Techno1 (?), 02-Авг-18, 16:11 
Не увидел примера запроса к stackoverflow при помощи curl cht.sh/...
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

44. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от igor_chubin (ok), 02-Авг-18, 22:00 
Почти любой запрос по языкам программирования обрабатывается в том числе
с помощью данных со StackOverflow.
Если ответ со StackOverflow будет (с точки зрения системы) наилучшим, она вернёт его.
В тексте ответа вы можете увидеть, откуда он взят
Ответить | Правка | ^ к родителю #43 | Наверх | Cообщить модератору

47. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Diomas (?), 21-Сен-18, 16:20 
В MINGW терминале не обрабатываются эскейп-последовательности (или как это назывется):

$ curl cht.sh/go/reverse+a+list
/*
 * How do I reverse an array in Go?
 * 
 * Honestly this one is simple enough that I'd just write it out like
 * this:
 */

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

48. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от igor_chubin (ok), 21-Сен-18, 17:54 
> В MINGW терминале не обрабатываются эскейп-последовательности (или как это назывется):

Да, это может быть.
Если вы будете добавлять опцию T в конце запроса, их в ответе не будет

curl cht.sh/go/reverse+a+list?T

Конечно, это не очень удобно всё время добавлять опцию.
Для этого вы можете установить клиент cht.sh (curl https://cht.sh/:cht.sh)
или сделать шелловскую функцию, как например how_in (пример вот тут: https://twitter.com/igor_chubin )

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

49. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от Michael (??), 14-Ноя-18, 14:06 
Для git ещё модуль не помешает, хоть и не язык программирования
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

50. "Как получать ответы на вопросы по программированию прямо из ..."  +1 +/
Сообщение от igor_chubin (ok), 14-Ноя-18, 23:00 
Вообще git работает, но только нужно комментарии лучше шелловские
и подсветку синтаксиса тоже. Сейчас сишная.

curl cht.sh/git/отменить+последний+коммит?Q

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

51. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от rvs2016 (ok), 27-Ноя-18, 23:01 
> Демонстрация возможностей плагина:
> https://www.opennet.dev/opennews/pics_base/0_1530859160.gif

А почему `...` является устаревшим, хотя я нго использую и интерпретатор меня за это не ругает?

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

52. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от igor_chubin (ok), 28-Ноя-18, 12:44 
Есть очень много устаревших и нерекомендованных вещей в интерпретаторе, которые просто работают и никак интерпретатором не комментируются, просто исполняются.
В первом приближении можно использовать shellcheck для статического анализа кода
и обнаружения таких мест.

Конкретно с `` проблема в том, что тут открывающая и закрывающая кавычка одинаковы,
поэтому нельзя делать вложенные обращения. То есть, если вы сделаете: `k1 `k2`` это будет восприматься не как $(k1 $(k2)) а как $(k1) k2 $(), что, конечно же, неправильно.

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

53. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от rvs2016 (ok), 28-Ноя-18, 16:14 
> Конкретно с `` проблема в том, что тут открывающая и закрывающая кавычка
> одинаковы, поэтому нельзя делать вложенные обращения.

Да... с вложенными обращениями проблему тоже имел. Приходилось вместо вложения делать предварительные вычисления нужных значений, а затем подставлять их внутрь ``. Надо попробовать конструкцию $() - работает ли она в "моём любимом шелле" (zsh). Если работает, то можно и применять. Конструкцию-то такую я видел в разных скриптах, но всегда считал её новомодной или специфичной для отдельных шеллов, поэтому никогда не применял её у себя - ну типа пусть будет более топорно (а не модно), зато надёжнее и совместимее. :-)

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

54. "Как получать ответы на вопросы по программированию прямо из ..."  +/
Сообщение от igor_chubin (ok), 28-Ноя-18, 16:44 
Конечно же работает

А вообще я вам очень рекомендую shellcheck (и желательно подключить его к вашем любимому редактору через соответствующий плагин; например, если вы используете Vim — через syntastic).
Вы будете писать тогда намного более качественный код + существенно расширите свои знания.
shellcheck'у вы так же можете указать какой конкретно диалект вы сейчас используете,
и вы будете всегда видеть, в каких шеллах будет работать ваш код, а в каких нет

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

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

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




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

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