• Какой алгоритм подойдет для описания полета насекомого?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Можно сделать цепочку преследования: к случайной точке тянется одна, к ней другая, и т.д., а последняя – муха.

    Очередную точку ставить на плоскости случайно, в любом месте внутри допустимой области. Эта точка – цель, к которой стремится следующая, невидимая точка: каждый следующий кадр её координаты изменяются на k * векторИзТекущегоПоложения-в-Цель:
    x = x + k * (xTarget - x);
    y = y + k * (yTarget - y);

    Так «преследователь» замедляется, по мере приближения к цели, никогда её не достигая.

    Эта невидимая точка – не одна. К ней, как к цели, стремится следующая. К той ещё одна. Наконец, сама муха по этому закону стремится к хвосту этой цепи - очередной точке.

    Чем больше звеньев в такой цепи, тем плавнее получается кривая. При приближении мухи к цели ближе, чем на D, генерится следующая случайная цель.

    Сделал рабочий пример.

    Можно поменять алгоритм и сделать, скажем, линейную скорость постоянной. Или случайно варьировать параметры k и D – от этого поменяется скорость и траектория от плавной ближе к ломаной.
    Ответ написан
    Комментировать
  • Какие есть хорошие источники по паттернам проектирования?

    qlkvg
    @qlkvg
    python backend developer
    https://github.com/pkolt/design_patterns
    Наиболее полное собрание примеров на питоне
    Ответ написан
  • Как бороться с шарингом аккаунта?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Четвёртая ссылка в гугле:
    from django.conf import settings
    from django.core.cache import cache, get_cache
    from django.utils.importlib import import_module
    
    class UserRestrictMiddleware(object):
        def process_request(self, request):
            """
            Checks if different session exists for user and deletes it.
            """
            if request.user.is_authenticated():
                cache = get_cache('default')
                cache_timeout = 86400
                cache_key = "user_pk_%s_restrict" % request.user.pk
                cache_value = cache.get(cache_key)
    
                if cache_value is not None:
                    if request.session.session_key != cache_value:
                        engine = import_module(settings.SESSION_ENGINE)
                        session = engine.SessionStore(session_key=cache_value)
                        session.delete()
                        cache.set(cache_key, request.session.session_key, 
                                  cache_timeout)
                else:
                    cache.set(cache_key, request.session.session_key, cache_timeout)
    Ответ написан
    3 комментария
  • Как построить иерархию sqlite и сам алгоритм реализации идеи?

    devspec
    @devspec
    Помогло? Отметь решением
    Забудьте о глобальных переменных.
    Сделайте две таблицы. Первая - дерево (tree).
    id   | name           | parent_id
    1    | Спорт          | null
    2    | Футбол         | 1
    3    | Чемпионат РФПЛ | 2

    Вторая - данные (data).
    id   |   tree_id  | data
    1    |   3        | Инфа о чемпионате РФПЛ

    Пользователю показывайте инфу из "дерева"и давайте выбрать категорию, когда выберет - показывайте данные, соответствующие категории:
    select * from data where tree_id=3
    Ответ написан
    Комментировать
  • Как сделать у формы django поле "disabled" прямо в template?

    Это можно сделать в форме. Да и то, саму логику стоит писать во view. Сначала передать форме аргумент, который определяет, делать ли поля disabled. А затем, уже в форме, проставлять атрибуты полям.

    class MyView(...):
        form_class = MyForm
    
        def get_form_kwargs(self, ...):   # название метода условно, не уверен, что он так называется в generic views и даже что он есть :)
            kwargs = super(MyView, self).get_form_kwargs(...)
            kwargs.update({'disabled': not self.request.user.has_perm(...)})
            return kwargs
    
    class MyForm(...):
        def __init__(self, *args, **kwargs):
            is_disabled = kwargs.pop('disabled')
            super(MyForm, self).__init__(*args, **kwargs)
    
            if is_disabled:
                self.fields['foo'].widget.attrs.update({'disabled': 'disabled'})
    Ответ написан
    1 комментарий
  • Можно ли скомпилировать программу на go для запуска на машине без установленного go?

    @gaxetasok
    1. На разных операционных системах - свои правила.
    2. Когда ты компилируешь, не указывая где будешь использовать - тебе компилирует под ту операционную систему, на которой ты и запускаешь компилятор.
    3. В такой ситуации как у тебя нужно явно указывать на какой операционной системе ты собираешься запускать программу.
    4. Это называется кросс-компиляция. Ищи в интернете по этому слову.
    5. Тебе здорово повезло, что ты имеешь дело с Go, в противном случае пришлось бы иметь дело со специальными dev-истралляциями и/или тулчейнами.
    6. Тебе нужно выставить 2 переменные среды окружения - GOOS=linux и GOARCH=amd64, то есть указать формат создаваемого файла. А затем запускать компилятор.
    Ответ написан
    1 комментарий
  • Для чего нужен random.seed(x) python?

    LazyTalent
    @LazyTalent
    Data Engineer, Freelancer
    Все дело в том, что в Питоне, как и в любом другом языке, используется т.н. генератор псевдо случайных чисел. Т.е. random выдает не случайное число, а число которое вычисляется алгоритмом на осное другого числа, по умолчанию это текущее время. random.seed позволяет изменить число, которое передается в random для генерации случайного числа, а т.к. "случайные" числа выдаются одним и тем же алгоритмом, то при одинаковом параметре в random.seed будут и одинаковые "случайные" числа.
    >>> import random
    >>> ['%.2f' % random.random() for i in range(10)]
    ['0.21', '0.66', '0.18', '0.48', '0.86', '0.46', '0.48', '0.04', '0.67', '0.37']
    >>> 
    >>> ['%.2f' % random.random() for i in range(10)]
    ['0.90', '0.68', '0.02', '0.90', '0.63', '0.06', '0.22', '0.14', '0.97', '0.68']
    >>> 
    >>> random.seed(5)
    >>> ['%.2f' % random.random() for i in range(10)]
    ['0.62', '0.74', '0.80', '0.94', '0.74', '0.92', '0.03', '0.47', '0.94', '0.65']
    >>> 
    >>> random.seed(5)
    >>> ['%.2f' % random.random() for i in range(10)]
    ['0.62', '0.74', '0.80', '0.94', '0.74', '0.92', '0.03', '0.47', '0.94', '0.65']
    Ответ написан
    4 комментария
  • Как правильно организовать использование JS в шаблонах Django?

    @ns5d
    нечего сказать
    Как вариант:
    html:
    <div id="p1" style="display:none">value1</div>
     <div id="p2" style="display:none">value2</div>
     <div id="p3" style="display:none">value3</div>

    js:
    var p1 = $("#p1").text();
    var p2 =  $("#p2").text();
    var p3 =  $("#p3").text();
    Ответ написан
    Комментировать
  • Django. Как защитить форму от множественной отправки?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    class FloodSafeMixin(object):
        def __init__(self, *args, **kwargs):
            request = kwargs.pop('request', None)
            if request:
                self._user = request.user.username if request.user.is_authenticated() else None
                self._ip = get_ip(request)
                self._period = OrderedDict()
                self._period['days'] = kwargs.pop('days', None)
                self._period['hours'] = kwargs.pop('hours', None)
                self._period['minutes'] = kwargs.pop('minutes', None)
                self._period['seconds'] = kwargs.pop('seconds', None)
                self._period['milliseconds'] = kwargs.pop('milliseconds', None)
                if not any(self._period.values()):
                    self._period = {'minutes': 1}
                else:
                    self._period = OrderedDict([(k, v) for k, v in self._period.items() if v])
            else:
                self._ip = None
            super(FloodSafeMixin, self).__init__(*args, **kwargs)
    
    
        def clean(self):
            cleaned_data = super(FloodSafeMixin, self).clean()
            sender_id = hashlib.md5((self._user if self._user else self._ip).encode('utf-8')).hexdigest()
            if sender_id:
                class_name = self.__class__.__name__
                cache_name = 'last-submit.{0}.{1}'.format(class_name, sender_id)
    
                now = datetime.now()
                last_submit = cache.get(cache_name, now - timedelta(days=1))
                if (now - last_submit) < timedelta(**self._period):
                    cache.set(cache_name, now)
                    period = ' '.join([u'{0} {1}'.format(v, _p('genitive', k)) for k, v in self._period.items()])
                    raise forms.ValidationError(_('Form submitted less than %(period)s ago'), code='flood',
                        params={'period': period})
                else:
                    if not self.errors:
                        cache.set(cache_name, now)
            return cleaned_data
    
    
    class FeedbackForm(FloodSafeMixin, forms.Form):
        ...
    
    
    class SomeFormHandlerView(FormView):
        def get_form_kwargs(self):
            kwargs = super(GenericFormHandlerView, self).get_form_kwargs()
            kwargs['request'] = self.request
            kwargs['minutes'] = 2
            return kwargs
        ...
    Ответ написан
    Комментировать
  • NGINX - как привязать все микросервисы, запущенные на разных портах, к одному домену без поддоменов?

    @Wexter
    location ^~ /api/v1/auth {
        proxy_pass http://127.0.0.1:8000;
        include proxy_params;
    }
    location ^~ /api/v1/catalog {
        proxy_pass http://127.0.0.1:8001;
        include proxy_params;
    }
    Ответ написан
    Комментировать
  • Провалил тестовое задание DrWeb. В чем косяк?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Главное, ваша программа не выполняет именно главного - копирования! move - перемещение.
    shutil.move(input_path+name, output_path+name)
    Надо или shutil.copy или shutil.copy2
    Ответ написан
    2 комментария
  • Как организовать хранение файлов на сервере?

    @marazmiki
    Укротитель питонов
    Правильно ли я понимаю что для хранение файлов их нужно разбивать по папкам,

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

    Проблемы, про которые Вы могли слышать, связаны лишь с получением полного списка файлов в директории. Да, это долго и тормознуто, но никак не влияет на скорость чтения конкретного файла.

    А на боевых серверах использование хранилища в локальной файловой системе и вовсе нонсенс. Там эта проблема не стоит в принципе.

    Сегментацию можно сделать для, скажем так, красоты. Или чтобы было понятно, кому принадлежит тот или иной файл. Но практическая польза от неё сомнительна. Вреда, впрочем, тоже нет :)

    допустим на сервер пользователь с Ником username заливает файл file.mp4, и я сохраняю этот файл по пути u/us/use/user/usern/file.mp4 и такой путь формируется для каждого пользователя

    Опять неправильно.

    Во-первых, никогда, НИКОГДА не доверяйте данным, пришедшим от пользователя. Сохраняете загруженный файл – сгенерируйте имя сами. А оригинальное имя не возбраняется сохранить и в другом месте. Если понадобится дать возможность пользователю сохранить файл под оригинальным именем, это делается в несколько строк.

    Во-вторых, Ваша сегментация слишком агрессивная. Если представить, что юзернейм может состоять только из строчных латинских букв и цифр (итого алфавит 26+10=36 символов), то такое хранилище сможет вместить 36 ^ (1 + 2 + 3 + 4 + 5) = 36^15 = 2.21 * 10^23 файлов без повторений. А что если юзернейм короче 5 символов? А что если он переименуется?

    Помните "во-первых"? Так как нам нужно самим придумать имя файла, почему бы не воспользоваться либо UUID и сгенерировать уникальное (с высокой достоверностью) значение вида 28c5a6d8-f7b5-440f-aeaa-150e4fd0bebc, а его уже сегментировать? Например, два сегмента по два символа датут прикольные ссылки вида 28/c5/28c5a6d8-f7b5-440f-aeaa-150e4fd0bebc и возможность разместить 65 тысяч файлов так, чтобы они были по одной штуке в директории :)

    Есть также вариант использовать не UUID, а посчитать контрольную сумму файла и взять её в качестве имени. Практическая ценность такого хеша, правда, тоже стремится к нулю :)

    если будет 2 одинаковых названия файла у одного пользователя то просто добавляю к новому файлу номер (file1.mp4)

    Если речь идёт о Джанге, то она сама так делает, это штатная функция хранилища.
    Ответ написан
    1 комментарий
  • Существует ли плагин для Woocommerce - купи 5 раз и на 5-тый раз получи подарок?

    ILoveYAnny
    @ILoveYAnny Автор вопроса
    1) Качаем https://srd.wordpress.org/plugins/first-order-discount/

    2) Правим код плагина ( у меня тут ещё +10% скидка для зарегестрированных пользователей)
    function first_order_add_fee() {
    	global $wpdb, $woocommerce;
    	if ( is_user_logged_in() ) {
    		$customer_id = get_current_user_id();
    		$orderNumCheck = wc_get_customer_order_count( $customer_id ); // count orders by current customer
    		$options = get_option( 'first_order_add_settings' );
    		$discountType = $options['first_order_choose'];
    		$discountValue = $options['first_order_add_value'];
    		$subtotal = WC()->cart->cart_contents_total;
    		$discount = $discountValue/100;
    	    
    		$check5order = $orderNumCheck + 1;
    		
    		if ($check5order % 5 == 0) {
    		
    			    $product_id = 1802;
    				$found = false;
    				//check if product already in cart
    				if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
    					foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
    						$_product = $values['data'];
    						if ( $_product->id == $product_id )
    							$found = true;
    					}
    					// if product not found, add it
    					if ( ! $found )
    						WC()->cart->add_to_cart( $product_id );
    				} else {
    					// if no products in cart, add it
    					WC()->cart->add_to_cart( $product_id );
    				}
    		}
    		
    		WC()->cart->add_fee( 'Скидка 10%', -$subtotal*$discount );
    		
    	}
    }
    
    function add_custom_price( $cart_object ) {
        foreach ( $cart_object->cart_contents as $key => $value ) {
    		if ($value["product_id"] == "1802") {
    			$currPrice = $value['data']->price;
    			$currQuant = $value["quantity"];
    			$totalPrice = $currPrice * $currQuant;
    			$salePrice = $totalPrice - $currPrice;
    			$salingPrice = $salePrice/$currQuant;
    			$value['data']->price = $salingPrice;
    		}
        }
    }
    
    add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
    add_action( 'woocommerce_cart_calculate_fees','first_order_add_fee' );
    Ответ написан
    Комментировать
  • Best practice для подтверждения мейла при регистрации?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Ответ на Вопрос №1: оно вам надо? Если юзер просрал доступ к почте и оттуда кто-то левый пошел по ссылке, то это проблема юзера.
    Ответ на Вопрос №2: определенно стоит ставить срок. Я, например, час-два ставлю. Если регистрируется нормальный юзер, то он сразу идет и подтверждает. А вот тем, кто вовремя не подтвердил, можете напомнить о себе через день-неделю-месяц, а потом удалить нафиг )))
    UPD
    Ответ на Вопрос №3: вполне приемлемо.
    Ответ написан
    4 комментария
  • Ести ли обязательный набор документов на коммерческое ПО?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    В данном случае, лучше обратиться к юристу.
    Поскольку кроме того, что вы узнаете что нужно делать - это все равно нужно будет делать, так зачем бегать два раза?
    Ответ написан
    Комментировать
  • Философский вопрос про скидочные купоны?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    где можно глянуть пример подобного проекта ??...

    Проекта? Тут решение в одну строку

    import random, string
    random.seed()
    '-'.join((''.join([random.choice(string.uppercase + string.digits) \
        for x in range(4)]) for y in range(4)))

    >> '58F4-U8R4-4DTV-5JMP'
    Ответ написан
    5 комментариев
  • Философский вопрос про скидочные купоны?

    @Nwton
    Что за разработчики пошли, чтобы решить задачу в 2 строки, им нужны какие-то библиотеки: https://jsfiddle.net/rLr7kc4z/1/
    Ответ написан
    1 комментарий
  • Upwork возврат мудаку денег и его связь с jss и звездами отзыва?

    Jump
    @Jump
    Системный администратор со стажем.
    Клиент имеет право поставить вам любой отзыв - это его право, и только его.
    Вы не имеете никакого права указывать клиенту какой он отзыв должен поставить - максимум что можете сделать это вежливо попросить, и не удивляться если вам откажут.

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