воскресенье, 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 смс в день. Ничего. Нам с вами хватит ;)

суббота, 1 сентября 2012 г.

О приложениях для Android.

Купив любой девайс с операционной системой Android, первое о чем задумываешься - это какие приложения действительно хороши и почему их ставить обязательно. Хочется поделится своими впечатлениями о нескольких программках.

Практически сразу после покупки устройства я понял, что смартфон просто необходимо рутовать. Объясню почему. Первая причина - экономия траффика, НОРМАЛЬНЫЕ приложения, с помощью которых можно блочить другие приложения, чтобы они не лезли в инет(когда не надо) требуют рута. Вторая причина - реклама, блокировщики рекламы также требуют рута. Третья причина - многие другие приложения, такие как антивирусы, лаунчеры и тд и тп, требуют рута. Поэтому если у Вас прошла гарантия или вы не боитесь ее потерять(я не боюсь, потому что можно потом рут взять и отменить:) ), я НАСТОЯТЕЛЬНО советую его рутануть.

Superuser - программа первой необходимости после получения рута. С помощью нее вы можете контролировать процесс допущения приложений к правам рута. Также superuser ведет журнал, что очень полезно. Ставим сразу.(нужен root)
DroidWall - приложение, с помощью которого можно создать два списка(белый и черный) для контроля доступа других программ к интернету(блочим допуск приложений к 3G). Must have! (нужен root)
CPU tuner - хоть я и пишу про эту программу после записи о двух других, но считаю, что эта программулина стоит на первом месте для любого Android устройства. Она частично решает такую большую проблему, как прожорливость операционки. Вы можете настроить несколько режимов работы смартфона, в зависимости от параметров батареи. Можно делать очень многое, все тут описывать не вижу смысла. Ставить нужно обязательно. (нужен root)
Tasker - лучшая программа для планирования запуска приложений, имеющая огромное количество функций, а также свой собственный язык программирования! Вещь великая, могучая и платная.
Total Commander - ну тут без слов, все знают что такое и для чего надо.
FTPServer - одно из многих приложений, которое делает из вашего смарта server Ftp соединения(что не безопасно, кстати), но с помощью данной функции можно много что творить со смартом(в скором времени напишу что именно). Также необходим в том случае, если вы не можете сделать FtpServer на своем компьютере и присоединиться смартом как клиентом.(нужен root)
Быстрый блокнот -  если что-то нужно быстро записать, не видя при этом кучи рекламы и кнопок управления - это лучшая из программ.
FPse - все мы любим поиграть. А я люблю поиграть в Sony Playstion 1. Это лучший эмулятор приставки для  Android.
EBookDroid - читалка кучи форматов.

Далее напишу приложения так сказать более узкой направленности.
SL4A и Script Launcher - программы для запуска скриптов на Python, Perl, Ruby.
Kivy Launcher - запускаем скрипты, написанные на Python прямо на смарте(я уже об этом писал)
AIDE - пишем полноценные Java приложения прямо на нашем устройстве.
Touchqode - программисткий блокнот

Я не являюсь пиратом, но и не пропагандирую платить за что-то, не испробовав это. Поэтому я просто оставлю ссылки на сайты тут:
http://4pda.ru/    http://rutracker.org/forum/index.php 

воскресенье, 26 августа 2012 г.

Пишем для Android на Python или немного о Sl4A и Kivy.


Купив смартфон конечно же меня заинтересовала быстрая разработка под него. Java, конечно же, является родной для Андрюши, но я толком ее не знаю, да и мороки с ней огого...(хотя приличные приложения надо писать именно на Java).

Мне же нужно иногда что-то запустить так, игры ради. Поэтому представляю вам два способа(которые и так многим известны) программирования под Аndroid на Python.

СПОСОБ ПЕРВЫЙ.

SL4A (Android Scripting) — интерпретатор, который запускает под Android скрипты на Python, Perl, JRuby, JS, PHP и др.

После установки мы получаем интерпретатор и несколько самых распространенных библиотек. Легко делается очень многое. Если сравнивать коды простых приложений, написанных на Java и Python(с помощью данной либы), то на Python примерно раза в 3-4 короче. Имеется неплохая документация + возможность программирования непосредственно на девайсе. В общем, must have!

Но все же мне больше понравился именно второй способ :)

СПОСОБ ВТОРОЙ.

Kivy - open source библиотека для быстрой разработки приложений, создания интерфейса для различных тач-девайсов.

Она меня очень обрадовала. Не ну правда, вспоните долгий запуск эмулятора андроида, вспомните, как долго и муторно происходит запуск, вспомните, что много выглядит все равно не так, как это будет смотреться на самом деле. Тут же все очень хорошо, написанное не только работает под linux, windows, android, но и работает быстро + есть доступ к нативным функция устройств.

Мы пишем приложение на Python(т.е. пишем очень быстро :)), ставим эмулятор для андроида с сайта библиотеки и можем просто забрасывать наши исходники на карту памяти в папку kivy - и всё!(каждая программа -  в отдельной папке). Мы получаем рабочую программу:).

А сейчас о грустном. В данной великолепной библиотеке я увидел два недостатка. Первый - при нажатии кнопки "возврат", мы не возвращаемся в предыдущее меню, а полностью выходим из приложения. Второй - портирование программы в .apk файл.(те, кто портировал в .exe наверное уже догадались :)), т.е. при портирование мы получаем огромный apkшный файл(вполне вероятно что больше 30мб, что очень важно, ведь некоторые телефоны не поддерживают больший размер).

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

Чтобы не трындеть тут зазря, в качестве первого примера приложения я написал программку - расписание занятий для моей группы в универе :) Собственно исходники расписания.
Выглядит эта штука в linux примерно таким образом, как оно будет выглядеть в Android можете проверить сами.