• Как передать обработчик Express?

    lastuniverse
    @lastuniverse
    Abcdefgk, я нисколько не сомневаюсь в Вашем понимании работы http протокола, Вы верно написали что http - "протокол без сохранения состояния". Но касаемо вопроса заданного автором про роутеры expressjs это не имеет никакого отношения.

    Для понимания сути происходящего предлагаю следующее описание процесса:
    1. экспресс принимает get запрос от браузера для пути '/' (к примеру)
    2. экспресс вызывает первый обработчик зарегистрированный как get или all для этого пути
    3. если обработчик производит вызов next() то экспресс берет следующий в очереди обработчик зарегистрированный как get или all для этого пути и вызывает его (передавая ему объект req со всеми изменениями, внесенными предыдущими обработчиками). Если же обработчик вызывает один из следующих методов (res.end(), res.json(), res.jsonp(), res.redirect(), res.render(), res.send(), res.sendFile, res.sendStatus()) то обработка запроса прекращается и последующие обработчики не вызываются.

    Еще раз повторюсь, незнание человеком чего либо не является большой проблемой, также не является грубостью или оскорблением то, что человеку показывают на его пробелы в знаниях. Но если даже после этого человек не удосужился немного задуматься и продолжает настаивать на своем это многое о человеке говорит :)
  • Как передать обработчик Express?

    lastuniverse
    @lastuniverse
    Abcdefgk, эта Ваша фраза ясно дает понять что Вы совсем не понимаете как работает express.


    http - "протокол без сохранения состояния" (в переводе на обычный язык - "запрос - ответ - я вас не помню"). Учите матчасть.
  • Как передать обработчик Express?

    lastuniverse
    @lastuniverse
    Abcdefgk, мне почему то кажется что Вы сильно запутались сами и путаете людей.

    PS: если Вы все еще сомневаетесь, офдока Вам в помощь.
    Если в двух словах, то я могу навешивать сколько угодно последовательных (get, post и пр.) обработчиков на один и тот же путь. При этом я могу делать это так как показали вы, так и отдельными вызовами. Если Вы все еще сомневаетесь - проверьте сами прежде чем путать людей.
  • Как передать обработчик Express?

    lastuniverse
    @lastuniverse
    Abcdefgk, да, ладно!

    А вот так значит уже нельзя?
    router.get('/', someObrabotchik);
    router.get('/', moreSomeObrabotchik);
    router.get('/', function(req, res, next) {...});


    Может быть вы не понимаете суть вопроса, заданного пользователем?
    Как правильно написали люди в ответах проблема в том что он вызывал next() не дождавшись ответа от БД.
  • Как надежно записать в изображение скрытую информацию?

    lastuniverse
    @lastuniverse
    xmoonlight, это просто какой то выверт мозга, даже не уверен что осилю:)

    PS: сбежал к подушке.
  • Как надежно записать в изображение скрытую информацию?

    lastuniverse
    @lastuniverse
    xmoonlight, ночь на дворе, завтра воткнусь :)
    Вот еще один вариантик: теоретически можно попробовать реализовать некоторую сверточную искусственную нейронную сеть (ИНС). Произвести ее обучение на большом объеме картинок, каждая из которых подготовлена в множестве вариантов обрезок, ресайзов, смен форматов и токенов. При обучении на вход такой ИНС необходимо будет подавать эти, подготовленные картинки, на выходе должно проверятся соответствие действующему токену. Далее реверс такой ИНС и подача на ее входы даст некую битовую маску, при наложении которой на изображение в него будет внесен токен. а использование прямой (не реверсной) ИНС позволит получить токен с копии фото поданной на вход. Одним из плюсов ИНС в данной задаче будет ее высокая помехоустойчивость (конечно при правильном обучении и внутренней архитектуре самой ИНС). Минусом будет достаточно большой размер ИНС.
  • Как надежно записать в изображение скрытую информацию?

    lastuniverse
    @lastuniverse
    1. генерация идентификационного токена: ID пользователя, которому было показана данная конкретная копия изображения + присвоенный вами id самого изображения. Чем короче (в битах) будет токен тем проще его внедрить с гарантией возможности последующего считывания с незаконных копий. По сути тут речь идет о балансе между размером токена и гарантией его прочтения.
    2. защита от ресайза: закладывать информационные еденицы (биты) не в пиксели, а в сектора. например квадраты со стороной N, где каждый пиксель внутри такого квадрата дублирует информационную единицу (бит)
    3. защита от кропа: избыточность добавляется не только за счет использования секторов, но и за счет повторения информации токена в других частях изображения. Необходимо сразу оценить то как именно может быть обрезано изображение и разместить как минимум 1 полную копию токена в области которая может быть обрезана с наименьшей вероятностью
    4. защита от смены форматов: для внесения информации использовать не просто замену пикселей по принципу четная величина канала -1, нечетная-0 а более сложные алгоритмы, подверженные меньшему влиянию от шума. Например завязанные на какую либо статистическую характеристику всего объема пикселей входящих в сектор.
    5. чтение информации: полностью зависит от выбранного вами способа внесения информации и его реализации. Для упрощения считывания можно несколько областей сделать опорными, тесть их относительное расположение и внесенная в них информация во всех изображениях одна и та же. далее в проверяемом изображении будет необходимо найти эти опорные сектора и в зависимости от их размера и расположения (могут меняется при кропе и ресайзе) вычислить положение информационных секторов, после чего произвести их чтение.
    6. проверка: желательно чтобы была возможность чтения нескольких копий идентификационного токена. Сравнив их вы получите возможность убедится что чтение произведено без ошибок. Далее вы просто берете из токена ID изображения и ID пользователя получая тем самым информацию что и кем было украдено.

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

    PPS: теоретически можно попробовать реализовать некоторую сверточную искусственную нейронную сеть (ИНС). Произвести ее обучение на большом объеме картинок, каждая из которых подготовлена в множестве вариантов обрезок, ресайзов, смен форматов и токенов. При обучении на вход такой ИНС необходимо будет подавать эти, подготовленные картинки, на выходе должно проверятся соответствие действующему токену. Далее реверс такой ИНС и подача на ее входы даст некую битовую маску, при наложении которой на изображение в него будет внесен токен. а использование прямой (не реверсной) ИНС позволит получить токен с копии фото поданной на вход. Одним из плюсов ИНС в данной задаче будет ее высокая помехоустойчивость (конечно при правильном обучении и внутренней архитектуре самой ИНС). Минусом будет достаточно большой размер ИНС.
  • Как надежно записать в изображение скрытую информацию?

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

    Иван Корюков, для того чтобы такая информация была менее заметна в результирующем изображении можно использовать специальные карты замены цветов (палитры), ориентированные на недостатки человеческого зрения.
  • Как надежно записать в изображение скрытую информацию?

    lastuniverse
    @lastuniverse
    xmoonlight, спасибо за поддержку.
    Иван Корюков, существует множество способов внедрения информации, в том числе и дающих некоторую гарантию на защиту от шумов, помех, предумышленных изменений. В своем комментарии я прежде всего опирался на те из них, которые вкладывают информацию с некоторой избыточностью, отсюда и небольшие объемы добавляемой информации а также некоторый уровень защиты от ее потери при кропах, ресайзах, и невысоких уровнях сжатия при смене форматов (те самые граничные условия про которые я говорил).
  • Как надежно записать в изображение скрытую информацию?

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

    PS: хоть объем информации и не очень велик, его вполне хватит для того чтобы сохранить некий идентификационный токен

    PPS: но опять же, если сервис, крадущий изображение знает о наличии такого токена и способе его внедрения в изображение, то всегда сможет от него избавится.
  • Как надежно записать в изображение скрытую информацию?

    lastuniverse
    @lastuniverse
    Вам необходимо готовое решение или мысли по реализации?
  • Как разбить js на файлы/модули?

    lastuniverse
    @lastuniverse
    Александр Косицын, можно еще проще, рекурсивно сканировать папку /routers/ с подпапками на передмет наличия main.js или index.js и их подключать как роутер для пути, соответствующему пути к файлу внутри /routers/. При этом внутри метод указывается уже внутри файлов роутера (хоть all, хоть get, post, put и delete, хоть все вместе)

    например как то так (в основном файле приложения)
    ...
    
    var fs = require('fs');
    var path = require('path');
    
    ...
    
    var loadRouters = function (dir){
        var files = fs.readdirSync(dir);
        files.forEach(fname=>{
            const fpath = path.join(dir,fname);
            if ( fs.statSync(fpath).isDirectory() ){
                loadRouters(fpath);
            }else if( fname === "main.js" ){
                const router = require('./'+fpath);
                app.use(dir, router);
            }else{
            
            }
        });
    };
    
    loadRouters("./routers");
    
    ...


    PS: при таком варианте достаточно просто создать файл `main.js` в папке `./routers/` или ее подпапках и этот файл будет подключен как роутер автоматически
  • Как разбить js на файлы/модули?

    lastuniverse
    @lastuniverse
    что вам мешает сделать так как показано в оф.документации express
  • Как заменить "2x" на "2*x" при помощи JavaScript?

    lastuniverse
    @lastuniverse
    думаю еще и скобки добавить будет не лишним.

    str.replace(/(\d+)([\(a-z])/gi, '$1*$2')