Если у вас есть сайт сделанный на Drupal, то вам наверно приходиться периодически заходить в админку и запускать на исполнение крон, файлик что исполняет набор обязательных периодических задач – очиска логов, индексирование материала и других. Но для уменьшения труда предлагаю такой маленький скринптик на Питоне(цель которого именно показать, что автоматизация зачастую простая задача, а с Питоном она просто сверх-простая
)
sites = (
'http://screencast.org.ua/cron.php',
'http://tutamc.com/cron.php'
)
from twill.commands import *
for site in sites:
go(site)
Осталось лишь поставить у себя в задачах автоматический запуск данного скрипта раз в сутки или больше – это уже зависит от вашего друпаловского сайта.
Как видим, что для доступа к страницам использую библиотеку twill – она мне так понравилась, что я без нее сейчас почти не обхожусь, даже в таких миниатюрных проектах.
Когда какой-то вещью иногда мы не пользуемся хоть даже не большой строк – инфа о ней сразу забывается. И чтобы освежить в памяти основы очень хорошо подходит простой перечень всех возможных команд. Такой файлик я сделал для Mercurial, чтобы при необходимости вспомнить все команды. Надеюсь он вам также поможет:
Глобальные настройки
Файл – C:\Users\Spirit\.hgrc
[ui]
username = Roman Khomenko
#enable fetch
[extensions]
fetch =
Создание репозитария
$ hg clone https://presidentua@bitbucket.org/jespern/django-piston/
$ hg clone rep_from rep_to
$ hg init myproject
Read more »
Отладка в Django – одно удовольствие. Но есть один маленький почти незаметный минус, и заключается в том, что в окне где запущен отладочный сервер постоянно отвлекают сообщения о том что Django грузит медия-ресурсы. За эти сообщения отвечают такие строчки в файле django/core/servers/basehttp.py:
def log_message(self, format, *args):
# Don't bother logging requests for admin images or the favicon.
if self.path.startswith(self.admin_media_prefix) \
or self.path == '/favicon.ico':
return
sys.stderr.write("[%s] %s\n" % (self.log_date_time_string(), format % args))
Конечно патчить ядро не очень красиво, но посколько это ни на что не влияет и для домашнего использования сойдет. Так что меняем эту функцию на следующую:
def log_message(self, format, *args):
# Don't bother logging requests for admin images or the favicon.
if self.path.startswith(self.admin_media_prefix) \
or self.path == '/favicon.ico':
return
if self.path.startswith('/media/') \
or self.path.startswith('/__debug__/'):
return
sys.stderr.write("[%s] %s\n" % (self.log_date_time_string(), format % args))
Я по этой фишке также написал тикет в Джанго, может когда-то такую возможность добавлять в админку.
Последнее время резко возник интерес к базам данных вида key-value. Я причину этого пока что не вывел. Но, все равно пошел в ногу моде, и пока не пожалел.
База данных key-value, эта та которая не поддерживает ничего кроме записи значения по ключу и доставания этого значения. Тоесть мы можем написать: по ключу “а” записать “123″, а потом указать: отдай мне то что лежит по ключу “а”. Вот и все. Лишь 2 простейшие операции. И с ними иногда несколько труднее, ведь нету сортировок, выборок, групировок и других радостей жизни и любимого SQL. Но не спеши кричать свое Фу, пока не рассмотрели плюсы.
Вот пусть у тебя есть система где 1000 пользователь онлайн, и тогда ты понимаеш смысл маштабирования и оптимизации. Но ведь количество пользователь может расти. А маштабирование обычной SQL базы не тривиальное задание и скоро можеш впереться в стенку, дальше которой не перепрыгнеш. Этот пределе конечно далеко, но все же…
И при достижении этого предела подумай о key-value база данных и очень класном представителе Redis. Преимуществам которого есть константое время ответа, тоесть независимо от количесва обьема ответ будет в одного и тоже очень малое время. Второе преимущество это маштабируемость – если нагрузка увеличилась – ставим еще один сервер. Еще увеличилась – еще один. А Redis уже сам автоматически все маштабирует без какой либо помощи.
Read more »
Сейчас наверно трудно найти человека не слишавшего о системе контроля версий. Но в большинстве фирмы используют SVN и не спешат переходить на распределенные системы, а может они просто не могут определиться какую систему контроля версий использовать… И где-то год назад это был сложный выбор, но не сейчас. Ведь из распределенных систем контроля версий сейчас популярны лишь Mercurial и Git. И выбор стоить именно между ними.
Я в своей практике использовал обе системы и существенных различий между ними нету, но учтем некоторые факты:
1. Mercurial, написан на Питоне.
2. Гугл на Google Code поддерживаем именно Mercurial.
3. Mercurial несколько проще в обучении и использовании.
Так что если вы еще колеблитесь то учите и используйте Mercurial, а при необходимости перейти на Git не составить труда.
В ближайшее время я напишу маленькое руководство о том как правильно пользоваться Mercurial.
Я человек снолюбимый, и с утра меня тяжело разбудить. Понимаю, что это плохая привычка, но все же не могу от нее отказаться. Впрочем чаще всего мне и не нужно никуда спешить, но просыпаться каждый день в 12 часов, тоже как-то лиш лишняя трата времени. Посему будильник нужен, но его подобрать было тяжело.
Сперва заюзал советский будильник. Он конечно будил, но я понял, что если будет будить хотя бы неделю – начну заикаться
.
Дальше использовал телефон, и где-то несколько недель все было супер, вроде и не сильно резко будил, но это все очень быстро прошло, и снова меня никакая мелодия с телефона уже не будила.
И только после всех этих мучения я вспомнил о Питоне и немного полазил нашел библиотеку для управления ВинАмпом(кстати, АИМПом также нормально управляется) – http://www.shalabh.com/software/about_winamp_py.html.
И уже через минут 10 был готов такой скриптик на Python:
import time
import os
import winamp
print 'Good Morning'
#открываем плайлист, чем запускаем винамп
print '# start playing'
os.startfile(r'D:\musik\Futurama\futurama.PLC')
#ждем пока он запустится
time.sleep(3)
#подключаемся к винампу
w = winamp.winamp()
#плавно увеличиваем громкость
for i in xrange(0,255,5):
print '# set volume on %s' % i
w.setVolume(i)
time.sleep(5)
Итак, этот скрипт сначала запускаем мой плейлист и устанавливает громкость в 0. А дальше понемножку его увеличиваем, чем обеспечиваем мне спокойный подьем.
Сегодня продолжим знакомство с Django и наконец то рассмотрим базовый кирпич, а именно приложение(application) на примере создания приложения contact, для отсылки каких-то сообщений администрации. Причем напомню что этот цикл практический, в нем я почти не рассказываю почему, лишь говорю как, потому что я все равно не напишу лучше чем в документации: http://docs.djangoproject.com/en/dev/
Разработка каждого приложения начинается с команды:
manage.py startapp contact
Где contact – названия приложения.
В результате будет создана папка contact со следующими файлами:
- models.py
- views.py
- __init___.py
Read more »
После двух частей мы уже можем сделать простой статической сайт. И сегодня поговорим как залить все это добро на сервак и настроить его. Правда сервак настроим на легком уровне, без оптимизаций и т.д. Главное запустить, а потом уже можно допиливать по ходу
Итак, имеем SSH доступ к серверу Ubuntu 8.04. Сперва перейдем в root и обновим все пакеты
su root
apt-get update
apt-get upgrade
Read more »
Вторая часть туториала о Django, где опять буду расказывать как создается полнофункциональный сайт. Это не подробнейшее руководство – за этим смотрите документацию на djangoproject.com и читайте книгу djangobook.com (на русском — djbook.ru). Это всего лишь практический туториал. И сегодня расскажу о:
- статические файлы
- статические страницы — flatpages
- шаблоны
- google_analytics
- debug_toolbar
Read more »
Все Django туториалы хороши для ознакомления, но чтобы сделать полностью рабочий проект на Django размером больше чем блог – такого туториала я не встречал. И посему в серии небольших статтей напишу о приблизительно таком:
- создание проекта и его настройка
- админка
- flatpages, их использование
- шаблоны
- установка дополнительных снипетов
- модель, работа с БД
- мини-блог сайта
- работа с формами
- регистрация обычная
- регистрация OpenID
- управления контентом юзера
- …
- настройка все на продакшине
Это некие основные пункты о которых буду рассказывать. Для понимания материала нужно понимание основ Python, Web-разработки.
Read more »