• Как создавать быстрые статьи для facebook?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Как насчет того, чтобы открыть официальную документацию и ее прочитать?
    Ответ написан
    1 комментарий
  • Несколько вопросов о 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 комментарий
  • Сравнение массивов 5М+ значений?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Сложите данные во вторую таблицу и потом через SQL все сделайте.
    Ответ написан
    Комментировать
  • Могу ли я получать списки запрета сайтов?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Я думаю https://dns.yandex.ru/ должен помочь. Выберите Семейный вариант.

    Еще https://github.com/ircop/zapret

    И vigruzki.rkn.gov.ru/auto
    Ответ написан
    3 комментария
  • Как организовать непрерывную прослушку микрофона и реакцию на определенное слово?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Если нет подключения к Интернет, то нужно что-то вроде этого cmusphinx.sourceforge.net/wiki

    Если есть подключение к сети, то полно скриптов, которые умеют слушать в непрерывном режиме и скармливать услышанное Google Speech API. А дальше дело техники.
    Ответ написан
    Комментировать
  • Разрешен ли мат на сайтах в зоне .ru?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Откройте одноклассники.ру, майл.ру. Посмотрите, сколько там матов и грязи. Сделайте выводы.
    Ответ написан
    5 комментариев
  • Имеет ли право такой способ хранения текстов в виде архивов для оптимизации скорости работы?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Имеет смысл использовать базу данных, умеющую их сжимать. Например MongoDB сжимает данные примерно в 2 раза от их размера на диске при использовании WiredTiger и полнотекстового индекса. Не знаю, как с сжатием дела в MySQL или PostgresQL. Наверняка что-нибудь уже есть.
    Для сайтов о работе поиск вакансий критически важный функционал, от работы которого полностью зависит успешность вашего проекта.

    Ответы на вопросы
    1. Не имеет. Работа с файлам отнимет большую часть времени на разработку проекта, особенно операции редактирования, обновления информации.
    2. Архивировать нет смысла, исключение могут лишь составить разного рода прикрепленные документы в формате doc, xls и т.д., которые хорошо сжимаются и которые технически проще отдавать с диска напрямую. Можно архивировать в gzip в виде сгенерированной странички. Тогда nginx будет ее напрямую клиенту отдавать. Сэкономите на месте и времени CPU.
    3. Имеет смысл разбивать на папки, если у вас там будут миллионы файлов в папки. Просто из банального удобства навигации. В остальном вы ограничены количеством inodes.
    4. Решение не самое красивое, но имеет право на жизнь. Я бы так делать не стал.
    5. Сжимать файлы не стоит. Используйте MongoDB, она умеет все сжимать по умолчанию. В ней есть полнотекстовые индексы. Если надумаете дальше развивать проект, то его будет легко смаштабировать.


    Я не занимаюсь рекламой MongoDB. Я использую ее уже на протяжении 3-х лет в продакшене под серьезной нагрузкой и знаю ее сильные стороны.
    По поводу базы - если очень хочется, можете архивировать и хранить архивированные файлы прямо в том же MySQL. Просто когда будете вытаскивать данные при поиске, не делайте SELECT * Выбирайте только требуемые поля. И про индексы не забудьте.
    Ответ написан
  • Seo оптимизация. как поменять категории на сайте без вреда для seo, чтобы не потерять позиции?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Оставьте все ссылки на месте, перепишите плеер так, чтобы он умел HTML5 History API.
    Запускайте плеер с любой страницы на нужном видео, дальнейшая навигация черtp Javascript.
    Ответ написан
    Комментировать
  • Какой программой решить задачу по планированию перевозок?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Это называется комбинацией задачи коммивояжёра с задачей об упаковке с дополнительными условиями.
    Решается очень и очень непросто. Такими вещами занимаются программисты, работающие в логистических компаниях. Рекомендую обращаться сразу к таким людям.
    Ответ написан
  • Как лучше организовать работу нескольких классов под одним началом?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Ваш пример не совсем продуман.
    Логичнее было бы предположить, что есть некоторый общий интерфейс, который будет объединять все классы и при этом представлять общие функции над операндами различных типов.
    Допустим, вам нужно будет выполнять сложение с двумя аргументами.
    Например так:

    $math = new Calculator(); // в данном случае Number плохое имя, т.к. обозначает число, а не аггрегатор вычислительных операций
    echo $math->sum(1, 2); // вернет 3
    echo $math->sum(1.3, 2.7); // вернет 4.0


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

    echo Calculator::sum(1, 2); // вернет 3
    echo Calculator::sum(1.3, 2.7); // вернет 4.0


    Реализация класса будет выглядеть примерно так

    class Calculator 
    {
      /**
       * Метод предназначен для суммирования двух аргументов 
       * @param number $firstArgument первый аргумент
       * @param number $secondArgument второй аргумент
       */
      public static function sum($firstArgument, $secondArgument) 
      {
        return $firstArgument + $secondArgument;
      }
    }


    В данном случае не нужно изобретать велосипедов, т.к. все функции работы над числами универсальны.
    Ответ написан
    3 комментария
  • Где почитать теорию по навигации внутри зданий?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    В реальности навигация внутри зданий идет через разного рода маячки привязанные к плану здания.
    На настоящий момент очень трудно добиться высокой точности позиционирования. Погрешность в 3-5 метров - норма.
    Ответ написан
    1 комментарий
  • Как сделана форма регистрации в Facebook?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Это встроенная форма генерации лидов. Подробнее здесь https://developers.facebook.com/docs/marketing-api...
    Ответ написан
    Комментировать
  • Facebook API — есть ли аналог account.lookupContacts?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    В точности такого нет.

    Можно сделать что-то похожее через Multiple Ids

    GET /?ids=1,2,3&fields=name,picture
    Ответ написан
    6 комментариев
  • Есть ли возможность делать ретаргетинг в facebook на аудиторию конкурентов?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Использовать спарсенные данные не выйдет.
    Вам нужно использовать Lookalike аудиторию своего сайта.
    Ответ написан
    Комментировать
  • Насколько важную роль при устройстве на работу программистом играют собственные OpenSource проекты?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Наличие git-репозитария отражает ваш уровень, как разработчика. Это самый простой способ быстро проверить, умеете вы что-нибудь или нет. Люди, у которых нет открытых проектов обычно либо нубы, либо скрытные товарищи, либо жадные до безумия, либо просто тупые и не хотят развиваться, говнокодят на джумле и довольны. Таких людей не хотят брать на работу. Есть конечно люди, которые просто не пользуются гитом из-за того, что он им не нужен. Такие люди обычно не проходят первичный отбор, обычно устраиваются по рекомендации.
    При найме нужные люди, умеющие работать в команде.
    Репозитарий также отражает то, как хорошо вы умеете общаться с людьми и насколько вы способны создать код, который может быть использован другими людьми, т.е. навыки совместной разработки.
    Опять же репозитарий показывает, насколько вы знакомы с процессом разработки, умеете ли работать с ветками.

    Т.к. я иногда сталкиваюсь с процессом найма, я ищу в резюме наличие репы, смотрю как написан код. Обычно гуглю, что за человек, чем он занимается.
    Все люди, у которых были публичные активные репозитарии были адекватными вменяемыми разработчиками. Да, уровень и объем знаний бывает разный, но адекватность во многих случаях фактор немаловажный.
    Практически все разработчики без реп были низкого или среднего уровня. Были разработчики, у которых были закрытые репозитарии, они тоже были нормальными.
    OpenSource - это в некоторой степени показатель развития человека.
    Ответ написан
    1 комментарий
  • Смогу ли я скрыть страницу до её загрузки?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Это будет работать лучше всего
    <body style="display: none">
    Скрывать страницу до загрузки очень плохая практика.
    Ответ написан
  • Как решить вопрос с frame?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Не используйте изображение во фрейме. Иначе не будет работать.
    Можно решить проксируя все запросы через свой сервер.
    Ответ написан
    Комментировать
  • Почему не работает перехват ошибок?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Это работает в PHP 7.
    Для младших версий нужно использовать error_handler(), но для Fatal, он может не сработать, поэтому иногда применяются решения ввиде register_shutdown_function().
    Почитайте https://habrahabr.ru/post/261451/
    Ответ написан
    Комментировать