Tuesday, February 22, 2011

zabbix, php, debian squeeze lenny

Так уж вышло, что я использую zabbix для мониторинга подручных мне серверов. Переносил тут zabbix с одного сервера на другой, и поймал странную ошибку, веб-морда zabbix'а ругается на

"Compilation failed: unknown option bit(s) set at offset 0"

всё это из-за того, что дистр у меня это смесь squeeze и sid, php стоял из sid, а libpcre3 из squeeze.

что бы решить проблему надо обновить libpcre3 до версии из sid и жестко перезагрузить апач.

Tuesday, January 25, 2011

mongodb, dump, restore

Иногда из бинарных дампов mongodb (сделанных с помощью mongodump) надо восстановить только чуть-чуть данных. Поднимать для всего этого отдельный инстанс mongodb бывает слишком жирно.
Но, на помощь нам придет 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

использовать это чудо просто, в методе возвращаем что-то типа

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)

Labels