• Существует ли аналог "пиэчпишного" PDO для Node.js?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Обычно берут knex вместо PDO. Для Монги берут mongoose.
    Для фильтрации можно поискать какой-нибудь причиндал вроде Swagger. Можно добавить Joi или Hapi для пущей остроты ощущений.
    Ответ написан
    Комментировать
  • Как реализовать отчёт по продажам с меняющейся иерархией?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Как специалист по Монге скажу - Монга тут ненужна.

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

    Есть альтернативный вариант с созданием снапшотов, т.е. просто делается копия сгенерированной HTML страницы со всеми встроенными данными и скриптами. Подход не очень красивый, но реализуется быстрее остальных.

    Кстати, ничего не мешает вам делать снапшоты для Nested Sets и хранить их в отдельной таблице в виде леса деревьев.
    Ответ написан
    Комментировать
  • Версионирование данных в базе?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Если у вас в таблице 500к записей, то нет абсолютно никакого смысла скачивать ее всю на телефон за исключением одной ситуации - режима работы оффлайн. В данном случае просто делается актуальный слепок, архивируется и отправляется к клиенту. Скачать 100 МБ с телефона сейчас не проблема. При наличии интернета гораздо проще делать запросы через API.

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

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

    Для обычных баз данных в режиме совместной работы настраивайте мастер-мастер репликацию с транзакциями. Для мобильных приложений используйте режим тонкого клиента.
    Ответ написан
    2 комментария
  • Как стартапу найти себе продажника?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Ищите и обрящете.

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

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Если вы хотите получить разрешение на постинг, вам следует сделать следующее:
    1. Правильно заполнить всю информацию о приложении. Приложение должно иметь ценность для пользователя, а не просто автоматический кросс-постинг.
    2. Сделать нормальный facebook login flow. Простой, понятный, доступный пользователю вашего приложения.
    3. Необходимо предоставить выбор страницы, от имени которой пользователь может размещать контент.
    4. Пользователь должен самостоятельно создавать контент. Предзаполненная форма считается нарушением и ваше приложение будет отклонено.
    5. Если токен истек, то пользователь должен быть отправлен на переаутентификацию. Если у токена не хватает прав, вы можете дозапросить права.
    6. У приложения должен быть настроен хук, который удаляет все данные связанные с Фейсбук при удалении приложения пользователем.
    7. И в заключение, вы должны предоставить всю необходимую информацию о регистраторе приложения в корректной форме.

    Обязательны к прочтению следующие разделы
    https://developers.facebook.com/docs/apps/review
    https://developers.facebook.com/docs/apps/managing...

    Ну а это, чтобы не заржаветь
    https://developers.facebook.com/blog/developer_policy/
    Ответ написан
    1 комментарий
  • Как оставить комментарии к посту тестового пользователя в facebook?

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

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Нормальным программистам хорошо платят во многих отраслях.
    В мобильной сфере обычно толковому разработчику нужно владеть в совершенстве целым арсеналом костылей, поскольку фрагментация устройств и API дичайшая.
    Я недавно игрался с ReactNative и просто обалдел от того, насколько сложно там реализуются тривиальные вещи, вроде тех же диалогов. В каждой ОС свое API, на каждой все отображается по-разному. Android это вообще какая-то калека в этом плане.
    Создание удобного UI это не просто сложно, это нужно уметь понимать интеракции и транслировать их в платформозависимый код.
    Ответ написан
    Комментировать
  • Как реализовать динамические поля и секции для таблицы?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Ваша идея динамических полей хорошо ложится в концепт NoSQL.
    MongoDB позволяет вам хранить документы в одной коллекции (таблице) в практически произвольной JSON-форме.
    В MongoDB документы (записи) выглядят достаточно просто на примере каталога товаров:
    [
    	{
    		_id: ObjectId("1"),
    		"name": "Шкаф",
    		"category": "Мебель",
    		"price": 18000,
    		"weight": 20.0,
    		"details": {
    			"height": 180,
    			"width": 60,
    			"depth": 40,
    			"color": "белый"
    		}
    	},
    	{
    		_id: ObjectId("2"),
    		"name": "Молоко",
    		"category": "Продукты",
    		"price": 100,
    		"weight": 1.0,
    		"details": {
    			"volume": 1.0,
    		}
    	}
    ]


    В MongoDB нет привычных полей и валидации структур, как в SQL. Т.е. забота о валидации данных ложится на плечи разработчика, но с другой стороны дает гигантское преимущество, т.к. оба варианта структур могут вполне себе мирно сосуществовать. Мой пример вам в помощь, когда у шкафов одна информация, а у молока другая.
    С точки зрения выборок все с одной стороны намного проще, а с другой сложнее.
    Например, если нет поля, запрос просто не вернет данные. Но можно добавить условие, при котором они будут возвращаться.
    Самое сложное, что вызывает неприятие со стороны заядлых любителей реляционной модели - отсутствие внешних ключей и объединений (join). Тут нужно в корне пересматривать отношение к структурированию данных и про это написано много книг, статей и т.д. Вам нужно очень четко понимать, где и когда какую модель и структуру выгоднее использовать.
    Например, если вам дороже гибкость и возможность быстрого масштабирования (собирать данные с тысяч разных устройств в режиме реального времени), то MongoDB, но если нужна жесткая сложная структура, например CRM с адским биллингом и злостными транзакциями, то тут надо выбирать SQL вроде PostreSQL или Oracle.

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

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

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Для всех пользователей - лендинг на www.example.com.
    Все API www.example.com/api/version/whatever

    Все скрывать за реверсивным прокси!
    full-stack-front-end-back-end-comic-joke


    А теперь почему следует делать именно так.
    Домен следует вешать на www по простой причине - субдомены кэшируются на более короткое время, а следовательно переезд будет менее болезненный.
    Лендинги и дребедень делать удобнее всего внутри каталогов. Например, у вас есть ссылка www.example.com/megapartner она может быть расшарена в соц.сетях, на форумах и т.д. Это все увеличивает вес вашего домена для поисковых систем. Если вы будете использовать субдомены, то этот вес будет размываться, т.к. поисковики будут все считать разными сайтами.
    Авторизация и управление пользователями должны быть унифицированы. Не стоит делать 20 разных мест, для которых надо авторизовываться по 100 раз. Для этого давно были придуманы роли. Я рекомендую сразу реализовывать вход через тот же Facebook/Google/OK/VK и т.д.
    Общая авторизация дает громадное количество преимуществ, например облегчает поддержку в разы, позволяет знать контекст выполнения действий.
    Один домен облегчает взаимодействие с пользователем, т.к. ему не нужно запоминать десяток разных страниц.
    Ну и дополнительные плюшки реверсивного прокси заключаются в том, что всегда можно настроить редирект, что-то закэшировать, показать правильную станичку, если какой-то из сервисов отвалился.
    Позади прокси следует все делить по назначению, держать каждый проект в разных репозитариях и т.д. Это может существенно упростить разработку, например можно отдать какой-то лендинг в переработку просто дав доступ к репозитарию.

    Если очень хочется упороться и поиграть в девопса, разбейте на 100500 микросервисов, засуньте все внутрь кубернетиса с каким-нибудь истио. Будет красивая архитектура с контейнерами и плюшками.
    Когда наиграитесь, возьмете обычный nginx, напишете конфигурацию простого реверса и он будет работать годами как часы.
    Ответ написан
    Комментировать
  • Актуальный язык для удаленки?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Английский.
    Ответ написан
    Комментировать
  • Как решается проблема webrtc в сетях 3G?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Timed out говорит о том, что время вышло, скорее всего пакеты пропадают по пути следования.
    Во-первых, не используйте публичные STUN/TURN серверы.
    Во-вторых, попробуйте настроить ваш turn сервер, чтобы он работал через стандартные 80 и 443 порты.
    Очень желательно, чтобы вся коммуникация проходила через 443 порт и TLS, в таком случае затратнее делать DPI.
    Если перенастройка всего в типичные веб-порты и заворот в TLS туннель не поможет, тогда прийдется искать что-то вместо WebRTC. Скорее всего провайдер использует сигнатурные методы определения трафика и просто рушит пакеты.
    Провайдеры не заинтересованы в конкурирующем внутрисетевом трафике, поэтому будьте готовы к борьбе.
    Ответ написан
    Комментировать
  • Как искать в aggregate Mongo?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Не следует использовать стадию $match внутри оператора $sum на стадии группировки.

    db.operations.aggregate([
    	{
    		$match: {"address" : "Office 1"}
    	},
    	{
    		$project: {
    			address: "$address",
    			received: {
    				$cond: [ {$eq: ["$operation_type", "receive"]}, "$amount", 0 ]
    			},
    			sent: {
    				$cond: [ {$eq: ["$operation_type", "send"]}, "$amount", 0 ]
    			},
    			dateTime: "$dateTime"
    		} 
    	}, 
    	{
    		$group: {
    			_id: {
    				address: "$address",
    				day: { $dayOfYear: "$dateTime" },
    				year: { $year: "$dateTime" }
    			},
    			received: {
    				$sum: "$received"
    			},
    			sent: {
    				$sum: "$sent"
    			}
    		}
    	}
    ])
    Ответ написан
    Комментировать
  • Как в MacOS настроить маршрут всех доменов на .dev не на localhost, а на машину в локальной сети?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Поставить в офисе обычный DNS сервер, который будет держать локальные зоны и резолвить внешние. Прописать его в настройках DHCP, чтобы локальные машины при присоединении к сети автоматически его у себя конфигурировали.
    Плюс на сервере можно нарулить кэширование внешних запросов, что немного увеличит отклик многих сайтов.
    Ответ написан
    2 комментария
  • Как перенести Базы с одного сервера на другой методом copy/paste в MongoDB?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    1. MongoDb версии должны совпадать
    2. Конфигурации должны быть одинаковы
    3. Права на файлы и папки должны быть корректными

    Что в логах?
    Почему именно Copy/Paste? Может тогда лучше репликация или снапшоты?
    Ответ написан
  • Как грамотно использовать сторонние API в своем web приложении на NodeJS?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    1. Почему не использовать Google Actions? Или штук вроде dialogflow.com?
    2. Снижение задержек возможно рядом трюков вроде начала отправки голосовых данных непосредственно в сервис с момента начала их произношения. Далее слой кэширования результатов вычленения намерений.
    3. Размещение всего стека распознавания речи и интентов у себя.
    4. Распараллеливание цепочки там, где это возможно.
    Например
    - Купи билеты в кино на хороший фильм Тарантино
    1. Распознавание
    2. Параллельно:
       = Поиск хороших фильмов Тарантино
       = Поиск кинотеатров поблизости
       = Получение данных вашего календаря
    3. = Запрос расписаний из ближайших кинотеатров (можно делать параллельно, если нет общего API)
    4. Поиск оптимального сеанса
    5. Заказ билетов

    5. Асинхронное выполнение через очередь, где возможно.
    Например:
    - Отправь билеты маме.
    - Хорошо. (ставится задание в очередь, выполняется асинхронно не блокируя пользователя)
    Ответ написан
    Комментировать
  • Как правильно писать приложение на Angular?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    1. Очень большие, практически любые.
    2. В верстке нужно использовать компонентный подход.

    Angular проект следует с нуля начинать на angular-cli. Советую вам сделать перерыв для изучения фреймворка, а потом писать код.
    У Angular достаточно высокий уровень входа, поэтому рекомендую изучить архитектуру и до конца разобраться как он работает.
    Ответ написан
    1 комментарий
  • Как использовать iphone в качестве гарнитуры для macbook?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Купите себе хорошую Bluetooth гарнитуру, запарьте ее с компьютером и телефоном. И забудьте о костылях.
    Ответ написан
    Комментировать
  • Как реализовать постоянную взаимосвязь ajax+php не перегружая сервер?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Пора перестать заниматься херней и открыть для себя Server Sent Events или человеческую работу с веб-сокетами.
    А лучше использовать что-нибудь такое https://github.com/wandenberg/nginx-push-stream-module
    Ответ написан
    Комментировать
  • Откуда разработчики знают как именно что то реализовать?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Разработчики черпают информацию из нескольких основных принципов
    • декомпозиция - разбиение больших частей на составные части. Например: нужно сделать гостевую книгу. В гостевой книге есть страница, которая отображает записи и есть та, через которую они добавляются. Т.е. первый уровень декомпозиции - страница отобразить записи и страница добавить запись. Далее каждая страница бьется дальше. Например отображение - где-то надо записи хранить, значит у нас будет база данных, как-то отображать, значит будет какой-то шаблон для страницы. Раз записи повторяются, то у всех записей будет одинаковый шаблон отображения. Данный принцип применятся до тех пор, пока не достигается конечная глубина, после которой становится очевидна тривиальность реализации. Если представить все эти шаги разбиений в виде дерева - мы получим дерево декомпозиции.
    • системный подход - когда будущее приложение разбивается на подсистемы (это как декомпозиция, но с другой стороны), например подстема отображения записей, подсистема хранения записей и т.д.

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