среда, 29 марта 2017 г.

Из-за тарифов "Платона" растут цены на продукты

МОСКВА, 27 мар - ПРАЙМ. В России начались акции протеста дальнобойщиков против системы сбора платы за проезд по федеральным трассам "Платон". Объединение перевозчиков России (ОПР) называет эти акции "Всероссийской стачкой". На сайте ОПР говорится, что в акциях принимают участие автоперевозчики многих региональных союзов и ассоциаций, Межрегиональный Профсоюз Водителей Профессионалов ("МПВП") и само Объединение Перевозчиков России, которое возникло на основе протеста водителей-дальнобойщиков против внедрения платежной системы "Платон" в 2015 году.

Протестанты требуют полностью отменить систему взимания платы "Платон" или реорганизовать ее под транзитный транспорт с передачей государству. Помимо этого выдвигаются требования по "отмене транспортного налога" - как указывают перевозчики, для этого есть акциз, а также требования по предоставлению перевозчикам обоснования расчётов размера акциза на топливо. По словам секретаря ОПР Санкт-Петербурга Сергея Владимирова, лидер ОПР Андрей Бажутин был задержан якобы за езду без прав. "Сейчас идет суд, ему грозит до 15 суток за якобы езду без прав. Права у него были. Сейчас подана заявка на апелляцию", - сказал он.

Владимиров добавил, что сейчас активно протестующих перевозчиков только в Санкт-Петербурге насчитывается порядка 80 человек, которые выстроили колонну из фур на одной из стоянок на окраине города в рамках протеста.

"ПЛАТОН" ДАВИТ НА ЦЕНЫ

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

"В каждом товаре несколько логистических цепочек. Спросите молочников, насколько у них подорожала продукция из-за системы "Платон". Они сейчас вынуждены останавливать свои производства, поскольку молоко ограничено в поднятии цены, а они не могут держать такие цены. Я, например, знаю, что в одной упаковке молока пять логистических цепочек. И таких производителей очень много, у которых по несколько логистических цепочек находится в продукции", - сказал он.

В Национальном союзе производителей молока (Союзмолоко) отметили, что растущие административные барьеры оказывают давление на цены готовой продукции и приводят к увеличению издержек молочных заводов. "Ряд производителей оценивает рост цен из-за введения системы "Платон" в 1,5-2%", - пояснили "Прайм" в Союзмолоко.

Помимо дополнительной финансовой нагрузки на бизнес, постоянные изменения правил игры оказывает влияние и на дестабилизацию ситуации с прогнозируемыми условиями для инвесторов, добавили в Союзе, пояснив, что неопределенность негативно влияет не только на продуктовый рынок, но и на развитие рынка логистических услуг, так как крупные перевозчики вынуждены отменять свои инвестиционные планы из-за незапланированных повышений тарифов. "Мы считаем, что любые изменения должны иметь переходный период как минимум на 8-12 месяцев", - резюмировали в Союзмолоко.

Вместе с тем, Владимиров отметил, что перевозчики в принципе не принимают систему "Платон". Он привел в пример Германию, где три года назад была принята аналогичная система.

"Будущее плачевно: за 2,5 года система полностью порушила рынок грузоперевозок. Сейчас там работают три крупных монополиста, частных перевозчиков почти нет, все водители ушли в крупные компании работать, где только первые полгода им платили нормальную зарплату", - сказал он, добавив, что на ремонт дорог государство должно направлять сборы с ранее введенного транспортного налога, а также с акцизов на топливо.
Автомашина контроля оплаты проезда пользователей системы "Платон"
"Платону" продлят льготный период

Ранее на прошлой неделе, 23 марта, премьер-министр РФ Дмитрий Медведев объявил, что льготный период для пользователей системы взимания платы за проезд большегрузов "Платон" будет продлен. На следующий день вышло постановление правительство, в котором говорилось, что тариф системы "Платон" с 15 апреля составит 1,91 рубля вместо 3,06 рублей за километр пути.

Как отмечал Медведев, текущий тариф проиндексирован лишь на 25%. По словам Медведева, такое решение поможет всем грузоперевозчикам лучше приспособиться и еще раз верифицировать работу самой системы, увидев ее сильные и слабые стороны. Вице-премьер Аркадий Дворкович отметил, что отказ от двукратного повышения платы в системе "Платон" связано с "необходимостью устранить недостатки, которые до сих пор существуют в системе".

четверг, 19 января 2017 г.

payments.google.com/merchant and paid date

In merchant system

понедельник, 21 ноября 2016 г.

latex math to png

import getopt
import os
import subprocess
import sys
import tempfile


def __build_preamble():
    preamble = '\documentclass[a4paper, 12pt]{article}\n'
    preamble += \
"""
\usepackage[unicode]{hyperref}
\usepackage{mathtext}
\usepackage[T1, T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english, russian]{babel}
\\vskip 0.5 cm
\pagestyle{empty}
"""
    preamble += "\\begin{document}\n"
    return preamble

def math2png(eqs, outdir, prefix = '', size = 1):
    # Set the working directory
    workdir = tempfile.gettempdir()
    # Get a temporary file
    fd, texfile = tempfile.mkstemp('.tex', 'eq', workdir, True)
    # Create the TeX document
    with os.fdopen(fd, 'w+') as f:
        f.write(__build_preamble())
        for eq in eqs:
            f.write("$%s$\n" % eq.strip())
        f.write('\end{document}')

    f.close()

    # Generate the DVI file
    latexcmd = 'latex -halt-on-error -output-directory %s %s' % (workdir, texfile)
    _run(latexcmd.split())
    # Convert the DVI file to PNG's
    dvifile = texfile.replace('.tex', '.dvi')
    outprefix = os.path.join(outdir, prefix)
    dvicmd = "dvipng -T tight -x %i -z 9 -bg Transparent "\
            "-o %s%%d.png %s" % (size * 1000, outprefix, dvifile)
    _run(dvicmd.split())

def _run(cmd):
    env = os.environ.copy()
    env.update(dict(
        LANG='ru_RU.UTF-8',
        LC_CTYPE='ru_RU.UTF-8',
        HOME='/root',
    ))
    subprocess.Popen(
        cmd,
        env=env,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
    ).communicate()

hideme proxy python

#encoding:utf-8
import httplib
import mechanize
import random
import time
import urllib
import urllib2


def initial_hideme():
    url = 'http://hideme.ru/login'
    params = urllib.urlencode({'c': '193477955'})
    urllib.urlopen(url, params)

class IpProxyDNotExist(Exception):

    pass


def get_good_proxy():

    goods = []

    test_url = 'http://example.com'
    count = 4

    def check(ip):
        br = mechanize.Browser()
        br.set_proxies({'http': ip})
        br.set_handle_robots(False)
        try:
            br.open(test_url, timeout=2)
        except (urllib2.URLError, httplib.BadStatusLine):
            pass
        else:
            goods.append(ip)

    proxy_list = get_proxy_list()
    random.shuffle(proxy_list)
    proxy_list = proxy_list[:count]
    for num, ip in enumerate(proxy_list):
        if goods:
            continue
        check(ip)

    try:
        ret = goods[0]
    except IndexError:
        raise IpProxyDNotExist

    return ret


def get_proxy_list():
    response = urllib2.urlopen('http://hideme.ru/api/proxylist.php?anon=4&out=plain')
    response_text = response.read().strip()
    ret = response_text.split()
    return ret

Код сайта kontrolnaya-rabota.ru

equations/detailed.py:
# -*- coding:  utf-8 -*-
from hideme_proxy import get_good_proxy
from mechanize._response import response_seek_wrapper
from wolfram.utils import get_appid, get_user_agent
import mechanize
import time
import urllib
import random
import re
import xml.etree.ElementTree as ET


def get_inequal_detailed(list_data):
    expressions = []
    for data in list_data:
        solve1 = data['solve1']
        solve2 = data['solve2']
        oper = data['oper']
        expression = '%s%s%s' % (solve1, oper, solve2)
        expressions.append(expression)
    text = ' and '.join(expressions)
    expression_quote = urllib.quote(text)
    appid = get_appid()
    url_pattern = 'http://api.wolframalpha.com/v2/query?input=Solve+{0}&appid={1}&format=plaintext'
    url = url_pattern.format(expression_quote, appid)
    br = mechanize.Browser()
    br.set_handle_robots(False)
    br.set_handle_equiv(False)
    ip = get_good_proxy()
    br.set_proxies({'http': ip})
    ua = get_user_agent()
    br.addheaders = [('User-agent', ua)]
    br.open(url)
    response = br.response()
    response_text = response.read()
    root = ET.fromstring(response_text)
    if root.get('success') == 'true':
        elems = root.findall("./pod[@id='Result']/subpod/plaintext")
        ret = [el.text for el in elems]
        return ret
    raise NotImplementedError(response_text)


def get_equal_detailed(data):
    solve1 = data['solve1']
    solve2 = data['solve2']
    expression = '%s=%s' % (solve1, solve2)
    expression_quote = urllib.quote(expression)
    appid = get_appid()
    url_pattern = 'http://api.wolframalpha.com/v2/query?input=Solve+{0}&appid={1}&format=plaintext&podstate=Result__Step-by-step+solution'
    url = url_pattern.format(expression_quote, appid)
    ip = get_good_proxy()
    br = mechanize.Browser()
    br.set_proxies({'http': ip})
    ua = get_user_agent()
    br.addheaders = [('User-agent', ua)]
    br.set_handle_robots(False)
    br.set_handle_equiv(False)
    br.open(url)
    response = br.response()
    response_text = response.read()
    root = ET.fromstring(response_text)
    if root.get('success') == 'true':
        text = root.find("./pod//subpod[@title='Possible intermediate steps']/plaintext").text
        return text
    raise NotImplementedError(response_text)


def test_appid(appid):
    url = 'http://api.wolframalpha.com/v2/query?input=Solve+x^2-1&appid={0}&format=plaintext&podstate=Result__Step-by-step+solution'.format(appid)
    ip = get_good_proxy()
    br = mechanize.Browser()
    br.set_proxies({'http': ip})
    ua = get_user_agent()
    br.addheaders = [('User-agent', ua)]
    br.set_handle_robots(False)
    br.set_handle_equiv(False)
    br.open(url)
    response = br.response()
    response_text = response.read()
    root = ET.fromstring(response_text)
    if root.get('success') == 'true':
        return 'OK'
    return response_text
buy/views.py:
# encoding:utf-8
from django.conf import settings
from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse
from django.shortcuts import redirect, render
from django.utils.translation import ugettext as _
from django.views.decorators.cache import cache_page
from latexmath2png import math2png
from s.buy.forms import FreeForm, FreeFormWithoutCaptha
from s.equal_one.detailed import get_equal_detailed
from settings import at_project_root
from wolfram.base import get_solution_class
import datetime
import hashlib
import re
import time


def free_old(request):
    return redirect('/s/', permanent=True)


def free(request):
    form = FreeForm(request.POST or None)
    redirect_to = None
    if form.is_valid():
        cleaned_data = form.cleaned_data
        key = generate_key()
        base_url = reverse('buy-complete', kwargs={'key': key})
        query_string = form.get_request_string(cleaned_data)
        redirect_to = '%s?%s' % (base_url, query_string)
    context = {'free_form': form, 'redirect_to': redirect_to}
    template_name = 's/buy/free.html'
    return render(request, template_name, context)


@cache_page(60 * 60)
def buy_complete(request, key):

    user_agent = request.META.get('HTTP_USER_AGENT')

    if 'Mediapartners-Google' in user_agent or \
        'YandexDirect' in user_agent:
        return free(request)

    if key != generate_key():
        return redirect('/s/')
    form = FreeFormWithoutCaptha(request.GET or None)
    if not form.is_valid():
        return redirect(reverse('s-main'))
    module = form.cleaned_data['module']
    data = form.cleaned_data['data']
    if module in ['diff', 'limit']:
        SolutionClass = get_solution_class(module)
        text = SolutionClass(data, with_proxy=False).get_text()
    elif module in ('indefinite', 'definite'):
        SolutionClass = get_solution_class('indefinite')
        text = SolutionClass(data).get_text()
    elif module == 'equal':
        text = get_equal_detailed(data)
    for trans in BLOCK_I18N:
        text = text.replace(trans, _(trans))
    text = text.replace('\\n', '\n')
    text = text.replace('\\/', '/')
    if 'wolfram' in text.lower():
        raise ValidationError(u'wolfram text on solution')
    tex_body = text_to_tex(text)
    prefix = hashlib.md5(tex_body.encode('utf-8')).hexdigest()
    try:
        math2png(
            [tex_body.encode('utf-8')],
            'media/buy',
            prefix=prefix,
        )
    except:
        with_simple_text = True
    else:
        with_simple_text = False

    time.sleep(3)
    template_name = 's/buy/complete.html'
    context = {
        'tex_body': tex_body,
        'prefix': prefix,
        'with_simple_text': with_simple_text,
        'text': text,
    }
    return render(request, template_name, context)


def i18n_blocks():
    fn = at_project_root('kr/wolfram.trans')
    ret = open(fn).read().strip().decode('utf-8').split('\n')
    ret = sorted(ret, key=lambda s: len(s), reverse=True)
    return ret

BLOCK_I18N = i18n_blocks()


def generate_key():
    today_text = datetime.date.today().strftime('%F')
    open_key = '%s-%s' % (settings.SECRET_KEY, today_text)
    key = hashlib.md5(open_key).hexdigest()
    return key


def text_to_tex(text):
    fp = '(?:cos|sin|tan|atan|csc|cot|sec|log|ln|sqrt|sinh|cosh|arccos|arcsin|arccosh|arcsinh|arctg|arcctg|atan)'

    ac = '[_a-zA-Z@^\d.]'

    ac_p = '[_a-zA-Z@^{}\d.]'

    text = text.replace('d/dx', '@@@')
    text = text.replace('tan^(-1)', 'arctg')
    text = text.replace('cos^(-1)', 'arccos')
    text = text.replace('sin^(-1)', 'arcsin')
    text = text.replace('cot^(-1)', 'arcctg')
    text = re.sub(r'\b(sec)\b', '1/sin', text)
    text = re.sub(r'd(sec)\b', 'd 1/sin', text)
    text = re.sub(r'\b(csc)\b', '1/cos', text)
    text = re.sub(r'd(csc)\b', 'd 1/cos', text)
    text = re.sub(r'\b(log)\b', 'ln', text)
    text = re.sub(r'd(log)\b', 'd log', text)
    text = re.sub(r'\b(cot)\b', 'ctg', text)
    text = re.sub(r'd(cot)\b', 'd ctg', text)
    text = re.sub(r'\b(tan)\b', 'tg', text)
    text = re.sub(r'd(tan)\b', 'd tg', text)

    text = re.sub(r'lim_\(([^\)]+)\)', r'lim_{\1}', text)

    text = re.sub(r'(%(fp)s)\^%(b)s\(' % {
        'fp': fp, 'b': get_bucket_pattern_by_level(4)[2:-2]
    }, r'\1^{\2}(', text)

    A = []
    j = 0
    for i in range(5):
        list_expr = set(re.findall(r'(%(fp)s*\([^\(\)]+\))' % {'fp': fp}, text))
        list_expr = sorted(list_expr, key=lambda expr: len(expr))
        list_expr.reverse()
        for bracket in list_expr:
            text = text.replace(bracket, '__III%s__' % j)
            A.append(bracket)
            j += 1

    for j, bucket in enumerate(A):
        in_bucket = bucket
        if bucket.startswith('('):
            in_bucket = in_bucket[1:-1]
        in_bucket = re.sub(r'(%(fp)s*%(ac_p)s+)/(%(fp)s*%(ac_p)s+)' % {
            'fp': fp, 'ac_p': ac_p
        }, r'\\frac{\1}{\2}', in_bucket)

        in_bucket = re.sub(r'(%(ac)s+)\^(%(ac)s+)' % {
            'ac': ac
        }, r'\1^{\2}', in_bucket)
        if bucket.startswith('('):
            A[j] = '(%s)' % in_bucket
        else:
            A[j] = in_bucket

    text = re.sub(r'(%(fp)s*%(ac_p)s+)/(%(fp)s*%(ac_p)s+)' % {
        'fp': fp, 'ac_p': ac_p
    }, r'\\frac{\1}{\2}', text)
    text = re.sub(r'(%(ac)s+)\^(%(ac)s+)' % {'ac': ac}, r'\1^{\2}', text)

    for i in range(5):
        for j, backet in enumerate(A):
            text = text.replace('__III%s__' % j, backet)

    text = text.replace('= | ', '\\\\\\\\ = ').replace(' | ', '\\\\\\\\').replace(' ', '\;').replace('\n', '\\\\\\\\')
    text = text.replace("\\'", "'")

    text = re.sub(r'{\(([^{}]+)\)}', r'{\1}', text)

    text = text.replace('@@@', '\\frac{d}{dx}')
    text = text.replace('integral', '\\int')
    text = text.replace('·', u'*')
    text = text.replace('>infinity', u'>oo')
    text = text.replace('>-infinity', u'>-oo')
    return text


def get_bucket_pattern_by_level(level):
    list_res = []
    b0 = '[^\(\)]'
    c = '%s+' % b0
    list_res.append(c)
    for i in range(level):
        b = '\((%s)\)' % '|'.join(list_res)
        c = '(?:(?:\((?:%s)\))|%s)+' % (b[3:-3], b0)
        list_res.append(c)
    return b
buy/urls.py:
from django.conf.urls.defaults import patterns, url

urlpatterns = patterns('s.buy.views',
    url(r'^free/$',  'free_old' , name='free-old'),
    url(r'^besplatno/$',  'free' , name='free'),
    url(r'^complete/(?P[0-9a-f]+)/$',  'buy_complete', name='buy-complete'),
)
buy/forms.py
# -*- coding: utf8 -*-
from s.models import Ads, ExcludeUrl
from captcha.fields import CaptchaField, CaptchaTextInput
from django import forms
import json
import urllib


BUY_VERSION = 2


class FreeFormWithoutCaptha(forms.Form):

    data = forms.CharField(widget=forms.HiddenInput)
    module = forms.CharField(widget=forms.HiddenInput)

    def clean_data(self):
        data = self.cleaned_data['data']
        try:
            data = json.loads(data)
        except:
            raise forms.ValidationError('No load json')
        return data

    def get_request_string(self, cleaned_data):
        data = cleaned_data['data']
        data = json.dumps(data)
        data = urllib.quote(data)
        module = cleaned_data['module']
        req_string = 'module=%(module)s&data=%(data)s' % {
            'module': module, 'data': data,
        }
        return req_string


if BUY_VERSION == 1:


    class FreeForm(FreeFormWithoutCaptha):

        url = forms.URLField(
            help_text=(
                u'URL страницы, где содержится активная ссылка на мой сайт'
            ), label=u'Url страницы',
        )
        captcha = CaptchaField()

        def __init__(self, *args, **kwargs):
            super(FreeForm, self).__init__(*args, **kwargs)
            self.fields['captcha'].widget.attrs = {'autocomplete': "off"}

        def clean_url(self):
            url = self.cleaned_data['url'].lower()
            exclude_urls = ExcludeUrl.objects.all().values_list('url', flat=True)
            for exclude_url in exclude_urls:
                if url.startswith('http://' + exclude_url) or \
                    url.startswith('http://www.' + exclude_url):
                    raise forms.ValidationError(
                        (u'Котэ следит за тобой. Пожалуйста, добавьте ссылку себе на '
                         u'сайт, форум или блог!')
                    )
            return url

        def get_ads(self):
            ads = Ads.objects.random()
            return ads

elif BUY_VERSION == 2:

    class FreeForm(FreeFormWithoutCaptha):

        captcha = CaptchaField()

        def __init__(self, *args, **kwargs):
            super(FreeForm, self).__init__(*args, **kwargs)
            self.fields['captcha'].widget.attrs = {'autocomplete': "off"}

        def get_ads(self):
            ads = Ads.objects.random()
            return ads
wolfram/utils.py
# coding:utf-8
from settings import at_project_root
import random


def get_appid():
    filename = at_project_root('kr/wolfram.keys')
    appid_list = open(filename).read().strip().split()
    random.shuffle(appid_list)
    appid = appid_list[0]
    return appid


def get_user_agent():
    filename = at_project_root('kr/wolfram.ua')
    ua_list = open(filename).read().strip().split('\n')
    assert len(ua_list) > 1
    random.shuffle(ua_list)
    ua = ua_list[0]
    return ua
wolfram/base.py
#encoding:utf-8
from hideme_proxy import get_good_proxy, IpProxyDNotExist
from wolfram.utils import get_user_agent, get_appid
import httplib
import mechanize
import urllib
import urllib2
import xml.etree.ElementTree as ET
import zlib


_open_url_error_classes = (
    urllib2.HTTPError,
    urllib2.URLError,
    IOError,
    httplib.BadStatusLine,
    httplib.IncompleteRead,
    zlib.error,  # for gzip compressed responses
    IpProxyDNotExist,
)


class InternetError(Exception):

    pass


def get_solution_class(class_name):
    return SOLUTION_CLASSES[class_name]


SOLUTION_CLASSES = {}
def register_solution_class(class_name):
    def wrapper(cls):
        SOLUTION_CLASSES[class_name] = cls
        return cls
    return wrapper


class _InternetObject(object):

    def _initial_browser(self):
        br = mechanize.Browser()
        ua = get_user_agent()
        br.addheaders = [('User-agent', ua)]
        br.set_handle_robots(False)
        br.set_handle_equiv(False)
        return br

    def _get_rawurlencode(self, params):
        items = []
        for key, val in params.items():
            new_val = urllib.quote(val)
            item = '{0}={1}'.format(key, new_val)
            items.append(item)
        ret = '&'.join(items)
        return ret

    def get_params(self):
        raise NotImplementedError


class DetailedSolution(_InternetObject):

    base_url = 'http://api.wolframalpha.com/v2/query'

    def __init__(self, data, with_proxy=True):
        self.data = data
        self.with_proxy = with_proxy
        self.br = self._initial_browser()
        self.appid = get_appid()

    def __str__(self):
        super_str = super(DetailedSolution, self).__str__()
        ret = '{0} with appid={1}'.format(super_str, self.appid)
        return ret

    def get_text(self):
        response_text = self.get_response_text()
        root = ET.fromstring(response_text)
        if root.get('success') == 'true':
            xpath = "./pod//subpod[@title='Possible intermediate steps']/plaintext"
            text = root.find(xpath).text
            return text
        raise NotImplementedError(response_text)

    def get_response_text(self):
        if self.with_proxy:
            try:
                ip = get_good_proxy()
            except _open_url_error_classes, exc:
                raise InternetError(exc)
            self.br.set_proxies({'http': ip})
        params = self.get_params()
        params.update({
            'format': 'plaintext',
            'appid': self.appid,
        })
        url = self.base_url + '?' + \
            self._get_rawurlencode(params)
        try:
            self.br.open(url)
            response = self.br.response()
            response_text = response.read()
        except _open_url_error_classes, exc:
            raise InternetError(exc)
        return response_text


@register_solution_class('limit')
class LimitSolution(DetailedSolution):

    def get_params(self):
        data = self.data
        x0 = data['x0']
        function = data['function']
        expression = 'lim %s x->%s' % (function, x0)
        ret = {
            'input': expression,
            'podstate': 'Limit__Step-by-step solution',
        }
        return ret


@register_solution_class('indefinite')
class IndefiniteSolution(DetailedSolution):

    def get_params(self):
        data = self.data
        function = data['function']
        expression = 'integrate %s' % function
        ret = {
            'input': expression,
            'podstate': 'IndefiniteIntegral__Step-by-step solution',
        }
        return ret


@register_solution_class('diff')
class DiffSolution(DetailedSolution):

    def get_params(self):
        data = self.data
        function = data['function']
        expression = 'derivative of %s' % function
        ret = {
            'input': expression,
            'podstate': 'Input__Step-by-step solution',
        }
        return ret


@register_solution_class('series-number')
class SeriesNumberSolution(DetailedSolution):

    def get_result(self):
        ret = {}
        response_text = self.get_response_text()
        root = ET.fromstring(response_text)
        if root.get('success') == 'true':
            nods = root.findall('./pod[@id="ConvergenceTests"]/subpod/plaintext')
            tests = map(lambda n: n.text, nods)
            ret['tests'] = tests
            return ret
        raise NotImplementedError(response_text)

    def get_params(self):
        data = self.data
        function = data['function']
        n = data['n']
        n0 = data['n0']
        nm = data['nm']
        infinity = data['infinity']
        if infinity:
            nm = 'oo'
        expression = 'Sum[{0}, {1}, {2}, {3}]'.format(function, n, n0, nm)
        ret = {
            'input': expression,
        }
        return ret


@register_solution_class('power-series')
class PowerSeriesSolution(DetailedSolution):

    def get_result(self):
        ret = {}
        response_text = self.get_response_text()
        root = ET.fromstring(response_text)
        if root.get('success') == 'true':
            nods = root.findall('./pod[@id="ConvergenceTests"]/subpod/plaintext')
            tests = map(lambda n: n.text, nods)
            ret['tests'] = tests
            return ret
        raise NotImplementedError(response_text)

    def get_params(self):
        expression = 'Sum of {function}'.format(**self.data)
        ret = {
            'input': expression,
        }
        return ret


@register_solution_class('system-diff')
class SystemDiffSolution(DetailedSolution):

    def get_result(self):
        ret = {}
        response_text = self.get_response_text()
        root = ET.fromstring(response_text)
        if root.get('success') == 'true':
            nods = root.findall('./pod[@id="DifferentialEquationSolution"]/subpod/plaintext')
            solves = map(lambda n: n.text, nods)
            solves = map(lambda s: s.replace('_', ''), solves)
            ret['solves'] = solves
            return ret
        raise NotImplementedError(response_text)

    def get_params(self):
        expression = ' and '.join('='.join(i) for i in self.data['equations'])
        ret = {
            'input': expression,
        }
        return ret
widgetes/jscalendar.py
from django import forms
from django.template.loader import render_to_string

class JSCalendarWidget(forms.DateTimeInput):
    class Media:
        css = {
            'all': ('javascript/jscalendar-1.0/calendar-system.css',)
        }
        js = ('javascript/jscalendar-1.0/calendar.js',
              'javascript/jscalendar-1.0/calendar-setup.js',
              'javascript/jscalendar-1.0/lang/calendar-ru-UTF.js',)

    def render(self, name, value, lang='ru', attrs=None):
        value = value or ''
        return render_to_string("widgets/jscalendar.html", locals())
buy/complete.html
{% extends "s/sbase.html" %}
{% block title %}Подробное решение бесплатно!{% endblock %}
{% block head %}
    
{% endblock %}
{% block crumbs %}Больше решений!{% endblock %}
{% block base_table %}
    

Подробное решение: ответ

{% include "partner_block.html" %} {% if with_simple_text %}
{{ text }}
{% else %} {{ text }} {% endif %} {% include "other-social.html" %} {% include "partner_block.html" %}
{% endblock %}
buy/definite.tex
\documentclass[a4paper, 12pt]{article}
\usepackage[unicode]{hyperref}
\usepackage{mathtext}
\usepackage[T1, T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english, russian]{babel}
\vskip 0.5 cm

\begin{document}

${{ tex_body }}$

\end{document}
buy/diff.tex
\documentclass[a4paper, 12pt]{article}
\usepackage[unicode]{hyperref}
\usepackage{mathtext}
\usepackage[T1, T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english, russian]{babel}
\vskip 0.5 cm

\begin{document}

${{ tex_body }}$

\end{document}
buy/free_form.html

Для того, чтобы получить подробное решение бесплатно, пожалуйста, проделайте следующие действия:

    {% if not request.COOKIES.ilikeit %}
  1. Скопируйте ссылку и
    разместите вконтакте или др. сайте:
  2. {% endif %}
  3. Введите цифры на рисунке
{% csrf_token %} {{ free_form }}
buy/free.html
{% extends "s/sbase.html" %}
{% load i18n %}
{% block head %}
 {% if redirect_to %}
 
 
 {% endif %}
{% endblock %}
{% block title %}Подробное решение бесплатно!{% endblock %}

{% block content %}
  

Подробное решение

{% include "partner_block.html" %} {% if redirect_to %}

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

Если ссылка на наш сайт будет найдена, то Вам будет предложено решение.
Если программа не найдет ссылку вида http://kontrolnaya-rabota.ru, то Вы не получите файла, но можно попробовать разместить ссылку на сайт http://kontrolnaya-rabota.ru/s/ снова.
Назад.
{% else %}

Хотите получить подробное решение с описанием действий?

{% include "s/buy/free_form.html" %} {% endif %} {% include "partner_block.html" %} {% endblock %}
buy/indefinite.tex
\documentclass[a4paper, 12pt]{article}
\usepackage[unicode]{hyperref}
\usepackage{mathtext}
\usepackage[T1, T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english, russian]{babel}
\vskip 0.5 cm

\begin{document}

${{ tex_body }}$

\end{document}
buy/limit.html
\documentclass[a4paper, 12pt]{article}
\usepackage[unicode]{hyperref}
\usepackage{mathtext}
\usepackage[T1, T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english, russian]{babel}
\vskip 0.5 cm

\begin{document}

${{ tex_body|safe }}$

\end{document}

среда, 9 ноября 2016 г.

python regex lazy re.compile

import re


class _Lazy(object):

    __slots__ = ['pattern', 'kwargs', 'compiled']

    def __init__(self, pattern, **kwargs):
        self.pattern = pattern
        self.kwargs = kwargs
        self.compiled = None

    def __getattr__(self, name):
        if self.compiled is None:
            self.compiled = re.compile(self.pattern, **self.kwargs)
        return self.compiled.__getattribute__(name)


def lazy_compile(pattern, **kwargs):
    return _Lazy(pattern, **kwargs)
Use:
In [2]:

In [2]: lazy_compile(r'[a-z]')
Out[2]: <__main__._Lazy at 0x11095c088>

In [3]: c = lazy_compile(r'[a-z]')

In [4]: c.findall('sdsd sdsds aq, $A fddf')
Out[4]: ['s', 'd', 's', 'd', 's', 'd', 's', 'd', 's', 'a', 'q', 'f', 'd', 'd', 'f']