Pull to refresh
0
0

Пользователь

Send message
Я не очень представляю, как соединять ноды напрямую используя подписку на топики, то есть многие-ко-многим. Только для сервисов, но как я понял, они используются реже.

При обычной (без 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'у. Крайне интересно узнать про ваш опыт:


  1. Возникли какие-либо сложности при установке/настройке ROS'a. Если да, то какие?
  2. Правильно ли я понял, что такой способ работы через rosbridge по функционалу полностью аналогичен нодe с Publisher and Subscriber?
  3. Как вы думайте, 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

Если вы посмотрите issues лист Quasar, то увидите что там достаточно специфичных багов связанных с использованием Котлина.

коммерция


Когда Kotlin станет мейнстрим-языком, значение компании JetBrains для рынка Software Engineering, на котором она работает, будет совершенно другим. То есть, про нас будут говорить, что мы не какие-то ребята, которые делают удобные, но в любой момент заменяемые инструменты, а как про тех, кто делает некоторую корневую фичу экосистемы, на которой всё строится. Это другой вес, другой информационный поток, и деньги, я думаю, тоже другие.

https://habrahabr.ru/company/jugru/blog/318842/

Почему… почему в каждой статье пишут про 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).

What Kotlin has that Scala does not
  • Smart casts

У Скалы есть Smart casts, только он не через if работает, а в сопоставлении с образцом.


value match {
  case str: String    => str.charAt(0)
  case int: Int       => int + 10
  case Some(int: Int) => int * 10
  case _ | None       => 0
}

Здравствуйте, могли бы рассказать как вы сохраняйте интероп с 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?

Information

Rating
Does not participate
Registered
Activity