27 Feb 2014
Не так давно мне нужно было отловить утечку памяти в Django проекте. Для отладки был выбран Guppy. Для начала использования Guppy нам потребуется 5 минут и 5 простых шагов.
Для начала установим наш инструмент отладки: pip install guppy
Теперь нам нужно добавить следующий код в наш главный urls.py
.
import guppy
from guppy.heapy import Remote
Remote.on()
Запускаем наш Django поект. Не забудьте выключить режим отладки, иначе все запросы к базе будут кешироваться и занимать память. DEBUG = False
Теперь в терминале нужно выполнить команду python -c "from guppy import hpy;hpy().monitor()"
. Дальше мы будем использовать следующие комманды:
-
lc
- увидеть процессы
-
sc
- подключится к процессу
-
int
- перейти в интерактивную консоль
-
hp.heap()
- увидеть количество потребляемой памяти
-
hp.setref()
- очистить информацию о количестве памяти
Начинаем отладку. Смотрим количество памяти используя hp.heap()
, затем очищаем эту информацию с помощью комманды hp.setref()
. Делаем действия, которые по нашему мнению текут, и смотрим на hp.heap()
.
12 Jan 2014
Этот небольшой пост посвящен именно использованию докера на маке. Если у вас еще не установили докер, просто следуйте документации.
Итак, у вас есть установленный Vagrant и VirtualBox, также вы имеете склонированные репозиторий с докером и запущенное виртуальное окружение.
Чтобы начать использовать докер нам придется проделать несколько нехитрых операций, а точнее нужно скомпилировать клиент докера из исходников и запустить демон докера в виртуальной машине.
Если у вас нет Go, то его нужно установить, а также установить Mercurial (он понадобиться чуть позже).
brew install go --devel --cross-compile-common --with-cgo
Теперь создадим временную папку tmp, в которую скачаем все зависимости для компилирования докера. Mercurial нам нужен для того, чтобы получить все зависимости, так как одна из них лежит в меркуриал репозитории.
mkdir tmp
export GOPATH=`pwd`/tmp
go get -v github.com/dotcloud/docker/docker
В склонированном репозитории докера нужно переключиться на последнюю версию (в моем случае это v0.7.5), в скаченных зависимостях нужно найти докер и тоже переключиться на последнюю версию.
Немного отвлечемся от компилирования докера, оставив на последок, и перейдем к работе с виртуальной машиной.
После трех простых шагов манипуляции с виртуальной машиной будут закончены.
Нам нужно добавить строчку с пробросом порта в блок Vagrant::Config.run нашего Vagrantfile.
config.vm.forward_port 4243, 4243
Теперь немного изменим файл /etc/init/docker.conf внутри виртуальной машины.
description "Docker daemon"
start on filesystem and started lxc-net
stop on runlevel [!2345]
respawn
script
/usr/bin/docker -d -H=tcp://0.0.0.0:4243/
end script
Перезагрузим виртуальную машину
vagrant reload
После всех наших действий нам осталось запустить компиляцию докера. Перейдем в наш склонированный репозиторий в папку docker и запустим компиляцию
go build docker.go
Наконец-то можете проверить работу докера
./docker -H tcp://127.0.0.1:4243/ version
24 Sep 2013
Совсем скоро Yet another Conference 2013 и я вроде как определился с планом посещения докладов.
Время |
Название |
Спикер |
11:30 - 12:30 |
Рекомендации по проектированию API |
Марина Степанова, Яндекс |
13:00 - 13:45 |
Добро пожаловать в SoundCloud! |
Александр Ковалев, SoundСloud |
13:45 - 14:30 |
Вклад Adobe в Web |
Дмитрий Барановский, Adobe |
15:00 - 15:45 |
API Design at GitHub |
Jason Rudolph, GitHub |
16:00 - 16:30 |
Кофе-брейк |
|
16:30 - 17:10 |
Architecting and testing large iOS apps: lessons from Facebook |
Adam Ernst, Facebook |
17:10 - 17:50 |
The evolution of mobile apps |
Alan Cannistraro, Facebook |
17:50 - 18:35 |
API для людей: как создать API, которым по-настоящему пользуются |
Евгений Чеботарев, 500px |
18:45 - 19:30 |
How to Destroy The Web |
Bruce Lawson, Opera Software |
18 Sep 2013
Проходя курс Connected to the Backbone я использовал Django REST framework для построения простого апи, которое затем использовал в backbone приложении.
В backbone приложение мы используем простую модель для примера, а также добавим коллекцию для большей наглядности.
App.Models.Task = Backbone.Model.extend({
defaults: {
title: '',
is_completed: false
},
urlRoot: '/tasks/'
});
App.Collections.Tasks = Backbone.Collection.extend({
model: App.Models.Task,
url: 'tasks/'
});
Модель в django приложении будет подоба нашей модели в backbone приложении.
class Task(models.Model):
title = models.CharField('Title', max_length=1000)
is_completed = models.BooleanField('Is completed', default=False)
Теперь нам нужно создать сериализатор для нашей модели задач и отображение для него.
class Task(models.Model):
title = models.CharField('Title', max_length=1000)
is_completed = models.BooleanField('Is completed', default=False)
class TaskViewSet(viewsets.ModelViewSet):
model = Task
serializer_class = TaskSerializer
Ну а затем самое главное, а именно урлы для работы с данными.
router = routers.DefaultRouter()
router.register(r'tasks', views.TaskViewSet)
urlpatterns = patterns('',
url(r'^$', 'app.views.home', name='Home'),
url(r'', include(router.urls)),
)
Далее добавим в базу несколько записей с которыми дальше будем работать.
[
{'title': 'Begin write this posts', 'is_completed': 'true'},
{'title': 'Go to the shops', 'is_completed': 'false'},
{'title': 'Buy a new MacBook Pro', 'is_completed': 'false'}
]
Теперь можно проверить нашу модель и коллекцию в backbone приложении.
> var task = new App.Models.Task({id: 2});
> task.toJSON();
Object {id: 2, title: "", is_completed: false}
> task.fetch();
> task.toJSON();
Object {id: 2, title: "Go to the shops", is_completed: false}
> collections = new App.Collections.Tasks();
> collections.fetch();
> collections.toJSON();
[Object, Object, Object]
Исходный код вы можете найти на гитхабе.