воскресенье, 24 августа 2008 г.

Ruby, jabber,etc...

Еще в седые времена было сказано - самый правильный способ разобраться с языком программирования - писать на нем программы. Можно прочитать несколько книжек, перерыть массу туториалов, но без реальной практики толку от этого всего будет не очень много. Можно, конечно, еще пытаться выполнять задачки которыми иногда автора свои книжки насыщают, и смею заметить польза от этого будет, но часто подобные задачки с одной стороны к реальному миру отношение имеют посредственное(хотя и позволяют закрепить на практике то о чем было рассказано в теории), а с другой - в силу своей надуманности, не особо то и интересны. После изучения какого-то базового уровня, полезно посматривать в сторону собственных практических экспериментов: даже если код будет корявым, даже если для того чтобы работало как надо - прийдется переделать все с нуля, - в последствии новые знания будут ложится на хоть как-то сдобренную почву, а не висеть в воздухе, и как бы применить ту или иную advanced фичу языка будет понятней гораздо лучше, чем если бы вы просто читали страницы учебника. Примерно так я разбирался с perl'ом, который сейчас достаточно активно использую.

В последнее время perl в около-IT'шной среде принятно ругать(это наверное тема для отдельного разговора), а хвалят в связи с этим чаще всего python, иногда ruby. C python'ом я когда-то игрался, и мне даже нравилось, но сейчас особых чувств к этому языку не испытываю. С ruby как-то особо не сталкивался, хотя судя по отзывам штука достаточно интересная. Во время небольшой передышки на работе нахватался кусков из книг, а вчера в очередной раз посетило желание поиграться с jabber'ом. Погуглив на предмет библиотек для работы с XMPP, для Ruby, нашел XMPP4R, которая оказалась чудовищно простой в обращении, даже с моим минимальным знанием самого ruby.

Вобщем первоначальная задача достаточно банальна - на моем домашнем сервере крутится некий сервис, который сам по себе не очень стабилен, и иногда требует перезапуска - фактически чего-то типа /etc/init.d/servicename restart. Обычно я логинюсь туда по ssh, делаю это черное дело, и до следующего раза(условие рестарта достаточно призрачное - поэтому заскриптовать делать это автоматически не получится). Хочется чтобы я мог сказать jabber боту, который будет запущен с того сервера - restart, а он уже сам запустит нужные команды для переазпуска. С помощью google и ruby у мну получился такой маленький бот, который способен посмотреть что ему ввели, и в зависимости от правильности ввода, или выполнить то что требуется, или послать нафиг :) В качестве примера здесь будет не рестарт сервиса, а выполнение команды dig, в случае если вы напишите что-то похожее на имя домена, или же предложение ввести имя домена, если то что вы ввели слабо походит на домен. Возможно кому-то будет полезно :)



#!/usr/bin/ruby
require 'xmpp4r/client'
include Jabber

def usage
puts "Usage: " $0 " jid password destination-jid"
exit
end

def reconnect(cl,password)
cl.connect
cl.auth(password)
cl.send(Presence.new.set_type(:available))
puts `date`
end

#Jabber::debug = true

jid = ARGV[0]
password = ARGV[1]
to = ARGV[2]
unless jid && password
usage
end

cl = Client::new(jid "/BOT-MODE")
cl.connect
cl.auth(password)

cl.on_exception { sleep 5; reconnect(cl,password) }

cl.send(Presence.new.set_type(:available))

if to
subject = "XMPP4R test"
body = "Give me a domain name and I will do some magic for you"
m_to = Message::new(to, body).set_type(:normal).set_id('1').set_subject(subject)
cl.send m_to
end

mainthread = Thread.current

cl.add_message_callback do |m|
if m.body =~ /^[a-zA-Z0-9.-] \.[a-zA-Z.]{2,5}$/
dig = "\n"
dig = `dig noall answer #{m.body}`
dig = "===========\n"
dig = `dig noall answer NS #{m.body}`
dig = "===========\n"
dig = `dig noall answer MX #{m.body}`
dig = "===========\n"

m_to = Message::new(m.from, dig ).set_type(:normal).set_id('1').set_subject(subject)
cl.send m_to

elsif m.body != nil
body = "Give me a domain name and I will do some magic for you"
m_to = Message::new(m.from, body).set_type(:normal).set_id('1').set_subject(subject)
cl.send m_to
puts "response sended to #{m.from}"
end
puts m.from,m.type, m.body if m.body != nil
end

### keep alive
Thread.new do
while true do
if cl.is_connected?
cl.send(Presence.new)
else
reconnect(cl,password)
end
sleep 30;
end
end
Thread.stop
cl.close

Готовый файл можно стянуть отсюда: http://muaddeep.googlepages.com/jabber-cl.rb, комменты от знатоков приветствуются. На что здесь нужно обратить внимание:
  • если вы настраиваете add_message_callback так чтобы отвечать всем кто вам что-либо напишет, то нужно обратить внимание что ответы эти будут идти и на всякие presense notifications, и есть риск заспамить всех кто в данный момент в он-лайн. Поэтому нужно проверять что в message body точно что-то есть.
  • Полезной является практика напоминать серверу о своем присутствии(иначе соединение разрывается, а скрипт сегфолтится), а так же автоматически переконнекчивать бота в случае если соединение все-таки разорвалось(на домашнем jabber-сервере соединение разорвалось где-то через час, на "настоящих" все происходит гораздо быстрее).
  • Статьи рекомендованные на http://home.gna.org/xmpp4r/ и примеры которые идут с пакетом, многое объясняют :)
Всех кого это касается с Днем Независимости! До новых встречЪ.:)

пятница, 8 августа 2008 г.

CLI, as I use it. Part 2. awk.

Когда речь заходит о работе с таблицами, прежде всего в голову приходит конечно же небезызвестный MS Excel, или его аналоги: Open Office Calc, Google Spreadsheets и так далее. Эти средства конечно же неплохо визуализируют данные, и хороши если данные сами по себе представляют для нас какую-либо ценность. Если же нам с этими данными нужно какие-то активные манипуляции провести, выбрать какую-либо их часть, а потом на основе этой выборки, еще чего-нибудь сотворить - все сразу становится сложным, непонятным, и совсем неинтуитивным. Тогда следует вспомнить что и в бинарном xls, и в xml'ном ods все сложности и навороты связаны прежде всего с тем что: нужно сохранять оформление таблиц, нужно где-то сохранять информацию о использовании тех 80% функциональности, которые редко кто использует(Вы часто строите трехмерные диаграммы в офисном пакете? - я, например, последний раз это делал на уроках информатики в школе ... тем не менее если вдруг решитесь - это все богатство легко уместится в xls или ods).

А для представления обычной таблицы, достаточно ведь гораздо меньшего! В простейшем случае строки таблицы могут быть строками текстового файла, а поля в каждой строке разделятся каким-либо символом(или символами), которы никогда в самих полях не встретится. Для более сложных случаев можно использовать csv.

Подобные текстовые таблицы встречаются в unix-системах на каждом шагу, наиболее известным примером может быть файл /etc/passwd.

Как я уже писал в первой части для работы с подобными таблицами удобной может быть утилита awk(1).

awk - язык програмирования, который неплохо подходит для обработки форматированных текстовых данных. Первая версия интерпретатора awk появилась еще на заре unix'состроения и с тех пор ту или иную реализацию можно найти практически в любой unix, или unix-подобной системе. Насколько я понимаю, в современных linux'ах awk встречается в виде gawk - версия awk от проекта GNU; а так же в более легком, но немного урезанном по функциональности варианте - mawk. mawk, например, по-умолчанию устанавливается в Debian. Основная функциональность одинакова во всех возможных вариантах, различия как правило в деталях.


Интерпретатор awk можно вызывать либо с указанием файла сценария:


awk [параметры] -f 'имя файла сценария' [файл(ы)]

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


awk [параметры] 'сценарий' [файл(ы)]

где "[файл(ы)]" - имя файла или файлов которые awk-сценарий и будет обрабатывать.


awk-сценарий выполняется над каждой строкой входного файла, исключение представляют собой блоки BEGIN{} и END{}, которые выполняются соответственно в начале, и в конце работы сценария (условно говоря - перед началом чтения файла(ов) и после того как прочитана последняя строка).

Каждая обрабатываемая строка, доступна awk-сценарию через переменную $0. Если исходный файл представляет собой текстовую таблицу,разбитую на поля каким-то определенным разделителем, то в переменных $1,$2,...$n окажутся значения этих полей. По-умолчанию, разделителями считаются пробельные символы; задать свой вариант разделителя можно либо в блоке BEGIN, или с помощью параметра -F. Например, логины пользователей из /etc/passwd можно вывести следующим образом:


diesel@indie:~$ awk -F: '{print $1}' /etc/passwd
diesel@indie:~$ awk 'BEGIN{FS=":"} {print $1}' /etc/passwd

Программа на awk представляет собой набор блоков, каждый блок состоит из условия, и списка команд которые будут выполнятся если условие истинно. Команды в блоках заключаются в фигурные скобки. Блок перед которым не стоит никаких условий, например {print $1} из примера выше, будет выполняться на каждой обрабатываемой строке.

В качестве условия может выступать регулярное выражение заключенные в символы // - в таком случае с регулярным выражением будет сравниваться вся входная строка; операции сравнения с регулярным выражением, например $1~/regexp/ или $1!~/regexp/; а так же другие операции отношения, например $1 == "test". Допустим, вывести логины пользователей, которые начинаются с буквы d можно вот таким вот нехитрым образом:
diesel@debian:~$ awk -F: '/^d/{print $1}' /etc/passwd
daemon
diesel

В отличии от shell, или скажем perl, имена переменных в awk не предваряются символом $ . Конструкция вида $a будет трактоваться как "поле, номер которого, содержится в переменной a", Например результат выполнения команды:awk -F: '/^d/{a=1; print $a}' /etc/passwd, будет аналогичен тому что мы получили в предыдущем примере. Существует стандартная переменная NF в которой содержится колличество полей в текущей строке, print $NF напечатает содержимое последнего поля, print $(NF-1) - содержимое предпоследнего, и так далее.

Кроме NF, и FS следует обратить внимание еще на несколько специальных переменных: RS, OFS, ORS. RS(Record Separator) - задает разделитель строк("записей") нашей виртуальной текстовой таблицы. По-умолчанию, - перевод строки, но в блоке BEGIN{} это легко исправить. Допустим у нас есть файл вида:
diesel@debian:~$ cat test
Name: John Smith
Town: New Yourk

Name: Alex Diesel
Town: Nikolaev

В котором разделителем полей является перевод строки(\n), а разделителем строк таблицы - пустая строка(\n\n); Превратить это в более "табличную" форму можно вот так:

diesel@debian:~$ cat test|awk 'BEGIN{RS="\n\n"; FS="\n"} {print $1" "$2}'
Name: John Smith Town: New Yourk
Name: Alex Diesel Town: Nikolaev

Конкатенация строк, как видите, до боли проста, просто записываем подряд все строки которые нам хочется соединить(пробельные символы вне кавычек не учитываются, поэтому print $1 " " $2 сделает ровно тоже самое). Хотя в данном случае было бы неплохо не ставить после каждой переменной один и тот же разделитель, а задать общий разделитель для строк которые мы печатаем в print, для этого можно воспользоваться еще одной специальной переменной: OFS(Output Field Separator):

diesel@debian:~$ cat test|awk 'BEGIN{RS="\n\n"; FS="\n"; OFS=";"} {print $1,$2}'
Name: John Smith;Town: New Yourk
Name: Alex Diesel;Town: Nikolaev

А если мы хотим еще и сохранить исходный разделитель строк(\n\n), то к нашим услугам будет переменная ORS(Output Record Separator):


diesel@debian:~$ cat test|awk 'BEGIN{RS="\n\n"; FS="\n"; OFS=";"; ORS="\n\n"} {print $1,$2}'
Name: John Smith;Town: New Yourk

Name: Alex Diesel;Town: Nikolaev


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

Иногда хочется при выводе результатов произвести некоторые замены, например, нам не очень сильно нужны "Name:" и "Town:", из предидущего примера. Конечно, можно воспользоваться sed'ом:


diesel@debian:~$ cat test|awk 'BEGIN{RS="\n\n"; FS="\n"; OFS=";"} {print $1,$2}' |sed -e 's!Name: !!g; s!Town: !!g'
John Smith;New Yourk
Alex Diesel;Nikolaev

но можно обойтись и awk, благо есть целый набор функций для операций со строками, например gensub:


diesel@debian:~$ cat test|awk 'BEGIN{RS="\n\n"; FS="\n"; OFS=";"} {print gensub("^Name: ","","",$1),gensub("^Town: ","","",$2)}'
John Smith;New Yourk
Alex Diesel;Nikolaev

Функция ожидает указания: того что заменяем, того на что заменяем, опций для замены(здесь фактически можно указать только "g", - глобальная замена в строке - то есть заменять все найденные совпадения, а не только первое), и собственно строки в которой замену проводить, а возвращает строку-результат замены. Если gensub в вашей версии awk нет, скорее всего окажется gsub, gsub не возвращает результата замены, а сохраняет результат в той же самой переменной в которой мы дадим ей строку(возвращает эта функция как раз таки колличество проведенных замен, поэтому и возможности указать"g" в качестве опции не имеет, итого колличество параметров на один меньше), получится несколько длинее, но результат будет достигнут:


diesel@debian:~$ cat test|awk 'BEGIN{RS="\n\n"; FS="\n"; OFS=";"}
{ gsub("^Name: ","",$1);
gsub("Town: ", "", $2);
print $1,$2
}'
John Smith;New Yourk
Alex Diesel;Nikolaev

Фактически, основная сфера использования awk - мелкие однострочники, иногда в состве shell-скриптов, сценариев на awk, занимающих более 20 строк я видел достаточно мало, - сколько-нибудь большие скрипты предпочитают писать на "олдскульном" perl, или "модных" ныне python, и ruby. В составе shell-скриптов иногда хочется передать awk значение какой-нибудь shell-переменной. Самый простой способ(но не единственный) это сделать вот так:


diesel@debian:~$ cat passwd_pattern.sh
#!/bin/bash
awk -F: '$1~/'$1'/{print $1}' /etc/passwd;

В качестве второго $1 подставится значение переменной $1 из shell'а - первый параметр переданный shell скрипту, например:


diesel@debian:~$ ./passwd_pattern.sh ^d
daemon
diesel

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


diesel@debian:~$ cat ./passwd_pattern.sh
#!/bin/bash
awk -F: '$1~/'$1'/{print "userdel " $1}' /etc/passwd;
diesel@debian:~$ ./passwd_pattern.sh ^d
userdel daemon
userdel diesel
diesel@debian:~$ ./passwd_pattern.sh ^d |sh

В awk вобщем-то есть и условный оператор, и разнообразные циклы, и еще много разных функций, обо всем этом рекоменду читать при необходимости man-страницу, там достаточно подробно все рассказано. Пост все-таки про "as I use it", и тот subset awk, который я использую, описан выше. На закуску сегодня будет еще один пример.


Время от времени меня посещают странные идеи заставить мой домашний proftpd писать логи в MySQL, дабы логи эти было потом легче разбирать и выводы строить. Пожалуйста, не надо предлагать мне системы анализа логов - я про них знаю, да и речь сейчас не об этом. Но даже если этот самый proftpd начнет сегодня писать логи в базу, останутся ведь текстовые логи за вчера, и позавчера.... ну вы поняли, которые бы хорошо для статистики тоже в базе иметь. И поможет нам в этом awk. :)

Допустим таблица база данных имеет вот такую структуру:


CREATE TABLE downloads(
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(30),
filename VARCHAR(256) ,
size BIGINT,
host VARCHAR(30),
ip VARCHAR(16),
action VARCHAR(8),
duration VARCHAR(8),
time timestamp NULL default NULL,
success TINYINT,
PRIMARY KEY (id)
);

Лог, который пишет proftpd по умолчанию выглядит вот таким вот образом:


Sun Jan 13 16:24:12 2008 222 192.168.62.53 40622476 /srv/ftp/debian/debian_main/pool/main/g/gcj-4.1/libgcj-doc_4.1.1-20_all.deb b _ o a ftp 1 * c
Sun Jan 13 16:24:24 2008 11 192.168.62.53 9030846 /srv/ftp/debian/debian_main/pool/main/g/gcj-4.1/libgcj7-0_4.1.1-20_i386.deb b _ o a ftp 1 * c
Sun Jan 13 16:24:24 2008 0 192.168.62.53 80180

А вот небольшой скрипт, который эти непонятные строки, превращает в что-то более полезное и осмысленное:


#!/bin/bash

FILENAME=$1;

if [ x"$FILENAME" == "x" ]; then
echo " Script for converting proftpd logs into mysql queries. Usage: $0 ";
exit;
fi

awk '{
if ( $18 == "c"){
success="1";
}else{
success="0";
}

month=$2;

sub("Jan","01",month);
sub("Feb","02",month);
sub("Mar","03",month);
sub("Apr","04",month);
sub("May","05",month);
sub("Jun","06",month);
sub("Jul","07",month);
sub("Aug","08",month);
sub("Sep","09",month);
sub("Oct","10",month);
sub("Nov","11",month);
sub("Dec","12",month);

time=$1" "$2" "$3" "$4" "$5;
time=$5"-"month"-"$3" "$4;
print "INSERT INTO downloads (username,filename,size,host,ip,action,duration,time,success)"
print "VALUES (\""$14"\",\""$9"\",\""$8"\",\""$7"\",\""$7"\",\"RETR\",\""$6"\",\""time"\",\""success"\");";
}' "$FILENAME"


Работает это все примерно вот так:
diesel@debian:~$ ./proftpd-for-blog.sh test_log
INSERT INTO downloads (username,filename,size,host,ip,action,duration,time,success)
VALUES ("ftp","/srv/ftp/debian/debian_main/pool/main/g/gcj-4.1/libgcj-doc_4.1.1-20_all.deb","40622476","192.168.62.53","192.168.62.53","RETR","222","2008-01-13 16:24:12","0");
INSERT INTO downloads (username,filename,size,host,ip,action,duration,time,success)
VALUES ("ftp","/srv/ftp/debian/debian_main/pool/main/g/gcj-4.1/libgcj7-0_4.1.1-20_i386.deb","9030846","192.168.62.53","192.168.62.53","RETR","11","2008-01-13 16:24:24","0");
diesel@debian:~$ ./proftpd-for-blog.sh test_log | mysql -u root test_for_blog
diesel@debian:~$ mysql -e 'select * from downloads limit 1 \G' -u root test_for_blog
*************************** 1. row ***************************
id: 1
username: ftp
filename: /srv/ftp/debian/debian_main/pool/main/g/gcj-4.1/libgcj-doc_4.1.1-20_all.deb
size: 40622476
host: 192.168.62.53
ip: 192.168.62.53
action: RETR
duration: 222
time: 2008-01-13 16:24:12
success: 0

Да, конечно, INSERT можно(и даже нужно) не повторять на каждой строке, как модифицировать для этого написанное мной, предлагаю подумать самостоятельно. А я спешу откланяться, до новых встречь!

CLI, as I use it. part 1.

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

Достаточно много всего про shell, и традиционные unix-утилиты написано, но вопросы у людей все-равно продолжают возникать, никуда от этого не денешься. Я не собираюсь перекрывать мировой опыт использования unix с момента зарождения - мой личный достаточно скромен, равно как не хочу писать очередной туториал для новичков. Просто некоторые заметки о том как я этим всем пользуюсь, с некоторыми лирическими отступлениями.

Так или иначе, многим из нас приходится ежедневно работать с текстовой информацией. Часть информации ценна сама по себе - например, если вы продолжаете читать этот пост, то какую-то ценность для вас, информация здесь изложенная представляет. Есть же и такая текстовая информация, которая становится нам интересной после некоторой обработки. Возьмем например святая-святых всех линуксоидов - исходники ядра - очень много текстовых файлов, в которых сам черт ногу сломит. А "много" - это сколько?
diesel@debian:/usr/src/linux-2.6.20$ find -type f|wc -l
23638
Ого, и места же это добро наверное занимает много?


diesel@debian:/usr/src/linux-2.6.20$ du -hs .
283M
Не мало, да. Сколько же труда, пота и крови в это все вложено!

diesel@debian:/usr/src/linux-2.6.20$ grep -irE 'fuck' . |wc -l
51
Ага, программисты не стеснялись выражать своих чувств! Интересно, а что давалось тяжелее всего?

diesel@debian:/usr/src/linux-2.6.20$ grep -irE 'fuck' . |cut -d/ -f2 |sort | uniq -c |sort -n
1 Documentation
1 lib
2 fs
2 sound
4 include
5 net
12 drivers
24 arch
И вот уже какая-то ценность от огромной кучи непонятных файлов, после соответствующей обработки начинает появляться :). Пусть даже в данном конкретном случае ценность весьма относительная, аналогичная конструкция иногда оказывается действительно полезной.

Для себя могу выделить две большие группы задач, которые приходится решать достаточно часто, используя традциционные unix-утилиты: различного рода переформатирование текстовой информации, например, если мы имеем .csv файл, а хотим из этого дела сделать sql-дамп для того чтобы загнать потом этот csv в базу данных; а так же поиск и замена - тут я думаю примеров не надо. Так уже сложилось что для разного рода переформатирований чаще всего используется awk; традиционными инструментами для поиска и замены конечно же являются grep и sed; конечно же есть еще и перловые однострочники, но с одной стороны - это тема для совсем отдельного разговора; с другой - с однострочным perl'ом я знаком достаточно посредственно, поэтому много на эту тему рассказать не могу, perl чаще всего использую для "клинических" случаев, которых не так уже и много.

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

суббота, 2 августа 2008 г.

podcasts vs. me

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

mp3-плейер, который я с собой постоянно таскаю у меня уже где-то года полтора, сначала был T.sonic 610, сейчас iPod Video, но за все время, единственное что удалось прослушать из аудиочтива - был какой-то рассказ, которого хватило на несколько поездок на работу. Сам читаю я хоть и достаточно быстро, но иногда останавливаясь, подумывая о том что прочитал, могу даже зависнуть надолго над обдумыванием мысли. Когда же текст читается тебе в уши, то успеваешь фактически только сам текст и ловить, а вот мысленное пережевывание полученной информации - теряется. Если же задумаешься - то потеряешь текст, прийдется отматывать назад. Нажимать на паузу - тоже так себе выход, ибо мысль о том что "я сейчас подумаю мысль, а потом продолжу", сама по себе перебивает мысль о которой хотел подумать :) Вобщем грустно это все как-то и неинтересно.

Причем тут все еще надо домножить на то что "плотность" информации в книгах гораздо выше чем плотность информации в обычном разговоре, - писатель ведь мог вымучивать свое творение годами! - в отличии от импровизирующих радиоведущих. Разговорное радио, кстати, я воспринимаю достаточно неплохо, и наше украинское Радио Эра, вещающее в FM-диапазоне, часто слушаю на кухне, пока готовлю еду, или эту еду поглощаю(да, я иногда не ем за компьютером). По ту сторону радиоэфира все-таки сидят такие же люди, как и все мы, и стараются говорить так чтобы было понятно и интересно.

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

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

Прослушивать это все дело можно по разному, один из типичных случаев: подписываемся на RSS-ленту подкаста, через программу которая знает о том что такое подкаст, и как это все дело качать. При адпейтах в RSS-ленте программа скачивает новые выпуски подкастов, а уж вы потом решаете как и где это добро слушать. В роли такого подкаст-агрегатора скорее всего может выступать ваш плейер. Под Mac'ом - это конечно же iTunes, под Linux с этим могут управляться например Amarok или Rythmbox. Если же в роли плейера на котором подкасты будут слушаться выступает iPod, то собственно с помощью этих самых программ их можно на iPod и скинуть.

Сразу скажу - идеального плейера, который умел бы еще и подкасты собирать я для себя пока не нашел. Под Mac'ом пользуюсь iTunes, основная проблема с ним, - иногда он недокачивает файлы, но никак об этом не сигнализирует. В итоге получается трэк длиной меньшей, чем оригинальный подкаст, и как всегда об этом узнаешь когда дослушал до конца, но оказывается что это еще не конец. Приходится удалять файл и перекачивать заново, что в iTunes как-то не очень-то и удобно делать(я бы сказал совсем неудобно). Конечно же, в плане копирования на iPod тут проблем не возникает. Есть также некоторые непонятки в плане управления тэгами подкастов, - которые не всегда прописываются одинаково, что не хорошо смотрится на "железном" плейере.

В Amarok проблем с загрузкой не встречал - если файл недокачан - он честно об этом пишет. Кроме того есть возможность достаточно легко ассоциировать скачанный сторонними программами файл, с конкретным подкастом в ленте. Тут, традиционно возникают проблемы с загрузкой этого всего добра на плейер: у меня терялись так называемые "show notes", терялась эмблема подкаста, про то что могут быть еще и видеоподкасты похоже Amarok тоже не в курсе. Про Rythmbox единственное что могу сказать - как-то оно работало, что-то даже качало, правда удобным мне этот плейер не показался, и не смотря на всю мою любовь в Gnome, в качестве плейера я все же использую Amarok.

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

По поводу того где стоит искать сами подкасты. В рунете, насколько я понимаю, есть два подкаст-каталога: http://rpod.ru, и http://podfm.ru. Кроме того некоторые сайты имеют собственные подкасты, а некоторые большие подкасты имеют собственные сайты, с которых рекомендуется и подписываться на соответствующие RSS-ленты.

rpod.ru - старейшая, и до недавнего времени единственная подкаст-директория, на просторах рунета, проект небезызвестного в узких кругах Василия Стрельникова. Через rpod собственно мое знакомство с миром подкастинга началось, но особого фанатизма, или же интереса к сайту как-то не возникает. Возникает ощущение свалки - можно найти и очень хорошие интересные вещи, но среди груды мусора попробуй их рассмотри. Сайт выглядит не больно-то и приятно, имеет вполне сложившуюся "тусовку", с которой, судя по коментам к подкастам, особо много общего у меня нет.

podfm - проект достаточно молодой, появился совсем недавно, подкастов там не так много, но, похоже, в процентном соотношении вменяемости и мусора, у rpod'а выигрывает. Интерфейс тоже как-то поприятнее будет.

Что слушаю я сам, и что мог бы порекомендовать послушать заинтересовавшимся. Стоит обратить внимание на творчество человека с ником Umputun. Во-первых, один из самых популярных в рунете подкастов - Радио-Т - еженедельный IT-подкаст, посвященный в основном обсуждение новостей, сплетен, слухов из около IT-шного мира. Ведущие - собственно сам Umputun,Bobuk, и с недавнего времени gray, - имеют большой опыт работы в IT-cфере, и каждую неделю делятся этим опытом с слушателями. Во-вторых, есть сольный подкаст Umptun тоже еженедельный в котором он делится своими впечатлениями за неделю. Подкаст менее хай-технический, но все же послушать приятно. Приятно в том числе и потому что Umputun много внимания уделяется качеству звука, своими опытами в этом направлении он делится в своем третьем подкасте - Теория и Практика Звукозаписи. Если вы решили записывать подкасты, и хотите чтобы это звучало более-менее пристойно - вам туда :). Не уходя далеко от Радио-Т, советую так же обратить внимание на подкаст gray'а "IT-мысли". Из подкастов на линуксовую тематику, нашел на podfm L-talk - послушать интересно, пока подводит качество звука.

Из подкастов "о жизни" - стоит обратить внимание на личную подкаст-ленту Артема Росновского, - автор настоящий радиоведущий, работает на радио Маяк, в свободное от работы время активно занимается продвижением подкастинга в массы. Подкаст хорошо поднимает настроение после тяжкого трудового дня :). До недавнего времени интересно было слушать "подкаст ни о чем" - Кадры. Соведущая Кадров - Оляпка - была в свое время соведущей Радио-Т, второй ведущей - Рахим(freetonik) - известен еще несколькими своими подкастами, а так же сайтом о подкастинге - http://www.podcastim.ru/. Последний выпуск "Кадров" который я слышал(он не последний из тех что есть на сайте) - как-то совсем не понравился, сложно сказать почему - наверное уж слишком много развязанности, и "ниочемности", первые выпуски были приятнее. Если запал новизны пропал, и подкаст вышел на свои обычные рейки, то пожалуй, от этих реек я отпишусь.

Если вам надоели разговоры, и хочется немного музыки, есть и музыка! Нашел на podfm подкаст о джазе - "Джаз-пик", и хотя я себя к любителям джазовой музыки не отношу - для разнообразия послушать приятно и интересно.

Ну и напоследок еще один IT-подкаст - Хабракаст - не смотря на не очень хороший звук - интересно. Подкаст делается по мотивам известного в рунете портала: habrahabr.ru. Однозначного отношения к Хабру у меня нет - все думаю может зарегистрироваться там, но как-то понимания того чего же там делать, не возникает. С одной стороны вроде и интересная штука; с другой - какая-то непрозрачно-враждебная в отношении новых пользователей. А подкаст слушается неплохо :)

Вот примерно и все что хотелось рассказать. Хм. вернее хотелось возможно и больше, но кажется и так пост каким-то уж очень большим получается, поэтому на этом месте резрешите откланятся. А слушаете ли подкасты вы? Чего бы интересного могли бы порекомендовать?

Книжное.

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

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

Если вспоминать более-менее не технические книги которые я за последние время прочитал, то вспоминается только одна, да и та с "привкусом" IT - очередная вариация на тему истории Apple и жизнеописаний Стива Джобса: iKona, Стив Джобс, Вильяма Л. Саймона и Джеффри С. Янга. Как показывают результаты гугления - это дело легче скачать, чем купить, хотя, у меня оно бумажное - так уж получилось. Книга не блещет особой литературной стройностью, но может быть интересна, для тех кому по каким-то причинам интересна сама тема. Про историю Apple и ее основателя написано достаточно много, даже на русском языке - это далеко не первый опус на эту тему, но почитать, наверное, какой-то смысл есть. Читать с монитора, или покупать бумажную - тут уж выбор каждый делает персонально, я, например, предпочитаю бумажные варианты, ибо как-то к чтению с монитора так привыкнуть и не смог, равно как с трудом понимаю читающих с мобильных телефонов и прочих девайсов в транспорте.

Совсем недавно где-то в RSS-лентах попалась ссылка на другой в достаточной мере интересный, околоITшный полулитературный опус Игоря Ашманова "Жизнь внутри пузыря". История времен небезизвестного "краха доткомов", где через призму работы автора над одним известным интернет-проектом показываются тогдашние реалии, которые неплохо и сегодняшним днем коррелируют. Полезные зарисовки, мне кажется.

Вобщем, какой-то небогатый набор, да и то все какое-то околокомпьютерное. Вроде и просится на язык фраза "надо бы и о душе подумать", но как-то думать особо не хочется. Да, думать как-то совсем не хочется :)