Pull to refresh
0
0
descentspb @descentspb

User

Send message
Не решал еще эту проблему. Пока монтирую руками, но это делать нужно редко, лишь один раз при рестарте boot2docker. Системные файлы у него не поменять, т.к. образ системы read-only.

Пока, к сожалению, мне видится что единственный способ это сделать — собирать образ boot2docker вручную с нужными изменениями. Надеюсь, есть что-то попроще и красивее.
Кстати, чтобы touch не создавал файлы, которые удаляются, нужно использовать touch -c
На всякий случай, если будут еще изменения в функции, вынес ее в gist, чтобы комментарии лишние вроде этого не плодить

gist.github.com/ikatson/7c6a7e84339305090457
Решил абсолютно ту же самую проблему чуть проще:

Локальный код монтируется через NFS в такую же папку внутри boot2docker, что и локально.

Например, путь к коду получается /Users/user/projects/someproject и на OS X, и внутри boot2docker.
Если у вас другие пути, то простым -v "$PWD":"$PWD" (описано ниже) будет не обойтись

Когда меняется файл локально, мы делаем «touch» того-же файла удаленно, чтобы ядро подхватило. inotify не видит «чужие» изменения в NFS, но видит те, которые сделала система локально. Никаких http клиентов и серверов, а также суррогатного файла не нужно при таком подходе.

function fswatch_propagate_pwd_changes_to_docker () {
    echo "Starting fswatch on $PWD"
    # tracking previous not to get into endless loop of changing the same file
    local previous=''
    fswatch -r "$PWD" | while read file; do
        if [[ previous != "$file" ]]; then
            docker run --rm -v "$PWD":"$PWD" busybox touch "$file"
        fi
        previous="$file"
    done
}



Если уж и идти путем хранимых процедур, json/http гораздо проще сделать на plpython/plperl. Вы смотрели в их сторону?
Последнюю задачу можно решить без использования collections.defaultdict, а также короче получается:
d = {}
for name in names:
    d.setdefault(len(name), []).append(name)
Пытался вспомнить, зачем так сделал, проверил и вспомнил:

когда ставишь text/plain, строки, которые длиннее экрана, переносятся в браузере на следующую строку, вместо включения горизонтального скролла, и вывод, скажем, «print_callees=1» превращается в малочитабельную кашу. Естественно, только при просмотре в браузере (может быть даже только в Chrome).

Может быть это как-то можно обойти, но когда я писал этот скрипт несколько лет назад, это было не важно.
UPD: Быстрое гугление говорит, что по-простому это не обойти.

Но, в любом случае, спасибо, как минимум, комментария в коде этот хак заслужил.
Давно использую простой middleware, который позволяет прогнать любой View через профайлер и вывести результат прямо в браузер.
gist.github.com/ikatson/7426817

Естественно, без статистики, но для разработки (да и, честно говорят, для продакшена тоже) очень удобно :)

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

Обычно бесплатной версии NewRelic + этого middleware + django-debug-toolbar хватает чтобы локализовать и нейтрализовать узкие места.
Pi тоже: betterexplained.com/articles/prehistoric-calculus-discovering-pi/

Да и вообще почитав этот сайт можно открыть глаза на некоторые вещи, которые воспринимались как данность.
Насчёт e, есть несколько классных статей на Better explained, вот эта например betterexplained.com/articles/understanding-exponents-why-does-00-1/
На этом сайте есть очень доходчивое и красивое объяснение betterexplained.com/articles/an-interactive-guide-to-the-fourier-transform/.

Попутно не менее доходчиво можно разобраться в комлексных числах. Вообще сайт достоин как минимум присутствия в закладках.
Сегодня столкнулся с той же ситуацией — решение (мне кажется, небезопасное) есть.

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

Позвонил в Яндекс, оказывается, после смены платежного пароля вы можете выполнить ровно одно действие БЕЗ потдверждения кода, пришедшего через SMS. Этим действием может стать, например, добавление нового номера телефона, или выбор этого номера, как основного.

То есть надо:
1. поменять платежный пароль.
2. привязать новый номер.
3. поменять платежный пароль.
4. выбрать новый номер как основной.

После этого можно будет пользоваться новым номером, и все это мы сделали, не имея доступа к старому телефону.
hstore удобно использовать, когда список свойств часто меняется, или отличается от объекта к объекту. Когда можно было бы использовать отдельную таблицу для хранения key-value пар, hstore часто оказывается удобнее и быстрее, и бесплатно дает возможность делать запросы, которые при отдельной таблице были бы сложнее.

Зачастую, если нужно указать какое-то дополнительное свойство или пару для какого-то объекта, делать для этого отдельную колонку в таблице неудобно. А создавать таблицу key-value еще более неудобно.

Для меня важный плюс — это делает проще код. Например, ипользуя django-hstore, им пользуешься как обычным словарем. В противном случае было бы намного больше строк, даже учитывая ORM.
Автор замечательной книги PostgreSQL 9.0 High Performance, который довольно активен в сообществе PostgreSQL, хоть и является приверженцом этой СУБД, честно пишет в этой книге, что на данный момент времени коммерческие базы больше подходят для data analytics, потому что в постгресе некоторых вещей, нужных для этого, просто нет. И известный бенчмарк TPC-H в postgres выполняется несоизмеримо медленнее чем в коммерческих субд.

Тем не менее, postgres прекрасно подходит для нужд большинства проектов.

Вы правы, войны на тему threadlocals идут, мне малопонятно только зачем. На мой взгляд, очень четкий коментарий по этому поводу дал Glenn Maynard на stackoverflow. По-моему ничего ужасного, главное использовать с умом threadlocals только там где это действительно имеет место.

Кстати, если загуглить django threadlocals, то найдется несколько готовых решений для django, реализующих упомянутый middleware.
Думаю, неплохим решением будет сделать middleware, которое добавляет в threadlocals объект request (как делается, например, в Pylons). Этот middleware можно будет использовать для разных хаков и потом. А с помощью него получить ответ на вопрос «кто юзер» можно будет прямо в методе save().

Не смотрел, как django использует super(), но скорее всего можно будет описать save() в CreatedByMixin и UpdatedByMixin, а потом достаточно будет просто отнаследоваться от этих миксинов. Что-то вроде:
class UpdatedByMixin(models.Model):
    def save(self, *args, **kwargs):
        from threadlocals import request
        self.updated_by = request.user
        return super(UpdatedByMixin, self).save(*args, **kwargs)

Так как вы программируете на Python, то советую прочитать увлекательную книгу Python Algorithms: Mastering Basic Algorithms in the Python Language, в ней эта же самая проблема рассматривается в составе divide-and-conquer алгоритмов, и итоговый код, насколько я помню, красивый и компактный.
Scrapy удобно соединяет все, что нужно для web-краулинга, последующего парсинга html и сохранения результатов. Советую взглянуть в его сторону, и не изобретать велосипедов.
Для частичного решения ваших проблем подойдет Celery. Это система асинхронного выполнения различных задач, в т.ч. периодических (как cron).
Она как раз использует RabbitMQ в качестве бэкенда и замечательно зарекомендовала себя при работе с python и django.

У нас система на Celery + RabbitMQ полностью заменила cron, добавила возможность
наблюдать за всеми, происходящими асинхронно, джобами, а также добавила много
интересного функционала в web-приложения, например, позволяя запускать задачи и не ждать
их выполнения во время генерации ответа на HTTP запрос, а запрашивать ответ позже,
через ajax.

Не так удобно будет ее использовать с PHP, как с Python (так как там есть встроенная
поддержка django и других фреймворков), но все же это вполне нормальный usecase.

В общем, я советую вам взглянуть в сторону Celery, хотя бы чтобы иметь представление о возможности. Будет больше информации для принятия решений.
Если я вас правильно понял, попробую помочь советом. Я в свое время делал так:
1. Все хранимые процедуры схожего функционала хранятся в отдельной схеме, например «user_func». Это позволяет нам дропнуть все функции за одну команду — DROP SCHEMA user_func CASCADE.
2. Эти хранимые процедуры описаны в отдельном файле .sql. Каждый файл начинается так:

DROP SCHEMA IF EXISTS user_func;
CREATE SCHEMA user_func;

SET search_path TO user_func,public;


3. Этот файл хранится в системе контроля версий. Все функции разом перезаливаются (или нет, в случае ошибки), так: psql FILENAME.sql -1

После этого вы спокойно редактируете файл с функциями, и все фукнции легко обновлять. В случае ошибок при обновлении версии просто ничего не произойдет.
Вдохновился обзором и купил девайс, выбирая между iPod touch и cowon S9. При покупке смущало только то, что нет Wi-Fi и поддержки h.264. Почитав форумы, понял, что h.264 де факто есть. Проверил — работает прекрасно!

Радости не было предела, учитывая отличный звук и отменный экран. На следующий день плеер сломался при заливке файлов. Как оказалось, я совсем не одинок — Google: cowon s9 no fonts, no resources.

Еще раздражала очень медленная скорость закачки — в среднем около 1 МБ/c. Может быть, причина обеих проблем — подключение к Linux.

Теперь думаю, менять на такой же, и ждать снова этой проблемы (уже юзая только Windows для подключния к компу), либо все-таки купить touch, в котором есть Wi-Fi и Safari, но более дорогой.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity