3 заметки с тегом

скрипт

Чистый буфер

5 мая 2014, 16:11

Иногда очень раздражает форматирование буфера обмена. Хочешь, например, вставить из терминала в письмо что-нибудь, а получаешь что-то несуразное:

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

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

alias clean="pbpaste | pbcopy"


Но это было неудобно. Однажды лень перевесила, полез разбираться с Автоматором.

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

Поэтому добавляем действие «Запустить shell-скрипт», вставляем код:

pbpaste | pbcopy


Буфер чист.

Далее нужно его просто в документ. Досадой оказалось что это сделать стандартными действиями нельзя, нужно исхитряться и симулировать нажатие cmd+v. Поэтому добавляем «Запустить AppleScript» и вставляем следующий код:

on run {input, parameters}
	tell application "System Events" to keystroke "v" using {command down}
	return input
end run

Далее выключаем входные данные службы и сохраняем.


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



Быстрое решение для выполнения команд по SSH

14 ноября 2013, 0:21

Наткнулся на дискуссию Сапегина и Харитонова по поводу деплоя блога.
И тогда я задумался. А можно ли не устанавливая фабрик и подобное, полностью нативными средствами реализовать выполнение перечня команд на удалённом сервере?

Конечно, можно! Например, так:

ssh user@server "ls -l /home/"

Но если список команд будет большим, писать подобное станет слишком неудобно. Да и некрасиво.

Красивое решение

В юниксах любой текстовый исполняемый файл начинается с подобной строки:

#!/bin/bash

Это говорит ядру о том, что запускать файл нужно с указанного в данной строке интерпретатора. Что нам мешает изобрести свой интерпретатор? Да ничего.

Создаём файл /usr/local/bin/remote и делаем его исполняемым:

#!/bin/bash
if echo "$1" | grep ":" > /dev/null; then
	srv="`echo \"$1\" | awk -F\: '{ print \$1}'`"
	pth="`echo \"$1\" | awk -F\: '{ print \$2}'`"
	cmd="cd $pth;"
else
	srv="$1"
fi
cmd="$cmd cat | bash"
cat $2 | ssh "$srv" "$cmd"

Это и есть наш интерпретатор. Который тоже запускается с помощью интерпретатора :-) На входе принимаем адрес удалённого сервера и, если нужно, папку, в которую сразу перейдём.

Как всё работает

Создаём некий скрипт, который будет деплоить. Что-то вроде баш-скрипта, только исполняться он будет удалённо.

#!/usr/bin/env remote user@server:/path/to/project/
git checkout master
git pull
npm install
grunt deploy

Сделаем файл исполняемым и запустим. Данный перечень команд запустится на сервере user@server в папке /path/to/project/. Всё просто.

Из плюсов можно отметить использование ключей и ссш-конфигов. При отсутствии ключа спросит пароль.

Не полноценные баш-скрипты, конечно, и не мощный фабрик, но работает. Enjoy.

UPD: Развитие идеи от Артёма: https://github.com/sapegin/shipit

Что играет на радио?

30 апреля 2012, 22:39

Делая вторую версию лампача столкнулся с интересной проблемой — получение тегов из определенного интернет-потока. Готовый инструмент так и не нашёл, пришлось изучать матчасть и писать свой.

Итак, вкратце.
Существует два гиганта интернет-радиовещания: Shoutcast и Icecast. Я предпочитаю второй по многим субъективным причинам, но нужно решение универсальное. Различий в протоколе у них нет, разве что шоуткасту нужно насильно сказать, что я хочу получать от него теги помимо мп3-потока.

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

При хттп-запросе потока нужно дополнительно указать заголовок «Icy-MetaData:1» и юзер-агент какого-нибудь плеера. Некоторые серверы, получая юзер-агент браузера, выдают статусную страничку с количеством слушателей, битрейтом, и прочими ненужными в данный момент. А нам нужен именно поток. После того, как получили правильный контент, осталось считать заголовки ответа и найти среди них «icy-metaint».

Тут первая странность протокола — теги отдаются не сразу. Обычно нужно скачать секунду потока, а там уже лежит заветное название трека. Тут то и пригодится заголовок «icy-metaint», который хранит смещение в байтах, через которое прервется поток и пойдут мета-данные. Пропускаем mp3 данные, читаем один байт и умножаем его значение на 16. Столько байтов будет размер самих данных. Считываем их и радуемся — у нас есть теги.

Алсо, после нескольких тестов на разных радиостанциях заметил интересную особенность: ICY заголовки могут в http идти как обычными заголовками, так и обычным текстом. Пришлось учесть.

В скрипт осталось добавить поддержку локейшен-редиректов и все точно будут счастливы.

Скачать готовый скрипт на питоне.