Страницы

Поиск по вопросам

среда, 5 декабря 2018 г.

Скриншоты в Selenium

Использую Java + Selenium Webdriver. Есть задача:
Сделать 4 скриншота (с интервалом в 5 секунд). Для каждого скриншота получить и сохранить md5-хэш. Сравнить полученные значения хэшей (все должны быть разным).
Помогите разобраться, что и как зачем?
Чтобы сделать скриншот можно вызвать метод getScreenshotAs(OutputType target)
File screenShot = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE); BufferedImage screenshotImage = ImageIO.read(screenShot);
В первой строке мы делаем скриншот. Преобразовываем его в BufferedImage - Почему так нужно или не нужно делать? Как мне сохранить скриншот на компьютер?


Ответ

код для шарпа(практически идентичный с джавой)
Screenshot myScreenShot = ((ITakesScreenshot)webDriver).GetScreenshot(); myScreenShot.SaveAsFile(screenShotFileAdress, System.Drawing.Imaging.ImageFormat.Png);
закинь в цикл с Thread.Sleep(5000); в конце тела цикла.
с хешами сам разберешься (и не уверен что тебе вообще нужно сохранять изображения, лучше закинь их в какой-нибудь Лист и генери мд5 с битмапов, что б потом просто сравнять =) Сохранять сами изображения не обязательно )

Линейное преобразование в ГОСТ Р 34.12-2015

Здравствуйте!
Мне хочется написать реализацию недавно принятого на вооружение симметричного блочного алгоритма шифрования "Кузнечик". Сейчас изучаю стандарт, пытаюсь посчитать каждый шаг алгоритма "на пальцах" чтобы подтвердить своё понимание, и один момент никак не сходится с тестовым примером.
Текст ГОСТа представлен на сайте ТК 26: http://tc26.ru/standard/gost/GOST_R_3412-2015.pdf
О чём речь?
Проблема в трансформации R, которая преобразует 16-байтный массив, а точнее — в l, которая из этого массива получает всего один байт данных.
R(a[]) = l(a[]) & a[15] & a[14] & .. & a[1] l(a[]) = 148 * a[15] + 32 * a[14] + ... + 1 * a[0]
Операции сложения и умножения осуществляются в поле F, а константы являются элементами поля в указанном ранее смысле.
Как я понял, речь идёт о сложении и умножении по модулю 255
F конечное поле GF(2)[x]∕p(x), где p(x) = x8 + x7 + x6 + x + 1 ∈ GF(2)[x]
Что случилось?
В приложении к стандарту приводятся контрольные примеры для преобразований, используемых в алгоритме шифрования, и для R в том числе.
R(00000000000000000000000000000100) = 94000000000000000000000000000001 R(94000000000000000000000000000001) = a5940000000000000000000000000000
Шестнадцатеричные числа — представление массива из 16 байт, причём первый (а точнее, нулевой) элемент находится в конце строки.
Итак, R(a[]) = l(a[]) & a[15] & ... & a[1]
В первом примере всё хорошо:
l(a[]) = 148 * a[1] = 148 = 0x94 R(a[]) = 0x94 & a[15..1] = 0x94, 0x00, ... 0x01
Во втором случае всё сложнее. Если я правильно понял про сложение и умножение, озвученное выше, то:
l(a[]) = 148 * a[15] + 1 * a[0] = (148 * 148) mod 255 + 1 * 1 = 229 + 1 = 230 = E6
R(a[]) = 0xE6, 0x94, 0x00, ...
Стоп! В контрольном примере старшие байты получились 0xA5, 0x94!
Что делать?
Собственно, вот и сам вопрос :)
В какое место в моём потоке сознания прокралась ошибка и результат функции во l() втором примере оказался не тем, каким надо, и что сделать, чтобы всё закончилось хорошо?
Обновление №1
Как оказалось, умножение в поле — совсем не "просто умножить и взять остаток от деления", а целая процедура, подробно описанная в GF(256) finite field multiplication function in C#
Более того, сложение в поле GF(2^n) оказалось простым XOR'ом.
Итого для второго примера получилось:
l(a[]) = (148 * 0x94) + (1 * 0x01) = 0x91 + 0x01 = 0x90
Что в общем-то всё ещё далеко от A5
Привожу код расчёта l()
byte[] l_mul = { 1, 148, 32, 133, 16, 194, 192, 1, 251, 1, 192, 194, 16, 133, 32, 148 };
public byte l (byte[] a) { byte p = 0x00; for (int i = 0; i < 16; i++) { p ^= gf.Mul(l_mul[i], a[i]); } return p; }


Ответ

В общем, проблема была в процедуре умножения в поле. Если результат умножения полиномов получается слишком большой и не входит в GF(256), то его надо поделить на некоторый неприводимый полином.
В примере из Википедии и упомянутом ранее вопросе на Stack Overflow используется полином x^8 + x^4 + x^3 + x + 1 (100011011b = 0x11b или 0x1b), который применяется в AES.
В случае же ГОСТа из определения поля F необходимо использовать другой полином: x^8 + x^7 + x^6 + x + 1 = 0x1c3 или 0xc3. Теперь с контрольными примерами всё сходится :)
public byte MulSlow (byte a, byte b) { byte p = 0; byte counter; byte hi_bit_set; for (counter = 0; counter < 8 && a != 0 && b != 0; counter++) { if ((b & 1) != 0) p ^= a; hi_bit_set = (byte)(a & 0x80); a <<= 1; if (hi_bit_set != 0) a ^= 0xc3; /* x^8 + x^7 + x^6 + x + 1 */ b >>= 1; } return p; }

Xamarin Forms - пара вопросов про лицензию

У производителя Xamarin Forms нет представительства в России, поэтому накладную подписать некому, а по другому у нас в фирме не делается. Есть ли возможность все же как-то легально приобрести Xamarin Forms нашей фирмой? (за исключением оплаты своей частной картой) В новой бесплатной версии Visual Studio 2015 Community включен Xamarin. Но не понятно, обозначает ли это, что использование этой технологии стало бесплатным? (звучит маловероятным)


Ответ

В Visual Studio 2015 Community включен Xamarin Starter Edition
Starter Edition is our free tier, which allows anyone to get a taste of mobile development in C# by writing small app* which can be deployed to devices and published to app stores.
По сноске есть определение small app:
Apps must meet size restrictions(128k of compiled C# or F# code), include only managed code (not Objective-C/Swift, Java, or C/C++ libraries), and use Xamarin.iOS/Xamarin.Android, not Xamarin.Forms
UPD: http://www.syssoft.ru/Xamarin/ - официальный партнер-реселлер в России. Работают с юрлицами. Принимают оплату по безналу.

установка DjangoBB

Подскажите пожалуйста, как правильно установить DjangoBB?
Все делаю по мануалу https://bitbucket.org/slav0nic/djangobb/wiki/QuickInstall
И когда выполняю команду
./manage.py syncdb --all
Вылетает сообщение об ошибке:
/usr/local/lib/python2.7/dist-packages /django_haystack-2.3.1-py2.7.egg/haystack/utils/__init__.py:12: RemovedInDjango19Warning: django.utils.importlib will be removed in Django 1.9. from django.utils import importlib
Traceback (most recent call last): File "./manage.py", line 10, in execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages /Django-1.8.4-py2.7.egg/django/core/management/__init__.py", line 338, in execute_from_command_line utility.execute()
File "/usr/local/lib/python2.7/dist-packages /Django-1.8.4-py2.7.egg/django/core/management/__init__.py", line 312, in execute django.setup()
File "/usr/local/lib/python2.7/dist-packages /Django-1.8.4-py2.7.egg/django/__init__.py", line 18, in setup apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python2.7/dist-packages /Django-1.8.4-py2.7.egg/django/apps/registry.py", line 108, in populate app_config.import_models(all_models)
File "/usr/local/lib/python2.7/dist-packages /Django-1.8.4-py2.7.egg/django/apps/config.py", line 198, in import_models self.models_module = import_module(models_module_name)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module __import__(name)
File "/usr/local/lib/python2.7/dist-packages /djangobb_forum-0.0.1a0-py2.7.egg/djangobb_forum/models.py", line 48, in path = os.path.join(settings.STATIC_ROOT, 'djangobb_forum', 'themes')
File "/usr/lib/python2.7/posixpath.py", line 73, in join path += '/' + b
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 10: ordinal not in range(128)
settings.py
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
# URL prefix for static files. # Example: "http://media.lawrence.com/static/" STATIC_URL = '/static/'
# Additional locations of static files STATICFILES_DIRS = ( os.path.join(PROJECT_ROOT,'project_static'), )
# List of finder classes that know how to find static files in # various locations. STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', # 'django.contrib.staticfiles.finders.DefaultStorageFinder', )


Ответ

Изначально данное руководство было написано в средине августа 2015 и опубликовано на Stack Overflow на английском

На данный момент DjangoBB состоит из двух Git частей: 3 ветки для самого приложения (stable, default и bootstrap3) и 2 ветки для проектра (default и dimka665/*********)
1) stable/default/botstrap3 — означает DjangoBB_Forum как приложение (App). Stable ветка имеет последнюю версию кода, по этому будем использовать именно ее.
Source (Исходники)
Zip archive (тоже самое, но в архиве)
2) default — Скелет\Структура Django проекта со всеми настройками (urls.py, settings.py, templates, и тд.), которые требуются для запуска приложения 'DjangoBB_Forum'. Это ТОЛЬКО скелет\структура проекта (подобно тому, что делает Django команда ./manage.py startproject) и НЕ включает в себя DjangoBB_Forum.
Source (Исходники)
Zip archive (тоже самое, но в архиве)
Скачиваем оба архива, распаковываем их и для удобства переименовываем 2 папки, которые мы получили (обе папки имеют изначальное имя 'slav0nic-djangobb-****') в DjangoBB_App для 'stable' ветки приложения и в DjangoBB_Project для 'default' ветки проекта. (Мы собираемся объединить файлы обоих архивов)

Инсталяция.
На сегодняшний день (19.09.2015) последняя версия Django - 1.8.4. Этот мануал также 100% подходит для 1.8.2 и 1.8.3. Я не тестил более ранние версии Django. На данный момент требования у DjangoBB_Forum следующие:
Django>=1.6,<1.9 (последняя актуальная стабильная версия 1.8.4) django-haystack>=2.1.0,<2.4 (актуальная версия на время написания руководства - 2.4) Pillow>=2.1.0 (актуальная версия 2.9.0) postmarkup (актуальная версия 1.2.2) pygments (актуальная версия 2.0.2) pytz>=2015.4 (эта версия является актуальной) django-pagination-py3==1.1.1 (эта версия является актуальной) django-allauth (актуальная версия 0.23.0) django-messages (актуальная версия 0.5.1) django-nocaptcha-recaptcha (актуальная версия 0.0.18) whoosh (актуальная версия 2.7.0)

Самая большая проблема с интегрированием DjangoBB_Forum в существующий проект являются настройки, потому как они различаются от пользователя к пользователю. На примере свой структуры проекта я продемонстрирую настройки urls.py и settings.py, что поможет вам интегрировать настройки в свой проект благодаря всем необходимым объяснениями. Перед тем, как использовать настройки файла settings.py указанные ниже, вы должны изменить свои настройки Базы Данных (в секции DATABASES) на свои собственные настройки БД. Также, намного ниже вы увидите 2ой скриншот с заметками для файлов\папок, которые объясняют, что вам нужно поменять в settings.py, потому как наверняка имеете другие абсолютные пути и наверное, относительные пути тоже. Так же хочу отметить, что на скришнотах вместо файла 'settings/settings.py', вы увидите 3 других файла (default_settings.py, development.py, production.py). По этому в руководстве, когда говорится 'settings.py', подразумеваются ВАШ файл 'settings.py', независимо от того, как он у вас назван, а не один из этих 3х файлов. Изначальная структура проекта, которая готова принять к себе djangobb_forum (app_shows_and_times и app_places используются только для того, чтоб создать ощущение существующего проекта к которому мы добавляем djangobb_forum):
/src/bugaga/urls.py
"""bugaga URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.8/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Add an import: from blog import urls as blog_urls 2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) """
from django.conf.urls import * from django.conf import settings from django.contrib import admin from django.conf.urls.static import static
from djangobb_forum import settings as forum_settings from djangobb_forum.sitemap import SitemapForum, SitemapTopic
sitemaps = { 'forum': SitemapForum, 'topic': SitemapTopic, }
urlpatterns = patterns('', # Admin url(r'^admin/', include(admin.site.urls)),
# Sitemap url(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
#My_Apps url(r'^places/', include('app_places.urls')), url(r'^shows/', include('app_shows_and_times.urls')),
# DjangoBB_Forum url(r'^forum/account/', include('allauth.urls')), url(r'^forum/', include('djangobb_forum.urls', namespace='djangobb')), )
# PM Extension if (forum_settings.PM_SUPPORT): urlpatterns += patterns('', url(r'^forum/pm/', include('django_messages.urls')), )
if (settings.DEBUG): urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
/src/bugaga/settings/development.py
# -*- coding: utf-8 -*- import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
DEBUG = True TEMPLATE_DEBUG = DEBUG #print ("base dir path", BASE_DIR)
ADMINS = ( # ('Your Name', 'your_email@domain.com'), )
MANAGERS = ADMINS
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'name_of_db', 'USER': 'login_to_db', 'PASSWORD': 'pass_to_db', 'HOST': 'localhost', 'PORT': '', } }
# Internationalization # https://docs.djangoproject.com/en/1.8/topics/i18n/
# Language code for this installation. All choices can be found here: # http://www.i18nguy.com/unicode/language-identifiers.html LANGUAGE_CODE = 'ru-RU'
LANGUAGES = ( ('ca', 'Catalan'), ('cs', 'Czech'), ('de', 'German'), ('en', 'English'), ('es', 'Spanish'), ('fo', 'Faroese'), ('fr', 'France'), ('it', 'Italian'), ('lt', 'Lithuanian'), ('mn', 'Mongolian'), ('nl', 'Dutch'), ('pl', 'Polish'), ('ru', 'Russian'), ('uk_UA', 'Ukrainian'), ('vi', 'Vietnamese'), ('zh_CN', 'Chinese'), )
SITE_ID = 1
# Local time zone for this installation. Choices can be found here: # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name # although not all choices may be available on all operating systems. # If running in a Windows environment this must be set to the same as your # system time zone. TIME_ZONE = 'Europe/Kiev' USE_TZ = True
# If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. USE_I18N = True
# If you set this to False, Django will not format dates, numbers and # calendars according to the current locale USE_L10N = True
# STATIC_ROOT is where the static files get placed from STATIC_URL and STATICFILES_DIRS # when they are collected by "manage.py collectstatic". Static files are used by Apache
ginx # Don't put anything in this directory yourself; store your static files # in apps' "static/" subdirectories and in STATICFILES_DIRS. #When you’re developing using Django’s development server, you won’t have anything to do with this setting. # Example: "/home/media/media.lawrence.com/static/" STATIC_ROOT = "/home/antonio/projects/bugaga.com/static/"
# URL prefix for static files in your apps # Example: "http://media.lawrence.com/static/" STATIC_URL = '/static/'
# STATICFILES_DIRS is a setting you use to declare non app-specific static files # You can prefixes for templates, as STATICFILES_DIRS = (("downloads", "/opt/webfiles/stats"),) STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), #'/var/www/static/', )
# List of finder classes that know how to find static files in # various locations. STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', # is default; responsible for STATICFILES_DIRS 'django.contrib.staticfiles.finders.AppDirectoriesFinder', # is default; responsible for $app_name/static/ 'django.contrib.staticfiles.finders.DefaultStorageFinder', )
# Absolute filesystem path to the directory that will hold user-uploaded files. # Example: "/home/media/media.lawrence.com/media/" MEDIA_ROOT = '/home/antonio/projects/bugaga.com/media/'
# URL that handles the media served from MEDIA_ROOT. Make sure to use a trailing slash. # Examples: "http://media.lawrence.com/media/", "http://example.com/media/" MEDIA_URL = '/media/'
# SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'YOUR_SECRET_KEY GENERATED BY DJANGO'
# Make this unique, and don't share it with anybody.
if not hasattr(globals(), 'SECRET_KEY'): SECRET_FILE = os.path.join(BASE_DIR, 'secret.txt') try: SECRET_KEY = open(SECRET_FILE).read().strip() except IOError: try: from random import choice import string symbols = ''.join((string.lowercase, string.digits, string.punctuation )) SECRET_KEY = ''.join([choice(symbols) for i in range(50)]) secret = file(SECRET_FILE, 'w') secret.write(SECRET_KEY) secret.close() except IOError: raise Exception('Please create a %s file with random characters to generate your secret key!' % SECRET_FILE)
MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware',
#DjangoBB_Forum part 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.locale.LocaleMiddleware', 'pagination.middleware.PaginationMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware',
'djangobb_forum.middleware.LastLoginMiddleware', 'djangobb_forum.middleware.UsersOnline', 'djangobb_forum.middleware.TimezoneMiddleware', )
ROOT_URLCONF = 'bugaga.urls'
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # Directories where the engine should look for template source files, in search order. # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages',
#DjangoBB_Forum part 'django.template.context_processors.i18n', 'django.template.context_processors.media', 'django.template.context_processors.static',
'django_messages.context_processors.inbox', #'allauth.account.context_processors.account', #not required since v0.21.0 #'allauth.socialaccount.context_processors.socialaccount', #not required since v0.21.0
'djangobb_forum.context_processors.forum_settings', ], #DjangoBB_Forum part #'loaders': [ # 'django.template.loaders.filesystem.Loader', #is the same as DIRS [] not empty # 'django.template.loaders.app_directories.Loader', #is the same as APP_DIRS = True # 'django.template.loaders.eggs.Loader', #] }, }, ]
PREREQ_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
MY_APPS = [ 'app_places', 'app_shows_and_times', ]
DJANGOBB_APPS = [ 'django.contrib.sites', #required by django-allauth 'django.contrib.sitemaps', 'django.contrib.admindocs', 'django.contrib.humanize',
'allauth', 'allauth.account', 'allauth.socialaccount', 'allauth.socialaccount.providers.openid', #'allauth.socialaccount.providers.facebook', # at first you need to configure Facebook or # you will get Error: No Facebook app configured: please add a SocialApp using the Django admin 'allauth.socialaccount.providers.google', 'allauth.socialaccount.providers.twitter', 'allauth.socialaccount.providers.vk',
'pagination', 'haystack', 'django_messages', 'nocaptcha_recaptcha',
'djangobb_forum', ]
INSTALLED_APPS = PREREQ_APPS + MY_APPS + DJANGOBB_APPS
# A sample logging configuration. The only tangible logging # performed by this configuration is to send an email to # the site admins on every HTTP 500 error when DEBUG=False. # See http://docs.djangoproject.com/en/dev/topics/logging for # more details on how to customize your logging configuration. LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse' } }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler' } }, 'loggers': { 'django.request': { 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': True, }, } }
try: import mailer INSTALLED_APPS += ('mailer',) EMAIL_BACKEND = "mailer.backend.DbBackend" except ImportError: pass
try: import south INSTALLED_APPS += ('south',) SOUTH_TESTS_MIGRATE = False except ImportError: pass
FORCE_SCRIPT_NAME = ''
# Haystack settings HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', 'PATH': os.path.join(BASE_DIR, 'djangobb_forum/djangobb_index'), 'INCLUDE_SPELLING': True, }, } HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# Account settings ACCOUNT_ACTIVATION_DAYS = 10 LOGIN_REDIRECT_URL = '/forum/' LOGIN_URL = '/forum/account/login/' AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', 'allauth.account.auth_backends.AuthenticationBackend', )
# Cache settings CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
# Allauth ACCOUNT_LOGOUT_ON_GET = True ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_SIGNUP_FORM_CLASS = 'bugaga.forms.SignupForm'
try: from local_settings import * except ImportError: pass

Давайте представим, что у нас есть папка project_name/src гдето в Виртуальной Среде (VirtualEnvironment (вы ведь им пользуетесь? (нормально реализован как встроенное решение в Python начиная с v3.4))), которую мы будем использовать как папку проекта.
Скопируйте все содержимое из djangobb_project/basic_project/media/* в /bugaga.com/media/ Скопируйте все содержимое из djangobb_project/basic_project/templates/* в /bugaga.com/src/templates/ Скопируйте djangobb_project/basic_project/forms.py в /bugaga.com/bugaga.com/src/settings/ Скопируйте из djangobb_app/ следующее:
папку 'djangobb_forum' файл 'requirements.txt' файл 'requirements_optional.txt'
в /bugaga.com/bugaga.com/src/
Сейчас у вас должна быть следующая структура (новые вещи помечены черными стрелками)

(на всякий случай — все пункты делаем в консоли). Активируйте свою Виртуальную Среду (она же virtenv) cd '/bugaga.com/bugaga.com/src/' (тут мой путь к проекту) запустите pip install -r requirements.txt (pip, как и virtenv\venv, должен был быть уже давно установлен) pip install -r requirements_optional.txt pip install django-nocaptcha-recaptcha pip install whoosh в /bugaga.com/bugaga.com/src/ создаем файл secret.txt и прописываем любую строку текста на ваше усмотрение, к примеру 'asd423llkmasdi2' Пробуем запустить ./manage.py runsever и открыть http://127.0.0.1:8000/forum/. Возможно, вы получили ошибку вида:
settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
Это означает, что вам нужно правильно ввести настройки своей БД в /bugaga.com/bugaga.com/src/settings/settings.py. «Из коробки» (т.е по-умолчанию) у нас следующие настройки БД:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 'NAME': '', # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } }
Так как я использую PostgreSQL, предоставляю шаблон настроек для PostgreSQL:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'name_of_db', 'USER': 'login_to_db', 'PASSWORD': 'pass_to_db', 'HOST': 'localhost', 'PORT': '', } }
Если вы столкнулись с ошибкой выше, тогда скорее всего вы увидите такую ошибку:
django.db.utils.ProgrammingError: relation "djangobb_forum_forum" does not exist LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "djangobb_…
:)
Чтоб ее пофиксить, запускаем ./manage.py migrate Далее если видим такую ошибку:
django.db.utils.ProgrammingError: relation "auth_user" does not exist
-> запускаем ./manage.py migrate auth
Если такую:
psycopg2.ProgrammingError: relation "django_site" does not exist LINE 1: SELECT (1) AS "a" FROM "django_site" LIMIT 1
-> запускаем ./manage.py migrate sites
Запускаем ./manage.py migrate - эта команда смигрирует все остальные приложения\пакеты, таким образом вам не нужно мигрировать по отдельности каждое приложение\пакет. ./manage.py makemigrations ./manage.py migrate Переде тем, как вы сможете открыть в своем браузере форум, вы должны сделать аккаунт форума (./manage.py createsuperuser) иначе получите ошибку:
В браузере: User matching query does not exist.
В консоли: django.contrib.auth.models.DoesNotExist: User matching query does not exist.
Также, чтоб избежать ошибки:
ImportError: No module named 'allauth.account.context_processors'
-> открываем bugaga.com/bugaga.com/src/settings/settings.py и в секции TEMPLATE_CONTEXT_PROCESSORS комментируем (по средствам символа решетки - #) 2 линии, указанные ниже:
# 'allauth.account.context_processors.account', # 'allauth.socialaccount.context_processors.socialaccount',
Сейчас вы можете открыть свой форум, но осталась 1 проблема с языками. Чтобы ее пофиксить, переходим в /src/djangobb_forum/ и выполняем django-admin compilemessages Сейчас вы уже все сделали и можете запустить сервер ./manage.py runserver и «Добро пожаловать в DjangoBB_Forum» → http://127.0.0.1:8000/forum/

Кастомный EditText Android

Столкнулся с проблемой кастомизации нижней полосы EditText. Нужно чтобы на каждый введенный символ была отведена отдельная полоса(см. рис.)
Реализовал путем помещения EditText и ImageView в RelativeLayout и отделив пробелами подставлял введенные символы.






android:alpha="0.3" android:background="@color/black" />





Решение более чем плохое, возможно кто сталкивался с подобным злом?


Ответ

Как насчёт использования уже готовых решений?
Кажется, здесь как раз то, что Вам нужно, в стиле Material Design.
Ещё один вариант, тут. На скриншотах по умолчанию немножко не так, как Вы хотите, но судя по описанию на гитхабе, есть большие возможности по кастомизации.
При этом в обоих вариантах нет проблем с переключением фокуса при вводе.

Увидит ли Гугл rel=nofollow, который добавляется к ссылкам с помощью jquery?

На странице есть несколько ссылок. После загрузки страницы к ним добавляется атрибут rel="nofollow" с помощью jQuery. Google пойдет по этим ссылкам или он таки увидит добавленный атрибут? Я нашел несколько статей на эту тему, но очень хотелось бы ссылку на официальную доку или хотя бы на гугловский блог разработки.


Ответ

В официальных документациях этого не написано. Если бы это было достоверно известно, зачем бы авторы этого и подобных материалов проводили свои исследования? UPDATE В исследовании, проведенном в мае 2015 года было выяснено, что гугл видит nofollow в DOM. Кроме случая, когда nofollow продублирован в HTML

Помогите с выборкой записей из другого блога

Хочу вывести с другого блога все записи по рубрикам и определенные значения произвольных полей и миниатюру записи. Как это делается вообще и можно ли?
Т. е. такого вида
[Рубрика] [миниатюра записи] [название и линк] [дата записи] [произвольное значение] [произвольное значение] ...
[Рубрика] ...
Понятно, что через wpdb, но как будет выглядеть SELECT запрос? Не хочется городить из нескольких запросов, а одним запросом не понимаю, как сделать.


Ответ

Для того чтобы решить данную задачу с помощью одного SELECT запроса достаточно использовать обычный INNER JOIN
Вот пример выборки названия, даты публикации и содержимого записей конкретной рубрики из базы данных WordPress. Сразу оговорюсь, данные этим запросом в своё время выбирались не для использования на сайте под этой CMS. Поэтому $wpdb в нём не фигурирует.
SELECT `post_title`,`post_date`, `post_content` FROM `wp_terms` AS `t1` INNER JOIN `wp_term_taxonomy` AS `t2` ON t1.term_id=t2.term_id INNER JOIN `wp_term_relationships`AS t3 ON t2.term_taxonomy_id=t3.term_taxonomy_id INNER JOIN `wp_posts` AS t4 ON t4.ID=t3.object_id WHERE t2.taxonomy='category' AND t1.term_id=1;
В прочем, полагаю, данный пример и так достаточно наглядно пояснят суть решения и Вы сможете доработать его под свои цели.
На всякий случай, ссылка на описание БД WordPress в официальной документации.