Алексей Мичурин

Полезное

Работа с данными: передача, архивирование

Для Python-программиста

Нотификатор

Памятка с полезными скриптами и наборами опций

Mount/umount USB-Flash

Создание swap в файле

Русификация a2ps

Настройка Xorg

Работа с сетью: настройка, диагностика

Рort knocking

Как подготовить полноценную инсталляцию ArchLinux на USB Flash.

Настройка sudo под Linux

Фракталы

Фрактальная размерность

Применение фракталов

Фрактальные деревья

Комплексная размерность

Теория относительности

Пространство-время

Физический смысл

Скорость света

Эквивалентность систем

Относительность

Движение быстрее света

Парадокс близнецов

Любопытные соображения

Недоделанное

Редактор favicon on-line

Устаревшие страницы

Простой HTML-валидатор

Об авторе

Памятка с полезными скриптами и наборами опций


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

Обратите внимание, тут Linux смешан с FreeBSD. Я работаю над этим :-)

Преобразование видео

Подготовка видео H.264 320x240

Конвертируем видео и пишем его на video-DVD:

Если звук тихий

Dump DVD:

Разрезать ролик

Разделить/слить видео/аудио

Работа с аудио

Преобразование одного большого FLAC во много mp3

Добавление ID3-тегов в mp3-файлы

Работа с архивами

Скрипт для архивирования

Найти файлы и заархивировать их

Перекодировка имён файлов

Генерация паролей

Генерация md5-суммы

Шифрование

Telnet через openssl

Консоль

Настройка цветов в команде ls во FreeBSD

Приведение bash в чувства

Создание patch'ей

FreeBSD/Linux md5/md5sum

Информационные утилиты

Ядро

Нагрузка на диски

Разное, но полезное

Печать

Печатаем брошюру с двух сторон

Преобразование видео

Подготовка видео H.264 320x240

Проверено на Sony Walkman NWZ-A726, Nokia N78, Samsung S3550.

mencoder -ofps 25 -of lavf -lavfopts \
format=mp4 \
-af lavcresample=48000 -srate 48000 -vf-add harddup \
-vf-add scale=320:240 -oac lavc -ovc lavc -lavcopts \
aglobal=1:vglobal=1:acodec=libfaac:abitrate=128:vcodec=mpeg4:\
vbitrate=250:autoaspect:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:\
predia=2:dia=2:precmp=2:cmp=2:subcmp=2:preme=2:turbo \
-quiet -info name="Name_to_display" \
-o output.mp4 input.avi

Для тех же целей можно воспользоваться экспериментальными фичами ffmpeg.

ffmpeg -i input.avi -f mp4 -vcodec mpeg4 -b:v 250k \
-s 320x180 -acodec aac -ar 48000 -ab 64k -ac 2 \
-strict experimental \
output.mp4

Конвертируем видео и пишем его на video-DVD:

ffmpeg -i detskij.albom.avi -target dvd -aspect 16:9 -sameq video.mpg
# или более продвинутый вариант что-то вроде этого
# ffmpeg -i  aleksandr.nevskij.avi  -target ntsc-dvd -acodec mp2 -b 5000k -ab 192k -aspect 16:9 video2-b5M-ab-192k.mpg
mkdir DVD
dvdauthor --title -f video.mpg -o DVD
VIDEO_FORMAT=PAL dvdauthor -T -o DVD
mplayer dvd://1 -dvd-device ./DVD
growisofs -dvd-compat -dvd-video -speed=4 -Z /dev/dvd ./DVD

Если звук тихий

то применяем фильтр

-af lavcresample=48000,volnorm=2:1

Dump DVD:

mplayer -dumpstream -dumpfile rip.mpg dvd://1

Разрезать ролик

на две части тоже так

mencoder -ovc copy -oac copy -endpos 0:50:00 -o part1.avi video.avi
mencoder -ovc copy -oac copy -ss 0:50:00 -o part2.avi video.avi

На много небольших частей, можно примерно так

#!/bin/sh

for i in 00:00 00:20 00:40 01:00 01:20 01:40
do
  p=`echo $i | sed 's/:/_/g'`
  n="kolobaha_part_$p.avi"
  echo $n
  mencoder -ovc copy -oac copy -ss $i:00 -endpos 0:20:00 -o $n Kolobaha.avi
done

(доработать напильником по-вкусу)

Разделить/слить видео/аудио

## отделяем видео
mencoder -ni -ovc copy -nosound -ofps 25 -o video.wmv 'American Psycho.mkv'
## отделяем аудио
mplayer -ni -ao pcm:file=audio.wav -vc dummy -vo null 'American Psycho.mkv'
## соединяем всё снова
mencoder -idx -audiofile audio.wav -ovc lavc -lavcopts vcodec=mpeg4 \
 -ofps 25 -oac mp3lame -lameopts vbr=3 video.wmv -o 'American Psycho.avi'

Работа с аудио

Преобразование одного большого FLAC во много mp3

flac -dc ../*.flac | lame -h -b 256 /dev/stdin foo.mp3
mp3splt -c ../*.flac.cue foo.mp3

Добавление ID3-тегов в mp3-файлы

Предполагается, что файл раскиданы по директория Исполнитель/Альбом/Песня. Некоторым файлам и директориям добавлен цифровой префикс NN-, который необходимо удалить в тегах.

for a in * # исполнители
do
  if test -d "$a"
  then
    cd "$a"
    for s in * # альбомы
    do
      if test -d "$s"
      then
        cd "$s"
        i=1
        c=`ls -1 *.mp3 | wc -l`
        for f in *.mp3 # песни
        do
          ff=${f%.mp3}
          id3tag -a "$a" \
                 -A "$a ${s#[0-9][0-9]-}" \
                 -s "${ff#[0-9][0-9]-}" \
                 -c "no coments" \
                 -C "no descr" \
                 -y 2009 -t $i -T $c -g 1 -w -n "$f"
          i=$(($i+1))
        done
        cd ..
      fi
    done
    cd ..
  fi
done

Работа с архивами

Скрипт для архивирования

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

#!/bin/sh

clr0=`echo -e '\e[0m'`
clr1=`echo -e '\e[32m'`
clr2=`echo -e '\e[33m'`
clr3=`echo -e '\e[1m\e[31m'`

d=`date '+-%y-%m-%d'`
for arg in "$@"
do
  base=`basename "$arg"`
  dir=`dirname $arg`
  ok='not'
  for i in 0 1 2 3 4 5 6 7 8 9
  do
    if test "a$i" = "a0"
    then
      suff=''
    else
      suff="-$i"
    fi
    aname="$base$d$suff.tgz"
    if test -e "$aname"
    then
      echo "$clr2[INFO]$clr0 Left name \"$aname\""
    else
      tar -c -C "$dir" -z -f "$aname" "$base"
      if test "a$?" = 'a0'
      then
        echo "$clr1[OK]$clr0 $arg -> $aname"
      else
        echo "$clr3[ERROR]$clr0 Tar error for \"$arg\""
      fi
      ok='ok'
      break
    fi
  done
  if test "a$ok" = "anot"
  then
    echo "$clr3[ERROR]$clr0 Can not create name of archive for \"$arg\"!"
  fi
done

Найти файлы и заархивировать их

find . -type f -size -1000 | tar czv -T- -f file.tgz

Перекодировка имён файлов

Пример перекодирования CP866 в транслит всех файлов и директорий в дереве.

#!/bin/sh

MAGIC='XXXX'

if test "a$1" = "a$MAGIC"
then
  # pipe mode
#  iconv -f UTF-8 -t koi8-r
  iconv -f CP866 -t koi8-r |
  perl -pe "
chomp;

y/абвгдеёзийклмнопрстуфхъыьэ/abvgdeezijklmnoprstufh'y'e/;
y/АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭ/ABVGDEEZIJKLMNOPRSTUFH'Y'E/;
s/ж/zh/g;
s/ц/ts/g;
s/ч/ch/g;
s/ш/sh/g;
s/щ/sch/g;
s/ю/ju/g;
s/я/ja/g;
s/Ж/Zh/g;
s/Ц/Ts/g;
s/Ч/Ch/g;
s/Щ/Sch/g;
s/Ю/Ju/g;
s/Я/Ja/g;

s/\s+/_/g;
s/[\177-\377]+/-/g;
"
else
  # find mode
  find -d . | while read s
  do
    p="${s%/*}"
    f="${s##*/}"
    if test "a$f" = "a$d"
    then
      :
    else
      ef=`echo $f | "$0" "$MAGIC"`
      if test "a$f" = "a$ef"
      then
        :
      else
        mv "$p/$f" "$p/$ef"
      fi
    fi
  done
fi

Генерация паролей

Очень удобный способ генерации паролей:

openssl rand -base64 24

Генерация md5-суммы

Для генерации md5-сумм существуют отдельные утилиты (под FreeBSD — md5, под Linux — md5sum), но выдают информацию в разных форматах. openssl — более универсальный метод:

openssl md5 файл

Шифрование

Зашифровать файл:

openssl enc -aes-256-cbc -salt -in входной_файл -out зашифрованный_файл

Расшифровать:

openssl enc -d -aes-256-cbc -in зашифрованный_файл -out расшифрованный_файл

Того же самого эффекта можно доиться, управляя стандартными потоками:

# шифруем
openssl enc -aes-256-cbc -salt < входной_файл > зашифрованный_файл
# расшифровываем
openssl enc -d -aes-256-cbc < зашифрованный_файл > расшифрованный_файл

Полезный пример:

# создаём защищённый паролем tar-архив
tar czf - your_dir | openssl enc -aes-256-cbc -salt >file.tgz
# распаковываем этот архив
openssl enc -d -aes-256-cbc < file.tgz | tar xzf -

Telnet через openssl

Пример работы с gmail.com по SSL по POP3:

$ openssl s_client -crlf -ign_eof -connect pop.gmail.com:995
CONNECTED(00000003)
....
+OK Gpop ready for requests from XXX.XXX.XXX.XXX XXXXXXXXXXXXXXXX
USER XXXXXXXX
+OK send PASS
PASS XXXXXXXX
+OK Welcome.
STAT
+OK 528 44954440
LIST
+OK 528 messages (44954440 bytes)
1 2867
....
527 1020
528 2583
.
TOP 5 0
+OK message follows
....

.
QUIT
+OK Farewell.
read:errno=0

Консоль

Настройка цветов в команде ls во FreeBSD

Команда ls во FreeBSD работает с цветами, не как в Linux. Подробно об этом можно прочитать в man 1 ls, а здесь я приведу скриптик для очень простой настройки любой раскраски.

Предлагаю разместить в .profile, или другом инициализационном скрипте, примерно следующие инструкции:

# эти переменные изменять не надо
black='a'
red='b'
green='c'
brown='d'
blue='e'
magenta='f'
cyan='g'
light_grey='h'
bold_black='A'
bold_red='B'
bold_green='C'
yellow='D'
bold_blue='E'
bold_magenta='F'
bold_cyan='G'
bold_light_grey='H'
default='x'

# ----------------------------------------------------
# а вот тут вы можете установить любые цвета для
# разных элементов файловой системы (см. комментарии),
# используя имена переменных, инициализированных выше;
# для каждого элемента указывается два цвета:
# цвет букв и цвет фона
#
xx00="$bold_blue$default"  # directory
xx01="$cyan$default"       # symbolic link
xx02="$magenta$default"    # socket
xx03="$magenta$default"    # pipe
xx04="$green$default"      # executable
xx05="$yellow$default"     # block special
xx06="$brown$default"      # character special
xx07="$bold_green$green"   # executable with setuid bit set
xx08="$bold_green$default" # executable with setgid bit set
xx09="$bold_blue$blue"     # directory writable to others, with sticky bit
xx10="$bold_blue$blue"     # directory writable to others, without sticky bit
#
# ----------------------------------------------------

# экспортируем необходимые переменные
LSCOLORS="$xx00$xx01$xx02$xx03$xx04$xx05$xx06$xx07$xx08$xx09$xx10"
export LSCOLORS
CLICOLOR="YES"
export CLICOLOR

Вы можете установить любые цвета; сейчас выбраны цвета, в духе Linux-традиции, правда с небольшими моими дополнениями.

Приведение bash в чувства

Бывает, что перестают работать консоли, выдаётся сообщение вида:

subshell.c: read (subshell_pty...): No such file or directory

Решается проблема просто:

killall -CONT bash

Создание patch'ей

Создать patch:

diff старый_файл новый_файл > patch_файл

Наложить patch:

patch старый_файл patch_файл

Естественно порядок файлов везде важен.

FreeBSD/Linux md5/md5sum

Во FreeBSD и в Linux есть две утилиты для подсчёта md5-сумм файлов. Они выдают один а тот же результат, но в несколько разном формате, что очень неудобно, если надо сравнить файлы (по суммам), лежащие на Linux и FreeBSD машинах. Поэтому для каждой системы я написал маленький скрипт, эмитирующий поведение недостающей утилиты.

Для FreeBSD — md5sum:

!/bin/sh 
md5 -- "$@" | sed -E 's/^MD5 \((.*)\) = ([^[:space:]]+)/\2  \1/'

Для Linux — md5:

#!/bin/sh
md5sum -- "$@" | sed -r 's/^(\S+)\s+(\S+)/MD5 (\2) = \1/'

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

Информационные утилиты

Ядро

Посмотреть настройки ядра: sysctl -ah.

Посмотреть, что значат все эти переменные: sysctl -ad.

Посмотреть сообщения ядра: dmesg

Посмотреть окружение ядра (hint'ы): kenv

Информация о ядре и загруженных модулях: kldstat и kldstat -v.

Нагрузка на диски

Под Linux SMART можно посмотреть

/usr/sbin/skdump /dev/sda

Посмотреть активность ввода/вывода можно командой iotop

Под FreeBSD очень полезная утилита smartctl

/usr/local/sbin/smartctl -a /dev/ad4

выдаст полную информацию по указанному диску, вот лишь, некоторые поля:

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   100   100   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0007   253   253   025    Pre-fail  Always       -       5760
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       77
  7 Seek_Error_Rate         0x000f   253   253   051    Pre-fail  Always       -       0
  8 Seek_Time_Performance   0x0025   253   253   015    Pre-fail  Offline      -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       5899
 10 Spin_Retry_Count        0x0033   253   253   051    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       61
194 Temperature_Celsius     0x0022   050   043   000    Old_age   Always       -       50
196 Reallocated_Event_Count 0x0032   253   253   000    Old_age   Always       -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x000a   100   100   000    Old_age   Always       -       0
201 Soft_Read_Error_Rate    0x000a   100   100   000    Old_age   Always       -       0
202 TA_Increase_Count       0x0032   253   253   000    Old_age   Always       -       0

На самом деле информации выдаётся на много больше.

Информация о нагрузке на диски в реальном масштабе времени: gstat и iostat -w 1.

Информация о swap'e: swapctl -lh

Информация о всех открытых файлах fstat.

Есть ещё systat.

Разное, но полезное

Очень полезная утилита lsof выдаёт список всех открытых файлов, включая сокеты, конвейеры и прочее. Она на удивление неприхотлива, и ей не требуется ни специальных возможностей ядра, ни монтирования procfs. Почему-то она не входит в минимальную установку FreeBSD.

Посмотреть, от каких библиотек зависит исполняемый файл:

ldd -f '%p\n' -a /usr/local/bin/mc | sort | uniq

Список локалей: locale -a.

Очень полезен мониторчик mbmon и его X-версия xmbmon. Он показывает температуры и вольтажи на системной плате.

Печать

Печатаем брошюру с двух сторон

На понадобится PostScript-принтер и два скрипта.

Вспомогательный скрипт на перле:

#!/usr/bin/perl
# mkbook-duplex.pl

$tumble = 'false';
$cookie = «"END_OF_COOKIE";
%%BeginFeature: *Duplex DuplexTumble
mark
{
  («) cvx exec /Duplex (true) cvx exec /Tumble ($tumble) cvx exec (») cvx exec
  systemdict /setpagedevice get exec
} stopped
cleartomark
%%EndFeature
END_OF_COOKIE

$ps = '';
while (<>) {
  $ps .= $_;
}

$nsubs = ($ps =~ s/(?:\n|\r)(%%EndSetup)/\n$cookie$1/);
unless ($nsubs) {
  $nsubs = ($ps =~ s/(?:\n|\r)(%%EndProlog)(?:\n|\r)/\n$1\n$cookie/);
}
unless ($nsubs) {
  $nsubs = ($ps =~ s/(?:\n|\r)(%%Page:\s)/\n$cookie$1/);
}
unless ($nsubs) {
  die "ERROR";
}
print $ps;

Скрипт на шеле:

#!/bin/sh
# mkbook
cat "$1" |
  psbook |
  psnup -2 |
  pstops "2:0U(8.5in,11.7in),1(0in,0in)" |
  mkbook-duplex.pl > "$1-booklet.ps"
  #pstops "2:0U(8.5in,11.7in),1"
  #pstops "2:0U(8.5in,11.7in),1(-.025in,0in)" |

Теперь преобразуем исходные файл и печатаем его:

$ mkbook text.ps
$ lpr text.ps-booklet.ps

Вы можете связаться со мной по e-mail a.michurin@gmail.com.



Технология Google App Engine Python powered