вторник, 3 июля 2012 г.

"Воруй-убивай" или правильная музыка на телефон и компьютер

Я люблю радио. А еще больше люблю радио, где играет правильная музыка :) Поэтому всем рекомендую http://42fm.ru/.

Вчера мне захотелось сделать запись радио, чтобы потом можно было слушать по дороге куда-либо со смартфона или мп3-плеера. Поэтому было решено записать поток, раздробив его на треки, а затем залить эти треки на Dropbox, чтобы потом легко стянуть со смарта в основную память.
Поток на "Воруй-убивай" идет в  .ogg формате, поэтому все треки после скачки необходимо перевести в .mp3 для экономии места, так как флешка на съемных носителях не резиновая. А затем скопировать всю музыку на Dropbox. Запись идет определенное время, которое задается первым параметром функции getSounds().

В скрипте используются сторонние консольные утилиты: 
streamripper(sudo apt-get install streamripper) и ffmpeg(догадайтесь как ставить :) )

Скрипт с комментариями можно скачать по ссылке:  https://www.dropbox.com/s/lsapmi54fe9p47w/steal-kill-record.py

суббота, 30 июня 2012 г.

О Raspberry Pi, визах и умном доме.

Уже достаточно давно я хочу попробовать сделать свой собственный проект умного дома. Главным компонентом моей идеи является компьютер, который будет работать круглые сутки, выполняя те или иные задачи. Я очень долго ждал второй партии Raspberry Pi, даже отметился на нескольких сайтах  (http://authenticate.rsdelivers.com/). И вот, сегодня случилось чудо - мне выслали приглашение на покупку. Ясно-понятно, что купить можно было только либо через визу, либо через пайпал(второе предполагает первое :) ). По-быстрому сделал привязку симки к qiwi-кошельку и сделал заказ. Все, надеюсь, что менее чем через 12 недель я получу долгожданную плату и вдоволь поэкспериментирую ;)
Готовиться к посылке начну уже прямо с сегодняшнего дня, буду потихоньку реализовывать программную часть умного дома. 

вторник, 26 июня 2012 г.

Создание телефонной книги друзей vk.com с последующим переносом в google contacts

Надеюсь, что скоро куплю адроидофон, поэтому готовлюсь как морально, так и программно :) Первая мысль - как бы поменьше возиться с забиванием телефонной книги в новом устройстве. Так как в vk.com можно получить телефонные номера, а android замечательно синхронизируется с google contaсts, было решено написать скрипт, который берет инфу из вконтакта, пишит её в csv - файл, а затем мы его запросто грузим куда надо. Кстати, почему именно csv? Данный формат поддерживается не только google, но еще и кучей сторонних сайтов, правда там скорей всего другой формат данных, но хз, может и такой сойдет.

Собственно формат гугловского csv имеет вид:
Name,Given Name,Additional Name,Family Name,Yomi Name,Given Name Yomi,Additional Name Yomi,Family Name Yomi,Name Prefix,Name Suffix,Initials,Nickname,Short Name,Maiden Name,Birthday,Gender,Location,Billing Information,Directory Server,Mileage,Occupation,Hobby,Sensitivity,Priority,Subject,Notes,Group Membership,E-mail 1 - Type,E-mail 1 - Value,Phone 1 - Type,Phone 1 - Value,Phone 2 - Type,Phone 2 - Value,Address 1 - Type,Address 1 - Formatted,Address 1 - Street,Address 1 - City,Address 1 - PO Box,Address 1 - Region,Address 1 - Postal Code,Address 1 - Country,Address 1 - Extended Address,Website 1 - Type,Website 1 - Value
Поля пропускать нельзя, т.е. нельзя задать только имя и фамилию не задавая всей остальной информации. Всё, вроде больше знать ничего не нужно. Как работать с API я уже описывал в посте про граббер музыки, поэтому недолго думая получаем информацию о друзьях и пишем в файл, соблюдая формат.

Запись выглядит примерно так (я не записываю друзей, которые вообще не открыли ни одного телефонного номера):
for i in friends:
            kol=0
           tmp = i["last_name"] + ' '+ i["first_name"] + ',' + i["last_name"] + ',,' + i["first_name"] + ',,,,,,,,,,,'
           if 'bdate' in i:
               tmp += transform_birthday(i["bdate"])
           else:
            tmp += ' '
            tmp += ',,,,,,,,,,,,* My Contacts, '
            if 'domain' in i:
                tmp += '* Home,'+tmp["domain"]+','
            else:
                tmp += ',,'
            if 'home_phone' in i:
             k = transform_phone(i['home_phone'])
             if k>0:
                 tmp += 'Home,'+k+','
                     kol+=1
            else:
                tmp += ',,'  
            if 'mobile_phone' in i:
             k = transform_phone(i['mobile_phone'])
             if k>0:
                 tmp += 'Mobile,'+k+','
                     kol+=1
                 else:
                     tmp += ',,'
            tmp += ',,,,,,,,,,\n'
            if kol>0:
                f.write(tmp)    


Ccылка на скачку: https://www.dropbox.com/s/rbcq3dru12rah38/CSVexportContaks.py

понедельник, 25 июня 2012 г.

Subline text 2

Очень неплохой кроссплатформенный текстовый редактор. Уступает конечно таким гигантам как VIM или EMACS, но все же является очень неплохой штукой.


INSTALL:
Добавьте Sublime Text 2 PPA, используя следующие команды:
sudo add-apt-repository ppa:webupd8team/sublime-text-2
sudo apt-get update

И затем, чтобы установить бету Sublime Text 2 beta (рекомендуется), используйте эту команду:
sudo apt-get install sublime-text-2-beta (Мы будем ставить Dev версию, смотри ниже)
Или чтобы установить dev-сборку Sublime Text 2:
sudo apt-get install sublime-text-2-dev

PACKAGE CONTROL:
Чтобы установить Sublime Package Control, откройте Sublime Text 2, нажмите ctrl+' (' - символ, рядом с 1) и вставьте это:
import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'

PLAGINS:
Чтобы установить плагины необходимо в Package control написать Install package. А затем уже приступить к поиску и установке.
Terminal - плагин для запуска терминала из папки, в которой находится файл. Комбинация ctrl+shift+t
Sublime Alignment - форматирование кода.
SubLimeLinter - офигенная штука. Проверка кода на ошибки, как в нотации, так и в других отношениях. PEP8 рулит :)
SublimeCodeIntel - показывает автозаполнение доступных модулей в режиме реального времени, а также информацию о текущей функции в статус баре. Ставить обязательно!
Bracket Highlighter - Подсвечивает скобки и кавычки, позволяет удобно перемещаться в коде («скачет» по основным точкам) и делает еще много полезного.
Zen coding — плагин для быстрого написания и редактирования html кода. Ядро этого плагина — мощный движок сокращений, который позволяет вам расширить короткие выражения (похожие на CSS селекторы) до HTML кода.
Djaneiro - Супорт django под Sublime Text 2


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

вторник, 19 июня 2012 г.

О фильмах

Какой фильм я считаю хорошим? Подумал об этом и сделал вывод: тот, после которого остается послевкусие, тот, что оставляет какие-то определенные чувства и эмоции, тот, после просмотра которого ты меняешься. Таких фильмов не так уж и много. Но за последнюю неделю мне посчастливилось увидеть целых два фильма, которые мне понравились. Оба они (так или иначе) показывают, что никогда не нужно сдаваться и всегда необходимо верить в лучшее. Оба дают заряд позитива и оптимизма.
Я рекомендую посмотреть их: "1+1" и "Рок на века".

P.S. Смотрите хорошие фильмы. Меняйтесь!

понедельник, 18 июня 2012 г.

Оху***ая бл*ть консоль или учим консоль давать советы и материться

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

Многие знают, что есть такой сайт http://fucking-great-advice.ru/. Собственно название говорит само за себя, так вот, озвучка некоторых цитат там просто изумительна. Недолго думая запилил скрипт, который дает советы в консоль, а если есть звук, то еще и произносит его (совет).
При написании была небольшая проблемка. Не понятно было каким образом генерится рандомная цитата. Поэтому я решил сделать в лоб -  загружаем главную страницу, там есть ссылки на различные страницы уже с рандомными цитатами, берем произвольную из этих цитат. Вуаля, дело сделано :) Ах да, не забываем распарсить все это на предмет звука, скачать звук, проиграть его, а потом удалить (чтобы не забивалась папочка лишний раз).

Получим рандомную цитату рандомных цитат:
def getRandomAdvice():
    doc=getHTML("http://fucking-great-advice.ru/")
    soup=BeautifulSoup(doc)
    x=[]
    for i in str(soup).split():
       if 'href="http://fucking-great-advice.ru/advice/' in i: 
          x.append(i)
    j=random.randint(1, len(x))
    return x[j][6:-1]

Попробуем получить звуковой файл, проиграть его и удалить :) :
def playSound(adressBase):
    j=adressBase.replace('http://fucking-great-advice.ru/advice/', '')[:-1]
    link="http://fucking-great-advice.ru/files/sounds/sound_"+str(j)+".MP3"
    try:
        subprocess.call(['wget', '-b', link])
        music_file='sound_'+str(j)+'.MP3'
        subprocess.call('reset')
        pygame.init()
        pygame.mixer.music.load(music_file)
        pygame.mixer.music.play()
        while pygame.mixer.music.get_busy(): pass
        os.remove(music_file)
    except: pass
    os.remove('wget-log')

P.S. Получилась забавная штука. Голос всё же великолепен :))

воскресенье, 17 июня 2012 г.

О скорости

Увидел такие вот тесты, невольно опять задумался о Хаскелле:
Дано: массив 16k целых чисел
Тест: 1000 раз quicksort
C (own) 0m2.528s x 1.00
C (qsort) 0m3.282s x 1.30
C++ (std) 0m3.250s x 1.28
Haskell 0m3.867s x 1.53
PHP 1m18.73s x 30
Python 1m38.55s x 38
Perl 2m53.69s x 67

пятница, 15 июня 2012 г.

Полные исходники

Кому нужны любые полные иходники - пишите (сюда или на мою страницу: http://vk.com/rapter )

Консольный граббер музыки с профиля vk.com cо свистелками и перделками

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

Начну с того, как же все таки работать с API. Под Python есть хорошая либа - vkontakte (ставится без проблем через pip), но просто подключение ее ничего не даст(что логично), необходимо зарегать своё приложение, как это делается написано тут: http://habrahabr.ru/post/125155/. Там вам дадут защищенный ключ и ID приложения, с помощью которых необходимо получить токен. Токен - это некоторая длинная замысловатая строка, которая необходима для получения определенных прав и свобод для работы с vk.com. Собственно получить его можно вбив в строку браузера что-то подобное: http://oauth.vk.com/authorize?client_id=ID ВАШЕГО ПРИЛОЖЕНИЯ&scope=audio(ПОЛУЧИМ ДОСТУП К АУДИО)&response_type=token, вас пошлют на страничку, в адресной строке которой можно и увидеть пресловутый токен(выглядит он примерно так: "9d791f49d29a92ea9d19f7da559d6df31e99d409d404a6dcd989bf1baa42bb3"). Всё, токен получили можно действовать. Справка по API описана тут:

Итак, что нам нужно сделать? Во первых получить всю музыку и сотворить некие функции по работе с ней. Реализуем следующие функции: 

Печать всех композий
def printAllAudio(audio):
    subprocess.call("clear")
    for i in xrange(len(audio)):
        print str(i)+" "+audio[i]["artist"]+" - "+audio[i]["title"]  

Скачка одной композиции по её номеру:
def downloadOnNumber(audio, number):
     nameFileNew=audio[number]["artist"]+" - "+audio[number]["title"]
     print "GET FILE: "+nameFileNew
     print "FILE NUMBER: "+str(number)
     subprocess.call(['wget', audio[number]["url"]])
     p=re.compile(r"[0-9a-zA-Z]+\.mp3$")
     nameFileOld=p.findall(audio[number]["url"])
     os.rename(nameFileOld[0],nameFileNew+".mp3") 

Cкачка всех композиций:
def dounloadAllFiles(audio):
    for i in xrange(len(audio)):
        downloadOnNumber(audio, i)

Скачка по названию группы:
def downloadOnArtist(audio, artist):
    kol=0
    for i in xrange(len(audio)):
        if audio[i]["artist"] in artist:
            downloadOnNumber(audio, i)
            kol+=1
    return kol  

Скачка по названию песни:
 def downloadOnComposition(audio, composition):
    kol=0
    for i in xrange(len(audio)):
        if audio[i]["title"] in composition:
            downloadOnNumber(audio, i)
            kol+=1
    return kol 

Скачка по интервалу:
def dowloadOnInterval(a, b):
   for i in xrange(a, b+1):
       downloadOnNumber(audio, i)

Как видим, достаточно широкий функционал получился :) Используем внешнюю утилиту wget, которая обладает очень красивым выхлопом. Примерно все выглядит таким образом:   
Теперь неплохо было бы все сделать в консоль-стайл, предусмотреть команды, а также слабенькую защиту от  дурачка. 
В общем тянуть не буду, все выглядит примерно так:

 audio=vk.audio.get(uid='ВАШ ID vk.com')
    count=len(audio)
    print "Введите команду: "
    command=raw_input().split()
    if command[0]=="help":
        subprocess.call("clear")
        print "Доступные команды: "
        print "grub +"
        print "-all = скачать все песни из аудио"
        print "-s = скачать песню по её названию (пробел) название песни"
        print "-ar = скачать песню по название группы(имя артиста) (пробел) имя артиста(группы):"      
        print "-print = распечатать все песни и их номер"
        print "-n = cкачать по номеру (пробел) номер песни" 
        print "-i = скачать по интрервалу (пробел) первое число (пробел) второе число" 
    elif command[0]=="grub":
        if command[1]=="-all":
            dounloadAllFiles(audio)
        elif command[1]=="-ar":  
            kol=downloadOnArtist(audio, joinOther(command))
            if kol==0: print "Нет совпадений в имени!"
        elif command[1]=="-s":
            kol=downloadOnComposition(audio, joinOther(command))
            if kol==0: print "Нет совпадений в имени!"
        elif command[1]=="-print":
            printAllAudio(audio)
        elif command[1]=="-n":
            if command[2].isdigit()==False: print "Это не числовое значение!"
            elif 1<int(command[2])<count: downloadOnNumber(audio, int(command[2]))
            else: print "Песни с таким номером нет!"
        elif command[1]=="-i":
            if command[2].isdigit()==False or command[3].isdigit()==False: print "Это не числовое значение!"
            elif int(command[2])>int(command[3]): print "Первое значение интервала должно быть меньше второго!"
            elif int(command[2])<1 or int(command[3])<1 or int(command[2])>count or int(command[3])>count: print  "Введите значения от 1 до числа композиций"
            else:  dowloadOnInterval(int(command[2]), int(command[3]))          
    else: print command[0]+"- Не, не слышал :)" 

Всё работает на ура;) Теперь можно качать любимые песни не выходя из не менее любимой консоли))

вторник, 12 июня 2012 г.

Тянем 50 первых аудиозаписей из своего профиля vk.com

Сейчас потребовалось быстренько слить несколько первых композиций с vk.com. Лень было что-то искать, решил быстренько наваять. С API не хотелось разбираться, после взгляда на код странички стало понятно, что класс c музякой выглядит следующим образом:
 
Cледовательно, распаспарсим этот класс на предмет ссылки и подадим в wget. Всё. Счастье. Жаль только что на странице только 50 первых песен, остальные видимо только с помощью API и можно вытащить.
print "Введите число первых композиций: "
    while True:
        kol=input()
        if (kol<1) or (kol>50): print "Число должно быть >1 и <51"
        else: break                   
    tmp=initVK(loginVK, passwordVK)
    html=getHTML(tmp, 'http://vk.com/audio')
    k=1
    soup=BeautifulSoup(html)
    for i in soup.findAll(True, 'play_btn'):
        if k>kol: break;
        i=str(i)
        k1=i.find("http:")
        k2=i.find("mp3")
        exitStr=i[k1:k2]+"mp3"
        subprocess.call(['wget', exitStr])
        k+=1;