• Один connect при старте или connect-fetch-close при необходимости?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Используй пул соединений. В asyncpg он поддерживается.

    В доке есть
    Ответ написан
    1 комментарий
  • Разница между двумя датами в днях на питоне?

    RusTech
    @RusTech
    42
    Ответ написан
    Комментировать
  • Столкнулся с непонятным - откуда лишние 00000002?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Ответ написан
    Комментировать
  • Как создать свой каскад для распознавания объектов?

    Vindicar
    @Vindicar
    RTFM!
    Я создавал лабораторную по этой теме, могу привести инструкцию.
    1. Загрузите набор утилит opencv(гугл-диск, но я советую поискать самостоятельно), в частности opencv_createsamples и opencv_traincascade, а также необходимые им DLL-библиотеки. Распакуйте их в рабочий каталог в корне диска, без русских букв и пробелов в названии. Здесь и далее предполагается, что C:\MyDirName - ваш рабочий каталог.
    2. Подготовьте фото вашего объекта. Используйте контрастный объект без движущихся частей, и желательно не дающий бликов. Для этой цели хорошо подходят логотипы.
    3. Подготовьте отрицательные примеры (не менее 100 изображений). Для этого можно снять короткое видео помещения, затем написать программу, которая разделяет это видео на отдельные кадры. Рекомендуется поместить их в отдельный подкаталог negatives.
    4. Подготовьте файлы, содержащие список файлов в этом каталоге. Их можно сгенерировать следующей парой команд в терминале:
      dir C:\MyDirName\negatives\*.jpg /B /S >C:\MyDirName\negatives\negatives_abs.txt

      dir C:\MyDirName\negatives\*.jpg /B >C:\MyDirName\negatives\negatives_rel.txt

    5. Создайте пустые подкаталоги C:\MyDirName\positives и C:\MyDirName\training. Поместите ваше изображение - положительный пример в каталог C:\MyDirName\ и назовите его positive.jpg. В качестве положительного примера желательно разместить ваш объект на светлом фоне, если он тёмный, и наоборот.
    6. Сгенерируйте положительные примеры с помощью утилиты opencv_createsamples. Команда будет выглядеть примерно следующим образом:
      C:\MyDirName\opencv_createsamples.exe -info positives\info.lst -img positive.jpg -bg negatives\negatives_rel.txt -maxxangle 0.1 -maxyangle 0.1 -maxzangle 0.1 -bgcolor 0 -bgthresh 0 -w 50 -h 50 -num 100

      Параметры:
      -info - выходной файл.
      -img - входное изображение - положительный пример
      -bg - фоновые изображения. Положительный пример будет наложен на них (в оттенках серого).
      -max?angle - допустимые углы поворота примера. Утилита выполнит перспективное преобразование примера перед наложением.
      -bgcolor и -bgthresh задают яркость (среднее и диапазон изменения) для "прозрачного цвета". Например, если ваш объект на белом фоне, задайте эти параметры равными 240 и 15 (диапазон яркости 225-255). Задав оба параметра равными 0, вы отключите эту функцию и все цвета будут непрозрачными.
      -w и -h задают минимальный размер для размещаемой копии вашего образца.
      -num - количество примеров, которые стоит генерировать. Не должно превышать количество изображений в каталоге.
      Утилита должна вывести ряд сообщений вида "Open background image", а в конце вывести "Done".
    7. Сгенерируйте vec файл следующей командой:
      C:\MyDirName\opencv_createsamples.exe -info positives\info.lst -num 100 -w 20 -h 20 -vec positives\positives.vec

      где info.lst был сгенерирован в ходе пункта 6.
      -w и -h задают минимальный размер для объекта, распознаваемого в ходе работы каскада.
      -num - количество сгенерированных примеров. Столько же, сколько и в пункте 6.
    8. Проведите обучение каскада с помощью утилиты opencv_traincascade. Команда будет иметь примерно следующий вид:
      C:\MyDirName\opencv_traincascade.exe -data training -vec positives\positives.vec -bg negatives\negatives_abs.txt -numStages 100 -numPos 100 -numNeg 100 -featureType haar -w 20 -h 20 -minHitRate 0.999 -maxFalseAlarmRate 0.4 -precalcValBufSize 4048 -precalcIdxBufSize 4048 -numThreads 24 -acceptanceRatioBreakValue 10e-5

      -data - каталог для рабочих данных, который вы создали в пункте 5.
      -vec - индекс, который был создан в пункте 7.
      -bg - файл со списком отрицательных примеров (используйте абсолютные пути!)
      -numPos и -numNeg - количество положительных примеров (пункт 6) и отрицательных примеров (пункт 3).
      -numStages - максимальное количество этапов каскада. Итоговый каскад может содержать меньшее количество этапов.
      -featureType - определяет тип признаков. Признаки Хаара обучаются медленнее, но зато более точны.
      -w и -h задают минимальный размер для объекта, распознаваемого в ходе работы каскада. Должны строго совпадать с заданными в пункте 7.
      -minHitRate и -maxFalseAlarmRate задают качество работы одного каскада.
      -acceptanceRatioBreakValue определяет момент, когда каскад перестаёт обучаться.
      -precalcValBufSize и -precalcIdxBufSize задают потребление памяти процессом.
      -numThreads определяет число рабочих потоков.
    9. По итогам обучения в каталоге training должен появиться файл cascade.xml, который можно загружать так же, как типовые каскады, поставляемые с opencv. Обратите внимание, что если вы хотите запустить обучение с начала, нужно очистить содержимое каталога training, иначе утилита будет дообучать существующий каскад.
    Ответ написан
    5 комментариев
  • Не подключается PostgreSQL на psycopg2. Что делать?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Проблема не с PostgreSQL и не с psycopg2, проблема с кодом. Вероятно язык вы тоже учили по видео, поэтому незнакомы с областями видимости переменных.
    Ответ написан
    3 комментария
  • Не могу авторизоваться через selenium?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Не могу авторизоваться через selenium?

    Нет, не можете.
    Ответ написан
    2 комментария
  • Как организовать деплой с GitHub?

    MvcBox
    @MvcBox
    Software Engineer [C/C++/JS(for Node.js)/etc]
    Если очень очень кратко, то:

    1. Идете на https://github.com/username/repo_name/settings/keys , жмете "Add deploy key"
    Добавляете публичный ключ своего сервера, на который собираетесь деплоить (его можно посмотреть выполнив на сервере что-то типа: cat ~/.ssh/id_rsa.pub )

    2. Идете в директорию с проектами на своем сервере и выполняете:
    git clone git@github.com:username/repo_name.git

    3. Идете на https://github.com/username/repo_name/settings/hoo... и создаете свой хук, который будет дергаться при коммитах

    P. S.
    "username" и "repo_name" заменить на свои
    Ответ написан
    Комментировать
  • Как повесить обработчик событий только на элемент, без дочерних?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Отменить всплытие события в обработчике клика дочернего элемента с помощью event.stopPropagation()
    document.querySelector('.close').addEventListener('click', function(e){
      e.stopPropagation()
      document.querySelector('.result').insertAdjacentHTML('beforeend', '<div>Close</div>');
    });


    Либо в обработчике делать проверку на то, на каком конкретно элементе произошёл клик.
    Ответ написан
    1 комментарий
  • Как убрать лишние знаки?

    Vindicar
    @Vindicar
    RTFM!
    Ещё один не выучил основы языка, но пытается работать с БД.

    fectchone() возвращает кортеж, в твоём случае кортеж с одним элементом. Скобки - это строковое представление кортежа. Как вытащить значение из кортежа - читай по ссылке.

    Кортежи, списки и словари - это вообще азы языка. Их надо знать, и узнавать с первого взгляда.
    Ответ написан
    Комментировать
  • Можно ли, взяв произвольную точку ширины слайдера input range в пикселях, узнать какое значение value в этой точке?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Там же линейная интерполяция:
    value = 1000 + 135 * (15000 - 1000) / 180 = 11500

    Но это не учитывает сокращение диапазона пикселей из-за толщины «рукоятки» слайдера — а это уже зависит от стилей, платформы, браузера, положения Венеры в Марсе.

    Так выглядит range slider в крайнем правом положении в Mozilla Firefox 106 под Mac Os X:
    635fc7bb742cb744029407.pngширина 150px в масштабе 170%. Сверху точно той же ширины div с тёмной заливкой. CodePen.

    Слайдер почему-то смещен на неск. пикселей правее div'а, но длина точно такая же.
    Кнопка ездит, не вылезая за края диапазона. Значит, фактический диапазон пикселей меньше, чем сам слайдер.
    Ответ написан
    3 комментария
  • Как сделать блок, пропорциональный своей высоте?

    @cssfish
    Плохое знание основ - причина больших бед
    1. aspect-ratio хорошо конечно, но поддержка пока не очень.
    2. способ с паддингом (т.н. padding hack) действительно работает только отталкиваясь от ширины, а от высоты - не получится.
    3. решение - использовать САМЫЙ древний способ - с картинкой :) Ведь картинка имеет ratio, следовательно может "раздвинуть" вложенный блок так, как нам нужно.

    Для этого создаем в графическом редакторе ПУСТОЙ файл с нужным соотношением сторон. Например, если нам нужно ratio 1:2, то можно создать файл как размером 1px*2px так и 100px*200px, разница будет только в размере файла (я создал png 1px*2px, размером 76 байт).

    Далее делаем разметку
    <div class="out">
      <div class="in">
       <img src="test_img.png" alt="">
      </div>
    </div>


    и стили
    .out {
    			position: relative;
    			width: 200px;
    			height: 100px;
    			background: #000;
    		}
    		.in {
    			position: absolute;
    			top: 0;
    			bottom: 0;
    			height: 100%;
    			right: 10%;
    			background: red;
    		}
    		.in img {
    			display: block;
    			height: 100%;
    			width: auto;
    		}


    общая идея - в relative внешний блок вкладываем absolute вложенный, растягиваем его по высоте, и как-то его по ширине позиционируем (я использовал right: 10%;. Ширину не указываем - ее сформирует img, который блочный и тоже растянут по высоте (смасштабирован к текущему блоку).

    Все, теперь габариты обертки можно менять как угодно, вложенный блок всегда имеет фиксированное соотношение сторон :)

    p.s.
    - картинку можно потом перевести в data:uri прямо на странице чтоб внешние файлы не грузить
    - пробовал еще грузить картинку через псевдоэлемент.in:before { content: url("test_img.png"); } но это не работает - картинка грузится, но не масштабируется как надо.

    Возможно, это как-то решается, не знаю.
    Ответ написан
    1 комментарий
  • Как объединить в проверке (if call.data == '') несколько параметров?

    Vindicar
    @Vindicar
    RTFM!
    if call.data == 'apple' or 'melon':    #Вот в этом месте проблема

    Ещё один ботописатель с этой проблемой. Вот откуда такое упорное желание дословно переводить с русского на питон?

    Правильно:
    if call.data in ('apple', 'melon'):
    Ну или так:
    if call.data == 'apple' or call.data == 'melon':

    То, что ты написал, расшифровывается как
    if (call.data == 'apple') or ('melon' != ''):
    что эквивалентно
    if (call.data == 'apple') or True:
    А x or True всегда даст True, так же как x and False всегда даст False.
    Так что получается в итоге
    if True:

    Учи основы языка - потом уже берись за ботов.
    Ответ написан
    1 комментарий
  • Как элементы массива сделать значениями объекта?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Мое решение:

    let arr = ['a', 'b', 'c', 'd', 'e'];
    let obj = {};
    for (let i = 0; i <= arr.length; i++) {
    obj[i + 1] += arr;
    }
    console.log(obj);


    Ну Вы были относительно близко.
    1. Зачем Вы делаете += ? Вы же не плюсуете к чему то, а назначаете значение. То есть
    - obj[i + 1] += arr;
    + obj[i + 1] = arr;

    2. Зачем Вы прибавляете весь arr, когда Вам нужен элемент массива, а не весь массив. То есть:
    - obj[i + 1] = arr;
    + obj[i + 1] = arr[i];

    3. Цикл выполнится 6 раз, так как у Вас от нуля до длины массива - 5. То есть, 0,1,2,3,4,5. Вместо этого можно начать с 1, и в итоге тогда:
    let arr = ['a', 'b', 'c', 'd', 'e'];
    let obj = {};
    for (let i = 1; i <= arr.length; i++) {
    obj[i] = arr[i-1];
    }
    console.log(obj);


    Ну и как уже сказали выше, можно через reduce. Тогда будет значительно короче:
    let arr = ['a', 'b', 'c', 'd', 'e'];
    let obj = arr.reduce((a, c, i) =>  (a[i+1] = c, a), {});
    console.log(obj);
    Ответ написан
    Комментировать
  • Какую прочитать книгу по джанго?

    fox_12
    @fox_12 Куратор тега Django
    Расставляю биты, управляю заряженными частицами
    Для продвинутого изучения Джанго можно порекомендовать два ресурса:
    https://docs.djangoproject.com/ и django
    Ответ написан
    Комментировать
  • Как сделать перекрытие элементов в зависимости от ширины блока?

    @cssfish
    Плохое знание основ - причина больших бед
    общий принцип:
    1) обертки карт делаем нулевой ширины, сами карты внутри центрируем
    2) обертка для всех карт - паддинги по бокам на пол-карты, flex + space-between

    все, вложится идеально. если border и прочее то box-sizing по вкусу.
    сделал пример, вместо обертки карт использовал сами карты как обертки, псево внутри для отображения карты.

    <!doctype html>
    <html lang="ru">
    <head>
    	<meta charset="utf-8">
    	<title>Document</title>
    	
    	<style>
    		.cards {
    			width: 60%;
    			border: 2px solid red;
    			margin: 10px auto;
    			
    			display: flex;
    			justify-content: space-between;
    			padding: 0 45px;
    		}
    		.card {
    			flex-shrink: 0;
    			
    			position: relative;
    			width: 0;
    			height: 126px;
    			transition: 0.3s;
    			cursor: pointer;		
    		}
    		.card:before {
    			content: "";
    			box-sizing: border-box;
    			position: absolute;
    			top: 0;
    			left: -45px;
    			width: 90px;
    			height: 100%;
    			background-color: blue;
    			border-style: inset;
    			border-radius: 10px;		
    		}
    		.card:hover{
    			transform: translate(0, -20px);
    		}	
    	
    	</style>
    </head>
    <body>
    	
    	<div class="cards">
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    	</div>
    
    	<div class="cards">
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    		<div class="card"></div>
    	</div>
    	
    	
    </body>
    </html>


    upd:
    правда, центрирования не будет )

    С центрированием будет, если:
    • space-evenly
    • width: 90 для карточек и отриц отступы
    • margin: auto для всех карточек или крайних только

    но все эти решения дают плавающие боковые промежутки :(
    Ответ написан
    2 комментария
  • Как получить последовательное выполнение async функций?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Где return в actionpl? Оно ничего не возвращает у тебя, что в случае с async значит пустой Promise.
    Ответ написан
    1 комментарий
  • Как сделать русское лото?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    нужен рандом без повторений. Как вариант, сделать массив из всех доступных чисел 1..99, и каждый раз вынимать случайно выбранное число из массива — так точно повторов не будет.

    // массив 1..99
    const range = Array(99)
      .fill()
      .map((_, i) => i + 1); // массив 1..99
    
    // 6 неповторяющихся выигрышных
    const win = Array(6)
      .fill()
      .map(() => range.splice(Math.floor(Math.random() * range.length), 1).pop())
      .sort((a, b) => a - b);
    
    // [ 1, 55, 69, 76, 91, 92 ]
    Для выбора выпавших чисел игрока этот же range уже использовать нельзя – в нём не хватает 6 чисел.
    Ответ написан
    5 комментариев
  • Как с помощью python вшить информацию в музыку?

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

    iiiBird
    @iiiBird Куратор тега CSS
    Пока ты спишь - твой конкурент совершенствуется
    1) при клике создаешь под курсором div. он должен быть круглым и нужного тебе цвета.
    2) после этого запускаешь анимацию transform scale для этого дива.
    3) выбираешь время анимации и анализируешь когда этот круг займет все пространство.
    4) и с таймаутом этого выбранного времени закрашиваешь body в нужный цвет у удаляешь круг
    Ответ написан
    5 комментариев