Big Chimpin!
Avatar

MyFreeWeb

Vcard Download vCard   what is this?
Rss_icon

Recent Activity


Filter by:
All
  • Почему мне не нравятся CSS-сетки

    CSS-сетки (CSS grid systems) - это же фиксированная разметка! Размеры элементов в пикселях - как 2002! Я не могу увеличить страницу и просто читать - нужно прокручивать. Не могу уменьшить окно и просто читать - нужно прокручивать. Зачем?

    Я представляю вам альтернативу... Invisible CSS framework!

    Я пользовался масштабируемой версткой довольно долго, и решил отделить основу. Не повторяй себя (Don't Repeat Yourself), да?

    <aside class="sideleft">
    My cool sidebar.
    </aside>
    <section class="withls"> <!-- that means "with left sidebar" -->
    Lorem ipsum dolor sit amet...
    </section>
    
    Как видите, это очень просто. Но не надо думать, что на нем нельзя сделать что-нибудь сложное. Вот:

    В Invisible есть сброс (CSS reset), настройки шрифтов, основные margin'ы, 50/50 и стандартный 2/3-колоночный макет (layout не совсем «макет», но слова лучше я не нашел. разметка?). Он модульный и написан на CleverCSS, а собирается pake.

    Качать здесь, пользуйтесь на здоровье - public domain. А еще можно забрать исходники из Bazaar'а ( bzr branch lp:invisible ) и собрать самому - например, с меньшим количеством модулей (для сборки нужны clevercss и cssutils).

    P.S. по поводу того, что текст выглядит как перевод - он и есть перевод. я сначала пишу на английском.
    Постовой: forex webmoney обмен sms forex sms пополнения webmoney и открытие forex счетов
    5 months on
    MyFreeWeb.ru
  • Русскоязычные аналоги Digg 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 - популярность среди адекватных людей (не спаммеров) и удобный интерфейс делают своё. И реклама там контекстная, а не баннер :)
    6 months on
    MyFreeWeb.ru
  • Пишем движок блога на Python + Django
    Снимок-Блог Василия Пупкина - Shiretoko
    Допустим, вы хотите написать веб-приложение. Пусть это будет движок для блога. На PHP надо написать, как приложение будет сохранять в базу данных переданные ему данные (в админке) и отображать их для пользователя. А так же закрыть уязвимости. Представьте, если не нужно писать код для обращения с базой данных. И не надо самому изобретать функции обработки шаблонов. А так же уязвимости не возникают. Это не мечта, это Django. Фреймворк для создания веб-приложений на простом, но мощном языке Python. Попробуем? Для начала установим Python версии выше 2.3. Потом скачаем Django с официального сайта. Не ставьте из убунтовских репозиториев, а то придётся делать лишние движения типа изменений PATH и добавления прав запуска для скриптов. Скачали, распаковали,
    sudo python setup.py install
    сделали. Готово! Можно приступать. Создаём проект и приложение. (Проект может содержать несколько приложений, а приложение можно копировать в разные проекты. Понятно?) Мы делаем личный блог. Назовём проект vasyasite, а приложение blog. <!--more-->
    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. Читайте официальную документацию!
    Постовой: Здесь можно купить охотничье ружьё Лучшие обои для мобильного
    Фентези обои для мобильного телефона
    Как скачать фильмы из интернета?
    Мануальный массаж на дому в пределах МКАД.
    6 months on
    MyFreeWeb.ru
  • Ограничиваем себя в расходе трафика Поскольку у меня лимитный интернет (предоплачено 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
    6 months on
    MyFreeWeb.ru
  • Toonel.net - сжимаем трафик сами Я думаю, не у меня одного есть интернет на даче (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-серверов И все - теперь можно больше сидеть в интернете, съедая столько же трафика.
    6 months on
    MyFreeWeb.ru
  • Переезд Вот я и переехал на свой движок, написанный на Django. Заодно и сменил дизайн. Да, из старых постов взял только лучшие. URL'ы поменялись...
    6 months on
    MyFreeWeb.ru
  • Evernote для блогочитателей

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

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

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

    Добавить в Evernote #TODO: Сделать для всех постов (в шаблоне)
    6 months on
    MyFreeWeb.ru
  • Продвинутый яйцетаймер

    Конечно же, 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. А когда выбрал - установи Программы для Линукс.

    6 months on
    MyFreeWeb.ru
  • Обзор графических оболочек для Windows Mobile

    Поскольку я теперь пользователь Windows Mobile 6.1 Professional, мне нужно выбрать оболочку. Управлять чистым виндозом пальцами - сложно и не удобно. В комплекте с моим коммуникатором шла оболочка SkyTouch - слегка кастомизированный(лучше иконки, ярлык оператора) Spb Mobile Shell 2. Попробовал и удалил - она очень любит память, не предоставляя особых удобств, да ещё и отделена от Today - при сворачивании приложения я попадал не в неё, а на Today. Потом я скачал всякие другие оболочки. Попробовал, и даже некоторые мне понравились. И вот обзор графических интерфейсов для MS (Microsoft) Windows Mobile:

    Spb Mobile Shell 3

    spb 1spb 2
    Следующая версия Spb Menu имеет немного общего с 2-ой версией. Теперь она состоит из двух экранов (Professional и Lifestyle). Первый - готовый типа-тудей. Отображает нужную (для кого?) информацию. Второй - Lifestyle ("Свободный" в русском переводе) куда интереснее - это три рабочих стола, на которые можно добавлять виджеты... Стоп. Виджеты? Нет, это так, динамические ярлычки. И управление плеером... Виндоусным плеером!!!111111 А у меня другой. Оболочка так же работает вместе с Today'ем, как и 2 версия. Следовательно, при сворачивании приложения сразу в неё не попасть. Хоть и отделена от тудея, жутко встроена в систему. Закрыть нормально не возможно. Я закрывал WisBar'ом - запустилась опять. Там видимо сидит какой-то демон ("служба" по-виндовски), который запускает Spb Shell, если она закрылась. В оперативке занимает 2.9 Мб (оболочка, а не "какая-то служба") Разработчики так кричат, что она интегрируется с социальной сетью Facebook. Всего лишь синхронизирует фотографии у контактов. Возможность не нужная... в оболочке. Это должно быть в клиенте фейсбука, что и есть в SkyBook. Раз уж речь зашла о контактах: контактами управляет хорошо, но на экран контактов нужно каждый добавлять... полезно когда много, бесит когда мало. Но плюсы есть - много к чему быстрый доступ и всё из-коробки. А не очень продвинутому пользователю Spb'шные виджеты могут понравится. Но оболочка стоит 30$. Я считаю, что не стоит она своих денег...
    ...когда есть бесплатные оболочки, во многом превосходящие платную.

    HTC TouchFLO (Manila)

    manila screenshot 1manila screenshot 2
    Это та оболочка, которая предустановлена на коммуникаторы HTC. Она бесплатна... то есть за неё платят (???) покупатели этих коммуникаторов. Умные разработчики выдернули её из прошивки, облегчили, положили в cab и всё. Удобная для управления одним пальцем, Manila состоит из вкладок, переключаемых снизу. На одну из вкладок с помощью стороннего софта можно поставить today-плагины. На вкладке "поиск на карте" можно искать на карте (логично, да?) с помощью Google Maps. Которые должны быть установлены в память девайса. С флешкой не прокатит. Вкладка "Музыка" управляет Windows Media Player, вкладка "Фото" - каким-то HTC'шным фотоальбомом. Но в этом нет ничего плохого, ведь их можно убрать с помощью кастомайзера. С его же помощью поменять тему, шрифт. А так же отключить ненужные вкладки и включить пустую вкладку "оператор" - для today-плагинов! Оболочка лёгкая на вид, легко отключаемая (убрал today-плагин-"включатель" и всё) и красивая. Что ещё надо?

    Wisbar Advance Desktop 2

    apple screenshothero screenshot
    Это самая настраиваемая оболочка, в ней можно самому создавать страницы (рабочие столы) с виджетами и today-плагинами, настраивать жесты, софт-кнопки... А можно и не настраивать! Можно скачать готовую тему, которых очень много! Этот десктоп - полноценная замена Today (простите, да. я вас достал этим словом, но без него никак.). Может повторять тот же TouchFLO, iPhone, Android (кстати, я скоро доделаю android-like тему. ждите!), десктопный Windows (фу!), GNOME, Mac OS X... А может быть просто многостраничным Today'ем. Или вообще быть каким угодно красивоудобным интерфейсом - всё зависит от фантазии и желаний пользователя. Тема для WAD - не просто графика, а вообще всё. Виджеты, их положение... Я бы сказал, что темы - это оболочки, а WAD2 - платформа для них. Хоть программа и платная, она нормально работает в пробном режиме. Вроде бы бесконечно (или я путаю с Wisbar, который bar, а не десктоп?).

    Итак, все оболочки делают WinMobile более удобным, делают тачфон из обычного коммуникатора, но только Wisbar Advance Desktop 2 подстраивается под пользователя, а не наоборот. Но тем, кому надо быстро, красиво и удобно (а не сидеть и настраивать) я советую TouchFLO. Я сам в основном пользуюсь Wisbar Desktop, иногда переключаясь в TouchFLO.

    P.S. Spb Shell советую тем, кто хочет просто потратить деньги ;)

    Постовой:
    VDS или просто хостинг
    Размещение в датацентре. Надёжно и удобно.
    6 months on
    MyFreeWeb.ru
  • EasyTAG, или редактируем ID3-теги в mp3/ogg/др.

    Что такое EasyTAG - знает каждый пользователь Linux (если он не kde'шник ;) программа на gtk). Если не знает - это редактор тегов в mp3, ogg и др. звуковых файлах. А вот как им правильно пользоваться - далеко не каждый. Даже я сам долго тупил и копипастил имя исполнителя/название альбома.

    Итак, первое, что надо знать - как перекодировать теги. Если они отображаются кракозябрами или квадратиками, значит они в кодировке cp1251 (кодировка из Windows. Однако сам Microsoft использует юникод, взгляните хоть на html-код их поисковика bing.com). Нужно их перекодировать в юникод, то есть UTF-8.

    Это просто. Заходим в настройки (Alt+P), переходим на вкладку "Настройки тегов ID3". Выбираем, чтобы читал из CP1251, писал в UTF-8, как на скриншоте:

    включи картинки!

    И всё, теперь при открытии папки EasyTAG будет конвертировать теги - надо будет только сохранять файлы. Итак, что мы получили:

    1. Открываем папку с музыкой
    2. Выделяем нужные песни
    3. Сохраняем
    4. PROFIT!

    Да, это было просто. А если надо посложнее?

    Например, когда ты ставишь теги (или редактируешь чужие. вот я недавно iz translita делал русский), имя исполнителя, название альбома, год, обложку и др. данные прописать во все файлы сразу. Как я сказал в начале, я копировал раньше вручную %) Но потом я случайно кликнул правой кнопкой на поле и увидел там... "Записать это поле в теги выделенных файлов"! А потом оказалось, что это же делает кнопочка справа от поля:

    включи картинки!

    Вот так получается:

    1. Выделяем песни альбома
    2. Пишем название альбома в поле, жмём кнопку справа. Так же с исполнителем и др.
    3. PROFIT!

    Это оказалось ещё проще. EasyTAG оправдывает своё название. ПростоТЕГ.

    Постовой:
    Животные иногда болеют. Их лечат в ветеринарной клинике.
    Скачать украинские темы WordPress, они нужны.
    А тот же WordPress лучше работает не на общественном хостинге, а на выделенном сервере. Их заказывают здесь: colocation на M9.
    6 months on
    MyFreeWeb.ru
  • Делаем веб-приложение для iPhone и др. тачфонов, просто.

    Недавно на Хабрахабре проскакивала новость про обновление jQTouch. Это такой плагин к известному JavaScript-фреймворку jQuery, позволяющий очень просто создавать веб-приложения для тачфонов - телефонов с сенсорным экраном, причём с пальцеориентированным интерфейсом. Каким и является iPhone. А так же HTC Hero, Dream, Magic - на Android - и куча разных WM-коммуникаторов с оболочками. Вот последнее у меня есть.

    iphone_screenshot_3

    Показывать буду на примере тач-версии этого блога. (Кстати, айфонщики, добавляйте. Будете читать.) Веб-приложение представляет из себя простую html-страницу, в которую нужно подключить jQuery и jQTouch, а так же тему для второго.

    Я добавил в head вот это:

    <script type="application/x-javascript" src="/media/jqtouch/jquery.1.3.2.min.js" charset="utf-8"></script>
    <script type="application/x-javascript" src="/media/jqtouch/jqtouch.min.js" charset="utf-8"></script>
    <style type="text/css" media="screen">@import "/media/themes/jqt/theme.min.css";
    @import "/media/jqtouch/jqtouch.min.css";</style>
    

    разве что тема другая. плюс ещё свой стиль для поста. Тебе надо будет не прямо это скопировать, а ещё поправить пути.

    После подключения надо инициализировать интерфейс. Это делается функцией $.jQTouch() - и всё, больше ничего не надо писать на JS. Если, конечно, не надо AJAX'ом подгружать ничего. У меня вот так:

    $.jQTouch({
        icon: 'http://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Feed-icon.svg/128px-Feed-icon.svg.png',
        statusBar: 'black-translucent',
        preloadImages: [
            '/media/themes/jqt/img/chevron_white.png',
     *пути_к_всяким_картинкам*
            ]
    });
    

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

    Теперь можно просто использовать обычные XHTML-теги. Но сначала расскажу о самом главном. Страницы - главное в приложении. Страница представляет из себя простой блок (div) c (понятным) id. Первый див будет первой страницей, которая будет открываться при нажатии на иконку в телефоне. Чтобы переходить между страницами, на первой должна быть ссылка на вторую, то есть a href="#id_страницы".

    Для создания верхнего бара делаем вложенный в страницу div class="toolbar". Заголовок в нём - просто обычный h1. Кнопка "назад" - a class="back button" href="#id_задней_страницы". Вообще, чтобы узнать больше о элементах интерфейса, смотрите исходный код демки.

    А теперь самое главное - интеграция с Django. Мы же делаем тач-версию блога, так? Я не знаю, как у тебя устроены модели и виды, но у меня список постов - content.object_list. Просто делаем шаблон, в котором в head вся инициализация, описанная выше, а в body... Особая Django'вская магия ;) Начнём с главной страницы. Это - список постов блога. По нажатию на один из них - страница с самим постом. Логично, да?

    <div id="main">
      <div class="toolbar"><h1>MyFreeWeb Touch</h1></div>
      <div id="content">
        <ul>
          {% for post in content.object_list %}
          <li class="arrow"><a href="#{{ post.slug }}">{{ post.name }}</a></li>
           {% endfor %}
        </ul>
      </div>
    </div>
    

    Мало кода, да? Просто заголовок и список постов. А теперь делаем настоящую магию. Для каждого поста создаём свою страницу с id равным его slug (короткое имя на латинице, с _ вместо пробелов, и без лишних символов. Переводить как это слово - не знаю.) - мы ссылались на эти страницы в главной.

    {% for post in content.object_list %}
    <div id="{{ post.slug }}">
      <div class="toolbar">
        <a class="back button" href="#main">Назад</a>
          <h1>MFW:{{ post.name }}</h1>
      </div>
      <div class="post">{{ post.text|safe|urlize }}</div>
      <div class="info">Написан {{ post.date }}{% if post.tags %} | 
    Теги (открываются в обычной версии):{% for tag in post.tags.filter %}
    <a href="/tag/{{tag.name}}">{{ tag.name }}</a> {% endfor %}{% endif %}</div>
    </div>
    {% endfor %}
    

    Да вот и всё. Вот так Это выглядит на моём AnyDATA ASP-505A:

    asp_screenshot_1asp_screenshot_2

    А вот как на iPhone, спасибо @_corwin_ (follow! follow!!!):

    iphone_screenshot_0iphone_screenshot_1iphone_screenshot_2

    Короче, теперь веб-приложения для iPhone и коммуникаторов вообще делать очень просто. Вот такие дела.

    Постовой:
    Дома лучше, а то вдруг пробки. вызов ветеринара на дом
    Прорезные карманы
    6 months on
    MyFreeWeb.ru
Next page