Давно меня тут не было. Решил запустить перезагрузку блога. Теперь многое будет по-новому.
четверг, 7 ноября 2013 г.
суббота, 10 августа 2013 г.
Немного о ТEX'e и русском языке
Начал я читать книжку по ТЕХ'у и понял, что примеры с русским языком не пашут, уж не знаю почему. Гуглил достаточно долго. Нашел исходник(или как там это в ТЕХ называется?). Все как всегда оказалось просто.
\usepackage[utf8x]{inputenc}
\usepackage[english, russian]{babel}
Система у меня Linux Mint 15. Ищите ответы, и точно найдете :)
\usepackage[utf8x]{inputenc}
\usepackage[english, russian]{babel}
Система у меня Linux Mint 15. Ищите ответы, и точно найдете :)
пятница, 24 мая 2013 г.
Сервер за 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 используют:
Простой пример:
Допустим есть пример, состоящий всего из файлов 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 используют:
- Ardour
- Battlefield 1942
- Blender
- Csound
- Delta3D
- Google Chrome[1]
- GtkRadiant[2]
- id Software
- Nullsoft Scriptable Install System
- NVDA
- SuperCollider
- VMware
- MongoDB
пятница, 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'))
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): Исходник
Итак, дан список, нам необходимо определить содержит ли он петлю. Самый простой и действенный способ - воспользоваться так называемым методом бегунка.По списку бежит два бегунка - быстрый и медленный, пусть первый делает два шага за такт, а второй один. Допустим, что нам также известна длина списка = 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 пропишем запуск баш-скрипта:
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. После всего получаем забитый профиль :)
Запускаем пример снова... Работает!
Полдела сделано. Теперь ставим либу для работы с vk.com(sudo pip install vkontakte). Как заводить приложение мною уже было рассказано,
да и вообще как получать и качать музыку тоже, поэтому расписывать смысла нет,
используя старые наработки для каждой композиции из вконтакте получаем "имя
исполнителя", "название" иотправляем в last.fm. После всего получаем забитый профиль :)
Ссылка на скрипт как всегда: https://www.dropbox.com/s/zlqpu4p0q4t32qd/pyLastFM.py
Подписаться на:
Сообщения (Atom)