0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд

jq Manual (development version)

A jq program is a «filter»: it takes an input, and produces an output. There are a lot of builtin filters for extracting a particular field of an object, or converting a number to a string, or various other standard tasks.

Filters can be combined in various ways — you can pipe the output of one filter into another filter, or collect the output of a filter into an array.

Some filters produce multiple results, for instance there’s one that produces all the elements of its input array. Piping that filter into a second runs the second filter for each element of the array. Generally, things that would be done with loops and iteration in other languages are just done by gluing filters together in jq.

It’s important to remember that every filter has an input and an output. Even literals like «hello» or 42 are filters — they take an input but always produce the same literal as output. Operations that combine two filters, like addition, generally feed the same input to both and combine the results. So, you can implement an averaging filter as add / length — feeding the input array both to the add filter and the length filter and then performing the division.

But that’s getting ahead of ourselves. 🙂 Let’s start with something simpler:

Invoking jq

jq filters run on a stream of JSON data. The input to jq is parsed as a sequence of whitespace-separated JSON values which are passed through the provided filter one at a time. The output(s) of the filter are written to standard out, again as a sequence of whitespace-separated JSON data.

Note: it is important to mind the shell’s quoting rules. As a general rule it’s best to always quote (with single-quote characters) the jq program, as too many characters with special meaning to jq are also shell meta-characters. For example, jq «foo» will fail on most Unix shells because that will be the same as jq foo , which will generally fail because foo is not defined . When using the Windows command shell (cmd.exe) it’s best to use double quotes around your jq program when given on the command-line (instead of the -f program-file option), but then double-quotes in the jq program need backslash escaping.

You can affect how jq reads and writes its input and output using some command-line options:

Output the jq version and exit with zero.

Use the application/json-seq MIME type scheme for separating JSON texts in jq’s input and output. This means that an ASCII RS (record separator) character is printed before each value on output and an ASCII LF (line feed) is printed after every output. Input JSON texts that fail to parse are ignored (but warned about), discarding all subsequent input until the next RS. This mode also parses the output of jq without the —seq option.

Parse the input in streaming fashion, outputting arrays of path and leaf values (scalars and empty arrays or empty objects). For example, «a» becomes [[],»a»] , and [[],»a»,[«b»]] becomes [[0],[]] , [[1],»a»] , and [[1,0],»b»] .

This is useful for processing very large inputs. Use this in conjunction with filtering and the reduce and foreach syntax to reduce large inputs incrementally.

Instead of running the filter for each JSON object in the input, read the entire input stream into a large array and run the filter just once.

Don’t parse the input as JSON. Instead, each line of text is passed to the filter as a string. If combined with —slurp , then the entire input is passed to the filter as a single long string.

Don’t read any input at all! Instead, the filter is run once using null as the input. This is useful when using jq as a simple calculator or to construct JSON data from scratch.

By default, jq pretty-prints JSON output. Using this option will result in more compact output by instead putting each JSON object on a single line.

Use a tab for each indentation level instead of two spaces.

Use the given number of spaces (no more than 7) for indentation.

  • —color-output / -C and —monochrome-output / -M :

By default, jq outputs colored JSON if writing to a terminal. You can force it to produce color even if writing to a pipe or a file using -C , and disable color with -M .

Colors can be configured with the JQ_COLORS environment variable (see below).

Windows users using WSL, MSYS2, or Cygwin, should use this option when using a native jq.exe, otherwise jq will turn newlines (LFs) into carriage-return-then-newline (CRLF).

jq usually outputs non-ASCII Unicode codepoints as UTF-8, even if the input specified them as escape sequences (like «u03bc»). Using this option, you can force jq to produce pure ASCII output with every non-ASCII character replaced with the equivalent escape sequence.

Flush the output after each JSON object is printed (useful if you’re piping a slow data source into jq and piping jq’s output elsewhere).

Output the fields of each object with the keys in sorted order.

With this option, if the filter’s result is a string then it will be written directly to standard output rather than being formatted as a JSON string with quotes. This can be useful for making jq filters talk to non-JSON-based systems.

Like -r but jq won’t print a newline after each output.

Like -r but jq will print NUL instead of newline after each output. This can be useful when the values being output can contain newlines.

  • -f filename / —from-file filename :

Read filter from the file rather than from a command line, like awk’s -f option. You can also use ‘#’ to make comments.

Prepend directory to the search list for modules. If this option is used then no builtin search list is used. See the section on modules below.

Sets the exit status of jq to 0 if the last output values was neither false nor null , 1 if the last output value was either false or null , or 4 if no valid result was ever produced. Normally jq exits with 2 if there was any usage problem or system error, 3 if there was a jq program compile error, or 0 if the jq program ran.

Another way to set the exit status is with the halt_error builtin function.

This option passes a value to the jq program as a predefined variable. If you run jq with —arg foo bar , then $foo is available in the program and has the value «bar» . Note that value will be treated as a string, so —arg foo 123 will bind $foo to «123» .

Named arguments are also available to the jq program as $ARGS.named .

This option passes a JSON-encoded value to the jq program as a predefined variable. If you run jq with —argjson foo 123 , then $foo is available in the program and has the value 123 .

  • —slurpfile variable-name filename :

This option reads all the JSON texts in the named file and binds an array of the parsed JSON values to the given global variable. If you run jq with —slurpfile foo bar , then $foo is available in the program and has an array whose elements correspond to the texts in the file named bar .

  • —rawfile variable-name filename :

This option reads in the named file and binds its contents to the given global variable. If you run jq with —rawfile foo bar , then $foo is available in the program and has a string whose contents are to the texs in the file named bar .

  • —argfile variable-name filename :

Do not use. Use —slurpfile instead.

(This option is like —slurpfile , but when the file has just one text, then that is used, else an array of texts is used as in —slurpfile .)

Remaining arguments are positional string arguments. These are available to the jq program as $ARGS.positional[] .

Remaining arguments are positional JSON text arguments. These are available to the jq program as $ARGS.positional[] .

Runs the tests in the given file or standard input. This must be the last option given and does not honor all preceding options. The input consists of comment lines, empty lines, and program lines followed by one input line, as many lines of output as are expected (one per output), and a terminating empty line. Compilation failure tests start with a line containing only «%%FAIL», then a line containing the program to compile, then a line containing an error message to compare to the actual.

Be warned that this option can change backwards-incompatibly.

Basic filters

Identity: .

The absolute simplest filter is . . This is a filter that takes its input and produces it unchanged as output. That is, this is the identity operator.

Since jq by default pretty-prints all output, this trivial program can be a useful way of formatting JSON output from, say, curl .

Переназначение кнопок мыши в linux. — Мысли злого плебея — ЖЖ

29 июл 2017

10:07 pm — Переназначение кнопок мыши в linux.

В windows такой фокус не предусмотрен. Там это делается сторонними программами, например X-Mouse Button Control, которые реализуют фильтр сообщений от мыши.
В Linux есть три способа для этого:
-внешний фильтр xbindkeys;
-переназначения порядка кнопок в xmodmap;
-переназначение порядка кнопок в xinput.

В linux кнопки мыши идут под номерами от 1 до 9 или 32, в источниках по разному пишут: судя по выхлопу xkbcomp их 9, xmodmap пишет про 20, а в документации evdev пишут про 32.
Их назначение.

Какой номер имеет каждая физическая кнопка мыши определяется командой: «xev | grep -A2 —line-buffered ‘^ButtonPress’ | sed -nE ‘/button /s/^.*(button[[:space:]]+[[:digit:]]+).* $/1/ p’«.

Для переопределения кнопок мыши может понадобиться определение ее имени.
Для получения имени мыши весящей на отдельном гнезде, необходимо выполнить команду «grep -E «Name=|Handlers» /proc/bus/input/devices | grep -EB1 ‘Handlers.*mouse’ | sed -nE ‘/Name=/,/Handlers=.*mouse/ ‘«.
Если в гнезде висит мышь с клавиатурой, например комплект из беспроводной мыши и клавиатуры, то надо выполнить команду «grep -E «Name=|Handlers» /proc/bus/input/devices | grep -EB1 ‘Handlers.*mouse’ | grep -EB1 ‘Handlers.*kbd’ | sed -nE ‘s/^.*Name=[«]([^»]+)[«].*$/1/p’«.
Вывод имен мышей сидящих в отдельном гнезде или с клавиатурой:»grep -E «Name=|Handlers» /proc/bus/input/devices | grep -EB1 ‘Handlers.*mouse’ | sed -nE ‘s/^.*Name=[«]([^»]+)[«].*$/1/p’«.
Для вывода имени мыши содержащей какую-то последовательность символов, надо предыдущие команды дополнить окончанием похожим на » | grep ‘Logitech M'»,где «Logitech M» может быть любой требуемой строкой.

Тогда получится что-то такое: «grep -E «Name=|Handlers» /proc/bus/input/devices | grep -EB1 ‘Handlers.*mouse’ | sed -nE ‘/Name=/,/Handlers=.*mouse/ ‘ | grep «Logitech M»«.

1. Переназначение при помощи xmodmap.

При помощи xmodmap можно только изменить номерацию кнопок мыши, причеем только у всех мышей сразу. Это самая удобная команда. Только linuxоиды ищуют трудный путь, поэтому они предпологают в ближайшее время эту лазейку заблокировать. Например, что бы 6 и 7 кнопки действовали как вперед/назад надо выполнить такую команду: ‘xmodmap -e «pointer = 1 2 3 4 5 8 9 6 7″‘. Заменить левую кнопку с правой: ‘xmodmap -e «pointer = 3 2 1»‘. Заблокировать левую кнопку: ‘xmodmap -e «pointer = 0»‘. Заблокировать все кнопки: ‘xmodmap -e «pointer = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0»‘. Разблокировать все кнопки: ‘xmodmap -e «pointer = default»‘. Изменить направление вращения колеса прокрутки: ‘xmodmap -e «pointer = 1 2 3 5 4»‘. Вывод текущего состояния: ‘xmodmap -pp‘. Из этих примеров видно, что позиционному положению числа в команде соответствует физический номер кнопки, а это число новое значение. Цифра 0 означает заблокированную кнопку. Единственно эта программа глючит при назначении нескольким кнопкам одного номера кнопки. Команда не требует root прав, поэтому возможно незаметно кому-нибудь заблокировать мышь:)

2. Переназначение при помощи xinput. Похожа на предыдущий случай, но переназначает кнопки у конкретной мыши.

Формат команды такой: «xinput -set-button-map «id мыши» 1 2 3 4 5 6 7 8 9. » — где «id мыши» получается из выхлопа команды xinput без параметров, а последующие цифры аналогичны используемым в команде xmodmap.Использовать просто число в качестве id мыши нельзя, так как после перезагрузки компьютера оно может быть другим. Поэтому надо использовать скрипты такого вида.

Например переназначение кнопок на колесике мыши logitech для перемещения вперед-назад в интернете: «xinput set-button-map «$(xinput | awk -F'[=]’ ‘/Logitech M/ ‘ | awk ‘‘)» 1 2 3 4 5 8 9 6 7» или так «xinput set-button-map «$(xinput | sed -nE ‘/Logitech M/s/^.*id=([[:digit:]]+).*$/1/p’)» 1 2 3 4 5 8 9 6 7«.

Тоже самое, если неизвестен производитель мыши, но известно, что она одна в компьютере и висит на одном гнезде без клваиатуры: «xinput set-button-map «$(xinput | sed -nE «/$(grep -E «Name=|Handlers» /proc/bus/input/devices | grep -EB1 ‘Handlers.*mouse’ | sed -nE ‘/Name=/,/Handlers=.*mouse/ ‘)/s/ ^.*id=([[:digit:]]+).*$/1/p»)» 1 2 3 4 5 8 9 6 7«.

Если неизвестен производитель мыши, но изввестно, что она висит в одном гнезде с клавиатурой:»xinput set-button-map «$(xinput | sed -nE «/$(grep -E «Name=|Handlers» /proc/bus/input/devices | grep -EB1 ‘Handlers.*mouse’ | grep -EB1 ‘Handlers.*kbd’ | sed -nE ‘s/^.*Name=[«]([^»]+)[«].*$/1/p’)/s/ ^.*id=([[:digit:]]+)[[:space:]]+[slave[ [:space:]]+pointer.*]/1/p»)» 1 2 3 4 5 8 9 6 7«.

3. Переназначение при помощи xbindkeys.

Это самый неудобный и медленный способ, так как требует файла снастройками и вызывает внешнюю команду, которая будет эмулировать нажатие другой кнопки. Зато он самый гибкий. При помощи него можно на кнопку мыши повесить любую программу.
Для его работы необходимо создать текстовый файл «

/.xbindkeysrc». Этот файл содержит пары строк. Первая строка в каждой паре обозначает выполняемую команду, а вторя — нажую кнопку. Кроме мыши они может обрабатывать нажатия на клавиатуру. То есть команда предназначена для создания горячих клавиш.

В linux существует две команды эмулирующие нажатия кнопок: xte и xvkbd. Можно использовать любую в качестве первой строки.
Во второй строке описываетсмя нажатая комбинация кнопок. Для мыши она выглядит так: «b: «.

В моем случае переназначения смещения колесика влево-вправо на вперед-назад, «.xbindkeysrc» может быть одним из трех нижепоказанных видов.

Использование xte для симуляции нажатия на 8 или 9 кнопку мыши.
# Back
«xte ‘mousedown 8’ ‘mouseup 8′»

# Forward
«xte ‘mousedown 9’ ‘mouseup 9′»

# Forward
«xte ‘keydown Alt_L’ ‘key Right’ ‘keyup Alt_L'»

Использование xvkbd для симуляции мультимедиа кнопок вперед-назад
# Back
«xvkbd -xsendevent -text «[XF86Back]»

# Forward
«xvkbd -xsendevent -text «[XF86Forward]»

После чего запустить xbindkeys.

Все три способа требуют после перезагрузки выполнить какую-то команду, поэтому необходимо создать ярлык (текстовый файл с расширением .desktop) в автозагрузке (папке «

Мой ярлык.
[Desktop Entry]
Exec=xmodmap -e «pointer = 1 2 3 4 5 8 9 6 7»
Name=»mouse button exchange»
Comment=»6->8 7->9 8->6 9->7″

Можно было бы такой, что бы никто не понял, при помощи xinput. Зато умный как утка.
[Desktop Entry]
Exec=xinput set-button-map «$(xinput | sed -nE «/$(grep -E «Name=|Handlers» /proc/bus/input/devices | grep -EB1 ‘Handlers.*mouse’ | sed -nE ‘/Name=/,/Handlers=.*mouse/ ‘)/s/ ^.*id=([[:digit:]]+).*$/1/p»)» 1 2 3 4 5 8 9 6 7
Name=»mouse button exchange»
Comment=»6->8 7->9 8->6 9->7″

Самый простой для xbindkeys.
[Desktop Entry]
Name=»mouse button exchange»
Comment=»6->8 7->9 8->6 9->7″

Урок 7. Параметры компонента битрикс и result_modifier.php

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

Вот так сейчас должен выглядеть наш каталог. Видно 2 проблемы:

  1. Разная высота и ширина карточек
  2. Наименование выводится в две строки и сдвигает в низ цену и кнопку Купить.

Вот сейчас мы их решим.

Изменение результата работы компонента через result_modifier.php

Первая проблема это то, что изображения предварительного просмотра добавлены в инфоблок разных размеров. Ситуация распространенная, т.к. подгонять все изображение под один размер до миллиметра это не реально. Хотя конечно изображения должны быть примерно одинаковых размеров.
Что нам нужно сделать? Просто версткой, указанием размеров блока изображения проблему не решить, т.к. картинки растянутся не пропорционально. Нужно делать полноценный resize с сохранением пропорций. И в этой задаче нам тоже поможет богатое API Битрикса, в нем есть все функции для этого, а точнее нам понадобится всего одна CFile::ResizeImageGet.
Чтобы изменить размер изображений в инфоблоке Битрикс нужно выполнить следующий код.

Мы снова в цикле обходим элементы массива $arResult и функцией CFile::ResizeImageGet() изменяем размер изображения.
Подробнее о функции можно посмотреть в документации Битрикс. После преобразования мы устанавливаем параметры ширины и высоты изображения 200 пикселов. Но главное мы в качестве источника изображения указываем наш преобразованный файл.
$arResult[«ITEMS»][$cell][«PREVIEW_PICTURE»][‘SRC’] = $file[‘src’];

Данный код можно разместить и в самом шаблоне компонента news.list или в специальном файле result_modifier.php , который должен находится в то же папке где и файл шаблона компонента. На нем я остановлюсь поподробней, т.к. это интересная технология модификации результата работы компонента без изменения кода компонента или шаблона.

Файл result_modifier.php — инструмент для модификации данных работы компонента произвольным образом. Создается разработчиком самостоятельно.

200,’height’ => 200), BX_RESIZE_IMAGE_EXACT, true);
$item[«PREVIEW_PICTURE»][‘WIDTH’] = $file[‘width’];
$item[«PREVIEW_PICTURE»][‘HEIGHT’] = $file[‘height’];
$item[«PREVIEW_PICTURE»][‘SRC’] = $file[‘src’];

Результат работы будет одинаковый. Расположить код внутри шаблона в данном примере более оптимально т.к. нет ненужного цикла по всему массиву $arResult.

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

Результат будет следующий.

Обратите внимание Битрикс создает отдельную папку resize_cache в которой сохраняет преобразованные файлы.

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

.bord h5 <
display: block;
height: 60px;

Параметры компонентов Битрикс

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

Передача параметров между компонентами Битрикс

«IBLOCK_TYPE» => $arParams[«IBLOCK_TYPE»],
«IBLOCK_ID» => $arParams[«IBLOCK_ID»],
«NEWS_COUNT» => $arParams[«NEWS_COUNT»],
«SORT_BY1» => $arParams[«SORT_BY1»],
«SORT_ORDER1» => $arParams[«SORT_ORDER1»],
«SORT_BY2» => $arParams[«SORT_BY2»],
«SORT_ORDER2» => $arParams[«SORT_ORDER2»],
«DETAIL_URL» => $arResult[«FOLDER»].$arResult[«URL_TEMPLATES»][«detail»],
«SECTION_URL» => $arResult[«FOLDER»].$arResult[«URL_TEMPLATES»][«section»],
«IBLOCK_URL» => $arResult[«FOLDER»].$arResult[«URL_TEMPLATES»][«news»],
«SET_TITLE» => $arParams[«SET_TITLE»],
«MESSAGE_404» => $arParams[«MESSAGE_404»],
«SET_STATUS_404» => $arParams[«SET_STATUS_404»],
«SHOW_404» => $arParams[«SHOW_404»],
«FILE_404» => $arParams[«FILE_404»],
«CACHE_TYPE» => $arParams[«CACHE_TYPE»],
«CACHE_TIME» => $arParams[«CACHE_TIME»],
«PAGER_TITLE» => $arParams[«PAGER_TITLE»],
«FILTER_NAME» => $arParams[«FILTER_NAME»],
«CHECK_DATES» => $arParams[«CHECK_DATES»],

«CELL-LARGE» => $arParams[«CELL-LARGE»],
«CELL-MEDIUM» => $arParams[«CELL-MEDIUM»],
«CELL-SMALL» => $arParams[«CELL-SMALL»],

Архив магазина StartShop на момент урока можно скачать отсюда.

От автора:
Ну вот, наконец-то мы доделали наш каталог для магазина Битрикс на редакции Старт StartShop. Теперь он выглядит вполне достойно, можно редактировать количество выводимых элементов, количество колонок. Он адаптивный — меняет количество колонок в зависимости от размера экрана. Конечно, над красотой каталога можно ещё работать и работать, но это уже выходит за рамки моего курса (по крайней мере пока). А в следующим уроке мы займемся выводом детальной страницы товара.
Давайте обратную связь и подписывайтесь, чтобы не пропустить новые статьи. До встречи.

Ссылка на основную публикацию
Статьи c упоминанием слов: