В разделах программирование и софт
Андрей Баксаляр  :: 25 янв, в 20:19

Как правильно сравнить содержимое вывода какой-то команды с содержимым текстового файла? Например, у нас есть requirements.txt, в котором содержится информация о зависимостях проекта. По сути, содержимое этого файла является записанным выводом команды pip freeze. И вот, по прошествии какого то времени, нам надо сравнить содержимое этого файла с актуальным выводом все той же команды.

Для этого достаточно просто воспользоваться конвейерным механизмом (unix pipes):

$ pip freeze | diff requirements.txt -
3c3
< django-extensions==1.7.1
---
> django-extensions==1.7.4

Что здесь происходит? Во-первых, сначала выполняется pip freeze, вывод которого подается дальше по конвейеру, передача обозначается символом |. Во второй части команды diff принимает первым аргументом файл requirements.txt, а вторым аргументом, обозначенным дефисом -, принимает стандартный ввод, в котором содержится переданная по конвейеру информация из левой части команды (т.е. вывод pip freeze). Программа diff сравнивает два текста и выдает найденную разницу.

Любопытно, что в Linux-е файл тоже может иметь название "-", и тут есть вероятность небольшой путаницы. Из этой ситуации можно выйти элегантным образом, явно указывая bash-у, что это файл, а не stdin:

$ cat ./-
Wow, very strange! Such pipy!

Где вместо точки интерпретатор подставляет текущую директорию. Естественно, можно просто указать полный путь — например, cat /home/andrey/-.

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

К слову, первый пример с конвейером можно реализовать немного по-другому:

$ diff requirements.txt <(pip freeze)
3c3
< django-extensions==1.7.1
---
> django-extensions==1.7.4

Здесь при выполнении интерпретатором сначала «раскрываются скобки», а потом вывод передается по конвейеру в левую часть команды.

Кстати, через конвейеры удобно сравнивать вывод команд и/или файлы не только локальные, но и удаленные. Например, сравнить два файла (локальный и удаленный) можно примерно так:

$ diff requirements.txt <(ssh -A user@host.com "cat /www/project/requirements.txt")

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

Пока комментариев нет, будь первым!


В разделах программирование и софт
Андрей Баксаляр  :: 20 июл 2016, в 04:58

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

Нечитаемый JSON

И это еще в лучшем случае, т.к. здесь иерархия не такая ветвистая и мало узлов. Бывают случаи, где вывод совершенно нечитаем человеком. И вот в таких случаях можно использовать какой-то инструмент для того, чтобы «причесать JSON» (еще это называют термином pretty print).

Один из нескольких вариантов — замечательная утилита jq, делающая JSON вполне удобочитаемым и визуально структурированным:

Легко читаемый JSON в консоли

Как видно, запрос curl-лом мы отправили по конвейеру в jq ., в данном случае точка после команды является аргументом, означающим, что от jq требуется выдать все узлы, находящиеся в корне иерархии. Вместо точки можно указывать конкретный путь, состоящий из ключей, разделяемых точками — например:

Вывод отдельной ветки иерархии JSON при помощи jq

В данном примере мы попросили вывести jq лишь необходимую часть JSON, а именно — раздел weather со всем содержимым. Можно фильтровать и дальше по дереву. Например, jq .person.name.surname.

Информация об установке (например, в Ubuntu jq уже есть в репозитариях — sudo apt install jq) и примеры фильтров доступны на официальном сайте jq.


В разделах программирование и софт
Андрей Баксаляр  :: 1 май 2016, в 05:55

Скриншот Termux

Приложение Termux — настоящая находка для сисадмина или разработчика, привыкшего к окружению Linux, имеющего свежее Android-устройство и компактную беспроводную bluetooth-клавиатуру. Теперь можно устроить рай в шалаше, с родной средой, ssh, apt-get-ом, Grep-ом по SMS-кам (и контактам), Emacs-ом, Vim-ом, Python-ом, Perl-ом, Node.js, Ruby, полноценным башем, fish-ем или zsh, и прочей тяжелой артиллерией без «большого компьютера».

Скриншот Termux

Очень и очень круто, телефоны уже умеют практически 100% того, что умеют десктопы — с ростом производительности полным ходом подтягивается и десктопный софт. Вообще, не перестаю удивляться, в какое интересное время живем! Ждем Termux на умных часах и в умных очках (шутка).


В разделе софт
Андрей Баксаляр  :: 23 мар 2016, в 03:52

Если у вас в качестве Desktop Environment используется Gnome2 или аналог (а также если это перелицованный Gnome3 в форме какого-нибудь Cinnamon), то включить типографскую раскладку Бирмана не проблема — я уже довольно детально описывал способ ранее.

Раскладка Бирмана

Однако, если у вас Gnome 3, или другая среда рабочего стола, где типографской раскладки «из коробки» попросту нет, то задача может оказаться слегка нетривиальной. Типографская раскладка в работе (и вообще) пригождается довольно часто, и перейдя на Fedora 23, где по умолчанию включен Gnome 3, пришлось немного повозиться. С результатами возни делюсь с читателем:

Раскладки, как таковые, не привязаны к конкретной DE — интерпретацией ввода с клавиатуры занимается подсистема xkb, встроенная в оконную систему X Window System (X11, или те самые «иксы»). И все раскладки, банально, лежат в директории X11, в виде текстовых конфигов. Типографская раскладка в 23-й Федоре, например, обнаружилась по адресу /usr/share/X11/xkb/symbols/typo, в других дистрибутивах она может располагаться аналогичным образом, но в подкаталогах /etc/X11/xkb/.... Заголовок обнаруженного конфига гласит:

// Typographic Keyboard
// Sergei Stolyarov <sergei@regolit.com>

// Initial contribution by Alexey Ten <alexeyten+deb@gmail.com>
// Additional contribution and code cleanup by Artur Dryomov <artur.dryomov@gmail.com>

// Mainly based on the layout proposed by Ilya Birman
// http://ilyabirman.ru/projects/typography-layout/

Итак, раскладка найдена, теперь ее необходимо подключить. Как оказалось, делается это довольно просто, командой в терминале:

setxkbmap -option "lv3:ralt_switch,misc:typo"

Синтаксис команды, в принципе, прост: программа setxkbmap с ключом -option меняет лишь дополнительные настройки клавиатуры не затрагивая остальное, а именно — в данном случае устанавливает правый альт (ralt_switch) в качестве модификатора для клавиш третьего уровня (lv3), а также подключает типографскую клавиатуру в качестве своеобразной «маски», добавляющей третий слой поверх любой вашей раскладки (будь то английская, русская или таджикская).

Опции устанавливаются на время сессии (или до того момента, как Gnome не решит их переписать своими), поэтому после перезагрузки или перелогина установленные настройки пропадут. И именно поэтому можно включить вышеупомянутую строку в какой-нибудь $HOME/.bashrc, чтобы опция устанавливалась при старте системы, но лучше так не делать.

Самым правильным вариантом будет воспользоваться механизмом инициализации X11, и поместить такой текст:

-option "lv3:ralt_switch,misc:typo"

...в текстовый файл .Xkbmap, расположенный прямо в домашней директории пользователя ($HOME/.Xkbmap). Скрипты инициализации (конкретнее — xinitrc-common) найдут его там при старте X11 и применят лежащие в нем настройки.

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

key <код клавиши> {[ NoSymbol, NoSymbol, результат применения модификатора Level3 (обычно AltGr), аналогично для Shift+Level3  ]};


В разделе программирование
Андрей Баксаляр  :: 7 ноя 2015, в 08:52

Небольшая памятка для себя + кому-то может пригодиться.

Иногда требуется «засечь» время и посмотреть, сколько выполняется та или иная «тяжелая» задача в Linux'овом терминале (для этого подходит встроенная команда time). Но если time по каким-то причинам не подходит, то может пригодиться такой метод подсчета времени выполнения команд и блоков кода в bash-скриптах:

START=$(date +%s.%N)

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

END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)

echo Начало выполнения задачи — $START
echo Задача выполнена — $END
echo Итоговое время выполнения задачи — $DIFF

В начале в переменную START складывается текущее время (форматированный вывод команды date, количество секунд + наносекунд с начала эпохи Unix), затем выполняется блок кода или «тяжелая» задача, далее в переменную END снова записывается текущее время. Ниже обе временные метки выводятся в консоль, плюс выводится разница между START и END, сложенная в DIFF.

Войти через...


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

Популярное


Путешествия Макса Майорова во времени 21 фев, в 00:53

Cool-ибин 19 фев, в 09:00

Неоновый Китай 8 фев, в 06:32

По США на товарняках 2 апр, в 14:12

Новое Оно на подходе 30 мар, в 15:45

Соациализируемся


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

Все еще использую электронную почту:
andreybaksalyar@ya.ru