2023-10-13

Автоматизизация терминала в Linux

В Линукс существует мега полезная утилита screen. При помощи нее можно создавать виртуальные терминалы в терминале которые будут выполняться фоном так, что можно не бояться что соединение прервется и вы потеряете результат выполнения программы. Однако, команда screen это не просто виртуальный терминал, это нечно большее.

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

# запускаем screen
screen -S some_window

В другом терминале делаем следующее:

# пишем ls
screen -S some_window -X stuff 'ls'
# посылаем возврат каретки
screen -S some_window -X eval "stuff \015"

Чтобы видеть то что происходит в другом терминале подключаем вывод в файл:

# задаем местоположение файла для вывода
screen -S some_window -p 0 -X logfile ~/filename.txt
# включаем вывод в файл
screen -S some_window -p 0 -X log on

Все что происходит в пользовательской сессии "some_window" будет доступно в файле ~/filename.txt.

 

Оставить комментарий

 
  2023-05-01

Клавиша Compose

Клавиша compose позволяет вводить специальные символы в Linux типа ä или á.

Для этого нужно сначала коротко нажать compose затем клавишу модификатор, например ', затем модифицируемую клавишу, например e.

compose . e ė
compose ' e é
compose " e ë
compose _ e ē
compose - e ē
compose ? e
compose # e
compose s s ß

Еще больше сочетаний можно найти на страничке в википедии посвященной клавише Compose.

Физически на клавиатуре нет клавиши Compose. В качестве клавиши Compose можно назначить любую клавишу по выбору. По умолчания в Linux в качестве Compose настроен правый ctrl.

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

Однако, с этой клавишей есть одна существенная проблема - клавиша Compose не поддерживается из коробки в Windows но есть большое разнообразие программ для ее емуляции например WinCompose. Для Macos все сложнее, на маке используются собственные сочетания клавиш для набора специальных символов и диакритики, поэтому проектов для поддержки клавиши Compose не так много но они тоже есть.

 

Оставить комментарий

 
  2022-11-17

Копирование текста из терминала без мыши

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

Одной из полезных функций этой программы является так называемый copy-режим когда экран можно скролировать и выделять.

Чтобы скопировать часть экрана в терминале а потом вставить проделайте следующее:

  1. Запустите команду screen
  2. Для входа в copy-режим нажмите CTRL-A ESC
  3. Стрелками или клавишами hjkl перейдите в начала блока, который нужно выделить
  4. Нажмите ENTER для начала выделения
  5. Стрелками или клавишами hjkl перейдите в конец выделения, при этом выделенный фрагмент будет подсвечен
  6. Нажмите ENTER еще раз. Команда screen перейдет в нормальный режим.
  7. Для извлечения скопированного фрагмента из буфера наберите CTRL-A ]

Screen может пригодиться и для многих других вещей, например, для сохранения долгой терминальной сессии на сервере, когда нет возможности поддерживать соединение постоянно.

Вот здесь нашел хорошую шпаргалку на этот случай.

 

Оставить комментарий

 
  2022-06-09

Распознавание голосовых заметок

Долгое время не давало покоя навязчивое желание реализовать автоматическое распознавание своих голосовых заметок.

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

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

Записанные заметки я синхронизирую при помощи Syncthing на свой маленький домашний сервер. На сервере небольшой bash скрипт по crontab каждые десять минут проверяет не появился ли новый wav файл из диктофона и, если появился, скармливает его системе распознавания Kaldi. Полученный текстовый файл сохраняется на диске и пересылается на мою электронную почту.

Решение не требует никаких внешних API типа Google или Яндекса - все происходит в оффлайне. Правда, из-за этого, решение достаточно объемное - языковая модель весит около гигабайта и ещё примерно столько же - сама система распознавания. Работает, однако, решение достаточно надёжно. Пока поддерживается только русский язык, но вполне возможно научить распознавать и другие языки.

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

 

 

Оставить комментарий

 
  2022-05-08

Биткоин клиент на Raspberry Pi Zero W

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

Существует легковесный клиент Electrum! Сам клиент написан на Питоне и его инсталляция не представляет проблем.

У меня сработали следующие команды:

# install all needed packages:

sudo apt-get install python3-pyqt5 python3-setuptools python3-pip libsecp256k1-0 python3-cryptography

# download client
wget https://download.electrum.org/4.2.2/Electrum-4.2.2.tar.gz

# install client with pip
python3 -m pip install --user Electrum-4.2.2.tar.gz

# create startup link
sudo ln -s ~/.local/bin/electrum /usr/local/bin/electrum

# start the client
electrum


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

 

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

 

 

Оставить комментарий

 
  2022-04-28

Bitcoin Core для самых маленьких

Сегодня, наконец, получилось скомпилировать и запустить клиент Bitcoin Core на Raspberry PI Zero W.

Есть у меня идея сделать подобие аппаратного кошелька, который будет умещаться на SD карте и запускаться на устройстве ценой десять евро. Raspberry PI Zero W для этого подходит как нельзя лучше. Проблема только в том что самая дешевая малинка использует не очень ходовой процессор и скомпилированное приложение на него не поставишь, по крайней мере я такого не нашел. Не беда, можно скомпилировать самим из исходников.

У меня получились такие команды:

# install all needed packages:

sudo apt-get install build-essential libtool autotools-dev automake pkg-config bsdmainutils python3

sudo apt-get install libevent-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev

sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools

#install modules for gui compilation

sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools

sudo apt-get install libzmq3-dev

# download sources 

wget https://bitcoin.org/bin/bitcoin-core-0.20.1/bitcoin-0.20.1.tar.gz 

tar xvf bitcoin-0.20.1.tar.gz cd bitcoin-0.20.1 

# compile Berkley DB 

./contrib/install_db4.sh `pwd` 

export BDB_PREFIX='/home/pi/bitcoin-0.20.1/db4' 

./autogen.sh 

./configure --prefix=/usr/local --enable-cxx CXXFLAGS="--param ggc-min-expand=1 --param ggc-min-heapsize=32768" ./configure --enable-cxx CXXFLAGS="--param ggc-min-expand=1 --param ggc-min-heapsize=32768" BDB_LIBS="-L${BDB_PREFIX}/lib -ldb_cxx-4.8" BDB_CFLAGS="-I${BDB_PREFIX}/include" --with-boost-libdir=/usr/lib/arm-linux-gnueabihf 

make 

sudo make install

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

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

 

Оставить комментарий

 
  2022-03-16

Свой VPN с блекджеком и куртизанками

На фоне происходящих событий, пользователи в России стали массово переходить на VPN. Это привело к тому, что пропускной способности бесплатных сервисов стало не хватать и как следствие бесплатными сервисами пользоваться стало почти невозможно. Платные сервисы работают побыстрее, однако популярные централизованные сервисы VPN в России сами стали жертвами блокировок, поэтому пользователи рискуют, что приобретя подписку на один из таких сервисов, пользоваться им через некоторое время станет невозможно.

Выходом из этой ситуации может стать собственный VPN установленный на сервере за пределами России. Заблокировать такой сервер значительно труднее. Я уже долгое время использую OpenVPN, который до сих пор хорошо справлялся с возложенными на него задачами.

Вот здесь я писал как настроить OpenVPN на любом дешевом VDS с root правами.

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

Раздумываю, не написать ли свою инструкцию по настройке  OpenVPN сервера, ориентированную на российских пользователей? Пожалуйста дайте знать будет ли кому-либо интересна подобная инструкция?

 

Коментариев: 2

 
  2021-10-01

Gitlab Runner на Raspberry Pi Zero W

Gitlab Runner - это программа, которая будет после каждого коммита в репозиторий производить определенные действия - запускать тесты, компилировать релиз, деплоить приложение и т.д. Gitlab Runner написан на Go, поэтому может запускаться на самом простом железе, например, на Raspberry Pi Zero W.

Бесплатный аккаунт Gitlab уже дает возможность запускать предустановленные раннеры беcплатно, но их использование ограниечено по времени и если вам нужно больше CI минут можно использовать свой собственный Gitlab Runner. В этом случае, вы получаете неограниченные возможности использования CI/CD.

В этой статье устновим Gitlab Runner на систему на Raspberry Pi Zero W, инсталлированную в предыдущем посте, настроим и зарегистрируем для использования с проектом на Gitlab.

Зарегистрируем gitlab репозиторий:


curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash

Устанавливаем сам runner:

sudo apt-get install gitlab-runner

Создаем тестовый проект на gitlab.com. Заходим в насторойки в секцию CI/CD и копируем токен:

Регистрируем runner для использования в проекте:

sudo gitlab-runner register --url https://gitlab.com/ --registration-token iztXysgDwDvH8z2AV4sZ

Самый простой тип раннера - shell - его и выберем на последнем шаге.

Убедимся, что раннер работает:

sudo gitlab-runner verify

GitLab Runner готов к использованию. Добавляем в проект файл .gitlab.yml со следующим содержимым:

build:
  script:
    - echo "Building"

Если все настроено правильно после коммита, наш pipeline будет исполнен и вы увидите следующее:

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

Конечно, вышеприведенный пример раннера пока не делает ничего полезного - только выводит слово "Building", но это легко исправить, добавив команды типа "npm test", "composer test".

Больше информации по установке и использованию руннеров можно узнать из официальной документации gitlab.

 

Оставить комментарий

 
  2021-10-02

Как установить Raspbian на Raspberry Pi Zero W

Время от времени бывает нужно по-быстрому залить Raspbian на Raspberry PI Zero W, так чтобы сразу можно было начать работать с системой.

Вот краткая инструкция как это сделать:

На локальном компьтере: (замените /dev/sdX, username, wlanname, wlanpassword, 192.168.0.155 на ваши)


# download image
wget https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-05-28/2021-05-07-raspios-buster-armhf-lite.zip

# extract
unzup 2021-05-07-raspios-buster-armhf-lite.zip

# copy to device
sudo dd if=2021-05-07-raspios-buster-armhf-lite.img of=/dev/sdX bs=2M conv=fsync

# activate ssh
touch /media/username/boot/ssh

# update the wifi access credentials
cat > /media/username/rootfs/etc/wpa_supplicant/wpa_supplicant.conf << EOF
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE
network={
        ssid="wlanname"
        psk="wlanpassword"
        key_mgmt=WPA-PSK
}
EOF

# setup static IP address
cat >> /media/username/rootfs/etc/dhcpcd.conf << EOF
interface wlan0
static ip_address=192.168.0.155/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8
EOF

# prevent warning locale not found
cat >> /media/username/rootfs/etc/environment << EOF
LC_ALL=C
LANG=en
LANGUAGE=en
EOF

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

Если все прошло успешно то в сети появится новое устройство.

Заходим на устройстов по ssh: pi@192.168.0.155, пароль по умолчанию: "raspberry".

    
# expand filesystem on SD card
sudo raspi-config --expand-rootfs

# reboot
sudo reboot now

# after reboot login again and
# upgrade the system
sudo apt-get update
sudo apt-get upgrade -y        
    

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

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

Другой проблемой было то, что все SD карты, купленные в России, мне пришлось выбросить - они работают крайне ненадежно. Вроде пишутся штатно, но система на них не хочет работать - либо вообще не грузится, либо происходит ошибка в процессе обновления системы, по какой-то загадочной причине, некоторые файлы записанные в процессе обновления впоследствие оказываются повреждены и обновление завершается с ошибкой. Карты SamDisk, купленные на немецом Amazon работают вполне стабильно.

 

Оставить комментарий

 
  2021-03-27

Мониторинг серверов c Grafana и Influxdb

Есть меня несколько серверов которые бы мне хотелось постоянно мониторить на предмет оперативной памяти, диского пространства и т.п. Хотя сами сервера расположены в разных местах все они объединены между собой по openvpn. Для того чтобы решить задачку мой выбор пал на связку influxdb+grafana.

Influxdb это так называемая timeseries база данных, в которой мы можем хранить данные которые изменяются во времени. Grafana - это универсальный UI который удобно использовать для визуального представления таких данных. InfuxDB и Grafana поднимаются на при помощи docker-compose. К при этом для того, чтобы послать данные состояния сервера используется баш скрипт который периодически запускается через cron и при помощи curl посылает данные на сервер

Таким образом я всегда могу видеть состояние того или иного сервера. Все системы будем подымать в докере для этого достаточно склонировать репозиторий с docker-compose который содержит в себе 3 образа - influxdb, grafana и chronograph.

git clone git@github.com:maxistar/docker-compose-influxdb-grafana.git
cd docker-compose-influxdb-grafana
git checkout influx1_8
docker-compose up -d

Influxdb версии 2.x требует авторизации и поэтому я использовал версию 1.8. Исправленный docker-compose.yaml живет в ветке influx1_8 где я использую именно эту версию, возможно в будущем разберусь как использовать и последнюю версию.

После того как InfluxDB и Grafana запущены, на сервере, который будем мониторить, создаем bash скрипт (script.sh).

#!/bin/bash

dbName="db0"

stat=`free | awk -v RS="" '{print "memory,host=acentauri used=" $9 "\nmemory,host=acentauri total=" $8 "\nmemory,host=acentauri swap=" $15 "\nmemory,host=acentauri swapused=" $16}'`

curl -s -i -XPOST "http://10.8.0.100:8086/write?db=db0" \
	--data-binary "$stat" 
 

делаем файл исполнимым и добавляем команду для запуска скрипта в cron:

chmod +x script.sh
contab -e

в открывшимся файле добавляем следующую строчку:

* * * * * /home/maxim/infrastructure/utils/memusage/script.sh

После того как данные начали посылаться на сервере настраиваем dashboard и наслаждаемся.

После того как начал мониторить состояние asterisk сервера он волшебным образом перестал зависать! Возможно его зависания были связаны с тем что зависает wifi модуль и я его перестаю видеть по сети.

 

Оставить комментарий