Под "транскодом" в данном случае я подразумеваю mp3 файл переконвертированный во flac. Таким образом размер файла раздувается, а качество остается без изменений. На слух, конечно, это тоже вполне заметно, а вот убедиться точно поможет программа Audacity.
Открываем нужный трек (Ctrl+O). Далее из меню Analyze > Plot spectrum построит нам спектрограмму, на которой можно увидеть распределение частот. Lossy форматы отличаются тем, что обрезают верхний диапазон частот для уменьшения размера файла. Это можно пронаблюдать на следующем рисунке:
Виден явный спад в области 16 кГц. А так выглядит спектрограмма нормального трека:
Играемся с lossless в Linux
Опишу решение ряда проблем, вставших перед рядовым слушателем lossless музыки в Linux, в частности Debian-based дистрибутивах (я использую Kubuntu):
- Конвертация APE -> FLAC
- Разделение образа диска на треки по CUE файлу
- Именование треков по тэгам
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, поэтому первое, что нужно сделать - это создать проект. В моем случае последовала команда:
Далее согласно мануалу нужно создать WSGI-приложение webapp.wsgi следующего содержания:
Чтобы получать доступ к Django из корня сайта, нужно написать rewrite правило в файле .htaccess, который должен располагаться в папочке public_html:
На моём хостинге уже был установлен Django и соотвествующим образом настроен Apache, поэтому первое, что нужно сделать - это создать проект. В моем случае последовала команда:
~/www/webapp$ django-admin.py startproject mysiteПосле этого в папке mysite создался проект django, включающий в себя несколько файлов (подробное описание их опускаю, можно найти в DjangoBook).
Далее согласно мануалу нужно создать WSGI-приложение webapp.wsgi следующего содержания:
import os, sysВ итоге получаем приветственную страницу Django по ссылке http://сайт/webapp
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 из корня сайта, нужно написать rewrite правило в файле .htaccess, который должен располагаться в папочке public_html:
RewriteEngine OnТеперь привественная страничка доступна по нормальной ссылке, далее можно продолжать разработку согласно DjangoBook.
RewriteRule ^(.*)$ /webapp/$1 [L,QSA]
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-кода.
В качестве примера проапгрейдим один из предыдущий с выдачей гугла так, чтобы на экран выводились только ссылки по запросу:
Про квантификацию: жадная, ленивая, ревнивая. Ревнивой я вообще никогда не пользовался, а вот про жадную пару слов. К примеру, символ "точка" означает любой символ. Выражение ".+" означает один и более символов - вплоть до конца анализируемого фрагмента. С таким выражением далеко не уедешь, поясню почему. Имеем следующий фрагмент html-кода:
<a href='www.site.com'>GSOM</a> <b>пум-пу-рум</b>
Если применить к этому фрагменту выражение <a href='(.+)'> с целью получения ссылки, то оно жадно зохавает всю строку, ибо последний знак ">" встречается и в самом в конце! Уталить жадность точки поможет вопросительный знак. И вот, если применить выражение "<a href='(.+?)'>", то получим то, что надо: www.site.com
Вообще, у меня выражение (.+?) - одно из самых востребованных при парсинге html-кода.
В качестве примера проапгрейдим один из предыдущий с выдачей гугла так, чтобы на экран выводились только ссылки по запросу:
import urllib2, reИтак регулярное выражение '<class="r"><href="(.+?)">' откуда я его взял? Посмотрел в исходнике выдачи гугла и увидел нечто похожее на <h3 class=r<>a href="http://site.com" target=_blank class=l ... и применил к этому своё излюбленное точка-плюсик-вопросительный-знак. То-то же.
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="(.+?)">')
urllib2 - начало
urllib2 - библиотечка, с помощью которой удобно обрабатывать веб-странички, заполнять веб формы, обрабатывать куки, соединяться через прокси и прочее.
Простейший пример:
С помощью следующего кода выводим на экран результат поиска в гугле по запросу "ivinside.blogspot.com", прикидываясь Internet Explorer под Vista:
Host=whois.ripn.net&Whois=test.ru
Добавим их как параметры функции, предварительно закодировав, как того требует спецификация:
В следующей заметке, наверно, расскажу про регулярные выражения, чтобы из полученных страничек можно было извлекать нужные данные.
Простейший пример:
import urllib2Эта программа показывает на экран html-кодесы данного блога. Но не всегда можно получить содержимое странички, например, результаты поиска в Google таким образом не посмотришь, ибо он фильтрует по строке User-Agent всякие нежелательные приложения, в питоне по умолчанию она что-то типа "Python-urllib/2.5".
response = urllib2.urlopen('http://ivinside.blogspot.com/')
print response.read()
С помощью следующего кода выводим на экран результат поиска в гугле по запросу "ivinside.blogspot.com", прикидываясь Internet Explorer под Vista:
import urllib2Ну, и напоследок сегодня, как заполнять веб-формы. Возьму для примера веб-сервис whois. Как посмотреть какие параметры при этом передаются в запросе POST? Я смотрю плагином Live HTTP headers для Firefox и считаю его приемлемым. Итак, заполняем первую форму вручную, нажимаем кнопочку и смотрим в окно плагина. Там, среди всего прочего, будут интересующие нас параметры:
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()
Host=whois.ripn.net&Whois=test.ru
Добавим их как параметры функции, предварительно закодировав, как того требует спецификация:
import urllibОк, получили страничку, где содержится информация про домен test.ru
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()
В следующей заметке, наверно, расскажу про регулярные выражения, чтобы из полученных страничек можно было извлекать нужные данные.
Python для чайников и профи
Всем тем, кто не в теме змеиного языка и не знает, стоит ли его вообще изучать могу порекомендовать ознакомиться с соотвествующей статьей в Абсурдопедии. Если вам она показалось забавной, то не всё потеряно и можно даже попробовать ознакомиться со статьей из Википедии.
Первая книга, по которой я начал изучать python, - Язык программирования Python. В авторах значится и сам создатель языка, что дает некую надежду на адекватность книги. Действительно, прочитав первые 100 страниц, я отложил все эти чтения, взялся за практику и открывал книгу уже по мере необходимости.
Далее, можно взять на заметку лекции г-на Сузи, в которых кратко изложена суть и минимум мути. В качестве справочника использую pydoc.org, поиск по классам и методам обычно дает результаты.
Вот недавно заказал многообещающую книжку Изучаем Python, 3-е издание, с нетерпением жду доставки. Очень хотелось бы ознакомиться с Gray Hat Python: Python Programming for Hackers and Reverse Engineers, но с амазоном я, к сожалению, не дружу.
Первая книга, по которой я начал изучать python, - Язык программирования Python. В авторах значится и сам создатель языка, что дает некую надежду на адекватность книги. Действительно, прочитав первые 100 страниц, я отложил все эти чтения, взялся за практику и открывал книгу уже по мере необходимости.
Далее, можно взять на заметку лекции г-на Сузи, в которых кратко изложена суть и минимум мути. В качестве справочника использую pydoc.org, поиск по классам и методам обычно дает результаты.
Вот недавно заказал многообещающую книжку Изучаем Python, 3-е издание, с нетерпением жду доставки. Очень хотелось бы ознакомиться с Gray Hat Python: Python Programming for Hackers and Reverse Engineers, но с амазоном я, к сожалению, не дружу.

