В последнее время у меня накопилось множество мелкий наработок. В основном это скрипты и фильтры для 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.
3. Элементарный пример использования awk
Мне не часто приходится использовать эту утилиту, но иногда она бывает очень полезна. Чтобы сэкономить себе немного времени в следующий раз, когда она мне понадобится, я решил выложить простейший пример ее использования:
cat file.txt | awk 'BEGIN{FS="\t"}{print $1}'
Если file.txt содержит строки с некоторыми данными, разделенными знаками табуляции, данный пример выведет первый столбец данных.
Update: Как совершенно верно отписал в комментах
СетевойГибитобой , команда cut справится не хуже:
cut -d : -f 1,7 /etc/passwd # вывести логин:шелл4.
Снимаем скринкаст во FreeBSD
С помощью ffmpeg можно захватывать видео с экрана:
ffmpeg -f x11grab -s 1280x1024 -r 30 -b 1500k -i :0.0 nodump/out.mpg
Захватывать можно не весь экран, а только его часть. Размер захватываемой области задаются с помощью ключа -s, а координаты левого верхнего угла можно задать ключом -i
-i :0,0+100,50
В приведенном примере 100 – это смещение по X, 50 – по Y. К видео потом можно прикрепить комментарии или музыку (см примеры с ffmpeg в пункте 2).
Чтобы снимать скринкасты с помощью 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;
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]
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/. Если пост вам понравился,
подпишитесь на RSS , чтобы не пропустить новые записки программиста