Sunday, 26 February 2017

Quick Tip: find all Django tags in Sublime Text

Here's the quick tip:
1. Open find panel at the bottom: Ctrl (or Cmd on MacOS) + F
2. Toggle Regular Expression button. It has .* on it.
3. And here is the trickiest part: {% block \w+ %}(?s).*?{% endblock \w+ %}
It's the regex for finding all django tags

Monday, 6 April 2015

Mithril.js cram.js curl.js

При использовании библиотеки mithril если использовать только curl, т.е. не собирать js файлы в bundle, то все работает без ошибок. Но если собирать с помощью cram, то mithril.js попадет в bundle, и curl его еще подгрузит дополнительно, т.е. почему-то он не знает, что файл уже в сборке. Это приводит к ошибке "Multiple anonymous defines encountered"
Это лечится следующим конфигом в настройках curl.path:

"mithril": {
            location: "mithril.min.js",
            config: {
                loader: "curl/loader/legacy",
                exports: "m"
            }
        }
 Обратите внимание, что используется legacy loader, несмотря на то, что в mithril.js задан amd конфиг:
if (typeof module != "undefined" && module !== null && module.exports) module.exports = m; else if (typeof define === "function" && define.amd) define(function() {return m});

Wednesday, 10 September 2014

buildout gunicorn gevent django 1.7

After upgrading from django 1.5.5 to django 1.7 i couldn't make gunicorn work. It kept telling me (when running bin/django run_gunicorn -c config/gunicorn)
HaltServer Worker failed to boot: 3
and
bin/django runserver
works fine.

After some time I've got working solution for my case. I took code http://gunicorn-docs.readthedocs.org/en/latest/custom.html

As you can see at L06 I have parse func. I am using buildout, which creates django and django.wsgi files in bin/ directory. And in these files sys.path is changed to make your app be able to locate eggs, which are located in eggs/ dir. (e.g. eggs/Django-1.7-py2.7.egg). So gevent is also located there (eggs/gevent-1.0.1-py2.7-linux-x86_64.egg) in my case. So I have to change sys.path, then I do monkey patching with gevent and then with gevent_psycopg2 since I'm using postgresql.


#!/usr/bin/python

from __future__ import unicode_literals
import sys

def parse():
    s = False
    result = []
    with open("bin/django.wsgi", "r") as f:
        for line in f.readlines():
            if line.startswith("sys.path[0:0]"):
                s = True
                continue
            if "]" in line:
                break
            if s:
                result.append(line.strip()[1:-2])
    return result

sys.path[0:0] = parse()

import gevent.monkey
gevent.monkey.patch_all()

import gevent_psycopg2
gevent_psycopg2.monkey_patch()


import multiprocessing

import gunicorn.app.base

from gunicorn.six import iteritems

def number_of_workers():
    return (multiprocessing.cpu_count() * 2) + 1


class StandaloneApplication(gunicorn.app.base.BaseApplication):

    def __init__(self, app, options=None):
        self.options = options or {}
        self.application = app
        super(StandaloneApplication, self).__init__()

    def load_config(self):
        config = dict([(key, value) for key, value in iteritems(self.options)
                       if key in self.cfg.settings and value is not None])
        for key, value in iteritems(config):
            self.cfg.set(key.lower(), value)

    def load(self):
        return self.application


if __name__ == '__main__':
    options = {
        'bind': '%s:%s' % ('0.0.0.0', '8000'),
        'workers': number_of_workers(),
        'worker_class': "gunicorn.workers.ggevent.GeventWorker",
        'debug': True
    }
    import djangorecipe.wsgi

    application = djangorecipe.wsgi.main('homecont.development', logfile='')
    StandaloneApplication(application, options).run()

Sunday, 13 April 2014

Как удалить сессии у пользователя

from django.contrib.sessions.models import Session
from django.contrib.auth.models import User


def close_session(login):
    user = User.objects.get(username=login)
    for session in Session.objects.all():
        uid = session.get_decoded().get('_auth_user_id')
        if uid == user.pk:
            session.delete()

Thursday, 3 April 2014

Старт django приложения с buildout и gevent

import os, sys, string

dirname = os.path.dirname(__file__)
filepath = os.path.join(dirname, "./bin/django")

filecontent = open(filepath, "r").readlines()
paths = []
for line in filecontent:
line = line.strip()
if line.startswith("'/"):
paths.append(line[1:-2])

sys.path[0:0] = paths

from gevent import monkey; monkey.patch_all()
from gevent.wsgi import WSGIServer

from django.core.management import setup_environ    
os.environ['DJANGO_SETTINGS_MODULE'] = 'homecont.development'
import homecont.settings
setup_environ(homecont.settings)

from django.core.handlers.wsgi import WSGIHandler as DjangoWSGIApp
application = DjangoWSGIApp()
server = WSGIServer(("127.0.0.1", 8000), application)
print "Starting server on http://127.0.0.1:8000"
server.serve_forever()

Tuesday, 28 June 2011

JavaME сдохла

Так можно сказать, если начать что-либо искать в сети по теме. 

На работе делаем приложение для мобильных устройств, в их числе и java ME. Была проблема с большой задержкой при Http запросах. Как и полагается система работает через Connector, т.е. соединение открывается методом Connector.open(url).

Потом из него открывается output или input stream.  После завершения работы потоки и соединение нужно обязательно закрывать, не то лимит будет исчерпан. На некоторых телефонах даже нормальное закрытие не помогает. Как я когда-то вычитал на форуме nokia нужно обнулить ссылки на потоки и соединение, затем вызвать Runtime.getRuntime().gc(). Затем Thread.sleep(50), т.е. включить сборку мусора и дать ему время (50 мс), чтобы он убрал за нами. И на большинстве нокий и самсунгов только после этого шаманства соединение возвращается в пул и приложение не будет зависать после 13 соединения (на всех телефонах, на которых была данная ошибка, объем пула составлял 13 соединений).

Со всей этой батвой приложение работает, но работает медленно. Данные скачиваются относительно быстро, а перед этим приложение долго простаивает, ожидая получить GPRS соединение.  Посовещавшись, решили попробовать сделать соединение через сокет. При старте приложения открывать сокет, гонять по нему данные к серверу и обратно, потом при завершении приложения закрываеть потоки и соединение. Пока вроде все получается, т.е. соединение открывается вызовом метода Connector.open("socket://127.0.0.1:9000); Открывается поток conn.openInputStream(). Открывается поток на запись conn.openOutputStream(); В него пишется запрос outputStream.write("GET / http/1.1\n\nHost:127.0.0.1"); Потом outputStream.flush(); Потом считываем с inputStream методом write. ... (Продолжение следует, наверное)

Первый подход к playframework.org

Удалось поработать с платформой play!. После питона с Django переход на Java оказался не таким ужасным благодаря возможностям play, а именно, компиляция кода на лету и возможность мгновенного наблюдения за результатом внесенных в код изменений и классный язык шаблонов. 

Проблему создал hibernate, в play 1.2 он представлен  версией 3.6, которая, как оказалось плохо работает с драйвером postgresql, если использовать иерархию классов на одной таблице. Короче, с play 1.2 не сраслось. Откатился на версию 1.0.3, в который включен hibernate версии 3.3.

Вторая проблема возникла, когда я к серверу попытался получить доступ по сокету. Он никак не хотел принимать мой запрос вида GET / http/1.1   Host: 127.0.0.1. Вопрос решился установкой модуля netty версии 1.0.6, который заменяет стандартный веб-сервер. Для этого в командной строке достаточно набрать play install netty-1.0.6  и запускать приложение с помощью команды play netty:run [название каталога с приложением внутри].