phone

    • chevron_right

      Ignite Realtime Blog: Candy plugin for Openfire 2.2.0 Release 4 now available!

      news.movim.eu / PlanetJabber • 20 July, 2023

    The Ignite Realtime community is happy to announce a new release of the Openfire plugin for Candy.

    Candy is a third-party chat client . The Openfire plugin makes deploying it a one-click affair!

    This release is a maintenance release. It adds translations and updates dependencies on third-party libraries. More details are available in the changelog .

    Your instance of Openfire should automatically display the availability of the update in the next few hours. Alternatively, you can download the new release of the plugin at the candy plugin archive page .

    If you have any questions, please stop by our community forum or our live groupchat .

    For other release announcements and news follow us on Twitter and Mastodon .

    1 post - 1 participant

    Read full topic

    • wifi_tethering open_in_new

      This post is public

      discourse.igniterealtime.org /t/candy-plugin-for-openfire-2-2-0-release-4-now-available/93042

    • chevron_right

      Erlang Solutions: How IoT is Revolutionising Supply Chain Management

      news.movim.eu / PlanetJabber • 20 July, 2023 • 5 minutes

    As global supply chains continue to face significant disruptions, many businesses are turning to IoT to access greater visibility, reactivity, and streamlined operations.

    Unforeseen geopolitical conflicts, economic pressures due to inflation and severe climate change events have all contributed to an uncertain and costly supply chain environment for companies worldwide in 2023.

    To soften some of these impacts, and to work towards a more intelligent, forward-thinking form of supply chain management, industry leaders continue to turn to the benefits offered by the Internet of Things, or IoT.
    By embracing IoT, your company can transform a scattered supply chain into a fully connected network. In doing so, you’ll be able to access a wide range of benefits like increased visibility and superior inventory management, whilst preparing your company’s foundations for the future of distribution.

    The Future of Distribution: Recent IoT Impacts on the Supply Chain

    Whilst it certainly represents the future of supply chain logistics, IoT adoption across multiple different industries has already happened. A recent survey by PwC found that in 2023, 46% of companies have already invested in IoT to the point where it’s fully adopted by their supply chain, second only to cloud-based data platforms.

    Adoption to win future investment in supply chains.

    https://www.pwc.com/us/en/services/consulting/business-transformation/digital-supply-chain-survey/supply-chain-tech.html

    When predicting the future of supply chain technology back in 2021, Gartner also claimed that 50% of organisations will have invested in solutions that support AI and advanced analytical capabilities, like IoT, by 2024. They also predicted that by 2025, 50% of organisations will have employed a technology leadership role who will report directly to their chief supply chain officer (CSCO).

    The existence and normalisation of a CSCO role itself evidences that supply chain management now plays a vital role in c-suite level decision-making for many global businesses. By predicting that CSCOs will soon be naturally reinforced by a senior tech leader in half of all organisations, Gartner has also shown that effective supply chain management today must be intertwined with new technologies like IoT.

    To better understand the accuracy and importance of this prediction, it’s vital to explore the role IoT plays in supply chain management at present.

    The Role of IoT in Supply Chain Management

    IoT can be applied to practically every stage of a supply chain. In fact, due to its communicative nature, it’s advisable to apply IoT across an entire supply chain to embrace the benefits of a fully connected supply network.

    The first, and perhaps most well-known, role of IoT within the supply chain is its capacity to provide real-time location tracking. This is often used to allow customers to track packages en route to their destination, but internally this feature also ensures companies have total visibility over all stages of distribution.

    Increasing visibility means IoT can contribute to more accurate arrival time estimations. This also means businesses can quickly react to any unexpected issues that arise within their supply chain.

    In doing so, IoT can help companies achieve greater risk mitigation, whilst simultaneously providing insights that can support contingency planning. One unique example of a company benefitting from IoT risk mitigation — within both supply chain management as well as customer experience — is Volvo. They now use IoT to track vehicle delivery as well as to provide stolen vehicle tracking for customers.

    Monitoring can also extend to items in storage, which is particularly important for companies shipping perishable goods. In these instances, IoT allows for visibility and control over the environmental conditions of stored packages and equipment. Finally, individual shipments can also be located, speeding up the process of sourcing, identifying and managing goods when held in warehouses or distribution centres.

    Many leading companies have already embraced IoT storage monitoring; for example, Ericsson recently implemented digital asset-tracking solutions in their new 5G smart factories to track critical asset locations.

    The Benefits of Utilising IoT in Supply Chain Management

    The following represent a handful of the key benefits your company could access by investing in IoT across your supply chain.

    • New, Visible Opportunities

    Many of the roles of IoT listed above contribute towards increased visibility over your supply chain. This level of visibility doesn’t just improve resilience and streamline operations; it can also provide insights that reveal entirely new opportunities.

    These could include opening the door for automation, smart packaging that enables customers to interact directly with products, or unearthing potential improvements like route remapping that can further optimise your overall chain.

    • Improved Communication Internally and With Customers

    The data analysis capabilities offered by IoT allow your teams to better communicate with each other, as each team can access detailed information on the current nature of your supply chain.

    This extends to the communication you can offer customers, enhancing their overall customer experience thanks to clear delivery times, the ability to provide alternative arrangements and quick resolutions to problems or disruptions.

    • Meeting Regulations and Sustainability Requirements

    IoT can provide a digital footprint of your supply chain, which is easier to optimise and can ensure you provide accurate reporting to meet ever-changing regulations.

    Being able to optimise and streamline your supply chain can also mitigate unnecessary emissions, which can help your company work towards more sustainable operations. Gartner’s study found over half of today’s customers will only do business with companies who practice environmental and social sustainability, and the importance of engaging in sustainable supply chain management will only grow in importance in the coming years.

    • A Cost-Effective Solution

    Technology adoption, particularly of new or emerging technologies companywide, is often an expensive undertaking.
    However, IoT represents a proven solution and a relatively affordable technology to implement (with future innovations likely to lower costs further ), making it the ideal choice for budget-minded decision-makers.

    How to Implement and Scale Supply Chain IoT

    Effective IoT supply chain investment must be scalable, and accessing the above benefits demands that decision-makers solicit support from experts in the space.

    Optimising an entire chain requires a reliable, proven MQTT Messaging Engine like EMQ X .

    By using EMQ X, your business can connect over 50 million different devices, with the potential to handle tens of millions of concurrent clients at any one time. This makes EMQ X massively scalable, which is why it’s already the IoT supply chain management solution of choice for hundreds of leading companies worldwide.

    Our IoT Erlang Solutions specialists have worked closely with EMQ X, with over 20 years of experience building real-time distributed systems. In addition to consulting on projects across any stage, we also offer regular health checks, EMQ X support services and monitoring to ensure your system remains reliable.


    If you’d like to learn more about how to access Erlang Solutions supply chain optimisations through EMQ X, make sure to contact our team today .

    The post How IoT is Revolutionising Supply Chain Management appeared first on Erlang Solutions .

    • wifi_tethering open_in_new

      This post is public

      www.erlang-solutions.com /blog/how-iot-is-revolutionising-supply-chain-management/

    • chevron_right

      Isode: Icon-PEP 2.0 – New Capabilities

      news.movim.eu / PlanetJabber • 18 July, 2023

    Icon-PEP is used to enable the use of IP applications over HF networks. Using STANAG 5066 Link Layer as an interface.

    Listed below are the changes brought in with 2.0.

    Web Management

    A web interface is provided which includes:

    • Full configuration of Icon-PEP
    • TLS (HTTPS) access and configuration including bootstrap with self signed certificate and identity management.
    • Control interface to enable or disable Icon-PEP
    • Monitoring to include:
      • Access to all logging metrics
      • Monitoring GRE traffic with peered routers
      • Monitoring IP Client traffic to STANAG 5066
      • Monitoring DNS traffic
      • Monitoring TCP traffic with details of HTTP queries and responses

    Profiler Enhancement

    OAuth support added to control access to monitoring and configuration.

    NAT Mode

    A NAT (Network Address Translation) mode is introduced which supports Mobile Unit mobility for traffic initiated by Mobile Unit.   Inbound IP or SLEP (TCP) traffic will have address mapped so that traffic on shore side appears to come from the local node.  This avoids the need for complex IP routing to support traffic to Mobile Units not using fixed IP routing.

    Other Features

    • Product Activation, including control of the number of Units
    • Filtering (previously IP client only) extended to SLEP/TCP
    • wifi_tethering open_in_new

      This post is public

      www.isode.com /company/wordpress/icon-pep-2-0-new-capabilities/

    • chevron_right

      Isode: Cobalt 1.4 – New Capabilities

      news.movim.eu / PlanetJabber • 18 July, 2023 • 1 minute

    Cobalt proides a web interface for provisioning users and roles in an LDAP directory. It enables the easy deployment of XMPP, Email and Military Messaging systems.

    Listed below are the changes brought in with 1.4.

    HSM Support

    Cobalt is Isode’s tool for managing PKCS#11 Hardware Security Modules (HSM) which may be used to provide improved server security by protecting PKI private keys.

    • Cobalt provides a generic capability to initialize  HSMs and view keys
      • Multiple HSMs can be configured and one set to active
      • Tested with Nitrokey, Yubikey, SoftHSM and Gemalto networked HSM
    • Enables key pair generation and Certificate Signing Request (CSR) interaction with Certificate Authority (CA)
    • Support for S/MIME signing and encryption
      • User identities for email
      • Organization and Role identities for military messaging
    • Server identities that can be used for TLS with Isode servers

    Isode Servers

    A new tab for Isode servers is added that:

    • Enables HSM identities to be provisioned
    • Enables a password to be set, which is needed for Isode servers that bind to directory to obtain authorization, authentication and other information
    • Facilitates adding Isode servers to a special directory access control group, that enables passwords (usually SCRAM hashed) to be read, to enable SCRAM and other SASL mechanisms to be used by the application

    Profiler Enhancement

    • Extend the SIC rule so that multiple SICs or SIC patterns can be set in a single rule

    • wifi_tethering open_in_new

      This post is public

      www.isode.com /company/wordpress/cobalt-1-4-new-capabilities/

    • chevron_right

      Isode: Icon-Topo 2.0 – New Capabilities

      news.movim.eu / PlanetJabber • 17 July, 2023 • 1 minute

    Icon-Topo supports Mobile Unit (MU) mobility between HF Networks, enabling application communications over a wider area than can be achieved with a single ground station. It provides a way to schedule the movement from one HF network to another, ensuring that as an MU goes about its deployment the communications network is kept up and running.

    The below is the list of changes brought in with version 2.0:

    ACP 127 Support

    Mobile Units (MUs) can be configured as “ACP 127 only” with routing over M-Switch ACP 127 broadcast circuits.  ACP 127 MUs can be moved between broadcast on different HFAPs using Icon-Topo schedules.  When messages are routed between HFAPs following routing change,  ACP 127 will be used to transfer messages between HFAPs if an ACP 127 circuit is configured.  Otherwise the message will be protocol-converted to SMTP or X.400 (and converted back to ACP 127 on the new HFAP).

    This capability allows flexible MU movement between HFAPs.   Note that MU ACP 127 configuration must be done manually.

    XMPP Support

    Icon-Topo now supports configuration of M-Link XMPP routing for MU, HFAP and FAREP.  This requires M-Link 19.3 Edge (FAREP)  or M-Link 19.3 MU Gateway (HFAP and MU).  This provides full MU mobility for XMPP services.

    General

    Two important new features are provided:

    1. HTTPS (HTTP over TLS) access is provided for Icon-Topo configuration server.   Self signed certificate will be generated.  A standard certificate can be configured.
    2. Directory access using LDAP from configuration and update servers may be configured to use TLS
    3. M-Switch access from update server may be configured to use TLS.
    4. Isode Product Activation now controls both configuration and update servers.

    • wifi_tethering open_in_new

      This post is public

      www.isode.com /company/wordpress/icon-topo-2-0-new-capabilities/

    • chevron_right

      Isode: M-Guard 1.5 – New Capabilities

      news.movim.eu / PlanetJabber • 17 July, 2023 • 1 minute

    M-Guard is an XML guard that is used at a network boundary to control traffic. An M-Guard instance is an application level data diode, with traffic flowing in one direction only. Commonly, M-Guard instances will be deployed in pairs, one controlling flow in each direction. The following is a list of the new capabilties introduced in version 1.5.

    M-Guard Certificate Authority

    M-Guard uses X.509 certificates to verify peers. It does not use CRL checking or OCSP to check for certificate revocation as the network connections to do this would lead to an unacceptable security risk. This means that in the event of certificate compromise the whole PKI needs to be replaced. This essentially means that each M-Guard instance needs its own PKI.

    M-Guard product has added a product-specific certificate authority (CA) to manage certificates used to authenticate GCXP peers. This provides a convenient way to manage the PKI for each M-Guard deployment.

    The M-Guard CA functionality is provided in M-Guard Console.

    Guard Isolation Support

    Guard instances are now isolated from each other and other processes on the M-Guard Appliance. This is built on the FreeBSD “Jail” capability. It increases the protection of each guard instance.  Each guard now has independent IP addressing.

    System Integrity Verification

    The M-Guard Appliance system software now includes a manifest of system files with cryptographic hashes for each file. M-Guard Appliance verifies the current system against this manifest at boot and at regular intervals (hourly by default) to provide notice of any detected changes to the system files.

    M-Guard Console can be used to verify system integrity of an M-Guard Appliance against a separately distributed, signed manifest, which enables regular and more robust checking for changes to system files. Customers may implement additional checks against this signed manifest.

    Release Artifact Signatures and Signature Verification

    All M-Guard release artifacts are digitally signed. These include:

    • M-Guard Appliance full and update images;
    • M-Guard Appliance manifest, release information, and release notes;
    • M-Guard Console image;
    • M-Guard Console release information and release notes; and
    • M-Guard Admin Guide.

    M-Guard Console supports verification of release artifact signatures to ensure their integrity.

    • wifi_tethering open_in_new

      This post is public

      www.isode.com /company/wordpress/m-guard-1-5-new-capabilities/

    • chevron_right

      Erlang Solutions: Effortlessly Extract Data from Websites with Crawly YML

      news.movim.eu / PlanetJabber • 14 July, 2023 • 5 minutes

    The workflow

    So in our ideal world scenario, it should work in the following way:

    1. Pull Crawly Docker image from DockerHub.
    2. Create a simple configuration file.
    3. Start it!
    4. Create a spider via the YML interface.

    The detailed documentation and the example can be found on HexDocs here: https://hexdocs.pm/crawly/spiders_in_yml.html#content

    This article will follow all steps from scratch, so it’s self-containing. But if you have any questions, please don’t hesitate to refer to the original docs or to ping us on the Discussions board .

    The steps

    1. First of all, we will pull Crawly from DockerHub:

    docker pull oltarasenko/crawly:0.15.0

    2. We should re-use the same configuration as in our previous article as we need to get the same data as in our previous article. So let’s create a file called `crawly.config` with the same content as previously:

    [{crawly, [
        {closespider_itemcount, 100},
        {closespider_timeout, 5},
        {concurrent_requests_per_domain, 15},
    
        {middlewares, [
                'Elixir.Crawly.Middlewares.DomainFilter',
                'Elixir.Crawly.Middlewares.UniqueRequest',
                'Elixir.Crawly.Middlewares.RobotsTxt',
                {'Elixir.Crawly.Middlewares.UserAgent', [
                    {user_agents, [
                        <<"Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20100101 Firefox/42.0">>,
                        <<"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36">>
                        ]
                    }]
                }
            ]
        },
    
        {pipelines, [
                {'Elixir.Crawly.Pipelines.Validate', [{fields, [<<"title">>, <<"author">>, <<"publishing_date">>, <<"url">>, <<"article_body">>]}]},
                {'Elixir.Crawly.Pipelines.DuplicatesFilter', [{item_id, <<"title">>}]},
                {'Elixir.Crawly.Pipelines.JSONEncoder'},
                {'Elixir.Crawly.Pipelines.WriteToFile', [{folder, <<"/tmp">>}, {extension, <<"jl">>}]}
            ]
        }]
    }].
    [{crawly, [
        {closespider_itemcount, 100},
        {closespider_timeout, 5},
        {concurrent_requests_per_domain, 15},
    
        {middlewares, [
                'Elixir.Crawly.Middlewares.DomainFilter',
                'Elixir.Crawly.Middlewares.UniqueRequest',
                'Elixir.Crawly.Middlewares.RobotsTxt',
                {'Elixir.Crawly.Middlewares.UserAgent', [
                    {user_agents, [
                        <<"Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20100101 Firefox/42.0">>,
                        <<"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36">>
                        ]
                    }]
                }
            ]
        },
    
        {pipelines, [
                {'Elixir.Crawly.Pipelines.Validate', [{fields, [<<"title">>, <<"author">>, <<"publishing_date">>, <<"url">>, <<"article_body">>]}]},
                {'Elixir.Crawly.Pipelines.DuplicatesFilter', [{item_id, <<"title">>}]},
                {'Elixir.Crawly.Pipelines.JSONEncoder'},
                {'Elixir.Crawly.Pipelines.WriteToFile', [{folder, <<"/tmp">>}, {extension, <<"jl">>}]}
            ]
        }]
    }].
    

    3. Starting the container shall be done with the help of the following command:

    docker run --name yml_spiders_example \
     -it -p 4001:4001 \
     -v $(pwd)/crawly.config:/app/config/crawly.config \
     oltarasenko/crawly:0.15.0
    

    Once done, you will probably see the following debug messages in your console. That is a good sign, as it worked!

    Now you can open `localhost:4000` in your browser, and your journey starts here!

    4. Building a spider

    Once you click Create New Spider, you will see the following basic page allowing inputting your spider code:

    One may say that these interfaces are super simple a basic, as for something from 2023. It’s right. We’re backend developers, and we do what we can. So this allows for achieving needed results with minimal frontend efforts. If you have a passion for improving it or want to contribute in any other way — you are more than welcome to do so!

    Writing a spider

    So the interface above requires you to write a “right” YML. So you need to know what is expected. Let’s start with a basic example, add some explanations, and improve it later.

    I suggest starting by inputting the following YML there:

    name: ErlangSolutionsBlog
    base_url: "https://www.erlang-solutions.com"
    start_urls:
     - "https://www.erlang-solutions.com/blog/web-scraping-with-elixir/"
    fields:
     - name: title
       selector: "title"
    links_to_follow:
     - selector: "a"
       attribute: "href"

    Now if you click the Preview button, you shall see what spider is going to extract from your start urls:

    So, what you can see here is:

    The spider will extract only one field called title that equals to Erlang Solutions.” Besides that, your spider is going to follow these links after the start page:

    "https://www.erlang-solutions.com/", 
    "https://www.erlang-solutions.com#", 
    "https://www.erlang-solutions.com/consultancy/consulting/", 
    "https://www.erlang-solutions.com/consultancy/development/", 
    ....

    The YML format

    • name A string representing the name of the scraper.
    • base_url A string representing the base URL of the website being scraped. The value must be a valid URI.
    • start_urls An array of strings representing the URLs to start scraping from. Each URL must be a valid URI.
    • links_to_follow An array of objects representing the links to follow when scraping a page. Each object must have the following properties:
      selector A string representing the CSS selector for the links to follow.
      attribute A string representing the attribute of the link element that contains the URL to follow.
    • fields : An array of objects representing the fields to scrape from each page. Each object must have the following properties:
      name A string representing the name of the field
      selector A string representing the CSS selector for the field to scrape.

    Finishing

    As in the original article, we plan to extract the following fields:

    title
    author
    publishing_date
    url
    article_body

    Expected selectors are copied from the previous article and can be found using Google Chrome’s inspect & copy approach!

    fields:
     - name: title
       selector: ".page-title-sm"
     - name: article_body
       selector: ".default-content"
     - name: author
       selector: ".post-info__author"
     - name: publishing_date
       selector: ".header-inner .post-info .post-info__item span"
    

    By now, you have noticed that the URL field is not added here. That’s because the URL is automatically added to every item by Crawly

    Now if you hit preview again, you should see the full scraped item:

    Now, if you click save, running the full spider and seeing the actual results will be possible.

    Conclusion

    We hope you like our work! We hope it will help reduce the need to write spider code or maybe help engage non-Elixir people who can play with it without coding!

    Please don’t be too critical of the product, as everything in this world has bugs, and we plan to improve it over time (as we already did during the last 4+ years). If you have ideas and improvement suggestions, please drop us a message so we can help !

    The post Effortlessly Extract Data from Websites with Crawly YML appeared first on Erlang Solutions .

    • wifi_tethering open_in_new

      This post is public

      www.erlang-solutions.com /blog/effortlessly-extract-data-from-websites-with-crawly-yml/

    • chevron_right

      Erlang Solutions: Optimización para lograr concurrencia: comparación y contraste de las máquinas virtuales BEAM y JVM

      news.movim.eu / PlanetJabber • 7 July, 2023 • 17 minutes

    En esta nota exploraremos los aspectos internos de la máquina virtual BEAM o VM por sus siglas en inglés (Virtual Machine). Y haremos una comparación con la máquina virtual de Java, la JVM.

    El éxito de cualquier lenguaje de programación en el ecosistema Erlang puede ser repartido a tres componentes estrechamente acoplados:

    1. la semántica del lenguaje de programación Erlang, que es la base sobre la cual otros lenguajes están implementados
    2. las bibliotecas OTP y middleware usados para construir arquitecturas escalabels y sistemas concurrentes y resilientes y
    3. la máquina virtual BEAM, estrechamente acoplada a la semántica del lenguaje y OPT.

    Toma cualquiera de estos componentes por si solo y tendras a un potencial ganador. Pero si consideras a los tres juntos, tendrás a un ganador indiscutible para el desarrollo de sistemas escalables, resilientes y soft-real time. Citando a Joe Armstrong:

    “Puedes copiar las bibliotecas de Erlang, pero si no corren en la BEAM, no puedes emular la semánticas”

    Esta idea es reforzada por la primera regla de programación de Robert Virding, que establece que “Cualquier programa concurrente escrito en otro lenguaje y que sea lo suficientemente complejo, contiene una implementación ad hoc, específicada informalmente, lenta y plagada de errores, de la mitad de Erlang.”

    En esta nota vamos a explorar los aspectos internos de la máquina virtual BEAM. Compararemos algunos de ellos con la JVM, señalando las razones por las que deberías poner especial atención en ellos. Por mucho tiempo estos componentes han sido tratados como una caja negra, y confiamos ciegamente en ellos sin entender que hay detrás. Es tiempo de cambiar eso!

    Aspectos relevantes de la BEAM

    Erlang y la máquina virtual BEAM fueron inventados para tener una herramienta que resolviera un problema específico. Fueron desarrollados por Ericsson para ayudar a implementar la infraestructura de un sistema de telecomunicaciones que manejara redes fijas y móviles. Esta infraestructura por naturaleza es altamente concurrente y escalable. Tiene que funcionar en tiempo real y posiblemente nunca presentar fallas. No queremos que nuestra llamada de Hangouts con nuestra abuela de pronto terminé por un error, o estar en un juego en línea como Fortnite y que se interrumpa porque le tienen que hacer actualizaciones. La máquina virtual BEAM está optimizada para resolver muchos de estos retos, gracias a características que funcionan con un modelo de programación concurrente predecible.

    La receta secreta son los procesos Erlang, que son ligeros, no comparten memoria y son administrados por schedulers capaces de manejar millones a través de múltiples procesadores. Utiliza un recolector de basura que corre en un proceso por si mismo y está altamente optimizado para reducir el impacto en otros procesos. Como resultado de esto, el recolector de basura no afecta las propiedades globales en tiempo real del sistema. La BEAM es también la única máquina virtual utilizada ampliamente a escala con un modelo de distribución hecho a la medida, que permite a un programa ejecutarse en múltiples máquinas de manera transparente.

    Aspectos relevantes de la JVM

    La máquina virtual de Java o JVM por sus siglas en inglés (Java Virtual Machine) fue desarrollada por Sun Microsystem en un intento de proveer un plataforma en la que “ escribes código una vez ” y corre en donde sea. Crearon un lenguaje orientado a objetos, similar a C++ pero que fuera memory-safe ya que la detección de errores en tiempo de ejecución revisa los límites de los arreglos y las desreferencias de punteros. El ecosistema JVM se volvió extremamente popular en la era del Internet, convirtiéndose un estándar de-facto para el desarrollo de aplicaciones de servidores empresariales. El amplio rango de aplicabilidad fue posible gracias a una máquina virtual que se adapta a muchos  casos de uso y a un impresionante conjunto de bibliotecas que se adaptan al desarrollo empresarial.

    La JVM fue diseñada pensando en eficiencia. La mayoría de sus conceptos son una abstracción de características encontradas en populares sistemas operativos, como el modelo de hilos, similar al manejo de hilos o threads del sistema operativo. La JVM es altamente personalizable, incluyendo el recolector de basura y class loaders. Algunas implementaciones del recolector de basura de última generación brindan características ajustables que se adaptan a un modelo de programación basado en memoria compartida.

    La JVM le permite modificar el código mientras se ejecuta el programa. Y, un compilador JIT permite que el código de bytes se compile en el código de máquina nativo con la intención de acelerar partes de la aplicación.

    La concurrencia en el mundo de Java se relaciona principalmente con la ejecución de aplicaciones en subprocesos paralelos, lo que garantiza que sean rápidos. La programación con primitivas de concurrencia es una tarea difícil debido a los desafíos creados por su modelo de memoria compartida. Para superar estas dificultades, existen intentos de simplificar y unificar los modelos de programación concurrentes, como el marco Akka, que es el intento más exitoso.

    Concurrencia y Paralelismo

    Cuando hablamos de ejecución de código paralela, nos referismo a que partes del código se ejecutan al mismo tiempo en múltiples procesadores, o computadoras, mientras que programación concurrente se refiere al manejo de eventos que llegan de forma independiente. Una ejecución concurrente se puede simular en hardware de un solo subproceso, mientras que la ejecución en paralelo no. Aunque esta distinción puede parecer pedante, la diferencia da como resultado problemas por resolver con enfoques muy diferentes. Piense en muchos cocineros que preparan un plato de pasta carbonara. En el enfoque paralelo, las tareas se dividen entre la cantidad de cocineros disponibles, y una sola parte se completaría tan rápido como les tome a estos cocineros completar sus tareas específicas. En un mundo concurrente, obtendría una porción para cada cocinero, donde cada cocinero hace todas las tareas.

    Utilice el paralelismo para velocidad y la concurrencia para escalabilidad.

    La ejecución en paralelo intenta resolver una descomposición óptima del problema en partes independientes entre sí. Hervir el agua, sacar la pasta, mezclar el huevo, freír el jamón, rallar el queso. Los datos compartidos (o en nuestro ejemplo, el plato a servir) se manejan mediante bloqueos, mutexes y otras técnicas que garantizan la correcta ejecución. Otra forma de ver esto es que los datos (o ingredientes) están presentes y queremos utilizar tantos recursos de CPU paralelos como sea posible para terminar el trabajo lo más rápido que se pueda.

    La programación concurrente, por otro lado, trata con muchos eventos que llegan al sistema en diferentes momentos y trata de procesarlos todos dentro de un tiempo razonable. En arquitecturas multi-procesadores o distribuidas, parte de la ejecución se lleva a cabo en paralelo, pero esto no es un requisito. Otra forma de verlo es que el mismo cocinero hierve el agua, saca la pasta, mezcla los huevos, etc., siguiendo un algoritmo secuencial que es siempre el mismo. Lo que cambia entre procesos (o cocciones) son los datos (o ingredientes) en los que trabajar, que existen en múltiples instancias.

    La JVM está diseñada para el paralelismo, la BEAM para la concurrencia. Son dos problemas intrínsecamente diferentes, que requieren soluciones diferentes.

    La BEAM y la concurrencia

    La BEAM proporciona procesos ligeros para dar contexto al código en ejecución. Estos procesos, también llamados actores, no comparten memoria, sino que se comunican a través del paso de mensajes, copiando datos de un proceso a otro. El paso de mensajes es una característica que la máquina virtual implementa a través de buzones de correo que tienen los procesos individualmente. El paso de mensajes es una operación no-bloqueante, lo que significa que enviar un mensaje de un proceso a otro otro es casi instantáneo y la ejecución del remitente no se bloquea. Los mensajes enviados tienen la forma de datos inmutables, copiados de la pila del proceso remitente al buzón del proceso receptor. Esto se logra sin necesidad de bloqueos y mutexes entre los procesos, el único bloqueo en el buzón o mailbox es en caso de que varios procesos envíen un mensaje al mismo destinatario en paralelo.

    Los datos inmutables y el paso de mensajes permiten al programador escribir procesos que funcionan de forma independiente y que se centran en la funcionalidad en lugar del manejo de bajo nivel de la memoria y la programación de tareas. Este diseño simple no solo funciona en un solo proceso, sino también en múltiples threads en una máquina local que se ejecuta en la misma VM y utilizando la distribución integrada, a través de la red con un grupo de VMs y máquinas. Si los mensajes son inmutables entre procesos, se pueden enviar a otro subproceso (o máquina) sin bloqueos, escalando casi linealmente en arquitecturas distribuidas de varios procesadores. Los procesos se abordan de la misma manera en una VM local que en un clúster de VM, el envío de mensajes funciona de manera transparente, independientemente de la ubicación del proceso de recepción.

    Los procesos no comparten memoria, permitiendo replicar los datos para mayor resiliencia, y distribuirlos para escalar. Esto significa que se pueden tener dos instancias del mismo proceso en dos máquinas separadas, compartiendo una actualización de estado entre ellas. Si una máquina falla entonces la otra tiene una copia de los datos y puede continuar manejando la solicitud, haciendo el sistema tolerante a fallas. Si ambas máquinas están operando, ambos procesos pueden manejar peticiones, brindando así escalabilidad. La BEAM proporcional primitivas altamente optmizadas para que todo esto funcione sin problemas, mientras que OTP (la biblioteca estándar ) proporciona las construcciones de nivel superior para facilitar la vida de los programadores.

    Akka hace un gran trabajo al replicar las construcciones de nivel superior, pero esta de alguna manera limitado por la falta de primitivas proporcionadas por la JVm, permitiendo estar altamente optimizada para concurrencia. Si bien las primitivas de la JVM permiten una gama más amplia de casos de uso, hacen el desarrollo de sistemas distribuidos más complicado al no tener características por default para la comunicación y a menudo se basan en un modelo de memoria compartida. Por ejemplo, ¿en qué parte de un sistema distribuido coloca memoria compartida? ¿Y cuál es el costo de acceder a ella?

    Scheduler

    Mencionamos que una de las características más fuertes de la BEAM es la capacidad de dividir un programa en procesos pequeños y livianos. La gestión de estos procesos es tarea del scheduler . A diferencia de la JVM, que asigna sus subprocesos a threads del sistema operativo y deja que este los administre, la BEAM viene con su propio scheduler o administrador.

    El scheduler inicia por default un hilo del sistema operativo ( OS thread ) por cada procesador de la máquina y optimiza la carga entre ellos. Cada proceso consiste en código que será ejecutado y un estado que cambia con el tiempo. El scheduler escoge el primer proceso en la cola de ejecución que esté listo para correr, le asigna una cierta cantidad de reducciones para ejecutarse, donde cada reducción es el equivalente aproximado a un comando. Una vez que el proceso se ha quedado sin reducciones, sera bloqueado por I/O, y se queda esperando un mensaje o que pueda completar su ejecución, el scheduler escoge el siguiente proceso en la cola y lo despacha. Esta técnica es llamada preventiva.

    Mencionamos el framework Akka varias veces, ya que su más grande desventaja es la necesidad de anotar el código con scheduling points, ya que la administración no está dada a nivel de la JVM. Al quitar el control de las manos del programador, las propiedades en tiempo real son preservadas y garantizadas, ya que no hay riesgo de que accidentalmente se provoque inanición del proceso.

    Los procesos pueden ser esparcidos a todos los hilos disponiblews del scheduler y maximizar el uso de CPU. Hay muchas maneras de modificar el scheduler pero es raro y solo será requerido en ciertos casos límite, ya que las opciones predeterminadas cubren la mayoría de los patrones de uso.

    Hay un tema sensible que aparece con frequencia con respecto a los schedulers: como manejar funciones implementadas nativamente, o NIFs por sus siglas en inglés (Natively Implemented Functions). Un NIF es un fragmento de código escrito en C, compilado como una biblioteca y ejecutado en el mismo espacio de memoria que la BEAM para mayor velocidad. El problema con los NIF es que no son preventivos y pueden afectar a los schedulers. En versiones recientes de la BEAM, se agregó una nueva función, dirty schedulers , para brindar un mejor control de los NIF. Los dirty schedulers son schedulers separados que se ejecutan en diferentes subprocesos para minimizar la interrupción que puede causar un NIF en un sistema. La palabra dirty se refiere a la naturaleza del código que ejecutan estos schedulers.

    Recolector de Basura

    Los lenguajes de programación modernos utilizan un recolector de basura para el manejo de memoria. Los lenguajes en la BEAM no son la excepción. Confiar en la máquina virtual para manejar los recursos y administrar la memoria es muy útil cuando desea escribir código concurrente de alto nivel, ya que simplifica la tarea. La implementación subyacente del recolector de basura es bastante sencilla y eficiente, gracias al modelo de memoria basado en el estado inmutable. Los datos se copian, no se modifican y el hecho de que los procesos no compartan memoria elimina las interdependencias de los procesos que por consiguiente, no necesitan ser administradas.

    Otra característica del recolecto de basura de la BEAM es que solamente se ejecuta cuando es necesario, en un proceso por si solo, sin afectar otros procesos esperando en la cola de ejecución. Por lo tanto, el recolector de basura en Erlang no detine el mundo. Evita picos de latencia en el procesamiento, porque la máquina virtual nunca se detiene como un todo, solo se detienen procesos específicos, y nunca todos al mismo tiempo. En la práctica, es solo parte de lo que hace un proceso y se trata como otra reducción. El recolector de basura suspende el proceso por un intervalo muy corto, hablamos de microsegundos. Como resultado, habrá muchas ráfagas pequeñas, que se activarán solo cuando el proceso necesite más memoria. Un solo proceso generalmente no tiene asignadas grandes cantidades de memoria y, a menudo, es de corta duración, lo que reduce aún más el impacto al liberar inmediatamente toda su memoria. Una característica de la JVM es la capacidad de intercambiar recolectores de basura, así que al usar un recolector comercial, también es posible lograr un recolector continuo o non-stopping en la JVM.

    Las características del recolector de basura son discutidas en este excelente post por Lukas Larsson. Hay muchos detalles intrincados, pero está optimizada para manejar datos inmutables de manera eficiente, dividiendo los datos entre la pila y el heap para cada proceso. El mejor enfoque es hacer la mayor parte del trabajo en procesos de corta duración.

    Una pregunta que surge a menudo sobre este tema es cuánta memoria usa la BEAM. Si indgamos un poco, la máquina virtual asigna grandes porciones de memoria y utiliza allocators personalizados para almacenar los datos de manera eficiente y minimizar la sobrecarga de las llamadas al sistema. Esto tiene dos efectos visibles:

    1) La memoria utilizada disminuye gradualmente después de que no se necesita espacio

    2) La reasignación de grandes cantidades de datos podría significar duplicar la memoria de trabajo actual.

    El primer efecto puede, si es realmente necesario, mitigarse ajustando las estrategias del allocator . El segundo es fácil de monitorear y planificar si tiene visibilidad de los diferentes tipos de uso de la memoria. (Una de esas herramientas de monitoreo que proporciona métricas del sistema listas para usar es WombatOAM ).

    Hot Code Loading

    La carga de código en caliente o  hot code loading es probablemente la característica única más citada de BEAM. La carga de código en caliente significa que la lógica de la aplicación se puede actualizar cambiando el código ejecutable en el sistema mientras se conserva el estado del proceso interno. Esto se logra reemplazando los archivos BEAM cargados e instruyendo a la máquina virtual para que reemplace las referencias del código en los procesos en ejecución.

    Es una característica fundamental para garantizar que no habrá tiempo de inactividad en una infraestructura de telecomunicaciones, donde se utilizó hardware redundante para manejar los picos. Hoy en día, en la era de la contenerización, también se utilizan otras técnicas hacer actualizaciones a un sistema en producción. Aquellos que nunca lo han usado o requerido, lo descartan como una característica no tan importante, pero no hay que subestimarla en el flujo de trabajo de desarrollo. Los desarrolladores pueden iterar más rápido reemplazando parte de su código sin tener que reiniciar el sistema para probarlo. Incluso si la aplicación no está diseñada para ser actualizable en producción, esto puede reducir el tiempo necesario para volver a compilar y re-lanzar el sistema.

    Cuando no usar la BEAM

    Se trata en gran medida de saber escoger la herramienta adecuada para el trabajo.

    ¿Necesita un sistema que sea extremadamente rápido, pero no le preocupa la concurrencia? ¿Quiere manejar algunos eventos en paralelo de manera rápida? ¿Necesita procesar números para gráficos, IA o análisis? Siga la ruta de C++, Python o Java. La infraestructura de telecomunicaciones no necesita operaciones rápidas con floats , por lo que la velocidad nunca fue una prioridad. Con el tipado dinámico, que tiene que hacer todas las comprobaciones de tipo en tiempo de ejecución, las optimizaciones en el compilador no son tan triviales. Por lo tanto, es mejor dejar el procesamiento de números en manos de la JVM, Go u otros lenguajes que compilan de forma nativa. No es de sorprender que las operaciones de coma flotante en Erjang, la versión de Erlang que se ejecuta en la JVM, sean un 5000 % más rápidas que en la BEAM. Por otro lado, en donde hemos visto realmente brillar a la BEAM es en el uso de su concurrencia para orquestar el procesamiento de números, subcontratando el análisis a C, Julia, Python o Rust. Haces el mapa fuera de la BEAM y la reducción dentro de ella.

    El mantra siempre ha sido lo suficientemente rápido. Los humanos tardan unos cientos de milisegundos en percibir un estímulo (un evento) y procesarlo en su cerebro, lo que significa que el tiempo de respuesta de micro o nano segundos no es necesario para muchas aplicaciones. Tampoco es recomendable usar la BEAM para microcontroladores, ya que consume demasiados recursos. Pero para los sistemas integrados con un poco más de potencia de procesamiento, donde los multi-procesadores se están convirtiendo en la norma, se necesita concurrencia y la BEAM brilla ahí. En los años 90, estábamos implementando conmutadores de telefonía que manejaban decenas de miles de suscriptores que se ejecutaban en placas integradas con 16 MB de memoria. ¿Cuánta memoria tiene un RaspberryPi en estos días?

    Y por último, hard-real-time . Probablemente no quiera que la BEAM administre su sistema de control de bolsas de aire. Necesita garantías sólidas, un sistema operativo en tiempo real y un lenguaje sin recolección de basura ni excepciones. Una implementación de una máquina virtual de Erlang que se ejecuta en el metal, como GRiSP, le brindará garantías similares.

    Conclusión

    Utilice la herramienta adecuada para el trabajo.

    Si está escribiendo un sistema soft-real time que tiene que escalar fuera de la caja y nunca fallar, y hacerlo sin la molestia de tener que reinventar la rueda, definitivamente la BEAM es la tecnología que está buscando. Para muchos, funciona como una caja negra. No saber cómo funciona sería como conducir un Ferrari y no ser capaz de lograr un rendimiento óptimo o no entender de qué parte del motor proviene ese extraño sonido. Es por eso que es importante aprender más sobre la BEAM, comprender su funcionamiento interno y estar listo para ajustarlo. Para aquellos que han usado Erlang y Elixir con ira, hemos lanzado un curso dirigido por un instructor de un día que desmitificará y explicará mucho de lo que vio mientras lo prepara para manejar la concurrencia masiva a escala. El curso está disponible a través de nuestra nueva capacitación remota dirigida por un instructor; obtenga más información aquí . También recomendamos el libro The BEAM de Erik Stenman y BEAM Wisdoms , una colección de artículos de Dmytro Lytovchenko.

    The post Optimización para lograr concurrencia: comparación y contraste de las máquinas virtuales BEAM y JVM appeared first on Erlang Solutions .

    • wifi_tethering open_in_new

      This post is public

      www.erlang-solutions.com /blog/optimizacion-para-lograr-concurrencia-comparacion-y-contraste-de-las-maquinas-virtuales-beam-y-jvm-2/

    • chevron_right

      Paul Schaub: Creating an OpenPGP Web-of-Trust Implementation – Knitting a Net

      news.movim.eu / PlanetJabber • 6 July, 2023 • 4 minutes

    There are two obvious operations your OpenPGP implementation needs to be capable of performing if you want to build a Web-of-Trust. First you need to be able to sign other users public keys (certificates), and second, you need to be able to verify those certifications.

    The first is certainly the easier of the two tasks. In order to sign another users certificate, you simply take your own secret key, decide which binding (a tuple of a certificate and a user-id) you want to create a certification for and then simply generate a signature over the user-id and the primary key of the certificate according to the standard.

    Now your signature can be distributed, e.g. by mailing it to the user, or by publishing it to a key server. This task is simple, because all the ingredients are well known. You know which key to use to create the signature, you know which user-id you want to certify and you know which key to bind the user-id to. So signing a certificate is more or less straight forward application of the cryptography defined in the specification.

    But the task of verifying, whether there is a valid signature by one certificate over another is far more complex of a task. Here, the specification is deliberately vague. Some time ago I wrote an article, describing why signature verification in OpenPGP is hard , and I still stand to my points.

    Authentication of a certificate is the task of figuring out how confident you can be that a key that claims to belong to “Alice <alice@example.org>” really was issued by Alice and not by an imposter, in other words you need to proof the authenticity of the binding. To accomplish this task, the Web-of-Trust is scanned for paths that lead from a root of trust (think e.g. a CA or your own certificate) to the binding in question.

    Building a Web-of-Trust implementation can be divided in a number of steps which luckily for us stand independent from another:

    1. Ingest the set of certificates
    2. Verify certifications made on those certificates
    3. Build a flow network from the certificates and certifications
    4. Perform queries on the network to find paths from or to a certain binding
    5. Interpret the resulting path(s) to infer authenticity of said binding

    In the first step we simply want to create an index of all available certificates, such that in later steps we are able to have random access on any certificate via its fingerprint(s) or key-ID(s).

    The second step is to go through each certificate one-by-one and attempt to verify third-party certifications made over its primary key or user-ids. Here, the index built in the previous step comes in handy acquire the issuer certificate to perform the signature verification. In this step, we index the certifications we made and keep them available for the next step. Once we successfully performed all signature verifications, the OpenPGP-portion of the task is done.

    In step three, we form a flow network from the results of the previous steps. Certificates themselves form the nodes of the network, while each signature represents an edge between the issuer- and target certificate. There can be more than one edge between two certificates.

    Step 4 and 5 are the technically most complicated steps, so I will not go into too much detail in this post. For now, I will instead first try to explain the abstract picture of the Web-of-Trust I have in my head:

    I imagine the Web-of-Trust as an old, half-rotten fishing net (bear with me); There are knobbly knots, which may or may not be connected to neighboring knots through yarn of different thickness. Some knots are well-connected with others, as ye olde fisherman did some repair work on the net, while other knots or even whole sections of the net have no intact connections left to the rest. Many connections rotted away as the yarn past its expiration date.

    When we now attempt to pick up the net by lifting one of the knots into the air, all those knots that are connected either directly or indirectly will also lift up, while disconnected knots or sections will fall to the ground. If we put some weight on the net, some of the brittle connections may even break, depending on how much weight we apply. Others might hold because a knot has multiple connections that share the load.

    In this analogy, each knot is a node (OpenPGP certificate), with yarn connections being the certifications. Different thickness of the yarn means different trust-amounts. The knot(s) we chose to pick the net up from are the trust roots. Each knot that lifts up from the ground we can authenticate. The weight we apply to the net can be seen as the amount of trust we require. If we aren’t able to accumulate enough trust-amount for a path, the knot rips off the fishing net, meaning it cannot be authenticated to a sufficient degree.

    This analogy is of course not perfect at all. First off, edges in the Web-of-Trust are directed, meaning you can follow the edge in one direction, but not necessarily in the other. Furthermore, the Web-of-Trust has some more advanced attributes that can be put into a certification to give it even more meaning. For example, a trust signature not only has a numeric trust-amount, but also a depth, which limits the number of “hops” you can make after passing over the edge. Certifications can also include regular expressions, limiting to which certificates you can hop next.

    Still, to get an initial, rough understanding of the WoT, I find the fishing net analogy quite suitable. In a later post I might go into more detail on steps 4 and 5.

    • wifi_tethering open_in_new

      This post is public

      blog.jabberhead.tk /2023/07/06/creating-an-openpgp-web-of-trust-implementation-knitting-a-net/