пятница, 25 января 2013 г.

Пример работы с ftplib.

Еще один пост любви к Python. Как передать некоторый список файлов(имеются полные пути) на ftp-сервер? Очень просто :) 


server_ftp = '192.168.0.102' #для примера, в программе можно задать что угодно
login_ftp = "fox100500"
pass_ftp = "fox_134342"
port_ftp = "1069"


def ftp_online():
    ftpConnect = FTP()
    try:
        ftpConnect.connect(server_ftp, port_ftp)
        ftpConnect.login(login_ftp, pass_ftp)
        ftpConnect.quit()
        ftpConnect.close()
        enable = 1
    except:
        enable = 0
    return enable


def copy_file(ftp, path):  # ftp - через что соединяемся, path - абсолютный путь до передаваемого файла
    name_file = path.split('/')[-1:][0]
    send_file = open(path, 'rb')
    ftp.storbinary('STOR ' + name_file, send_file, 1024)


def read_ways_from_file(file_name):
    f = open(file_name, 'r')
    return f.readlines()


def copy_all_files(ftp, lines):  # ftp - через что соединяемся, lines - list абсолютных путей до файлов
    for line in lines:
        line = line.replace('\n', '')
        copy_file(ftp, line)


if __name__ == "__main__":

    if ftp_online() == 1:
        ftpConnect = FTP()
        ftpConnect.connect(server_ftp, port_ftp)
        ftpConnect.login(login_ftp, pass_ftp)
        ftpConnect.cwd('/information')
        st = ftpConnect.pwd()

        copy_all_files(ftpConnect, read_ways_from_file('download.txt'))

Есть некий текстовый файл download.txt, в котором записаны пути до нужных файлов. Нам лишь необходимо запустить скрипт и он скопирует эти файлы на сервак. 

Для чего это может использоваться? Ответ прост - отложенная отправка файлов на android. Есть куча программ, которые превращают андрюшу в сервер, также есть всячиские task менеджеры, которые могут включать и выключать wifi в определенное время, то есть нам лишь необходимо настроить запуск wifi андроида ночью, настроить запуск скрипта - граббера информации(скачка хабра, новостей, запись радио), а потом взять и передать все с помощью данного скриптика. 
Также хочу отметить, что для скачки контента из интерната лучше всего пользоваться wget. Помимо регулировки порядка вложенности скачки страниц он имеет кучу настроек. Допустим, чтобы скачать web-страницу полностью надо ввести в консоль:  wget -k -p <адрес страницы>.  


воскресенье, 13 января 2013 г.

Метод "Бегунка" на Java.

Хочется рассказать о решении классической задачи на списки. Многие знают что такое список и даже с чем его едят, но почему-то затем их забывают. Иногда же полезно вникнуть в суть и порешать задачи, решение которых может и не придти сразу в голову :)
Итак, дан список, нам необходимо определить содержит ли он петлю. Самый простой и действенный способ - воспользоваться так называемым методом бегунка.По списку бежит два бегунка - быстрый и медленный, пусть первый делает два шага за такт, а второй один. Допустим, что нам также известна длина списка = k. Число же шагов до петли пусть будет = l. Тогда если быстрый бегунок на l - k шагов отстает от медленного, а быстрый нагоняет его за 1 шаг в единицу времени, то они встретятся на l - k шагов. В этой самой точке они будут стоять как раз в k шагов от начала петли. Т.е. когда указатели встретятся, нам нужно передвинуть медленный бегунок на голову, а быстрый оставить на месте, при движении их с теми же скоростями место их следующей встречи и будет началом петли :)

Вот такой вот простой алгоритмик :) Как всегда исходник(Java): Исходник

Минимальная настойка linux-окружения на примере openbox.

Сейчас я сделаю то, что обязан сделать любой линуксоид - рассказать про свою минимальную настройку "linux-окружения". Конкретно хочу описать связку, которая, по-моему, работает замечательно = Openbox + conky + tint2 panel + pytyle2 + немного умения разбираться в конфигах. Если о первой составляющей слышали все, о второй чуть поменьше, о третьей еще меньше, то о четвертой просто необходимо рассказать подробнее. 

CONKY

Про конфигурацию коньков я уже рассказывал, ничего не изменилось. Я лишь написал еще один небольшой скрипт, который парсит RSS-ленту для получения погоды. Он будет также выложен(осторожно, говнокод!).

OPENBOX 

http://ru.wikipedia.org/wiki/Openbox. В общем все понятно. Ставим как обычно, выбираем при загрузке и наслаждаемся минимализмом и быстротой(если нифига не понятно и страшно -нажмите правую кнопку мыши : -) ).

TINT2 panel

Лютая, бешеная, простая в конфигурации, легкая панель. Запускается командой tint2
Ставится как обычно apt-get'oм. При первом запуске создастся конфигурационный файл в ~/.config/tint2/tint2rc. Его-то править и надо для достижения необходимого эффекта. 
Мне всегда хотелось, чтобы приложения, которые открыты на нескольких рабочих столах отображались на всех рабочих столах. После прочтения доков и правки конфигов мечта стала реальностью -  панель великолепна и удовлетворяет моим скромным требованиям. 


PyTYLE2

Скажу, что искал что-то, что помогло бы мне с тайлингом и написано бы было предпочтительно на python'e. Обнаружился pytyle2 - великолепная штучка, которую рекомендую всем :) Кстати, на использование ее меня натолкнул пост http://muhas.ru/?p=171(там же описаны комбинации клавиш по умолчанию и что где лежит). А вот небольшой примерчик тайлинга в действии. 

НЕМНОГО О НАСТРОЙКЕ

Автозагрузка
В ~/.config/openbox есть файлик с говорящим названием - autostart, если нет, то смело создаем. В нем прописываем все, что должно стартовать вместе с openbox. Описывается он примерно так:
tint2 &
pytyle2 &
conky &

Обои на рабочий стол
По умолчанию на рабочем столе ничего нет. Так просто все не изменить, есть несколько программ, которые занимаются сменой обоев, самая простая и действенная - feh. Ставим, прописываем feh --bg-scale "путь до обоины". И да, если хотите, чтобы обои были при запуске системы, пропишите команду в автозапуск.

Комбинации клавиш или как сделать скриншот экрана.

В ~/.config/openbox/rc.xml лежат настройки не только кнопок, но и многие настройки внешнего вида. По примеру того, как там описаны уже существующие комбинации для PrtSc пропишем запуск баш-скрипта:
$ cat screenshot.sh 
#!/bin/bash
name=`date +%x-%X-%N.png`
scrot ~/$name
Не забываем поставить scrot, именно она будет отвечать за "производство" скриншота. 

понедельник, 7 января 2013 г.

Быстрое добавление композиций в last.fm из vk.com

Я все как-то обходил вниманием last.fm, слушаю то пандору, то просто 42.fm. Но last.fm хороша тем, что безупречно подбирает что-то, что будет точно  Вам по вкусу :). По этому было решено "перенести" музыку из vk.com на last.fm. Так как композиций на данный момент у меня в профиле vkонтакта 445, то делать это в ручную как-то даже не прилично.
Был написан маленький скриптик -  скробблер vk => last.fm.

Опишу особенности реализации. Чтобы воспользоваться api last.fm необходимо получить две строки - ключ для api и некое секретное значение(ну а еще быть там зарегистрированным ;)) ).
Проходим по адресу http://www.lastfm.ru/api/accounts, регистрируем свое приложение, запоминаем строки.
Идем на http://code.google.com/p/pylast/, эсвээним либу(если нет svn - ставим). Сразу же напишем небольшой пример - добавление композиции.


import pylast
API_KEY = "your_key"
API_SECRET = "your_secret"

username = "username"
password_hash = pylast.md5("password")

network = pylast.LastFMNetwork(api_key = API_KEY, api_secret =
    API_SECRET, username = username, password_hash = password_hash)
library = pylast.Library(user = "username", network = network)
track = network.get_track("Rob Dougan", "Clubbed To Death (Kurayamino Variation)")
library.add_track(track)

И видим... Видим ошибку:

Все потому, что авторы библиотеки забыли добавить одну  строчку, из-за чего собственно и происходит баг. Потому идем в исходники библиотеки, а именно на строку примерно 1970(функция add_track() ), добавляем в нее строку params['artist'] = track.get_artist().get_name(). 
Запускаем пример снова... Работает!

Полдела сделано. Теперь ставим либу для работы с vk.com(sudo pip install vkontakte). Как заводить приложение мною уже было рассказано, 

да и вообще как получать и качать музыку тоже, поэтому расписывать смысла нет, 
используя старые наработки для каждой композиции из вконтакте получаем "имя
 исполнителя", "название" иотправляем в last.fm. После всего получаем забитый профиль :) 

Ссылка на скрипт как всегда: https://www.dropbox.com/s/zlqpu4p0q4t32qd/pyLastFM.py