Pull to refresh
76
0.1
Иван Ткаченко @velon

Программист, скептик и оптимист

Send message

Но ведь:

Выбери себе работу по душе, и тебе не придётся работать ни одного дня в своей жизни

Немного непонятно как "Управление разработкой" отпочковалась от "Программирования". Можно же "управлять" не написав ни строчки кода. Чего "технического" от этой номинации ожидается?

Не хотел Вас расстраивать, но если Вы внимательно посмотрите на сервис в GitHub gist то увидите, что публичные методы принимают либо параметры типа Long, либо org.postgis.Geometry, с Long Вы уже поспешили засунуть туда SQL инъекцию, теперь видимо пытаетесь с Geometry, ну если вам известен способ как в org.postgis.Geometry засунуть не пойми что, то соглашусь что инъекция возможна.
Да есть ещё layerName, но к нему не предусмотрен публичный доступ (см. GitHub gist), перекомпилировать разве что.

В общем, хватит бравировать, все найденные вами инъекции основаны на невнимательности, поспешности и попытке рассмотреть строку в отрыве от метода.


Если хотите пощупать, то ещё раз сообщаю что БД есть в контейнере, а исходный код я ни от кого, так же, не утаиваю - хотите щупайте.

Тем более непонятно, если бы Вы ошибку нашли, то давно бы её озвучили, но Вы продолжаете пускать пыль в глаза, что как бы наводит на мысль, что это блеф, чтобы не выглядеть нелепо после поспешно найденной инъекции.

И теперь вместо того чтобы обсуждать предмет публикации я вынужден реагировать на ваш комплекс учителя.

БД есть в контейнере на DockerHub, исходник есть на GitHub. Не знаю что Вас останавливает

Мы всё про тот же самый пример, в котором вы утверждаете что что среди айдишников может быть DROP DATABASE?

Если да, то это найденная SQL инъекция основана на аксиоме о том, что в List<Long> можно написать "1);DROP DATABASE;--".

Боюсь что это не так. Если же действительно можно, то объясните каким образом, а не ходите вокруг да около с "человеческий язык не все понимают", - постараюсь всё-таки понять, для того мы здесь и пишем.

И рассматривать одну строку:

String sql = String.format("DELETE FROM %s WHERE gid IN (%s)", layerName, StringUtils.join(deletesIds, ','));

в отрыве от остального метода - не комильфо.

Ээээ. Вы про вот этот метод что ли:

private void deleteFromTemp(List<Long> deletesIds) {
    if (!deletesIds.isEmpty()) {
        String sql = String.format("DELETE FROM %s WHERE gid IN (%s)", layerName, StringUtils.join(deletesIds, ','));
        jdbcTemplate.update(sql);
    }
}

Вы уверены что в одном из этих List<Long> deletesIds айдишников может быть что-то пободное DROP DATABASE ?

Ну ладно, но одумайтесь, сегодня вы превращаете List<Long> в DROP DATABASE, завтра свинец в золото, а послезавтра сожгут на костре.

Обратите внимание на строки

if (oldSpeed != value) {
    updates++;
    // TODO use different speed for the different directions (see e.g. Bike2WeightFlagEncoder)
    logger.info("Speed change at " + entry.getId() + " (" + point + "). Old: " + oldSpeed + ", new:" + value);
    edge.setFlags(carEncoder.setSpeed(edge.getFlags(), value));
}

Они не оперируют такими понятиями как скорость максимальная/минимальная/средняя. Есть просто "скорость", и graphhopper при построении самого быстрого маршрута полагается на неё, это видно из класса FastestWeighting, в методе calcEdgeWeight.


Понятие maxSpeed там скорее стоит воспринимать как "максимальная скорость с которой можно ехать превозмогая всё (пробки, качество дорог, сопротивление воздуха) кроме правил дорожного движения".

Посмотрел пример. Их задумка оказалась не сложной, всё в классе DataUpdater:

  1. Есть у них какой-то волшебный сервис http://www.stadt-koeln.de/externe-dienste/open-data/traffic.php. Он возвращает загруженность дорог, и с координатами.

  2. Они получают LocationIndex locationIndex = hopper.getLocationIndex(); и находят в нём рёбра по координатам.

  3. В найденном ребре подменяют скорость см. lockedFeed

if (oldSpeed != value) {
    updates++;
    // TODO use different speed for the different directions (see e.g. Bike2WeightFlagEncoder)
    logger.info("Speed change at " + entry.getId() + " (" + point + "). Old: " + oldSpeed + ", new:" + value);
    edge.setFlags(carEncoder.setSpeed(edge.getFlags(), value));
}

Этот locationIndex потом в классе Router применяется.

Но в целом они тоже используют внешний источник для информации по трафику

Пример реализации ещё не смотрел. Интересно как они реализовали, посмотрю обязательно.

Я бы так реализовывал: в БД я бы хранил только редко меняемые или постоянные параметры, информация о пробках меняется динамически, - в БД её хранить не оптимально, - потребует постоянной перезаписи. По крайней мере не в той же базе, которая используется для построителя.

Я бы обработку вынес в класс в связанный с определением веса см. weighting. Уже в момент обработки ребра при маршрутиации смотрел какая на нём нагрузка - возможно получая её из стороннего сервиса, и использовал бы полученные данные для расчёта веса переопределив calcEdgeWeight изAbstractWeighting

Спасибо за отзыв.
Можно поподробнее "трафик", это что? Какой у него аналог в тегах OSM? highway?

Если я правильно понял вопрос, то общий подход такой:

  1. Вы можете создавать в таблице любые поля. Главное добавить их во вьюшку см. Подготовка данных

  2. Затем эти данные можно считывать из БД таким образом см. graphhopper-reader-postgis

for (String tag : tagsToCopy) {                             
    Object val = road.getAttribute(tag);                             
    if (val != null) {                             
        way.setTag(tag, val);                             
    }                             
 }  


highway там вот так обрабатывается:

// Тип дороги                             
Object type = road.getAttribute("fclass");                             
if (type != null) {                             
    way.setTag("highway", type.toString());                             
}


т.е. здесь могут быть любые атрибуты, какие пожелаете.

Encoder обрабатывает этот тег например как в CarFlagEncoder

Спасибо за статью. Используем во многих проектах Sphinx и Manticore. Знаком со Sphinx наверно с 2014 года. Действительно обидно когда решение незаслуженно уходит на второй план, многие даже про Sphinx и Manticore не слышали.

Нужно больше статей про Manticore. Я когда-то написал парочку на хабр. Возможно ещё напишу, - есть что рассказать.

Круто, присмотрюсь к определению высоты в пропущенных квадратах на основе вашего подхода со свёрткой. А кригинг рассматривали для той же задачи?

Где кейс купили? Поделитесь ссылкой, пожалуйста, а то никак найти не могу.

Ты пускаешь браузеры в свой ДОМ, а они меняют то, что он содержит на котлеты. Не доверяйте браузерам.
Угорают же не над качеством перевода, а над его попытками предложить хоть какой-то вариант перевода всегда, даже когда переводить то нечего. Это новый уровень.
Тут ситуация хуже, когда язык оригинала отличается от языка перевода — это заметно невооружённым взглядом. А когда язык оригинала русский и он пытается перевести его с английского на русский, — тут становится непонятно что происходит.

Information

Rating
3,594-th
Location
Тюмень, Тюменская обл. и Ханты-Мансийский АО, Россия
Date of birth
Registered
Activity