пятница, 24 мая 2013 г.

SCALA для нетерпеливых


Хочу поделиться частичкой радости. Вышла и уже пришла книга, которую многие очень долго ждали. В скором времени поделюсь впечатлениями, а может быть и небольшими частичками кода :)

Сервер за 5 баксов или Jetty 6 на Ubuntu

Здесь и сейчас я попытаюсь восстановить полную последовательность действий от взноса денег за сервак на digitalocean, до развертывания полноценного сайта.


1. Регистрируемся на сайте
digitalocean.com. Вносим деньги и выбираем конфигурацию машины. Я выбрал ubuntu 12.04. Сразу же отмечу, что машина имеет несколько оконных менеджеров, но так как у меня была минимальная конфигурация машины, то я решил поставить самый легковесный менеджер - openbox. Поэтому apt-get install openbox.

2. Теперь необходимо поставить jetty. Через apt-get ставится 6 версия(с ней проблем нет). Если ставить более позднюю версию, при деплое war'a начинаются косяки, которые вроде как должны решаться удалением записи "-- demon" в shell-скрипте, отвечающем за запуск  jetty, но нифига что-то не пашет. Поэтому остановимся на шестой версии jetty.


3. Подробнее о деплое. Во-первых, необходимо указать необходимые настройки для jetty. Для этого  подправим файлик  /etc/default/jettyПосле правки он должен выглядеть примерно так:
# change to 0 to allow Jetty to startNO_START=0# change to 'no' or uncomment to use the default setting in /etc/default/rcSVERBOSE=yes# Run Jetty as this user ID (default: jetty)# Set this to an empty string to prevent Jetty from starting automatically#JETTY_USER=jettyJETTY_HOST=$(uname -n)JETTY_HOST=0.0.0.0# The network port used by JettyJETTY_PORT=8999
 Для того, чтобы стартануть jetty нужно написать sudo /etc/init.d/jetty start(если не вводить start, и нажать enter, то выведутся все доступные команды). Во - вторых, для деплоя нужно положить WAR файл в папку /usr/share/jetty/webapps, перезапустить jetty-сервер, а также сделать java -jar start


4. Теперь немного о mySQL server'e. Ставится стандартно apt-get install. 3306 - стандартный порт, через который работает mySQL. При установке записываем пароли :)  


5. После установки mySQL, он пропускает только localhost. Нам необходимо прописать привилегии для ip-адресов, с которых будет вестись работа. Делается это следующими командами:
$ mysql -u root -pEnter password:mysql> use mysqlmysql> GRANT ALL ON *.* to root@'192.168.1.4' IDENTIFIED BY 'your-root-password';mysql> FLUSH PRIVILEGES;
6. А теперь о vnc. Установку сервера производил по мануалу http://www.prolinux.org/node/106.
Собственно для использования необходимо сначала зайти по ssh, запустить vnc4server, а потом спокойненько работать.



четверг, 14 марта 2013 г.

Scons

Scons - это замена makefile. Scons написан на Python. Scons очень удобен и у него замечательная документация. Scons полезен всем :)

Простой пример:
Допустим есть пример, состоящий всего из файлов main.cpp, 1.h, 1.cpp,  2.h,  2.cpp. Необходимо написать простейший сборщик.
Создаем файл SConstruct, почему название именно такое? Потому что оно дается автоматически, как Makefile, только SConstruct :) Затем пишем две строчки внутри файла:
env=Environment()
env.Program('myprog', ['main.cpp',1.cpp','2.cpp'] )

Пишем в консольке scons...
Scons дьявольски умен и сообразителен. И нам и ему понятно, что myprog  и есть наш собранный исполняемый файл.
Main page of scons

Ну а еще можно добавить, что scons используют:





пятница, 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  

пятница, 14 декабря 2012 г.

Pandora.com. Как запилить прослушивание, если вы таки в России

Все знают о last.fm, но немногие слышали о pandora.com, который в сто раз круче этого самого last.fm. Но вот не задача, pandora - таки не арбайтен автоматом у нас в России, поэтому был найден великолепный плагин для Хрома и Мозиллы - https://mediahint.com/. Ставим, заходим на http://www.pandora.com/, вводим название композиции или имя артиста, приступаем к прослушиванию :)  

воскресенье, 21 октября 2012 г.

О козлах и raspberry pi.

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

Sms самому себе или знай, что у тебя случилось.

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

class GoogleSms:
    def __init__(self, username, password):
        self.username = username
        self.password = password
        service = gdata.calendar.service.CalendarService()
        service.email = username
        service.password = password
        service.source = 'GoogleSms'
        service.ProgrammaticLogin()
        self.calendar_service = service

    def send(self, message):
        event_time = time.strftime(TIME_FORMAT, time.gmtime(time.time() + 3600))
        event = gdata.calendar.CalendarEventEntry()
        event.title = atom.Title(text=message)
        event.content = atom.Content(text=message)
        reminder = gdata.calendar.Reminder(minutes=60)
        reminder.method = 'sms'
        when = gdata.calendar.When(event_time)
        when.reminder.append(reminder)
        event.when.append(when)
        try:
            cal_event = self.calendar_service.InsertEvent(event, CALENDAR_URL)
        except gdata.service.RequestError, request_exception:
            raise


Хочу отметить, что если вы хотите, чтобы сообщение дошло до вас сразу же, то необходимо отправлять его за час(как-то странно выразился, но вроде понятно). Также лимит сообщения около 60 символов. Всего 20 смс в день. Ничего. Нам с вами хватит ;)