LINUX.ORG.RU

Сообщения VirRaa

 

Имитация освещения в течении суток (светодиоды)

Форум — Talks

Всем привет.

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

  1. Утро (фактически белый свет) - rgb(255, 255, 255), яркость - 150;
  2. День (бело-желтый) - rgb(255, 255, 204), яркость - 255 (максимум);
  3. Вечер (желто-красный (предположим, что это закат)) - rgb(255, 102, 0), яркость - 150;
  4. Ночь (сине-жельтый) - rgb(0, 102, 204), яркость - 100;

Таким образом, получается что:

  1. Функция смены утра на день, просто увеличивает яркость и B, линейно со временем.
  2. Функция смена дня на вечер, уменьшает G и B, снижает яркость.
  3. Функция смены вечера на ночь - снижает R и увеличивает B, снижает яркость.
  4. Функция смены ночи на утро - увеличивает RGB и яркость.

Есть опасение, что переходные цвета (которые допустим будут получаться из поминутного увеличения/уменьшения отдельных параметров R, G, B) будут неестественными.

Как правильно оформить переходы между опорными точками, чтобы складывалось ощущение естественного освещения на протяжении всего дня?

С какой стороны подходить к этой задаче, может кто-нибудь подсказать? Экспериментально свои предположения еще не тестировал, планирую заняться этим завтра, но голова забита этим вопросом.

 , , ,

VirRaa
()

Возможны ли такие блокировки 80-го порта?

Форум — Admin

Всех приветствую.

Поднял на digital ocean сервер. Накатил nginx. Всё отлично, всё работает. Потом решил поделиться ссылкой на свежеподнятый ресурс в телеграм, туда попытался сходить telegrambot, и всё. После этого ресурс по 80-му порту не отвечает. При этом, если пытаться открыть его в обход (через прокси, анонимайзеры, впн), то всё отлично работает. Напрямую работать перестал. Однако, если nginx перевесить на любой другой порт, то опять же - работает, так же работает и ssh на 22-м порту.

Стал разбираться в вопросе, попробовал посмотреть, что мне скажет:

$ sudo tcpdump -nvvi any dst port 80
И, как ни странно, но пакеты какие-то приходят. Что-то в этом духе:
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:41:47.776241 IP (tos 0x8, ttl 49, id 0, offset 0, flags [DF], proto TCP (6), length 64)
    79.xxx.xxx.121.63073 > 206.189.14.89.80: Flags [S], cksum 0xa6bf (correct), seq 3691586037, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 410217700 ecr 0,sackOK,eol], length 0
10:41:48.028833 IP (tos 0x8, ttl 49, id 0, offset 0, flags [DF], proto TCP (6), length 64)
    79.xxx.xxx.121.63074 > 206.189.14.89.80: Flags [S], cksum 0xd905 (correct), seq 2828804640, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 410217951 ecr 0,sackOK,eol], length 0
10:41:48.780835 IP (tos 0x8, ttl 49, id 0, offset 0, flags [DF], proto TCP (6), length 64)
    79.xxx.xxx.121.63073 > 206.189.14.89.80: Flags [S], cksum 0xa2d7 (correct), seq 3691586037, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 410218700 ecr 0,sackOK,eol], length 0
10:41:49.034858 IP (tos 0x8, ttl 49, id 0, offset 0, flags [DF], proto TCP (6), length 64)
    79.xxx.xxx.121.63074 > 206.189.14.89.80: Flags [S], cksum 0xd51d (correct), seq 2828804640, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 410218951 ecr 0,sackOK,eol], length 0
10:41:49.783256 IP (tos 0x8, ttl 49, id 0, offset 0, flags [DF], proto TCP (6), length 64)
    79.xxx.xxx.121.63073 > 206.189.14.89.80: Flags [S], cksum 0x9eef (correct), seq 3691586037, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 410219700 ecr 0,sackOK,eol], length 0
10:41:50.035957 IP (tos 0x8, ttl 49, id 0, offset 0, flags [DF], proto TCP (6), length 64)
    79.xxx.xxx.121.63074 > 206.189.14.89.80: Flags [S], cksum 0xd135 (correct), seq 2828804640, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 410219951 ecr 0,sackOK,eol], length 0
10:41:50.786591 IP (tos 0x8, ttl 49, id 0, offset 0, flags [DF], proto TCP (6), length 64)
    79.xxx.xxx.121.63073 > 206.189.14.89.80: Flags [S], cksum 0x9b07 (correct), seq 3691586037, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 410220700 ecr 0,sackOK,eol], length 0
10:41:51.038744 IP (tos 0x8, ttl 49, id 0, offset 0, flags [DF], proto TCP (6), length 64)
    79.xxx.xxx.121.63074 > 206.189.14.89.80: Flags [S], cksum 0xcd4d (correct), seq 2828804640, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 410220951 ecr 0,sackOK,eol], length 0
10:41:51.792429 IP (tos 0x8, ttl 49, id 0, offset 0, flags [DF], proto TCP (6), length 64)
    79.xxx.xxx.121.63073 > 206.189.14.89.80: Flags [S], cksum 0x971f (correct), seq 3691586037, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 410221700 ecr 0,sackOK,eol], length 0
10:41:52.044462 IP (tos 0x8, ttl 49, id 0, offset 0, flags [DF], proto TCP (6), length 64)
    79.xxx.xxx.121.63074 > 206.189.14.89.80: Flags [S], cksum 0xc965 (correct), seq 2828804640, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 410221951 ecr 0,sackOK,eol], length 0
10:41:52.799409 IP (tos 0x8, ttl 49, id 0, offset 0, flags [DF], proto TCP (6), length 64)
    79.xxx.xxx.121.63073 > 206.189.14.89.80: Flags [S], cksum 0x9337 (correct), seq 3691586037, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 410222700 ecr 0,sackOK,eol], length 0
И так бесконечно, пока бразуер не скажет, что не смог подключиться. Если посмотреть то же самое, но через VPN:
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:42:52.250145 IP (tos 0x0, ttl 55, id 0, offset 0, flags [DF], proto TCP (6), length 64)
    185.125.168.87.63104 > 206.189.14.89.80: Flags [SEW], cksum 0x913b (correct), seq 2722778500, win 65535, options [mss 1360,nop,wscale 5,nop,nop,TS val 410281830 ecr 0,sackOK,eol], length 0
10:42:52.311618 IP (tos 0x0, ttl 55, id 0, offset 0, flags [DF], proto TCP (6), length 52)
    185.125.168.87.63104 > 206.189.14.89.80: Flags [.], cksum 0xaab8 (correct), seq 2722778501, ack 3348941576, win 4128, options [nop,nop,TS val 410281891 ecr 99226], length 0
10:42:52.312449 IP (tos 0x2,ECT(0), ttl 55, id 0, offset 0, flags [DF], proto TCP (6), length 512)
    185.125.168.87.63104 > 206.189.14.89.80: Flags [P.], cksum 0xecd7 (correct), seq 0:460, ack 1, win 4128, options [nop,nop,TS val 410281891 ecr 99226], length 460: HTTP, length: 460
	GET / HTTP/1.1
	Host: www.some-domain.com
	User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0
	Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
	Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
	Accept-Encoding: gzip, deflate
	Connection: keep-alive
	Upgrade-Insecure-Requests: 1
	If-Modified-Since: Mon, 23 Apr 2018 10:34:20 GMT
	If-None-Match: "5addb6ac-f"
	Cache-Control: max-age=0
	
10:42:52.373373 IP (tos 0x0, ttl 55, id 0, offset 0, flags [DF], proto TCP (6), length 52)
    185.125.168.87.63104 > 206.189.14.89.80: Flags [.], cksum 0xa7ef (correct), seq 460, ack 188, win 4122, options [nop,nop,TS val 410281948 ecr 99241], length 0
Т.е. всё отлично срабатывает и никаких зацикливаний.

Собственно вопрос, в чём же дело? Как можно локализовать проблему?

На всякий случай:

$ netstat -plutn
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -               
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -               
tcp6       0      0 :::22                   :::*                    LISTEN      -               
tcp6       0      0 :::80                   :::*                    LISTEN      -           

 , ,

VirRaa
()

Синтаксис crontab'a

Форум — Admin

Привет любителям создавать распиания в кронтабе!

Есть у меня скрипт. Он принимает один параметр on иди off. Так вот мне надо его включать на 5 минут, а затем выключать, И так, по одному разу в 20 минут.

То есть, прошло 20 минут - включаем, прошло 5 минут - выключаем, прошло 20 минут - включаем, и т.д.

Можно ли это элегантно реализовать кроном?

 

VirRaa
()

Проблемы с переменными окружения при вызове процессов из скетча Arduino Yun

Форум — General

Всем привет!

Даже не смог подобрать верный раздел для этого вопроса. Но это, думаю, не так уж и важно. Важна сама проблема. Есть у меня Arduino Yun, это где и arduino, и linux-машинка, в одной коробке. Так вот вызываю я питоновский скрипт из скетчка ардуинки:

  Process sensor_log;
  sensor_log.begin("python");
  sensor_log.addParameter("/mnt/sda1/test.py");

  sensor_log.run();
  
  while (sensor_log.available() > 0) {
    char c = sensor_log.read();
    Console.print(c);
  }

И всё работает отлично, пока в питоне скрипте всего лишь:

print(123)
Но как только мне нужно использовать sqlite3, и я пытаюсь его импортить, то всё перестаёт работать. Причем без видимых ошибок и предупреждений, просто sensor_log.read() ничего не возвращает. Я подозреваю, что проблема в переменных окружения. Для того, чтобы успешно заимпортить sqlite3, нужно установить LD_LIBRARY_PATH, иначе библиотчека не найдется. А вот от какого пользователя и с какими переменными окружения запускает скрипт arduino - я хз.

На борту стоит linino (openwrt), и я подумал, может быть можно, как-то перманентно захардкодить эту переменную для всех пользователей? Но при этом прописав в /etc/environment, всё равно ничего не происходит.

Есть какие-нибудь идеи?

 

VirRaa
()

Оффтоп: что за игра?

Форум — Talks

Супонев ранее обозревал игры, в лохматых 90-х годах. Так вот запала мне в память игра, название который я не могу вспомнить, не могу найти в инете никакой информации по этой игре.

Общая информация, которую я помню, следующая:

Главные герои: негр, баба и робот. Возможно робота зовут Кейси (выглядел как летающий глаз). Так же, возможно, главные герои достаточно часто произносили фразу «Кейси, помоги!» и робот начинал помогать в чем-то по сюжету. Это всё, что я помню. Разве что, ещё стоит сказать, что это была одна из первых 3D игр, со вставками видео роликов.

Заранее спасибо за помощь.

 

VirRaa
()

PKCS1_OAEP шифрование и расшифровка в python 3

Форум — Development

Всем привет.

Пытаюсь реализовать следующий алгоритм криптографии: https://habrahabr.ru/post/265309/

        data = 'test'

        # Подпись сообщения цифровой подписью
        gateway_private_key_file = open('{0}{1}'.format(GCryptHelper.get_keys_directory(), 'gateway_private_key.pem'), 'rb')
        gateway_private_key = RSA.importKey(gateway_private_key_file.read())
        data_hash = SHA.new(data)
        signature = PKCS1_v1_5.new(gateway_private_key)
        signature = signature.sign(data_hash)

        # Шифрование подписи открытым ключем принимающей стороны
        gcrypt_public_key_file = open('{0}{1}'.format(GCryptHelper.get_keys_directory(), 'gcrypt_public_key.pem'), 'rb')
        gcrypt_public_key = RSA.importKey(gcrypt_public_key_file.read())
        cipher_rsa = PKCS1_OAEP.new(gcrypt_public_key)
        signature = cipher_rsa.encrypt(signature[:128]) + cipher_rsa.encrypt(signature[128:])

        # Генерирование сеансовго ключа и шифрование данных
        session_key = Random.new().read(32)
        i_vector = Random.new().read(16)
        obj = AES.new(session_key, AES.MODE_CFB, i_vector)
        cipher_data = i_vector + obj.encrypt(data)

        # Шифрование сеансового ключа открытым ключем принимающей стороны
        cipher_session_key = cipher_rsa.encrypt(session_key)
        gcrypt_private_key_file = open('{0}{1}'.format(
            GCryptHelper.get_keys_directory(),
            'gcrypt_private_key.pem'
        ), 'rb')
        session_key = cipher_rsa.decrypt(cipher_session_key)

В самом конце, где идёт попытка расшивровать session_key - я получаю ошибку:

Traceback (most recent call last):
  File "/Users/Vir/Work/Gateway/app/system/helpers/gcrypt/gcrypt.py", line 100, in <module>
    GCryptHelper.encrypt('test')
  File "/Users/Vir/Work/Gateway/app/system/helpers/gcrypt/gcrypt.py", line 42, in encrypt
    print(cipher_rsa.decrypt(cipher_session_key))
  File "/Users/Vir/Work/Envs/gateway/lib/python3.5/site-packages/Crypto/Cipher/PKCS1_OAEP.py", line 189, in decrypt
    modBits = Crypto.Util.number.size(self._key.n)
AttributeError: 'bytes' object has no attribute 'n'

В чем дело? Я понимаю, что decrypt принимает строку, но при попытке сделать cipher_rsa.decrypt(cipher_session_key.decode()), получаю ошибку:

Traceback (most recent call last):
  File "/Users/Vir/Work/Gateway/app/system/helpers/gcrypt/gcrypt.py", line 100, in <module>
    GCryptHelper.encrypt('test')
  File "/Users/Vir/Work/Gateway/app/system/helpers/gcrypt/gcrypt.py", line 42, in encrypt
    session_key = cipher_rsa.decrypt(cipher_session_key.decode())
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x95 in position 0: invalid start byte

 ,

VirRaa
()

Шифрование директории с помощью ключа

Форум — General

День добрый.

Сразу же прошу прощения за оффтоп, на линухах никогда не испытвал с этим проблем, спасибо cryptsetup, luks и т.п.

Необходимо шифровать директорию, причем не паролем, а ключом. И ключ этот будет находится на носителе. Может сможет кто подсказать, как это реализовать в OS X El Captain.

Заранее благодарен.

 ,

VirRaa
()

Совместимость интерпретатора с библиотеками

Форум — Admin

Всем привет.

У меня из коробки, в убунте, стоит python2.7. Появилась необходимость в библиотеке OpenSSL, которую я поставил с помощью apt-get install python-openssl.

Она установилась в /usr/local/bin/python2.7/dist-packages/OpenSSL. Но при этом, директория не находится, по умолчанию, в sys.path. Я её добавил с помощью sys.path.insert(1, /usr/local/bin/python2.7/dist-packages/) и библиотека начала находится при import'е, однако возникла следующая ошибка:

>>> import OpenSSL
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/__init__.py", line 8, in <module>
    from OpenSSL import rand, crypto, SSL
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/rand.py", line 11, in <module>
    from OpenSSL._util import (
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/_util.py", line 6, in <module>
    from cryptography.hazmat.bindings.openssl.binding import Binding
  File "/usr/local/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.py", line 13, in <module>
    from cryptography.hazmat.bindings._openssl import ffi, lib
ImportError: /usr/local/lib/python2.7/dist-packages/_cffi_backend.so: undefined symbol: PyUnicodeUCS4_AsASCIIString
Я так понимаю, что это несовместимость библиотеки с интерпретатором. Т.к. питон установлен с UCS2, а библиотека рассчитывает на UCS4. Как можно безболезненно выйти из ситуации?

 , ,

VirRaa
()

Шифрование данных с помощью SSL-сертификата (с закидоном)

Форум — Admin

Всем привет.

Есть вопрос, или просьба о совете, или указать на best practice. В общем, нужно шифровать некие данные с помощью SSL-сертификата, который расшифровывается ключом, а ключ в свою очередь расшифровывается мастер-ключем. Причем, желательно, чтобы этот мастер-ключ лежал, например, на шифрованной виртуалке.

Есть какое-нибудь готовое решение, позволяющее делать подобное, ну или мануал (how to) какой-нибудь.

В общем, в какую сторону двигаться, комрады?

 ,

VirRaa
()

Импорт модулей и кэш в питоне, или что это?

Форум — Development

Всем привет.

Есть модуль One (в виде файла), в нем несколько классов, пусть это будут: A и B. Спустя какое-то время, я добавляю в One третий класс C. Так вот при попытке импортировать класс, я получаю ImportError. А в списке доступных классов/методов (извлеченного из dir(One)) класса C вообще нет. Я подумал, может это кеш? Удалил One.pyc, оставил только One.py. Но проблема не решилась. Что это может быть?

from Models.One import C
ImportError: cannot import name C
import Models.One as One
print dir(One)
['A', 'B']

print One
<module 'Models.One' from '/home/user_dir/project/Models/One.pyc'>

Сам модуль One:

class A(object):
    pass

class B(object):
    pass

class C(object):
    pass

 , ,

VirRaa
()

Шифрование директории или раздела с помощью ключа на USB носителе (флешке)

Форум — Admin

Всем привет.

Скажите, есть ли какие-нибудь простые способы зашифровать раздел (или отдельно взятую директорию), а ключ для расшифровки вынести на флешку?

P.S. Ubuntu 15.04

 ,

VirRaa
()

Asus K551 + Ubuntu 14.04 не заводится wi-fi

Форум — Desktop

Всем привет.

Собственно сабж. В инете нарыл следущее:

echo "options asus_nb_wmi wapf=4" | sudo tee /etc/modprobe.d/asus.conf

Выполнил. Ребутнулся. Лампочка с wi-fi загорелась, но толку нет, беспроводные сети не появляются.

 , ,

VirRaa
()

Услуги DNS-балансировки

Форум — Admin

День добрый.

Подскажите, существуют ли на данный момент сервисы предоставляющие услуги DNS-балансировки? Чтобы не поднимать и не настраивать это всё самостоятельно.

 ,

VirRaa
()

Кастомизация создания объекта в админке

Форум — Web-development

Всем привет.

Столкнулся со следующей проблемой. Есть два объект и связь «many to many» между ними. Реализовал стандартными способами Django, с использованием «through».

class Product(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField(max_length=1000)
    categories = models.ManyToManyField(Category, related_name='products')

    def __unicode__(self):
        return self.title


class Specification(models.Model):
    title = models.CharField(max_length=255)
    products = models.ManyToManyField(Product, through='ProductSpecification', related_name='specifications')

    def __unicode__(self):
        return self.title


class ProductSpecification(models.Model):
    product = models.ForeignKey(Product)
    specification = models.ForeignKey(Specification)
    value = models.CharField(max_length=255)

    class Meta:
        unique_together = (('product', 'specification'),)

    def __unicode__(self):
        return '{0} ({1})'.format(self.product.title, self.specification.title)

Каким макаром дать возможность создавать и добавлять «спецификации» к продукту из стандартной админки, при создании продукта?

При попытке внести в admin.py следующее:

class ProductAdmin(admin.ModelAdmin):
    fields = ['categories', 'title', 'description', 'specifications']

admin.site.register(Product, ProductAdmin)

Получаю ошибку: Unknown field(s) (specifications) specified for Product. Check fields/fieldsets/exclude attributes of class ProductAdmin.

 ,

VirRaa
()

Странный ld: cannot find -lc

Форум — Admin

В попытке поставить runit, на CentOS release 6.3 (Final), сталкиваюсь со следующей проблемой:

~/runit/admin/runit-2.1.2# ./package/install
Linking ./src/* into ./compile...
Compiling everything in ./compile...
+ cd compile
+ exec make
./load runit unix.a byte.a -static
/usr/bin/ld: cannot find -lc
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [runit] Ошибка 1

Я так понимаю ему нужна libc, и она есть у меня:

~/runit/admin/runit-2.1.2# find / -name libc.so
/usr/lib64/libc.so

В чем может быть проблема?

 ,

VirRaa
()

HTTPS (with ssl) сервер на Python

Форум — Web-development

День добрый. Есть вот такой самописный веб-сервер на питоне:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import SimpleHTTPServer, BaseHTTPServer, ssl, cgi
from bootstrap import Bootstrap
from GatewayResponse.GatewayResponseService import GatewayResponseService


class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        return

    def do_POST(self):
        post = {}

        if 'Content-Type' in self.headers:
            form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={
                    'REQUEST_METHOD': 'POST',
                    'CONTENT_TYPE': self.headers['Content-Type'],
                }
            )

            for item in form.list:
                post[item.name] = item.value

        self.bootstrap(post)
        return

    def bootstrap(self, data):
        b = Bootstrap(data)
        b.start()
        response = GatewayResponseService(b.response, 'json')
        b.end()

        self.send_response(200)
        self.send_header('content-type', response.getContentType())
        self.end_headers()
        self.wfile.write(response.getPackedAnswer())

httpd = BaseHTTPServer.HTTPServer(('localhost', 4443), ServerHandler)
httpd.serve_forever()

Всё работает отлично. НО! Как сделать из него HTTPS? Полазив по интернетам, наткнулся на много туториалов. Но все они сводятся к использованию подобной строчки перед httpd.server_forever()

httpd.socket = ssl.wrap_socket(httpd.socket,
                               server_side=True,
                               certfile='./cert.crt')
httpd.serve_forever()

Такой сервер запускается, но не реагирует ни на какие запросы. Более того, даже если ему указать несуществующий путь на сертификат, то он и словом не обмолвится.

Может сможете помочь и подсказать, в чём может быть дело?

P.S. Python 2.7.8

 , ,

VirRaa
()

SQLAlchemy - не строится схема

Форум — Web-development

Всем привет.

Пытаюсь начать использовать вышеуказанную ORM. Описываю модель.

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Boolean, ForeignKey

Base = declarative_base()


class Gateway(Base):
    __tablename__ = 'gateway'

    id = Column(Integer, autoincrement=True, primary_key=True)
    implementation = Column(String, nullable=False)
    marker_active = Column(Boolean, nullable=False, default=False)

Что я делаю не так?

Так вот, по документации, если я сделаю

print Gateway.__table__
Я должен увидеть, что-то очень похожее на это, но для моей модели
>>> User.__table__ 
Table('users', MetaData(bind=None),
            Column('id', Integer(), table=<users>, primary_key=True, nullable=False),
            Column('name', String(), table=<users>),
            Column('fullname', String(), table=<users>),
            Column('password', String(), table=<users>), schema=None)

 , ,

VirRaa
()

Помогите написать правила для rewrite_mod (apache)

Форум — Web-development

Всем привет.

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

1. Необходимо правило, которое при переходе в корень, то бишь (http://www.example.com или http://www.example.com/) был редирект на http://www.example.com/#!/

2. Необходимо правило, которое при наличие в URL определенной строки (http://www.example.com/?foo=bar) был редирект на http://www.second.com/?foo=bar. Отмечу, что это только тогда, когда в исходном урле есть foo.

 , ,

VirRaa
()

Django, tornado, redis и websocket'ы

Форум — Web-development

Всем привет.

Пытаюсь скрестить django + tornado, в видео связки между ними - redis.

Поднимаю tornado-сервер, который слушает определенный порт, к которому и подрубается клиент с помощью websocket'ов.

Из django путем push-сообщений общаюсь с tornado, который слушает определенные сообщения и реагирует на них.

Примерно так (используется библиотека tornado-redis):

from django.conf import settings
from tornado.websocket import WebSocketHandler
import tornado
import json
import tornadoredis

class HardwareTorsockHandler(WebSocketHandler):
    @tornado.gen.engine
    def listen_redis(self):
        self.redis_client = tornadoredis.Client(
            host        = settings.SOCK_REDIS_HOST,
            port        = settings.SOCK_REDIS_PORT,
            password    = settings.SOCK_REDIS_PASSWORD,
            selected_db = settings.SOCK_REDIS_DB
        )

        self.redis_client.connect()

        yield tornado.gen.Task(self.redis_client.subscribe, [
            'pong'
        ])

        self.redis_client.listen(self.on_redis_queue)

    def on_redis_queue(self, message):
        if message.kind == 'message':
            message_body = json.loads(message.body)

            if message.channel == 'pong':
                self.on_pong(message_body)

    def open(self):
        self.storage = HardwareTorsockStorage()
        self.listen_redis()

    def on_pong(self, message):
        self.storage.getConnection(message['code']).write_message(message)

    def on_message(self, message):
        message = json.loads(message)

        if (message['command'] == 'set_code'):
            self.storage.setConnection(message['code'], self)

    def on_close(self):
        print 'Websocket closed'

    def check_origin(self, origin):
        return True

class HardwareTorsockStorage():
    _instance    = None
    _connections = {}

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(HardwareTorsockStorage, cls).__new__(cls, *args, **kwargs)

        return cls._instance

    def setConnection(self, code, socketHandler):
        if code not in self._connections:
            self._connections

 = socketHandler

        return True

    def getConnection(self, code):
        if code not in self._connections:
            return False

        return self._connections

Как можно видеть из кода, каждое соединение складывается в storage, для того, чтобы была возможность отправлять сообщения клиентам выборочно.

Проблема в том, что все «клиенты» подписаны на push-сообщение «pong». Не смотря на то, что вместе с pong'ом приходит код, по которому я идентифицирую клиента, которому отослать данные, происходит это столько раз, сколько есть активных соединений.

Т.е. есть 10 подключенных клиентов, и я даю команду отправить одному из них pong. Pong отправляется только ему, но зато 10 раз.

Может подскажите, как этого избежать?

 , , ,

VirRaa
()

Django и кастомные команды для manage.py

Форум — Web-development

Всем привет.

Использую Django 1.7.1 и пытаюсь создать собственную консольную команду для manage.py

Всё делаю по инструкции. В подключенном (в settings.py) приложении создаю необходимые директории, в каждой из которых пустой __init__.py

managment/
├── commands
│   ├── cuscom.py
│   └── __init__.py
└── __init__.py

Сам код cuscom.py:

from django.core.management.base import NoArgsCommand

class Command(NoArgsCommand):
    def handle_noargs(self, **options):
        self.stdout.write('Hello world!')

Ну и результат попытки запустить эту команду:

./manage.py cuscom
Unknown command: 'cuscom'
Type 'manage.py help' for usage.

В чём может быть дело? Ещё раз повторюсь, приложение (app) подключено в settings.py (INSTALLED_APPS)

 ,

VirRaa
()

RSS подписка на новые темы