Страницы

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

среда, 26 февраля 2020 г.

Для чего нужна “@” в location'е (NGINX)?

#nginx #docker #microservices


Объясните пожалуйста, для чего применяется символ @ внутри конфигурационного файла
nginx при указании пути и о чем говорит данный кусок кода:

location @web {
  proxy_pass http://web:3000;
}

    


Ответы

Ответ 1



Префикс “@” задаёт именованный location. Такой location не используется при обычной обработке запросов, а предназначен только для перенаправления в него запросов. Такие location’ы не могут быть вложенными и не могут содержать вложенные location’ы. Документация

Зачем выносить стили в head?

#html #css #вёрстка #style


Знаю что есть такая практика, когда некие части CSS кода выносятся в . Я так
понимаю, что это на случай если файл стилей не загрузится. Но какие именно части нужно
выносить, и нужно ли вообще это делать?
    


Ответы

Ответ 1



Если вы проверяли ваш сайт через PageSpeed Insights, то должны были заметить, одной из рекомендаций есть Убрать js или css который блокирует рендеринг страницы Поскольку браузер выполняет все последовательно, он сначала будет загружать стили подключенные в head, а после продолжит рендерить страницу. Данный способ приемлем когда есть большая скорость интернета, но если она низкая мы не увидим страницу до загрузки стилей. Поэтому, их рекомендуют загружать после, а в head добавить базовые стили через тег style, которые позволят воспринимать содержимое страницы до полной загрузки всех файлов. Как пример, можно спрятать картинки,svg, рекламные блоки или ограничить их размер.

Ответ 2



Если стили будут внизу, то покажется сначала сайт БЕЗ CSS. Потом они загрузятся и выйдет не очень. Писать в head это мировая практика.

Ответ 3



Стили можно загрузить почти в любой момент. Размещение в HEAD обусловлено тем, что так их проще найти. Встречал в практике случаи загрузки стилей в конце страницы (можно считать в подошве). Из-за этого сайты начинали "плыть" после полной загрузки.

Как поснимать checkbox

#html #python_3x #selenium #selenium_webdriver #xpath


Имеется Чек Бокс вот такого вида, как на него нажать, при помощи, Python + Selenium?    



    


Ответы

Ответ 1



Альтернативный, более лаконичный, и, кстати, быстрый способ нахождения этого элемента - это "by css selector": checkbox = browser.find_by_css_selector("input[testid=ns-chbox]") checkbox.click()

Ответ 2



checkbox1 = browser.find_element_by_xpath("//input[@testid='ns-chbox']") checkbox1.click()

std::includes работает неправильно

#cpp #алгоритм


Почему программа выводит 0? В описании функции сказано Returns true if the sorted
range [first1,last1) contains all the elements in the sorted range [first2,last2).http://www.cplusplus.com/reference/algorithm/includes/.
Но a содержит все элементы из b (1 и 2)

std::vector a{1, 2};
std::vector b{1, 2, 1, 2};

std::cout << std::includes(a.begin(), a.end(), b.begin(), b.end());

    


Ответы

Ответ 1



std::vector a{1, 2}; // тут вы забыли аргумент шаблона std::vector b{1, 2, 1, 2}; Поменяйте местами обьекты, и все заработает std::swap(a, b); std::cout << std::includes(a.begin(), a.end(), b.begin(), b.end()); если b является подмножеством a, то получите положительный результат

Ответ 2



Здесь по сути проверяется, входит ли диапазон полностью в другой диапазон, а не вычисляется разность множеств. Поэтому одинаковые элементы вполне допустимы (как в мультимножестве), и диапазона a явно не хватает для включения диапазона b. А вот наоборот - вполне: проверьте сами std::cout << std::includes(b.begin(), b.end(), a.begin(), a.end()); но не забудьте отсортировать :) Другими словами, a является подмножеством b, но b не является подмножеством a - хотя бы потому, что в нем больше элементов :)

Как сделать параллакс фоновой картинки между двумя текстовыми блоками?

#javascript #jquery #css #css3


Есть 2 блока с текстом и посередине фоновая картинка. 

Как сделать так, чтобы картинка была зафиксирована и при прокрутке страницы уходила
(пряталась) вверх под блок, т.е. по сути с параллакс эффектом и наоборот возвращалась
обратно при возвращении наверх? 



#center {
  background: url("https://bipbap.ru/wp-content/uploads/2017/04/72fqw2qq3kxh.jpg")
no-repeat center center;
  background-size: cover;
  width: 100%;
  height: 500px;
}
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,


Ответы

Ответ 1



background-attachment: fixed caniuse: #center { background: url("https://bipbap.ru/wp-content/uploads/2017/04/72fqw2qq3kxh.jpg") no-repeat center center; background-size: cover; width: 100%; height: 500px; background-attachment: fixed; }
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
www.w3schools.com jquey parallax.js

@author в начале кода

#python #python_3x


Я в инстаграме подписан на некоторые паблики по пайтону и там время от времени выкладывают
интересные коды по нему. Почти в каждом примере встречается данная запись

@author python.learning
'''Pass for example'''
import pymongo
...


Объясните, что это за @author, пробовал найти информацию в интернете, корректного
ответа не нашёл
    


Ответы

Ответ 1



epydoc - Документирование исходного кода в самом коде с использованием аннотаций (аналог JavaDoc для Java) http://epydoc.sourceforge.net """ @param x: This is a description of the parameter x to a function. Note that the description is indented four spaces. @type x: This is a description of x's type. @return: This is a description of the function's return value. It contains two paragraphs. """

Почему не обновляется виджет с чатом QListWidget?

#python #python_3x #pyqt5 #pyqt


Есть такой код, для простоты лишнее не привожу. После авторизации срабатывает метод
getChat и выводится виджет с сообщениями, которые берутся из базы. В другом потоке
отправляются запросы на сервер каждую секунду и в консоли вижу, что нужный словарь
с данными при отправке нового сообщения как и нужно обновляется и возвращается в переменной
rs. Далее пытаюсь перерисовать виджет с сообщениями, наверное это нужно делать в методе
on_request, но не получается. Прошу подсказать, ума не приложу, как это реализовать. 

from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtCore import QThread
import requests
import json
import time

colors = ['#1f3a93', '#26a65b']

class ThreadClass(QThread):
    about_response = QtCore.pyqtSignal(object)

    def __init__(self, url: str):
        super().__init__()
        self.url = url

    def run(self):
        while True:
            try:
                rs = requests.post(self.url)
                self.about_response.emit(rs)

            except Exception as e:
                print('Error:', e)

            finally:
                time.sleep(3)

class MyWindow(QtWidgets.QWidget):

    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)

        self.url_base = 'http://127.0.0.1:5000/'
        self.main_id = 0
        self.res_usr = {}
        self.chat_obj = QtWidgets.QListWidget


        url = self.url_base + 'blog/chat'

        self.thread_class = ThreadClass(url)
        self.thread_class.about_response.connect(self.on_response)
        self.thread_class.start()

        self.title = QtWidgets.QLabel('Авторизация')
        self.title.setAlignment(QtCore.Qt.AlignHCenter)

        self.username = QtWidgets.QLineEdit()
        self.username.setPlaceholderText('Введите логин:')
        self.password = QtWidgets.QLineEdit()
        self.password.setPlaceholderText('Введите пароль:'),
        self.password.setEchoMode(QtWidgets.QLineEdit.Password)
        self.btnLogin = QtWidgets.QPushButton("&OK")

        self.lnkReg = QtWidgets.QPushButton('&Регистрация')

        self.vbox = QtWidgets.QVBoxLayout()
        self.vbox.addWidget(self.title)
        self.vbox.addWidget(self.username)
        self.vbox.addWidget(self.password)
        self.vbox.addWidget(self.btnLogin)
        self.vbox.addWidget(self.lnkReg)

        self.setLayout(self.vbox)
        self.btnLogin.clicked.connect(self.authorisation)
        self.lnkReg.clicked.connect(self.switchToRegistration)

    def on_response(self, rs):
        res_u = rs.text
        res_pst = json.loads(res_u)
        print(res_pst)
        self.chat_obj = QtWidgets.QListWidget(self)
        for key, value in res_pst.items():
            item = QtWidgets.QListWidgetItem(self.chat_obj)
            item.setText(value[0] + ': ' + value[1])
            if value[2] == self.main_id:
                item.setTextAlignment(QtCore.Qt.AlignRight)
                item.setForeground(QtGui.QColor(colors[0]))
            else:
                item.setTextAlignment(QtCore.Qt.AlignLeft)
                item.setForeground(QtGui.QColor(colors[1]))
            self.chat_obj.addItem(value[0] + ': ' + value[1])
        self.chat_obj.repaint()



    def switchToRegistration(self):
        """
        Переключение на регистрацию
        """
        window.resize(300, 200)
        self.clearLayout(self.vbox)

        self.title = QtWidgets.QLabel('Регистрация')
        self.title.setAlignment(QtCore.Qt.AlignHCenter)

        self.username = QtWidgets.QLineEdit()
        self.username.setPlaceholderText('Введите логин:')
        self.password = QtWidgets.QLineEdit()
        self.password.setPlaceholderText('Введите пароль:'),
        self.password.setEchoMode(QtWidgets.QLineEdit.Password)
        self.btnReg = QtWidgets.QPushButton("&OK")

        self.lnkAutor = QtWidgets.QPushButton('&Авторизация')

        self.vbox.addWidget(self.title)
        self.vbox.addWidget(self.username)
        self.vbox.addWidget(self.password)
        self.vbox.addWidget(self.btnReg)
        self.vbox.addWidget(self.lnkAutor)

        self.setLayout(self.vbox)
        self.btnReg.clicked.connect(self.registration)
        self.lnkAutor.clicked.connect(self.switchToAuthorisation)


    def switchToAuthorisation(self):
        """
        Переключение на авторизацию
        """
        window.resize(300, 200)
        self.clearLayout(self.vbox)

        self.title = QtWidgets.QLabel('Авторизация')
        self.title.setAlignment(QtCore.Qt.AlignHCenter)

        self.username = QtWidgets.QLineEdit()
        self.username.setPlaceholderText('Введите логин:')
        self.password = QtWidgets.QLineEdit()
        self.password.setPlaceholderText('Введите пароль:'),
        self.password.setEchoMode(QtWidgets.QLineEdit.Password)
        self.btnAutor = QtWidgets.QPushButton("&OK")

        self.lnkReg = QtWidgets.QPushButton('&Регистрация')

        self.vbox.addWidget(self.title)
        self.vbox.addWidget(self.username)
        self.vbox.addWidget(self.password)
        self.vbox.addWidget(self.btnLogin)
        self.vbox.addWidget(self.lnkReg)

        self.setLayout(self.vbox)
        self.btnAutor.clicked.connect(self.authorisation)
        self.lnkReg.clicked.connect(self.switchToRegistration)


    def authorisation(self):
        """
        Авторизация
        """
        url = self.url_base + 'auth/login'
        data = {'username': self.username.text(), 'password': self.password.text()}
        r = requests.post(url, json=data)

        res_u = r.text
        #print(res_u)
        res_usr = json.loads(res_u)
        #print(res_usr['status'])
        if res_usr['status'] == 'ok':
            self.main_id = res_usr['id']
            #print(self.main_id)
            self.getChat()
        elif res_usr['status'] == 'no':
            self.showError(res_usr)


    def registration(self):
        """
        Регистрация
        """
        url = self.url_base + 'auth/register'
        data = {'username': self.username.text(), 'password': self.password.text()}
        r = requests.post(url, json=data)

        res_u = r.text
        #print(res_u)
        res_usr = json.loads(res_u)
        if res_usr['status'] == 'ok':
            self.switchToAuthorisation()
        elif res_usr['status'] == 'no':
            self.showError(res_usr)


    def clearLayout(self, layout):
        """
        Очистка окошка
        """
        for i in reversed(range(layout.count())):
            layout.itemAt(i).widget().setParent(None)


    def showError(self, res_usr):
        """
        Показать ошибки
        """
        self.label = QtWidgets.QLabel(res_usr['error'])
        self.label.setAlignment(QtCore.Qt.AlignHCenter)
        self.vbox.addWidget(self.label)

    def showSuccess(self, res_usr):
        """
        Показать успех
        """
        self.label = QtWidgets.QLabel(res_usr['success_msg'])
        self.label.setAlignment(QtCore.Qt.AlignHCenter)
        self.vbox.addWidget(self.label)

    def getChat(self):
        window.resize(300, 400)
        self.clearLayout(self.vbox)

        self.label = QtWidgets.QLabel('Чат')
        self.label.setAlignment(QtCore.Qt.AlignHCenter)
        self.vbox.addWidget(self.label)

        url = self.url_base + 'blog/chat'
        r = requests.post(url)
        print(r.status_code, r.reason)
        print(r.request.headers)

        res_u = r.text
        res_pst = json.loads(res_u)
        #print(res_pst)

        self.chat_obj = QtWidgets.QListWidget(self)
        for key, value in res_pst.items():
            item = QtWidgets.QListWidgetItem(self.chat_obj)
            item.setText(value[0] + ': ' + value[1])
            if value[2] == self.main_id:
                item.setTextAlignment(QtCore.Qt.AlignRight)
                item.setForeground(QtGui.QColor(colors[0]))
            else:
                item.setTextAlignment(QtCore.Qt.AlignLeft)
                item.setForeground(QtGui.QColor(colors[1]))
        #self.chat_obj.addItem(value[0] + ': ' + value[1])

        self.vbox.addWidget(self.chat_obj)

        self.message = QtWidgets.QLineEdit()
        self.message.setPlaceholderText('Введите сообщение')
        self.vbox.addWidget(self.message)

        self.btnSend = QtWidgets.QPushButton("&Отправить")
        self.vbox.addWidget(self.btnSend)
        self.btnSend.clicked.connect(self.sendmessage)


    def sendmessage(self):
        """
        Отправка сообщения
        """
        print(self.main_id)
        url = self.url_base + 'blog/create/{}'.format(self.main_id)
        data = {'message': self.message.text()}
        #print(data)
        r = requests.post(url, json=data)

        #print(r.status_code, r.reason)
        #print(r.request.headers)

        res_m = r.text
        #print(res_m)
        res_usr = json.loads(res_m)
        if res_usr['status'] == 'ok':
            self.showSuccess(res_usr)
        elif res_usr['status'] == 'no':
            self.showError(res_usr)

        self.message.clear()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.setWindowTitle("Простой Мессенжер")
    window.resize(300, 200)
    window.show()
    sys.exit(app.exec_())


Вот код серверной части, тот, который отвечает за формирование чата:

from flask import (
Blueprint, flash, g, redirect, render_template, request, url_for
)
from werkzeug.exceptions import abort

from flaskr.auth import login_required
from flaskr.db import get_db
import json

bp = Blueprint('blog', __name__, url_prefix='/blog')


@bp.route('/chat', methods=('GET', 'POST'))
def chat():

    db = get_db()
    posts = db.execute(
        'SELECT p.id, author_id, msg, created, u.username'
        ' FROM post p JOIN user u'
        ' ON u.id = p.author_id'
        ' ORDER BY p.created DESC',
    ).fetchall()
    pst = {}
    for i in posts:
        pst[i['id']] = [i['username'], i['msg'], i['author_id']]
    dc = pst
    dc = json.dumps(dc)
    return dc


@bp.route('/create/', methods=('GET', 'POST'))
def create(main_id):
    if request.method == 'POST':
        msg = request.get_json().get('message')
        error = None

        if not msg:
            error = 'Message is required.'

        if error is not None:
            dc = {'error': error, 'status': 'not'}
            dc = json.dumps(dc)
            return dc
        else:
            db = get_db()
            author_id = main_id
            db.execute(
                'INSERT INTO post (msg, author_id)'
                ' VALUES (?, ?)',
                (msg, author_id)
            )
            db.commit()

            dc = {'success_msg': 'The message successfully sent', 'status': 'ok'}
            dc = json.dumps(dc)
            return dc

    return dc

    


Ответы

Ответ 1



Мои изменения рядом с # TODO:. Главное что сделал -- убрал пересоздание виджета-списка и манипуляции с layout (это можно потом сделать, сейчас это будет мешать) class MyWindow(QtWidgets.QWidget): def __init__(self, parent=None): super().__init__(parent) self.url_base = 'http://127.0.0.1:5000/' self.main_id = 0 self.res_usr = dict() # TODO: # self.chat_obj = QtWidgets.QListWidget url = self.url_base + 'blog/chat' self.thread_class = ThreadClass(url) self.thread_class.about_response.connect(self.on_response) self.thread_class.start() self.title = QtWidgets.QLabel('Авторизация') self.title.setAlignment(QtCore.Qt.AlignHCenter) self.username = QtWidgets.QLineEdit() self.username.setPlaceholderText('Введите логин:') self.password = QtWidgets.QLineEdit() self.password.setPlaceholderText('Введите пароль:'), self.password.setEchoMode(QtWidgets.QLineEdit.Password) self.btnLogin = QtWidgets.QPushButton("&OK") self.lnkReg = QtWidgets.QPushButton('&Регистрация') self.chat_obj = QtWidgets.QListWidget() self.vbox = QtWidgets.QVBoxLayout() self.vbox.addWidget(self.title) self.vbox.addWidget(self.username) self.vbox.addWidget(self.password) self.vbox.addWidget(self.btnLogin) self.vbox.addWidget(self.lnkReg) # TODO: # Пусть пока будет self.vbox.addWidget(self.chat_obj) self.setLayout(self.vbox) self.btnLogin.clicked.connect(self.authorisation) self.lnkReg.clicked.connect(self.switchToRegistration) def on_response(self, rs): # TODO: res_pst = rs.json() # res_u = rs.text # res_pst = json.loads(res_u) print(res_pst) for key, value in res_pst.items(): item = QtWidgets.QListWidgetItem(self.chat_obj) item.setText(value[0] + ': ' + value[1]) if value[2] == self.main_id: item.setTextAlignment(QtCore.Qt.AlignRight) item.setForeground(QtGui.QColor(colors[0])) else: item.setTextAlignment(QtCore.Qt.AlignLeft) item.setForeground(QtGui.QColor(colors[1])) self.chat_obj.addItem(value[0] + ': ' + value[1]) def switchToRegistration(self): """ Переключение на регистрацию """ # TODO: self.resize(300, 200) # self.clearLayout(self.vbox) self.title = QtWidgets.QLabel('Регистрация') self.title.setAlignment(QtCore.Qt.AlignHCenter) self.username = QtWidgets.QLineEdit() self.username.setPlaceholderText('Введите логин:') self.password = QtWidgets.QLineEdit() self.password.setPlaceholderText('Введите пароль:'), self.password.setEchoMode(QtWidgets.QLineEdit.Password) self.btnReg = QtWidgets.QPushButton("&OK") self.lnkAutor = QtWidgets.QPushButton('&Авторизация') self.vbox.addWidget(self.title) self.vbox.addWidget(self.username) self.vbox.addWidget(self.password) self.vbox.addWidget(self.btnReg) self.vbox.addWidget(self.lnkAutor) self.setLayout(self.vbox) self.btnReg.clicked.connect(self.registration) self.lnkAutor.clicked.connect(self.switchToAuthorisation) def switchToAuthorisation(self): """ Переключение на авторизацию """ # TODO: self.resize(300, 200) # self.clearLayout(self.vbox) self.title = QtWidgets.QLabel('Авторизация') self.title.setAlignment(QtCore.Qt.AlignHCenter) self.username = QtWidgets.QLineEdit() self.username.setPlaceholderText('Введите логин:') self.password = QtWidgets.QLineEdit() self.password.setPlaceholderText('Введите пароль:'), self.password.setEchoMode(QtWidgets.QLineEdit.Password) self.btnAutor = QtWidgets.QPushButton("&OK") self.lnkReg = QtWidgets.QPushButton('&Регистрация') self.vbox.addWidget(self.title) self.vbox.addWidget(self.username) self.vbox.addWidget(self.password) self.vbox.addWidget(self.btnLogin) self.vbox.addWidget(self.lnkReg) self.setLayout(self.vbox) self.btnAutor.clicked.connect(self.authorisation) self.lnkReg.clicked.connect(self.switchToRegistration) def authorisation(self): """ Авторизация """ url = self.url_base + 'auth/login' data = {'username': self.username.text(), 'password': self.password.text()} r = requests.post(url, json=data) # TODO: res_usr = r.json() # res_u = r.text # #print(res_u) # res_usr = json.loads(res_u) #print(res_usr['status']) if res_usr['status'] == 'ok': self.main_id = res_usr['id'] #print(self.main_id) self.getChat() elif res_usr['status'] == 'no': self.showError(res_usr) def registration(self): """ Регистрация """ url = self.url_base + 'auth/register' data = {'username': self.username.text(), 'password': self.password.text()} r = requests.post(url, json=data) res_usr = r.json() # TODO: # res_u = r.text # #print(res_u) # res_usr = json.loads(res_u) if res_usr['status'] == 'ok': self.switchToAuthorisation() elif res_usr['status'] == 'no': self.showError(res_usr) # TODO: # def clearLayout(self, layout): # """ # Очистка окошка # """ # for i in reversed(range(layout.count())): # layout.itemAt(i).widget().setParent(None) def showError(self, res_usr): """ Показать ошибки """ self.label = QtWidgets.QLabel(res_usr['error']) self.label.setAlignment(QtCore.Qt.AlignHCenter) self.vbox.addWidget(self.label) def showSuccess(self, res_usr): """ Показать успех """ self.label = QtWidgets.QLabel(res_usr['success_msg']) self.label.setAlignment(QtCore.Qt.AlignHCenter) self.vbox.addWidget(self.label) def getChat(self): window.resize(300, 400) # self.clearLayout(self.vbox) self.label = QtWidgets.QLabel('Чат') self.label.setAlignment(QtCore.Qt.AlignHCenter) self.vbox.addWidget(self.label) url = self.url_base + 'blog/chat' r = requests.post(url) print(r.status_code, r.reason) print(r.request.headers) # TODO: res_pst = r.json() # res_u = r.text # res_pst = json.loads(res_u) #print(res_pst) # self.chat_obj = QtWidgets.QListWidget(self) for key, value in res_pst.items(): item = QtWidgets.QListWidgetItem(self.chat_obj) item.setText(value[0] + ': ' + value[1]) if value[2] == self.main_id: item.setTextAlignment(QtCore.Qt.AlignRight) item.setForeground(QtGui.QColor(colors[0])) else: item.setTextAlignment(QtCore.Qt.AlignLeft) item.setForeground(QtGui.QColor(colors[1])) #self.chat_obj.addItem(value[0] + ': ' + value[1]) # TODO: в конструкторе добавлено на форму # self.vbox.addWidget(self.chat_obj) self.message = QtWidgets.QLineEdit() self.message.setPlaceholderText('Введите сообщение') self.vbox.addWidget(self.message) self.btnSend = QtWidgets.QPushButton("&Отправить") self.vbox.addWidget(self.btnSend) self.btnSend.clicked.connect(self.sendmessage) def sendmessage(self): """ Отправка сообщения """ print(self.main_id) url = self.url_base + 'blog/create/{}'.format(self.main_id) data = {'message': self.message.text()} #print(data) r = requests.post(url, json=data) #print(r.status_code, r.reason) #print(r.request.headers) # TODO: res_usr = r.json() # res_m = r.text # #print(res_m) # res_usr = json.loads(res_m) if res_usr['status'] == 'ok': self.showSuccess(res_usr) elif res_usr['status'] == 'no': self.showError(res_usr) self.message.clear() Код с self.label = явно костыльный, но его не трогал, т.к. проблема с QListWidget, а не с этим

Что такое реактивная зависимость?

#javascript #vuejs #реактивное_программирование


В документации vue.js встретился такой фрагмент:


  Обратите внимание, что следующее вычисляемое свойство никогда не
  обновится, поскольку Date.now() не является реактивной зависимостью:

computed: {
  now: function () {
    return Date.now()
  }
}



Несколько вопросов на понимание:


Что считается "реактивной" зависимостью?
Как понять какая зависимость является реактивной, а какая - нет?
Почему Date.now() не является реактивной зависимостью?

    


Ответы

Ответ 1



Своими словами: Что считается "реактивной" зависимостью? Св-во или переменная которая может сообщить об своем изменении. В данном случае, сам Vue, если посмотреть под капот, то передавая Vue объект, он превращает каждое его св-во в setter/getter и теперь он способен реагировать на изменения этих св-во. Как понять какая зависимость является реактивной, а какая - нет? Если св-во или переменная может сообщить об своем изменении Почему Date.now() не является реактивной зависимостью Потому что при изменении Date.now не происходит ничего. Мы по идее даже не можем как-то нативно подписаться на его изменения. Придется городить свои велосипеды Не своими словами: https://ru.vuejs.org/v2/guide/reactivity.html

Switch quantity on integer | *** wasnt declared in this scope

#cpp #условия #switch


#include 


using namespace std;

/* run this program using the
console pauser or add your own getch,
system("pause") or input loop */

int main(int argc, char** argv) {
    string lang;
    cout << "Choose your language: rus/eng" << endl;
    cin >> lang;
    switch (lang) { //здесь первая ошибка switch quantity on integer
        case eng:
            cout << "You choose english" << endl; //тут
            break;
        case rus:
            cout << "You choose russian" << endl; //и тут вторая ошибка rus(в случае
выше eng) wasnt declared in this scope
            break;
    }
    return 0;
}


Не первый раз ошибка *** wasnt declared in this scope, так и не могу понять в чем дело
    


Ответы

Ответ 1



switch нельзя использовать с string. Используйте if ... else

Ответ 2



switch нельзя использовать с string.

Как получить данные колонки индексов Pandas DataFrame?

#python #pandas #dataframe #matplotlib


Считываю данные:

data = pd.read_csv('data.csv',';', index_col=['month'], parse_dates=['month'], dayfirst=True)


Смотрю на них:

print data.shape
print data.columns
data.head()


Вывод:

(168, 1)
Index([u'milk'], dtype='object')


   month    milk
1962-01-01  589
1962-02-01  561
1962-03-01  640
1962-04-01  656
1962-05-01  727


В какой-то момент мне необходимо построить график количества во времени. Каким образом
получить данные колонки индексов (month)? Напомню, что мы ее указали индексом и в данных
у нас только одна колонка с количеством. Конечно, можно отобразить как data.plot(),
но мне хотелось бы сделать это вызвав plot у matplotlib.

Дополнительно вопрос о лучших практиках: в каких случаях обоснованно / следует использовать
данные в качестве индекса?
    


Ответы

Ответ 1



Судя по выводу data.head(), вы либо не указали параметр index_col=['month'] либо он отработал не так как ожидалось и столбец month оказался обычным столбцом, вместо того чтобы стать индексом. Чтобы получить значения индекса DataFrame'а, достаточно воспользоваться атрибутом DataFrame.index. Пример: In [129]: df = pd.DataFrame({'val':np.random.rand(100)}, index=np.arange(100, 200)) In [130]: df Out[130]: val 100 0.924396 101 0.960312 102 0.728403 103 0.435330 104 0.599777 .. ... 195 0.055345 196 0.560087 197 0.049506 198 0.819265 199 0.231141 [100 rows x 1 columns] In [131]: plt.plot(df.index, df['val']) Out[131]: [] UPDATE: если на оси X - дата/время, то проще воспользоваться Pandas для визуализации: In [154]: df = pd.read_csv(r'C:\download\data.csv', sep=';', parse_dates=True, index_col=0) In [155]: df Out[155]: milk month 1962-01-01 589 1962-02-01 561 1962-03-01 640 1962-04-01 656 1962-05-01 727 In [156]: df.plot(y='milk') Out[156]: Значения индекса DataFrame: In [157]: df.index Out[157]: DatetimeIndex(['1962-01-01', '1962-02-01', '1962-03-01', '1962-04-01', '1962-05-01'], dtype='datetime64[ns]', name='month', freq=None)

Как получить значение числа ПИ во время компиляции?

#cpp


Как получить значение числа ПИ с заданной точностью во время компиляции?
    


Ответы

Ответ 1



В основном взято отсюда Добавлено только ограничение точности. #include #include // Generic exponent compile-time calculations. Pow<2,3>::result == 2^3 template struct Pow { static constexpr double result = B * Pow::result; }; template struct Pow { static constexpr double result = 1; }; // Bailey-Borwein-Plouffe formula for calculating pi // http://en.wikipedia.org/wiki/Bailey-Borwein-Plouffe_formula template struct CalculatePi { static constexpr double pi = ( 1.0 / Pow<16, N>::result * ( 4.0 / (8 * N + 1.0) - 2.0 / (8 * N + 4.0) - 1.0 / (8 * N + 5.0) - 1.0 / (8 * N + 6.0) ) ) + CalculatePi::pi; ; }; template <> struct CalculatePi<-1> { static constexpr double pi = 0.0; }; template struct Pecision : public CalculatePi { static constexpr double value = (long long)(CalculatePi::pi * Pow <10, N>::result) / Pow <10, N>::result; }; template <> struct Pecision<0> { static constexpr double value = 0.0; }; // main program. Print pi, calculated from 10 iterations of // the BBP formula above int main() { std::cout.precision(std::numeric_limits::digits10); std::cout << "pi: " << Pecision <10>::value << std::endl; return 0; }

Ответ 2



Например с помощью серий Грэгори. // Example program #include #include template T calculatePi(int depth) { T pi = 0; bool sign = true; // true: +, false: - for (int i = 1; i < depth; i += 2) { if (sign) pi += 1/static_cast(i); else pi -= 1/static_cast(i); sign = !sign; } return pi*4; } int main() { std::cout << calculatePi(10000); }

Создание коллекции с типом данных rowtype одной таблицы

#oracle #коллекции #plsql


Каким образом можно создать коллекцию состоящию из rowtype, для использования ее
в дальнейшем? 

С возможностью удаления и добавления ее элементов, причём все элементы типа rowtype
будут из одной таблицы.  Что-то типа: 

my_col(1) := table%rowtype


С PL/SQL знаком мало и не могу найти подходящий пример.
    


Ответы

Ответ 1



Коллекция определяется, и затем объявляется переменная соответствующая этой коллекции, в декларативной части блока, пакета или функции ключевым словом type: create table table1 as select * from dual; declare type myCollType is table of table1%rowtype index by binary_integer; myRow table1%rowtype; myColl myCollType; begin select * into myRow from table1 where rownum = 1 ; myColl(1) := myRow; dbms_output.put_line ('myColl(1).dummy='||myColl(1).dummy); end; / myColl(1).dummy=X Различные типы коллеккций инициализируются и заполнятся по разному, подробнее о выборе коллекции в теме Какой тип коллекции выбрать. Подробнее про объявление, инициализацую и использование PL/SQL коллекций в офф. док. Collection Variable Declaration.

Дата “С” - “По” добавить в массив

#jquery #массивы


У меня есть следующие даты, например 26.12.2018 и 10.01.2019. Как перечислить или
добавить в массив все даты находящиеся в диапазоне с 26.12.2018 по 10.01.2019? Чтобы
получилось так: 

var date = ["26.12.2018","27.12.2018"..."10.01.2019"];

    


Ответы

Ответ 1



Отвечу сам: var startDate = new Date("2018-12-26"); var endDate = new Date("2019-01-10"); var getDateArray = function(start, end) { var arr = new Array(); var dt = new Date(start); while (dt <= end) { arr.push(new Date(dt)); dt.setDate(dt.getDate() + 1); } return arr; } var datearr = getDateArray(startDate, endDate); for (var i = 0; i < datearr.length; i++) { console.log(datearr[i]); }

Краш Ubuntu при запуске Visual Studio Code или Atom

#linux #ubuntu #ide #visual_studio_code #atom


Когда запускаю Visual Studio Code или Atom сразу вылетает система, просто выходит
из пользователя, что делать?
    


Ответы

Ответ 1



И так, приступим к решению проблемы Возможен запуск без графической карты с помощью костыля в виде запуска программы с аргументом --disable-gpu, больше пройдясь по пунктам настроек нашел окошечко с драйверами, так вот, поменял разные драйверы (у меня их 3), в итоге подошел следующий вариант: Большое спасибо Александру Березовскому и Beast Winterwolf за активное участие в вопросе!

Поиск и удаление уникальных значений в векторе по определенному полю кортежа

#cpp #алгоритм #vector #tuple #delete


С++ Есть вектор кортежей типа

std::vector > drv;
std::vector  drv;


сначала его сортирую 

bool sortbyPath(const tuple& a,
    const tuple& b)
{
    return (get<4>(a) < get<4>(b));
}

sort(drv.begin(), drv.end(), sortbyPath);


Подскажите как удалить уникальные значения основываясь на 4 поле (wstring) кортежа?

2056, 2328, 94, 1545877351, L"Sasha", 15
2057, 2328, 94, 1545877351, L"Masha", 15
2057, 2328, 94, 1545877353, L"Dasha", 15
2058, 2328, 94, 1545877353, L"Sasha", 15
2059, 2328, 94, 1545877354, L"Misha", 15
2059, 2328, 94, 1545877354, L"Misha", 15


в итоге должно остаться

2056, 2328, 94, 1545877351, L"Sasha", 15
2057, 2328, 94, 1545877351, L"Masha", 15
2057, 2328, 94, 1545877353, L"Dasha", 15
2059, 2328, 94, 1545877354, L"Misha", 15

    


Ответы

Ответ 1



Вы можете использовать комбинацию метода вектора erase со стандартным алгоритмом std::unique. (Если вы хотите поместить результат в другой вектор или контейнер, то можно использовать алгоритм std::unique_copy). Например, drv.erase( std::unique( std::begin( drv ), std::end( drv ), []( const auto &a, const auto &b ) { return std::get<4>( a ) == std::get<4>( b ); } ), std::end( drv ) ); Ниже представлена демонстрационная программа #include #include #include #include #include #include #include #include typedef unsigned long ULONG; int main() { std::vector> drv = { { 056, 2328, 94, 1545877351, L"Sasha", 15 }, { 2057, 2328, 94, 1545877351, L"Masha", 15 }, { 2057, 2328, 94, 1545877353, L"Dasha", 15 }, { 2058, 2328, 94, 1545877353, L"Sasha", 15 }, { 2059, 2328, 94, 1545877354, L"Misha", 15 }, { 2059, 2328, 94, 1545877354, L"Misha", 15 } }; for ( const auto &item : drv ) { std::wcout << std::setw( 4 ) << std::get<0>( item ) << ", " << std::setw( 4 ) << std::get<1>( item ) << ", " << std::setw( 2 ) << std::get<2>( item ) << ", " << std::get<3>( item ) << ". " << std::get<4>( item ) << ", " << std::get<5>( item ) << '\n'; } std::wcout << '\n'; std::sort( std::begin( drv ), std::end( drv ), []( const auto &a, const auto &b ) { return std::get<4>( a ) < std::get<4>( b ); } ); drv.erase( std::unique( std::begin( drv ), std::end( drv ), []( const auto &a, const auto &b ) { return std::get<4>( a ) == std::get<4>( b ); } ), std::end( drv ) ); for ( const auto &item : drv ) { std::wcout << std::setw( 4 ) << std::get<0>( item ) << ", " << std::setw( 4 ) << std::get<1>( item ) << ", " << std::setw( 2 ) << std::get<2>( item ) << ", " << std::get<3>( item ) << ". " << std::get<4>( item ) << ", " << std::get<5>( item ) << '\n'; } return 0; } Ее вывод на консоль: 46, 2328, 94, 1545877351. Sasha, 15 2057, 2328, 94, 1545877351. Masha, 15 2057, 2328, 94, 1545877353. Dasha, 15 2058, 2328, 94, 1545877353. Sasha, 15 2059, 2328, 94, 1545877354. Misha, 15 2059, 2328, 94, 1545877354. Misha, 15 2057, 2328, 94, 1545877353. Dasha, 15 2057, 2328, 94, 1545877351. Masha, 15 2059, 2328, 94, 1545877354. Misha, 15 46, 2328, 94, 1545877351. Sasha, 15 С другой стороны, возможно вам сразу же следовало избрать другой контейнер, как, например, std::set или std::unordered_set. Ниже представлена демонстрационная программа, которая показывает, как можно выбрать только уникальные элементы исходного вектора во множество std::set без изменения самого вектора. #include #include #include #include #include #include #include #include #include typedef unsigned long ULONG; int main() { std::vector> drv = { { 056, 2328, 94, 1545877351, L"Sasha", 15 }, { 2057, 2328, 94, 1545877351, L"Masha", 15 }, { 2057, 2328, 94, 1545877353, L"Dasha", 15 }, { 2058, 2328, 94, 1545877353, L"Sasha", 15 }, { 2059, 2328, 94, 1545877354, L"Misha", 15 }, { 2059, 2328, 94, 1545877354, L"Misha", 15 } }; for ( const auto &item : drv ) { std::wcout << std::setw( 4 ) << std::get<0>( item ) << ", " << std::setw( 4 ) << std::get<1>( item ) << ", " << std::setw( 2 ) << std::get<2>( item ) << ", " << std::get<3>( item ) << ". " << std::get<4>( item ) << ", " << std::get<5>( item ) << '\n'; } std::wcout << '\n'; auto cmp = []( const auto &a, const auto &b ) { return std::get<4>( a ) < std::get<4>( b ); }; std::set, decltype( cmp )> tuple_set( cmp ); tuple_set.insert( std::begin( drv ), std::end( drv ) ); for ( const auto &item : tuple_set ) { std::wcout << std::setw( 4 ) << std::get<0>( item ) << ", " << std::setw( 4 ) << std::get<1>( item ) << ", " << std::setw( 2 ) << std::get<2>( item ) << ", " << std::get<3>( item ) << ". " << std::get<4>( item ) << ", " << std::get<5>( item ) << '\n'; } std::wcout << '\n'; return 0; } Вывод программы на консоль: 46, 2328, 94, 1545877351. Sasha, 15 2057, 2328, 94, 1545877351. Masha, 15 2057, 2328, 94, 1545877353. Dasha, 15 2058, 2328, 94, 1545877353. Sasha, 15 2059, 2328, 94, 1545877354. Misha, 15 2059, 2328, 94, 1545877354. Misha, 15 2057, 2328, 94, 1545877353. Dasha, 15 2057, 2328, 94, 1545877351. Masha, 15 2059, 2328, 94, 1545877354. Misha, 15 46, 2328, 94, 1545877351. Sasha, 15

Ответ 2



Используйте std::unique() и бинарный предикат, использующий вашу функцию sortbyPath(): template< class ExecutionPolicy, class ForwardIt, class BinaryPredicate > ForwardIt unique( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, BinaryPredicate p ); код в итоге может быть примерно таким: std::sort( drv.begin(), drv.end(), sortbyPath ); auto it = std::unique( drv.begin(), drv.end(), []( const auto &a, const auto &b ) { return not sortbyPath( a, b ) and not sortByPath( b, a ); } ); drv.erase( it, drv.end() ); либо можно написать еще одну функцию equalByPath(), что породит дублирование кода, но будет скорее всего более эффективным. Если вы сортируете только для того, чтобы оставить уникальные, то это делать не обязательно, проще использовать std::unordered_set и std::remove_if: std::unordered_set uset; // тут была ошибка unoredered_set вместо unordered_set auto it = std::remove_if( drv.begin(), drv.end(), [&uset]( const auto &d ) { return not uset.insert( std::get<4>( d ) ).second; } ); drv.erase( it, drv.end() );

Подсчет количества квадратных уравнений с заданными корнями

#алгоритм


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

В программу поступает список длина списка и список с возможными корнями, к примеру
[1,1,2,3]
Нужно посчитать количество различных квадратных уровненный которые можно составить
с парами из этого списка. В этом случае пары будут выглядеть так [(1, 1), (1, 2), (1,
3), (2, 3)]. Если хотя бы один коэффициент различается уравнения считаются разными.
В этом примере максимальное количество 4.

Максимальная длина входящего списка 2*10^5. А числа содержащиеся в списке по модулю
не превышают 10^9. Время ограничено в 1 секунду. Память в 256 мегабайт.

Очевидно, что для решения этой задачи не нужно в лоб строить все возможные уравнения.
Достаточно посчитать количество не повторяющихся пар.

Моё решение:

import itertools
N=int(input())
tmp=[int(i) for i in input().split()]
lst=sorted(set(list(itertools.combinations(tmp, 2))))
print(len(lst))


Вроде бы компактно и просто, но по времени и памяти укладывается далеко не всегда. 

Результат тестировщика: 

AAAAAAAAAAAAAAAAWWWWAAAAAWWWWWAAATWWTTTMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

 A = ACCEPTED = решение засчитано как верное
 W = Wrong Answer = неверный ответ на тесте
 T = Time limit exceeded = решение не уложилось в отведенное процессорное время
 M = Memory limit exceeded = решение не уложилось в отведенное ограничение по памяти


Подскажите как можно более оптимально решить задачу. 

p.s. Вариант Harry, дал следующий результат:

N=int(input())
tmp=[int(i) for i in input().split()]
N = len(sorted(set(tmp)))
M = (sum(tmp.count(x) - 1 for x in tmp) // 2)
print(int(N*(N-1)/2+M))

AAWAAAAAAAAAWAWWWWWAAWAWWWWWWAWWWAWWWAAWWWAWWWAAWTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

    


Ответы

Ответ 1



Ну, если я верно понял вашу задачу - из множества вам надо выбрать все различные пары. Сортируем (самая длинная операция, но сортировка 200000 элементов - дело очень быстрое...), и, линейно проходя, смотрим сколько есть разных значений корней - N сколько есть корней, которых одинаковых хотя бы 2 - M В вашем случае N=3, M=1. Все, искомое число - N*(N-1)/2+M (в вашем случае 3*2/2+1 = 4). Думаю, напишете сами? Потому как я в Python не сведущ... Но уверен - встроенная быстрая сортировка в Python есть :) Если же корни поступают так, как у вас - отсортированными - то вообще проблем нет. P.S. Если это общедоступный ресурс - дайте URL поиграться... P.P.S. Попробуйте этот код: #include #include using namespace std; int main() { long long int N; cin >> N; if (N < 2) { cout << "0\n"; return 0; } map v; for(int i = 0, j; i < N; ++i) { cin >> j; v[j]++; } N = v.size(); long long int M = 0; for(auto p: v) if (p.second > 1) ++M; cout << (M+N*(N-1)/2) << endl; }

Ответ 2



У вас на несортированных входных данных неверный результат, вы сортируете не в том месте и не то. Так же нет необходимости конвертировать входные данные в целые числа, а результаты в список, это ничего не дает (кроме того, не используется N, но тут уже в условиях не сказано, что делать, если на входе данных меньше или больше, чем N). Проверьте такое: import itertools N = int(input()) tmp = input().split() tmp = sorted(tmp) res = set(itertools.combinations(tmp, 2)) print (len(res))

Как проверить наличие элемента в JSON ? Python

#python_3x #json


Есть файл db.json

Его содержание:

[
  {
    "user": "981"
  },
  {
    "user": "859"
  },
  {
    "user": "237"
  }
]


Например нужно проверить есть ли "user": "859" в db.json

Как делаю это я:

import json

def json_read(file_name):
    try:
        json_data = json.load(open(file_name, 'r', encoding="cp1251"))
    except:
        json_data = []
    return json_data

data = json_read("db.json")
user_in_db = "859"

for user in data:
    if user_in_db == user['user']:
        print("yes")
    else:
        print("No")


Но я думаю в случае большого количества пользователей в db.json данный способ менее
удобен. Есть ли какой то более удобный и быстрый способ сделать это ? 
    


Ответы

Ответ 1



Решение в лоб: In [13]: db = [ ...: { ...: "user": "981" ...: }, ...: { ...: "user": "859" ...: }, ...: { ...: "user": "237" ...: } ...: ] In [14]: {'user': '859'} in db Out[14]: True Или: In [15]: any(x['user'] == '859' for x in db) Out[15]: True

Ответ 2



data = json.load(open('db.json', 'r')) dictValueKey = dict([ [d.get(k),k] for k in d for d in data]) print("Yes" if dd.get("859")=="user" else "No") Yes print("Yes" if dd.get("111")=="user" else "No") No print("Yes" if dd.get("859")=="userNo" else "No") No

c# и debug режим

#c_sharp #cpp #clr


Можно ли в с# CLR код, запустить в "трассировочном" режиме? Можно ли  как-то перехватить
вызов Invoke? Как можно написать дебаггер под с# код? Единственное что пока-что приходит
в голову - емулировать выполнение CLR-кода, но тут нужно тонна кода на емулятор, а
потом... перехватывать код готовых библиотек, ведь есть мостики CLR-Native-CLR, поэтому
с емулятором не всё так просто. На с++-cli это чудо думаю было бы реально реализовать...
но... Я думаю есть какой-то особый режим, который легко включается. Видел уже есть
"кривые" аналоги VS... Как эта проблема решена в других проэктах? 
    


Ответы

Ответ 1



Как написать дебагер, а точнее трейсер. С чего начать Создание ICorDebug и ICorProcess Создание обработчика Апгрейт обработчика Статья предполагает что базовые знания с++ есть. Дебагер можно писать на с++, можно даже на с#, но я предпочитаю с++. Покажу базу - как написать трейсер. С чего начать. Давайте создадим простенький с# using System; public class Demo { public static void Main(string[] args) { Console.WriteLine("Hello world"); } } И соберём его c:\windows\Microsoft.NET\Framework\v2.0.50727\csc.exe /platform:x86 /target:1.exe 1.cs /pdb:1.pdb /debug У студии есть папка SDK в которой можно найти нужные хедеры. У меня тут SDK\v2.0\include. Понадобятся следующие библиотеки #include #include "COR\CorHdr.h" #include "COR\cor.h" #include "COR\cordebug.h" ICorDebug* dbg; // Библиотека дебаггера ICorProcess* process;//Процесс для отладки. Будет для одного процесса Поначалу я думал - создам CoCreateIntance, там есть ф-ция CreateProcess - и будет всё ок, но нет. Создание ICorDebug и ICorProcess. Второй создаётся легко, если создался первый. Есть несколько способов его создать, покажу один из. Если mscoree.dll не получается прилинковать - подключайте ёё через LoadLibrary и GetProcAddress. Есть две ф-ции, одна проверяет версию, другая - создает ICorDebug. void main(){ wchar_t* module = "c:\\yourdebug\\1.exe"; wchar_t ver[20]; GetRequestedRuntimeVersion(module,ver,sizeof(ver),&dw);//mscoree.dll hr=CreateDebugginInterfaceFromVersion(CorDebugVersion_2_0,ver,&dbg); // hr=CreateDebugginInterfaceFromVersion(CorDebugVersion_2_0+1,ver,&dbg); // для .NET 4 // Если не подходит версия - пробуйте менять первый аргумент //TODO: проверка hr hr = dbg->Initialize(); STARTUPINFOW si = {sizeof(STARTUPINFOW),0,}; PROCESS_INFORMATION pi = {0,}; // dbg->SetUnmanagedHandler dbg->SetManagedHandler(MgrHandler); // ниже будет // TODO: параметры запуска можно будет доделать hr = dbg->CreateProcess(module,module,0,0,true, CREATE_NEW_CONSOLE, L"\0\0\0\0", L".", &si, &pi,0,&process); // TODO: цикл ожидания конца работы дебагера for (int i=0;i<100;i++) WaitForSingleObject(pi.hProcess,1000); } Ну... почти готово. Или почти не считается. Долго мучался с SetManagedHandler, если ф-ция не работает, значит не все хандлеры вы описали. Теперь перейдем к... Создание обработчика. В версии FrameWork 2.0 оказывается нужно поддерживать два каллбека. Ну и... коечего повписывать в обработчик. Нужно везде где можно написать pAppDomain->Continue(); вписать его в каждый обработчик. Весь код приводить не буду, приведу главное. Дальше речь идет только об этом обработчике class MGRHandler:public ICorDebugManagedCallback,ICorDebugManagedCallback2{ // 1 Рассказать какие у нас калбеки HRESULT __stdcall QueryInterface(REFIID riid,void**ppvObject){ if (riid==IID_ICorDebugManagedCallback){ *ppvObject=(ICorDebugManagedCallback*)this;//Первый return 0; } if (riid==IID_ICorDebugManagedCallback2){ *ppvObject=(ICorDebugManagedCallback2*)this;//Второй return 0; } return (HRESULT)-1; } // 2 Вначале нас бросит сюда HRESULT __stdcall CreateProcess(ICorDebugProcess* pProcess){ pProcess->Continue(0); } // 3 Потом будет создан "домен" HRESULT __stdcall CreateAppDomain(ICorDebugProcess *pProcess, ICorDebugAppDomain *pAppDomain) { pAppDomain->Attach(); // Переводим домен в дебаг режим pProcess->Continue(0); return 0;}; // 4 Ставим Continue тут обязательно, желательно везде HRESULT __stdcall LoadAssembly(ICorDebugAppDomain *pAppDomain, ICorDebugAssembly *pAssembly) { pAppDomain->Continue(0);return 0; } HRESULT __stdcall CreateThread(ICorDebugAppDomain *pAppDomain, ICorDebugThread *thread) { pAppDomain->Continue(0);return 0; }; Аналогично ф-ции Breakpoint,NameChange и другие. Перехват функций нужно делать в модуле, например так: HRESULT __stdcall LoadModule(ICorDebugAppDomain *pAppDomain, ICorDebugModule *pModule) { ICorDebugFunction* fn=0;//ф-ция номер 1 имеет такой код 6000001 pModule->GetFunctionFromToken(0x6000001,&fn); if (fn!=0) fn->CreateBreakpoint(&bp1); // TODO: очистить bp1 pAppDomain->Continue(0); return 0; } И добавим обработчик BreakPoint HRESULT __stdcall Breakpoint(ICorDebugAppDomain *pAppDomain, ICorDebugThread *pThread, ICorDebugBreakpoint *pBreakpoint) { ICorDebugFrame * f = 0; pThread->GetActiveFrame(&f); ICorDebugStepper * step = 0; f->CreateStepper(&step); step->Step(0); // Заставляем работать в шаговом режиме // TODO: step освободить когда не нужен будет f->Release(); pAppDomain->Continue(0); return 0; } Да, добавьте MGRHandler MgrHandler; под обработчиком, когда обработчик доконца допишите. Если компилятор ругается пишет слова abstract и error значит не все функции реализованы. Нужно все добавить (современные компиляторы умеют реализовать абстрактные классы сами, если дополнительно сделать два три клика в нужных местах). Теперь дебагер может кое-как отлаживать программу. Столкнулся с тем... Ой, а где же мой ip.... Апгрейт обработчика. Есть интерфейс ICorDebugILFrame - в нем куча полезностей, локальные переменные, аргументы, и ip. Последний "штрих" программы, правим в обработчике ф-цию: HRESULT __stdcall StepComplete( ICorDebugAppDomain *pAppDomain, ICorDebugThread *pThread, ICorDebugStepper *pStepper, CorDebugStepReason reason) { ICorDebugFrame * f = 0; ICorDebugILFrame * ff = 0; unsigned ip,tok; pThread->GetActiveFrame(&f); f->QueryInterface(IID_ICorDebugILFrame , &ff); ff->GetIP(&ip); f->GetFunctionToken(&tok); char buf[30]; wsprintfA("tok:%x ip:%x\r\n",tok,buf); // TODO: вывод на екран pStepper->Step(0); // пусть ещё шагает pAppDomain->Continue(0); return 0; } Теперь получился "трейсер", который позволяет по-шагам выполнить ф-цию. Я не упомянул IMetaDataImport - через него можно получить имена всех ф-ций и параметров, остальную нужную информацию найти относительно легко. Я постарался показать 4-ре шага, которые мне было не очень просто найти. Показан чисто "скелет". P.S. Тесты. Модуль собран в borland c++ x86. win2003 x86 - модуль работает (студия 2005) win7 x64 - модуль работает, но нужно создать 32-битную сборку отлаживаемой программы, т.е. добавить в csc.exe параметр /platform:x86 (иначе ловим ошибку DebuggerError 0x80131C30 ) Полезные ссылки MS debug api http://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/debugging/ Создание ICorDebug http://lowleveldesign.org/2010/10/11/writing-a-net-debugger-part-1-starting-the-debugging-session/ Часть 2 Часть 3 Часть 4 Коды ошибoк HRESULT http://github.com/mrfearless/UASM-with-RadASM/blob/master/UASM64/ErrorCodes.dat Файл с кодами ошибок есть corerror.h но... он не удобный.

Заменить %-string на f-string

#python #python_3x #строки #print


Как правильно написать выражение

"%(a)03d%(b)029d" % {"a": 1, "b": 2}, 

используя f-string
    


Ответы

Ответ 1



In [3]: a,b = 1,2 In [4]: print(f"{a:03d}{b:029d}") 00100000000000000000000000000002 или In [5]: d = {"a": 1, "b": 2} In [6]: print(f"{d['a']:03d}{d['b']:029d}") 00100000000000000000000000000002 Пример использования переменных для задания формата: In [9]: fmt1,fmt2 = "03d", "029d" In [10]: print(f"{d['a']:{fmt1}}{d['b']:{fmt2}}") 00100000000000000000000000000002

Математический маятник с шаром

#javascript #html #css


Итак, у нас есть математический маятник. Помогите реализовать, чтобы после запуска
программы можно было в ручную (мышкой) поднять шар и отпустить для колебания 
P.s. Либо можно еще CSS или JavaScript














    


Ответы

Ответ 1



Все, на самом деле, достаточно просто. Нужно сделать несколько вещей: определить обработчик нажатия на левую кнопку мыши (ЛКМ) определить обработчик отжатия ЛКМ определить обработчик перемещения мыши В обработчике нажатия ЛКМ нужно поменять режим (draggin <- true) и сохранить текущее положение центра канваса (относительно которого рисуется маятник) и угол направления от центра канваса на положение курсора мыши, а так же текущий угол поворота маятника. В обработчике отжатия ЛКМ нужно поменять режим (draggin <- false) и обнулить текущую скорость и ускорение - чтобы не поломать физику процесса. В обработчике перемещения мыши нужно понять в каком режиме мы сейчас находимся (если draggin === true - то нужно обрабатывать перемещение). При обработке перемещения вычисляется новый угол направления на курсор и разница между текущим и начальным углами направления вычитается из сохраненного положения маятника. Так же нужно не забыть запрещать пересчитывать механику при перемещении начальной точки. Мой вариант кода с коментариями приведен ниже: var canvas = document.getElementById("canvas"); var canvas2 = document.getElementById("canvas2"); var ctx = canvas.getContext("2d"); var ctx2 = canvas2.getContext("2d"); var h = canvas.height = 500; var w = canvas.width = 600; var h2 = canvas2.height = 300; var w2 = canvas2.width = 800; var draggin = false; // В режиме перемещения var dragX = 0; // Центр канваса, относительно которого будем считать поворот var dragY = 0; var dragPhi = 0; // Угол маятника при нажатии var dragKsy = 0; // Начальный угол при mousedown ctx.translate(w / 2, h / 2); ctx2.translate(0, h2 / 2); ctx2.beginPath(); ctx2.moveTo(0, 0); var initPhi = Math.PI * 0.2; var L = 200; var dt = 1 / 60; var g = 1500; var t = 0; bob = { phi: initPhi, v: 0, a: 0 }; //getPos - определение позиции относительно центра элемента function getPos(el) { var rect = el.getBoundingClientRect(); return { x: rect.left + rect.width / 2.0, y: rect.top + rect.height / 2.0 }; } // Определяем угол поворота относительно центра канваса function calcKsy(evt) { var deltaX = evt.clientX - dragX; var deltaY = evt.clientY - dragY; var Ksy = Math.atan2(deltaY, deltaX); return Ksy; } // Обрабатываем событие нажатия на левую кнопку мыши canvas.addEventListener("mousedown", function(evt) { var gpc = getPos(canvas); dragX = gpc.x; dragY = gpc.y; draggin = true; dragPhi = bob.phi; dragKsy = calcKsy(evt); }); // Поворачиваем маятник на угол между начальным углом при mousedown // и текущим после перемещения курсора canvas.addEventListener("mousemove", function(evt) { if(draggin){ var Ksy = calcKsy(evt); bob.phi = dragPhi - Ksy + dragKsy; } }); // Обрабатываем событие отжатия левой кнопки мыши canvas.addEventListener("mouseup", function(evt) { draggin = false; bob.v = 0; bob.a = 0; }); function drawPendulum() { ctx.beginPath() ctx.arc(Math.sin(bob.phi) * L, Math.cos(bob.phi) * L, 10, 0, 2 * Math.PI) ctx.fill() ctx.moveTo(0, 0) ctx.lineTo(Math.sin(bob.phi) * L, Math.cos(bob.phi) * L) ctx.stroke() } function update() { bob.a = -(g / L) * Math.sin(bob.phi) bob.v += bob.a * dt bob.phi += bob.v * dt t += dt } function drawGraph() { ctx2.lineTo(t * 20, (bob.phi % Math.PI) * 20) ctx2.stroke() } function draw() { ctx.clearRect(-w / 2, -h / 2, w, h) drawPendulum() // Если мы не в режиме перетаскивания, то качаем маятник if (draggin === false) { update() } drawGraph() requestAnimationFrame(draw) } draw() * { padding: 0; margin: 0; } canvas { display: block; margin: 0 auto; cursor: move; cursor: grab; cursor: -moz-grab; cursor: -webkit-grab; }

Неправильно ведут себя пустые ячейки в CSS grid, заданные свойством grid-template-areas

#html #css #css3 #вёрстка #css_grid


Делаю грид на CSS, ориентируясь на шпаргалку: https://tuhub.ru/posts/css-grid-complete-guide#prop-grid-template-areas

Там написано:


  grid-template-areas
  
  ...
  
  Точка означает пустую ячейку. 


и приведен пример:

grid-template-areas: 
"header header header header"
"main main . sidebar"
"footer footer footer footer";


который выдает нормальный результат (пустая ячейка находится где-то посередине).

Пытаюсь сделать похожую конструкцию, но с двумя пустыми ячейками, которые находятся
по краям сетки:

https://codepen.io/anon/pen/zyLOqz



div {
  border: 1px solid gray;
  padding: 5px;
}

body {
  display: grid;
  grid-template-rows: auto 1fr auto;
  grid-template-columns: auto 1fr auto;
  grid-template-areas: "headerBg1 header headerBg2"
                       ". mainContent ."
                       "footerBg1 footer footerBg2";
  grid-gap: 2px;
}

.header { grid-area: header; }
.headerBg.1 { grid-area: headerBg1; }
.headerBg.2 { grid-area: headerBg2; }
.mainContent { grid-area: mainContent; }
.footer { grid-area: footer; }
.footerBg.1 { grid-area: footerBg1; }
.footerBg.2 { grid-area: footerBg2; }
Left header
Right header
Header
Main content
Main content
Main content
Left footer
Right footer
ключевое тут это: grid-template-areas: "headerBg1 header headerBg2" ". mainContent ." "footerBg1 footer footerBg2"; ВОПРОС: почему блоки Left footer (footerBg1) и Right footer (footerBg2) находятся там, где должны быть пустые ячейки? Ожидается, что они будут в одной строке с блоком footer.


Ответы

Ответ 1



Так должно работать: div { border: 1px solid gray; padding: 5px; } body { display: grid; grid-template-rows: auto 1fr auto; grid-template-columns: auto 1024px auto; grid-template-areas: "headerBg1 header headerBg2" ". mainContent ." "footerBg1 footer footerBg2"; grid-gap: 2px; } .header { grid-area: header; } .headerBg1 { grid-area: headerBg1; } .headerBg2 { grid-area: headerBg2; } .mainContent { grid-area: mainContent; } .footer { grid-area: footer; } .footerBg1 { grid-area: footerBg1; } .footerBg2 { grid-area: footerBg2; }
Left header
Right header
Header
Main content
Main content
Main content
Left footer
Right footer


Ответ 2



Нет, проблема в совершенно другом:
Left footer
.footerBg.1 {grid-area: footerBg1;} Css не позволяет называть классы начиная с цифры. Рекомендую просто взять и переименовать. В принципе это можно обойти через селектор атрибута: .footerBg[class~="1"] {grid-area: footerBg1;} или при помощи хака с экранированием (у меня в хроме работает): .footerBg.\31 {grid-area: footerBg1;} Кстати, с частями хэдера тот же косяк, но они чисто случайно встали на свои места. div { border: 1px solid gray; padding: 5px; } body { display: grid; grid-template-rows: auto 1fr auto; grid-template-columns: auto 1fr auto; grid-template-areas: "headerBg1 header headerBg2" ". mainContent ." "footerBg1 footer footerBg2"; grid-gap: 2px; } .header { grid-area: header; } .headerBg.h1 { grid-area: headerBg1; } .headerBg.h2 { grid-area: headerBg2; } .mainContent { grid-area: mainContent; } .footer { grid-area: footer; } .footerBg.\31 { grid-area: footerBg1; } .footerBg[class~="2"] { grid-area: footerBg2; }
Left header
Right header
Header
Main content
Main content
Main content
Left footer
Right footer


Как окружить единицы их порядковыми номерами в матрице?

#cpp #массивы #алгоритм #матрицы #олимпиада



  Дан двухмерный массив целых чисел. Массив заполнен нулями и единицами.
  "Окружить" каждую единицу, заменив только 0 на порядковый номер
  единицы в массиве, считая от левого верхнего угла и далее по строкам.
  
  Пример входного потока:5 5
1 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0
0 0 0 0 0
     
  
  Пример выходного потока: 
1 1 2 0 0
1 1 2 0 0
3 3 4 5 5
0 0 5 1 5
0 0 5 5 5     


Привожу свою версию, но я явно что-то делаю не так, например, если единица стоит
в конце строки, неверно считает. Или, если массив состоит из одной-двух строк или столбцов.
Выводит порядковый номер даже когда единиц поблизости нет. Очень прошу помощи!

#include 
#include 
using namespace std;
int main()
{
  int x,y,q=0;
  cin >> x >> y;
  int a[x][y];
  for (int i=0;i> a[i][j];
    }
  }
  for (int i=0;i3) lim1=3; else lim1=x;
        if (y>3) lim2=3; else lim2=y;
        for (int m=0;m


Ответы

Ответ 1



Как-то так, если я правильно понял условие. #include #include using namespace std; int main() { int x, y, q = 0; cin >> x >> y; vector> m(x, vector(y, 0)); for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { cin >> m[i][j]; } } for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { if (m[i][j] == 1) { q++; // обход подматрицы 3x3, центр которой 1 for (int a = i - 1; a <= i + 1; a++) { for (int b = j - 1; b <= j + 1; b++) { // проверка границ и что элемент можно изменить if (a >= 0 && a < x && b >= 0 && b < y && m[a][b] == 0) { m[a][b] = q; } } } } } } for (auto& v : m) { for (auto& i : v) { cout << i << ' '; } cout << '\n'; } }

Ответ 2



#include int main() { int x = 5; int y = 5; int matrix[x][y] = { {1, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 1, 0}, {0, 0, 0, 0, 0} }; for (int i = 0; i < x; ++i) { for (int j = 0; j < y; ++j) { std::cout << matrix[i][j] << " "; } std::cout << std::endl; } std::cout << std::endl; int count = 0; int points[8][2] = { {-1, 1}, { 0, 1}, { 1, 1}, { 1, 0}, { 1, -1}, { 0, -1}, {-1, -1}, {-1, 0}}; for (int i = 0; i < x; ++i) { for (int j = 0; j < y; ++j) { if (matrix[i][j] == 1) { ++count; for (auto point : points) { int xi = i + point[0]; int yj = j + point[1]; if (xi < 0 || xi >= x) { continue; } if (yj < 0 || yj >= y) { continue; } if (matrix[xi][yj] == 0) { matrix[xi][yj] = count; } } } } } for (int i = 0; i < x; ++i) { for (int j = 0; j < y; ++j) { std::cout << matrix[i][j] << " "; } std::cout << std::endl; } return 0; }

Что такое виртуальный процессор?

#терминология #железо #виртуальная_машина #процессор



Где то утверждают что это по сути и есть ядро (или поток ядра). И например при технологии
Hyper-Threading система определяет физическое ядро как два виртуальных.
Кто то утверждает что виртуальный процессор может эмулироватся программно молл виртуальный
процессор можно сравнить с операционной системой. Поток по отношению к нему выступает
как процесс, подобно тому, как сам виртуальный процессор является процессом с точки
зрения операционной системы.
Еще говорят что при создании виртуальной машины можно для нее выделять виртуальные
процессоры 


ТАК ЧТО ТАКОЕ ВИРТУАЛЬНЫЙ ПРОЦЕССОР
    


Ответы

Ответ 1



Это не термин, а обычное словосочетание. Виртуальный процессор - это нечто, что выглядит как работоспособный процессор, но процессором не является. Точное значение зависит от контекста. Так, когда-то давно никто не слышал про многоядерные процессоры, а когда было нужно - ставили несколько процессоров. И когда многоядерные процессоры появились - то в целях обратной совместимости каждое ядро стало "представляться" операционной системе как отдельный процессор. То есть у вас на материнке стоит один проц - а ОС пишет, что их два. Никакого второго процессора реально не существует, он - виртуальный. Точнее, оба ядра называют виртуальными процессорами, потому что они одинаковые. Существуют эмуляторы процессоров. Например, вы можете скачать эмулятор NES и поиграть на нем в старые игры. Эти игры написаны для процессора Ricoh 2A03, но играть в них вы будете на процессоре семейства Intel. Однако большинство игр подмены не заметят, поскольку эмулятор реализует все нужные инструкции. В этом смысле эмулятор NES содержит в себе виртуальный процессор. Внутри виртуальной машины работает реальная ОС, называемая "гостевой". Эта ОС, точно так же, как и при работе вне виртуальной машины, пытается работать с "железом". Но у виртуальной машины все "железо" - виртуальное (за редкими исключениями): если вы, к примеру, зайдёте в Диспетчер устройств на виртуалке с виндой - вы не увидите ничего похожего на реальные устройства. Процессоры у виртуальной машины - тоже виртуальные.

Решение строкового математического выражения

#java #строки #package


Есть ли в java нативный метод для такого рода вещей, чтобы самому не писать?
Вроде  

String expr = "1 + 2 * 3";
Double result = WonderClass.wonderMethod(expr);
System.out.println(result);




7.0

    


Ответы

Ответ 1



Да, можно использовать Java Scripting API Вполне подойдет JavaScript (его движок входит в состав JDK): ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine engine = scriptEngineManager.getEngineByName("JavaScript"); String expr = "1 + 2 * 3"; System.out.println(engine.eval(expr));

Что за сертификат? Как от него избавиться?

#windows #windows_10 #сертификат #rdp


При подключении к удалённому рабочему столу, на удалённом генерируется сертификат
с именем 


  S-1-5-21-183##3189-3615##5645-3821##652-1001/b73cf###-e0cb-414####ea-ab21ffa8a2b2/login.windows.net/c1c942f3-2##49af-98b4-5f34bba3c5df/y.k###kov@so##.ru


(некоторые символы заменены на решетки), действует до 2048 и назначение "Вход со
смарт-картой". 
Локально такой содержится в Сертификаты/Личное и Сертификаты/Local NonRemovable.
Что это за серт? И как сделать чтобы он не генерился удалённо? 

y.k###kov@so##.ru - это моя корпоративная почта. к удалённому компьютеру кроме меня
подключается множество других пользователей, но лишь мой оставляет там этот сомнительный
сертификат, который есть у меня локально и при удалении его и перезапуске - он снова
появляется
    


Ответы

Ответ 1



RDP в Windows поддерживает перенаправление некоторых типов устройств, т.е., при заходе на удаленный сервер, пользователь может взаимодействовать с устройствами с локального компьютера. К перенаправляемым устройствам относятся и считыватели электронных ключей (в интерфейсе Windows это называется смарт-картами). Многие драйвера считывателей настроены таким образом, что при появлении электронного ключа они автоматически регистрируют сертификат в системе. Чтобы предотвратить появление сертификата на удаленном сервере, нужно в параметрах RDP подключения выбрать "Локальные ресурсы - Подробнее", и снять галку с пункта "Смарт карты".

Где найти свежую документацию по gnu c?

#c #gcc #gnu #c11


По запросу в Гугле - выдает страницу https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html
в которой ничего не говориться о c 11, на официальном сайте я ничего подходящего не нашел. 

Где можно найти актуальный мануал по gnu c 11?
    


Ответы

Ответ 1



Официально этот документ называется так: INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC9899:201x Найти его можно, например, здесь: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1539.pdf

Ответ 2



Прочтите, пожалуйста, вот этот документ. Особое внимание обратите на данный абзац: By default, GCC provides some extensions to the C language that, on rare occasions conflict with the C standard. See Extensions to the C Language Family. Some features that are part of the C99 standard are accepted as extensions in C90 mode, and some features that are part of the C11 standard are accepted as extensions in C90 and C99 modes. Use of the -std options listed above disables these extensions where they conflict with the C standard version selected. You may also select an extended version of the C language explicitly with -std=gnu90 (for C90 with GNU extensions), -std=gnu99 (for C99 with GNU extensions) or -std=gnu11 (for C11 with GNU extensions). Ссылку на описание GNU C extensions на всякий случай оставляю здесь: https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html

Поменять цвета двух объектов SVG при наведении курсора на один из них

#html #css #css3 #вёрстка #svg


У меня есть код SVG-файла:



circle{
fill: #FFF;}

circle:hover{
fill: green}

rect{
fill: #000;}

rect:hover{
fill:red;} 

    
    
    





Выглядит он вот так:  



Как  сделать, чтобы когда я наводила курсор на черный квадрат, у меня два круга и
квадрат одновременно меняли цвета?
Я знаю как прописать отдельно ховер для кругов и отдельно для квадрата, а вот чтобы
при наведении курсора на квадрат менялся цвет кругов не знаю. 
    


Ответы

Ответ 1



В этом случае можно использовать CSS переменные. Объединяем квадрат и окружности в одну группу и добавляем css переменные, которые будут принимать разные значения в зависимости от :hover .change{ --color-rect: black; --color-circle: white; } .change:hover { --color-rect: red; --color-circle: green; } Посмотрите на эту тему более сложный пример .predator-colors { --color-face: #7986CB; --color-nose: #9FA8DA; --color-hair-right:#3949AB; --color-hair-right2:#3949AB; --color-hair-left:#3949AB; --color-hair-left2:#3949AB; --color-eye-right:#1A237E; --color-pupil-right:#77006B; --color-eye-left:#1A237E; --color-pupil-left:#77006B; --color-ellipse1:#9FA8DA; --color-ellipse2:#7986CB; --color-ellipse3:#C5CAE9; } .predator-colors:hover { --color-face: #3F8B4D; --color-nose: #58C46C; --color-hair-right:gold; --color-hair-right2:#FFBB00; --color-hair-left:gold; --color-hair-left2:#FFBB00; --color-eye-right:#77006B; --color-pupil-right:#FF4151; --color-eye-left:#77006B; --color-pupil-left:#FF4151; --color-ellipse1:#FFDD00; --color-ellipse2:#C1A700; --color-ellipse3:#FFEE7D; }

закрыть IE с помощью JS

#javascript #internet_explorer


что нужно прописать в консоли чтобы браузер сразу закрылся? 

моя попытка: 
    


Ответы

Ответ 1



window.open('','_self').close();

После поиска кнопки не работают

#javascript #html


У меня возникла одна большая. Есть список кнопок, есть их переключатели(вперёд и
назад по этому списку), есть так же поле поиска, по которому можно найти нужную кнопку.
При переключении кнопок на экране записывается имя текущей кнопки списка. При поиске
по имени кнопки, если имя верное, то поиск выведет на экране имя кнопки, если поиск
не удался, то выведет сообщение об ошибку ввода. До поиска кнопки переключения нормально
работают(т.е.  при нажатии вперёд или назад на экране появляется имя текущей кнопки),
они нормально работают так же после неудавшегося поиска, но возникает большая проблема
после удачного поиска - кнопки переключения перестают функционировать, т.е. на экране
не отображается имя кнопки, на которую переключились. Консоль браузера выдаёт ошибку. 

Помогите пожалуйста, я над этой проблемой уже больше 6 часов бьюсь, но без результатов.

Uncaught TypeError: Cannot set property 'innerText' of null
    at i.js:45
    at NodeList.forEach ()
    at HTMLButtonElement.


Если кому-то нужно могу переслать js, но не думаю, что это поможет.
    


Ответы

Ответ 1



Вы удаляете элемент p внутри .result в строчке result.textContent = res; После этого document.querySelector("div.result > p") возвращает null. Используйте в обоих местах document.querySelector("div.result > p").textContent = ...;

Нужно ли дублировать static в определении функции?

#c #функции #static


Правильно ли я понимаю, что если функция объявлена со спецификатором static, то его
не надо дублировать в определении?

static void f(void);

void f(void)
{
    // ...
}

    


Ответы

Ответ 1



Нет, не надо. Более того, даже если вы ее ниже явно объявите как extern, она все равно останется static static void f(void); extern void f(void) // Все равно функция имеет внутреннее связывание { // ... } В стандарте языка (6.2.2 Linkages of identifiers) собственно поведение объявления без явного спецификатора класса хранения (ваше void foo(void)) по определению эквивалентно ему же с спецификатором extern (как у меня) (6.2.2/5). А поведение объявления с extern в свою очередь наследуется из того, что было объявлено выше (6.2.2/4).

Как в Notepad++ удалить в каждом слове предложения все буквы кроме первой?

#регулярные_выражения #notepad++


Как в Notepad++ удалить в каждом слове все буквы кроме первой?
    


Ответы

Ответ 1



Используйте следующее регулярное выражение: \B\w+ Строку замены следует оставить пустым. Шаблон \B\w+ находит позицию, отличную от границы слова (\B), а затем \w+ находит 1 и более букв/цифр или знаков подчёркивания. Если нужно удалить только буквы в буквенных словах, используйте \B[[:alpha:]]+\b или \B[[:alpha:]]+ (в последнем нет проверки на правую границу слова).

Ответ 2



Используйте в Найти регулярку: \b(\w)\w+\b, а в Заменить: \1 Было: Как в Notepad++ удалить в каждом слове все буквы кроме первой? Результат: К в N++ у в к с в б к п?

Как называется процесс приведения данных к более удобному с точки зрения программной обработки виду?

#терминология


Типичная ситуация: какие-либо данные приложения хранятся во внешнем файле либо в
базе данных. В идеале, чтобы эти данные должны быть структурированы так, чтобы их было
удобно программно обрабатывать, но в реальности это, как правило, не так: "сырые" данные
приходится перерабатывать, то есть приводить к такому виду, чтобы доступ к ним был
легче (часто используются ассоциативные массивы). 

Как называется процесс этот приведения "сырых" данных к более удобному виду? 

Вероятно, "маппинг" - неправильный ответ. Насколько я знаю, маппинг - это (на уровне
концепции) установление соответствия между двумя наборами данных. У нас же набор данных
один и тот же, разница лишь в формате.
    


Ответы

Ответ 1



В одном из пройденных мной уроков по реакт (в данном случае неважно) преподаватель преобразовывал в момент получения приходящие к нему с сервера данные для последующего более удобного обращения к ним. Он массив объектов вида [{article_id: value, article_text: value}] преобразовывал в объект вида {article_id: article_text} и для получения конкретного текста ему не нужно теперь было каждый раз перебирать массив. Собственно, вполне подходит под определение "У нас же набор данных один и тот же, разница лишь в формате". Он называл это словом "нормализация данных". https://ru.wikipedia.org/wiki/Нормальная_форма Не знаю, есть ли вот прям такой термин в книжках, но думаю это выражение вполне уместно применить вместо фразы "приведение ко второй нормальной форме", которая точно валидна - на работе у нас ее постоянно используют.

Ответ 2



я бы назвал форматирование - приведение данных к определённому формату. https://www.ibm.com/support/knowledgecenter/ru/SSEP7J_10.1.1/com.ibm.swg.ba.cognos.ug_cr_rptstd.10.1.1.doc/t_cr_rptstd_wrkdat_format_data.html пример изначально есть несколько дат записанных в разном формате 12.10.2011 после форматирования 12.10.2011 а если форматировать в Unix Time Stamp 1317427200 12.10.01 после форматирования 12.10.2001 а если форматировать в Unix Time Stamp 11001894400 12 октября 1991 после форматирования 12.10.1991 а если форматировать в Unix Time Stamp 686275200 можно назвать и типизацией но на мой взгляд назвать этот процесс форматированием было бы правильнее) типизацией я бы назвал опираясь больше на морфологию языка, если есть типы данных то процесс приведения приведения данных к этим типам должен называться типизация. https://ru.wikipedia.org/wiki/%D0%A2%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85

Непонятный синтаксис с двумя именами в typedef

#c #typedef #union


typedef union {  
    char word[16];  
    uint32_t chunk[4];  
    uint64_t big_chunk[2];  
} Word, *PWord;   // <-- Что означают эти два имени?

    


Ответы

Ответ 1



Да хоть с десятью именами. Как и [почти] любое объявление в С, typedef-объявление может объявлять несколько идентификаторов сразу const int a, *b, *const *c, d[5], e(void); // эквивалентно const int a; const int *b; const int *const *c; const int d[5]; const int e(void); Точно так же typedef int a, *b, *const *c, d[5], e(void); // эквивалентно typedef int a; typedef int *b; typedef int *const *c; typedef int d[5]; typedef int e(void); Именно это и используется в вашем объявлении. То, что в объявлении фигурирует union, тут никакой принципиальной роли не играет. Если бы у вашего union был указан тэг (скажем, W), то можно было разбить ваше объявление на три отдельных объявления union W { char word[16]; uint32_t chunk[4]; uint64_t big_chunk[2]; }; typedef union W Word; typedef union W *PWord;

Ответ 2



Объявлены: Word - тип объединения, PWord - тип указателя на объединение. Вас это интересовало?

Абстрактные классы, Интерфейсы и наследование

#java #классы #объекты


Почему когда Абстрактный класс имплиментирует(реализовывает) 2-3 интерфейса к примеру,
он не имплиментирует(реализовывает) методы в себя(Абстрактный класс). То есть если
в обычном классе при имплиментации мы обязаны реализовать методы, то в Абстрактном
классе компилятор никак не ругается, что мы не реализовали методы. Пробовал через наследников
абстрактного класса достучаться до этих методов, да всё работает, но не пойму почему
мы их не определяем в абстрактном классе.
    


Ответы

Ответ 1



Интерфейс по идее должен содержать только сигнатуры методов, определяющие возможности того или иного объекта, к сожалению начиная с Java 8, вас могут смущать интерфейсы, содержащие default реализации методов, но не стоит на них обращать внимания, пока не поймёте, что вам это необходимо. Абстрактный класс имеет всё, что имеет обычный класс, однако один или более его методов не содержит реализации, но тем не менее он является почти полноценным. Т.е. он уже достаточно специфичен и описывает только малую часть моделей, однако он всё ещё обобщает некоторые свойства. Типичный пример приводят на животных. Интерфейс Movable может содержать метод move, однако каждое животное двигается по своему, кто-то летает, кто-то плавает. Далее абстрактным классом может выступать птица - Bird, которая будет содержать поле крыло - Wing. А далее мы реализуем конкретную модель цыплёнок - Chicken, который вроде и содержит крыло, однако летать не умеет, поэтому ему требуется реализовать метод move, не использовав поле Wing, а только перемещение по земле. Однако при написании класса сов - Owl, будем реализовывать метод move в виде полёта используя Wing.

Ответ 2



Абстрактным является класс, содержащий один или более абстрактных методов. Такой класс может содержать и обычные методы, наследоваться от другого абстрактного класса, а также имплементировать интерфейсы. Любой класс, который наследуется от абстрактного, обязан реализовать абстрактные методы предка, либо сам быть объявлен абстрактным, оставляя их реализацию потомкам. Полностью свойства интерфейса здесь рассматривать не будем, поясним только то, что касается вопроса. Интерфейс содержит методы без реализации (не считая методов по умолчанию). Имплементировать интерфейсы могут как обычные, так и абстрактные классы. Обычные классы обязаны реализовать методы интерфейса, но абстрактные могут это делать, а могут и нет. interface Iface1{ void method1(); } interface Iface2{ void method2(); } interface Iface3{ void method3(); } abstract class Abs implements Iface1, Iface2, Iface3{ //объявляем собственный абстрактный метод abstract void absMethod(); //объявляем метод интерфейса Iface1, но не реализуем //его здесь (имеем право, но не обязаны!) public abstract void method1(); //реализуем метод из интерфейса Iface2 прямо здесь public void method2(){ System.out.println("I'm method2!"); } /*метод method3 из интерфейса Iface3 мы даже не объявляем и оставляем его для реализации потомкам*/ } class Real extends Abs{ void absMethod(){ System.out.println("I'm a real absMethod!"); } public void method1(){ System.out.println("I'm a real Iface1.method1!"); } public void method3(){ System.out.println("I'm a real Iface3.method3!"); } } class PrimerAbs{ public static void main(String[] args){ Real real = new Real(); real.absMethod(); real.method1(); real.method2(); real.method3(); } } В данном примере объявлены три интерфейса, абстрактный класс, имплементирующий эти интерфейсы и обычный класс, который наследуется от абстрактного. В абстрактном объявлен свой собственный абстрактный метод absMethod(), объявлен метод method1 из интерфейса Iface1, но не реализован, т.к. здесь не обязательно (но можно) это делать, реализован метод method2 из интерфейса Iface2, что возможно, но не обязательно. Метод method3 из интерфейса Iface3 даже не объявлен и предоставлен для решения потомкам. Следует обратить внимание, что в абстрактном классе объявление методов из интерфейса, если они не реализуются в нём, должны быть с модификаторами public и abstract, иначе компилятор начнёт ругаться.