Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (3)

Наибольший вклад в теги

Все теги (13)

Лучшие ответы пользователя

Все ответы (11)
  • Как распределить время при обучении программированию?

    @danSamara
    Мой ответ будет несколько груб и не типичен, однако: "Станьте говнокодером!"
    Я не шучу - берите реальные задачи и решайте их как можете - по наитию, по кривым советам из гугла и stackoverflow, но главное - делайте законченные решения, получайте результат который работает.
    Любую задачу сначала решайте сами - нужно сделать сортировку - пишите алгоритм и радуйтесь, что он работает. А уже потом - читайте как надо сделать, и только после этого (если почувствуете потребность!) - читайте теорию.
    Все книги что вы написали безусловно волшебны и необходимы для отличного программиста, однако без практики они - пыль, которая развеется спустя неделю после прочтения. Поверьте мне, я их все читал :)
    Кстати Кнута я бы вычеркнул без раздумий - для его чтения и понимания нужен очень хороший мат-базис и опыт в программировании. Если случиться, что вы будете писать оптимизированные библиотеки для обработки данных на С - тогда и начинайте его читать, очень пригодится, отвечаю )
    Пример обучения:
    1. Ставим задачу. Пример - написать приложение, которое выводит топ-10 вопросов на Тостере.
    2. Разбиваем задачу на проблемы которые надо решить. Пример - развернуть рабочее окружение, понять как сделать "Hi world", как работать с сетью, как парсить HTML
    3. Решаем проблемы. В лоб. Задание - на скорость, всё должно быть решено в кратчайшие скроки. Для каждой проблемы используем любое решение которое попалось под руку. Буквально - первое, это важно! То есть реально ковнокодим, забивая на всё - на красоту кода, на оформление, на скорость, лишь бы работало! Девиз этого этапа - херак, херак и в продакшен! Результат этапа - рабочее приложение.
    4. Делаем поверхностный анализ. Задача решена? Есть ли косяки которые уже не нравятся? Как их можно решить, исходя из минимального опыта? Локализуем проблемные участки исходя из собственных взглядов. Результат этапа - опыт самостоятельного анализа кода.
    5. Делаем глубокий анализ. Пытаемся для каждой задачи подобрать лучшее решение из тех что есть. Читаем теорию о том, как надо делать на самом деле. Изучаем и внедряем паттерны, пытаемся сделать код, который можно переносить в другой проект. Важно не менять условия задачи, вроде "а можно же ещё вывести ответы на вопросы". Не можно, задача должна оставаться прежней. Результат этапа - хороший код и выявленные пробелы в знаниях.
    6. Отдыхаем, читая теорию в рамках решённых задача и около них. Результат - теория, подкреплённая практикой.
    7. GOTO 1.
    Ответ написан
  • Возможна ли адаптивная верстка под любое разрешение экрана?

    @danSamara
    Думаю вам надо изменить сам подход к вёрстке - нельзя верстать под конкретные разрешения, это тупиковый путь с бесполезными затратами времени.
    Оптимальный workflow примерно такой:
    1. Делаем максимально резиновую вёрстку. Всё что может быть резиновым - должно им быть, включая изображения. На этом этапе можно с картинками сильно не заморачиваться и делать просто { width: 100%; height: auto; }, перфекционизм - позже.
    2. Расставляем брекпоинты. Обратите внимание: их надо расставлять не по "популярным" разрешениям экрана, а в соответствии с дизайном! Как пример - вывод товаров в каталоге в виде сетки. На большом экране будет четыре товара в ряд (25% ширины), потом - три, два и, наконец, для телефонов в портретной ориентации - один товар (100% ширины). Разрешение, при котором будет "перепрыжка" товаров с четырёх в строке на три (и прочие) надо определять визуально, лучше вместе с дизайнером. Результатом этого этапа должен быть сайт, который с максимального разрешения (допустим 2000 пикселей) до минимального (200?) красиво меняется в браузере при плавном изменении размера окна.
    3. Тестируем на популярных разрешениях экрана. Заметьте, это практический последний этап. Если предыдущие этапы сделаны правильно, то на этом не остаётся никакой работы - просто проверка.
    4. Наводим лоск. Здесь уже можно заняться оптимизациями и украшательставами. В частности - сделать разные источники для каждой картинки. Не буду подробно описывать технологии, руководств много в сети, по картинкам например вот: "Отзывчивые изображения: примеры использования"
    Ответ написан
  • Как запоминать код, который писал две недели назад?

    @danSamara
    Значит вы ещё не программист, а кодер. Это не страшно, вопрос опыта.
    Главное отличие программиста от кодера - программмист пишет код в голове - набивание кода в IDE это самое нудное в программировании, весь смак - в проектировании. А вот кодер пишет код кусочками, которые берёт из интернета или из собственных внезапных озарений.

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

    ПРОФИТ!
    Ответ написан
  • Медленный парсинг на Python с BS4?

    @danSamara
    Задачи, связанные со скраппингом, относятся одновременно и к IO-bound и к CPU-bound (как вам подробно рассказали в предыдущем ответе). С одной стороны это порождает множество проблем для новичков, с другой - знание этих особенностей помогает с архитектурой - вам просто не остаётся выбора :)

    Давайте теперь разберём подробно ваш вопрос.

    IO-bound
    Всё что использует множественный ввод-вывод, должно быть асинхронным, кроме тех случаев, когда абсолютно плевать на время выполнения, а это не ваш случай :) Я думаю, причины этого очевидны - любые внешние сетевые задержки вам неподконтрольны (да и внутренние не очень) - запрос на страницу сайта может занять как несколько миллисекунд, так и минуту (это редкость, но несколько секунд - вполне), то есть разница достигает 4-5 порядков! В случае синхронного однопоточного кода львиная доля работы вашего приложения - ожидание, что, согласитесь, обидно. Пример кода вам привёл Roman Kitaev - необязательно ориентироваться конкретно на эту реализацию - в сети очень много примеров современного питонячего асинхронного кода, скачивающего странички.

    CPU-bound
    Здесь ещё проще - вам нужно загрузить равномерно все ядра, попутно, если мы говорим про Python, нивелировать влияние GIL. Обычно это решается созданием нескольких потоков - по числу ядер и очередью (или несколькими), из которой потоки берут данные для обработки.

    Память
    Малое потребление памяти - признак хорошей архитектуры кода.
    Обычные веб-страницы весят немного - сотни килобайт - и редко доставляют проблемы, но бывают и задачи обработки очень объёмных XML/HTML документов - десятки и сотни гигабайт. Но даже документ "весом" под сотню мегабайт может принести много радости. В этом случае прибегаю к помощи потоковых парсеров - они работают с небольшим буфером, вызывая обработчики для нужного контента. Опять же - не ваш случай, что хорошо )

    Медленный Python
    О, как часто можно это услышать и прочитать!
    К сожалению, эта легенда легко получает подтверждение у новичков, плохо представляющих себе экосистему питона и плохо понимая его внутреннее устройство, хотя эти знания легко приобретаются через пару месяцев использования языка. Отличительный признак подобных критиков - отсутствие внятной аргументации и советы типа: "пишите на нормальном языке! а нормальный это - [%random_lang%]". В этом треде, как видите, отличился DarthWazer.
    Да, имеется достаточно задач, с которыми "чистый" питон справляется очень медленно, но для таких случаев всегда найдётся "батарейка-обёртка" для библиотеки, написанной на C и никаких особых тормозов вы не заметите.
    Python - это язык-клей, позволяющий быстро, легко и элегантно соединить несколько низкоуровневых инструментов и получить отличный результат.

    В качестве эксперимента давайте сравним Python и Rust ( DarthWazer, это достаточно быстрый язык или только шарп надо использовать?)

    Сначала сохраним главную страницу в файл "wiki_front.html" - скачивание страниц сравнивать бессмысленно.

    Python
    1. Создаём окружение и устанавливаем lxml:
      pipenv install lxml --python=3.8
    2. Пишем код:
      main.py
      from lxml.html import parse
      import time
      
      
      if __name__ == '__main__':
          with open('wiki_front.html', 'r') as contents:
              begin = time.monotonic()
              doc = parse(contents)
              links = doc.xpath("//a")
              time_total = time.monotonic() - begin
              print(f'Links counts: {len(links)}, time: {time_total:.9} sec')

    3. Запускаем:
      pipenv run ./main.py
      Links counts: 333, time: 0.00371371489 sec

    4. Запоминаем результат: 0.00371 сек. Ваш результат, конечно, будет отличаться, это не критично, важно сравнение.


    Ок, переходим к Rust
    1. Создаём проект:
      cargo init
    2. Добавляем в зависимости scraper:
      Cargo.toml

      .....
      [dependencies]
      scraper = "*"

    3. Пишем код:
      src/main.rs
      use std::fs;
      use std::time::Instant;
      
      use scraper::{Html, Selector};
      
      
      fn main() {
      
          let contents = fs::read_to_string("wiki_front.html")
              .expect("Something went wrong reading the file");
      
          let begin = Instant::now();
          let document = Html::parse_document(&contents);
          let selector = Selector::parse("a").unwrap();
          let links_count = document.select(&selector).count();
      
          println!("Links counts: {}, time: {} sec",
                   links_count, begin.elapsed().as_secs_f32());
      
      }

    4. Запускаем:
      cargo run --release
      Links counts: 333, time: 0.002836701 sec

    5. Сравниваем результаты: разница - 0.8 милисекунд.


    Вывод: Rust тоже медленный, пишите свои скраберы на шарпе.

    Что же делать?
    Ну и, наконец, ответ на ваш вопрос :)
    Примерно год назад я задавал вопрос по вашей теме - Какой выбрать Python фреймворк для системы парсинга сайтов?
    Можно использовать один из упомянутых фрейворков. Или написать свой, если достаточно компетенций.
    Ответ написан
  • Chmod -R 777 / или как я убил систему одной командой?

    @danSamara
    Фундаментальное отличие Windows от Linux: разработчики винды считают юзера (даже админа) тупее системы (думаю, согласно статистике, они правы), разработчики линя - умнее (что наверняка тоже согласуется со статистикой). Поэтому когда вы запускаете команды из под рута, чётко понимайте какие последствия произойдут.

    Я столько всего там настраивал, можно ли как-то переустановить образ но сохранить данные ( конфиги в etc, папку home и т.д )?

    Сомневаюсь, что вы настроили что-то сложнее чем Nginx+php-fpm+почта+mysql+сертификаты+ssh. Опытный админ это сделает за полчаса, пятнадцать минут из которых у него будут работать автоматические скрипты развёртывания (или пять минут, если сервер шустрый).

    Может можно отключить систему прав в Linux, я не до конца понимаю, как мне, например, залить файлы в папку wget'ом а редактировать через ftp. Мне можно как-то юзера FTP добавить в root группу?

    Нельзя. Даже если бы такая возможность существовала. Она вам мешает, потому что вы её не знаете. Правильно настроенная система не требует постоянного изменения прав и работает прозрачно, помогая вам поддерживать уровень безопасности на должном уровне.
    Конкретно по вашему проблеме с доступом: почитайте про юзеров и группы в линуксе.
    По вашей ситуации: ничего не делайте сами! Наймите админа, который развернёт новую систему и корректно перенесёт данные, это не будет стоить дорого, уверен. Заплатите денег и получите правильно настроенную систему и, бонусом, хорошее знакомство с девопсом - это правильная инвестиция в ваше развитие.

    На будущее:
    • не используйте FTP
    • читайте документацию
    • экспериментируйте на виртуальной машине
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (1)