Pull to refresh

Comments 88

До json популярным был формат xml. Однако сообщество не торопилось принимать на вооружение xml для передачи данных через потоки ввода/вывода. Может и сейчас не стоит торопиться нагружать код всех утилит генераторами и парсерами json?

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

lsblk(1).

Что json, что xml, оба так себе подходят для потоковой передачи. Точнее совсем никак не подходят. Хотя костыли есть.

Конечно, должно быть все в Yaml

Вы не правы, как и все в интернете! CSV спасёт отца русской демократии! :-)

Далеко не всегда имеется смысл в именно потоковой передаче.
Опять же, ничто не мешает передавать ответ не одним json-ом, а несколькими, каждый в отдельной строке.

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

Ну да, не всегда. Но чаще чем кажется. И бенефиты дает дополнительные.
Далеко не всегда имеется смысл в именно потоковой передаче.

понимаете в чём проблема, сегодня вы делаете некий формат, который должен заменить текст. завтра вам придётся вдруг передать от процесса к процессу больше информации, чем помещается в ОП, а утилиты будут уже использовать этот формат.
у grep/sed/awk и прочих олдскульных утилит нет проблем с обработкой гигантских потоков данных, а с xml/json будут.

Вы в курсе sax xml? Именно, для потоков и никаких проблем

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


P. S. я не пытаюсь сказать, что plain text — наше всё и пытающиеся придумать что-то другое должны быть сожжены за ересь. я лишь говорю, что надо хорошенько подумать. картинку про новый стандарт все помнят, думаю.

А вот помогите дураку, почему нельзя передавать какой-нибудь https://en.wikipedia.org/wiki/Media_type а потом blob этого типа? Есть уже наверное такой мета-стандарт передачи ... в интернете используется ) Потоковая передача - кушаем blob пока не встретится следующий media type заголовок. Ну это я от фонаря сморозил, наверняка много-более-ученые умы об этом уже чесались как-то особо правильно ...

ну хотя бы потому, что хочется сохранить человекочитаемость.
конечно, она может быть сохранена и с блобами, но уже потребуется некоторая инфраструктура.

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

Если нужен поток объектов JSON то просто закрываешь один и открываешь другой. В том же Go json.Decoder парсит такой поток из коробки.

А если нужно передать просто большой объект то тут уже да, только атомарно.

Но те же проблемы и с обычным текстом, когда для парсинга необходим контекст из предыдущих строк.

UFO just landed and posted this here
А ведь нет никакой проблемы сконвертировать XML в JSON. Возьмите любой формат структурированных данных и вы скорее всего без потерь транслируете его в другой формат. Если у вас есть middleware слой, который понимает в каком формате поступают данные (ну тот же шебанг, это же юникс-вей, правильно?) и в каком они ожидаются на входе другого процесса, то для функционирования системы достаточно иметь парсеры соответствующих форматов. Какие проблемы?
Однако сообщество не торопилось принимать на вооружение xml для передачи данных через потоки ввода/вывода.

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

"Не торопились" но двигались. Вот вам пример: Subversion предусматриала вывод в XML формате. Однако в массах XML-вывод остался не востребован.

UFO just landed and posted this here
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Яблоки</h:td>
<h:td>Бананы</h:td>
</h:tr>
</h:table>

<f:table xmlns:f="http://www.w3schools.com/furniture">
<f:name>Африканский кофейный столик</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>



{
"root": {
"h:table": {
"-xmlns:h": "http://www.w3.org/TR/html4/",
"h:tr": {
"h:td": [
"Яблоки",
"Бананы"
]
}
},
"f:table": {
"-xmlns:f": "http://www.w3schools.com/furniture",
"f:name": "Африканский кофейный столик",
"f:width": "80",
"f:length": "120"
}
},
}

Автоматизированная тулза кушающая произвольный XML вам такой JSON не выдаст. А даже если вы и навставляете костылей, чтобы генерировалось именно это - обрабатывать такой JSON будет настоящим адом, ибо малейшее изменение XML будет серьёзно менять структуру JSON.

ибо малейшее изменение XML будет серьёзно менять структуру JSON

покажите пример, как малейшее изменение в XML приводит к серьезным изменениям в JSON
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Яблоки</h:td>
<h:td>Бананы</h:td>
</h:tr>
</h:table>
{
  "h:table": {
    "-xmlns:h": "http://www.w3.org/TR/html4/",
    "h:tr": {
      "h:td": [
        "Яблоки",
        "Бананы"
      ]
    }
  },
  "#omit-xml-declaration": "yes"
}
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Яблоки</h:td>
</h:tr>
</h:table>
{
  "h:table": {
    "-xmlns:h": "http://www.w3.org/TR/html4/",
    "h:tr": {
      "h:td": "Яблоки"
    }
  },
  "#omit-xml-declaration": "yes"
}
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Яблоки<br/></h:td>
</h:tr>
</h:table>
{
  "h:table": {
    "-xmlns:h": "http://www.w3.org/TR/html4/",
    "h:tr": {
      "h:td": {
        "#text": "Яблоки",
        "br": {
          "-self-closing": "true"
        }
      }
    }
  },
  "#omit-xml-declaration": "yes"
}
и я не вижу проблемы ни в одном из примеров

Ну что поделать. Когда начнёте писать код обработки этого джейсона - увидите.

А зачем, собственно, конвертировать из одного формата в другой? Программа выдала результат в XML — обрабатываете XML. Программа выдала результат в JSON — обрабатываете JSON.

XML гораздо богаче, чем JSON. Взять те же комментарии. Так что автоматически любой XML преобразовать в JSON невозможно.

XML гораздо богаче, чем JSON

ну да, можно сделать


<computer>
    <motherboard>ASUS XE3</motherboard>
</computer>

а можно


<computer motherboard="ASUS XE3" />

Нет. эти xml не эквивалентны. Хотя иногда сериализуются/десериализуются одинаково. А ещё комментарии, пространства имён, CDATA и вагон чего ещё.

Нет. эти xml не эквивалентны

так про то и речь, видимо, намёк был слишком тонким )

Это еще не совсем XXI век. Лучше строго-типизированное двоичное представление. Отказ от многих вариантов вывода, а использовать отдельные программы для парсинга и вывода (в таблички, в джсон итп). Ой, мы изобрели power shell.


Но и это ещё не всё. Все эти инструменты командной строки остались в основном в области администрирования либо используются разработчиками под *nix. Большинство пользовательских программ — страшные монолиты. Вот если применить UNIX-way там каким-то образом, то это было бы точно на уровне XXI века.

>страшные монолиты
Ну почему сразу только страшные и только монолиты? Построение программ из компонентов, которые решают каждый свою задачу, обмениваясь данными по стандартным протоколам… Ой, мы изобрели SOA? Или микросервисы? И таки да, типизированные протоколы обмена, когда компоненты обмениваются не текстом без структуры через пайпы, а типизированными сообщениями скажем через кафку — вот это, вообще говоря, и является типичным для 21 века. И как это сделать из монолита — примерно понятно. Юникс вей правда к этому за уши притягивать не имеет смысла.

Личная просьба. А давайте строго-типизированное двоичное представление будет не в XXI, а в XXII веке, чтобы я гарантированно не дожил до этого счастья.

$ ifconfig ens33 | grep inet | awk '{print $2}' | cut -d/ -f1 | head -n 1

ifconfig ens33 | awk '/inet / {print $2}'

Вот да! Тоже люблю авку, для парсинга и обработки многоколоночного вывода!

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

Скорее: безопасно использовать исключительно литанские буквы и цифры. Всё остальное - хождение по минному полю.

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

Попробуйте

$ echo "a b c,d e f" | awk 'BEGIN{FS=","};{print $2}'

Или

$ echo "a b c,d e f" | awk -F ',' '{print $2}'

Или Вы о чём-то другом?

Я о ситуации, когда символ-разделитель может встречаться и в значении.
Например, имена файлов с пробелами.

JSON не самый лучший выбор для этих целей. Тут я рассказывал про более подходящий формат. Вот пример оттуда:

> git log

commit
	message \$mol_style: TS@3.9 compatibility
	sha \b1a8f07c839604d0d34430a186246f0c1f71e628
	date \2020-05-15T23:24:32+0300
	author \nin-jin <jin@example.org>
commit
	message \$mol_regexp: concurent parse ability
	sha \be1abfa50542728dd5c156517ea31f469e7fb4d4
	date \2020-05-15T23:03:30+0300
	author \nin-jin <jin@example.org>

> git log | pick date message | table

\2020-05-15T23:24:32+0300	$mol_style: TS@3.9 compatibility
\2020-05-15T23:03:30+0300	$mol_regexp: concurent parse ability

Вам бы курсы личностного роста вести с таким скилом "не забивать" =)

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

А чем это принципиально отличается от того же Yaml?

Там по ссылке статья, всё это разъясняющая.

Идея Unix-way хорошая, но как ее соотнести со сложнейшим современным софтом? Да с тем же Офисом, Фотошопом, различными средами разработки, проектирования, конструирования и т.п.?
Насколько имеет смысл ограничиваться консолью и текстовым форматом (пусть и в JSON)? Не имеет ли смысл пересмотреть концепцию на более глубоком уровне, допустив, что у программ могут быть не только текстовые входы и выходы?

только тот же офис в результате ушёл от бинарных форматов хранения документов.

Это несущественно, там xml, который вы руками править точно не будете. Вполне можно было использовать какой-нибудь бинарный аналог. В конечном итоге «текстовость» и «бинарность» — лишь ограничение на множество байт, которые могут быть использованы в файле.
Дело ведь не в формате, а в том, что всё связывание программ и организация потоков данных осуществляется через командную строку консоли. Когда-то у Microsoft была задумка — COM-объекты, ActiveX, встраивание одних документов и программ в другие… Но в конечном итоге оно пошло куда-то не туда, возможно технология была слишком сложной, или ей чего-то не хватало.
Но в конечном итоге оно пошло куда-то не туда, возможно технология была слишком сложной, или ей чего-то не хватало.

так про это и речь, de facto простые текстовые протоколы победили.

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

там xml, который вы руками править точно не будете

Как раз-таки правил пару раз этот XML, чтобы зачинить баги форматирования в большом документе. И сделать это было глобально проще, чем писать парсер бинарного формата.

Мне как-то доводилось работать с xlsx документом почти мегабайтного размера, что довольно существенно тормозило, при этом казалось что данных в нём всего ничего. Заглянул внутрь файла, в xml, и оказалось, что в нём объявлены какие-то адские тысячи невидимых объектов.

Я их удалил sed'ом. Из xml.

А зачем переделывать существующее программное обеспечение, если сам автор, по его словам, уже написал инструмент для унификации вывода? Разве не будет Unix-way, так и оставить, существующее ПО делает свою работу, а программа автора заниматься унификацией вывода?

Ну он сделал только половину работы. Теперь надо сделать так, чтобы json можно было подать на вход другой программе. То есть надо написать еще и обратный преобразователь:)

Всякие "обычные"/"стандартные" утилиты Unix/Linux предназначены в первую очередь для человека, сидящего перед терминалом. Формат JSON всем прекрасен, кроме того, что он не удобен для чтения человеком. Зачем превращать интрумент из того, для чего он предназначен, в то, для чего он не предназначен?

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

JSON вполне читаем человеком, по крайней мере он точно не хуже XML

Особенно многострочный текст в нём такой читаемый..

Предлагается опционально выводить в JSON же, с флагом.

А так можно было бы и YAML, он вполне читабелен и взаимозаменяем с JSON

Если json делать по-человечески , он вполне читаем.

Если же делать, как например, внутри сэйвов Pathfinder'a, то это лютый трэшак.

Вы, мне кажется, путаете вопрос структуры данных и их отображения. Если у вас есть просто плоский текст без разметки, то у вас есть единственный способ представить эти данные. Если же это не просто текст, а именно данные структурированные тем или иным способом, то вы можете отобразить эти данные миллионом способов, в том числе в виде плоского текста, если вам так нравится.
Вот из этого
{"ip": "127.0.0.1",
"port": 6000,
"flags": ["a", "b", "c"]
}

фигня вопрос сделать вот это
127.0.0.1:6000 a,b,c

а наоборот — нет. Не проблема отобразить данные в удобном для человека виде. Проблема в обратном — чтобы преобразовать данные скриптом, вам надо распарсить текст в некоторое структурированное представление. И вот тут непонятно, почему бы их сразу и не отправлять в удобном для парсинга виде.
В комментариях массово не понимают что-такое unix way.
Программы — мелкие и совершенные (совершенные в прямом смысле слова, если залезть в исходники — часто последнее изменение случилось 20 лет назад).
Программист/админ не пишет программу «чуть лучше чем было», а строит «трубопровод» — скрипт где мелкие программы передают параметры друг другу. Это позволяет быстро потом разобраться другому программисту. Быстро изменить что-то из этих стандартных кирпичей.
«Написать на Питоне» часто не выйдет, просто потому что Питон не включен в стандарт Posix. Это невозможно, например, на слабых встраиваемых решениях с 8МБ памяти. А unix way это про универсальное решение для любых машин.
Также вся система представляет собой «трубопроводы» из стандартных кирпичей — наборы скриптов.
Всё это позволило системе выжить, стабилизироваться и влезть в телефоны, суперкомпьютеры, сервера и игровые приставки.

GUI не входит в стандарт POSIX. Речь идет о системном программировании. Здесь гуй не нужен и даже вреден. Исходники ядра Линукса не открывают в IDE, особенно если целевая платформа за тысячи километров с плохой связью.
Программы — мелкие и совершенные
Это уже давно не так — почитайте статью про разрастание числа параметров в стандартных утилитах. Во многом это происходит именно из-за того, что в качестве формата взаимодействия используется неструктурированный текст.

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

А завоевать рынок позволила, скорее всего, открытость — для многих технологических компаний создавать систему полностью с нуля неподъемно дорого, основываться на решениях конкурентов небезопасно, поэтому единственным рабочим вариантом остается open source.

А завоевать рынок позволила, скорее всего, открытость — для многих технологических компаний создавать систему полностью с нуля неподъемно дорого, основываться на решениях конкурентов небезопасно, поэтому единственным рабочим вариантом остается open source.

Глупости. До появления open source юниксы вполне себе завоевывали рынок, будучи коммерческими. И технологические компании вполне себе строили свои Unix like системы с нуля.

Мы с вами про разные эпохи говорим — коммерческие юниксы были актуальны лет 30 назад.

Ну если бы юниксы не завоевали популярность и не доказали состоятельность юниксового подхода, никто не стал бы делать опенсорсную версию "типа юникса"

Кстати, не 30, а гораздо меньше. Солярис был актуален для больших машин в энтерпрайзе еще лет 10 назад и линукс был довольно слабой альтернативой.

«Написать на Питоне» часто не выйдет, просто потому что Питон не включен в стандарт Posix. Это невозможно, например, на слабых встраиваемых решениях с 8МБ памяти.

MicroPython работает даже с 16KB памяти.

MicroPython отличается от полноценного пайтона, примерно так же, как JavaME от полноценного рантайма. Вы-б ещё BusyBox с полноценными core/linux/find-utils сравнили.

В топике речь про продвинутые шелл-скрипты, а не про Django и Pandas.
Для продвинутых шелл-скриптов возможностей MicroPython хватает с запасом.

Подождите, но любая программа тоже "трубопровод" из совершенных кирпичиков стандартных лексем "if", "switch" и базовых элементов стандартной библиотеки типа "Math.Cos". И за последние 20 лет наработки в области читабельности сделали огромнейший шаг вперёд. А вот в этом unix-way сложность понимая растёт буквально экспоненциально с увеличением размера скрипта.

у разработчиков UNIX был нищебродский компьютер PDP-11. Под ось, если не ошибаюсь они выделили 8k, а для программ 4k — 18битных слов. То есть 9 кБ. Вот откуда вся философия в первую очередь.
То есть ты можешь дергать системные функции как printf либо твоя программа должна умещаться в эти 9 кБ. Память была на тороидальных трансформаторах. Дисплея также не было, все через телетайп.
Когда придумали скрипты — вышло отлично — каждый вызываемый кирпич после себя освобождает память полностью.
Вторая проблема — нет интернета, нет стековерфлоу. Документации также нет. Вся документация это man и на крайний случай исходники. В сложных монструозных проектах тяжело разбираться.

Гугл пишет свои системы сборки на питоне или java, это хорошо, я этим с удовольствием пользуюсь. Но представьте что вам нужно починить компьютер в закрытом заведении. Вы даже не знаете что за версия там. Нет интернета. В POSIX-системах это не проблема. По стандарту там есть gcc, bash, vi и man — вся документация. Этого достаточно. Интернет не нужен чтобы искать документацию на конкретные версии, все уже там, инструменты также там. Программы короткие и простые. Совершенные) Разобраться также будет не сложно.

В вашем же случае, в случае нестандарта, окажется что исходников нет, а если нет, то нет компилятора. Если компилятор есть, то нужно отдельно искать документацию и так далее.
Любой стандарт не только зло, но и добро. А POSIX это стандарт. Конечно, сейчас уже мало кто кладет в систему Фортран, который требуется по-стандарту, но представьте что сейчас в 2021 году не представит труда починить какой-то unix-сервер из 1990 года, когда вендор может уже разорился.

Так о том и речь. Что переносить философию Unix в 21 век совершенно бессмысленно. Интерпретатор питона работает даже под 98 виндой. Поставить его просто (а с практически любым пакетным менеджером - очень просто) или вообще можно принести в виде portable. И он уже давно поставляется в базе практически любого дистрибутива. То же самое касается и java.

Posix это стандарт. Величайшее достижение человечества. Одну и ту же программу можно пересобрать под игровую приставку, телефон, суперкомпьютер и тучи эмбеддед железок. С Питоном так не выйдет, потому что в стандарт не входит.
Не, ну большинство языков программирования внезапно транслируются в Си-код, а этот код потом собирает Си-компилятор. Который также детище unix.
Питоновские библиотеки также часто написаны на Си и верхний уровень только дергает их. Сам питон тоже конечно можно пересобрать.
Мир не ограничен десктопом. Большинство выпускаемого железа это вообще не десктоп, а всякие роутеры, автомобильные компьютеры и прочее прочее. Там Питон это не то что идет в продакшн, а только для быстрого прототипирования.
С Питоном так не выйдет, потому что в стандарт не входит.

Почему? Интерпретатор Python — это же обычное приложение, которое будет работать на любой POSIX-совместимой ОС. В свою очередь, Python также предоставляет некоторый стандартный функционал.


Не, ну большинство языков программирования внезапно транслируются в Си-код, а этот код потом собирает Си-компилятор.

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

Ну поставьте питон на мой, не сильно свежий, асусовский роутер под OpenWRT. Я вам скажу сразу. У вас не получится. Там просто не хватает места на накопителе, под такие шалости. Поэтому и ансибль приходится применять к нему в виде модуля shell.

Ну на linux смартфонах Nokia N9 и особенно на Nokia N900, питон очень активно использовался как для написания софта, так и для всякой околосистемщины Так что не всё так однозначно © Опять-же, если вспомнить пакетный менеджер yum...

Ну раз заговорили про 98-ю винду... Не далее как сегодня, у человека у которого в хозяйстве энное количество AIX-ов, на IBM Power... Вообщем Python там ставится отдельно и он далеко не 3.x ветки... И лежит по нестандартному пути. Поэтому ansible берёт и обламывается. Пришлось костылить, через POSIX утилиту, кстати, ansible_python_interpreter=/usr/bin/env python в инвентори. И оно работает! Но опять-же, тот-же sh есть чуть менее чем везде.

Как Вы пишите, JSON появился в 2013 году, однако я с ним работал уже в 2010.

Работал с ним в 2008, а история гласит, что появился он и вовсе в 2001. А вот стандарт, да, был принят в 2013. Но это же рувдс, у них от автора к автору качествео вычитки скачет.

У json есть фатальный недостаток - отсутствия поддержки бинарных данных.

uuencode, uudecode в помощь, накладные для процессора не ощущаются, ну чуть больше памяти сожрет, не критично.

$ lsblk --help | grep json

-J, --json использовать для вывода формат JSON

$ lsblk --version

lsblk из util-linux 2.37.2

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

The ip command is the future of network config commands. ifconfig has been officially deprecated for the ip suite, so while many of us are still using the old ways, it is time to put those habits to rest and move on with the world.

а далее что human is depricated?

А вот ip route, не выводящий JSON, даже с флагом -j:

> ip -V
ip utility, iproute2-5.13.0

> ip -j route
[{"dst":"default","gateway":"192.168.5.1","dev":"enp37s0","protocol":"dhcp","metric":100,"flags":[]},{"dst":"192.168.5.0/24","dev":"enp37s0","protocol":"kernel","scope":"link","prefsrc":"192.168.5.102","metric":100,"flags":[]}]

Выглядит так, как будто автор не знает о существовании powershell для Linux. В нём и JSON гонять можно и конвееры человеческие писать. Вот это, действительно, решение 21-го века!

А ничего, что PowerShell под Linux имеет урезанный функционал и даже не входит в официальные репозитории?

Selinux, auditctl предельно некомфортные для работы программы. Думаю из за бинарности, нечитаемости. Они не настолько сложные, что бы быть настолько отвратительными, в прямом понимании. По любви с ними никто не имеет дела.

Инструмент хороший, спасибо.

Но почему python, а не бинарник? Это сильно ограничивает возможности использования, ведь не везде есть python.

Sign up to leave a comment.