Мини заметки — выпуск 1

В последнее время у меня накопилось множество мелкий наработок. В основном это скрипты и фильтры для WordPress. Какую-нибудь хитрую bash-команду я также отношу к наработкам.

Для написания полноценного поста одной такой наработки недостаточно. В то же время хранить их в текстовых файлах неудобно. Попробуй отыщи тот самый скриптик, который писался пол года назад и хранится то ли дома, то ли на работе, то ли вообще на флешке или GMail. Потому я решил собирать свои мелкие наработки в этом блоге, чтобы всегда точно знать, где их можно найти. Начнем?

1. Замедляем поисковых роботов

Как я писал в одной из своих предыдущих заметок, поисковые роботы Рамблера могут создать большую нагрузку на ваши сайты. В своих блогах на WordPress я решаю эту проблему с помощью следующего кода:

add_action("wp_head", "anti_rambler");

function anti_rambler() {
  if(strpos($_SERVER["USER_AGENT"], "StackRambler"))
    sleep(10);
}

Просто добавляем его в файл functions.php вашей темы и все!

2. Качаем видео с YouTube и вырезаем из него музыку

Существует замечательная утилита для скачивания видео с YouTube. Во FreeBSD ее можно установить из портов:

portmaster -dw /usr/ports/distfiles/youtube_dl

Пользоваться ею очень просто:

youtube-dl 'http://www.youtube.com/watch?v=rvYZRskNV3w' -o 1.flv
mplayer 1.flv

Теперь, допустим, мы хотим сохранить звук из скаченного файла в mp3. Сначала смотрим информацию о файле:

ffmpeg -i 1.flv
Input #0, flv, from '1.flv':
  Metadata:
    duration        : 134
    starttime       : 0
    totalduration   : 134
    width           : 480
    height          : 360
    videodatarate   : 555
    audiodatarate   : 58
    totaldatarate   : 619
    framerate       : 25
    bytelength      : 10397942
    canseekontime   : true
    sourcedata      : B4A7D6C43HH1284026309763246
    purl            :
    pmsg            :
  Duration: 00:02:13.84, start: 0.000000, bitrate: 627 kb/s
    Stream #0.0: Video: h264, yuv420p, 480x360 [PAR 1:1 DAR 4:3], 568 kb/s, 25 tbr, 1k tbn, 50 tbc
    Stream #0.1: Audio: aac, 44100 Hz, stereo, s16, 59 kb/s
At least one output file must be specified

Если звук хранился в mp3, его можно просто сохранить в отдельном файле:

ffmpeg -i 1.flv -acodec copy 1.mp3

Однако в нашем случае использовался кодек aac, потому звук придется перекодировать:

ffmpeg -i 1.flv -acodec libmp3lame -ab 131072 sparta-techno-remix.mp3

Обратите внимание, что битрейт задается не в Кбит/сек, а в бит/сек.

Видео можно перекодировать в .avi:

ffmpeg -i 1.flv -acodec copy -vcodec mpeg4 1.avi

И напоследок — мой любимый прием с ffmpeg. Делаем звонок на мобильный из mp3:

ffmpeg -ss 00:00:35.10 -t 30 -i Morcheeba-Otherwise.mp3 -acodec copy call.mp3

Откуда и сколько резать можно выяснить с помощью mplayer или вашего любимой программы для проигрывания mp3.

Дополнение: См также мой скрипт для просмотра видео c YouTube без Flash.

3. Элементарный пример использования awk

Мне не часто приходится использовать эту утилиту, но иногда она бывает очень полезна. Чтобы сэкономить себе немного времени в следующий раз, когда она мне понадобится, я решил выложить простейший пример ее использования:

cat file.txt | awk 'BEGIN{FS="\t"}{print $1}'

Если file.txt содержит строки с некоторыми данными, разделенными знаками табуляции, данный пример выведет первый столбец данных.

Дополнение: Как совершенно верно отписал в комментах СетевойГибитобой, команда cut справится не хуже:

cut -d : -f 1,7 /etc/passwd # вывести логин:шелл

4. Снимаем скринкаст во FreeBSD

С помощью ffmpeg можно захватывать видео с экрана:

ffmpeg -f x11grab -s 1152x864 -r 20 -b 2000k -i :0.0 nodump/out.mpg

Захватывать можно не весь экран, а только его часть. Размер захватываемой области задаются с помощью ключа -s, а координаты левого верхнего угла можно задать ключом -i

-i :0,0+100,50

В приведенном примере 100 — это смещение по X, 50 — по Y. Но мне кажется, что удобнее сначала снять видео со всего экрана, а потом обрезать лишнее. Также можно прикрепить к видео комментарии или музыку:

ffmpeg -i video.mpg -vcodec copy -i audio.mp3 -acodec copy -shortest output.avi

Чтобы снимать скринкасты с помощью ffmpeg, необходимо убедится, что программа была собрана с опцией VHOOK. Порт находится в /usr/ports/multimedia/ffmpeg — переходим и говорим «make config».

Также скринкасты можно снимать с помощью recordmydesktop (/usr/ports/multimedia/recordmydesktop/):

$ recordmydesktop --help

Usage:
  recordmydesktop [OPTIONS]^filename


General Options:
  -h or --help    Print this help and exit.
  --version   Print program version and exit.
  --print-config    Print info about options selected during compilation and exit.

Image Options:
  --windowid id_of_window id of window to be recorded.
  --display DISPLAY Display to connect to.
  -x X      Offset in x direction.
  -y Y      Offset in y direction.
  --width N   Width of recorded window.
  --height N    Height of recorded window.

  --dummy-cursor color  Color of the dummy cursor [black|white]
  --no-cursor   Disable drawing of the cursor.
  --no-shared   Disable usage of MIT-shared memory extension(Not Recommended!).
  --full-shots    Take full screenshot at every frame(Not recomended!).
  --quick-subsampling Do subsampling of the chroma planes by discarding,not averaging.
  --fps N(number>0.0) A positive number denoting desired framerate.

Sound Options:
  --channels N      A positive number denoting desired sound channels in recording.
  --freq N        A positive number denoting desired sound frequency.
  --buffer-size N     A positive number denoting the desired sound buffer size (in frames,when using ALSA or OSS)
  --ring-buffer-size N    A float number denoting the desired ring buffer size (in seconds,when using JACK only).
  --device SOUND_DEVICE   Sound device(default /dev/dsp).
  --use-jack port1 port2... portn Record audio from the specified
          list of space-separated jack ports.
  --no-sound      Do not record sound.

Encoding Options
  --on-the-fly-encoding Encode the audio-video data, while recording.
  --v_quality n   A number from 0 to 63 for desired encoded video quality(default 63).
  --v_bitrate n   A number from 45000 to 2000000 for desired encoded video bitrate(default 45000).
  --s_quality n   Desired audio quality(-1 to 10).

Misc Options:
  --rescue path_to_data Encode data from a previous, crashed, session.
  --no-wm-check   Do not try to detect the window manager(and set options according to it)
  --pause-shortcut MOD+KEY  Shortcut that will be used for (un)pausing(default Control+Mod1+p).
  --stop-shortcut MOD+KEY Shortcut that will be used to stop the recording (default Control+Mod1+s).
  --compress-cache  Image data are cached with light compression.
  --workdir DIR   Location where a temporary directory will be created to hold project files(default $HOME).
  --delay n[H|h|M|m]  Number of secs(default),minutes or hours before capture starts(number can be float)
  --overwrite   If there is already a file with the same name, delete it
        (default is to add a number postfix to the new one).
  -o filename   Name of recorded video(default out.ogv).

  If no other options are specified, filename can be given without the -o switch.

Утилита может писать видео только в формате .ogv. Перекодировать его можно с помощью того же ffmpeg или mencoder:

mencoder out.ogv -ovc xvid -oac mp3lame -xvidencopts pass=1 -o out.avi

Предварительно следует убедиться, что mencoder был собран с опцией THEORA.

Да, кстати, для снятия скриншотов я пользуюсь scrot — /usr/ports/graphics/scrot.

5. Постинг в ЖЖ на Perl

Есть замечательный модуль для Perl под названием Net::LiveJournal. В портах его нет, но можно поставить с помощью cpan. Как несложно догадаться, предназначен он для работы с ЖЖ.

#!/usr/bin/perl

use strict;
use Net::LiveJournal;

# ..........

my $lj = Net::LiveJournal->new(
  user => $ljuser,
  password => $ljpass);

my $entry = Net::LiveJournal::Entry->new(
  subject => $title,
  body    => $data);

$lj->post($entry) or die $lj->errstr;

См также мои посты о создании ботов на Perl для WordPress и Twitter.

6. Памятка по .htaccess

Если посты с вашего блога коммуниздит какой-то говносайт, можно ограничить доступ к блогу по IP, маске сети или UserAgent:

SetEnvIfNoCase User-Agent "^SimplePie" ddos

Order Allow,Deny
Allow from all
Deny from env=ddos # баним по UserAgent
Deny from 192.168.0.1 # баним по IP
Deny from 192.168.0. # баним всю сеть 192.168.0/24

Доступ к некоторым разделам сайта (админкам, веб-шеллам и тд) желательно закрывать с помощью пароля:

AuthUserFile /full/path/to/.htpasswd
AuthType Basic
AuthName "Password Required"
Require valid-user

Для генерации файла .htpasswd используется одноименная утилита:

htpasswd -c .htpasswd newuser

Перенаправление с www.site.ru на site.ru:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.site\.ru$ [NC]
RewriteRule (.*)$ http://site.ru/$1 [R=301,L]
</IfModule>

Перенаправление с «/index.php» на «/»:

RewriteCond %{THE_REQUEST} ^.*/index\.php
RewriteRule ^(.*)index\.php$ http://site.ru/$1 [R=301,L]

Задаем кодировку страниц:

CharsetDisable on
CharsetDefault utf-8
CharsetSourceEnc utf-8
AddDefaultCharset utf-8

Если сервер вырезает из заголовков страниц

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

и пишет туда что-то вроде «<!— Meta http equivalent was here …», нужно прописать в .htaccess следующее:

CharsetDisable On
AddHandler default-handler html

7. Крадем музыку с интернет-радио

Часто по радио можно услышать редкие треки, которые не найти в сети. Сохранить весь эфир радиостанции под UNIX можно с помощью простого wget:

wget http://radio.bigbeats.ru:9054/ -O bigbeats-2010-XX-XX.mp3

Тут, правда, есть одна проблема — как потом нарезать mp3 файл на треки? В портах я нашел утилиту mp3split (/usr/ports/audio/mp3splt). Она нарезает файл на треки, находя паузы между песнями в исходном файле. К сожалению, в случае с моей любимой радиостанцией такой прием не срабатывает — переход между треками очень плавный, без пауз. Способа автоматизировать процесс мне пока неизвестно, так что делать все приходится руками (см пункт 2).

Кстати, для прослушивания интернет-радио я использую утилиту mpg123. Вот список неплохих радиостанций:

http://radio.bigbeats.ru:9054/
http://www.dnbradio.com/hi.m3u
http://www.bassdrive.com/v2/streams/BassDrive.pls
http://station20.ru:8000/station-128.m3u
http://radio3.promodeejay.net:8000/300kmh-192
http://16bit.fm:9500/listen.pls

А вот кусок моего .bashrc для быстрого включения музыки:

alias eradio="mpg123 -@ `head -n 1 ~/txt/e-radio.txt`"

Разумеется, всю музыку я покупаю только в магазинах на CD, ниоткуда не скачиваю и никаких радиостанций не граблю. Надеюсь, вы поняли что данный пункт — просто шутка. Ха-ха.

8. Генерируем надписи в ascii art

В портах есть интересная утилита — figlet (/usr/ports/misc/figlet). С ее помощью можно генерировать надписи в ascii art:

$ figlet -f small EAX.ME
 ___   _   __  __  __  __ ___
| __| /_\  \ \/ / |  \/  | __|
| _| / _ \  >  < _| |\/| | _|
|___/_/ \_\/_/\_(_)_|  |_|___|

Полный список поддерживаемых «шрифтов» можно получить, выполнив команду

ls /usr/local/share/figlet

Ну и раз речь зашла об ascii art, грех будет не упомянуть про программу cowsay (/usr/ports/games/cowsay/). Пример ее работы:

$ cowsay -f dragon Subscribe to my RSS feed\!
 ___________________________
< Subscribe to my RSS feed! >
 ---------------------------
      \                    / \  //\
       \    |\___/|      /   \//  \\
            /0  0  \__  /    //  | \ \    
           /     /  \/_/    //   |  \  \  
           @_^_@'/   \/_   //    |   \   \
           //_^_/     \/_ //     |    \    \
        ( //) |        \///      |     \     \
      ( / /) _|_ /   )  //       |      \     _\
    ( // /) '/,_ _ _/  ( ; -.    |    _ _\.-~        .-~~~^-.
  (( / / )) ,-{        _      `-.|.-~-.           .~         `.
 (( // / ))  '/\      /                 ~-. _ .-~      .-~^-.  \
 (( /// ))      `.   {            }                   /      \  \
  (( / ))     .----~-.\        \-'                 .~         \  `. \^-.
             ///.----..>        \             _ -~             `.  ^-`  ^-_
               ///-._ _ _ _ _ _ _}^ - - - - ~                     ~-- ,.-~
                                                                  /.-~

9. Создаем свой словарь для Firefox/Thunderbird/SeaMonkey

По просьбам читателей блога, я отыскал на диске памятку по созданию собственного словаря для программ от Mozilla. Привожу ее как есть — думаю, вы разберетесь:

Страница со словарями:
https://addons.mozilla.org/ru/firefox/browse/type:3

Ссылка на кнопке "Добавить в Firefox":
https://addons.mozilla.org/ru/firefox/downloads/latest/3497/addon-3497-latest.xpi?src=addondetail
Если убрать ?src=..., в диалоге добавления плагина firefox покажет нам, откуда лить плагин:
http://releases.mozilla.org/pub/mozilla.org/addons/3497/united_states_english_dictionary-4.0.0-fx+tb+sm.xpi

тянем wget'ом, аналогично льем русский словарь. Файлы .xpi являются обычными .zip архивами, так что распаковываем их утилитой unzip, затем

$ mkdir en-ru
$ mv en/install.rdf en-ru
$ mv en/install.js en-ru
$ cat en/dictionaries/en-US.dic ru/dictionaries/ru.dic > en-ru/dictionaries/en-ru.dic
$ cat en/dictionaries/en-US.aff ru/dictionaries/ru.aff > en-ru/dictionaries/en-ru.aff
$ cd en-ru
$ zip -r en-ru.xpi ./

Открываем в браузере URL file:///, находим полученный .xpi плагин и устанавливаем.

Полученный плагин можно также использовать в ThunderBird и SeaMonkey.

Я смутно припоминаю, что там был еще какой-то нюанс с повторяющимися строками. Например, если файлы .aff или .dic начинаются с одинаковых строк, значит после их конкатенации «заголовок» должен быть только один.

10. Заключение

Думаю, для первого выпуска достаточно. Ну как вам мои заметки? Я лично доволен — навел наконец порядок в каталоге ~/txt/.

Дополнение: Мини заметки — выпуск 2

  • gx

    понравилось

    • http://eax.me/ Безумный Программист

      Спасибо. Еще такие писать? :)

      • http://twitter.com/i__Ray Ray

        Лишними такие заметки уж точно не будут :)

  • http://www.dimio.org Dimio

    Весьма любопытно. Кстати в примере №3 можно использовать команду cut. При большом количестве вызовов даст прирост скорости.

    • http://eax.me/ Безумный Программист

      О, спасибо! Дописал про cut.

  • SHok

    Прочитал поздновато, но мне понравилось, теперь можно графически немного под оформить скрипт ;))

  • http://i-rs.ru A Harlamenkov

    Александр, добрый день.

    Благодарю Вас за Ваше расширение «Русская и английская орфография в Firefox» (http://eax.me/firefox-thunderbird-en-ru-dict/). Пользовался им очень долго. К сожалению, оно не работает с Firefox выше 3 версии.

    Не могли бы вы обновить его?
    Простая замена номера максимальной версии браузера в расширении не даёт эффекта — расширение в 8-й Firefox устанавливается, но в списке словарей русско-английский не появляется.

    С уважением, Алексей.

  • http://sepetov.ru/ Денис Сепетов

    Могу добавить то, как я решил проблему с хранением таких маленьких заметок у себя. Тоже текстовые файлы не подошли, потому что их стало неимоверно много (чтобы сортировать данные хоть как-то), да и всё равно искать неудобно.

    Я себе просто поставил веб-сервер и потом mediawiki-движок. Там все заметки стал хранить как статьи: и поиск удобный, и отредактировать всегда можно, и сортировать удобно — одну заметку можно хоть в несколько категорий занести.

    P. S. Ощутив подобное удобство я поставил себе в вики несколько расширений и теперь даже видео и музыку храню в ней. Потихоньку все свои данные туда перенесу.

    • http://eax.me/ afiskon

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

      • http://sepetov.ru/ Денис Сепетов

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