tag:blogger.com,1999:blog-75759777240599611532024-03-13T20:43:19.467+05:00Опыт работы с PythonО python и django на ubuntu.Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.comBlogger130125tag:blogger.com,1999:blog-7575977724059961153.post-10070856254606926732018-08-30T16:55:00.002+05:002018-08-30T16:55:28.238+05:00bash retry cmd func<b>retry.sh:</b><br />
<br />
#!/bin/bash<br /><br />function retry()<br />{<br /> local n=0<br /> local try=$1<br /> local cmd="${@: 2}"<br /> local exit_code=0<br /> [[ $# -le 1 ]] && {<br /> echo "Usage $0 <retry_number> <command></command>"; }<br /><br /> until [[ $n -ge $try ]]<br /> do<br /> $cmd && exit_code=$? && break || {<br /> echo "Command Fail.."<br /> ((n++))<br /> echo "retry $n ::"<br /> sleep 1;<br /> }<br /> done<br /> return $exit_code<br />}<br /><br />retry $*</retry_number><br />
<br />
<br />
<b> Usage:</b><br />
<br />
./scripts/retry.sh 2 pytest<br />
<br />Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-49534655047355762182017-07-09T01:08:00.001+05:002017-07-09T01:08:21.955+05:00Linode change Outgoing and Incoming traffic to Priv Out and Priv In traffic<img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA0UAAAGGCAIAAAA7Br3RAAAAAXNSR0IArs4c6QAAAdVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpDb21wcmVzc2lvbj4xPC90aWZmOkNvbXByZXNzaW9uPgogICAgICAgICA8dGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPjI8L3RpZmY6UGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Cjl0tmoAAEAASURBVHgB7H0JmBXF1fbcubOzDsMusoooO6K4JMqiMUZQY9ziZ1wTozGYSNTEGOMejYlG45ZoxCVGkz+oX0TxcwfRCKggqwjCsAzMwuz73P1/e2qm6NtVXbfuzGHoudZ9eC7Vp069fert03dOn1raF4vF0szHMGAYMAwYBgwDhgHDgGGg2zKQ3m0tN4YbBgwDhgHDgGHAMGAYMAxYDJh4zviBYcAwYBgwDBgGDAOGge7NgInnuvf1M9YbBgwDhgHDgGHAMGAYyHBQsHbtWofEHBoGDAOGAcOAYcAwYBgwDHiNgZqamlmzZjGrTH7Oa1fH2GMYMAwYBgwDhgHDgGEgAQMI5nbs2MGVnPk5VnHYYYdxDVMwDBgGDAOGAcOAYcAwYBjwFAOLFi2y22Pyc3Y2TNkwYBgwDBgGDAOGAcNA92PAxHPd75oZiw0DhgHDgGHAMGAYMAzYGTDxnJ0NUzYMGAYMA4YBw4BhwDDQ/RiQz5/rfv0wFhsGDAOGAcOAYcAwYBhILQbefPNNR4dOO+00h4QdmvyclJaDL+zV/pGagkqpvMNCcsAOW6LZsGsMPnBncUN2kzNa1LWa1HVM7f777z/33HN5W1jCPlxiL6DKftj5Mjlg503qMAJofOCBBzrcvCsbvvvuu6NHjxbJd5OLml1p7YE4V4d75LhfkrWtw+dN9kT6+t3Ib/U71S00Eb3hM3v2bFiLgsJmE88pyDmYVfWtHzcLUOlWZeSEDHiN54NlT1NT06OPPnrvvfdyblvd09UJD5ad3DwvF0DjI488Akq9bCSz7e6773766afFq+kmFzW938cDYaF4vxyIs3QxZjfy2y5mpgtO19zcvGHDBr/fjw1KMjJch1VNPNcF18KcwjBwYBk40E/zr7766tFHHz127NgD241OoC9duvT8888fNmzYoEGDYOrvf/97FjCBGcfn0EMPZefBvk1XXXXVuHHj+vXrd8wxx7z++uuQV1RU/OxnPzviiCP69++Pb5QhgXzFihVXXHHFyJEjgQ9lju8md8MBFGiEhYsXL2ZmHIhvdJkEdsuWLSeccIII5SYXNbuXhIo38X5x889uxE8X+G03YqMrTcUv1ccff9yzZ89p06Z99tlnI0aMcDu7iefcmDFyw4BhoI2B//u//zv77LO9TMfvfve7M888E9HVnj17Xnnlld27d1922WUwmOUR+fcpp5xy8803Q15YWPjtb3/78MMPx9yUkpKSZ5555u9//zvkl19+eVZWFsYTi4uL8Y0yJJDfdttt0MevKvBffvnlffv2XXrppQq5Gw6a4AMyQSkre/m7oaEBDIgWuslFza+nRLxf3Pyze/HTXfy2e7Ga0Nqqqqrjjz+ePWTiF0zxXG3iuYRkekuBJxscZkGOh0LE7wMGDDjppJPWr1/PFJCl+PnPf45JMPhcd911fJSnpaXlhhtugBApB4z+cLRIJPLHP/5x4sSJSHUge9HY2Mir3Ar484b3jQwZMmTChAnPP/+8+rywE38IkSO555578OuAsyxcuNANWUf+xRdfnHzyydu2bePKOMWf//znI488EqkUe9f+/e9/T506FXmXuXPn4u8904cyRhJBAqi48cYbA4EAl6MKHw6bsABl/fMCDTEEzjtq1Kjrr78el4PjS+WttkjsYXK0dSjgUMozv+4472OPPQY1fl5FYc2aNfhBUSjw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" />Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-61862326480908544792017-01-19T20:12:00.000+05:002017-03-25T19:45:03.705+05:00payments.google.com/merchant and paid dateIn merchant system Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-76754547197561093732016-12-06T18:27:00.002+05:002016-12-06T18:28:05.731+05:00Распознавание кириллической яндекс капчи с вероятностью > 60%Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-58788907873721176292016-11-21T22:16:00.002+05:002016-11-21T22:16:20.834+05:00latex math to png<pre>
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()
</pre>Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-16322509475450879582016-11-21T22:07:00.003+05:002016-11-21T22:07:49.695+05:00hideme proxy python<pre>
#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
</pre>Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-82294752230715446212016-11-21T19:36:00.001+05:002016-11-21T19:36:28.808+05:00Код сайта kontrolnaya-rabota.ru
equations/detailed.py:
<pre>
# -*- 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
</pre>
buy/views.py:
<pre>
# 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
</pre>
buy/urls.py:
<pre>
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<key>[0-9a-f]+)/$', 'buy_complete', name='buy-complete'),
)
</pre>
buy/forms.py
<pre>
# -*- 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
</pre>
wolfram/utils.py
<pre>
# 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
</pre>
wolfram/base.py
<pre>
#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
</pre>
widgetes/jscalendar.py
<pre>
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())
</pre>
buy/complete.html
<pre>
{% extends "s/sbase.html" %}
{% block title %}Подробное решение бесплатно!{% endblock %}
{% block head %}
<META NAME="ROBOTS" CONTENT="NOINDEX NOFOLLOW" />
{% endblock %}
{% block crumbs %}<a href="/s/">Больше решений!</a>{% endblock %}
{% block base_table %}
<div class="main" style="width:856px; margin-top:-26px;">
<h1>Подробное решение: ответ</h1>
{% include "partner_block.html" %}
{% if with_simple_text %}
<pre>{{ text }}</pre>
{% else %}
<a href="/media/buy/{{ prefix }}1.png" target="_blank">
<img src="/media/buy/{{ prefix }}1.png" alt="{{ text }}">
</a>
{% endif %}
{% include "other-social.html" %}
{% include "partner_block.html" %}
</div>
{% endblock %}
</pre>
buy/definite.tex
<pre>
\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}
</pre>
buy/diff.tex
<pre>
\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}
</pre>
buy/free_form.html
<pre>
Для того, чтобы получить подробное решение бесплатно, пожалуйста, проделайте следующие действия:
<style type="text/css">
.buy_instruction li input {
width: 300px;
}
</style>
<ol class="buy_instruction">
{% if not request.COOKIES.ilikeit %}
<li>
<b>Скопируйте ссылку</b> и <br>
<b>разместите вконтакте или др. сайте</b>:
<input id="ilikeit" type="text" onclick="javascript:this.select()" value="http://{{ request.get_host }}{{ request.path_info }}"/>
<script>
$(function () {
$('#ilikeit').click(function () {
this.select();
$.cookie('ilikeit', true);
});
});
</script>
<br>
</li>
{% endif %}
<li>Введите цифры на рисунке</li>
</ol>
<form action="{% url free %}" method="POST">{% csrf_token %}
<table>
{{ free_form }}
<tr>
<td colspan="2">
<input type="submit" value="Получить подробное решение" />
</td>
</tr>
</table>
</form>
</pre>
buy/free.html
<pre>
{% extends "s/sbase.html" %}
{% load i18n %}
{% block head %}
{% if redirect_to %}
<meta http-equiv="REFRESH" content="40;url={{ redirect_to }}">
<style type="text/css">
body {cursor: wait;}
</style>
{% endif %}
{% endblock %}
{% block title %}Подробное решение бесплатно!{% endblock %}
{% block content %}
<h1>Подробное решение</h1>
{% include "partner_block.html" %}
{% if redirect_to %}
<h3>Производится проверка размещения ссылки, пожалуйста подождите чуть больше 1 мин...</h3>
Если ссылка на наш сайт будет найдена, то Вам будет предложено решение.<br/>
<b>Если программа не найдет ссылку</b> вида http://kontrolnaya-rabota.ru, то <b>Вы не получите файла</b>, но можно попробовать разместить ссылку на сайт http://kontrolnaya-rabota.ru/s/ снова. <br/>
<a href="javascript:history.back(1);">Назад</a>.<br/>
{% else %}
<h2>Хотите получить подробное решение с описанием действий?</h2>
{% include "s/buy/free_form.html" %}
{% endif %}
{% include "partner_block.html" %}
{% endblock %}
</pre>
buy/indefinite.tex
<pre>
\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}
</pre>
buy/limit.html
<pre>
\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}
</pre>Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-64425395225769050962016-11-09T15:43:00.005+05:002017-01-19T20:12:29.538+05:00python regex lazy re.compile<pre>
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)
</pre>
Use:
<pre>
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']
</pre>Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-21821569247021623002015-11-23T11:28:00.000+05:002015-11-23T11:28:16.515+05:00Upload a folder to s3from boto3.session import Session<br />import os<br /><br />session = Session(<br /> aws_access_key_id='xxx',<br /> aws_secret_access_key='yyy',<br /> region_name='eu-central-1', # Put your region name<br />)<br /><br />resource = session.resource('s3')<br /><br />bucket = resource.Bucket('your_bucket_name')<br /><br />from_dir = 'your_folder_name'<br /><br />for fn in os.listdir(from_dir):<br /> file_obj = open(os.path.join(from_dir, fn), 'rb')<br /><br /> to_folder = ''<br /><br /> bucket.put_object(<br /> Key=os.path.join(to_folder, os.path.basename(file_obj.name)),<br /> Body=file_obj.read(),<br /> )<br /> print '%s loaded' % fnИванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-78427955888417142212014-01-19T02:45:00.002+06:002014-01-19T02:45:56.936+06:00Integral Step-by-Step Calculator on Android!I write my first android application.<br />
<br />
I used.. python!<br />
<br />
You can write android application on python - use python framework <a href="http://kivy.org/">kivy</a><br />
(write a application supported on many operation systems: mac, windows, linux, android, ios, and sony play station and other)<br />
<br />
So, my first android application - <a href="https://play.google.com/store/apps/details?id=org.krapp.integral">Integral Step-by-Step Calculator</a> (link to google play)<br />
<br />
This app calculate a integrals:<br />
<br />
Offline Integral Step-By-Step Calculator (without online and internet):<br /> * A indefinite integral<br /> * A definite integral<br /> * A improper integralИванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-78611097549466924662014-01-06T06:12:00.001+06:002014-01-06T06:12:35.154+06:00Large Scale Machine Learning and Other Animals: Installing BLAS/Lapack/ITPP on Amazon EC2/Ubuntu L... Installing BLAS/Lapack/ITPP on Amazon EC2/Ubuntu Linux<br />
BLAS/Lapack are efficient matrix math libraries. The following instructions explains how to install them for Amazon EC2 (Ubuntu maverick version, and Amazon Linux). It++ (itpp) is a popular c++ wrapper for blas/lapack.<br />
<br />
DISLAIMER: The below instructions are for 64 bit machines. For 32 bit machines follow other instructions: http://bickson.blogspot.com/2011/06/graphlab-pmf-on-32-bit-linux.html<br />
<br />
FOR LAZY READERS:<br />
Just use Amazon EC2 public image ami-c21eedab (Ubuntu)<br />
<br />
INSTALLATION VIA YUM/APT-GET<br />
Try to install itpp using the following command:<br />
<br />
sudo yum install libitpp-dev<br />
<br />
Or<br />
<br />
sudo apt-get install libitpp-dev<br />
<br />
TIP: You may also want to install libitpp7-dbg using the yum/apt-get command.<br />
It is not mandatory, but it helps debugging when you link against libitpp_debug.so<br />
(instead of libitpp.so).<br />
<br />
If the above worked then we are done. If not, you will need to follow<br />
instructions below. Thanks to Udi Weinsberg for this tip.<br />
<br />
FOR ADVANCED USERS:<br />
<br />
<br />
0) Start with an Ubuntu image like ami-641eed0d, or an Amazon AMI image like:<br />
<br />
1) Install required packages. For Ubuntu:<br />
<br />
sudo apt-get install --yes --force-yes automake autoconf libtool* gfortran<br />
<br />
For Amazon Linux:<br />
<br />
sudo yum install -y automake autoconf libtool* gcc-gfortran<br />
<br />
<br />
2) Install lapack.<br />
Here again their are two options:<br />
<br />
The easy way is to simply (On Ububtu)<br />
<br />
sudo apt-get install --yes --force-yes liblapack-dev<br />
<br />
On Amazon Linux:<br />
<br />
sudo yum install -y lapack-devel blas-devel<br />
<br />
<br />
Thanks Akshay Bhat from Cornell for this tip!<br />
If the liblapack setup was successful, go to step 3.<br />
<br />
If the above command DOES NOT work for you (depends on your OS and setup) you will need to install lapack manually. The procedure is explained in steps a-c below.<br />
<br />
a) Download and prepare the code<br />
<br />
wget http://www.netlib.org/lapack/lapack.tgz<br />
tar xvzf lapack.tgz<br />
cd lapack-3.3.0 //if version number changes, change here to the right directory<br />
mv make.inc.example make.inc<br />
<br />
<br />
b) edit make.inc and add -m64 -fPIC flag to fortran compiler options:<br />
# FORTRAN, OPTS, NOOPT, LOADER<br />
<br />
c) compile<br />
<br />
make blaslib<br />
make<br />
<br />
If everthing went OK, test will be run for a couple of minutes<br />
and the files blas_LINUX.a and lapack_LINUX.a will be created at the main directory<br />
<br />
3) setup LDFLAGS<br />
<br />
export LDFLAGS="-L/usr/lib -lgfortran"<br />
<br />
<br />
4) Download and install itpp from<br />
<br />
wget http://sourceforge.net/projects/itpp/files/itpp/4.2.0/itpp-4.2.tar.gz<br />
tar xvzf itpp-4.2.tar.gz<br />
cd itpp-4.2<br />
./autogen.sh <br />
<br />
If you installed Lapack from yum/apt-get, you should use the following command:<br />
<br />
./configure --without-fft --with-blas=/usr/lib64/libblas.so --with-lapack=/usr/lib64/liblapack.so --enable-debug CFLAGS=-fPIC CXXFLAGS=-fPIC CPPFLAGS=-fPIC<br />
<br />
Where /usr/lib64/ is the place where lapack was installed.<br />
<br />
If you installed lapack from source, use the following command<br />
<br />
./configure --without-fft --with-blas=/home/ubuntu/lapack-3.3.0/blas_LINUX.a --with-lapack=/home/ubuntu/lapack-3.3.0/lapack_LINUX.a CFLAGS=-fPIC CXXFLAGS=-fPIC CPPFLAGS=-fPIC<br />
<br />
<br />
make<br />
sudo make install<br />
<br />
Note: If you installed lapack from yum/apt-get, don't forget to add the -lblas -llapack linker flag when you compile against lapack/blas.<br />
<br />
Verifying installation<br />
To verify that installation went Ok, run the following commands:<br />
<br />
itpp-config --cflags<br />
itpp-config --libs<br />
<br />
1) The command itpp-config should be available from shell.<br />
2) The right installation path should appear as output.<br />
<br />
Known issues you may encounter:<br />
Problem:<br />
<br />
*** Warning: Linking the shared library libitpp.la against the^M<br />
*** static library /usr/lib64/libblas.a is not portable!^M<br />
libtool: link: g++ -shared -nostdlib /usr/lib/gcc/x86_64-amazon-linux/4.4.4/../../../../lib64/crti.o /usr/lib/gcc/x86_64-amazon-linux/4.4.4/crtbeginS.o -Wl,--whole-archive ../itpp/base/.libs/libbase.a ../itpp/stat/.libs/libstat.a ../itpp/comm/.libs/libcomm.a ../itpp/fixed/.libs/libfixed.a ../itpp/optim/.libs/liboptim.a ../itpp/protocol/.libs/libprotocol.a ../itpp/signal/.libs/libsignal.a ../itpp/srccode/.libs/libsrccode.a -Wl,--no-whole-archive -L/usr/lib64/ /usr/lib64/liblapack.a /usr/lib64/libblas.a -lgfortranbegin -lgfortran -L/usr/lib/gcc/x86_64-amazon-linux/4.4.4 -L/usr/lib/gcc/x86_64-amazon-linux/4.4.4/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-amazon-linux/4.4.4/../../.. -lstdc++ -lm -lc -lgcc_s /usr/lib/gcc/x86_64-amazon-linux/4.4.4/crtendS.o /usr/lib/gcc/x86_64-amazon-linux/4.4.4/../../../../lib64/crtn.o -Wl,-soname -Wl,libitpp.so.7 -o .libs/libitpp.so.7.0.0^M<br />
/usr/bin/ld: /usr/lib64/liblapack.a(dgees.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC^M<br />
/usr/lib64/liblapack.a: could not read symbols: Bad value^M<br />
collect2: ld returned 1 exit status^M<br />
make[2]: *** [libitpp.la] Error 1^M<br />
<br />
Solution: it seems that lapack was statically compiled without the -fPIC option and thus itpp refuses to link against it. Follow step 2a to install lapack manaually with the -fPIC option.<br />
<br />
Problem:<br />
<br />
make[1]: *** Waiting for unfinished jobs....<br />
[ 83%] Building CXX object src/graphlab/CMakeFiles/<br />
graphlab_pic.dir/distributed2/distributed_scheduler_list.o /usr/local/lib/libitpp.so: undefined reference to `zgesv_' /usr/local/lib/libitpp.so: undefined reference to `dorgqr_' /usr/local/lib/libitpp.so: undefined reference to `dswap_' /usr/local/lib/libitpp.so: undefined reference to `dgeqp3_' /usr/local/lib/libitpp.so: undefined reference to `dpotrf_' /usr/local/lib/libitpp.so: undefined reference to `dgemm_' /usr/local/lib/libitpp.so: undefined reference to `zungqr_' /usr/local/lib/libitpp.so: undefined reference to `zscal_' /usr/local/lib/libitpp.so: undefined reference to `dscal_' /usr/local/lib/libitpp.so: undefined reference to `dgesv_' /usr/local/lib/libitpp.so: undefined reference to `dgetri_' /usr/local/lib/libitpp.so: undefined reference to `zgemm_' /usr/local/lib/libitpp.so: undefined reference to `zposv_' /usr/local/lib/libitpp.so: undefined reference to `zgetri_' /usr/local/lib/libitpp.so: undefined reference to `dgeev_' /usr/local/lib/libitpp.so: undefined reference to `zgemv_' /usr/local/lib/libitpp.so: undefined reference to `zgeqrf_' /usr/local/lib/libitpp.so: undefined reference to `zgerc_' /usr/local/lib/libitpp.so: undefined reference to `zswap_' /usr/local/lib/libitpp.so: undefined reference to `zgeev_' /usr/local/lib/libitpp.so: undefined reference to `daxpy_' /usr/local/lib/libitpp.so: undefined reference to `dgetrf_' /usr/local/lib/libitpp.so: undefined reference to `zgels_' /usr/local/lib/libitpp.so: undefined reference to `zgetrf_' /usr/local/lib/libitpp.so: undefined reference to `dgees_' /usr/local/lib/libitpp.so: undefined reference to `dcopy_' /usr/local/lib/libitpp.so: undefined reference to `dger_' /usr/local/lib/libitpp.so: undefined reference to `dgels_' /usr/local/lib/libitpp.so: undefined reference to `dgeqrf_' /usr/local/lib/libitpp.so: undefined reference to `zpotrf_' /usr/local/lib/libitpp.so: undefined reference to `zgees_' /usr/local/lib/libitpp.so: undefined reference to `dgesvd_' /usr/local/lib/libitpp.so: undefined reference to `zgeru_' /usr/local/lib/libitpp.so: undefined reference to `dsyev_' /usr/local/lib/libitpp.so: undefined reference to `zaxpy_' /usr/local/lib/libitpp.so: undefined reference to `ddot_' /usr/local/lib/libitpp.so: undefined reference to `zgesvd_' /usr/local/lib/libitpp.so: undefined reference to `zgeqp3_' /usr/local/lib/libitpp.so: undefined reference to `zcopy_' /usr/local/lib/libitpp.so: undefined reference to `dgemv_' /usr/local/lib/libitpp.so: undefined reference to `dposv_' /usr/local/lib/libitpp.so: undefined reference to `zheev_' collect2: ld returned 1 exit status make[2]: *** [tests/anytests] Error 1 make[1]: *** [tests/CMakeFiles/anytests.dir/all] Error 2<br />
<br />
Solution: itpp was compiled using dynamic libraries, but your application did not include the -lblas and -llapack link flags.<br />
<br />
Problem:<br />
<br />
*** Error: You must have "autoconf" installed to compile IT++ SVN sources<br />
*** Error: You must have "automake" installed to compile IT++ SVN sources<br />
*** Error: You must have "libtoolize" installed to compile IT++ SVN sources<br />
<br />
Solution:<br />
Need to install the packages autoconf, automake and libtoolize. See yum/apt-get documentation.<br />
<br />
Problem:<br />
<br />
/usr/bin/ld: /home/bickson/lapack-3.3.1/lapack_LINUX.a(dgees.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC<br />
/home/bickson/lapack-3.3.1/lapack_LINUX.a: could not read symbols: Bad value<br />
collect2: ld returned 1 exit status<br />
<br />
Solution:<br />
It seem you forgot to follow section 2b.<br />
<br />
TIP: It is useful to enable also itpp_debug library which is very useful when debugging your code. This is done by adding the flag --enable-debug to the configure script.<br />
<br />
Problem:<br />
<br />
*** Error in ../../../itpp/base/algebra/ls_solve.cpp on line 271:<br />
LAPACK library is needed to use ls_solve() function<br />
<br />
Solution:<br />
It seems that itpp is not installed properly -it did not link to lapack. Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com1tag:blogger.com,1999:blog-7575977724059961153.post-78490042117991325842013-12-15T22:01:00.004+06:002013-12-15T22:23:18.251+06:00Worked solution for Kivy + Admob on androidThis solution: with the few steps:<br />
<br />
1. Edit src/org/renpy/android/PythonActivity.java (Paste your ad_unit_id and TEST_DEVICE_ID)<br />
2. Edit AndroidManifest.xml (your comment manifest autogenerator on build.py)<br />
3. Edit YourApp on main.py<br />
4. Start for generate your app. <br />
<br />
<br />
1.<b> Edit source file</b> on python-for-android/dist/defaults (git version of is ca369d774e276fe2e9444c6021ec2559d0527c1d):<br />
<br />
<b>src/org/renpy/android/PythonActivity.java</b><br />
<br />
Replace with:<br />
<br />
<br />
<pre>package org.renpy.android;
import android.R;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Environment;
import android.view.KeyEvent;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
import android.util.Log;
import android.content.pm.PackageManager;
import android.content.pm.ApplicationInfo;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.Iterator;
// Billing
import org.renpy.android.Configuration;
import org.renpy.android.billing.BillingService.RequestPurchase;
import org.renpy.android.billing.BillingService.RestoreTransactions;
import org.renpy.android.billing.Consts.PurchaseState;
import org.renpy.android.billing.Consts.ResponseCode;
import org.renpy.android.billing.PurchaseObserver;
import org.renpy.android.billing.BillingService;
import org.renpy.android.billing.PurchaseDatabase;
import org.renpy.android.billing.Consts;
import org.renpy.android.billing.ResponseHandler;
import org.renpy.android.billing.Security;
import android.os.Handler;
import android.database.Cursor;
import java.util.List;
import java.util.ArrayList;
import android.content.SharedPreferences;
import android.content.Context;
<span style="color: #e06666;">import com.google.ads.AdView;
import com.google.ads.AdSize;
import com.google.ads.AdRequest;
import android.widget.RelativeLayout;</span>
public class PythonActivity extends Activity implements Runnable {
private static String TAG = "Python";
<span style="color: #e06666;">private AdView adView;</span>
// The audio thread for streaming audio...
private static AudioThread mAudioThread = null;
// The SDLSurfaceView we contain.
public static SDLSurfaceView mView = null;
public static PythonActivity mActivity = null;
public static ApplicationInfo mInfo = null;
// Did we launch our thread?
private boolean mLaunchedThread = false;
private ResourceManager resourceManager;
// The path to the directory contaning our external storage.
private File externalStorage;
// The path to the directory containing the game.
private File mPath = null;
boolean _isPaused = false;
private static final String DB_INITIALIZED = "db_initialized";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Hardware.context = this;
Action.context = this;
this.mActivity = this;
getWindowManager().getDefaultDisplay().getMetrics(Hardware.metrics);
resourceManager = new ResourceManager(this);
externalStorage = new File(Environment.getExternalStorageDirectory(), getPackageName());
// Figure out the directory where the game is. If the game was
// given to us via an intent, then we use the scheme-specific
// part of that intent to determine the file to launch. We
// also use the android.txt file to determine the orientation.
//
// Otherwise, we use the public data, if we have it, or the
// private data if we do not.
if (getIntent() != null && getIntent().getAction() != null &&
getIntent().getAction().equals("org.renpy.LAUNCH")) {
mPath = new File(getIntent().getData().getSchemeSpecificPart());
Project p = Project.scanDirectory(mPath);
if (p != null) {
if (p.landscape) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
// Let old apps know they started.
try {
FileWriter f = new FileWriter(new File(mPath, ".launch"));
f.write("started");
f.close();
} catch (IOException e) {
// pass
}
} else if (resourceManager.getString("public_version") != null) {
mPath = externalStorage;
} else {
mPath = getFilesDir();
}
requestWindowFeature(Window.FEATURE_NO_TITLE);
// go to fullscreen mode if requested
try {
this.mInfo = this.getPackageManager().getApplicationInfo(
this.getPackageName(), PackageManager.GET_META_DATA);
Log.v("python", "metadata fullscreen is" + this.mInfo.metaData.get("fullscreen"));
if ( (Integer)this.mInfo.metaData.get("fullscreen") == 1 ) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
} catch (PackageManager.NameNotFoundException e) {
}
if ( Configuration.use_billing ) {
mBillingHandler = new Handler();
}
// Start showing an SDLSurfaceView.
mView = new SDLSurfaceView(
this,
mPath.getAbsolutePath());
Hardware.view = mView;
<span style="color: #e06666;">RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
adView = new AdView(this, AdSize.BANNER, "YOU_AD_UNIT_ID");
adView.setLayoutParams(lp);
RelativeLayout layout = new RelativeLayout(this);
layout.addView(mView);
layout.addView(adView);
AdRequest adRequest = new AdRequest();
adRequest.addTestDevice("TEST_DEVICE_ID"); // Replace with your test device id
adView.loadAd(adRequest);
setContentView(layout);</span>
// Force the background window color if asked
if ( this.mInfo.metaData.containsKey("android.background_color") ) {
getWindow().getDecorView().setBackgroundColor(
this.mInfo.metaData.getInt("android.background_color"));
}
}
/**
* Show an error using a toast. (Only makes sense from non-UI
* threads.)
*/
public void toastError(final String msg) {
final Activity thisActivity = this;
runOnUiThread(new Runnable () {
public void run() {
Toast.makeText(thisActivity, msg, Toast.LENGTH_LONG).show();
}
});
// Wait to show the error.
synchronized (this) {
try {
this.wait(1000);
} catch (InterruptedException e) {
}
}
}
public void recursiveDelete(File f) {
if (f.isDirectory()) {
for (File r : f.listFiles()) {
recursiveDelete(r);
}
}
f.delete();
}
/**
* This determines if unpacking one the zip files included in
* the .apk is necessary. If it is, the zip file is unpacked.
*/
public void unpackData(final String resource, File target) {
// The version of data in memory and on disk.
String data_version = resourceManager.getString(resource + "_version");
String disk_version = null;
// If no version, no unpacking is necessary.
if (data_version == null) {
return;
}
// Check the current disk version, if any.
String filesDir = target.getAbsolutePath();
String disk_version_fn = filesDir + "/" + resource + ".version";
try {
byte buf[] = new byte[64];
InputStream is = new FileInputStream(disk_version_fn);
int len = is.read(buf);
disk_version = new String(buf, 0, len);
is.close();
} catch (Exception e) {
disk_version = "";
}
// If the disk data is out of date, extract it and write the
// version file.
if (! data_version.equals(disk_version)) {
Log.v(TAG, "Extracting " + resource + " assets.");
recursiveDelete(target);
target.mkdirs();
AssetExtract ae = new AssetExtract(this);
if (!ae.extractTar(resource + ".mp3", target.getAbsolutePath())) {
toastError("Could not extract " + resource + " data.");
}
try {
// Write .nomedia.
new File(target, ".nomedia").createNewFile();
// Write version file.
FileOutputStream os = new FileOutputStream(disk_version_fn);
os.write(data_version.getBytes());
os.close();
} catch (Exception e) {
Log.w("python", e);
}
}
}
public void run() {
unpackData("private", getFilesDir());
unpackData("public", externalStorage);
System.loadLibrary("sdl");
System.loadLibrary("sdl_image");
System.loadLibrary("sdl_ttf");
System.loadLibrary("sdl_mixer");
System.loadLibrary("python2.7");
System.loadLibrary("application");
System.loadLibrary("sdl_main");
System.load(getFilesDir() + "/lib/python2.7/lib-dynload/_io.so");
System.load(getFilesDir() + "/lib/python2.7/lib-dynload/unicodedata.so");
try {
System.loadLibrary("sqlite3");
System.load(getFilesDir() + "/lib/python2.7/lib-dynload/_sqlite3.so");
} catch(UnsatisfiedLinkError e) {
}
try {
System.load(getFilesDir() + "/lib/python2.7/lib-dynload/_imaging.so");
System.load(getFilesDir() + "/lib/python2.7/lib-dynload/_imagingft.so");
System.load(getFilesDir() + "/lib/python2.7/lib-dynload/_imagingmath.so");
} catch(UnsatisfiedLinkError e) {
}
if ( mAudioThread == null ) {
Log.i("python", "Starting audio thread");
mAudioThread = new AudioThread(this);
}
runOnUiThread(new Runnable () {
public void run() {
mView.start();
}
});
}
@Override
protected void onPause() {
_isPaused = true;
super.onPause();
if (mView != null) {
mView.onPause();
}
}
@Override
protected void onResume() {
super.onResume();
_isPaused = false;
if (!mLaunchedThread) {
mLaunchedThread = true;
new Thread(this).start();
}
if (mView != null) {
mView.onResume();
}
}
public boolean isPaused() {
return _isPaused;
}
@Override
public boolean onKeyDown(int keyCode, final KeyEvent event) {
//Log.i("python", "key2 " + mView + " " + mView.mStarted);
if (mView != null && mView.mStarted && SDLSurfaceView.nativeKey(keyCode, 1, event.getUnicodeChar())) {
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
@Override
public boolean onKeyUp(int keyCode, final KeyEvent event) {
//Log.i("python", "key up " + mView + " " + mView.mStarted);
if (mView != null && mView.mStarted && SDLSurfaceView.nativeKey(keyCode, 0, event.getUnicodeChar())) {
return true;
} else {
return super.onKeyUp(keyCode, event);
}
}
protected void onDestroy() {
mPurchaseDatabase.close();
mBillingService.unbind();
<span style="color: #e06666;">if (adView != null) {
adView.destroy();
}</span>
if (mView != null) {
mView.onDestroy();
}
//Log.i(TAG, "on destroy (exit1)");
System.exit(0);
}
public static void start_service(String serviceTitle, String serviceDescription,
String pythonServiceArgument) {
Intent serviceIntent = new Intent(PythonActivity.mActivity, PythonService.class);
String argument = PythonActivity.mActivity.getFilesDir().getAbsolutePath();
String filesDirectory = PythonActivity.mActivity.mPath.getAbsolutePath();
serviceIntent.putExtra("androidPrivate", argument);
serviceIntent.putExtra("androidArgument", filesDirectory);
serviceIntent.putExtra("pythonHome", argument);
serviceIntent.putExtra("pythonPath", argument + ":" + filesDirectory + "/lib");
serviceIntent.putExtra("serviceTitle", serviceTitle);
serviceIntent.putExtra("serviceDescription", serviceDescription);
serviceIntent.putExtra("pythonServiceArgument", pythonServiceArgument);
PythonActivity.mActivity.startService(serviceIntent);
}
public static void stop_service() {
Intent serviceIntent = new Intent(PythonActivity.mActivity, PythonService.class);
PythonActivity.mActivity.stopService(serviceIntent);
}
//----------------------------------------------------------------------------
// Listener interface for onNewIntent
//
public interface NewIntentListener {
void onNewIntent(Intent intent);
}
private List<newintentlistener> newIntentListeners = null;
public void registerNewIntentListener(NewIntentListener listener) {
if ( this.newIntentListeners == null )
this.newIntentListeners = Collections.synchronizedList(new ArrayList<newintentlistener>());
this.newIntentListeners.add(listener);
}
public void unregisterNewIntentListener(NewIntentListener listener) {
if ( this.newIntentListeners == null )
return;
this.newIntentListeners.remove(listener);
}
@Override
protected void onNewIntent(Intent intent) {
if ( this.newIntentListeners == null )
return;
if ( this.mView != null )
this.mView.onResume();
synchronized ( this.newIntentListeners ) {
Iterator<newintentlistener> iterator = this.newIntentListeners.iterator();
while ( iterator.hasNext() ) {
(iterator.next()).onNewIntent(intent);
}
}
}
//----------------------------------------------------------------------------
// Listener interface for onActivityResult
//
public interface ActivityResultListener {
void onActivityResult(int requestCode, int resultCode, Intent data);
}
private List<activityresultlistener> activityResultListeners = null;
public void registerActivityResultListener(ActivityResultListener listener) {
if ( this.activityResultListeners == null )
this.activityResultListeners = Collections.synchronizedList(new ArrayList<activityresultlistener>());
this.activityResultListeners.add(listener);
}
public void unregisterActivityResultListener(ActivityResultListener listener) {
if ( this.activityResultListeners == null )
return;
this.activityResultListeners.remove(listener);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if ( this.activityResultListeners == null )
return;
if ( this.mView != null )
this.mView.onResume();
synchronized ( this.activityResultListeners ) {
Iterator<activityresultlistener> iterator = this.activityResultListeners.iterator();
while ( iterator.hasNext() )
(iterator.next()).onActivityResult(requestCode, resultCode, intent);
}
}
//----------------------------------------------------------------------------
// Billing
//
class PythonPurchaseObserver extends PurchaseObserver {
public PythonPurchaseObserver(Handler handler) {
super(PythonActivity.this, handler);
}
@Override
public void onBillingSupported(boolean supported, String type) {
if (Consts.DEBUG) {
Log.i(TAG, "supported: " + supported);
}
String sup = "1";
if ( !supported )
sup = "0";
if (type == null)
type = Consts.ITEM_TYPE_INAPP;
// add notification for python message queue
mActivity.mBillingQueue.add("billingSupported|" + type + "|" + sup);
// for managed items, restore the database
if ( type == Consts.ITEM_TYPE_INAPP && supported ) {
restoreDatabase();
}
}
@Override
public void onPurchaseStateChange(PurchaseState purchaseState, String itemId,
int quantity, long purchaseTime, String developerPayload) {
mActivity.mBillingQueue.add(
"purchaseStateChange|" + itemId + "|" + purchaseState.toString());
}
@Override
public void onRequestPurchaseResponse(RequestPurchase request,
ResponseCode responseCode) {
mActivity.mBillingQueue.add(
"requestPurchaseResponse|" + request.mProductId + "|" + responseCode.toString());
}
@Override
public void onRestoreTransactionsResponse(RestoreTransactions request,
ResponseCode responseCode) {
if (responseCode == ResponseCode.RESULT_OK) {
mActivity.mBillingQueue.add("restoreTransaction|ok");
if (Consts.DEBUG) {
Log.d(TAG, "completed RestoreTransactions request");
}
// Update the shared preferences so that we don't perform
// a RestoreTransactions again.
SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor edit = prefs.edit();
edit.putBoolean(DB_INITIALIZED, true);
edit.commit();
} else {
if (Consts.DEBUG) {
Log.d(TAG, "RestoreTransactions error: " + responseCode);
}
mActivity.mBillingQueue.add(
"restoreTransaction|error|" + responseCode.toString());
}
}
}
/**
* If the database has not been initialized, we send a
* RESTORE_TRANSACTIONS request to Android Market to get the list of purchased items
* for this user. This happens if the application has just been installed
* or the user wiped data. We do not want to do this on every startup, rather, we want to do
* only when the database needs to be initialized.
*/
private void restoreDatabase() {
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
boolean initialized = prefs.getBoolean(DB_INITIALIZED, false);
if (!initialized) {
mBillingService.restoreTransactions();
}
}
/** An array of product list entries for the products that can be purchased. */
private enum Managed { MANAGED, UNMANAGED, SUBSCRIPTION }
private PythonPurchaseObserver mPythonPurchaseObserver;
private Handler mBillingHandler;
private BillingService mBillingService;
private PurchaseDatabase mPurchaseDatabase;
private String mPayloadContents;
public List<string> mBillingQueue;
public void billingServiceStart_() {
mBillingQueue = new ArrayList<string>();
// Start the billing part
mPythonPurchaseObserver = new PythonPurchaseObserver(mBillingHandler);
mBillingService = new BillingService();
mBillingService.setContext(this);
mPurchaseDatabase = new PurchaseDatabase(this);
ResponseHandler.register(mPythonPurchaseObserver);
if (!mBillingService.checkBillingSupported()) {
//showDialog(DIALOG_CANNOT_CONNECT_ID);
Log.w(TAG, "NO BILLING SUPPORTED");
}
if (!mBillingService.checkBillingSupported(Consts.ITEM_TYPE_SUBSCRIPTION)) {
//showDialog(DIALOG_SUBSCRIPTIONS_NOT_SUPPORTED_ID);
Log.w(TAG, "NO SUBSCRIPTION SUPPORTED");
}
}
public void billingServiceStop_() {
}
public void billingBuy_(String mSku) {
Managed mManagedType = Managed.MANAGED;
if (Consts.DEBUG) {
Log.d(TAG, "buying sku: " + mSku);
}
if (mManagedType == Managed.MANAGED) {
if (!mBillingService.requestPurchase(mSku, Consts.ITEM_TYPE_INAPP, mPayloadContents)) {
Log.w(TAG, "ERROR IN BILLING REQUEST PURCHASE");
}
} else if (mManagedType == Managed.SUBSCRIPTION) {
if (!mBillingService.requestPurchase(mSku, Consts.ITEM_TYPE_INAPP, mPayloadContents)) {
Log.w(TAG, "ERROR IN BILLING REQUEST PURCHASE");
}
}
}
public String billingGetPurchasedItems_() {
String ownedItems = "";
Cursor cursor = mPurchaseDatabase.queryAllPurchasedItems();
if (cursor == null)
return "";
try {
int productIdCol = cursor.getColumnIndexOrThrow(
PurchaseDatabase.PURCHASED_PRODUCT_ID_COL);
int qtCol = cursor.getColumnIndexOrThrow(
PurchaseDatabase.PURCHASED_QUANTITY_COL);
while (cursor.moveToNext()) {
String productId = cursor.getString(productIdCol);
String qt = cursor.getString(qtCol);
productId = Security.unobfuscate(this, Configuration.billing_salt, productId);
if ( productId == null )
continue;
if ( ownedItems != "" )
ownedItems += "\n";
ownedItems += productId + "," + qt;
}
} finally {
cursor.close();
}
return ownedItems;
}
static void billingServiceStart() {
mActivity.billingServiceStart_();
}
static void billingServiceStop() {
mActivity.billingServiceStop_();
}
static void billingBuy(String sku) {
mActivity.billingBuy_(sku);
}
static String billingGetPurchasedItems() {
return mActivity.billingGetPurchasedItems_();
}
static String billingGetPendingMessage() {
if (mActivity.mBillingQueue.isEmpty())
return null;
return mActivity.mBillingQueue.remove(0);
}
}</string></string></activityresultlistener></activityresultlistener></activityresultlistener></newintentlistener></newintentlistener></newintentlistener></pre>
<br />
<br />
2. <b>Your AndroidManifest.xml: (on AdActivity add android:process=":python")</b><br />
<br />
<a href="https://docs.google.com/document/d/1Cr7ixoGoIxa5RDBllDotZcwzlGiH7ko5c8IahJdoL_A/edit?usp=sharing">https://docs.google.com/document/d/1Cr7ixoGoIxa5RDBllDotZcwzlGiH7ko5c8IahJdoL_A/edit?usp=sharing</a><br />
<br />
3. class YourApp(App):<br />
def on_pause(self):<br />
return True<br />
<br />
4. Generate your app for android<br />
<br />
<br />
It bad solution, but is work.Any ideas?Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com8tag:blogger.com,1999:blog-7575977724059961153.post-19362974592874682662013-12-05T01:26:00.001+06:002013-12-05T01:48:20.375+06:00kivy: How to i get google admob android source code?<table><tbody>
<tr><td class="votecell"><div class="vote">
<span class="vote-count-post "></span></div>
</td>
<td class="postcell"><div>
<div class="post-text" itemprop="description">
I want to create (or migrate) google admob for android to kivy project,<br />
Please, leave url to source code of admob or admob source code file here.<br />
It need, because i not understand mechanizm of admob for android (admob url api)<br />
<br />
Answer:<br />
Admob is not open-source, so I don't think you will be able to get this source code. </div>
</div>
</td></tr>
</tbody></table>
Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-33982682633107553792013-05-02T03:05:00.000+06:002013-05-02T03:05:28.363+06:00Про то, как прикрутить купленный sslРасскажу, как прикрутить ssl + nginx + django с примерами.<br />
<br />
Поэтапно - самого начала.<br />
<br />
Покупаем дешёвый (просто для безопасности сайта - можно купить за 600 руб )<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://visagency.ru/" style="margin-left: auto; margin-right: auto;" target="_blank"><img border="0" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_5GBXlkYAGb-5mSAMMtqHFZPqSaDPk9MTVNMmNP5IFSbRWybWeLqSr4CIMJQSYcyHpELK8Ap3JodBIW1EKoqQHdsLeAq4rWEZgdNBq67C24NSqTGFzEDYrO-usEM3KRs0RP44xNvO8U70/s320/visa-agentstvo-ssl-simple.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
или подороже - для организации (тогда появится зелёненькая штука)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrdyNiH-F7L4SgXRQqRM0Xw_Eroe5673wTlgp7RfmVjxSRCT4QQcZsH10RFzO5Z0G_wITfnzpew2DDqJ-LzpFIFe-qB6JLgOZPfSOQ0i9tmxVS_ND26yrVOBtIPPhSdexv2eCgo0E7uANv/s1600/ssl-advenced.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="26" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrdyNiH-F7L4SgXRQqRM0Xw_Eroe5673wTlgp7RfmVjxSRCT4QQcZsH10RFzO5Z0G_wITfnzpew2DDqJ-LzpFIFe-qB6JLgOZPfSOQ0i9tmxVS_ND26yrVOBtIPPhSdexv2eCgo0E7uANv/s320/ssl-advenced.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
После покупки вам сразу в интерфейсе хостинга выдают private key <br />
<br />
После небольшого ожидания - вам вышлют public ключ на почту.<br />
<br />
Далее, настройки на сервере nginx<br />
<br />
server {<br /><br /> listen 443;<br /><br /> ssl on;<br /> ssl_certificate /etc/ssl/SSL.crt;<br /> ssl_certificate_key /etc/ssl/visa.key;<br /><br /> server_name visagency.ru;<br /><br /> location / {<br /><br /> uwsgi_pass 127.0.0.1:49001;<br /><br /> charset utf8;<br /> access_log /var/log/nginx/visa.log;<br /><br /> }<br />
}<br />
<br />
где /etc/ssl/SSL.crt - public key - собранный из двух сертификатов (почитайте на сайте поддержки сертификатов),<br />
/etc/ssl/visa.conf - private key<br />
<br />
релоадим nginx - должно работать норм.<br />
<br />
sudo service nginx reload<br />
<br />
Вот ещё конфиг на redirect на https:<br />
<br />
server {<br /> listen 80;<br /><br /> server_name visagency.ru;<br /><br /> location / {<br /> rewrite ^ https://visagency.ru$request_uri? permanent;<br /> }<br />
} <br />
Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com1Россия61.52401 105.31875600000001-4.6225164999999961 -59.915618999999992 90 -89.446868999999992tag:blogger.com,1999:blog-7575977724059961153.post-709386033871313102012-12-11T18:45:00.002+06:002012-12-11T18:45:10.121+06:00django request meta HTTP_COOKIE get expires - get max_ageОказывается из браузера нельзя на сервере достать expires и max_age у cookie,<br />
<br />
поэтому <b>нельзя</b> сказать в django так<br />
<br />
import Cookie<br /><br />cookie = Cookie.SimpleCookie(request.META['HTTP_COOKIE']);<br />
<br />
cobj = cookie['some_cookie_name']['expires'] # Empty ""<br />
<br />
<br />
и получить значение<br />
<br />
<br />
Прийдется самостоятельно кастомизировать время сервера в другую куку.<br />
<br />
<br />
Например, так:<br />
<br />
<br />
<br />
<br /><br />cookie['set_cookie_time'] = datetime.date.today().strftime('%F')Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-79110380987731832252012-10-10T04:41:00.002+06:002012-10-10T04:41:51.618+06:00Применение классов при получении подробного решения онлайнЗадался Я целью сделать симплекс метод онлайн с подробным бесплатным решением.<br />
<br />
Как известно, обычно, подробное решение должно быть разбито на шаги, чтобы стало ясно.<br />
<br />
Чтобы было ясно и у меня в коде и чтобы не запутаться при написании такой сложной программы я ввел класс. Входящими параметрами в этот класс стали:<br />
<ul>
<li>функция, для которой необходимо найти экстремум</li>
<li>этот экстремум является максимумом или минимумом</li>
<li>и система условий в симплекс-задаче в ввиде списка данных (python-словарей)</li>
</ul>
В __init__ (в конструкторе) инитятся какие-то глобальные вещи, например, свободные члены, искусственные переменные, преобразуются данные к удобным.<br />
<br />
Далее, для каждого шага проверяется: <br />
<ul>
<li>нужно ли выполнять соотв. шаг (в отдельном методе объекта данного класса).</li>
<li>В другом методе для данного шага выполняется преобразование входящих данных</li>
<li>записывается состояние (слепок) данных на каком-то шаге в свойство объекта класса. (Например, запоминаются данные после приведения системы условий к каноническому виду, как требует симплекс-метод)</li>
<li>Также в каком-то из методов для данного шага (на проверке или же преобразовании данных) - заполняются глобальные вещи, например, свободные переменные </li>
</ul>
У нас всегда есть проходящие данные через все методы и куча слепков этих данных.<br />
<br />
Далее полученный объект данного класса пихается в django-шаблон, где происходит вывод решения задачи симплекс методом простыми манипуляциями if и for.<br />
<br />
Пример того, что получилось вы можете посмотреть по ссылке <a href="http://www.kontrolnaya-rabota.ru/s/equal-many/simplex-method/">симлекс метод онлайн</a><br />
(там есть текстовый пример, чтобы не скучали и <b>видео пример</b>)Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-50682454001695281132012-06-28T19:00:00.000+06:002012-06-28T19:00:45.799+06:00sudo usermod -G sudo -a USERNAMEsudo usermod -G sudo -a USERNAMEИванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-70393022605368159952012-06-26T00:37:00.000+06:002012-06-26T00:37:08.760+06:00yota@telerossa.ruЭто мошенники. Просят выслать паспортные данные. Не высылайте!<br />
<br />
Я позвонил в yota - сказали, что - да, действительно мошенники.Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com1tag:blogger.com,1999:blog-7575977724059961153.post-85663702266209241842012-05-13T05:14:00.000+06:002012-05-13T05:14:49.538+06:00Определение направление радиус-вектора от одной точки к другой точкиДопустим, у нас есть две точки, например, центр города и отель.<br />
<br />
Нам нужно определить, в каком направлении нужно двигаться, чтобы при движении из центра города попасть в отель. Координаты центра города и отеля нам известны.<br />
Для решения задачи:<br />
<ol>
<li>Ставим точку центра города на бумажке.</li>
<li>Строим через эту точку вертикальную и горизонтальную линии (оси x и y координат)</li>
<li>Строим конечную точку (отель)</li>
<li>Определяем в какой зоне координат находится конечная точка (в --, ++, -+, +-)</li>
<li>Далее определяем угол между осью x и y</li>
<li>Смотрим чему равен угол, < 45 - 45/2, > 45 + 45/2 или находится между</li>
</ol>
Тем самым мы поймем в какой зоне находится наша точка - по северному, западному, южному, восточному направлению или северно-западному, северо-восточному, юго-западному, юго-восточному ли находится отель.<br />
<br />
Код на языке python:<br />
<br />
<pre>import math
def get_direction_name((lng_city, lat_city), (lng_hotel, lat_hotel)):
direction = get_direction((lng_city, lat_city), (lng_hotel, lat_hotel))
name = dict(DIRECTIONS)[direction]
return name
def get_direction((lng_city, lat_city), (lng_hotel, lat_hotel)):
diff_lat = lat_hotel - lat_city
diff_lng = lng_hotel - lng_city
if math.fabs(diff_lng) > 180:
diff_lng -= 360*diff_lng/math.fabs(diff_lng)
is_mm = (diff_lat < 0) and (diff_lng < 0) and 1 or 0
is_pp = (diff_lat > 0) and (diff_lng > 0) and 1 or 0
is_mp = (diff_lat > 0) and (diff_lng < 0) and 1 or 0
is_pm = (diff_lat < 0) and (diff_lng > 0) and 1 or 0
if diff_lng:
arg = math.fabs(diff_lat/diff_lng)
degree = math.atan(arg)*180/math.pi
else:
degree = 90
on_diagonal = 45 - 45.0/2 < degree < 45 + 45.0/2 and 1 or 0
below_diagonal = degree < 45 - 45.0/2 and 1 or 0
above_diagonal = degree > 45 + 45.0/2 and 1 or 0
print is_pp, is_mm, is_pm, is_mp, on_diagonal, below_diagonal, above_diagonal
direction_key = '{0}-{1}-{2}-{3}-{4}-{5}-{6}'.format(
is_pp, is_mm, is_pm, is_mp, on_diagonal, below_diagonal, above_diagonal,
)
direction = _direction_map[direction_key]
return direction
NORTH_EAST = 'north-east'
NORTH_WEST = 'north-west'
SOUTH_EAST = 'south-east'
SOUTH_WEST = 'south-west'
NORTH = 'north'
SOUTH = 'south'
EAST = 'east'
WEST = 'west'
DIRECTIONS = [
(NORTH_EAST, _(u'северо-восток')),
(NORTH_WEST, _(u'северо-запад')),
(SOUTH_EAST, _(u'юго-восток')),
(SOUTH_WEST, _(u'юго-запад')),
(NORTH, _(u'север')),
(SOUTH, _(u'юг')),
(EAST, _(u'восток')),
(WEST, _(u'запад')),
]
# Key: is_pp-is_mm-is_pm-is_mp-on_diagonal-below_diagonal-above_diagonal
_direction_map = {
'1-0-0-0-1-0-0': NORTH_EAST,
'1-0-0-0-0-1-0': EAST,
'1-0-0-0-0-0-1': NORTH,
'0-1-0-0-1-0-0': SOUTH_WEST,
'0-1-0-0-0-1-0': WEST,
'0-1-0-0-0-0-1': SOUTH,
'0-0-1-0-1-0-0': SOUTH_EAST,
'0-0-1-0-0-1-0': EAST,
'0-0-1-0-0-0-1': SOUTH,
'0-0-0-1-1-0-0': NORTH_WEST,
'0-0-0-1-0-1-0': WEST,
'0-0-0-1-0-0-1': NORTH,
}
</pre>Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-44462249188331616192012-02-18T16:46:00.000+06:002012-02-18T16:46:01.809+06:00get search bot in djangoSee this python code<br />
<br />
<br />
<pre><code>def _is_searchbot(request):
user_agent = request.META.get('HTTP_USER_AGENT', None)
if not user_agent:
return False
parts = re.findall(r'([\w\-\s\.]*(yandex|google)[\w\-\s\.]*)', user_agent)
if not parts:
return False
part = parts[0]
if part not in _SEARCH_BOTS:
return False
return True
_SEARCH_BOTS = [
('yandex.com', 'yandex'),
('www.yandex.com', 'yandex'),
('yandex.ru', 'yandex'),
('www.yandex.ru', 'yandex'),
('www.google.com', 'google'),
('google.com', 'google'),
('www.google.ru', 'google'),
('google.ru', 'google'),
]
</code></pre>Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-62472139080155204022011-12-30T04:42:00.002+06:002011-12-30T04:42:37.178+06:00Два способа формирования контекста для subprocessing.Pool.map<span id="internal-source-marker_0.6841482131143238" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">1. С использованием инициализатора и глобального окружения</span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">from multiprocessing import Pool</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">def init_context(context):</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> globals().update(context)</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">def f(x):</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> return x*multiplier</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">if __name__ == '__main__':</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> pool = Pool(4, init_context, [{'multiplier': 2},])</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> data = xrange(10)</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> print pool.map(f, data)</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">2. С использованием callable классов</span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">from multiprocessing import Pool</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">class f(object):</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> def __init__(self, multiplier):</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> self.multiplier = multiplier</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> def __call__(self, x):</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> return x*self.multiplier</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">if __name__ == '__main__':</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> pool = Pool(4)</span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> data = xrange(10) </span><br /><span style="background-color: transparent; color: black; font-family: Courier New; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> print pool.map(f(3), data)</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span>Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-57071449934000187632011-12-25T05:16:00.002+06:002011-12-25T05:16:05.256+06:00Легкий для использования объектно-ориентированный thread pool framework<span style="background-color: white; color: black; display: inline ! important; float: none; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-converted-space"> </span>thread pool framework: под названием: </span><br />
<h1 class="epydoc" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: white; color: black; font-family: Times; font-size: 22px; font-style: italic; font-variant: normal; font-weight: bold; letter-spacing: normal; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
threadpool</h1>Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-28436438230167483032011-12-10T04:44:00.001+06:002013-01-06T00:55:14.070+06:00django import excelThis publication is present of django system for import data from excel:<br />
<br />
Use this step by step for rapid start use wih django application:<br />
<br />
1. Follow to page https://github.com/satels/<b>django-import-excel</b> and push the button <b><span style="color: #6aa84f;">Watch</span></b><br />
2.Download this project https://github.com/satels/django-import-excel/zipball/master<br />
3. Unpack, following to the folder and run <i>pip install -e</i> . or <i>python setup.py install</i><br />
4. In settings.py:<br />
<br />
INSTALLED_APPS = [<br />
...<br />
'import_excel',<br />
...<br />
]<br />
<br />
5. So, for example, you need import the data from excel for model<br />
<br />
<br />
class Book(models.Model):<br />
<br />
name = models.CharField(max_length=255)<br />
author = models.CharField(max_length=255)<br />
<br />
<br />
The excel file contains the data<br />
<br />
name | author<br />
<span class="short_text" id="result_box" lang="en"><span class="hps">Tom</span> <span class="hps">Sawyer</span></span> | <span class="short_text" id="result_box" lang="en"><span class="hps">Mark Twain</span></span><br />
<span class="short_text" id="result_box" lang="en"><span class="hps">The Sands of</span> <span class="hps">Mars</span></span> | <span class="short_text" id="result_box" lang="en"><span class="hps">Arthur C. Clarke</span></span><br />
<br />
To do is, create this form:<br />
<br />
from django.db import transaction<br />
from import_excel.forms import ImportExcelForm<br />
<br />
<br />
class BookImportForm(ImportExcelForm):<br />
<br />
@transaction.autocommit<br />
def update_callback(self, request, converted_items):<br />
for book_item in converted_items[:1]:<br />
name = book_item[0]<br />
author = book_item[1]<br />
Book.objects.create(name=name, author=author)<br />
<br />
<br />
Далее, в urls.py:<br />
<br />
urlpatterns = patterns('',<br />
url(r'^/books/import-from-excel/$', permission_required('books.add_book')(import_excel), {<br />
'FormClass': BookImportForm, 'next_url': '/books/', 'with_good': True,
'template_name': 'import_excel/import_excel.html',<br />
}, name='book-import-excel'),<br />
),<br />
<br />
<br />
We see this in import book form , next_url - the url of page for redirect after succefull import request, with_good - it means, what must pre moderate data from excel file, also you must set template_name, if you have custom template (copy file from import_excel/templates/import_excel/import_excel.html)<br />
<br />
P.S. permission_required for django admin zoneИванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0tag:blogger.com,1999:blog-7575977724059961153.post-80228336576094547782011-12-10T02:45:00.001+06:002013-01-06T00:54:07.400+06:00django импорт excelПоявилась очень удобная система для импорта данных из excel в django:<br />
<br />
Чтобы начать использовать это приложение django в своем проекте:<br />
<br />
1. Переходим на страницу https://github.com/satels/<b>django-import-excel</b> и нажимаем кнопку Watch<br />
2.Скачиваем проект себе https://github.com/satels/django-import-excel/zipball/master<br />
3. Распаковываем, переходим в папку и запускаем pip install -e . или же python setup.py install<br />
4. В settings.py:<br />
<br />
INSTALLED_APPS = [<br />
...<br />
'import_excel',<br />
...<br />
]<br />
<br />
5. Итак, например, нам надо импортировать данные из excel для модели<br />
<br />
<br />
class Book(models.Model):<br />
<br />
name = models.CharField(max_length=255)<br />
author = models.CharField(max_length=255)<br />
<br />
<br />
Файл excel же содержит данные<br />
<br />
name | author<br />
Мастер и Маргарита | Михаил Булгаков<br />
И дольше века длится день | Чингиз Айтматов<br />
<br />
Для этого создаем форму<br />
<br />
from django.db import transaction<br />
from import_excel.forms import ImportExcelForm<br />
<br />
<br />
<br />
class BookImportForm(ImportExcelForm):<br />
<br />
@transaction.autocommit<br />
def update_callback(self, request, converted_data):<br />
for book_item in converted_data[1:]:<br />
name = book_item[0]<br />
author = book_item[1]<br />
Book.objects.create(name=name, author=author)<br />
<br />
<br />
Далее, в urls.py:<br />
<br />
urlpatterns = patterns('',<br />
url(r'^/books/import-from-excel/$', permission_required('books.add_book')(import_excel), {<br />
'FormClass': BookImportForm, 'next_url': '/books/', 'with_good': True, 'template_name': 'import_excel/import_excel.html',<br />
}, name='book-import-excel'),<br />
),<br />
<br />
<br />
Видим здесь мы указываем форму для загрузки книг, next_url - страницу для перехода после успешной загрузки, with_good - это значит, что надо подтвердить загружаемые данные с предварительным просмотром, также вы можете указывать template_name, если захотите задать свой (скопируйте файл из import_excel/templates/import_excel/import_excel.html)Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com4tag:blogger.com,1999:blog-7575977724059961153.post-17902670365036777842011-10-25T02:50:00.002+06:002011-10-25T02:50:27.907+06:00Склонятор имен на djangoСклонятор имен на django можно найти по ссылке https://github.com/gugu/django-declension. Использует api яндекс склонятора http://nano.yandex.ru/project/inflect/
Кэширует результат в таблицу базы данных, имеется templatetag.Иванhttp://www.blogger.com/profile/13069909338656328369noreply@blogger.com0