Определение транскодов в Linux

Под "транскодом" в данном случае я подразумеваю mp3 файл переконвертированный во flac. Таким образом размер файла раздувается, а качество остается без изменений. На слух, конечно, это тоже вполне заметно, а вот убедиться точно поможет программа Audacity.

Открываем нужный трек (Ctrl+O). Далее из меню Analyze > Plot spectrum построит нам спектрограмму, на которой можно увидеть распределение частот. Lossy форматы отличаются тем, что обрезают верхний диапазон частот для уменьшения размера файла. Это можно пронаблюдать на следующем рисунке:



Виден явный спад в области 16 кГц. А так выглядит спектрограмма нормального трека:

Играемся с lossless в Linux

Опишу решение ряда проблем, вставших перед рядовым слушателем lossless музыки в Linux, в частности Debian-based дистрибутивах (я использую Kubuntu):
  • Конвертация APE -> FLAC
  • Разделение образа диска на треки по CUE файлу
  • Именование треков по тэгам
Для конвертации понадобятся два пакета: flac и mac. Первый устанавливается из репозиториев:
sudo apt-get install flac
Второго в репозиториях нет, поэтому нужно скачать .deb файл отсюда и далее:
sudo dpkg -i mac-3.99-u4_b3-1_i386.deb
Для разделения образа на треки нужны пакеты cuetools и shntool:
sudo apt-get install cuetools shntool
Для именования треков - софтина EasyTAG с непростым GTK фронтэндом:
sudo apt-get install easytag
Конвертим из APE во FLAC все файлы в текущей директории:
shnconv -o flac *.ape
Делим FLAC образ на треки:
cuebreakpoints file.cue | shnsplit -o flac image.flac
Делим APE образ на треки во FLAC:
cuebreakpoints file.cue | shnsplit -o flac image.ape
После разделения у треков будут имена типа "split-track01.flac", это не гуд. Но тэги будут прописаны по CUE файлу, стало быть, можно переименовать файлы согласно тэгам. И в этом поможет EasyTAG, работу с которой описывать смысла нет, ибо gui :(

scp - безопасное копирование файлов между компьютерами

Открываю тэги "useful" и "*nix"! Утилита scp пригодится, если нужно перекинуть файл с одного компа на другой. В большинстве случаев хватает этого синтаксиса:
scp <юзер>@<комп>:<что копировать> <юзер>@<комп>:<куда копировать>
В частном случае утилита может быть использована для передачи файлов между локальным компьютером и удаленным. В таком случае реквизиты <юзер>@<имя компа> локального компьютера можно опустить.

Радости разработки на Django

Недавно заинтересовался разработкой веб-приложений на Python, соотвественно, решил воспользоваться фреймворком Django. В этой заметке хочу описать процесс создания и запуска проекта Django на Apache, ибо запуск приложений на сервере хостера заметно отличается от запуска их на локальном компьютере (что описывается в первых главах DjangoBook), как оказалось.

На моём хостинге уже был установлен Django и соотвествующим образом настроен Apache, поэтому первое, что нужно сделать - это создать проект. В моем случае последовала команда:
~/www/webapp$ django-admin.py startproject mysite
После этого в папке mysite создался проект django, включающий в себя несколько файлов (подробное описание их опускаю, можно найти в DjangoBook).
Далее согласно мануалу нужно создать WSGI-приложение webapp.wsgi следующего содержания:
import os, sys
sys.path.append('/home/www/webapp)
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()
В итоге получаем приветственную страницу Django по ссылке http://сайт/webapp
Чтобы получать доступ к Django из корня сайта, нужно написать rewrite правило в файле .htaccess, который должен располагаться в папочке public_html:
RewriteEngine On
RewriteRule ^(.*)$ /webapp/$1 [L,QSA]
Теперь привественная страничка доступна по нормальной ссылке, далее можно продолжать разработку согласно DjangoBook.

SocksiPy - надеваем носки правильно

SocksiPy - небольшой модуль, призванный решить задачу подключения через SOCKS прокси, которая не реализована в стандартных библиотеках типа urllib и urllib2. Модуль позволяет работать с SOCKS четвертой и пятой версий, а также и с HTTP прокси, поддерживающими метод CONNECT. После установки коннекта поведение объекта не отличается от простого сокета. Пример кода:
import socks
s = socks.socksocket()
s.setproxy(socks.PROXY_TYPE_SOCKS5,"socks.example.com")
s.connect(("www.example.com",80))
Также существует возможность перезаписи стандатного метода сокета так, чтобы все свежесозданные сокеты работали через прокси. Удобно, если в своей программе нужно пустить весь трафик через прокси:
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,"socks.example.com")
socket.socket = socks.socksocket
urllib.urlopen("http://ivinside.blogspot.com/")

Руткиты -3 кольца

Вот здесь появились слайды (в количестве 85 штук) с презентации "Introducing Ring -3 Rootkits", которая проходила в рамках Black Hat USA 2009. До чего хитроумные хакеры дошли! Исполняют свои коды на чипсетах... Соотвественно, если к вам попадет такой руткит, то банальная переустановка ОС уже не поможет. На чипсеты Q35 от Intel руткит загружается через Intel Active Management Technology (AMT). На этих чипсетах установлен процессор типа ARC4 с RISC архитектурой, под который потребуется соотвествующий компилятор. Для последних чипсетов типа Q45 память под AMT дополнительно защищена, так что данные руткиты уже неработоспособны. Читайте подробности в презентации и повышайте квалификацию!

И да, собственно материалы из Лас-Вегаса доступны тут. Очень много интересного.

Samurai WTF

Вышла следующая девелоп версия Samurai WTF - платформы для аудита веб-приложений.
Ченджлог:
Installed Cewl from dijininja.org -- Kevin Johnson
Updated Ubunutu patches as of July 23, 2009 -- Frank DiMaggio
Updated w3af from SVN as of July 25, 2009 -- Kevin Johnson
Fixed sqlninja.sh -- Frank DiMaggio
Fixed sqlmap.sh to include the -h -- Kevin Johnson for Tim Medin
Updated sqlmap to 0.7 -- Frank DiMaggio and Kevin Johnson
Updated Firefox add-on Hackbar -- Kevin Johnson
Updated Firefox add-on XSS Me -- Kevin Johnson
Updated Firefox add-on Header Spy -- Kevin Johnson
Updated Firefox add-on User Agent Switcher -- Kevin Johnson
Updated jBroFuzz to 1.4 -- Kevin Johnson
Upgrade nmap to 5.0 -- Kevin Johnson
Installed Durzosploit from SVN as of July 18, 2009 -- Kevin Johnson
Installed BrowserRider from SVN as of July 18, 2009 -- Frank DiMaggio
Added Jason Wood's username generator scripts -- Kevin Johnson
Updated MaltegoCE to 2.02 -- Frank DiMaggio
Added Laudanum Files -- Kevin Johnson
Added GPScan.rb from dijininja.org -- Kevin Johnson
Added HowTo videos from Pauldotcom -- Kevin Johnson
Картинка:

re - регулярные выражения в python

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

Про квантификацию: жадная, ленивая, ревнивая. Ревнивой я вообще никогда не пользовался, а вот про жадную пару слов. К примеру, символ "точка" означает любой символ. Выражение ".+" означает один и более символов - вплоть до конца анализируемого фрагмента. С таким выражением далеко не уедешь, поясню почему. Имеем следующий фрагмент html-кода:
<a href='www.site.com'>GSOM</a> <b>пум-пу-рум</b>
Если применить к этому фрагменту выражение <a href='(.+)'> с целью получения ссылки, то оно жадно зохавает всю строку, ибо последний знак ">" встречается и в самом в конце! Уталить жадность точки поможет вопросительный знак. И вот, если применить выражение "<a href='(.+?)'>", то получим то, что надо: www.site.com

Вообще, у меня выражение (.+?) - одно из самых востребованных при парсинге html-кода.
В качестве примера проапгрейдим один из предыдущий с выдачей гугла так, чтобы на экран выводились только ссылки по запросу:
import urllib2, re

search = 'ivinside.blogspot.com'
headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}
req = urllib2.Request("http://www.google.ru/search?q=" + search + "&start=0&ie=utf-8&oe=utf-8", None, headers)
response = urllib2.urlopen(req)

for url in re.findall(r'<class="r"><href="(.+?)">')
Итак регулярное выражение '<class="r"><href="(.+?)">' откуда я его взял? Посмотрел в исходнике выдачи гугла и увидел нечто похожее на <h3 class=r<>a href="http://site.com" target=_blank class=l ... и применил к этому своё излюбленное точка-плюсик-вопросительный-знак. То-то же.

urllib2 - начало

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

Простейший пример:
import urllib2
response = urllib2.urlopen('http://ivinside.blogspot.com/')
print response.read()
Эта программа показывает на экран html-кодесы данного блога. Но не всегда можно получить содержимое странички, например, результаты поиска в Google таким образом не посмотришь, ибо он фильтрует по строке User-Agent всякие нежелательные приложения, в питоне по умолчанию она что-то типа "Python-urllib/2.5".

С помощью следующего кода выводим на экран результат поиска в гугле по запросу "ivinside.blogspot.com", прикидываясь Internet Explorer под Vista:
import urllib2

search = 'ivinside.blogspot.com'
headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}
req = urllib2.Request("http://www.google.ru/search?q=" + search + "&start=0&ie=utf-8&oe=utf-8", None, headers)
response = urllib2.urlopen(req)
print response.read()
Ну, и напоследок сегодня, как заполнять веб-формы. Возьму для примера веб-сервис whois. Как посмотреть какие параметры при этом передаются в запросе POST? Я смотрю плагином Live HTTP headers для Firefox и считаю его приемлемым. Итак, заполняем первую форму вручную, нажимаем кнопочку и смотрим в окно плагина. Там, среди всего прочего, будут интересующие нас параметры:
Host=whois.ripn.net&Whois=test.ru
Добавим их как параметры функции, предварительно закодировав, как того требует спецификация:
import urllib
import urllib2

headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}
values = {'Host' : 'whois.ripn.net', 'Whois' : 'test.ru'}
data = urllib.urlencode(values)
req = urllib2.Request('http://www.ripn.net:8082/nic/whois/whois.cgi', data, headers)
response = urllib2.urlopen(req)
print response.read()
Ок, получили страничку, где содержится информация про домен test.ru
В следующей заметке, наверно, расскажу про регулярные выражения, чтобы из полученных страничек можно было извлекать нужные данные.

Python для чайников и профи

Всем тем, кто не в теме змеиного языка и не знает, стоит ли его вообще изучать могу порекомендовать ознакомиться с соотвествующей статьей в Абсурдопедии. Если вам она показалось забавной, то не всё потеряно и можно даже попробовать ознакомиться со статьей из Википедии.

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

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

Вот недавно заказал многообещающую книжку Изучаем Python, 3-е издание, с нетерпением жду доставки. Очень хотелось бы ознакомиться с Gray Hat Python: Python Programming for Hackers and Reverse Engineers, но с амазоном я, к сожалению, не дружу.