Я не очень представляю, как соединять ноды напрямую используя подписку на топики, то есть многие-ко-многим. Только для сервисов, но как я понял, они используются реже.
В документации я не нашел средств получания метаинформации — списков и описаний пакетов, топиков, типов, сервисов.
Посмотрите этот проект: ros-control-center. Судя по скриншоту и описанию (ROS Control Center offers an easy way to show nodes, topics and service names.) им удается получать метаинформацию.
По поводу мониторинга, у них ряд интересных проектов: robotwebtools
В учебном применении время реакции не столь критично, и на нем можно прототипировать и что-то более низкоуровневое.
Как понимаю, при использовании ROS, ноды находят друг друга через Master'a, а в дальнейшем коммуницируют напрямую. В случае использования rosbridge коммуникация происходит через ноду-посредника на котором запущен WS сервер. Чисто теоретически, при большом количество топиков и подписчиков, такая нода может стать узким местом. Вопрос, правда, на сколько это критично.
Большое спасибо за интересную статью. Это отлично, что появляются курсы и такие статьи по ROS'у. Крайне интересно узнать про ваш опыт:
Возникли какие-либо сложности при установке/настройке ROS'a. Если да, то какие?
Правильно ли я понял, что такой способ работы через rosbridge по функционалу полностью аналогичен нодe с Publisher and Subscriber?
Как вы думайте, rosbridge подходит для полноценной работы с ROS? Не будет ли проблем со скоростью из-за отсутствия сериализации в бинарный протокол и использования WS вместо TCP или же область применения rosbridge ограничивается использованием в веб-интерфейсах для ручного управления и мониторинга?
Про 95% это вы так же с потолка взяли, так же как и JetBrains про 100% интероп?
жуткие конструкции с "++=" и прочим
Т.е. в java/kotlin x += 1 понятная конструкция, а вот xs ++= List(1,2,3,4) уже жуткая, если учесть конкатенация двух списков это ++
В Котлин придостаточно жутких конструкция по типу
thing?.thing1?.thing2 ?: 10
или сложных конструкций по типу делегатов, которые Джавистам не знакомы. Я лично до сих пор не могу понять как работают эти делегаты.
с extension methods все отлично, вот только проблема в том в Java их нет. Приходится вызывать статические методы. Особенно это уродски выглядит когда либа на Котлине их использует повсеместно.
companion object приходится анноторивать @JvmStatic, что бы можно было нормально из Java вызывать, вот только к сожалению часто их не аннотируют почему-то.
на скале вызывать почти невозможно
Да уж невозможно конечно. Поэтому большинство мейн-стримовых скаловских фреймворках доступны из java.
В котлине таких проблем нет
Есть с тем же suspend methods. Или вы собрались использовать некое подмножество языка? Ну так это можно так с X где X любой JVM язык.
К слову, большенство кода написанного на скале вызывать почти невозможно.
Дело не в выигрышах или проигрышах, а дело в заявленных 100%, смотрите я ответил выше. Особенно это актуально для Джавистов, если они собрались потом использовать Котлиновский код.
А по поводу интеграции в Джаву вообще вопрос интересный. Вот реально субъективно возникает меньше ощущения «другой» платформы, чем от Скалы
Безусловно интеграция с джавой у Котлина лучше (и наверное лучше чем у любого другого JVM языка), по поводу этого не спорю. Но лучше, это относительное понятие, а не величина. Если мы говорим про цифры, то эти цифры должны быть подтверждены (а если нет подтверждения, то какой смысл в конкретных величинах?), тем более если мы говорим про громогласное заявленное на офф сайте 100%. 100% — значит что мы должны иметь возможность без костылей вызвать это в Java, не смотря на сколько это "чужеродно". И такие "чужеродности" не только с suspend method их ещё много, все это придется пережить и узнать кто будет использовать Котлин, выполняя роль тестировщика языка.
Я бы не советовал как пример приводить вызов suspend методов.
Осталось сделать такой список на офф сайте Котлина: "Мы не советуем вам использовать эти фичи Kotlin'а т.к. вы потеряйте интероп" и я бы даже слова не сказал. Или ещё лучше какой-нибудь флаг компилятора, который выключал все эти фичи и позволял бы писать на каком-нибудь подмножестве Котлина, который бы имел интероп. Потому что уже сейчас появляются библиотеки на Котлине, которые используют спицифичные для Котлина фичи, и которые сложно вызывать из Java, но создатели этих либ особо об этом не парятся. В результате получается своя экосистема, такая же как в Clojure или Scala.
Еще Котлин хорошо интегрируется во все системы байт-код «хакинга» (типа Мокито, хотя и не без проблем), анализа и т.п. Поэтому с ним работают Спринг (официально) и даже магические библиотеки типа Quasar
Когда Kotlin станет мейнстрим-языком, значение компании JetBrains для рынка Software Engineering, на котором она работает, будет совершенно другим. То есть, про нас будут говорить, что мы не какие-то ребята, которые делают удобные, но в любой момент заменяемые инструменты, а как про тех, кто делает некоторую корневую фичу экосистемы, на которой всё строится. Это другой вес, другой информационный поток, и деньги, я думаю, тоже другие.
Почему… почему в каждой статье пишут про 100% интероп? Откуда взялась эта цифра, она взята с потолка? Почему не 90%, 95% или 148%?
Уже появляются доклады в которых рассказывать что даже Java код иногда сложно вызывать (https://youtu.be/CABN2r4GPpQ?t=45m9s), а этот язык только недавно релизнулся.
Я молу про то, что большую часть kotlin фишек нельзя вызвать из java кода. Вот что у меня получилось при попытке вызвать suspend method из java:
Sequence<Integer> seq = SequenceBuilderKt.buildSequence(new Function2<SequenceBuilder<? super Integer>, Continuation<? super Unit>, Object>() {
public Object invoke(SequenceBuilder<? super Integer> sequenceBuilder, Continuation<? super Unit> continuation) {
return null;
}
});
и это только начало списка, ещё есть extension methods, object companion и т.д.
В итоге получается, если хотите java interop не используйте kotlin фишки, пишите на такой же java только с сахаром.
Скорее всего вы меня неправильно поняли. У нас есть функция, под названием buildSequence, которая реализована на языке Котлин, из пакета стандартной библиотеки. Как эту функцию можно вызвать и пользоваться ей в Java коде. При 100% интеропе такая возможность должна быть.
Я попытался вызвать эту функцию из Java и среда разработки предложила мне такой вариант:
Sequence<Integer> seq = SequenceBuilderKt.buildSequence(new Function2<SequenceBuilder<? super Integer>, Continuation<? super Unit>, Object>() {
public Object invoke(SequenceBuilder<? super Integer> sequenceBuilder, Continuation<? super Unit> continuation) {
return null;
}
});
Корутины сделаны средствами языка, это те же extension методы и т.п.
Не смотря на то, что extension methods это часть языка, их можно вызвать из Java кода явно передав туда объект на котором вызывается метод.
C помощью extension методов думаю никак, но можно это сделать делегатом
Мне не очень понятно где здесь внешние расширение. Вы явно наследуетесь от интерфейса.
Что если у вас есть класс из какой-нибудь библиотеки Java, к которому у вас нет доступа изменять исходники и интерфейс из совершенно другой библиотеки. Можно как-нибудь расширить класс из первой библиотеки другим интерфейсом, например:
// из первой библ
class Robot {}
// из второй библ
interface Moveable{
def move(): Unit
}
// мой код с расширением
implicit class ExtMoveableRobot(val self: Robot) extends Moveable{
def move(){}
}
Extension методы, в какой-то мере это аналог implicit из Scala (для задач расширения функциональности существующих классов).
Если extension methods аналог implicit для задачи расширения функциональности, то как можно с помощью Котлиновского extension methods расширить класс внешним интерфейсом?
Отличный интероп с java. Java из Kotlin выглядит как Kotlin и наоборот.
Я задавал этот вопрос в другой теме, но ни кто не ответил. Но все таки повторюсь.
Как сохраняется интероп с java при использовании корутин?
Есть ли возможность вызвать suspend function из java?
Как бы например выглядело использование buildSequence в java?
Ещё по поводу интеропа. Каждый раз слышу заявления про 100% интероп (так же заявлено на сайте Котлина), но в том же докладе Антона Кекс (Kotlin-паззлеры) часто упоминается разного рода косяки при вызове даже java кода и наоборот. Интероп конечно лучше чем у Скалы, но он точно не 100%.
делегаты
А это по правде интересная вещь. Правда, до сих пор не до конца разобрался как это работает.
В результате какая разница? Это особенность работы паттерн матчинга. Значения которые по нему сопоставляются привязываются к новому имени. Это спор против мутирования старой переменной или создания новой измененной (считай импер. программирования против функц.). В результате вы так же сделали проверку и у вас произошел неявный каст (не ненужно самому кастовать, как пришлось бы в Java).
Почему не запоминает? Изначально у value тип Any. В первой ветке идет проверка на то, что value имеет тип String. Если он таковым является, то значение привязывается к str и во всей ветке считается за String. Если бы такого преобразования не было бы, не имелось бы возможным вызвать метод charAt, который есть только у String. Тоже самое касается Int, и Some (аналог Котлиновского null type).
Здравствуйте, могли бы рассказать как вы сохраняйте интероп с java вводя корутины?
Есть ли возможность вызвать suspend function из java?
Как бы например выглядело использование buildSequence в java?
В какой kotlin код транслирует ts2kt такие ts конструкции (intersection types, union types)?
function extend<T, U>(first: T, second: U): T & U {...}
function padLeft(value: string, padding: string | number) {...}
Я просто не знаю других источников, где одно и то же нетривиальное было бы написано на разных языках программирования. Если Вы о таком знаете, был бы признателен за указание
Здесь есть много задач описанных на разных ЯП, но большая часть из них простые.
У вас на картинке лого другого Spark'a (Spark — A micro web framework).
Где можно найти сравнение производительности спарковского MLlib запущенного на одном компьютере с другими решениями для машинного обучения под java/scala?
При обычной (без
rosbridge
) работе с нодами, они уже коммуницируют напрямую (даже через PubSub) Once these nodes have located each other they communicate with each other peer-to-peer.. Судя по всему, каждая нода хранит у себя список подписчиков.Посмотрите этот проект: ros-control-center. Судя по скриншоту и описанию (ROS Control Center offers an easy way to show nodes, topics and service names.) им удается получать метаинформацию.
По поводу мониторинга, у них ряд интересных проектов: robotwebtools
Как понимаю, при использовании ROS, ноды находят друг друга через Master'a, а в дальнейшем коммуницируют напрямую. В случае использования
rosbridge
коммуникация происходит через ноду-посредника на котором запущен WS сервер. Чисто теоретически, при большом количество топиков и подписчиков, такая нода может стать узким местом. Вопрос, правда, на сколько это критично.Большое спасибо за интересную статью. Это отлично, что появляются курсы и такие статьи по ROS'у. Крайне интересно узнать про ваш опыт:
rosbridge
по функционалу полностью аналогичен нодe сPublisher and Subscriber
?rosbridge
подходит для полноценной работы с ROS? Не будет ли проблем со скоростью из-за отсутствия сериализации в бинарный протокол и использования WS вместо TCP или же область примененияrosbridge
ограничивается использованием в веб-интерфейсах для ручного управления и мониторинга?Про 95% это вы так же с потолка взяли, так же как и JetBrains про 100% интероп?
Т.е. в java/kotlin
x += 1
понятная конструкция, а вотxs ++= List(1,2,3,4)
уже жуткая, если учесть конкатенация двух списков это++
В Котлин придостаточно жутких конструкция по типу
или сложных конструкций по типу делегатов, которые Джавистам не знакомы. Я лично до сих пор не могу понять как работают эти делегаты.
с extension methods все отлично, вот только проблема в том в Java их нет. Приходится вызывать статические методы. Особенно это уродски выглядит когда либа на Котлине их использует повсеместно.
companion object приходится анноторивать
@JvmStatic
, что бы можно было нормально из Java вызывать, вот только к сожалению часто их не аннотируют почему-то.Да уж невозможно конечно. Поэтому большинство мейн-стримовых скаловских фреймворках доступны из java.
Есть с тем же suspend methods. Или вы собрались использовать некое подмножество языка? Ну так это можно так с X где X любой JVM язык.
Дело не в выигрышах или проигрышах, а дело в заявленных 100%, смотрите я ответил выше. Особенно это актуально для Джавистов, если они собрались потом использовать Котлиновский код.
Безусловно интеграция с джавой у Котлина лучше (и наверное лучше чем у любого другого JVM языка), по поводу этого не спорю. Но лучше, это относительное понятие, а не величина. Если мы говорим про цифры, то эти цифры должны быть подтверждены (а если нет подтверждения, то какой смысл в конкретных величинах?), тем более если мы говорим про громогласное заявленное на офф сайте 100%. 100% — значит что мы должны иметь возможность без костылей вызвать это в Java, не смотря на сколько это "чужеродно". И такие "чужеродности" не только с suspend method их ещё много, все это придется пережить и узнать кто будет использовать Котлин, выполняя роль тестировщика языка.
Осталось сделать такой список на офф сайте Котлина: "Мы не советуем вам использовать эти фичи Kotlin'а т.к. вы потеряйте интероп" и я бы даже слова не сказал. Или ещё лучше какой-нибудь флаг компилятора, который выключал все эти фичи и позволял бы писать на каком-нибудь подмножестве Котлина, который бы имел интероп. Потому что уже сейчас появляются библиотеки на Котлине, которые используют спицифичные для Котлина фичи, и которые сложно вызывать из Java, но создатели этих либ особо об этом не парятся. В результате получается своя экосистема, такая же как в Clojure или Scala.
Если вы посмотрите issues лист Quasar, то увидите что там достаточно специфичных багов связанных с использованием Котлина.
коммерция
https://habrahabr.ru/company/jugru/blog/318842/
Почему… почему в каждой статье пишут про 100% интероп? Откуда взялась эта цифра, она взята с потолка? Почему не 90%, 95% или 148%?
Уже появляются доклады в которых рассказывать что даже Java код иногда сложно вызывать (https://youtu.be/CABN2r4GPpQ?t=45m9s), а этот язык только недавно релизнулся.
Я молу про то, что большую часть kotlin фишек нельзя вызвать из java кода. Вот что у меня получилось при попытке вызвать suspend method из java:
и это только начало списка, ещё есть extension methods, object companion и т.д.
В итоге получается, если хотите java interop не используйте kotlin фишки, пишите на такой же java только с сахаром.
Скорее всего вы меня неправильно поняли. У нас есть функция, под названием
buildSequence
, которая реализована на языке Котлин, из пакета стандартной библиотеки. Как эту функцию можно вызвать и пользоваться ей в Java коде. При 100% интеропе такая возможность должна быть.Я попытался вызвать эту функцию из Java и среда разработки предложила мне такой вариант:
Не смотря на то, что extension methods это часть языка, их можно вызвать из Java кода явно передав туда объект на котором вызывается метод.
Мне не очень понятно где здесь внешние расширение. Вы явно наследуетесь от интерфейса.
Что если у вас есть класс из какой-нибудь библиотеки Java, к которому у вас нет доступа изменять исходники и интерфейс из совершенно другой библиотеки. Можно как-нибудь расширить класс из первой библиотеки другим интерфейсом, например:
Если extension methods аналог implicit для задачи расширения функциональности, то как можно с помощью Котлиновского extension methods расширить класс внешним интерфейсом?
Я задавал этот вопрос в другой теме, но ни кто не ответил. Но все таки повторюсь.
Как сохраняется интероп с java при использовании корутин?
Есть ли возможность вызвать suspend function из java?
Как бы например выглядело использование buildSequence в java?
Ещё по поводу интеропа. Каждый раз слышу заявления про 100% интероп (так же заявлено на сайте Котлина), но в том же докладе Антона Кекс (Kotlin-паззлеры) часто упоминается разного рода косяки при вызове даже java кода и наоборот. Интероп конечно лучше чем у Скалы, но он точно не 100%.
А это по правде интересная вещь. Правда, до сих пор не до конца разобрался как это работает.
В результате какая разница? Это особенность работы паттерн матчинга. Значения которые по нему сопоставляются привязываются к новому имени. Это спор против мутирования старой переменной или создания новой измененной (считай импер. программирования против функц.). В результате вы так же сделали проверку и у вас произошел неявный каст (не ненужно самому кастовать, как пришлось бы в Java).
Почему не запоминает? Изначально у value тип Any. В первой ветке идет проверка на то, что value имеет тип String. Если он таковым является, то значение привязывается к
str
и во всей ветке считается за String. Если бы такого преобразования не было бы, не имелось бы возможным вызвать методcharAt
, который есть только у String. Тоже самое касается Int, и Some (аналог Котлиновского null type).У Скалы есть Smart casts, только он не через if работает, а в сопоставлении с образцом.
Здравствуйте, могли бы рассказать как вы сохраняйте интероп с java вводя корутины?
Есть ли возможность вызвать suspend function из java?
Как бы например выглядело использование buildSequence в java?
В какой kotlin код транслирует ts2kt такие ts конструкции (intersection types, union types)?
Здесь есть много задач описанных на разных ЯП, но большая часть из них простые.
Где можно найти сравнение производительности спарковского MLlib запущенного на одном компьютере с другими решениями для машинного обучения под java/scala?