• Чем отличается FOR от WHILE?

    DevMan
    @DevMan
    В чем разница как выводить, если результат один?
    технически разницы никакой, разница только в семантике:
    • for(буквально "для") - применяется когда нужно что-то выполнить в определенном диапазоне. то есть на человеческом языке это будет звучать примерно как: "для такого диапазона мы делаем что-то".
    • while(буквально "пока") - применяется когда нужно что-то выполнять неопределенное кол-во раз до выполнение конкретного условия. то есть на человеческом языке это будет звучать примерно как: "делать что-то пока не выполнится условие".
    Ответ написан
    5 комментариев
  • Как в PyCharm из проекта создать репозиторий на GitHub?

    @balamut108
    Py
    Создаёте новый проект, активируете VCS (Enable VCS), создаёте новый репозиторий Git, добавляете в него нужные файлы, делаете коммит, далее в VCS выбираете Import Into Version Control -> Share Project in GitHub.
    Это будет работать при условии что у Вас корректно настроены VCS в Settings -> Version Control.
    Ответ написан
    1 комментарий
  • Как передать logging из импортированных модулей в основную программу?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Чтобы правильно использовать модуль logging, нужно во всех своих модулях содавать логгеры следующим образом:
    import logging
    log = logging.getLogger(__name__)

    В модулях, которые не запускаются сами по себе, никакого другого кода инициализации и настройки логирования не требуется.
    Если вы в своём модуле желаете различать два или более вида логов, то можно сделать как-то так:
    log = logging.getLogger(__name__)
    class MyModel:
        log = logging.getLogger(__name__ + '.MyModel')
        # ...

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

    В главном запускаемом файле кроме обычного создания логгера как во всех модулях будет ещё и инициализация и настройка системы логирования.
    В самом простом виде это что-то вроде такого:
    if __name__ == '__main__':
        logging.basicConfig(stream=sys.stderr, level='INFO', format='%(asctime)s %(levelname)-7s %(message)s')

    Тут говорится, что все логи уровня >= INFO будут в указанном формате направлены в stderr.

    В более сложном случае вы можете загрузить настройку логирования из конфигурационного файла или описать кодом:
    if __name__ == '__main__':
        # У вас может быть несколько разных способов форматировать код для разных мест:
        formatter_simple = Formatter(u'%(relativeCreated)08d %(levelname)-7s %(message)s')
        formatter_complex = Formatter(u'%(asctime)s %(levelname)-7s [%(filename)21s:%(lineno)-4d] %(message)s')
        # Несколько разных хендлеров для перехвата нужного вида сообщений и отправки в правильное место:
        handler_null      = logging.NullHandler()
        handler_screen    = handler(fmt=formatter_simple, stream=sys.stderr)
        handler_main_file = handler(
            fmt=formatter_complex,
            cls=logging.handlers.TimedRotatingFileHandler,
            when='midnight',
            backupCount=5,
            encoding='utf-8',
            filename=local_path('log/server.log'),
        )
        handler_errors_file = handler(
            fmt=formatter_complex,
            cls=logging.handlers.TimedRotatingFileHandler,
            when='midnight',
            backupCount=5,
            encoding='utf-8',
            filename=local_path('log/errors.log'),
            level='ERROR',
        )
        # А потом описываем сами логгеры:
        #   это корневой логер, пропускает все сообщения через себя насквозь и в то же отдаёт их своим хендлерам
        log_root       = logger(None, level='DEBUG', propagate=1, handlers=[handler_errors_file, handler_main_file, handler_screen])
        #   этот логер перехватывает логи торнадо-приложения, пропускает через себя и отдаёт хендлерам:
        log_app        = logger('tornado.application', level='DEBUG', propagate=1, handlers=[handler_errors_file, handler_main_file, handler_screen])
        #   этот собирает логи событий модели уровня выше или равного INFO (не отладочные) 
        #     и отдаёт соответствующим хендлерам, дальше для обработки свои сообщения не пускает
        log_events     = logger('app.model.events',     level='INFO',  propagate=0, handlers=[handler_errors_file, handler_events_file])
        #   этот логер съедает и отдаёт спец-хендлеру (он не показан выше, но должен быть) все логи http доступа
        log_websrv     = logger('tornado.access',                    level='DEBUG', propagate=0, handlers=[handler_websrv_file])
        #    этот логер глотает и гасит за ненадобностью все логи, которые генерит библиотека PIL при работе с PNG-файлами
        log_pil        = logger('PIL.PngImagePlugin',                level='INFO',  propagate=0, handlers=[handler_null])

    Если сообщение не перехвачено и не остановлено специфичным логером, оно улетает корневому логеру.
    Ну примерно как-то так.
    Само собой всю эту настройку лучше вынести в отдельный модуль и запускать при старте главного файла.
    Логеры вроде log_pil, log_websrv и прочих сохранены в отдельные переменные, но по факту в коде эти переменные нигде не используются. Их можно и не присваивать вовсе. В модуле логирования все логгеры регистрируются глобально в списке и поэтому в каждом модуле не требуется ничего импортировать, достаточно создать логгер по имени. По этому имени логер ищется среди созданных или автоматом создаётся новый. Имена логгеров используют точечную нотацию, и по ступеням имени их удобно фильтровать.

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

    P.S.
    Старайтесь не использовать CamelCase в именовании файлов проекта. Не смотря на то, что негласное это правило часто нарушается даже популярными библиотеками, всё же это часто создаёт лишнюю неразбериху и проблемы.
    В частности много геморроя можно поиметь переименовав файл сменив лишь регистр символа под контролем версий при работе с репозиторием на разных файловых системах. В винде, к примеру, регистр в именах сохраняется, но системой не различается, а в линукс различается. Таким образом винда не увидит переименования, а линукс увидит. Это может породить адский треш.
    Ответ написан
    Комментировать
  • Можно ли выравнивать линию по краю монтажной области?

    RAX7
    @RAX7
    В панели выравнивания галочку поставь
    5e58de1f0bb83513763638.png
    Ответ написан
    Комментировать
  • Почему парсер всех внутренних ссылок сайта на Python не хочет парсить некоторые сайты?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    На в каждом теге "a" есть `href`.
    from urllib.parse import urlparse
    from bs4 import BeautifulSoup
    import requests
    import lxml
    DOMAIN = 'apexair.ru'
    HOST = 'http://' + DOMAIN
    FORBIDDEN_PREFIXES = ['#', 'tel:', 'mailto:']
    links = set()  # множество всех ссылок
    headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
    response = requests.get(HOST, headers=headers)
    # print(response.content)
    
    def add_all_links_recursive(url, maxdepth=1):
        # print('{:>5}'.format(len(links)), url[len(HOST):])
    
        # глубина рекурсии не более `maxdepth`
    
        # список ссылок, от которых в конце мы рекурсивно запустимся
        links_to_handle_recursive = []
        # получаем html код страницы
        request = requests.get(url, headers=headers)
        # парсим его с помощью BeautifulSoup
        soup = BeautifulSoup(request.content, 'lxml')
        # рассматриваем все теги <a>
    
        for tag_a in soup.find_all('a', href=lambda v: v is not None):
            link = tag_a['href']
    
            # если ссылка не начинается с одного из запрещённых префиксов
            if all(not link.startswith(prefix) for prefix in FORBIDDEN_PREFIXES):
                # проверяем, является ли ссылка относительной
                # например, `/oplata` --- это относительная ссылка
                # `http://101-rosa.ru/oplata` --- это абсолютная ссылка
                if link.startswith('/') and not link.startswith('//'):
                    # преобразуем относительную ссылку в абсолютную
                    link = HOST + link
                # проверяем, что ссылка ведёт на нужный домен
                # и что мы ещё не обрабатывали такую ссылку
                if urlparse(link).netloc == DOMAIN and link not in links:
                    links.add(link)
                    links_to_handle_recursive.append(link)
    
        if maxdepth > 0:
            for link in links_to_handle_recursive:
                add_all_links_recursive(link, maxdepth=maxdepth - 1)
    
    
    def main():
        add_all_links_recursive(HOST + '/')
        for link in links:
            print(link)
    
    
    if __name__ == '__main__':
        main()
    Ответ написан
    5 комментариев
  • Как разместить PDF файлы на одном большом листе по координатам?

    NeiroNx
    @NeiroNx
    Программист
    Как то так(код писался по документации и может не работать):
    from PyPDF2 import PdfFileReader, PdfFileWriter
    from PyPDF2.pdf import PageObject
    
    
    reader = PdfFileReader(open("in.pdf",'rb'))
    min_page = reader.getPage(0)
    #Большая страница вместит 4 старницы (2x2)
    big_page = PageObject.createBlankPage(None, min_page.mediaBox.getWidth()*2, min_page.mediaBox.getHeight()*2)
    #mergeScaledTranslatedPage(page2, scale, tx, ty, expand=False)
    #https://pythonhosted.org/PyPDF2/PageObject.html
    big_page.mergeScaledTranslatedPage(reader.getPage(0), 1, 0, 0)
    big_page.mergeScaledTranslatedPage(reader.getPage(1), 1, min_page.mediaBox.getWidth(), 0)
    big_page.mergeScaledTranslatedPage(reader.getPage(2), 1, 0, min_page.mediaBox.getHeight())
    big_page.mergeScaledTranslatedPage(reader.getPage(3), 1, min_page.mediaBox.getWidth(), min_page.mediaBox.getHeight())
    
    writer = PdfFileWriter()
    writer.addPage(big_page)
    
    with open('out.pdf', 'wb') as f:
    	writer.write(f)
    Ответ написан
    1 комментарий
  • Как сунуть уже готовый проект в репозиторий?

    skubatko
    @skubatko
    Java Developer
    сам попробовал наскоком изучить, получилось не очень хорошо, делали совместный проект, народ просил не пушить меня некоторое время код, а почему, я только месяц назад понял, когда шаг за шагом прочитал учебник по гиту https://git-scm.com/book/ru/v2

    по IDE, думаю во всех современных такая опция есть, я пользую IDEA https://www.jetbrains.com/idea/ тут хорошо реализовано

    после прочтения учебника использую пока только терминал

    резюме: рекомендую потихоньку выучить основы по учебнику и затем совершенствоваться
    в качестве бонуса: есть бесплатный хороший видео-курс https://geekbrains.ru/courses/66

    теперь собственно по сабжу: путем некоторых экспериментов с потерей и восстановлением кода пришел к такой последовательности:

    открываем Terminal в нужной папке с проектом и затем вводим последовательно команды:

    git init
    git add --all
    git commit -a -m 'first commit'
    git remote add origin https://github.com/user/project.git !! поменять https на свой линк на репозиторий
    git pull --rebase origin master
    git push origin master
    Ответ написан
    4 комментария
  • Как правильно разносить код в JavaFX+FXML с моделью MVC?

    jamakasi666
    @jamakasi666
    Просто IT'шник.
    domanskiy, пытайтесь и осваивайте, только перед этим почитайте книгу, статью о MVC, что это, зачем, как и где применяется, как используется в java и в javafx в частности. Скажу даже по другому, MVC это обобщенный принцип, а вот его реализаций в подходе уйма.
    Сам вопрос противоречит вообще всему.

    Если утрировать то примерно так образно будет выглядеть один из вариантов MVC в javafx:
    К примеру программа которая должна читать\сохранять файл, и выводить содержимое в таблицу на форме.
    M (Model) - скажем будет DataModel.class. В нем 3 функции loadData(), saveData() и getData(). Реализует полностью логику работы Как читать\писать файл. Как переварить данные, сложить\умножить\...
    V (View) - это непосредственно то как что то будет отображено на форме, т.е. это сам FXML файл или класс описывающий интерфейс, где какая кнопка, как она выглядит. Предоставляет ListView и пару кнопок для обращения к себе. Абсолютно ничего не знает откуда и как берутся данные для отображения(т.е. совсем).
    С (Controller) - к примеру DataController.class. Этот класс знает только что предоставил View (опять же просто знает что там есть UI который сам нарисует) и пару кнопок, опять же не знает как они выглядят, где они находятся. Также знает где взять данные (из DataModel) но абсолютно не знает как она их получает. По итогу, тут идет стык Представления и Данных. Просто берет из DataModel методом getData() данные и передает их в View в listView. Берет событие кнопки load и вызывает в DataModel метод loadData(). При этом еще раз, контроллер понятия не имеет, где там кнопка на форме, как добываются данные, ему это до фени.
    Как итог каждая часть не зависит от другой. Надо чтобы вместо получения данных из файла они брались из БД или телепатией? Не вопрос, просто переделай DataModel.class , все остальные части программы даже не поймут что что то изменилось. Надо вместо JavaFX отдать данные в виде вэб странички? Пожалуйста меняй View и опять же ничего другого переделывать не надо.

    А теперь возвращаемся к началу, бегом читать литературу.

    А и еще на за метку, любые длительные работы надо выполнять в фоне и дозаполнять ими форму. Если же данные влияют на отображение то для этого существуют прелоадеры (вот запускаешь ты свою IDE и видишь сначала квадратик с картинкой и прогресбаром и только следом отображается окно программы).
    Ответ написан
    1 комментарий
  • Как удалить запрещенные символы из строки?

    adugin
    @adugin Куратор тега Python
    >>> s = 'abc<def*gh?ikl'
    >>> s.translate(None, '\/:*?"<>|')
    'abcdefghikl'
    Ответ написан
    9 комментариев
  • Как в PYTHON заменить символы в строке используя массив?

    sswwssww
    @sswwssww
    text = "Pantone 485 C"
    arr = ['Pantone ', ' C']
    for x in arr:
        text = text.replace(x, "")
    Ответ написан
    1 комментарий
  • С чего начать изучать яндекс.директ?

    DeoZ
    @DeoZ Куратор тега Яндекс.Директ
    Веб-разработка и Реклама
    На этой неделе уже был подобный вопрос. Что-то теперь слишком часто...
    Я бы не рекомендовал курсы. поскольку там Вы получите однобокий подход, который будут навязывать как аксиому. А нередко такие подходы на курсах дают с ошибками, от которых потом будет сложно отвязаться. Курсы сейчас - это больше инфобизнес про зарабатывание денег, а не реальное обучение.
    Поэтому лучше всё по стандарту - справка Яндекса, вебинары Яндекса и eLama, статьи на тематических ресурсах и общение в сообществах, заведение аккаунта, пробный запуск рекламы.
    Я начинал 9 лет назад сразу в агентстве, куда пришёл устраиваться веб-мастером. Мне дали возможность попробовать, поучиться у других профессионалов. Через 3 года стал тимлидом. Вариант с агентством вообще самый лучший вариант для обучения.
    Ответ написан
    4 комментария
  • MVC php на пальцах?

    @Silm
    Просто говоря MVC - физическое разделение кода на три основные логические части: Model, View, Controller с которыми мы обязуемся работать определенным образом в целях облегчения процесса разработки.

    В файлах моделей описываются данные и происходит основная их обработка. Логично, что тут мы работаем и с базой данной.

    В отображениях (View) располагается так называемый "шаблон". Как правило это файлы с HTML версткой и PHP логикой отвечающей за отображения конкретных элементов. Например, тут нельзя делать запрос к БД, но можно написать цикл, который будет отображать блоки верстки с новостями.

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

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

    Запрос попадает в нужный контроллер (контроллер постов). Он начинает собирать нужные данные:
    • Контроллер достает из настроек название сайта.
    • Контроллер обращается к модели отвечающей за посты, в ней содержатся различные методы, отвечающие за работу с постами (вывод списка постов, отображение одного поста, редактирование поста итп), каждый метод может делать различные запросы к БД и производить необходимые манипуляции с данными. В данном случае мы вызываем метод getPost() который получает id поста, делает выборку из БД и возвращает результат.
    • Данные из модели возвращается в контроллер. Если пост с переданным id не был найдет, именно контроллер перенаправит пользователя на страницу с кодом 404.
    • Но в нашем случае пост был найден и теперь контроллер берет из полученных данных название поста и обращается к модели ответственной за получение похожих публикаций, она на основе полученного названия возвращает массив из похожих названий статей и их id (все что нужно в нашем примере для отображения списка ссылок).
    • Контроллер собрал все что было нужно и теперь берет заданный нами файл шаблона отображения и передает туда все необходимые данные.
    • В отображении мы отображаем название сайта в тайтле, внутри верстки выводим наш пост, а по массиву похожих публикаций приходимся циклом отображая его как список ссылок.
    • Страница с постом успешно отображена.

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

    Чтобы понять, что еще может делать каждая из частей и как вообще это выглядит, изучите документацию и примеры по одному из популярных PHP фреймворков, например, таких как Yii и Laravel.
    Ответ написан
  • MVC php на пальцах?

    DevMan
    @DevMan
    если у вас примитивная форма для добавления данных в базу, то заморачиваться с mvc никакого смысла нет -> для написания простых скриптов mvc нахер не уперся.
    Ответ написан
    5 комментариев
  • MVC php на пальцах?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ох...

    Model View Controller. Да ну его, ему уже 45 лет (придумали в 79-ом году). Давайте лучше про Model View Adapter погокорим. это то что все используют в популярных фреймворках последние лет так 10 так точно.

    mvc-mvp-mvvm-6-638.jpg?cb=1375170002

    Вообще в этом всем важно не только то, что каждая буква обозначает, а как они друг с дружкой связаны.

    View - это не только HTML, но и вообще представление в целом, а так же логика его формирования. Шаблонизаторы, фильтры, различные функции/объекты помогаютщие нам сформировать view (например форматирование дат, сериализаторы и т.д.) В подавляющем большинстве случаев "представление" наших данных - это HTTP запросы и HTTP ответы. HTML - э то лишь часть HTTP ответа.

    Model - Это целый слой, который может быть представлен в виде кучи отдельных объектиков, структур и т.д. Его задача - делать дела и хранить/менять состояние системы. Тут легко запутаться потому что термин "модель" много чего значит. Воспринимайте его как "слой логики" а не конкретные объекты. И да - база данных и прочая чушь - это детали реализации этого слоя. "не важные штуки" словом. Туда же и ActiveRecord, ORM-ки всякие. Это деталь реализации и все остальные чуваки (view и controller) о них знать ничего не должны (хотя иногда могут в целях упрощения).

    Controller или адаптер. Это опять же не обязательно один объект. это может быть цепочка адаптеров (еще называют фронт-контроллером, middlewares и т.д.). Его задача весьма простая. Получаем представление данных на входе (HTTP запрос), определяем что надо делать, и просим модель что-то сделать (ни в коем случае не меняем ничего самостоятельно в контроллере, он только просит). Потом мы можем попросить модель вернуть нужный нам кусок состояния, и попросить View сформировать представление (HTTP ответ).

    Как-то так. В целом же это я сейчас описал "идеальный мир". Вся суть этого подхода - разделение логики презентационной и логики приложения. Зачем это надо? что бы было проще жить! Обычно UI приложения или способы взаимодействия с ним меняются почаще логики или как минимум в разные моменты времени. Адаптеры в этом случае служат промежуточным слоем, они ничего сами не делают, это "переводчики". Они просто переводят то, что сказано в запросе в язык понятный приложению и обратно.

    Но на начальной стадии можно слегка нарушать эти правила, делать толстые контроллеры и т.д. В этом случае бизнес логика будет потихоньку "вытекать" из модели. Это не хорошо, и на хоть сколько нибудь больших проектах может привести к проблемам. Потому важно находить баланс.
    Ответ написан
    Комментировать
  • Как сделать формирование динамического PDF в NodeJS?

    boratsagdiev
    @boratsagdiev
    pdfkit.org - библиотека для генерации
    https://github.com/alvarcarto/url-to-pdf-api - конвертация url в pdf как микросервис
    Ответ написан
    2 комментария
  • Как сделать Todo list на php?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    использовать var_export и хранить массив в файле.
    Ответ написан
    Комментировать
  • Является ли October CMS стабильно развивающимся проектом в 2018 году?

    riky
    @riky
    Laravel
    просмотрел много cms на базе laravel, их довольно много и у всех какие то недостатки свои. выбрал октябрь как наиболее приемлимый для себя.
    октябрь довольно сильно расширяет ларавел. в этом есть и плюсы и минусы.
    ну а вообще год назад тоже был вопрос развивается ли он (тогда он был на устаревшем ларавел 5,2 и я уже думал проект скончался), но в этом году обновили до 5,5.
    вообще на данный момент там очень много реализовано функций, и все что надо можно доделать в своих плагинах.

    Стоит ли обратить на нее внимание, как на альтернативу ModX и WP?

    я бы сказал так, если не уметь программировать - то лучше WP, там плагинов больше.
    если уметь - то лучше октябрь - дает больше свободы. Если знать ларавел, то это дает еще больше свободы (хотя его знания не обязательны, октябрь дает свою абстракцию, и свой некий фреймворк над фреймворком).
    Ответ написан
    1 комментарий
  • Как в Excel реализовать поиск и выборку значений по шаблону?

    Piocan-Alex
    @Piocan-Alex
    Прокачался до рейдера и дредноута в EVE
    Вам поможет расширенный фильтр www.planetaexcel.ru/techniques/2/197 . Внимательно нужно посмотреть табличку критерии и исходя из нее в ячейке написать =*??.??.????*, тогда он будет искать любые значения в таком формате, попробуйте. Главное он автоматически копирует данные в новую таблицу.

    У меня получилось решить подобные задачи с его помощью, надеюсь и вам поможет.
    Ответ написан
    Комментировать
  • XPATH Query Сравнение чисел. Как задать что бы возвращались параметры: на случай "ложь" и "истина"?

    @Farwisdomer
    /JOBS[Param1>Param2]/Param3/text() | /JOBS[Param1<=Param2]/Param3/другой
    Ответ написан
    Комментировать