Конечно же, just for fun я написал приложение. Небольшое, но полезное. Ой, не только just4fun, а еще для изучения продвинутых возможностей PyGTK. Так вот, многие знают, что такое яйцетаймер. Если нет - это такая программа или железка, которую ставишь на время, через это время она тебя оповещает звуком (а в случае с софтом - и на экране). Вот для линукса есть KTea и его гткшный клон GTea. Но простые они слишком.

скриншот

Захотелось такого, но покруче. И было нечего делать. Сел я за свой емакс и написал. push'нул на Launchpad, написал в некоторые места и вот пишу сюда. ProEggTimer. Ставишь mpd на паузу. Выбираешь предустановку или своё время, нажимаешь старт, сворачиваешь окно. Когда пройдет время - mpd заиграет, а на экране появится оповещение Galago (notify-osd, naughty, avant-notification-daemon и др.), или если нету python-dbus(или такого демона) - появится окно. Казалось бы всё, но это еще не релиз. Мой TODO: About-диалог и настройки(mpd, команда вместо mpd, отображать окно даже когда есть galago) :)

А от вас, читателей этой вот статьи, требуется помощь.

Питонистов: посмотреть код, оптимизировать, создать свою ветку и push'нуть - если есть чего оптимизировать %)

Людей, знающих языки кроме английского и русского: перевести и выложить. Как? Ну обычный gettext, все просто.

Креативщиков, которые все в идеях: рассказать их!

Всех: репортить баги, если есть. создать свою ветку и push'ать туда предустановки для всяких продуктов и дел, запрашивая объединение с trunk. Они в xml, в папке presets. И не забывать иногда делать bzr pull && sudo python setup.py install :)

Постовой:

Обменять WebMoney.

Выбери Linux или Windows. А когда выбрал - установи Программы для Линукс.

2009-07-16 14:37:36 Теги: beta python linux apps | Комментарии

Эх, давно я не писал сюда... Лень такая лень, да. Иногда лени не было, но всегда я не знал, о чем писать. Но вот только что мне пришла в голову идея, и вот она:

Я надеюсь, что все мои читатели уже пользуются Evernote? (Кстати, я давно там зарегистрировался и попал в первый миллион русскоговорящих пользователей, но активно использовать начал только сейчас) Так вот, там букмарклет выдается. "Добавить в Evernote", позволяет добавить в блокнот веб-страницу или её часть. Короче, веб-клиппер.

Идея в том, чтобы читатель далеко (на панель закладок) за ним не ходил. Блоггер... может встроить его в блог! Под постом. Вот как здесь:

Добавить в Evernote #TODO: Сделать для всех постов (в шаблоне)
2009-07-11 01:47:30 Теги: services web20 blog evernote | Комментарии
Вот я и переехал на свой движок, написанный на Django. Заодно и сменил дизайн. Да, из старых постов взял только лучшие. URL'ы поменялись...
2009-06-15 00:16:25 Теги: django python blog | Комментарии
Поскольку у меня лимитный интернет (предоплачено 500 мб в месяц, а платить больше абонентской платы не хочется), я решил написать на Python небольшую программу (не хочется скриптом называть, но по сути это скрипт. даже интерфейса нету) - демон, который висит в фоне и снимает показания счетчика. Не воды, а трафика. Когда достигнут лимит - предупреждает и отключает. Писал для себя, но решил выложить:
import commands, sys, time
device = 'ppp0' #network device. usually eth0 for ethernet, wlan0 for wifi, ppp0 for cdma/gsm
mb = 5 #allowed megabytes

def check(interface):
    pepyaka = open('/sys/class/net/' + device + '/statistics/rx_bytes', 'r')
    kb = int(pepyaka.read())/1024
    pepyaka.close()
    return kb

def fileupdate():
    f = open('spam', 'w')
    f.write(str(check(device)))
    f.close()

def fileread():
    f = open('spam', 'r')
    val = f.read()
    f.close()
    return val

while 1:
    fileupdate()
    foo = fileread()
    if int(foo) > 1024*mb:
        import dbus
        bus = dbus.SessionBus()
        proxy = bus.get_object('org.freedesktop.Notifications', '/org/freedesktop/Notifications')
        _dbus_notify = dbus.Interface(proxy, 'org.freedesktop.Notifications')
        commands.getoutput('/sbin/ifconfig ' + device + ' down')
        _dbus_notify.Notify('', 0, '', 'Stop!', 'Stop surfing internet. You are disconnected.', [], {'x': '0', 'y': '0'}, 5000)
        sys.exit(1)
    time.sleep(1)
P.S. Да, я сначала написал на Welinux, там получил несколько советов, улучшил приложение и получилось вот это.
Постовой: Почитай рассказ Зайди на dshdsh.ru Узнай о том, как работаютExt4 и Arch Linux
2009-06-06 21:32:08 Теги: python traffic linux | Комментарии
Я думаю, не у меня одного есть интернет на даче (CDMA EV-DO (SkyLink), GSM GPRS/EDGE). Не у меня одного лимитный тариф. А некоторые платят за трафик, находясь в городе. Появляется вопрос - а можно ли сжать трафик, уменьшить его потребление. Ответ - можно. С помощью toonel.net. Приложение написано на Java и работает на Linux, Windows, Mac OS, Symbian и др. ОС. Просто скачивай приложение под нужную платформу и запускай. Переходи на вкладку Mapping, выбирай набор настроек "127.0.0.1", кликай Apply. Снимок-toonelnetНет, еще не все. Дело в том, что Toonel представляет из себя прокси-сервер, установленный на локальной машине и сжимающий трафик. Но если нужно использовать удаленный прокси - можно прописать его на вкладке Web, там же и настроить сжатие картинок JPG и GIF. То есть нужно указать свой компьютер как прокси, т.е. 127.0.0.1 и порт 8080 - настройки, которые видны на вкладке Mapping. Снимок-Параметры proxy-серверов И все - теперь можно больше сидеть в интернете, съедая столько же трафика.
2009-05-29 23:50:43 Теги: traffic | Комментарии
Снимок-Блог Василия Пупкина - Shiretoko
Допустим, вы хотите написать веб-приложение. Пусть это будет движок для блога. На PHP надо написать, как приложение будет сохранять в базу данных переданные ему данные (в админке) и отображать их для пользователя. А так же закрыть уязвимости. Представьте, если не нужно писать код для обращения с базой данных. И не надо самому изобретать функции обработки шаблонов. А так же уязвимости не возникают. Это не мечта, это Django. Фреймворк для создания веб-приложений на простом, но мощном языке Python. Попробуем? Для начала установим Python версии выше 2.3. Потом скачаем Django с официального сайта. Не ставьте из убунтовских репозиториев, а то придётся делать лишние движения типа изменений PATH и добавления прав запуска для скриптов. Скачали, распаковали,
sudo python setup.py install
сделали. Готово! Можно приступать. Создаём проект и приложение. (Проект может содержать несколько приложений, а приложение можно копировать в разные проекты. Понятно?) Мы делаем личный блог. Назовём проект vasyasite, а приложение blog.
django-admin.py startproject vasyasite cd vasyasite django-admin.py startapp blog
Отлично. Мы готовы, можно протестировать встроенный сервер... Так, я сказал "встроенный сервер"? Да, Django предоставляет разработчикам сервер для тестирования, написанный на Python. (Где вы ещё видели такую заботу о разработчиках?) python manage.py runserver Теперь по адресу http://127.0.0.1:8000/ находится проект vasyasite. Там сейчас только страница с сообщением о том, что Django отлично работает. Ctrl+C его, да! Пока нам сервер не понадобится. Создадим в папке проекта папки templates и media. Надо бы настроить проект, для этого редактируем settings.py. Мы будем использовать SQLite для баз данных - это просто. Прописываем 'sqlite3' в DATABASE_ENGINE и путь к файлу в DATABASE_NAME. У меня '/home/lol2fast4u/vasyasite/blog.db'. Если такого файла нет - он автоматически создаётся. Не забывайте сменить TIME_ZONE на свою (у меня Europe/Moscow) и LANGUAGE_CODE на 'ru-ru'. Сами догадаетесь, куда прописать созданные папки media и templates, конфиг интуитивно понятен. Тем, кто знает английский %) В INSTALLED_APPS надо дописать плагин комментариев(да. он здесь встроенный есть!), админпанель и своё приложение. У меня выглядит так:
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'django.contrib.comments',
    'vasyasite.blog',
)
Теперь надо создать модели данных. Они представляют из себя простые питоновские классы. Мы пишем простой блог, значит у нас есть категории и посты. У категории есть название, у поста - категория, дата/время, название и содержание. Вот что надо поместить в blog/models.py:
from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=100)
    def __unicode__(self):
        return self.name
class Post(models.Model):
    category = models.ForeignKey(Category)
    name = models.CharField(max_length=100)
    datetime = models.DateTimeField('Date published')
    content = models.TextField(max_length=100000)
    def __unicode__(self):
        return self.name
Обратите внимание на функцию __unicode__: она возвращает название объекта в список. Чтобы список можно было человеку почитать, если он зайдёт в интерактивную консоль ( python manage.py shell ). А теперь (в папке с проэктом) надо запустить python manage.py syncdb - эта команда создаст все нужные базы данных. Поскольку у нас в приложениях прописана авторизация, скрипт попросит придумать логин, е-мейл и пароль администратора. Теперь настроим админку. В папке приложения (blog) создаём файл admin.py. В него прописываем, с какими объектами можно будет управлять из админки. Вот что у меня:
from vasyasite.blog.models import Category, Post
from django.contrib import admin

admin.site.register([Category, Post])
Осталось написать публичный вид, "морду" блога. Будем использовать шаблоны. Сначала создаём "виды". Их будет три: главная(все посты), категория(посты одной категории) и один пост. Редактируем views.py (который в папке приложения). У меня получился такой:
from django.shortcuts import render_to_response
from vasyasite.blog.models import Category, Post

def main(request):
    posts = Post.objects.order_by('-id')
    categories = Category.objects.order_by('-id')
    return render_to_response('index.html', {'posts': posts, 'categories': categories, 'iscomments': 'false'})
def category(request, category_id):
    posts = Post.objects.filter(category=category_id).order_by('-id')
    categories = Category.objects.order_by('-id')
    return render_to_response('index.html', {'posts': posts, 'categories': categories, 'iscomments': 'false'})
def post(request, post_id):
    posts = Post.objects.filter(id=post_id)
    categories = Category.objects.order_by('-id')
    return render_to_response('index.html', {'posts': posts, 'categories': categories, 'iscomments': 'true'})
Так, подождите. Один шаблон для всех видов? Да, это так. Всё прописывается в шаблоне. Я сделал его в своём же генераторе и положил в templates. Теперь надо отредактировать, чтобы было примерно так:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
    <head>
        <title>Блог Василия Пупкина</title>
        <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
        <style type="text/css">
        
body {
    margin: 0;
    padding: 0;
}

#header {
    background: #edd400;
    margin-bottom: 1em;
}
h1 {    font: 2em sans-serif; }
h2 {    font: 1.2em sans-serif; }

#sidebar {
    background: #c4a000;
    float: left;
    width: 10em;
    display: inline;    
    margin-left: 1em;
}

#content {
    margin-left: 12em;
    margin-right: 1em;
}
.post {
    background: #c4a000;
    padding: 1em;
    margin: 1em 0em 1em 0em;
}
.meta {
   border: 0.2em dotted #edd400;
   margin: 0.1em;
}
#footer {
    background: #edd400;
    clear: both;
}
        </style>
    </head>
    <body>
        <div id="header">
            <h1><a href="/">Блог Василия Пупкина</a></h1>
            <h2>Работает на Django</h2>
        </div>
        <div id="sidebar">
            Категории:
            <ul>
                {% for category in categories %}
                    <li><a href="/category/{{ category.id }}">{{ category.name }}</a></li>
                {% endfor %}
            </ul>
        </div>
        <div id="content">
            {% for post in posts %}
                <div class="post">
                    <div class="meta">{{ post.datetime }} <a href="/category/{{ post.category.id 
}}">{{ post.category.name }}</a><a href="/post/{{ post.id }}">{{ post.name }}</a></div>
                    {{ post.content }}
                    
                    {% ifequal iscomments 'true' %}
                        {% load comments %}
                        {% get_comment_list for post as allcomments %}
                        {% for acomment in allcomments %}
                            <div class="meta"><a href="{{ acomment.user_url }}">{{ acomment.user_name }}
</a>: {{ acomment.comment }}</div>
                        {% endfor %}
                        <div class="meta">{% render_comment_form for post %}</div>
                    {% endifequal %}
                </div>
            {% endfor %}
        </div>
        <div id="footer">
            <p>Разметка от <a href="http://myfreeweb.ru">MyFreeWeb.ru</a></p>
        </div>
    </body>
</html>
Заметили, что в шаблоне мы указали URL'ы, которых мы нигде больше не указывали? Самое время их указать. Открываем urls.py (в директории проэкта). Раскомментируем строчки для админпанели и добавляем свои для видов. А ещё для комментариев одну. Получается что-то такое:
urlpatterns = patterns('vasyasite.blog.views', 
    (r'^$', 'main'), 
    (r'^category/(?P<category_id>\d+)/$', 'category'), 
    (r'^post/(?P<post_id>\d+)/$', 'post'), 
    (r'^admin/(.*)', admin.site.root), 
    (r'^comments/', include('django.contrib.comments.urls')), 
)
Активируем сервер, заходим на http://127.0.0.1:8000/ и получаем ошибку - скрипт не может взять посты т.к. мы их не писали! Заходим в админку http://127.0.0.1:8000/admin, логинимся (помните, указывали логин и пароль, когда syncdb спрашивал?). Интерфейс понятный :) Создаём категорию и пост. Заходим обратно на http://127.0.0.1:8000/ и видим... Ура!!! Движок работает. Можно рассказывать друзьям, "какой я крутой" и вести блог. Снимок-Блог Василия Пупкина - Shiretoko-1 Домашнее задание: прикрутить RSS и комментарии IntenseDebate. P.S. Читайте официальную документацию!
Постовой: Здесь можно купить охотничье ружьё Лучшие обои для мобильного
Фентези обои для мобильного телефона
Как скачать фильмы из интернета?
Мануальный массаж на дому в пределах МКАД.
2009-05-24 16:30:18 Теги: django python blog | Комментарии
Digg.com - англоязычный сервис социальных новостей, чем-то похожий на русский всем известный Хабрахабр, однако у него есть одно отличие - весь контент на нём - ссылки. Никаких постов. Только ссылки, за которые можно голосовать. И комментировать, конечно. Казалось бы всё хорошо, но нам нужен русскоязычный. Пойдём искать. //некоторые из них я знал раньше, некоторые мне доставил твиттер. привет @a_pap и @Copoket :) и да, это не все //пост не проплачен, но хотелось бы...Блогун - монетизируем блоги
  1. News 2.0. На нём я уже давно "сидел". Приличный сервис, спам весь фильтруется, новости интересные. Хороший интерфейс и дизайн, можно входить через OpenID. А мой новый OpenID, который я зарегистрировал на myOpenId и прописал в шаблоне блога, сервис определил не как прописанный (myfreeweb.ru - который я ввёл), а как myfreeweb.myopenid.com :( news2_mainpage
  2. СМИ2. Сервис похож на News2.0 - те же причины для неодобрения новости, та же ошибка с OpenID. Разве что дизайн круглее и зеленее. Зато можно выбрать тип новости! А ещё по клику на новость открывается не сам источник, а страница smi2.ru с элементами (одобрить, комментарии, etc.) и фреймом, содержащим источник. Но для тех, кто через такие сайты раскручивается, это не плюс :) smi2_mainpagesmi2_add smi2_add2
  3. progg.ru. Единственный тематический сервис в этом обзоре. Дело в том, что тематика подходит :) Стандартный функционал, простой дизайн, максимально похожая на Digg'овскую кнопка голосования. С OpenID всё отлично. progg_mainpage
  4. Ваау! (да, да русскими буквами. самому кажется, что английское Bay - бухта, особенно после событий с The Pirate Bay) Технически всё отлично, удобная навигация, но... Что это? Скачать фильм такой, такой, какой? Да ну, всё в спаме. vaau_mainpage
  5. Reddit на русском. Ну что тут говорить, просто сервис. Среднего качества новости, интерфейс слегка странноват. reddit_mainpage
Итак, все сервисы хороши, но больше всего мне понравился News 2.0 - популярность среди адекватных людей (не спаммеров) и удобный интерфейс делают своё. И реклама там контекстная, а не баннер :)
2009-05-12 17:38:43 Теги: digg services web20 | Комментарии