• Как хранить интервальное расписание в БД?

    @alex_ak1
    Простой способ это линуксовый крон, в нем с помощью достаточно простой грамматики можно задать интервалы в достаточно широких правилах. Там задается все так:
    минута час день_недели день_месяца месяц команда
    Каждое из чисел это или (*), или число (5) или несколько чисел (2,3,5, 7-10), либо пропуск (что_то/интервал).
    Поэтому можно легко задавать события типо каждый второй вторник
    * * 2/2 * * команда
    или первое число мая
    0 0 * 1 4 команда 2
    На основании этого можно строить регулярные события. На них накладывать расписание праздников (и то не всегда, к примеру оплата домашних счетов не зависит от праздников). Как вариант - можно сдвигать событие, если оно попало на праздник.
    Ответ написан
    6 комментариев
  • Какие есть курсы по архитектуре ПО?

    @Sing303
    Объектно-ориентированное конструирование программных систем (Мейер)
    Объектно-ориентированный анализ и проектирование (Буч)
    Совершенный код (Макконнел)
    Искусство автономного тестирования с примерами на С# (Ошероув)
    Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем (Эванс)
    Ну и как уже написали "Шаблоны корпоративных приложений" от Фаулера

    Если у вас мало опыта, многое в этих книгах будет вам не понятно
    Ответ написан
    Комментировать
  • Как верно организовать структуру бд интернет-магазина?

    muhammad_97
    @muhammad_97
    PHP-разработчик
    1. Помимо Adjacency List (как в вашем случае) существуют другие типы деревьев, такие как Nested Sets, Materialized Path, Closure Table и т.д. Различаются они в скорости/сложности различных операций (добавление, удаление, перемещение, выборка). Хотя все проблемы решаются кешированием.
    2. Зачем выносить изображения товара в отдельную таблицу? Достаточно создать поле images и хранить там сериализованный массив путей.
    3. Также не понятна структура корзины. Проще создать в таблице basket (*carts) поля customer_id и поле products (так же сериализованный список товаров в корзине). А еще лучше хранить данные корзины в сессии.
    Ответ написан
    6 комментариев
  • Как объяснить разную скорость выполнения вложенных циклов в разных языках?

    Olej
    @Olej
    инженер, программист, преподаватель
    Я программировать только начинаю учиться, и у меня несколько вопросов:

    Вообще то, такие "измерения" во многом - бессмыслица.
    Ваши результаты будут зависеть:
    - от уровня оптимизации, установленного для компилятора...
    - от используемого компилятора с одного и того же языка (Clang из расхваливаемого здесь LLVM будет хуже GCC)
    - от того, насколько ваши массивы (особенно при большем их размере)будут попадать в процессорные кэши и какого уровня кэши, что зависит от способа размещения массивов, порядка дивжения по ним и др. (и разница в скорости может быть не 15%, а 4-5 раз и более)
    - от числа ядер и возможностей языковой системы задействовать несколько процессоров в исполняющей системе...
    - ... от времени восхода Солнца на вашей широте ;-)

    Так что такие "измерения" достаточно бессмысленное занятие, и ним можно оценивать только порядки величин.
    Любопытства ради см. Языки программирования: скорость, Сравнительное обозрение языков программирования.
    Ответ написан
    4 комментария
  • Какую книгу подарить младшему брату, который хочет стать программистом?

    @dmitryKovalskiy
    программист средней руки
    head first вполне нормальный вариант для начала. правда есть риск что книжка воспримется как другая крайность - "написано как для дебилов". в вашем описании есть другой риск - любитель поиграть, желающий стать программистом, часто лелеет мечту сделать свою игру, а когда узнает что компьютерная графика это не "подтянуть математику", а чистейший матанализ и высшая математика - может настигнуть разочарование и идея стать программистом улетит в трубу.
    Ответ написан
    2 комментария
  • Что собой представляет звук? Как его сгенерировать?

    Moskus
    @Moskus
    Звук в какой-то среде (воздухе, воде или твердом теле) - это колебания давления, то есть распространяющиеся в пространстве от источника последовательности перепадов более высокого и более низкого давления.

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

    Когда говорят, что на CD звук закодирован в формате "16 бит 44 кГц", это означает, что положение мембраны динамика кодируется 44 тысячи раз в секунду и между крайними положениями - 2^16, то есть 65535 положений.

    При воспроизведении звука, каждое такое значение от 0 до 65535 преобразуется цифро-аналоговым преобразователем звуковой карты в значение напряжения, подаваемого на динамики. А динамики исправно создают колебания давления в воздухе.

    Тон - это действительно частота колебаний, но чистый тон, когда звук - чистые синусоидальные колебания - это большая редкость. На самом деле, синус - большая редкость. Откройте любую аудиозапись в каком-нибудь звуковом редакторе, посмотрите при максимальном увеличении на форму сигнала. Вот, в общем случае оно как-то так и выглядит.
    Ответ написан
    Комментировать
  • Как найти работу джуниору?

    edinorog
    @edinorog
    Троллей не кормить!
    а нету советов. нету тупо и всё. ногами ходишь .. голосом говоришь и лыбу давишь. а не тратишь время на говорильню на ресурсе для помощи в косяках.
    Ответ написан
    1 комментарий
  • Какие вы знаете каналы на youtube, куда выкладываются видео, где нонстоп пишутся серьезные приложения?

    newross
    @newross
    Product owner
    Никто в здравом уме не будет стримить разработку серьезных корпоративных приложений. Более того, никто в здравом уме это смотреть не будет - жуткая скукота же :)
    Ответ написан
    Комментировать
  • Как правильно "раздавать" код программистам?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Уже было.
    Сделать API. Каждому программисту давать кусочек кода, чтобы пилил определенный законченный функционал, и минимально пересекался с остальными.
    Ответ написан
    Комментировать
  • Стартап после работы?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Парень, меняй работу. Вкалывать по 12 часов в сутки - это очень хреновая идея, будешь овощем. Работа на износ эффективна только очень короткий промежуток времени, как только это время закончится производительность начнет резко падать, а потом - перегорание и апатия (к слову из них выйти не всегда легко).

    Если я правильно понял - работаешь в конвейерной web-студии, там смысла развивать спецов нету потому как задачи однотипные.
    Ответ написан
    Комментировать
  • Что более перспективно?

    zolt85
    @zolt85
    Программист
    Хватит болтать, покажи нам свой код! (с)

    Я с Вас поражаюсь, Вы действительно на столько круты, что можете выбирать? Даю палец на отсечение, что Вы ни черта не знаете в программировании (без относительно языка программирования). Делить разработчиков на frontend/backend это какая-то модная чушь, от стартаперов-хипстеров. Разработчик прежде всего должен быть инженером! Универсалом, если хотите.

    Перестаньте спрашивать "Что делать?" на тостере, а просто идите и делайте то, что считаете нужным!

    Ладно, это старческое ворчание. По существу. Вы правы, все хотят middle или senior разработчиков на java вакансиях, и это обоснованно. Т.к. беря junior-а, Вы прикладываете усилия на его обучение. Скажу за себя (я такой твердый middle с обязанностями senior-a), если я вижу, что junior свалит как только я его научу, я его сам выгоняю. А многие junior-ы прямо говорят - я пришел к Вам набраться опыта, перед покорением других вершин. Ну и зачем мне такой junior? Мне нужны люди, которые будут тащить проект, выводить именно мой проект на новые вершины! Вам в первую очередь должно быть интересно само ремесло программистское, и если Вам оно интересно - Вы будете на расхват в любой конторе, на любом стеке технологий.

    Удачи!
    Ответ написан
    10 комментариев
  • Начал проседать фпс после 15-20 минут игры, в чем может быть проблема?

    printf
    @printf
    Ем детей.
    А как проверяли БП, пронзительным взглядом на наклейку «900 ватт»? Деградирующее питание вызывает разнообразные проблемы, в т.ч. дроп фпс, графические артефакты, зависания.

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

    В винде можно прибить на время игры антивирус и индексирование ФС, например, мало ли. Я в виндовс-8 наблюдал ужасный лаг всех программ во время индексирования диска.

    Вообще это все гадание на кофейной гуще, конечно — надо взять монитор ресурсов, запустить игру, дождаться лагов и смотреть, во что упирается система. Вариантов же море.
    Ответ написан
    Комментировать
  • На чем в 50 лет можно зарабатывать?

    Если Ваш отец считает, что в 50 он уже старик и ни на что не годен, ну что же, пусть ищет место сторожа.
    Если же нет - почему Вы упоминаете возраст? Создается впечатление, что Вы считаете его неполноценным.

    Поставьте вопрос иначе: на чем зарабатывать человеку, которому только-только минуло 30?
    И ответы найдутся гораздо проще... если не ставить надуманных барьеров.
    Ответ написан
    4 комментария
  • Работа после армии: легко ли восстановиться и найти работу?

    ОФФ-топик: если не читал, то советую.

    Так получилось, что не служил, но работал/нанимал много раз вместе с людьми как раз после срочки. У всех по разному - кто-то быстро вливался и в работу и в коллектив - кто-то пытался устанавливать свои порядки "армейские", но понимания на гражданке этого не находил. Сейчас служба-то всего год - не думаю, что может возникнуть прям оторванность от цивилизации.
    Ответ написан
    1 комментарий
  • Переквалификация в 29 лет: как лучше организовать самообучение front-end'у?

    Учите html потом учите css. Никакие препрцессоры не используете!! Затем нужна практика что бы закрепить знания html и css (в принципе сегодня часть анимации, эффектов уже только на css без JS можно делать). А затем, когда вы почувствуете себя уверенно в этих 2 областях - тогда уже изучаете чистый JS причём на фреймворки JS переходите только тогда когда в этом возникнет необходимость а не просто так от нечего делать... И не забывайте что некоторые JS-фреймворки не предназначены для сайтов, они предназначены для приложений...
    Ответ написан
    1 комментарий
  • Переквалификация в 29 лет: как лучше организовать самообучение front-end'у?

    hacker342
    @hacker342
    Like Linux
    А я вот честно скажу что от ментора толку ноль, ну может мне такой ментор попался, который отвечал на любой вопрос: гугли! Т.е толком он ничего не объяснял, еще совет: найди группу js-девелоперов и общайся с ними, я например, нашел сообщество Рубистов + один паренек организовал конфу в slack и теперь мы там сидим, и решаем проблемы, которые у нас образовались, конечно же один из нас, круче и сильнее, и дает нам люлей, если мы что-то не так делаем. Если такой возможности нет, то пили проект, как сказано выше и уже с этим можно идти в какую-нибудь контору.
    Ответ написан
    Комментировать
  • Куда пойти учиться?

    @kstyle
    Здравствуйте. Берите книги по математике и алгоритмам - и вперед решать/читать/программировать. А эти все красивые слова "хотелось бы работать в сфере, связанной с искусственным интеллектом" - просто слова. Вы даже не понимаете, что за ними стоит. Плюс гарантия, что завтра вам понравится железо, послезавтра - 3D графика, а посмотрите "Терминатора" - захотите в робототехнику окунуться. То есть ваши желания как ветер в таком возрасте - я бы не обращал на них внимание. Уверен, потому что если бы вы понимали что такое работать с ИИ - то давно бы знали куда поступать.
    Ответ написан
    1 комментарий
  • С какого языка изучать программирования (с нуля)?

    @bromzh
    Drugs-driven development
    Ты ещё не умеешь программировать (и искать в интернете, ведь тут такие вопросы задают минимум по 1 разу в неделю), но уже решил, что питон - это несерьёзный несовременный язык. Видимо по этим причинам он самый популярный язык для обучения в технических вузах США.
    Зачем тебе чужое мнение? Ты вполне самостоятельный!
    Ответ написан
    8 комментариев
  • Как стать хакером в 2015-ом?

    voidnugget
    @voidnugget
    Программист-прагматик
    В принципе хакерские скилы ничем примечательным в наше время особо не отличаются от того что было 10 лет назад. Нужно знать ассемблер и сишку - без плюсов и досконально, что бы фраза "Си (без плюсов) может быть очень даже ООП" не могла вызвать странную ухмылку на вашем лице и воспринималась довольно обыденно.

    1. Перво-наперво нужно научится пользоваться отладчиком OllyDbg, IDA и т.п.
    2. Потом нужно разобраться в архитектуре х86 на уровне понимания распределения прав доступа, работы с памятью и различных SIMD/MIMD операций.
    3. От ОС ничего не зависит - знания и навыки в kmdf/umdf и linux kernel device drivers дополняют друг друга. Также нужно разобраться с системными вызовами самих ОС и как это всё оперируются со стороны старых добрых glibc и т.п. вещей.
    4. Из языков нужно брать и эксперементировать со всем - даже в той же Java в рамках OpenJDK есть куча эксперементальных вещей, типа Project Graal и Project Sumatra, в которых очень даже полезно покулупаться ради собственного развития. Никогда не знаешь что найдёшь и как это можно будет потом использовать - главное искать и не останавливаться.
    5. Конвертируют полученные навыки и знания самыми разнообразными способами - лучше всего разрабатывать под ядрышка ОС различные вундервафли, становиться известным и ити работать в IBM / Intel. WhiteHat/GreyHat зароботки в постсовке нереальны, а BlackHat грозит сроком.
    Ответ написан
    Комментировать
  • Как передать и проверить много параметров функции?

    @monah_tuk
    Дополню камрада ManWithBear

    Не нужно структуру отдельно переделывать в класс. Это и так класс, только доступ по-умолчанию public. И метод проверки можно не добавлять, а сделать внешним по отношению к структуре. Свободные функции не всегда плохо. Плюсы такого подхода в том, что memory-layout будет предсказуемый, а если в структуре нет non-POD типов то они останутся POD типами.

    Т.е. получится что-то вроде такого:
    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    struct Point
    {
      int x;
      int y;
    };
    inline bool is_valid(const Point& p)
    {
      bool result = true;
      // some checks
      return result;
    }
    
    struct Rect : Point
    {
      int width;
      int height;
    };
    inline bool is_valid(const Rect& r)
    {
      bool result = is_valid(static_cast<const Point&>(r)) && r.width > 0 && r.height > 0;
      return result;
    }
    
    int main() {
    	// теряется возможность делать так:
    	//Rect r = {0, 1, 2, 3};
    	Rect r{};
    	r.x = 0;
    	r.y = 1;
    	r.width  = 10;
    	r.height = 11;
    	
    	auto check = is_valid(r);
    	
    	cout << " x=" << r.x
    	     << " y=" << r.y
    	     << " w=" << r.width
    	     << " h=" << r.height
    	     << " valid=" << check
    	     << endl;
    	
    	cout << sizeof(Rect) << "/" << sizeof(int)*4 << endl;
    	
    	uint8_t *ptr = reinterpret_cast<uint8_t*>(&r);
    	auto beg = ptr;
    	auto end = ptr + sizeof(Rect);
    	for (auto it = beg; it != end; ++it) {
    		cout << hex << setfill('0') << setw(2) << (int)*it << " ";
    	}
    	cout << endl;
    	
    	return 0;
    }


    Можно функцию проверки сделать и методом класса/структуры и, при этом, не виртуальной. Тогда проверка будет вызываться только в соответствии с типом. Тогда можно обойтись без static_cast, получится что-то вроде:
    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    struct Point
    {
      int x;
      int y;
      
      bool is_valid() const
      {
      	bool result = true;
      	// some checks
      	return result;
      }
    };
    
    struct Rect : Point
    {
      int width;
      int height;
    
      bool is_valid() const
      {
      	bool result = Point::is_valid() && width > 0 && height > 0;
      	return result;
      }
    };
    
    void pass_point(const Point &p)
    {
    	cout << "point is valid: " << p.is_valid() << endl;
    }
    
    int main() {
    	// теряется возможность делать так:
    	//Rect r = {0, 1, 2, 3};
    	Rect r{};
    	r.x = 0;
    	r.y = 1;
    	r.width  = 0; // make invalid
    	r.height = 11;
    	
    	auto check = r.is_valid();
    	
    	cout << " x=" << r.x
    	     << " y=" << r.y
    	     << " w=" << r.width
    	     << " h=" << r.height
    	     << " valid=" << check
    	     << endl;
        
        // но следующий вызов скажет что точка валидна:
        // вызов валиден, т.к. Rect отнаследован от Point
        pass_point(r);
    	
    	cout << sizeof(Rect) << "/" << sizeof(int)*4 << endl;
    	
    	uint8_t *ptr = reinterpret_cast<uint8_t*>(&r);
    	auto beg = ptr;
    	auto end = ptr + sizeof(Rect);
    	for (auto it = beg; it != end; ++it) {
    		cout << hex << setfill('0') << setw(2) << (int)*it << " ";
    	}
    	cout << endl;
    	
    	return 0;
    }


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