• Есть ли Wordpress веб студии на массовые (1000 заказов / месяц) доработки?

    ThunderCat
    @ThunderCat Куратор тега Веб-разработка
    {PHP, MySql, HTML, JS, CSS} developer
    Есть неплохой метод примерной оценки ресурсов работы:
    1000 заказов / 22 рабочих дня = ~45 заказов в день. В зависимости от сложности работы она займет от 1 до 5 человеко-часов, пусть будет 3 часа на задачу. Итого в день нужно 45*3=135 человеко-часов/день на данную работу. Примем рабочий день равным 7 часам, с учетом перекуров/чая/кофе. 135/7 = ~20 человек справятся с данной задачей, + возможно потребуется некоторое количество доп. персонала, менеджеров и кухарок допустим. Скажем человек 5-6.
    Итог: контора в 25-30 чел штата справится с потоком самостоятельно. При необходимости 2-3 менеджера посаженные на отлов фрилансеров и раздачу им задач могут сэкономить до 50% рабочего люда.
    Ответ написан
    7 комментариев
  • Как называется пакет npm?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    В стандартной библиотеке есть
    https://nodejs.org/api/readline.html
    или
    https://www.npmjs.com/package/prompt
    Ответ написан
    Комментировать
  • Несколько вопросов о mongodb?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Я работаю с MongoDB уже более 3 лет, поэтому буду рассказывать и давать советы опираясь на личный опыт эксплуатации.

    Получается, что нас всю жизнь учили данные нормализовывать и объясняли, почему это хорошо, а теперь все с точностью наоборот?

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

    Объясните, пожалуйста, на пальцах, правильно ли я все понимаю?

    По большей части вы правы. Это денормализованные данные, но с определенными моментами. Я покажу вам их на вашем же примере.

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


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

    Типичная запись в ней выглядит так
    {
        "_id" : ObjectId("5801aa17964c6b2a050041a7"),
        "title" : "New Book",
        "authors" : [ 
            {
                "_id" : ObjectId("5801aa0f964c6b26030041a9"),
                "firstName" : "Phil",
                "lastName" : "Tkachev"
            }
        ]
    }


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

    db.getCollection('book').update(
     {'authors._id':ObjectId("5801aa0f964c6b26030041a9")}, 
     {$set: {'authors.$.firstName': 'Philipp'}  }, 
     {multi: true } 
    )


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

    Приемлемо ли в монго денормализовывать данные, чтобы хранить данные в отдельной коллекции, и обращаться к ним отдельным запросом (ведь джоинов там нет)?


    Есть ряд случаев, когда так и делают. Например есть разного рода ORM, тот же Mongoose, который так и делает.

    И принято ли так работать?


    И да, и нет. Когда вы работаете с такого рода базой данных, вам нужно подходить к организации данных исходя из решаемой проблемы, отталкиваться от проекта будущего приложения или решения задачи.
    Вам просто нужно ответить на вопрос, что дешевле, запросить документ по ключу или обновить запись внутри документов.
    Взять к примеру, ваш сайт, в котором есть новости и их авторы. Новости могут читать миллионы, а значит при обращении к каждой новости нужно будет делать подзапрос на информацию о каждом авторе. Т.е. вместо одного запроса, при просмотре новости, нужно будет делать 2. А если показывать список из 100 новостей? Будете делать 100 вторичных запросов? Нет, это тоже неправильно. Нужно будет получить список новостей, в коде приложения собрать идентификаторы авторов, сделать второй подзапрос, получить информацию об авторах, затем объединить ее с уже полученным списком статей. Это немного усложнит ваше приложение, но тоже позволит сэкономить ресурсы. Если вы встроите авторов внутрь статьи, это позволит вам обойтись одним запросом к базе, хоть на просмотр, хоть на список новостей. С другой стороны вам прийдется подумать об обновлении информации об авторе. Но, т.к. такая информация меняется сравнительно редко, то есть смысл встраивания.

    Что делать, если изменилась структура данных, если структуры то и нет?


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

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

    Коллекция новостей:

    {
    	_id: 'MongoId',
    	title: '',
    	body: '',
    	author: {
    		_id: 'идентификатор пользователя',
    		name: 'Имя пользователя',
    		subscribers: 'Количество подписчиков'
    	}
    }


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

    Коллекция пользователей:

    {
    	_id: 'MongoId',
    	name: 'Имя пользователя',
    	email: '',
    	roles: ['user', 'author', 'admin'],
    	subscribers: 'Number'
    }


    Список ролей может опеределять уровень доступных возможностей. Его легко изменить, можно легко найти авторов или админов.

    Коллекция подписок:

    {
    	initiator: {
    		_id: 'идентификатор пользователя, который инициировал подписку',
    		name: 'Имя пользователя'
    	},
    	target: {
    		_id: 'идентификатор автора',
    		name: 'Имя пользователя'
    	},
    	date: 'ISODate',
    	confirmed: 'bool'
    }


    Здесь вы можете подстроить, как список подписок, так и список подписчиков одним запросом.
    Ответ написан
    1 комментарий
  • Кто отвечает за мобильную версию сайта?

    opium
    @opium
    Просто люблю качественно работать
    Кто умеет тот и делает
    Ответ написан
    Комментировать
  • Имею ли я права откзываться от недоделанного проекта?

    MetaAbstract
    @MetaAbstract
    Архитектор информационных систем и баз данных. Ful
    Т.к. формальное ТЗ и проект отсутствуют, то правых в этой ситуации не найти. Первое с чем надо определиться - к чему каждая из сторон хочет в конце прийти. Если направление будет конструктивное первым делом надо составить ТЗ и проект на систему. Тогда будет ясны свойства продукта, который сдается по контракту. Тогда уже можно будет переопределить сроки и возможно бюджет проекта, т.к. в общем случае в подобных ситуациях возникает перерасход бюджета.
    Кроме этого в дальнейшем желательно использовать какую-нибудь систему типа хелп-деска, чтобы контролировать список недоделок, отделить их от дополнительных задача и документировать процесс работы для разрешения будущих споров.
    Оплату по проектам чуть более, чем простым лучше разбивать на этапы, тогда после пост оплаты по первому этапу и 50% предоплаты по каждому следующему этапу финансовые риски обоих сторон будут минимальны.
    Ответ написан
    Комментировать
  • Поиск заказов. Как вы находите что-то достойное?

    opium
    @opium
    Просто люблю качественно работать
    Могу поспорить что я Сейчас зайду на апворк и найду хорошую работу для реакта или другого жс фреймворка. Может вы просто ленитесь
    Ответ написан
    2 комментария
  • Какая функция растёт быстрее?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Нужно выяснить значение производной какой из них для любых значений n будет больше.
    Производная функции ведь и есть функция прироста значения функции.
    К алгоритмам прямого отношения не имеет, чистая алгебра.
    www.wolframalpha.com/input/?i=plot+n%5E(log(n)),+n%5E2
    функции пересекаются в точке n~=7,39 до этого значения n^2 растет быстрее, а после - n^log(n)
    Ответ написан
    Комментировать
  • Есть ли нормальные актуальные документации nodr.js на русском?

    @catHD
    https://nodejs.org/en/

    https://www.google.ru/webhp?sourceid=chrome-instan...

    Не начинайте изучение пока вы не сможете хотя бы читать на англ.
    Ответ написан
    Комментировать
  • Почему при установке каких-либо библиотек требуют, чтобы я скачал через npm или bower?

    sim3x
    @sim3x
    Не будем
    Мучайся с мануальным скачиванием и ручным поддерживанием зависимостей
    Ответ написан
    7 комментариев
  • Что имеется в виду в статье про отладчик с learn.javascript.ru?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Нужно понимать что программа выполяется последовательно, строка за строкой. Если в строке есть вызов функции, обрабатывается функция потом управление возвращается обратно к основному телу скрипта. Это как если бы вы начав читать статью переходили на каждую ссылку читали что там, а если есть ссылки там, то еще дальше вглубь а потом возвращались обратно. Это т.н. обход в глубину.

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

    2. Функция будет выполена, но мы не будем заходить в нее, и обходить пошагово, а перейдем сразу к следующей строке.

    3. Одиночный шаг он идет точь в точь по следу выполения программы. Если есть вызов другой функции, мы переходим туда, а оттуда дальше каждый цикл будем прходить до самого конца и так далее. Это самый мелкий шаг при отладке. Конечно на практике никто не станет проходить весь скрипт одиночными шагами (см. также 2.), а только отдельные его части которые нужно рассмотреть так сказать "в замедленном действии".

    4. Мы зашли в функцию, но нам не интересно пошагово ее обходить а нас интересует лишь ее результат. Так мы промотаем функцию до того момента когда она соберется вернуть результат и сможем глянуть, что она вернет.
    Ответ написан
    Комментировать
  • Отправка input, форма и подставка в url (JavaScript или PHP)?

    @Sn0wSky
    Это делается голым html
    <form action="http://site.ru/action.php" method = "get" class="pp-popup--email-form">
        <label for="" class="pp-popup--form-label">Email, на который мы отправим купон</label>
        <input type="email" placeholder="Введите email" class="pp-popup--text-input" name = "email">
        <input type="button" class="pp-popup--button" value="Получить промокод">
    </form>


    В action формы прописываете ссылку на action.php, method = "get"
    У инпута прописываете имя, name = "email"
    Ответ написан
    Комментировать
  • Как выполнить поиск по коллекции?

    @lega
    db.collection.find({"custom-field": {$in: [true]}})

    db.collection.find({"custom-field": true})
    db.collection.find({"custom-field": {$ne: true}})

    Слышал, что skip в mongodb работает не очень быстро, так ли это?

    Он везде работает не очень быстро, специфика tree индексов. Поэтому для пагинации лучше использовать сортировочное поле, тогда будет быстро, например {_id: {$gt: lastReceivedID}}
    Ответ написан
    2 комментария
  • Как лучше всего реализовать CRUD - DOM на ReactJS?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    по поводу вопроса 2: вам будет необходимо взять еще что-то. Например, можно использовать веб сокеты, чтобы рассылать всем подписчикам события: элемент_создан / удален и т.д. Без такой "рассылки" по подписчикам (подключенным клиентам) не получится сделать, разве что будет какой-то костыль с таймером (не надо так).

    по поводу вопроса 1, за неимением хорошего простого примера под рукой, предлагаю сделать по шагам, если получится - уверяю, с "расширением" пойдет гораздо лучше:

    Например есть страница с номерами телефонов и именем.

    На этой странице у вас компонент PhonesAndNames в момент componentDidMount делаете xhr вызов и получает список всех телефонов и номеров. Например, это GET запрос на ваш сервер: GET /api/phones

    Полученные данные вы кладете в state и в рендере компонента у вас строится таблица по данным из state компонента. Следовательно, как только у вас xhr запрос завершится, данные окажутся в state, случится ре-рендер и все будет хорошо. Для полного счастья, можно добавить переменную isLoading, например, и ставить ей true в начале выполнения запроса, и false в момент получения ответа. В рендере компонента, в зависимости от значения isLoading - рисовать прелоадер. Конечно, isLoading тоже будет жить в state.

    Далее, при наведении на строку - у вас, к примеру рисуется "крестик". По клику на крестик - производится запрос на сервер, например: DELETE /api/phones/айди. Внутри компонента PhonesAndNames это будет просто onClick на элементе крестик и функция, которая опять же отправляет xhr запрос. Когда будет получен ответ, вы должны поиском найти id удаленного элемента из вашего списка в state и вернуть список элементов. Изменился state - случился ререндер - все в порядке.

    Так же с добавлением. Вам достаточно поставить пару input'ов + кнопку "добавить". Опять обработчик на onClick (или на onSubmit, если сделаете это как форму) - опять xhr запрос (POST /api/phones), опять на успешный ответ операция со списком телефонов и имен в state, а именно: банально добавление в конец или в начало нового элемента.

    Остался только update. С ним тоже самое. В простейшем примере, чтобы не заморачиваться, все ваши телефоны и имена могут быть в таблице внутри тэга input и в конце строки, там же где крестик - иконка "обновить".
    ---
    Получается, если вы будете использовать web-сокеты, то вам нужно будет настроить свой сервер так, чтобы в момент успешного ответа на все вышеизложенные методы бродкастилось (от broadcast, т.е. рассылать) какое-то событие, на которое ваши клиенты умеют реагировать.
    ---

    Чтобы все это в процессе "расширения" и "усложнения" не превратилось в трудноподдерживаемую кашу, рекомендую использовать любую из библиотек для "управления состоянияем приложения", так сказать. Мне очень нравится redux.
    Ответ написан
    7 комментариев
  • Каким образом контекст становится глобальным объектом?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    ну тк var то ты задаешь глобально. каким он еще должен быть?
    вот так будет не глобальным:
    function notGlobal() {
    		var obj =  {
    			m:function() { 
    				function f() { alert( this)};
    				f();
    			}
    		}
    		
    	}
    	obj.m();
    Ответ написан
    1 комментарий
  • Как хранить данные в приложении на React Redux?

    driversti
    @driversti
    Кратко о себе
    Представьте, что у вас банковская система. У которой десятки и сотни сущностей. Их все держать в store приложения? Сомневаюсь. Мы там держим только объекты отвечающие за навигацию по сайту и авторизацию, так как эти элементы используются на всех страницах сайта.
    А вот в state каждой страницы те данные, которые на ней отображаются
    Ответ написан
    8 комментариев
  • Ошибка "tunneling socket could not be established", как сделать правильно??

    @mmxdesign
    Software Engineer
    попробуйте поменять options на нижеследующее. добавляется strictSSL false, а также в прокси прописывается просто http вместе https.
    Также вопрос дополнительный, вы делаете запрос напрямую или вы в какой нибудь корпоративной сети или за прокси-сервером?

    var options = {
          url: 'https://vk.com',
          proxy: 'http://login:password@XXX.XXX.XXX.XXX:YYYY',
          method: 'POST',
          headers: headers,
          strictSSL: false
    };
    Ответ написан
    2 комментария