Задать вопрос
  • Греется ли Macbook Pro 2015 15'' MJLQ2 (со встроенной графикой) во время работы в IDE и браузерах с двумя внешними мониторами?

    rockon404
    @rockon404 Автор вопроса
    Frontend Developer
    Подтверждаю слова, Андрея. Macbook Pro 2015 15" MJLQ2 отлично подходит для работы с передовым фронтендом и двумя внешними мониторами и при этом не греется.
    Одновременная работа Webstorm с проверкой flow и prettier в реальном времени, Slack, Chrome с консолью разработчика, PhpStorm с открытой базой и браузера Opera с кучей вкладок не греют ноут. Вентиляторы почти не слышно, даже если, при всем при этом смотреть видео на Youtube.
    Зато оперативки на все это уходит 12Gb.
    Но заставить ноутбук включить вентиляторы можно, например, активной работой с диском, выполнив yarn install (npm install) в большом проекте. Шумят вентиляторы, когда заводятся на полную, громко и в какой-то не похожей на другие ноутбуки тональности. К слову работает с диском очень быстро по сравнению со старым ноутбуком, на котором был не медленный SSD от Toshiba и поддержка SATA 3.
    В целом очень доволен. Отличная машина для работы. Тихий, быстрый. Система удобная, хоть и лишена некоторых плюх Linux. Клавиатуру не заценил, так как использую внешнюю механику Vortex Race 3.
    Монитор шикарный, правда не используется.
    Вход для наушников поддерживает гарнитуру.
    Можно воткнуть два монитора по mini Display Port, с мониторами Dell U серии такие идут в комплекте и никаких переходников не надо.
    Определенно советую к покупке.
    Ответ написан
    4 комментария
  • Как реализовать корзину на django?

    @deliro
    1. Оформи код соответственно
    2. Модель херня. Научись О2М связям
    3. Стоит ли хранить корзины на бэкенде? Их хранят на бэкенде, когда любят спамить людей, бросивших корзины
    4. В коде
    basket = Basket.objects.filter(user=request.user, book=book).first()
        if not basket:
            basket = Basket(user=request.user, book=book)
            basket.quantity += 1
            basket.save()


    Ошибка

    Вот пример одной корзины, которую я делал несколько лет назад.

    basket.py
    from collections import UserDict
    
    from core.models import ProductOption, Product
    from .models import Item
    
    
    class Basket(UserDict):
        changed = False
    
        def add(self, quantity=0, option=None, set_=False):
            self.changed = True
            id_ = str(option.product.id)
            option = str(option.id)
            self.setdefault(id_, {})
            self[id_].setdefault(option, 0)
    
            if set_:
                self[id_][option] = quantity
            else:
                self[id_][option] += quantity
    
            if self[id_][option] <= 0:
                del self[id_][option]
                if not self[id_]:
                    del self[id_]
                return 0
            else:
                return self[id_][option]
    
        @property
        def total_count(self):
            return sum(x for product, options in self.items() for _, x in options.items())
    
        @property
        def total_price(self):
            prices = {str(id_): price for id_, price in
                      Product.objects.filter(id__in=self.keys()).values_list('id', 'price')}
            return sum(x * prices[product] for product, options in self.items() for _, x in options.items())
    
        def cost(self, option):
            price = option.product.price
            return self.count_option(option) * price
    
        def count_option(self, option):
            product_id = str(option.product.id)
            option_id = str(option.id)
            return self.get(product_id, {}).get(option_id, 0)
    
        def flush(self):
            self.changed = True
            for key in list(self):
                del self[key]
    
        def build_order(self, order):
            items = []
            for product_id, data in self.items():
                product = Product.objects.get(id=product_id)
    
                for option_id, quantity in data.items():
                    if quantity == 0:
                        continue
                    option = None
                    if option_id != '0':
                        option = ProductOption.objects.get(id=option_id)
                    items.append(
                        Item(order=order, option=option, quantity=quantity, product=product)
                    )
            order.items.bulk_create(items)
            self.flush()
            return order
    
        def fix(self):
            """Фиксит корзину на случай, если опции удалили, а они находятся в корзине"""
            ids = self.keys()
            exist_in_db = (Product.objects
                           .filter(id__in=ids, options__in_stock=True, options__show=True)
                           .values_list('id', flat=True))
            to_remove = set(ids) - set(str(x) for x in exist_in_db)
            for id_ in to_remove:
                del self[id_]
            if to_remove:
                self.changed = True
    
        def to_dict(self):
            return dict(self)

    middleware.py
    from django.utils.deprecation import MiddlewareMixin
    from .basket import Basket
    
    
    class BasketMiddleware(MiddlewareMixin):
        def process_request(self, request):
            request.basket = Basket(request.session.get('basket', {}))
    
        def process_response(self, request, response):
            if getattr(request, 'basket', None) is None:
                return response
            if request.basket.changed:
                request.session['basket'] = request.basket.to_dict()
                request.session.save()
            return response

    settings.py
    # ...
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
    MIDDLEWARE_CLASSES = [
        # ...
        'orders.middleware.BasketMiddleware',
    ]
    # ...

    views.py
    @method_decorator(csrf_exempt, name='dispatch')
    class ChangeBasketOption(View):
        def post(self, request):
            change = int(request.POST.get('change'))
            pk = int(request.POST.get('id'))
            set_ = bool(request.POST.get('set', 0))
            option = get_object_or_404(ProductOption, pk=pk)
            value = request.basket.add(option=option, quantity=change, set_=set_)
            cost = request.basket.cost(option)
            return JsonResponse({
                'value': value,
                'cost': cost,
                'total': request.basket.total_price
            })
    
    
    class Basket(FormView):
        template_name = 'orders/basket.html'
        form_class = OrderForm
        success_url = reverse_lazy('ordered')
    
        def get(self, request, *args, **kwargs):
            request.basket.fix()
            return super().get(request, *args, **kwargs)
    
        def get_context_data(self, **kwargs):
            kwargs['products'] = Product.objects.filter(id__in=self.request.basket.keys())
            kwargs['can_order'] = self.request.basket.total_price >= min_order_cost()
            return super().get_context_data(**kwargs)
    
        def get_form_kwargs(self):
            kwargs = super().get_form_kwargs()
            kwargs['user'] = self.request.user
            return kwargs
    
        def form_valid(self, form):
            order = form.save()
            order = self.request.basket.build_order(order)
            mail_new_order(order)
            return super().form_valid(form)



    Смысл в том, что все корзины хранятся только в куках (из-за SESSION_ENGINE) у самих пользователей. Это означает, что хоть миллиард юзеров зайдёт и добавят по миллиону товаров — они не прибавят ни байта занимаемого места на HDD, пока не сделают заказ. К тому же, куки — очень быстрое хранилище и изменения в корзине происходят моментально. К примеру, AJAX запросы в ChangeBasketOption в среднем занимают 30мс в браузере.
    Ответ написан
    Комментировать
  • Как определить первый элемент словаря в словаре?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Прежде всего надо учитывать, что до Python 3.7 словари были неупорядоченной коллекцией, а потому понятие "первый" не имело смысла. В Python 3.7 можно сделать так
    def first(d):
        return next(iter(d.values() if d else []), None)
    
    value = first(first(a))

    Впрочем, в вашем случае это выглядит как подпирание костылём неправильно выбранных структур данных.
    Ответ написан
    4 комментария
  • Почему Python + imap выдаёт ошибку "'ascii' codec can't encode characters" при поиске по теме письма на русском языке?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что по стандарту заголовки письма (From, To, Subject, ...) могут содержать только печатные символы из ASCII-128, то есть с кодами от 0x20 до 0x7F.
    Ответ написан
    2 комментария
  • Что делать если youtube занимает слишком много времени?

    Kadzi
    @Kadzi
    Ом
    Тут речь о мягких навыках, в частности про управление собой и концентрацию.

    Как вариант, использовать эту привычку во благо. Посещать ютуб стало привычкой, теперь нужно культивировать просмотр нужного контента.

    Начать стоит с коротких полезных видео по тематике профессии или что-нибудь про софт-скилы. Уверен, что никаких резких изменений не последует, но, культ полезного контента даст плоды.

    Вот например, чтобы изучить что-то основательно, нужно курить 3-4 часовые видео + практика, но в реалиях такого энтузиазма мало у кого есть, поэтому, как вариант начать с 5-15 минутных видео. Просто начать.

    У меня была точно такая же история, только вместо ютуба я читал тостер)))) Понимая, что не могу с собой ничего поделать, я начал просматривать по 300-400 советов из разных тематик ежедневно в том числе рубрики в которых я полный ноль. А позже я культивировал полезный поиск + сбор полезных материалов, в том числе из комментариев.

    Я купил ежедневник, где что-то зарисовываю или записываю о том, что я смотрю и читаю, подстегивая себя к новым знаниям. Это своеобразная медитация. Скептически всегда относился к ежедневникам, но оказалось забавно, как такая штука может якорить и напоминать: не останавливайся, чувак!

    В один момент, я понял, что хочу углубляться по вопросам и перескочил с тостера на видео, книги и практику. Начинал так же, с банальных вещей, которые культивировал. Например, что такое цвет? И по 15-20 мин ежедневно что-то читал, смотрел изучал, пока не захотелось это делать по 30 мин в день. некоторые вещи я хочу делать теперь по 3-4 часа в день.

    Мой посыл в том, что резкой перемены не произойдет. А чтобы произошла перемена ты сам должен сказать себе: так, мне пора на следующий уровень. Чтобы попасть на следующий уровень окружи себя инфополем текущего, пока эта информация не покажется усвоенной.

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

    Мягкие навыки 1
    мягкие навыки 2
    40 правил философии ответственности обрати внимание на 2 правило
    теория психики
    рекомендую его заметки

    Давай ещё разок: тебе не сжигать мосты нужно, а выжать полезное действие из привычки.

    0. Никаких резких перемен не будет.
    1. Почитать про софт скилы и что формирует их.
    2. Продолжить смотреть ютуб, разбавив ежедневной рубрикой "полезные 15 минут"
    3. Окружить себя инфополем текущего уровня, пока не захочется на следующий. А захочется, так как эти 15 минут превратятся рано или поздно в 20, а потом в 30. Культивация полезного действия.
    4. Попав на новый уровень, проделать тоже самое.

    Культ полезного действия применим к любым жизненным ситуациям. Учиться учиться, учиться правильно читать, искать, серфить, смотреть и слушать. Это тоже навык.
    Ответ написан
    Комментировать
  • Насколько важен PHP в системном администрировании?

    mindtester
    @mindtester
    http://iczin.su/hexagram_48
    Есть ли связь между PHP и системным администрированием?
    нет

    ps разве что если админу надо сопровождать сайт на php. с таким же успехом можно говорить о связи админства с 1С, к примеру, и это будет, возможно, даже чаще востребовано

    pps теоретический хороший админ, знает много операционных систем, умеет создавать кластера, умеет обслуживать разные СУБД, возможно очень много разных СУБД.. и очень много разного ПО, как серверного, так и десктопного

    ppps но самое главное - умеет во время делать бекапы. мало того - такие, из которых можно быстро запустить систему после большой аварии
    Ответ написан
    Комментировать
  • Почему не могу найти работу Junior'ом C#?

    @kttotto
    пофиг на чем писать
    Это не резюме, это набор слов, ничем Вас не выделяет из общей массы и даже делает низовым в списке общей массы.

    1. Такой кучи тегов даже у меня нет)) Если Вы знаете названия технологий, не говорит о том, что Вы знаете сами технологии. С Вашим опытом никто не поверит, что Вы имели реальный опыт со всем этим, а не просто hello world написали. Выберите те, в которых по Вашему мнению Вы лучше всего разбираетесь.

    2.
    Отличное знание WinForms, ASP.NET, LINQ и WPF. Паттерны: MVVM, MVP, Repository, IoC.

    Для третьекурсника звучит самонадеяно. При такой формулировке на техническом собеседовании будут проверять "отличное" знание и я почти уверен, что Вы его провалите. Лучше сказать что-то подобие: имел опыт работы с, для реализации использовал технологии, имею <начальные> навыки работы с и т.д.

    3.
    Занимался исправлением мелких багов, написанием небольших SQL-запросов и unit-тестов, решал небольшие задачи.

    Этим занимаются все разработчики, даже мидлы с сеньорами. Из Вашей фразы не понятно, какого уровня проект, какой стек, какие конкретно задачи Вы решали, как успешно Вы их решали. Работодателю нужно понимать Ваш реальный опыт и Ваши реальные возможности, а не нечто эфемерное "решал небольшие задачи".

    4.
    Если вспомнить css и html

    Вот такое никогда не пишите. Лучше соврать или преувеличить, или даже написать "Отличное знание", но не так как Вы здесь сформулировали.

    5. Не нужно оставлять ссылки на каждый проект в репозитории. Либо один, самый интересный на Ваш взгялд, либо одна ссылка на сам репозиторий. Работодатель пойдет туда только, если Вы заинтересуете его, не раньше. И ему пары файлов хватит оценить ваш уровень. Он не будет делать ревью всех Ваших проектов.

    6. Опыта одного проекта мало. Где опенсерс проекты, где участия в хакатонах, где амбиции стартапов, посещение конференций? Работодатель хочет понимать как Вы заинтересованы развиваться, какие у Вас планы для дальнейшего роста. Он берет вас нулевым не из альтруистических побуждений, а с надеждой, что Вы быстро вырастите и вернете ему прибылью затраченное на Вас время. Из Вашего резюме видно только одно: я студент - дайте работу. А почему Вам, за какие такие заслуги и что с этого будет иметь работодатель - не понятно.

    7. Я посмотрел Ваш код. Я бы не хотел, чтобы так писали у меня в проекте, начиная от именований и заканчивая некоторой логикой. Вас надо очень осторожно подпускать к реальным задачам и контролить, что Вы там напишете, просто чувствуется маленький опыт и до "отличных знаний" там далеко.

    В общем, вывод. Пока у Вас за плечами нет списка реальных проектов, чтобы Вас пригласили, надо себя выпячивать, хвастаться достижениями, демонстрировать амбиции, свою уникальность. Нужно убеждать работодателя, что Вы именно тот, кто ему нужен. В резюме этого нет. Когда у Вас будет пяток законченных проектов, будет наоборот, работодатель будет за Вами бегать и убеждать, что Вам у него будет лучше всего. И на hh студентов практикантов не ищут, поэтому только Вы должны делать отклики на вакансии, обязательно с сопроводительным письмом, в котором парой фраз Вы сможете заинтересовать работодателя.
    Ответ написан
    Комментировать
  • Что подразумевает под собой слово "Решение" в вопрос "Разработка решения для автоматизации тестирования"?

    NeiroNx
    @NeiroNx
    Программист
    Решение - в данном случае это как выбор самого фреймворка так и разработка сценариев для его работы.
    Ответ написан
    Комментировать
  • В чем смысл одинарного и двойного подчеркивания перед переменной или методом при определении класса?

    @deliro
    Нет в питоне приватных атрибутов. Об этом уже на каждом заборе написали. Подчёркивания — соглашение о том, что программисту не стоит использовать эти атрибуты как интерфейс. Двойное подчёркивание тоже не добавляет приватности.

    5ccffe45cca5d170551109.png
    Ответ написан
    2 комментария
  • Какие есть программы для учёта времени работы удалённого программиста?

    @hatman
    Работаю в компании, где порядка 50 сотрудников удаленщики. Учет времени идет по Jira - время ставит сам программист. Учет идет так:

    Приходит готовая таска
    Идет код ревью
    Ревьювер чекает адекватность оценки времени
    Если есть вопросы, то уточняется, в чем была сложность

    За 3 года уволили только одного разраба, который "попал в пустыню печали и скорби", и просто две недели ничего не делал.
    __

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

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    Конкретно в IDEA - Key Promoter. Это плагин, который показывает бесящие подсказки каждый раз, когда ты делаешь действие, на которое есть хоткей, мышкой.
    Ответ написан
    1 комментарий
  • Неужели порог вхождения в андроид разработку настолько высокий?

    @Exolonpro
    Являюсь Senior Android разработчиком. Java/kotlin, dagger, mvp... Как не прискорбно вам это сообшать, но все это надо знать. Много ребят присылают резюме посмотрев курсы непочатова и что-то там ещё, но их даже не рассматривают. Юниоры требуются редко, нужны мидлы и выше, т.к. есть заказ и жосткие сроки. Все понимают что вы научитесь, но заказчик хочет получить стабильнок приложение чз 3 месяца, а не через год. Dagger mvp и тд нужны чтобы ваш код не превратиося в кашу. Реально все оч сложно, я вам не завидую тк сам прошел долгий путь.
    Желаю удачи, главное не сдаваться!!!
    Ответ написан
    5 комментариев
  • Какая на ваш взгляд лучшая система мониторинга удаленных сотрудников?

    Sanes
    @Sanes
    Не надо сидеть над душой. Ставите задачу, сроки и проверяете. Доверять надо людям.
    Ответ написан
    21 комментарий
  • Как найти работу или стажировку начинающему python разработчику?

    Если вы из Москвы, Питера, Новосиба, Казани, НН - то тыкаться по всем вакансиям, где требуется python(собственно, ничего нового).

    Если вы из какого-то другого города, то ехать в города, что я указал выше, либо никак(смотреть местный рынок вакансий, и менять стек на тот, что востребован у вас на месте)
    Ответ написан
    1 комментарий
  • Почему не работает этот простой код?

    lamer350
    @lamer350
    กำลังสูงสุด
    $('#dRoles select').each(function () {
    Ответ написан
    4 комментария
  • Где в браузере и в каком виде хранить данные о том залогинен ли пользователь?

    @nrgian
    Куки или localstorage
    Хранить в виде токена, например, а не просто залогинен или нет.
    И проверяться что это за пользователь скрывается за этим токеном - должен сервер обязательно. А не браузер.
    Ответ написан
    Комментировать
  • Как найти строку в CSV и удалить ее?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Читаешь csv строку за строкой и копируешь всё во второй файл. При этом делаешь проверку с твоим условием.
    После этого исходный файл удаляешь,а новый переименовываешь в старый
    Ответ написан
    3 комментария
  • Алгоритм равномерного распределения заявок?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    foreach (var newOrder in newOrders)
    {
        // ищем минимальное количество заявок среди всех менеджеров
        var minOrdersCount = managers.Min(m => m.Orders.Count);
        // ищем менеджера с найденным количеством (если несколько - берём первого)
        var manager = managers.First(m => m.Orders.Count == minOrdersCount);
        // даём заявку менее занятому менеджеру
        manager.Orders.Add(newOrder);
    }

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

    Вот алгоритм посложнее, в нём поисков по всем менеджерам происходит меньше (особенно, когда большое количество новых заявок):
    class Manager
    {
        public string Name { get; private set; }
        public List<int> Orders { get; private set; }
    
        public Manager(string name, int ordersCount = 0)
        {
            Name = name;
            Orders = ordersCount > 0
                ? Enumerable.Range(1, ordersCount).ToList()
                : new List<int>();
        }
    }
    
    static void Main(string[] args)
    {
        var managers = new Manager[]
        {
            new Manager("Лена", 1), 
            new Manager("Оля", 10), 
            new Manager("Иван", 35), 
            new Manager("Сергей", 75), 
        };
        var newOrders = Enumerable.Range(1, 35).ToList();
        var newOrdersCount = newOrders.Count;
        var ordersAssigned = 0;
    
        while (ordersAssigned < newOrdersCount)
        {
            var ordersCounts = managers.Select(m => m.Orders.Count).OrderBy(count => count).Distinct().ToArray();
            var addingOrdersCount = ordersCounts.Length > 1 ? ordersCounts[1] - ordersCounts[0] : ordersCounts.First();
            var managersWithMinOrders = managers.Where(m => m.Orders.Count == ordersCounts[0]).ToArray();
            // нашли менеджеров с минимальным количеством заявок
            if (managersWithMinOrders.Length * addingOrdersCount < newOrdersCount)
            { // заполняем самых незанятых менеджеров до того же уровня занятости
              // т.е. добавляем Лене (10 - 1) = 9 заявок
                foreach (var manager in managersWithMinOrders)
                {
                    for (int i = 0; i < addingOrdersCount; i++)
                    {
                        manager.Orders.Add(newOrders[ordersAssigned]);
                        ordersAssigned++;
                    }
                }
            }
            else
            {
                // незанятых менеджеров нет, заполняем оставшиеся заявки по менеджерам по очереди
                while (ordersAssigned < newOrdersCount)
                {
                    var managerIndex = ordersAssigned % managersWithMinOrders.Length;
                    managersWithMinOrders[managerIndex].Orders.Add(newOrders[ordersAssigned]);
                    ordersAssigned++;
                }
            }
        }
    
        foreach (var manager in managers)
        {
            Console.WriteLine("{0}: {1} заявок", manager.Name, manager.Orders.Count);
        }
        Console.ReadKey();
    }
    Ответ написан
    1 комментарий
  • Может ли микроволновка глушить Wi-Fi?

    Jump
    @Jump
    Системный администратор со стажем.
    Микроволновка глушит wifi?
    Запросто.
    Они на одной частоте работают.

    На windows при таких же условиях все работает.
    Драйвера разные. Поэтому поведение может различаться. Там где один драйвер признает соотношение сигнал/шум неприемлемым, другой вполне будет работать игнорируя проблемы.
    Ответ написан
    2 комментария
  • Как преобразовать список чисел в список комплексных чисел в Python?

    @Andy_U
    data=[4, 5, 7, 8, 9, 0, 3, 3, 6, 6]
    c = [complex(a, b) for a, b in zip(data[:-1:2], data[1::2])]
    print(c)
    Ответ написан
    1 комментарий