apelsyn
0

Мне понравилось, очень познавательно. Кто, хоть раз верстал рекламу или дизайнил баннер, знает, как не просто сделать обрезку волос на портрете или вырезать из фона зверюшку.

apelsyn
+1
Мне стало интересно заглянуть в ядро koa и узнать, как реализована работа с Promise. Но я был удивлен, т.к. ядро осталось практически таким же, как в предыдущей версии. Авторы обеих библиотек express и koa одни и те же, неудивительно, что и подход остался таким же. Я имею ввиду структуру промежуточного ПО (middleware).

koa принципиально отличается от express и подход там совершенно другой. Работа с промисами там сводится к тому что в обработчике запроса ассинхронные функции вызываются через async/await синтакс со всеми вытекающими плюшками.


По поводу yeps-benchmark, там koa2 запускаеться через node-cluster, что на мой взгляд, не лучшее решение. И что пытаемся доказать, что роуты обрабатываються меделенее? Не спорю, но роуты это не часть koa, koa-router это сторонний middleware, роутинг не входит в базовую функциональность koa.


Про простоту и элегантность я б еще поспорил. А ошибки как ловить?

apelsyn
+3

Никогда не интресовался Blockchain просто потому что для работы не нужно а для личного развития не хотел тратить на это время. Купил PDF-ку. Ликбез прошел успешно :) Интересна сама философия децетрализованых сетей.


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


Эта глубоководная рыба распространена в Атлантическом и в западной части Индийского океанов. Обитает на глубинах от 100 до 1175 метров. Розовый пилобрюх достигает в длину 42 сантиметров, имеет продолго-
ватую форму тела, большие глаза и раздвоенный хвост.
image

apelsyn
+2

Еще про генераторы забыли. Они поддерживаться уже давно.

apelsyn
0

Если нужно поставить на поток попробуйте tesseract, там есть поддержка большого количества языков. Он, конечно же менее комфортен, но с подобным чеком справиться без поблем.


Недавно обновились натренированные модели для многих языков

apelsyn
0

:)
Да, действительно, почему бы не использовать бесплатный Tesseract, установить нужные языки. Для многих документов этого было бы достаточно.

apelsyn
0

Я недавно писал статью про машинное обучение на JS, там как раз очень нехватало такой теоретической части как у Вас. Я добавил линк на вашу статью. Очень хорошо и доступно получилось.

apelsyn
0

Можете посмотреть еще мою статью:
Нейронные сети на Javascript

apelsyn
0

User.findById синхронный?

apelsyn
+1

В том то и дело что async/await выглядит как синхронный код а выполняется асинхронно.


Другими словами когда вы ждете ответа с базы вы не блокируете поток. В этот момент ваше приложение может обрабатвать другие запросы от пользователей.

apelsyn
+1

А если вам нужно проверить не случилось ли ошибки при получении данных из базы
try {
user = await getUser();
} catch (err) {
// Error handling
}
Вы представляете во что превратиться Ваш код?


async/wait это отличная конструкция для написания человек-читаемого и легко понимаемого кода. Потому что код выглядит как синхронный а виполняется асинхронно.


Ваше заявление "С Promise получается короче" работает только для примитивных конструкций, для более сложных это не всегда справедливо

apelsyn
0

Чтоб не блокировать исполнение других обработчиков. Например к вашему web-серверу пришло несколько запросов.

apelsyn
+1

Напишите аналог на промисах через рекурсию

apelsyn
0

Напишите аналог на промисах, у вас тут "независимая" обработка кажного юзера.

apelsyn
0
let user,spammers = [];
do {
    user = await getUser();
    if (await isSpammer(user)) {
        spammers.push(user)
    }
} while (spammers.length <= 10 && user !== null);
console.log(spammers)

Ну и все это, конечно, внутри асихронной функции.

apelsyn
+3

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


Слабо?

apelsyn
0

Это не драфт, предложение находится в Stage 3 ("Candidate"), в следующем месяце будет частью стандарта Stage 4 ("Finished").

apelsyn
0

А если в цикле?

apelsyn
0

Если речь идет о Windows:


apelsyn
0

Как-то однобоко получилось.
Есть монолит, есть сервисы, есть монолит+сервисы. И то, и то востребовано в разработке.

apelsyn
0

Слайды презентации: http://www.slideshare.net/profyclub_ru/dom-aviasalesru (чтоб "руками" ссылки не набирать :) ).


apelsyn
0

В мире nodejs самая популярная ORM для mysql это драйвер MySQL :).


У себя в компании мы не используем ORM. В этой статье мы говорим про микросервис, у которого, как правило, количество кода и таблиц небольшое, сам микросервис сильно "заточен" под базу с которой он работает. От него требуеться быстродействие и минимальное потребление ресурсов.


Вот некоторые ORM, на которые когда-то смотрел:


apelsyn
0

Так в новой редакции у меня так и есть. Там роутер производит 2 разных middleware: 1 сами роуты, 2 заглушка, котрая правильно отвечает на вызов недопустимого метода. Но ее теретически можно не подключать, от этого REST сильно в функциональности не потеряет. В первой редакции это было не так, там эксортился инстанс роута, а он сам по себе middleware не является. Для генерации основного middleware у него надо вызвать метод router.routes()

apelsyn
0
GET /product — без пагинации, без вывода нужных полей, а сразу все…

А вы что хотели чтоб я вам здесь фреймворк написал? В статье столько кода, сколько нужно для демонстрации подхода Koa 2.


Сохранение данных модели без валидации.

Вы, видимо, еще очень начинающий программист — там все есть. Если это не так напишите мне SQL-инъекцию для этого сервиса.


Про модель Product я вообще молчу.

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

apelsyn
+1
Примечательно, что этот модуль — обёртка над node-fibers.
Так это еще один плюс в копилку async/await. Смысл для такой "крутой техногии" даунгрейдится в "более примитивную". Кроме того, из обсуждения ниже понятно, что замеры производительности сомнительны даже для babel.

Лучше я напишу в одном месте Future.fromPromise( p ).wait(), чем буду по всему коду раскидывать async и await.
Сомнительная красота.

В том-то и дело, что он не добавляет никакого нового синтаксиса. Только апи для запуска и переключения волокон.
А что api меняться не может?

Как я обожаю эту толерантность. Обе технологии выполняют одну и ту же функцию. Только одна прямо, хоть и не стандарт, а другая криво, хоть и почти-вот-вот-стандарт.

Тут "толерантность" не совсем подходит, синергия в случає с модулем обёрткой над node-fibers.


У node-fibers есть сильные стороны, которые вы уже перечислили но есть проблемы:


  • Есть некий талантливый разработчик Marcel Laverdet, который это все кодит. Ему сейчас интересно, репозиторий живой, но сильная зависимость от одного разработчика это риск для технологии. Ведь не всем она нравиться и ваша голосовалка говорит о том что даже после ваших блестящих аргунетов лидирует async/await


  • Бинарный код модуля это тоже проблема, т.к. есть облачные хостинги и среды с ограниченными возможностями по компиляции, где Вы не сможете собрать node-fibers.


  • Изомофный код, который становиться популярным в современных фреймворках не может использовать fibers, т.к. нету для него транспайлера.
apelsyn
+1

Дискуссия async/await vs fibers началась несколько дней назад в коментах к моей статье Пишем микросервис на KoaJS 2 в стиле ES2017. Часть I: Такая разная ассинхронность. (название похоже или мне показалось :) ). Там эта цепочка не вызвала бурного обсуждения, но как я вижу, дискуссия не окончена.


  • Стандарт Async Functions будет принят в конце ноября, сейчас он в стадии 'Stage 3 ("Candidate")'. Это означает что Ваш код, написанный под этим синтаксисом меняться не будет и Вас нету рисков что-то переписывать.


  • Неккоректно сравнивать быстродействие async/await в совокупности с транспайлером babel, так как это не самая быстрая реализация этого синтаксиса. Если использовать модуль asyncawait то, по утверждению автора модуля, производительность составлячет 79% от callback-стиля оформления кода. Другими словами потеря в скорости несущественная. Ситуация может измениться в нативной реализации, которая вот-вот, появится.

  • Огромное количество модулей уже описаны промисами, вам стоит просто написать await и ваше приложение ассинхронно подождет.


  • То что у Fibers нету стандарта означает что синтаксис может претерпевать изменения, это существенно повышает риски долгосрочной поддержки такого кода.

Мне симпатична технология Fibers, но я не понимаю зачем ей противопоставлять async/await. Обе имеют свои плюсы и минусы.

apelsyn
0
Нет не принят, из ES 2017 тут используется только синтаксис async/await, который находиться в стадии 'Stage 3 («Candidate»)', ожидаемое время стадии 'Stage 4 («Finished»)' конец ноября, до принятия «Async Functions»|осталось ждать несколько месяцев.
Все остальные синтаксические конструкции из стандарта ES 2015.
apelsyn
0
Ну да
console.log(Boolean(1)) // true

Немного сложнее с датой, обычно для этого используют Moment.js:
console.log(moment("2016-08-07 22:48:37",'YYYY-MM-DD HH:mm:ss').toDate() instanceof Date) // true


apelsyn
0

Вы правы, хотел минимизировать. Поправил код, теперь экспортрую 2 функции.

apelsyn
0

Есть модуль koa-connect или koa-express. Оба позволяют подключать модули от express. Они спроектированы для версии koa 1.0 но через koa-convert можно подключить к Koa2, если есть такая необходимость. Правда не 100% експресовских middleware будут работать по такой схеме, т.к. в Koa некоторые объекты могут называться по-другому.


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


По сравнению с koa у любого callbeck-style фреймворка (не только express) есть слабое место в обработке ошибок. Даже если вы в своем коде сделали все правильно, то ошибка может возникнуть во внешнем модуле и, как итог, ваш процесс падает, конечно там есть решение через домены, но они уж точно не добавляют красоты и наглядности вашему приложению. У koa такой проблемы нет, вы можете отлавливать все через try/catch как при работе сихронного кода, как показано в примере статьи. На koa уронить процесс значительно труднее, даже если вы сами не обработаете исключение, его обработает koa и не упадет.

apelsyn
0

Если я правильно понял, вы хотете сказать что организация ECMA собирается добавить в стандарт "костыли"? Звучит это как-то, мягко говоря, не убедительно. Откуда вы знаете, что с какой скоростью будет реализовано?


В Koa используется async/await, я Вам его не навязываю, просто рассказваю о фреймворке. Вам нравиться модуль Fibers? Я против него ничего не имею — используйте.

apelsyn
–1

async/await это то что через год станет частью JavaScript, остальные уровни не из нашей игры :)

apelsyn
0

Это хороший фреймворк — на нем создавались самые первые версии микросервисов нашей компании, мы использовали его совместно с модулем async. Некоторые из этих сервисов по сей день обслуживают ненагруженную часть сайта, которую мы еще не успели переписать. Но это CallBack-style фреймворк и они с Koa находятся в разных весовых категориях.

apelsyn
0

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


У вас будет шикарный фундамент, и выбор middleware для реализации роутинга, шаблонизации, сесии и т.д. Про некоторые полезные middleware я напишу во второй части.

apelsyn
0

Я еще раз потренировал модель на полной 60 000 выборке, прогнал тестовую выборку (10 000 записей) и получил 1,77% погрешность. Это средний показатель, если смотреть таблицу на сайте MNIST.

apelsyn
0

Не уверен что это задача для JavaScript. При распознавании изображений во входном слое будет очень много нейронов, а nodejs и др. реализации js однопоточные. (Это означает что в один момент времени будет задействовано только одно ядро). Но натренированную модель для классификации фото загрузить в js реально.

apelsyn
0

Я не проганял, после выходных отпишу.

apelsyn
+1
мы взяли библиотеку, написанную умными людьми,

А вы что в машинных кодах модели тренируете, или калькулятор предпочитаете? Я рассказал о хорошем инструменте для JavaScript.


подключили и решили игрушечную задачу.

Отличная задача для начинающих, простая и наглядная.

apelsyn
+2
А смысл в подобных знаниях на обезьяньем уровне? Ну т.е. на MNIST'е оно работает, а на более сложных задачах почти наверняка возникает масса проблем при тренировке, которые даже продиагностировать нельзя без понимания того, что находится под капотом у tran'а...

В статье достаточно информации для того чтоб заинтересовать человека, который никогда с этим не сталкивался. Ну Вам не угодил, — бывает.

apelsyn
+1
>JS таки заметно быстрее чем py
Есть ли под JS либы с jit-компиляцией? Обычно используют theano+[lasagne|keras] либо torch, caffe, tensorflow. Чем определен выбор JS?


Если этот вопрос ко мне, то мне просто нравиться JavaScript.

Ладно, на самом деле в статье обычный пример обучения. Просто самого содержания статьи нету. Нейронные сети — это не про программирование, это про машинное обучение и deep learning. Это про то, что скрывается за net.train(). А тут в статье даже слова градиент нету.


Да, нету. Нейронные сети это инструмент для решения некоторого класса задач и не всегда разработчику JavaScript нужно хорошо разбираться в том как реализован net.train(), достаточно знать что ему подавать на входы и что будем иметь на выходе.

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

>Код будет понятен даже тем программистам, которые не имели дело с нейронными сетями ранее.
Последовательность действий будет понятна даже тем программистам, которые никогда не занимались пайкой ранее.


Очень оригинально.

>В качестве функции f(x) чаще всего используется сигмоидная или пороговая функции
Пороговая функция в качестве функции активации использоваться не может, потому что, внезапно, ее производная не равна нулю на множестве меры 0. Тут скорее надо упомянуть тангенциальную функцию, rectifier, leaky rectifier.


Вы начали искать изъяны в теории? У вас минусовая карма, так вы троль, что ли?