ГЛЕБ ГЛЕБОВ: Да, array я и имел ввиду. Просто в питоне это называется списком, вот и привык. По поводу вопроса - примерно так:
db.user.insert({_id: ObjectId('123')}, {$addToSet: {friends: user_id1}})
или если сразу нескольких, то
db.user.insert({_id: ObjectId('123')}, {$addToSet: {friends: {$each: [user_id1, user_id2]}}})
Модификатор $addToSet добавляет элемент в массив только если такого элемента там еще нет. В случае с друзьями это ограничение как раз нужно. Если все таки не нужно, то просто $addToSet меняем на $push
ГЛЕБ ГЛЕБОВ: Не совсем понял что Вы просите. Но попробую догадаться. Я имел ввиду для 2хзапросного варианта такие запросы:
"SELECT friends FROM user WHERE id = 123;" => friends
"SELECT * FROM user WHERE id IN (#{friends})" => список друзей пользователя со всей информацией о них
Либо однозапросный вариант:
SELECT * FROM user WHERE id IN (SELECT friends FROM user WHERE id 123)
В мускульном виде выглядит не очень, но прекрасно ляжет на аггрегирование через map-reduce в монго.
150 в Америке считается много выше среднего. Сам планировал ехать, предлагали 85000, узнавал у родственников оттуда - говорили, что очень хорошая сумма. Проанализировал цены - так себе. Поэтому не верьте про то, что в Америке 150 это мало. Столько и выше получает процентов 5 населения от силы. Ну и налог в самом худшем случае отнимет 50. Обычно 30% от которых можно отнять разные вычеты в зависимости от семейного положения и т.п. у средней семьи в Америке результирующий налог 25%, т.е. четверть
ГЛЕБ ГЛЕБОВ: да. Чтобы лучше понять как это работает напишите простой пример с разными роутами, которые перекрывают друг друга (типа как /users/:id, /users/login, /users/tratata и т.п.) и посмотрите что будет при вызове next.
ГЛЕБ ГЛЕБОВ: нет. UserController.handlers.login должен иметь следующие входные параметры function(request, response, next) {} request - объект запроса, response - объект ответа, next - функция для передачи управления дальше в цепочки вызовов. Данный подход используется повсеместно в express. Т. е. расценивайте примерно так: если в текущем контроллере Вы по какой-то причине не можете отдать ответ, то вызывайте next()
ГЛЕБ ГЛЕБОВ: А в чем именно проблема? В принципе не отличается от остальных языков: app.get('/users/login', ...) - отдаем форму, app.post('/users/login', ...) - забираем данные из формы (тут понадобится body-parser), проверяем их в базе, если все ок, то выставляем куку с сессией (для сессий нужна прослойка session). Затем при каждом запросе начинаете проверять наличие куки. Если нет куки или значение в ней не совпадает со значением из базы (или где Вы будете хранить сессии), то пользователь не авторизован. Иначе авторизован. Для задачи проверки можно использовать middleware также, в котором проставлять request.is_anonymous = true\false.
ГЛЕБ ГЛЕБОВ: например, если опираться на Ваши роуты и вызвать примерно такое: /users/321, то req.params будет содержать {id: 321}, но есть такой нюанс: у вас /users/:id перекрывает роут /users/login и поэтому вызов всегда попадает в users/:id и там остается (скорее всего именно поэтому Вы ничего и не видите на экране, даже пустой params). Решений здесь 2: в users/:id проверить, что req.params.id != 'login' (или в более общем случае проверить, что id число) и если id не тот, что нужно, то вызвать next (функция, которая передается в качестве последнего параметра у Вас), которая продолжит поиск нужного обработчика в роутах. Второй вариант более правильный - необходимо описывать роуты от частных к общим (т.е. поменять местами 3ий и 2ой роут), но это не умиляет факта использования next, так как позволяет обрабатывать запросы в более общем виде: не подходят параметры под текущий запрос - передали дальше управление. Подходящий обработчик не найден - 404.
YaKot: В коде немного лень, но постараюсь в псевдокоде:
1. бинаризация - это фактически делаем из каждого пиксела либо черный, либо белый. Делается чем-то вроде такого:
for x in img:
for y in img[x]:
if F(img[x][y]) > threshold:
newimg[x][y] = 1
else:
newimg[x][y] = 0
где F - функция, которая простым языком преобразует 3 канала (RGB) в один. Это может быть просто функция переводящая в оттенки серого
2. Подбор размера - берете пару кадров и смотрите (это не программа, прямо руками в фотошопе смотрите) сколько на этих кадрах занимает самый маленький автомобиль в пикселах. Это будет Вашим порогом когда объект становится автомобилем (можно сложнее и эффективней, но для начала пойдет и так)
3. вычитание фона. У вас есть сохраненный бинаризованный фон из первого этапа. Теперь смотрим что изменилось на изображении:
for x in img:
for y in img[x]:
movement[x][y] = abs(img[x][y] - background[x][y])
После этого в movement у Вас будут все пикселы, которые отличаются от исходного фона, полученного на первом этапе.
4. Так как вычитание чувствительно к шуму (а также разным насекомым, дождю и тп) лучше всего отфильтровать изображение по маске. Делается примерно так:
for x in img:
for y in img[x]:
newimg[x][y] = (newimg[x-1][y-1] * mask[0][0] + newimg[x][y-1] * mask[1][0] + newimg[x+1][y-1] * mask[2][0] + newimg[x-1][y] * mask[0][1] + newimg[x][y] * mask[1][1] + newimg[x+1][y] * mask[2][1] + newimg[x-1][y+1] * mask[0][2] + newimg[x][y+1] * mask[1][2] + newimg[x+1][y+1] * mask[2][2])/9
В mask матрица 3х3, которая содержит коэффициенты сглаживания. Например для данного случая будет эффективна сглаживающая матрица
1 0 1
0 1 0
1 0 1
Это будет фильтрация пространственная. Если нужна еще и временная фильтрация (эффективней), то берется 3 кадра (текущий, перед ним и после него) и маска 3хмерная. Значение пиксела определяется как среднее для 1ого кадра и z=0 в маске, 2 кадра и z=1 и 3его кадра и z=2 в маске.
4. Нашли объекты, теперь находим их центр масс. Самый простой вариант - берем координаты случайного набора пикселей объекта и находим среднее (складываем x, дели на количество. Аналогично с y). По нескольким кадрам определяем вектор движения объекта. На основании вектора определяем въехал или выехал.
Это самый элементарный вариант. Он обладает большим количеством минусов, но учитывая то, что Вы в этом не сильно разбираетесь, то здесь я не смогу объяснить более сложные вещи. А этого должно хватить для простых случаев.
А что не понятного? Человек хочет прочитать новые книги, которые вышли в этом году. Стремится к развитию и обновлению своих знаний. Опять Вы просто зашли написать фигню, вместо того, чтобы дать ответ на вопрос.
Gasoid: а идею никто и не купит. Хорошую идею можно изговнять плохой реализацией, а плохую идею... хотя с плохой идеей ничего не сделаешь ) Именно поэтому я и сказал, что нужен прототип.
xmoonlight: возможно. Ладно, не вижу смысла дальше с Вами общаться. Сразу видно, что у Вас значительный опыт разработки и открытия различных стартапов, который позволяет Вам даже не вникая в суть говорить выстрелит или нет. Мне до Вашего уровня еще ой как далеко )
xmoonlight: возможно Вы больше меня знаете о данном проекте и его деталях, но я бы так не стал утверждать не разобравшись до конца. Инстаграм и твиттер - дублировали возможности существующих на тот момент соцсетей, но реализовали все лучше; дропбокс - конкурентов было миллионы к началу создания; вконтакте - в начале полностью копировал фейсбук, а сейчас практически полностью вытеснил оного с территории некоторых стран.
xmoonlight: ну так-то не единым сбербанком и втб. Есть огромное количество мелких банков. Если идея стоящая, то внедрение не такая и большая сложность. Но мы не обсуждаем саму идею, а отвечаем на вопросы (по крайней мере я пытаюсь, а Вы в этом вопросе просто кричите, что ни у кого ничего не получится).
xmoonlight: если кто-то попытается украсть - значит идея стоящая и у Вас есть преимущество в виде прототипа. Банки очень медлительны, видел их работу изнутри. Принятие мизерного решения по изменению ставок в сбере вызвало целую панику у сотрудников. Юрлицам изменили ставки по вкладам, но не успели согласовать ставки по кредитам. Ушлые юрлица выгребали кредитные лимиты свои и отправляли на вклады. И это основная деятельность банка. А уж мобильная команда с прототипом пусть и меньшим финансированием явно быстрее реализует и внедрит хорошую идею.
db.user.insert({_id: ObjectId('123')}, {$addToSet: {friends: user_id1}})
или если сразу нескольких, то
db.user.insert({_id: ObjectId('123')}, {$addToSet: {friends: {$each: [user_id1, user_id2]}}})
Модификатор $addToSet добавляет элемент в массив только если такого элемента там еще нет. В случае с друзьями это ограничение как раз нужно. Если все таки не нужно, то просто $addToSet меняем на $push