Так уж вышло, что я использую zabbix для мониторинга подручных мне серверов. Переносил тут zabbix с одного сервера на другой, и поймал странную ошибку, веб-морда zabbix'а ругается на
"Compilation failed: unknown option bit(s) set at offset 0"
всё это из-за того, что дистр у меня это смесь squeeze и sid, php стоял из sid, а libpcre3 из squeeze.
что бы решить проблему надо обновить libpcre3 до версии из sid и жестко перезагрузить апач.
Tuesday, February 22, 2011
Tuesday, January 25, 2011
mongodb, dump, restore
Иногда из бинарных дампов mongodb (сделанных с помощью mongodump) надо восстановить только чуть-чуть данных. Поднимать для всего этого отдельный инстанс mongodb бывает слишком жирно.
Но, на помощь нам придет mongorestore. У mongorestore есть параметр --filter
Т.е. что бы восстановить запись с конкретным _idшником надо сделать следующее
где host, db, collection это хост, название бд и коллекция куда мы будем восстанавливать. важно, что бы в этом "куда" не было записи с таким _id (в данном случае).
Да, _id цифровые у меня, обычно _id это ObjectId, т.е. фильтр будет {_id: ObjectId("47cc67093475061e3d95369d")}, например.
Минус такого восстановления в том, что mongorestore будет читать весь файл с коллекцией.
Но, на помощь нам придет mongorestore. У mongorestore есть параметр --filter
--filter arg filter to apply before inserting
Т.е. что бы восстановить запись с конкретным _idшником надо сделать следующее
mongorestore -h host -d db -c collection --filter "{_id:123}" ./collection.bson
где host, db, collection это хост, название бд и коллекция куда мы будем восстанавливать. важно, что бы в этом "куда" не было записи с таким _id (в данном случае).
Да, _id цифровые у меня, обычно _id это ObjectId, т.е. фильтр будет {_id: ObjectId("47cc67093475061e3d95369d")}, например.
Минус такого восстановления в том, что mongorestore будет читать весь файл с коллекцией.
Thursday, October 8, 2009
django-localeurl
Форкнул я тут django-localeurl. Что сделал?
Лежит все на битбукете.
Быдолкод? Наверное да.
- Тепреь слеш добавляется, т.е. если раньше после захода на скажем
/join
был редирект сначала на/en/join
, а потомCommonMiddleware
редиректила на/en/join/
, то сейчас сразу идет редирект на/en/join/
. Код выдрал изCommonMiddleware
- Язык теперь по дефолту детектится, а не берется из
settings.py
. Детектится черезtranslation.get_language_from_request
. Т.е. сначала смотрится в сессииdjango_language
, потом смотрися в куках то, что указано вsettings.LANGUAGE_COOKIE_NAME
, потом разбираетсяHTTP_ACCEPT_LANGUAGE
. Если ничего не помогло, то берется дефолтный, т.е.settings.LANGUAGE_CODE
. Что бы все это работало, надо что быSessionMiddleware
иAuthenticationMiddleware
были прописаны доLocaleURLMiddleware
, т.е. необходимо, что бы и сесия и юзер были вrequest
.
Лежит все на битбукете.
Быдолкод? Наверное да.
Tuesday, August 11, 2009
django, manage.py test
Как запустить юниттесты в джанго-проекте, если не используется база данных?
Правильно, прописать в
у меня получилось что-то такое:
Правильно, прописать в
settings.TEST_RUNNER
свой запускальщик тестов. Можно просто скопировать (что я и сделал) стандартный джанговский django.test.simple.run_tests
, убрав из него все упоминания о базе данных.у меня получилось что-то такое:
# -*- coding: utf-8 -*-
import unittest
from django.conf import settings
from django.db.models.loading import get_apps, get_app
from django.test.simple import build_test, build_suite, reorder_suite
from django.test.utils import setup_test_environment, teardown_test_environment
from django.test.testcases import TestCase
def run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[]):
setup_test_environment()
settings.DEBUG = False
suite = unittest.TestSuite()
if test_labels:
for label in test_labels:
if '.' in label:
suite.addTest(build_test(label))
else:
app = get_app(label)
suite.addTest(build_suite(app))
else:
for app in get_apps():
suite.addTest(build_suite(app))
for test in extra_tests:
suite.addTest(test)
suite = reorder_suite(suite, (TestCase,))
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
teardown_test_environment()
return len(result.failures) + len(result.errors)
Tuesday, August 4, 2009
tempfile.NamedTemporaryFile и zipfile.ZipFile
Суть этого поста в том, что надо никогда не забывать делать
Мой пример совсем простой, делаю файл через
flush()
на открытом файле, из которого потом собираемся читать.Мой пример совсем простой, делаю файл через
tempfile.NamedTemporaryFile
, делаею архив, пишу в архив этот файл через ZipFile.write()
. flush()
перед ZipFile.write
сделать забыл и словил "подземный стук", вроде пишем все как надо, а в архиве файл немного поменьше..
Friday, July 17, 2009
wapi, PaginatedSerializeResponse
использовать это чудо просто, в методе возвращаем что-то типа
где books.object_list -- что-то у чего есть __iter__, page -- номер страницы, num_pages -- кол-во страниц.
return PaginatedSerializeResponse(books.object_list, page=page,
num_pages=num_pages, cname="books")
где books.object_list -- что-то у чего есть __iter__, page -- номер страницы, num_pages -- кол-во страниц.
# -*- coding: utf-8 -*-
from wapi.responses import SerializableResponse
from wapi.formatters import get_formatter
from wapi.serializers import get_object_serialization
def serialize_paginated(format, objs, method, out=None, **kwargs):
fmt = get_formatter(format)(out=out)
fmt.start()
page = kwargs.get('page', 1)
num_pages = kwargs.get('num_pages', 1)
cname = kwargs.get('cname', 'objects')
if objs is None or len(objs) == 0:
s_objects = []
else:
s_objects = [get_object_serialization(obj, method).\
apply(obj, **kwargs)[1] for obj in objs]
presponse = {
'page': page,
'num_pages': num_pages,
cname: s_objects,
}
fmt.format(('paginatedobjects', presponse))
fmt.end()
return fmt.get()
class PaginatedSerializeResponse(SerializableResponse):
def transform(self, cls):
return cls(self.objs, self.method, serialize=serialize_paginated,
*self.args, **self.kwargs)
Subscribe to:
Posts (Atom)