<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Frank Delporte on Medium]]></title>
        <description><![CDATA[Stories by Frank Delporte on Medium]]></description>
        <link>https://medium.com/@frankdelporte?source=rss-a6ee926d3fc8------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*t8IEF1wA7mXNlyktOM6zqw.jpeg</url>
            <title>Stories by Frank Delporte on Medium</title>
            <link>https://medium.com/@frankdelporte?source=rss-a6ee926d3fc8------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 01:39:54 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@frankdelporte/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Video series “JavaFX In Action”, Part 2]]></title>
            <link>https://medium.com/javarevisited/video-series-javafx-in-action-part-2-bbd854a80943?source=rss-a6ee926d3fc8------2</link>
            <guid isPermaLink="false">https://medium.com/p/bbd854a80943</guid>
            <category><![CDATA[javafx]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[user-interface]]></category>
            <dc:creator><![CDATA[Frank Delporte]]></dc:creator>
            <pubDate>Fri, 22 Nov 2024 14:31:12 GMT</pubDate>
            <atom:updated>2024-12-21T10:39:10.162Z</atom:updated>
            <content:encoded><![CDATA[<p>In <a href="https://foojay.io/today/new-video-series-javafx-in-action-part-1/">July, we published the first part, which included four interviews</a> with Pedro Duque Vieira, Daniel Zimmermann, Christopher Schnick, and Robert Ladstätter.</p><p>In this part, we have four new interviews for you! Learn more about JavaFX combined with Scala, Swing, React, trains, scientific research, banking, and more…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8M00ZldelGgsP_Nw-NFq0w.png" /></figure><h3>Maciej Gorywoda about FxCalculator</h3><p><a href="https://www.linkedin.com/in/mgorywoda/">Maciej Gorywoda</a> is the product marketing manager for the IntelliJ Scala team at JetBrains. As a Scala Ambassador, he teaches Scala and makes its community more beginner-friendly. He is also self-publishing a fantasy novel.</p><p>FxCalculator is a calculator for your Android phone. It’s got all the usual buttons with numbers and operators, and parentheses, as well as buttons for storing the partial results of your calculations in the memory. It also has an advanced editor mode, under the “Fx” button.</p><p>In this mode, you can write an expression with your virtual keyboard as if you were writing simple programming code. You can use variables and functions, combine them, and write custom ones. They’re stored on the phone so they can be actually useful to you more than once.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2F93OozqMTqJQ%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3D93OozqMTqJQ&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2F93OozqMTqJQ%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/8b0dedefd5b291ffe72a7e1f74361ec9/href">https://medium.com/media/8b0dedefd5b291ffe72a7e1f74361ec9/href</a></iframe><p>More info in <a href="https://webtechie.be/post/2024-09-17-jfxinaction-maciej-gorywoda/">this blog post</a>.</p><h3>Ramiro Domínguez Ayub about the Televic Generic Update Tool</h3><p><a href="https://www.linkedin.com/in/rayub143/">Ramiro Domínguez Ayub</a> is a Java developer with a lot of experience in Java backend development. His roots are in Cuba, but after living in Spain and visiting Bruges a few times, he permanently moved to Belgium. Since then, he has joined Televic Rail, working on passenger information systems for trains. When he joined Televic, he started using JavaFX to develop the Televic Generic Update Tool (TGUT).</p><p>This tool is used internally at Televic Rail by the R&amp;D, Quality, and production teams to test devices, check installed hardware en software in a train system, perform multiple simultaneous updates, etc. Based on an XML configuration file, the available devices and software packages get visualized for each project so it becomes impossible to apply wrong updates to devices.</p><p>The same tool and configuration files are used by the end-customer to update and maintain the Televic devices (speakers, amplifiers, passenger emergency panels, LED displays, TFT screens, servers,…) which are installed in a train.</p><p>Thanks to the thread handling in the Java backend of the application, it’s possible to perform a lot of those updates at the same time and visualize the progress in the JavaFX UI. This way updating e.g. 30 TFT screens at the same time becomes a quick job that’s fully managed by TGUT.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2F1gvKCS35ono%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3D1gvKCS35ono&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2F1gvKCS35ono%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/3e4d8d30fd6ebd6ba09a818336428cbd/href">https://medium.com/media/3e4d8d30fd6ebd6ba09a818336428cbd/href</a></iframe><p>More info in <a href="https://webtechie.be/post/2024-09-24-jfxinaction-ramiro-dominguez-ayubat/">this blog post</a>.</p><h3>Christoph Schwentker about JabRef</h3><p><a href="https://www.linkedin.com/in/christoph-schwentker-723656247/">Christoph Schwentker</a> is a (Kotlin) software developer at <a href="https://www.silab.de/">System Integration Laboratory GmbH (SIL) in Germany</a>. He is one of the main maintainers of the JabRef project.</p><p>JabRef was founded in 2003 and has since been used by many students and researchers. Its mission is to advance knowledge and improve scientific research. JabRef values open access to information and believes modern science can be built on an open institutional structure.</p><p>JabRef is developed as free, open-source software and saves your data in a simple text-based file format with no vendor lock-in.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2F-ddFxwh2U6E%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3D-ddFxwh2U6E&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2F-ddFxwh2U6E%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/d98dcc7b7391c8d7f4051b0cd9766cf9/href">https://medium.com/media/d98dcc7b7391c8d7f4051b0cd9766cf9/href</a></iframe><p>More info in <a href="https://webtechie.be/post/2024-10-01-jfxinaction-christoph-schwentker/">this blog post</a>.</p><h3>Ulas Ergin: How JavaFX helps to migrate from Swing to React UIs, all combined in one Java app</h3><p>Ulas Ergin has over 25 years of experience on large-scale enterprise systems in the banking sector, including core-banking migration, cloud transformation, and digitalization projects. He has led several teams within different domains. Currently, he manages a multicultural department in the Netherlands, Ukraine, and Turkey.</p><p>At <a href="https://www.crediteuropebank.com/">Credit Europe Bank</a> two tools are used, which are created with JavaFX.</p><p>The first one is an internal tool used by the developer team to define and setup certain procedures which are used within the applications and for their deployment. This tool is fully created in JavaFX, and was at the same time a research project to gain confidence in the power of Java and JavaFX to build a user interface application.</p><p>Based on the knowledge gained from the development of the developer tool, the decision was made to use JavaFX as the foundation to migrate an old application. This resulted in a new internal tool, used by the banking team and in the call centers. The screens of the old Swing application are integrated into this new tool, and are gradually transformed into React views.</p><p>JavaFX components bind everything together and provide the main layout, menus, login screens, etc. The React views are integrated into this application with <a href="https://teamdev.com/jxbrowser/">JxBrowser</a>, a Chromium web browser that is fully integrated as a JavaFX component. For the call center team, the call manager was also integrated in this app, so they have all their tools available in one screen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8M00ZldelGgsP_Nw-NFq0w.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8M00ZldelGgsP_Nw-NFq0w.png" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FdjbC7zWc-2w%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DdjbC7zWc-2w&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FdjbC7zWc-2w%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/bf4b725b766b7c6a52b7f2836ccd53b2/href">https://medium.com/media/bf4b725b766b7c6a52b7f2836ccd53b2/href</a></iframe><p>More info in <a href="https://webtechie.be/post/2024-10-22-jfxinaction-ulas-ergin/">this blog post</a>.</p><p><em>Originally published at </em><a href="https://foojay.io/today/video-series-javafx-in-action-part-2/"><em>https://foojay.io</em></a><em> on November 22, 2024.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bbd854a80943" width="1" height="1" alt=""><hr><p><a href="https://medium.com/javarevisited/video-series-javafx-in-action-part-2-bbd854a80943">Video series “JavaFX In Action”, Part 2</a> was originally published in <a href="https://medium.com/javarevisited">Javarevisited</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New video series “JavaFX In Action”, Part 1]]></title>
            <link>https://medium.com/javarevisited/new-video-series-javafx-in-action-part-1-7f8d0f0186e2?source=rss-a6ee926d3fc8------2</link>
            <guid isPermaLink="false">https://medium.com/p/7f8d0f0186e2</guid>
            <category><![CDATA[javafx]]></category>
            <category><![CDATA[user-interface]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[java]]></category>
            <dc:creator><![CDATA[Frank Delporte]]></dc:creator>
            <pubDate>Tue, 16 Jul 2024 07:36:19 GMT</pubDate>
            <atom:updated>2024-07-17T15:40:04.058Z</atom:updated>
            <content:encoded><![CDATA[<p>JavaFX is a powerful user interface framework, often overlooked in the world of desktop applications development. With this new series of video interviews, I want to take you behind-the-scenes of some applications built using JavaFX.</p><p>JavaFX combines the best features of a modern user interface toolkit with the unparalleled strength of the Java platform. This approach enables you to perform heavy “background tasks”, like processing large amounts of data, while still providing a responsive user interface.</p><p>Numerous professional developers and software companies worldwide are building applications with Java and JavaFX, and in this video series I want to show you these applications and how they are used and developed. These professionals share their experiences, insights, and even a few of their secrets about working with JavaFX.</p><p>Let’s get started!</p><h3>Pedro Duque Vieira, aka Duke about Hero, PDFSam, FXThemes, FXComponents,…</h3><p><a href="https://www.pixelduke.com">Pedro Duque Vieira</a> is a Software Engineer, Software Designer, and Entrepreneur. He develops beautiful, graphical applications that users feel happy to use and that significantly boost their productivity. Pedro mainly uses Java and JavaFX and has contributed several libraries to the JavaFX community. In this interview, he shares insights into a few applications, like <a href="https://foojay.io/today/creating-cad-applications-with-java-and-javafx/">Hero (CAD application to calculate energy efficiency)</a> and <a href="https://pdfsam.org/">PDFSam (powerful and professional PDF editor)</a>.</p><p>PDFSam had 100.000 downloads in April ‘24! While working on these applications, Pedro also created several libraries, like <a href="https://www.jfx-central.com/libraries/fxthemes">FXThemes</a>, <a href="https://www.jfx-central.com/libraries/fxcomponents">FXComponents</a>, and <a href="https://www.jfx-central.com/libraries/transit">Transit Theme</a>. Those libraries are used in a lot of applications, for instance, by <a href="https://www.linkedin.com/in/seanmiphillips/">Sean Phillips</a> — a legendary JavaFX developer. In the past, Sean worked on commercial products that are used for NASA mission design.</p><p>More recently, Trinity — a tool for AI analysis — was open-sourced by The Johns Hopkins University Applied Physics Laboratory.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FYaF62a4pebg%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DYaF62a4pebg&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FYaF62a4pebg%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/c91f2300bb1076e3b05fa02fbfe18738/href">https://medium.com/media/c91f2300bb1076e3b05fa02fbfe18738/href</a></iframe><h3>Daniel Zimmermann about JavaFX and Kotlin</h3><p>Daniel Zimmermann is a Java, Kotlin, and JavaFX developer working for <a href="https://www.cnlab.ch/en/">cnlab</a>. He is developing an application to test network speeds and detect potential problems.</p><p>You can download it from the <a href="https://www.cnlab.ch/en/speedtest">cnlab UX Test</a> page. In the video, he also shows two other JavaFX applications he (co-)worked on: <a href="https://apps.apple.com/us/app/kloster-disentis/id1208078669">Kloster Disentis</a> and <a href="https://www.leviat.com/de-ch/technische-downloads/software?___store=de_ch">Leviat</a>.</p><p>You can find Daniel on <a href="https://x.com/DystopianSnow">Twitter</a> and <a href="https://mastodon-swiss.org/@DystopianSnowman">Mastodon</a>. He got my attention when he recently tweeted: <a href="https://x.com/DystopianSnow/status/1793140611773554938">“To your dismay I have to tell you I write all my desktop applications using Kotlin and JavaFX”</a>. Why is he a big Kotlin AND JavaFX fan? I asked him and got a demo of the network test application that he is working on.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FOKbeVaHV3HA%3Fstart%3D1%26feature%3Doembed%26start%3D1&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DOKbeVaHV3HA&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FOKbeVaHV3HA%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/b89317bdd43c20e9fa3dd3a1375e28ee/href">https://medium.com/media/b89317bdd43c20e9fa3dd3a1375e28ee/href</a></iframe><h3>Christopher Schnick about XPipe, an app to manage all your servers</h3><p>Christopher is a software engineer with experience in the Java ecosystem and desktop application development. He is passionate about designing innovative solutions for end users and learning new technologies and tools when needed. You can find him on <a href="https://twitter.com/crschnick">Twitter</a> and <a href="https://www.linkedin.com/in/crschnick/">LinkedIn</a>.</p><p>Currently, he has two public JavaFX applications:</p><ul><li><strong>Pdx-Unlimiter</strong>: A tool for all major Paradox Grand Strategy games that provides a powerful and smart savegame manager to quickly organize and play all of your savegames with ease. Furthermore, it also comes with an Ironman converter, a powerful savegame editor, some savescumming tools, integrations for various other great community-made tools, and full support for multiple games. You can <a href="https://github.com/crschnick/pdx_unlimiter">find it on GitHub</a>.</li><li><strong>XPipe</strong>: Brings your entire server infrastructure at your fingertips. It helps you to manage all your servers from your local desktop without any remote setup. It provides seamless SSH integration, detects all your containers, k8s clusters, and virtual machines, has an integrated VNC client,… Check out the <a href="https://xpipe.io">XPipe website</a> for all features and a free download. The professional licensed edition even offers more features.</li></ul><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FmZV1OJ23d2c%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DmZV1OJ23d2c&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FmZV1OJ23d2c%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/8e837ccc299762e30b47d59dafa6cb53/href">https://medium.com/media/8e837ccc299762e30b47d59dafa6cb53/href</a></iframe><h3>Robert Ladstätter about LogoRRR, a cross-platform log analysis tool</h3><p>Robert is Group Leader for the Software Team at Nextsense GmbH (part of <a href="https://hexagon.com/">Hexagon</a>) and develops software with Scala and JavaFX. You can find him on <a href="https://x.com/rladstaetter">Twitter</a> and <a href="https://www.linkedin.com/in/robert-ladst%C3%A4tter-bb50692b1/">LinkedIn</a>. He is the creator of LogoRRR, a cross-platform log analysis tool that offers a clear and rapid way to navigate through large text files, emphasizing critical events with its interactive, user-friendly interface.</p><p>You can find it on <a href="https://logorrr.app/">logorrr.app/</a>, <a href="https://github.com/rladstaetter/LogoRRR">GitHub</a>, and in the <a href="https://apps.apple.com/at/app/logorrr/id1583786769">Apple Store</a>. LogoRRR is created with Scala and JavaFX and is able to load, search, and visualize log files with over 1.000.000 log lines blazingly fast. The UI of the application is unit tested automatically with <a href="https://www.jfx-central.com/tools/testfx">TestFX</a>.</p><p>Robert wants to thank two supporters who helped him to reach the important milestone of 10,000 downloads. <a href="https://x.com/david_lusacia">David Lucasia</a> was the first one to sponsor the project, since he found the tool in its early days so useful that he wanted to <a href="https://buymeacoffee.com/rladstaetter">support the further development via Buy Me A Coffee</a>.</p><p>Another supporter is <a href="https://x.com/Raumzeitfalle">Oliver Loeffler</a> who also provides feedback about bugs and features for LogoRRR.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2F2y8aK_t--gM&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3D2y8aK_t--gM&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttp%2Fi.ytimg.com%2Fvi%2F2y8aK_t--gM%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/793be61330509c6728a3bd20c0148935/href">https://medium.com/media/793be61330509c6728a3bd20c0148935/href</a></iframe><h3>Videos on JFX Central</h3><p>These videos are also added to the <a href="https://www.jfx-central.com/videos">video section of JFX Central</a>, select “JFX In Action” in the “Type” filter. More to come after the summer break…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/0*_CRvgBzboB2FRBDa.png" /></figure><p><em>Originally published at </em><a href="https://foojay.io/today/new-video-series-javafx-in-action-part-1/"><em>https://foojay.io</em></a><em> on July 16, 2024.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7f8d0f0186e2" width="1" height="1" alt=""><hr><p><a href="https://medium.com/javarevisited/new-video-series-javafx-in-action-part-1-7f8d0f0186e2">New video series “JavaFX In Action”, Part 1</a> was originally published in <a href="https://medium.com/javarevisited">Javarevisited</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Example Java Application with Embedded Jetty and a htmx Website]]></title>
            <link>https://frankdelporte.medium.com/example-java-application-with-embedded-jetty-and-a-htmx-website-f547b6a0f05b?source=rss-a6ee926d3fc8------2</link>
            <guid isPermaLink="false">https://medium.com/p/f547b6a0f05b</guid>
            <category><![CDATA[htmx]]></category>
            <category><![CDATA[jetty]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Frank Delporte]]></dc:creator>
            <pubDate>Thu, 28 Mar 2024 15:33:45 GMT</pubDate>
            <atom:updated>2024-03-28T15:33:45.850Z</atom:updated>
            <content:encoded><![CDATA[<p>I was experimenting with a Java application that can act as a web server and includes the user interface HTML-files that get modified with <strong>htmx</strong>, to replace certain parts of the HTML with other ones created in Java. I found it pretty hard to understand how to configure the embedded <strong>Jetty</strong> webserver, but as always with Java libraries, it’s pretty easy once you understand how to do it ;-) I decided to share my example, so you don’t need to go through the same search if you want to use the same approach…</p><p>For this experiment, I was inspired by the book <strong>“Modern frontends with htmx” written by Wim Deblauwe</strong>. You can <a href="https://webtechie.be/post/2023-12-10-book-review-htmx/">read my review of that book here</a>.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2Fko-tIacI-u8%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3Dko-tIacI-u8&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2Fko-tIacI-u8%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/dc8d1fca7e02c52aaa8e64405cd146e0/href">https://medium.com/media/dc8d1fca7e02c52aaa8e64405cd146e0/href</a></iframe><h3>What is (Eclipse) Jetty?</h3><p>As described on <a href="https://eclipse.dev/jetty/">eclipse.dev/jetty</a>: <em>“Jetty provides a web server and servlet container, additionally providing support for HTTP/2, WebSocket, OSGi, JMX, JNDI, JAAS and many other integrations. These components are open source and are freely available for commercial use and distribution.”</em></p><p>Jetty can be run as a stand-alone webserver, or integrated in a Java application. The integrated approach is what I wanted to use and is described here.</p><h3>What is htmx?</h3><p>As described on <a href="https://htmx.org/">htmx.org</a>: <em>“htmx gives you access to AJAX, CSS Transitions, WebSockets and Server Sent Events directly in HTML, using attributes, so you can build modern user interfaces with the simplicity and power of hypertext”</em></p><p>It’s a JavaScript library you add to your website, that allows you to “swap” HTML elements with other HTML provided by the server. It uses a different approach compared to most JavaScript frameworks that load JSON from an API and generate HTML on the client side. With htmx, you get fully formatted HTML back from the server and add it to your webpage, or replace other elements.</p><p>The htmx website gives this minimal example for a webpage with the action: <em>“When a user clicks on this button, issue an AJAX request to </em><em>/clicked, and replace the entire button with the HTML response&quot;</em>:</p><pre>&lt;script src=&quot;https://unpkg.com/htmx.org@1.9.11&quot;&gt;&lt;/script&gt;<br>&lt;!-- have a button POST a click via AJAX --&gt;<br>&lt;button hx-post=&quot;/clicked&quot; hx-swap=&quot;outerHTML&quot;&gt;<br>    Click Me<br>&lt;/button&gt;</pre><h3>Example Application</h3><p>The <a href="https://github.com/FDelporte/java-jetty-htmx">sources of this example application are available on GitHub</a>. It’s a Maven project that will provide two HTML pages, one with “simple” htmx, and one using a websocket.</p><h3>Dependencies</h3><p>Many of the Jetty+WebSocket examples that you can find online, refer to the javax-libraries for WebSocket integration. But after some searching, I found the correct configuration using the newer jakarta replacement library to achieve this. Although my example project uses Maven, I list the dependencies here in Gradle format, as that&#39;s a shorter way to list them in a blog post :-)</p><p>Datafaker is used to generate <a href="https://en.wikipedia.org/wiki/Lorem_ipsum">“Lorum ipsum”</a> text, so you’ll probably don’t need this in your project. And when you are not using WebSockets, you can remove two more dependencies…</p><pre>org.eclipse.jetty:jetty-server:12.0.5 <br>org.eclipse.jetty:jetty-slf4j-impl:12.0.5 <br>org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server:12.0.5 <br>jakarta.websocket:jakarta.websocket-api:2.1.1 <br>net.datafaker:datafaker:2.1.0</pre><h3>Jetty Configuration</h3><p>As I wanted to expose three different things on the same port, I needed some researching to combine them all into one Jetty Server instance:</p><ul><li>Static files (html, css, image,…) from the resources inside the JAR</li><li>REST API endpoints</li><li>WebSocket</li></ul><p>The resulting constructor looks like this, using a ContextHandlerCollection to add the different handlers:</p><pre>public class MyWebServer implements Runnable {<br><br>    private final Server server;<br><br>    public MyWebServer(int port) {<br>        server = new Server();<br><br>        try {<br>            ServerConnector connector = new ServerConnector(server);<br>            connector.setPort(port);<br>            server.addConnector(connector);<br><br>            ContextHandlerCollection contextHandlerCollection = new ContextHandlerCollection();<br>            server.setHandler(contextHandlerCollection);<br><br>            addResourceHandler(contextHandlerCollection);<br>            addRestHandler(contextHandlerCollection);<br>            addWebSocketHandler(contextHandlerCollection);<br>        } catch (Exception e) {<br>            System.err.println(&quot;Problem initializing the Jetty server: &quot; + e.getMessage());<br>        }<br>    }<br>}</pre><h4>Resource Handler</h4><p>The resource handler, makes all the files inside the resources/web directory accessible through HTTP with the following configuration:</p><pre>private void addResourceHandler(ContextHandlerCollection contextHandlerCollection) throws Exception {<br>    URL url = MyWebServer.class.getClassLoader().getResource(&quot;web&quot;);<br><br>    if (url == null) {<br>        throw new Exception(&quot;Could not find the web files&quot;);<br>    }<br><br>    ResourceFactory.Closeable resourceFactory = ResourceFactory.closeable();<br>    Resource resource = resourceFactory.newResource(url.toExternalForm());<br><br>    ResourceHandler resourceHandler = new ResourceHandler();<br>    resourceHandler.setBaseResource(resource);<br><br>    ContextHandler contactHandler = new ContextHandler();<br>    contactHandler.setContextPath(&quot;/&quot;);<br>    contactHandler.setBaseResourceAsPath(Paths.get(url.toURI()));<br>    contactHandler.setHandler(resourceHandler);<br><br>    contextHandlerCollection.addHandler(contactHandler);<br>}</pre><h4>Rest Handler</h4><p>Classes that extend HttpServlet are exposed via the rest handler. With this configuration, they can be reached on /rest/list and /rest/text:</p><pre>private void addRestHandler(ContextHandlerCollection contextHandlerCollection) {<br>    ServletContextHandler apiHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);<br>    apiHandler.setContextPath(&quot;/rest&quot;);<br>    contextHandlerCollection.addHandler(apiHandler);<br>    apiHandler.addServlet(ListService.class, &quot;/list&quot;);<br>    apiHandler.addServlet(TextService.class, &quot;/text&quot;);<br>}</pre><h4>WebSocket Handler</h4><p>For the WebSocket part, two parts are needed. First, we need to create the endpoint like this:</p><pre>@ClientEndpoint<br>@ServerEndpoint(value = &quot;/ws&quot;)<br>public class MyEventSocket {<br><br><br>    @OnOpen<br>    public void onWebSocketConnect(Session session) {<br>        System.out.println(&quot;Socket connected: &quot; + session);<br>    }<br><br>    @OnMessage<br>    public void onWebSocketText(Session session, String message) {<br>        System.out.println(&quot;Received: &quot; + message);<br>    }<br><br>    @OnClose<br>    public void onWebSocketClose(CloseReason reason) {<br>        System.out.println(&quot;Socket closed: &quot; + reason);<br>    }<br><br>    @OnError<br>    public void onWebSocketError(Throwable cause) {<br>        System.err.println(&quot;Websocket error: &quot; + cause.getMessage());<br>    }<br><br>    public void awaitClosure() throws InterruptedException {<br>        System.out.println(&quot;Awaiting closure&quot;);<br>    }<br>}</pre><p>Then this endpoint can be used in the WebSocket handler:</p><pre>private void addWebSocketHandler(ContextHandlerCollection contextHandlerCollection) {<br>    ServletContextHandler webserviceContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);<br>    webserviceContextHandler.setContextPath(&quot;/websocket&quot;);<br>    contextHandlerCollection.addHandler(webserviceContextHandler);<br>    JakartaWebSocketServletContainerInitializer.configure(webserviceContextHandler, (servletContext, websocketContainer) -&gt; {<br>        websocketContainer.setDefaultMaxTextMessageBufferSize(1024);<br>        websocketContainer.addEndpoint(MyEventSocket.class);<br>    });<br>}</pre><p>I use the Firefox plugin <a href="https://addons.mozilla.org/en-US/firefox/addon/simple-websocket-client/">“Simple WebSocket Client”</a> to test WebSocket communication to make sure it works, before diving into the HTML client implementation… As you can see in the screenshot, the server sends a timestamp every second and answers when you send a message starting with “echo”.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/569/0*RfriZnXfc1ZLXonZ.png" /></figure><h3>htmx web requests</h3><p>The example application contains two test pages. The first one, available on http://localhost:9999/index.html contains a few small examples of how you can use htmx to request data from the server and handle it on the client side. These example shows a button that calls the API on /rest/text to get a random paragraph (&lt;p&gt;) which replace the button because of the hx-swap=&quot;outerHTML&quot;:</p><pre>&lt;button hx-get=&quot;/rest/text&quot; hx-swap=&quot;outerHTML&quot;&gt;<br>    Request text<br>&lt;/button&gt;</pre><p>Another demo requests a list item (&lt;li&gt;) with a timestamp from the API on /rest/list and adds it to the end of the already existing list because of the hx-swap=&quot;beforeend&quot; hx-target=&quot;#list&quot;:</p><pre>button hx-get=&quot;/rest/list&quot; hx-swap=&quot;beforeend&quot; hx-target=&quot;#list&quot;&gt;<br>    Add new list item<br>&lt;/button&gt;<br>&lt;ul id=&quot;list&quot;&gt;<br>    &lt;li&gt;Initial list item&lt;/li&gt;<br>&lt;/ul&gt;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WmsqfM6caVrwUZag9Vun6A.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rqO-Hf1MhVbdbVg6H5dptQ.png" /></figure><h3>htmx with websocket</h3><p>htmx makes it also very easy to communicate between client and server with WebSockets. You need an additional JavaScript include and some small configuration in the body as you can see in the sources of the page that is available on <a href="http://localhost:9999/websocket.html:">http://localhost:9999/websocket.html:</a></p><pre>&lt;body hx-ext=&quot;ws&quot; ws-connect=&quot;/websocket/ws&quot;&gt;</pre><p>By adding ws-send in any HTML-element, you instruct htmx to replace it&#39;s default behavior with a call through the WebSocket. The following example is identical to the button described before, but is now handled in MyEventSocket.onWebSocketText instead of the API used before.</p><pre>&lt;h2&gt;Below button will be replaced with a random text&lt;/h2&gt;<br><br>&lt;button hx-swap=&quot;outerHTML&quot; id=&quot;replaceThis&quot; ws-send&gt;<br>    Request text<br>&lt;/button&gt;</pre><p>In MyEventSocket a scheduleAtFixedRate is implemented to send a timestamp from the server back to the client every second so it can display it&#39;s still connected.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DJZcL2rY_LSc0YYHel-Hgg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mpe-4EpBmx8vv_900CfzZw.png" /></figure><h3>Running the Application</h3><p>You can start the application from your IDE, or build it first as a JAR.</p><h3>In IntelliJIDEA</h3><ul><li>Open the project in your IDE as Maven project.</li><li>Open be.webtechie.javajettyhtmx.Application.</li><li>Click on run on the main method.</li><li>Open the browser on one of these pages:<br>* <a href="http://localhost:9999/index.html">http://localhost:9999/index.html</a><br>* <a href="http://localhost:9999/websocket.html">http://localhost:9999/websocket.html</a></li><li>Test the REST APIs:<br>* <a href="http://localhost:9999/rest/text">http://localhost:9999/rest/text</a></li><li>* <a href="http://localhost:9999/rest/list">http://localhost:9999/rest/list</a></li><li>You can test the WebSocket on this endpoint: ws://localhost:9999/websocket/ws</li></ul><h3>From JAR</h3><ul><li>Build the application with mvn package.</li><li>Start it with java -jar jetty-htmx-demo.jar</li></ul><h3>Conclusion</h3><p>Any technology, library, or framework should be evaluated to be sure it’s the right solution for the problem you need to solve. But I’m sure the combination of Jetty and htmx can be used in many cases where you have a web user interface where elements need to be modified or swapped with other ones that can be generated perfectly as formatted HTML on the server. This way you can keep all the business logic and data handling in one point which is, in my opinion, the Java code.</p><p><em>Originally published at </em><a href="https://webtechie.be/post/2024-03-28-java-jetty-htmx-websocket-example/"><em>https://webtechie.be</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f547b6a0f05b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[JavaFX Links of July 2023]]></title>
            <link>https://medium.com/javarevisited/javafx-links-of-july-2023-534ec2279bb1?source=rss-a6ee926d3fc8------2</link>
            <guid isPermaLink="false">https://medium.com/p/534ec2279bb1</guid>
            <category><![CDATA[linksoftheweek]]></category>
            <category><![CDATA[linksofthemonth]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[javafx]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Frank Delporte]]></dc:creator>
            <pubDate>Fri, 28 Jul 2023 07:51:14 GMT</pubDate>
            <atom:updated>2023-07-29T13:27:13.443Z</atom:updated>
            <content:encoded><![CDATA[<p>Although I skipped a few weeks because of busy schedules, holiday interruptions, and too few hours in a day, there was still a lot to report in the two #LinksOfTheWeek that were published on <a href="https://www.jfx-central.com/">jfx-central.com</a> in July.</p><p>Have fun reading and clicking, and see you end of August for one long #LinksOfTheMonth…</p><h3>Core</h3><ul><li>Early-Access Builds of JavaFX 21 are available from<br>- <a href="https://jdk.java.net/javafx21/">jdk.java.net</a><br>- <a href="https://gluonhq.com/products/javafx/">gluonhq.com</a><br>- <em>JavaFX 21-ea is designed to work with JDK 21-ea, but it is known to work with JDK 17 and later versions</em>.</li><li>And JavaFX 22 Early-Access Builds, Build 1 is <a href="https://jdk.java.net/javafx22/">also available</a>!</li></ul><h3>Applications</h3><ul><li><a href="https://www.esri.com/arcgis-blog/products/sdk-java/developers/how-to-use-the-arcgis-maps-sdk-for-java-in-a-raspberry-pi-for-recording-gps-tracks/"><strong>Mark Baird</strong> wrote a post to describe how the beta release of the ArcGIS Maps SDK for Java (with ARM Linux support) can be used for IoT data recording apps</a>. He uses a GPS Unit, Raspberry Pi, Pi4J, and JavaFX.</li><li><a href="https://twitter.com/yosbits/status/1676159349377617922"><strong>yos</strong> shared a video demonstrating a text editor engine implemented in #JavaFX (without WebView)</a>: “I’m testing loading and scrolling performance on a huge 5.4MB of source code. Scrolling is possible at 100FPS or more in the Apple M1 environment. This is one of Snowflower Controls.”</li><li><a href="https://twitter.com/Heshantk/status/1675453753863049216"><strong>Heshan Thenura Kariyawasam</strong> shared the sources of Serial Port Monitor</a>: “Monitoring data from a serial port with ease! This JavaFX app provides a user-friendly interface to set port and baud rate.”</li><li><a href="https://twitter.com/martinpaljak/status/1677216011391565824"><strong>Martin Paljak</strong> is using NFC tags on PC</a>: “It should be as seamless as with mobile phones — tap&amp;go. My small #unix-style #Java utility got a Friday 07.07 release, together with #javafx desktop tray. QR codes, tag emulation etc. If you use NFC tags, give it a look/try.”</li><li><a href="https://twitter.com/orango_mango/status/1683512470466437121"><strong>OrangoMango</strong> is working on a logic simulator</a> with simple AND and NOT gates.</li><li><a href="https://twitter.com/tobiasbriones_/status/1680117927662501888"><strong>Tobias Briones</strong> is working on an example application and blog</a>: “Building Slides from Screenshots App in JavaFX”.</li><li><a href="https://twitter.com/SeanMiPhillips/status/1679498134974595072"><strong>Sean Phillips</strong> whipped up a Trinity easter egg for our DALLE demos</a>. Each time services request a DALLE image, it is copied to network share. Walle Dalle scans that shared directory. Each time a new image file is copied it is animated into a spot in the 3D ring.<br>- And on Mastodon he shared more <a href="https://foojay.social/@Birdasaur@jvm.social">Trinity screenshots</a>.</li><li><a href="https://mastodon.social/@maehem/110743557437273863"><strong>Mark J Koch</strong> is writing an application for EagleCAD schematics</a>: “Still lots of work to do (like view and print PC board files) but this is a wonderful milestone in my development of this app. Hope to open source it in about a month or two.”<br>- His first experiments <a href="https://mastodon.social/@maehem/110708951041214410">looked more like “generative art”</a>.</li></ul><h3>Games</h3><ul><li><a href="https://twitter.com/WhiteWoodCity/status/1676959035596341248"><strong>WhiteWoodCity</strong> made the FXGL version of zombie vs plants open source</a> and shared the source code.<br>- <a href="https://twitter.com/AlmasBaim/status/1677002981483347995"><strong>Almas Baim</strong>: “Had a quick look, it’s awesome!”</a></li><li><a href="https://twitter.com/WebFXProject/status/1676576239258042368"><strong>WebFX</strong> made FoodDice, created by <strong>OrangoMango</strong> available online</a>. You can play it on <a href="https://fooddice.webfx.dev/">fooddice.webfx.dev</a>.</li><li><a href="https://twitter.com/AlmasBaim/status/1679096264988696576"><strong>Almas Baim</strong> sees that FXGL is getting some interest on GitHub recently</a>.The next release (21) will match Java / JavaFX 21. What would you like to see supported?</li><li><a href="https://twitter.com/orango_mango/status/1678428149233639424"><strong>OrangoMango</strong> coded a game in 48h for the GMTK game jam</a>. If you get to the boss, let him know (It could be difficult).</li></ul><h3>Components, Libraries, Tools</h3><ul><li><a href="https://twitter.com/carldea/status/1675689706313379843"><strong>Carl Dea</strong> is prototyping a new JavaFX-based Dockable windowing library</a>: “I’m getting the mechanics down (more on L&amp;F / skins later).”</li><li><a href="https://twitter.com/hansolo_/status/1674799050225483779"><strong>Gerrit Grunwald</strong> extended his Charts library with a “WaferMap”</a>.</li><li><a href="https://techhub.social/@gluonhq/110786277544214779"><strong>Gluon</strong> is launching GluonFX</a>: “A growing set of JavaFX tools/components that we maintain on github, targeting all platforms. GPL license, free for developers. If you use them in a commercial product, we have licenses for that as well”. See <a href="https://gluonhq.com/introducing-gluonfx/">gluonhq.com/introducing-gluonfx</a>.<br>- <a href="https://twitter.com/johanvos/status/1684563837188739072"><strong>Johan Vos</strong> adds</a>: “Streamlining our software, adding consistency in approach, on github (e.g. badges, javadoc, maven approach), and licensing. Gradually, more of our software will be in this umbrella, and it will work on all platforms — including mobile.”</li></ul><h3>Podcast, Video, Books</h3><ul><li><a href="https://blog.jetbrains.com/idea/2023/07/java-annotated-monthly-july-2023/">Jetbrains Java Annotated Monthly — July 2023</a> lists the <a href="https://foojay.io/today/foojay-podcast-25/">“Foojay Podcast #25: Game Development with Java, JavaFX, and FXGL”</a>.</li><li><a href="https://foojay.social/@frankdelporte/110790391834861143"><strong>Frank Delporte</strong> discovered that an image he created for his book “Getting Started with Java on the Raspberry Pi” with a JavaFX application</a> is used in the 2nd edition of “The Definitive Guide to Modern Java Clients with JavaFX 17” by <strong>Stephen Chin</strong>, <strong>Johan Vos</strong>, <strong>Jeames Weaver</strong>, and many others.</li></ul><h3>Tutorials</h3><ul><li><a href="https://www.youtube.com/watch?v=T4ftPFmis0E"><strong>Mukul Saini</strong> shared a video</a>: “Property Binding in Javafx, How to bind one javafx property with another javafx property”.</li><li><a href="https://twitter.com/princyvictor_16"><strong>Princy Victor</strong></a> wrote a tutorial about the use of <a href="https://www.educba.com/javafx-timer/">“JavaFX Timer”</a>.</li></ul><h3>Miscellaneous</h3><ul><li><a href="https://twitter.com/jetbrains/status/1674008633770737664"><strong>JetBrains</strong> is advising how to build self-contained standalone applications</a>.</li><li><a href="https://twitter.com/GeertjanW/status/1674902079515631617"><strong>Geertjan Wielenga</strong> started a “Twitter battle” about desktop versus web</a>: “Desktop applications are dead, history, a thing of the past, except maybe for some niche use cases. Yet… every time I open a browser, I’m in fact starting up… a desktop application.”</li><li>If you are looking for a #JavaFX community away from Reddit, please visit: <a href="https://programming.dev/c/javafx">programming.dev/c/javafx</a>, started by <a href="https://programming.dev/u/HamsterRage"><strong>HamsterRage</strong></a>.</li><li><a href="https://twitter.com/cpreisler/status/1683843706988683268"><strong>Chad Preisler</strong> shared</a>: “If you’re designing an API, take a look at JavaFX. It’s built in a way that makes it easy for developers to extend. It’s a really well designed API.”<br>- And he has been <a href="https://twitter.com/cpreisler/status/1683207830910693376">working on a #JavaFX custom SortedList to overcome some performance issues</a> in couple applications. Links to the code are in the video description.</li><li><a href="https://twitter.com/dlemmermann/status/1679935053541851160"><strong>Dirk Lemmermann</strong> is wondering does everyone feel about another instance of the “JFX Days” this year</a> … in person … in Zurich.</li><li><a href="https://twitter.com/C0DEDEAD/status/1677498043778605061"><strong>CodeDead</strong> shared screenshots comparing Caspian vs AtlantaFX vs Modena</a>.<br>- And <a href="https://twitter.com/C0DEDEAD/status/1677397519066603528">managed to fully automate a GitHub Actions workflow for both testing and releasing JavaFX Applications</a> (both portable and installers) using Gradle.</li><li><a href="https://twitter.com/foojayio/status/1681578734002864131"><strong>Foojay</strong> shared a list of its top 10 articles</a>: “JavaFX is well represented!”</li></ul><h3>JFX-Central</h3><ul><li>Version 2 will let you <a href="https://twitter.com/dlemmermann/status/1676201042168410113">perform a name-based search for individual icons in 100+ icon packs</a>. <strong>Dirk Lemmermann</strong> shares screenshots showing the search result for “arrow left”. This feature is brought to you by <a href="https://twitter.com/LeeWyatt_7788"><strong>Lee Wyatt</strong></a>.</li><li>Final bugs and testing are being handled before announcing V2!</li></ul><p><em>Originally published at </em><a href="https://webtechie.be/post/2023-07-28-javafx-links-of-july-2023/"><em>https://webtechie.be</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=534ec2279bb1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/javarevisited/javafx-links-of-july-2023-534ec2279bb1">JavaFX Links of July 2023</a> was originally published in <a href="https://medium.com/javarevisited">Javarevisited</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Reading the temperature, humidity, and pressure from a BME280 Sensor with Java, Pi4J, I2C, SPI, and…]]></title>
            <link>https://medium.com/javarevisited/reading-the-temperature-humidity-and-pressure-from-a-bme280-sensor-with-java-pi4j-i2c-spi-and-cf7a06c23d0b?source=rss-a6ee926d3fc8------2</link>
            <guid isPermaLink="false">https://medium.com/p/cf7a06c23d0b</guid>
            <category><![CDATA[jbang]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[pi4j]]></category>
            <category><![CDATA[raspberry-pi]]></category>
            <category><![CDATA[electronics]]></category>
            <dc:creator><![CDATA[Frank Delporte]]></dc:creator>
            <pubDate>Thu, 27 Jul 2023 13:06:33 GMT</pubDate>
            <atom:updated>2023-08-04T15:47:27.732Z</atom:updated>
            <content:encoded><![CDATA[<h3>Reading the temperature, humidity, and pressure from a BME280 Sensor with Java, Pi4J, I2C, SPI, and JBang</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*m0jVC-o8YgFv322Q.jpg" /></figure><p>To make it as easy as possible to get started with Java on the Raspberry Pi to interact with electronic components, I started a <a href="https://pi4j.com/examples/jbang/">new section on the Pi4J website with JBang examples</a>.</p><p>In this tutorial, I want to show you how you can read the temperature, humidity, and pressure from a BME280 Sensor.</p><h3>What Is Used?</h3><p>As explained on the websites of each project…</p><h3>Pi4J</h3><p><em>A friendly object-oriented I/O API and implementation libraries for Java Programmers to access the full I/O capabilities of the Raspberry Pi platform. This project abstracts the low-level native integration and interrupt monitoring to enable Java programmers to focus on implementing their application business logic.</em></p><p>All info on: <a href="https://pi4j.com/">pi4j.com</a></p><h3>JBang</h3><p><em>Lets Students, Educators and Professional Developers create, edit and run self-contained source-only Java programs with unprecedented ease.</em></p><p>All info on: <a href="https://www.jbang.dev/">jbang.dev</a></p><h3>Raspberry Pi</h3><p><em>Computing for everybody. From industries large and small, to the kitchen table tinkerer, to the classroom coder, we make computing accessible and affordable for everybody.</em></p><p>All info on: <a href="https://www.raspberrypi.com/">raspberrypi.com</a></p><h3>Tutorial</h3><p>This tutorial is also explained in this video, which is based on the <a href="https://pi4j.com/examples/jbang/bme280_temperature_humidity_pressure/">documentation provided by the Pi4J website</a>.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2F-CgjwthLy5c%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3D-CgjwthLy5c&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2F-CgjwthLy5c%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/fbfa9cf10af39b52efb58b638eab7a86/href">https://medium.com/media/fbfa9cf10af39b52efb58b638eab7a86/href</a></iframe><h3>About the BME280</h3><p>The BME280 is a sensor produced by Bosch. It’s very tiny, only 2,5 millimeters. The <a href="https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme280-ds002.pdf">datasheet</a> lists many different applications and devices for which this sensor can be used. But it’s also an excellent component for experiments, as it provides both I2C and SPI interfaces.</p><p>The datasheet also contains example code on how to convert the values from the sensor to temperature, pressure, and humidity. And to be honest, I find these pretty complex. I <a href="https://community.bosch-sensortec.com/t5/MEMS-sensors-forum/BME280-questions-can-you-explain-this-device-from-hardware-point/m-p/79672#M15268">tried to contact Bosch to learn more about the internals of such a sensor</a> because I’m a software guy who doesn’t understand why, for instance, the temperature is not just a single value you can read out directly. Unfortunately, Bosch is only referring to the datasheet as it contains all the info they can provide. And they also gave a link to their <a href="https://github.com/boschsensortec/BME280_driver/blob/master/bme280.c#L1247">GitHub project with example code</a>, where you can find similar code as the one we saw in the datasheet.</p><p>In my example, the sensor in a version of <a href="https://www.adafruit.com/product/2652">Adafruit</a> is used. It comes on a small board that can be quickly tested on a breadboard. It also exist in a version by <a href="https://www.sparkfun.com/products/13676">SparkFun where I2C and SPI connections are separated</a>.</p><h3>Wiring</h3><p>You can control the sensor both with I2C and SPI, so there are two wirings provided.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/852/1*K1G_JBzFGrf_4kNhzhgGEw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/611/1*Fl0lGjkWZBYNN-kF4e58EA.png" /></figure><h3>Java Code</h3><p>The <a href="https://pi4j.com/examples/jbang/bme280_temperature_humidity_pressure/">full description and tutorial on the Pi4J website</a> includes the code examples for both I2C and SPI. Tt was inspired by the <a href="https://pi4j.com/examples/communityimplementation/bmp280/">existing work done by Tom Aarts</a>, one of the main contributors to the Pi4J project. He created an example in a <a href="https://github.com/Pi4J/pi4j-example-devices/tree/master/src/main/java/com/pi4j/devices/bmp280">Maven project for the BMP280 sensor</a>. It’s almost identical but doesn’t have a humidity sensor.</p><p>Let’s just look at some of the parts of the I2C example for JBang.</p><h4>Dependencies and Imports</h4><p>The file starts with a special line to instruct the system to execute it with JBang. Then the dependencies are listed in a line starting with //DEPS, which will be downloaded by JBang. And finally we have the normal import statements.</p><pre>///usr/bin/env jbang &quot;$0&quot; &quot;$@&quot; ; exit $?<br><br>//DEPS org.slf4j:slf4j-api:1.7.35<br>//DEPS org.slf4j:slf4j-simple:1.7.35<br>//DEPS com.pi4j:pi4j-core:2.3.0<br>//DEPS com.pi4j:pi4j-plugin-raspberrypi:2.3.0<br>//DEPS com.pi4j:pi4j-plugin-linuxfs:2.3.0<br><br>import com.pi4j.Pi4J;<br>import com.pi4j.util.Console;<br>import com.pi4j.io.i2c.I2C;<br>import com.pi4j.io.i2c.I2CConfig;<br>import com.pi4j.io.i2c.I2CProvider;<br><br>import java.text.DecimalFormat;</pre><h4>Main Method</h4><p>The main method initializes the communication with the component and reads the values ten times. This approach allows to show the difference with the SPI code, which mainly only differs in regards of this communication.</p><pre>public static void main(String[] args) throws Exception {<br><br>    var pi4j = Pi4J.newAutoContext();<br><br>    // Initialize I2C<br>    I2CProvider i2CProvider = pi4j.provider(&quot;linuxfs-i2c&quot;);<br>    I2CConfig i2cConfig = I2C.newConfigBuilder(pi4j)<br>            .id(&quot;BME280&quot;)<br>            .bus(I2C_BUS)<br>            .device(I2C_ADDRESS)<br>            .build();<br><br>    // Read values 10 times<br>    try (I2C bme280 = i2CProvider.create(i2cConfig)) {<br>        for (int counter = 0; counter &lt; 10; counter++) {<br>            resetSensor(bme280);<br><br>            // The sensor needs some time to make the measurement<br>            Thread.sleep(300);<br><br>            getMeasurements(bme280);<br><br>            Thread.sleep(5000);<br>        }<br>    }<br><br>    pi4j.shutdown();<br>}</pre><h4>Reading the Temperature</h4><p>Reading the values of the sensor is a “Java translation” of the code provided by Bosch in the datasheet and GitHub example project.</p><pre>byte[] buff = new byte[6];<br>device.readRegister(BMP280Declares.press_msb, buff);<br>long adc_T =  (long)  ((buff[3] &amp; 0xFF) &lt;&lt; 12) |  (long)  ((buff[4] &amp; 0xFF) &lt;&lt; 4) |  (long) ((buff[5] &amp; 0x0F) &gt;&gt; 4);<br><br>...<br><br>DecimalFormat df = new DecimalFormat(&quot;0.###&quot;);<br><br>device.readRegister(readReg, compVal);<br>long dig_t1 = castOffSignInt(compVal);<br><br>device.readRegister(BMP280Declares.reg_dig_t2, compVal);<br>int dig_t2 = signedInt(compVal);<br><br>device.readRegister(BMP280Declares.reg_dig_t3, compVal);<br>int dig_t3 = signedInt(compVal);<br><br>double var1 = (((double) adc_T) / 16384.0 - ((double) dig_t1) / 1024.0) * ((double) dig_t2);<br>double var2 = ((((double) adc_T) / 131072.0 - ((double) dig_t1) / 8192.0) *<br>        (((double) adc_T) / 131072.0 - ((double) dig_t1) / 8192.0)) * ((double) dig_t3);<br>double t_fine = (int) (var1 + var2);<br>double temperature = (var1 + var2) / 5120.0;<br><br>console.println(&quot;Temperature: &quot; + df.format(temperature) + &quot; °C&quot;);<br>console.println(&quot;Temperature: &quot; + df.format(temperature* 1.8 + 32) + &quot; °F &quot;);</pre><h3>Running the Application</h3><p>Because JBang downloads the dependencies and compiles the code, we can execute all this with just one single Java file. This is the output of the I2C example:</p><pre>$ jbang Pi4JTempHumPressI2C.java<br><br>[jbang] Resolving dependencies...<br>[jbang]    org.slf4j:slf4j-api:1.7.35<br>[jbang]    org.slf4j:slf4j-simple:1.7.35<br>[jbang]    com.pi4j:pi4j-core:2.3.0<br>[jbang]    com.pi4j:pi4j-plugin-raspberrypi:2.3.0<br>[jbang]    com.pi4j:pi4j-plugin-pigpio:2.3.0<br>[jbang]    com.pi4j:pi4j-plugin-linuxfs:2.3.0<br>[jbang] Dependencies resolved<br>[jbang] Building jar...<br>[main] INFO com.pi4j.Pi4J - New auto context<br>[main] INFO com.pi4j.Pi4J - New context builder<br>[main] INFO com.pi4j.platform.impl.DefaultRuntimePlatforms - adding platform to managed platform map [id=raspberrypi; name=RaspberryPi Platform; priority=5; class=com.pi4j.plugin.raspberrypi.platform.RaspberryPiPlatform]<br>[main] INFO com.pi4j.util.Console - Initializing the sensor via I2C<br>[main] INFO com.pi4j.util.Console - **************************************<br>[main] INFO com.pi4j.util.Console - Temperature: 21.287 °C<br>[main] INFO com.pi4j.util.Console - Temperature: 70.316 °F <br>[main] INFO com.pi4j.util.Console - Pressure: 100412.769 Pa<br>[main] INFO com.pi4j.util.Console - Pressure: 1.004 bar<br>[main] INFO com.pi4j.util.Console - Pressure: 0.991 atm<br>[main] INFO com.pi4j.util.Console - Humidity: 52.7 %<br>[main] INFO com.pi4j.util.Console - **************************************<br>[main] INFO com.pi4j.util.Console - Reading values, loop 2<br>...<br>[main] INFO com.pi4j.util.Console - **************************************<br>[main] INFO com.pi4j.util.Console - Finished</pre><h3>Conclusion</h3><p>After my earlier <a href="https://foojay.io/today/controlling-electronics-with-jbang-on-the-raspberry-pi/">JBang experiment with only a basic LED and button</a>, this BME280 was more challenging. Luckily, I had the code from Tom Aarts to start from, and he added the humidity readout.</p><p>These I2C and SPI examples are great to show more complex interaction with an electronic component and Pi4J. JBang is here to help regarding the dependencies. In my opinion, this is a much cleaner and easier way, compared to pip install with Python. Or is it pip3 install? ;-)</p><p>I have a bunch of other components in my drawer waiting for more experiments, so I hope to extend this JBang-series further!</p><h3>Read More</h3><ul><li><a href="https://github.com/Pi4J/pi4j-example-devices/blob/master/src/main/java/com/pi4j/devices/bmp280/README.md">Pi4J_V2-TemperatureSensor example code by Tom Aarts</a></li><li><a href="https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp280-ds001.pdf">Bosch BMP280 Data Sheet</a></li><li><a href="https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme280-ds002.pdf">Bosch BME280 Data Sheet</a></li><li><a href="https://github.com/boschsensortec/BME280_driver/tree/master">Bosch example code on GitHub</a></li><li><a href="https://www.adafruit.com/product/2652">Product page: “Adafruit BME280 I2C or SPI Temperature Humidity Pressure Sensor — STEMMA QT”</a></li><li><a href="https://learn.adafruit.com/adafruit-bme280-humidity-barometric-pressure-temperature-sensor-breakout/pinouts">Tutorial with Arduino code: “Adafruit BME280 Humidity + Barometric Pressure + Temperature Sensor Breakout”</a></li><li><a href="https://github.com/adafruit/Adafruit_CircuitPython_BME280/blob/main/adafruit_bme280/basic.py#L248">Adafruit_CircuitPython_BME280 library source code</a></li></ul><p><em>Originally published at </em><a href="https://webtechie.be/post/2023-07-26-read-temperature-pressure-humidity-bme280-java-pi4j-jbang-raspberrypi/"><em>https://webtechie.be</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cf7a06c23d0b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/javarevisited/reading-the-temperature-humidity-and-pressure-from-a-bme280-sensor-with-java-pi4j-i2c-spi-and-cf7a06c23d0b">Reading the temperature, humidity, and pressure from a BME280 Sensor with Java, Pi4J, I2C, SPI, and…</a> was originally published in <a href="https://medium.com/javarevisited">Javarevisited</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[JavaFX Links of June 2023]]></title>
            <link>https://medium.com/javarevisited/javafx-links-of-june-2023-256661851d4c?source=rss-a6ee926d3fc8------2</link>
            <guid isPermaLink="false">https://medium.com/p/256661851d4c</guid>
            <category><![CDATA[javafx]]></category>
            <category><![CDATA[linksoftheweek]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[linksofthemonth]]></category>
            <dc:creator><![CDATA[Frank Delporte]]></dc:creator>
            <pubDate>Fri, 30 Jun 2023 09:11:57 GMT</pubDate>
            <atom:updated>2023-07-01T14:52:07.202Z</atom:updated>
            <content:encoded><![CDATA[<p>Again a lot has been shared this month in the <a href="https://www.jfx-central.com/home">jfx-central.com</a> #LinksOfTheWeek! And that website itself is “under heavy construction” as version 2 is getting a completely new design and several improvements. Your help is wanted! See the last section of this summary…</p><h3>Core</h3><ul><li><a href="https://twitter.com/OpenJDK/status/1669074682505572353">Rampdown Phase 1 (RDP1) for JavaFX 21 starts on July 13, 2023 at 16:00 UTC (09:00 Pacific time)</a>, about four weeks from now.</li><li>JavaFX 21 Early-Access Builds Build 21 is available from <a href="https://jdk.java.net/javafx21/">jdk.java.net/javafx21</a>, addressing <a href="https://bugs.openjdk.org/browse/JDK-8301312?jql=project%20%3D%20JDK%20AND%20fixversion%20%3D%20jfx21%20and%20component%20%3D%20javafx%20and%20%22resolved%20in%20build%22%20%3D%20b21%20order%20by%20component%2C%20subcomponent">these issues</a>. JavaFX 21-ea is designed to work with JDK 21-ea, but it is known to work with JDK 17 and later versions.</li><li><a href="https://mastodon.social/@johanvos/110547534890057649"><strong>Johan Vos</strong> is planning to spend more time on Java on Mobile (OpenJDK Mobile)</a> in the near future: “There is 0 support from big tech because they fall in 2 categories: 1/ they have no revenue on mobile, 2/ they have competing OS tech that drives devs/users to their revenue-driven cloud services. But since I’m not big tech, I can just do it.”</li><li><a href="https://twitter.com/GluonHQ/status/1671461934049243136"><strong>Gluon</strong> asks all JavaFX developers to give JavaFX 21-ea+21 a try</a>.<br>- <a href="https://techhub.social/@gluonhq/110615181663234520">And is working on making their JavaFX software (libraries, tools, components) more consistent and developer-friendly</a>: “Over the past years, we learned a lot, and we’re putting that experience now in our code.”</li><li><a href="https://github.com/dlsc-software-consulting-gmbh/GMapsFX/issues/204"><strong>Dirk Lemmermann</strong> is looking for help with a Webkit issue in JavaFX 18.0.1</a>.</li><li><a href="https://twitter.com/Abdelrahman_B1"><strong>Abdelrahman Bayoumi</strong></a> explores a solution to resolve the challenges when it comes to <a href="https://dev.to/abdelrahmanbayoumi/arabic-text-rendering-issues-in-javafx-3j9i">rendering Arabic, being a right-to-left script</a>.</li></ul><h3>Applications</h3><ul><li><a href="https://twitter.com/SeanMiPhillips/status/1662197944718876672"><strong>Sean Phillips</strong> is almost ready to make the sources of Trinity available</a>…<br>- <a href="https://twitter.com/SeanMiPhillips/status/1666617132338102273">He is using Trinity to distinguish between human and chatGPT altered text</a>.<br>- After <a href="https://twitter.com/SeanMiPhillips/status/1669087717743788033">teasing us</a> for a few weeks, it finally happened! <a href="https://twitter.com/SeanMiPhillips/status/1669089367694901250"><strong>Sean Phillips</strong> announced</a> that Trinity, an Explainable AI Analysis and Visualization tool written in Java and JavaFX, is now officially public and open source. His message: “Have fun you fine young cannibals.”<br>- Video demo of Trinity to <a href="https://twitter.com/SeanMiPhillips/status/1668296662857424896">project and distinguish between human and chatGPT altered text blurbs</a>.<br>- With many thanks to <a href="https://twitter.com/JavaFX3D/status/1669523111484719105"><strong>JavaFX 3D</strong>, <strong>Jasper Potts</strong>, <strong>Alexander Kouznetsov</strong>, <strong>Chien Yang</strong>, <strong>Kevin Rushforth</strong>, <strong>Richard Bair</strong>, and many others</a> for all their hard work on JavaFX and 3D and more!<br>- <a href="https://twitter.com/SeanMiPhillips/status/1671682955855446016"><strong>Sean Phillips</strong> shared a screenshot</a>: projecting decision manifolds from Pilot Assist AI Models for dog fighting pilots.<br>- <a href="https://twitter.com/SeanMiPhillips/status/1671674205098704899">Rendering a rainbow highway</a>.<br>- <a href="https://mastodon.social/@johanvos/110566790213698291"><strong>Johan Vos</strong> is still impressed by the Devnexs keynote given by Sean</a>: “This is a very cool demonstration about Trinity, an open-source tool developed/used at John Hopkins University. It shows how Java developers can create cool, amazing and extremely useful stuff with great visualization using JavaFX.”</li><li><a href="https://twitter.com/crschnick/status/1662109280323993600"><strong>Christopher Schnick</strong> improved the speed of Pdx-Unlimiter</a> with cached dynamically generated images.</li><li><a href="https://twitter.com/johanvos/status/1666416554110513158">Deep Netts has a neural network visual weights analysis tool ready for the next release</a>. It helps to understand what’s going on inside layers, and debugging trained networks.</li><li><a href="https://twitter.com/MaleeshaH/status/1666865457599770625"><strong>Maleesha Herath</strong> introduces “tecmis”, an Information Management System</a> that revolutionizes how educational institutions handle data.</li><li><a href="https://twitter.com/tobiasbriones_/status/1666863274938204172"><strong>Tobias Briones</strong> finished the implementation for Code Snipped Slides</a> with the exact color scheme of IntelliJ, except for specific language tokens. It’s all composed with JavaFX Nodes, like Shapes.</li><li>New version of <a href="https://twitter.com/mapton_app/status/1667529564120023042">Mapton with bug fixes and minor improvements along with new WMS sources</a>. Dependencies such as NetBeans 18 platform and the bundled Java &amp; JavaFX from Azul are updated too.</li><li><a href="https://twitter.com/crschnick/status/1672101399486951425"><strong>Christopher Schnick</strong> gave the welcome page of v1.2 of XPipe some personality</a>.</li><li><a href="https://twitter.com/dlemmermann/status/1670757586260377602"><strong>Dirk Lemmermann</strong> really likes the latest version of the sample app for AtlantaFX</a>: “Very nicely polished theme and controls. Packaged with Conveyor from HydraulicDev.”</li><li><a href="https://twitter.com/makingthematrix/status/1669374799246774278"><strong>Maciek Gorywoda</strong> shared v1.0.0 FxCalculator</a>: “It’s, well, a calculator for your Android phone.” Read the whole thread to learn more, e.g. that it’s written in Scala 3.3, JavaFX, Gluon, and built with GraalVM Native Image.</li><li><a href="https://twitter.com/jam_machund/status/1671102745309265920"><strong>Jamie Macaulay</strong> is working on SUDUnpacker</a> to handle SoundTraps sud files.</li></ul><h3>Games</h3><ul><li><a href="https://foojay.social/@johanvos@mastodon.social/110461937691524803"><strong>Johan Vos</strong> stumbled into this addictive web game, written in JavaFX by <strong>Gerrit Grunwald</strong> using WebFX: tetris.webfx.dev</a>: “It’s great to see how developers are using JavaFX to make cool stuff.”</li><li><a href="https://twitter.com/orango_mango/status/1662758757506469889"><strong>OrangoMango</strong> made Snake v1.0 available on itch</a>. Thanks to WebFX, there is now a web version that is playable in the browser (fullscreen is recommended).<br>- <a href="https://twitter.com/orango_mango/status/1666727933258485760">He extended his chess game</a> with drag and drop, and improved the image resolution.<br>- <a href="https://twitter.com/orango_mango/status/1671252291658055680">He also shared a video showing collision detection with convex shapes</a>. It resulted in a nice chat with <a href="https://twitter.com/SeanMiPhillips/status/1671662634930696195"><strong>Sean Phillips</strong></a> and <a href="https://twitter.com/carldea/status/1672041067909193734"><strong>Carl Dea</strong></a>.<br>- <a href="https://twitter.com/orango_mango/status/1673693403664764938">He added a teleport stone, a propeller, and rotating platforms to FoodDice</a>. New levels with those new items are coming in the next update. Also implemented the new collision system that he wrote before for these new rotating items.<br>- And he has been <a href="https://twitter.com/orango_mango/status/1672648493372981249">experimenting with a physics engine made from scratch</a>. Right now, there are just some basic physics laws and chains.</li><li>Another <a href="https://twitter.com/WebFXProject/status/1668227539154747396">JavaFX game has been ported to the Web with <strong>WebFX</strong> Food Dice!</a>. It’s a plain JavaFX game written for the GMTK Game jam 2022 and was coded in 48h from scratch with no 3rd party lib. Congrats to the 16-year-old author <strong>OrangoMango</strong>**. Play online on <a href="https://fooddice.webfx.dev">fooddice.webfx.dev</a>.</li><li><a href="https://twitter.com/AlmasBaim/status/1671169432524316674"><strong>Almas Baim</strong> shows image mesh warping</a>: “No specific use case, but I’m sure this will come in handy for some cool effects in the future.”<br>- <a href="https://twitter.com/AlmasBaim/status/1664730029887037441">He is trying to hypnotize us</a>.<br>- <a href="https://twitter.com/AlmasBaim/status/1673700044556386304">And he is drawing circles with triangles and FXGL</a>.</li></ul><h3>Components, Libraries, Tools</h3><ul><li>Last week we shared the TreeMap chart by <strong>Matt Coley</strong> here. In a new video, you can see a <a href="https://twitter.com/invokecoley/status/1663073175431675904">practical demo of TreeMapFX in Recaf</a>.</li><li><a href="https://mastodon.social/@svenruppert/110436643725621744"><strong>Sven Ruppert</strong> shared that work has started on TestFX 4</a>, after longer silence. You can find the project on <a href="https://testfx.github.io/TestFX/">testfx.github.io/TestFX</a>.</li><li><a href="https://twitter.com/dlemmermann/status/1669473442163294210"><strong>Dirk Lemmermann</strong> sees there truly is a big need for custom window decorations and found an extra one</a>.</li><li><a href="https://twitter.com/JaroslavTulach/status/1449827890300915718"><strong>Jaroslav Tulach</strong> is discussing JavaFX Lite</a> and is asking for feedback: “Would you find #javafxlight — e.g. coding in #javafx &amp; rendering via #HTML5 useful?”</li></ul><h3>Podcast, Videos</h3><ul><li><a href="https://www.linkedin.com/feed/update/urn:li:activity:7071865436115468288/"><strong>Gerrit Grunwald</strong> and <strong>Ixchel Ruiz</strong> talking at JNation</a> about Graphical User Interfaces with Java.</li><li><a href="https://foojay.io/today/foojay-podcast-25/">Foojay Podcast #25: Game Development with Java, JavaFX, and FXGL</a>. <strong>Gerrit Grunwald</strong> (aka _hansolo), <strong>Almas Baim</strong> (aka the FXGL creator), and <strong>Chengen Zhao</strong> (aka WhiteWoodCity) talk with <strong>Frank Delporte</strong> about why Java should be on your game-development-language-list.</li></ul><h3>Tutorials</h3><ul><li><strong>Coding Examples</strong> uploaded new videos to “JavaFX 3D Tutorials”. For example: <a href="https://www.youtube.com/watch?v=9YSor8d3Hzk">“Animation | Fade Transition”, to create a Text and make it blink using the FadeTransition class</a>. using the shape’s transparency to achieve the required effect.</li><li><a href="https://twitter.com/safetyvalve/status/1664349425228038144"><strong>Sten Nordström</strong> got asked if there are any good JavaFX courses available?</a>: “Asker has experience with other platforms and some Java knowledge. Online, or possibly in person in Scandinavia/Northern Europe.” Who has more ideas? What should we add to <a href="https://www.jfx-central.com/tutorials">jfx-central.com/tutorials</a>?<br>- This is actually a nice one :-) ! <a href="https://twitter.com/MithinDev/status/1665709087135506432"><strong>MITHIN DEV</strong> shared “Building Your First JavaFX App!”</a></li><li>Not new, but a nice reminder by <a href="https://twitter.com/jjenkov/status/1666472122535886849"><strong>Jakob Jenkov</strong>: “I have a tutorial covering a lot of the basics of JavaFX”</a>.</li><li>In French: <a href="https://twitter.com/jachampagne8/status/1674085894700113921"><strong>Jason Champagne</strong> has a series of videos, part 2</a>: “Point essentiel en JavaFX sur l’architecture des différents composants, en particulier le Scene Graph et la gestion des fenêtres (stages)”.</li><li>Not new, but just discovered: <a href="https://www.youtube.com/watch?v=guXTwZpGVRk&amp;list=PLoodc-fmtJNbeL8P1DizFcgjp62UjvJ3t">Video series by <strong>Jaret Wright</strong> to create a JavaFX Memory Game</a>.</li></ul><h3>Miscellaneous</h3><ul><li><a href="https://twitter.com/TheDonRaab/status/1662199629407027203"><strong>Donald Raab</strong> is hoping to get back to experimenting with JavaFX again this summer</a> and to submit conference talks…</li><li><a href="https://mastodon.online/@sten/110470561467745227"><strong>Sten Nordström</strong> is looking for JavaFX tutorials</a>: “Asker has experience with other platforms and some Java knowledge. Online, or possibly in person in Scandinavia/Northern Europe.” Who can help him? First starting point should of course be: <a href="https://www.jfx-central.com/tutorials">jfx-central.com/tutorials</a> ;-)</li><li><a href="https://www.reddit.com/r/JavaFX/comments/1483fio/need_help_building_javafx_project_in_vscode/">A help request on Reddit to build a JavaFX project in VsCode</a>.</li></ul><h3>JFX-Central</h3><ul><li>Service call to all the people who have “something” on JFX-Central (library, book, tutorial,…). We are reviewing all info on the website in preparation of the new JFX-Central version. But we need your help, please contact us or make a pull request in <a href="https://github.com/dlsc-software-consulting-gmbh/jfxcentral-data">jfxcentral-data</a> to make sure all the info is still correct and up-to-date. Thanks!</li><li>More previews of version 2 of jfx-central.com:<br>- <a href="https://twitter.com/dlemmermann/status/1663916396814761987"><strong>Dirk Lemmermann</strong> is drooling with the layout</a>.<br>- And <a href="https://twitter.com/dlemmermann/status/1663916816794517504">more drooling</a>…<br>- <a href="https://twitter.com/dlemmermann/status/1662388854366560256">Social login capabilities were added</a>.<br>- And he is having almost too much fun :-) <a href="https://twitter.com/dlemmermann/status/1664334599319592969">Added banners to the tips and tricks pages</a>.<br>- Finding out what’s coming to the next JavaFX release <a href="https://twitter.com/dlemmermann/status/1668690954876755974">will be super easy by visiting the new OpenJFX page on JFX-Central</a>.<br>- Finding that one library you recently heard about <a href="https://twitter.com/dlemmermann/status/1669472701059047424">will be easy via JFX-Central… and who wrote it, and videos showing it, and the repo coordinates, and and and</a>.<br>- <a href="https://twitter.com/dlemmermann/status/1672975213376552964"><strong>Lee Wyatt</strong>, one of the main contributors to the new JFX-Central version</a> added a “Credits” page, one of the many pages he created and/or improved.</li><li><strong>Dirk Lemmermann</strong> wants your opinion about a new logo for jfx-central (and JavaFX itself?)<br>- <a href="https://twitter.com/dlemmermann/status/1666478961675862022">First idea with a lot of remarks and adjusted proposals by others</a>.<br>- <a href="https://twitter.com/dlemmermann/status/1666735588500811777">The next proposal</a>.<br>- After many iterations, <a href="https://twitter.com/dlemmermann/status/1669026529429397521">Dirk found the perfect new logo</a>: “Work on the logo for the JFX-Central website is finished. In the end large, small, color, black, white, etc…. versions were needed to make it look code in all places.”</li><li>Testing the layout of the new version <a href="https://twitter.com/dlemmermann/status/1666771832765132801">with “responsive design” mode is in Safari</a>.</li><li>And the new desktop version will <a href="https://twitter.com/dlemmermann/status/1667169729784545280">come with its own custom stage when running on desktop</a>. Other improvements for the app version of the new JFX-Central:<br>- <a href="https://twitter.com/dlemmermann/status/1670798362453368840">A couple of screens were added for a nice bootstrap sequence</a>. When running the app for the first time it will clone its data repo (takes a while). Any launch after that will perform an update on it (fast).<br>- <a href="https://twitter.com/dlemmermann/status/1671506280026972164">It will also come with a tray icon for quick access to anything JavaFX</a>.<br>- <a href="https://twitter.com/dlemmermann/status/1671538241952948228">It is now an even better citizen when running on Mac</a>. Can you spot the difference aka the “dots”?</li><li>We have been very busy working on the new JFX-Central version… Maybe you want to help out? <a href="https://github.com/dlemmermann/jfxcentral2">The repository is now public</a>! Feel free to make contributions. Testing, and reporting bugs. All are very welcome.</li></ul><p><em>Originally published at </em><a href="https://webtechie.be/post/2023-06-30-javafx-links-of-june-2023/"><em>https://webtechie.be</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=256661851d4c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/javarevisited/javafx-links-of-june-2023-256661851d4c">JavaFX Links of June 2023</a> was originally published in <a href="https://medium.com/javarevisited">Javarevisited</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Foojay Podcast 26: The Future of Source Control and CI/CD]]></title>
            <link>https://medium.com/javarevisited/foojay-podcast-26-the-future-of-source-control-and-ci-cd-2c9ae1e2fb89?source=rss-a6ee926d3fc8------2</link>
            <guid isPermaLink="false">https://medium.com/p/2c9ae1e2fb89</guid>
            <category><![CDATA[version-control]]></category>
            <category><![CDATA[cicd]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[podcast]]></category>
            <category><![CDATA[foojay]]></category>
            <dc:creator><![CDATA[Frank Delporte]]></dc:creator>
            <pubDate>Mon, 26 Jun 2023 08:35:59 GMT</pubDate>
            <atom:updated>2023-07-13T09:47:54.661Z</atom:updated>
            <content:encoded><![CDATA[<p>As developers, we like to automate the boring parts of our job. This automation includes the source control system, build pipelines, and code analysis tools.</p><p>In recent decades, we have seen evolutions from CVS to Subversion to Git. Is this the endpoint? Did we find the holy grail in version control? Or what evolutions are waiting for us?</p><p>Let’s find out together with these fantastic guests…</p><blockquote><strong><em>This is the final episode of season 2 of the Foojay Podcast. See you in September for the start of our new season with more JUGs, the launch of Java 21, and much more!</em></strong></blockquote><p><a href="https://app.springcast.fm/18707/the-future-of-source-control-and-cicd-26">The Future of Source Control and CI/CD</a></p><h3>Guests</h3><ul><li>Trisha Gee (Gradle)<br>- <a href="https://twitter.com/trisha_gee">@trisha_gee</a><br>- <a href="https://jvm.social/@trisha_gee">jvm.social/@trisha_gee</a><br>- <a href="https://www.linkedin.com/in/trishagee/">linkedin.com/in/trishagee/</a></li><li>Ixchel Ruiz (JFrog)<br>- <a href="https://twitter.com/ixchelruiz">@ixchelruiz</a><br>- <a href="https://mastodon.social/@ixchelruiz">mastodon.social/@ixchelruiz</a><br>- <a href="https://www.linkedin.com/in/ixchelruiz/">linkedin.com/in/ixchelruiz/</a></li><li>Pierre-Étienne Meunier (Pijul)<br>- <a href="https://fosstodon.org/@nuempe">fosstodon.org/@nuempe</a><br>- <a href="https://www.linkedin.com/in/pierre-%C3%A9tienne-meunier-1b93b619b/">linkedin.com/in/pierre-%C3%A9tienne-meunier-1b93b619b/</a></li></ul><h3>Podcast</h3><ul><li>Host: Hanno Embregts<br>- <a href="https://twitter.com/hannotify">@hannotify</a><br>- <a href="https://foojay.social/@hannotify">foojay.social/@hannotify</a><br>- <a href="https://www.linkedin.com/in/hannoembregts/">linkedin.com/in/hannoembregts/</a></li><li>Production: Frank Delporte<br>- <a href="https://twitter.com/FrankDelporte">@FrankDelporte</a><br>- <a href="https://foojay.social/@frankdelporte">foojay.social/@frankdelporte</a></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*HKqKBN_pgi2W4fSl.png" /></figure><h3>Content</h3><ul><li>00&#39;00 Intro and introduction of the guests and host</li><li>04&#39;15 Should we automate as much as possible to be able to focus on developing</li><li>06&#39;33 The human factor of developer productivity engineering (DPE)<br>- Free book: <a href="https://gradle.com/developer-productivity-engineering/handbook/">gradle.com/developer-productivity-engineering/handbook/</a></li><li>10&#39;23 PEs view on automation and how changes in law books follow the same approach as “code diffs”</li><li>17&#39;02 How you can struggle with your version control system<br>- <a href="https://www.w3docs.com/learn-git/git-reflog.html">w3docs.com/learn-git/git-reflog.html</a><br>- <a href="https://dangitgit.com/">dangitgit.com/</a><br>- <a href="https://leanpub.com/gettingtoknowIntelliJIDEA">leanpub.com/gettingtoknowIntelliJIDEA</a><br>- <a href="https://www.oreilly.com/library/view/learning-git/9781098133900/">oreilly.com/library/view/learning-git/9781098133900/</a><br>- <a href="https://www.oreilly.com/library/view/head-first-git/9781492092506/">oreilly.com/library/view/head-first-git/9781492092506/</a></li><li>26&#39;33 How Pijul tries to solve these challenges<br>- <a href="https://git-man-page-generator.lokaltog.net">git-man-page-generator.lokaltog.net</a><br>- <a href="https://pijul.org/">pijul.org</a></li><li>33&#39;24 Patches versus branches versus trunk-based development and how to switch from branch-approach<br>- <a href="https://foojay.io/today/why-i-prefer-trunk-based-development/">foojay.io/today/why-i-prefer-trunk-based-development/</a></li><li>44&#39;09 What could be improved to version control systems<br>- <a href="https://www.conventionalcommits.org/en/v1.0.0/">conventionalcommits.org/en/v1.0.0/</a></li><li>50&#39;16 Why are still so many people using Git<br>- <a href="https://www.reuters.com/article/us-france-ovh-fire-idUSKBN2B20NU">reuters.com/article/us-france-ovh-fire-idUSKBN2B20NU</a></li><li>01h02&#39;02 Looking 10 years into the future</li><li>01h13&#39;30 Outro</li></ul><p><em>Originally published at </em><a href="https://foojay.io/today/foojay-podcast-26/"><em>https://foojay.io</em></a><em> on June 26, 2023.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2c9ae1e2fb89" width="1" height="1" alt=""><hr><p><a href="https://medium.com/javarevisited/foojay-podcast-26-the-future-of-source-control-and-ci-cd-2c9ae1e2fb89">Foojay Podcast 26: The Future of Source Control and CI/CD</a> was originally published in <a href="https://medium.com/javarevisited">Javarevisited</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Foojay Podcast #25: Game Development with Java, JavaFX, FXGL]]></title>
            <link>https://medium.com/javarevisited/foojay-podcast-25-game-development-with-java-javafx-fxgl-1b7519b3138e?source=rss-a6ee926d3fc8------2</link>
            <guid isPermaLink="false">https://medium.com/p/1b7519b3138e</guid>
            <category><![CDATA[javafx]]></category>
            <category><![CDATA[foojay]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[fxgl]]></category>
            <category><![CDATA[game-development]]></category>
            <dc:creator><![CDATA[Frank Delporte]]></dc:creator>
            <pubDate>Mon, 19 Jun 2023 08:56:59 GMT</pubDate>
            <atom:updated>2023-07-13T09:48:27.916Z</atom:updated>
            <content:encoded><![CDATA[<p>Java and JavaFX are probably not the first options you consider if you want to create a game application.</p><p>But the FXGL library allows you to do precisely that! Create games that run on all platforms with the same codebase as we are used to with <a href="https://medium.com/javarevisited/top-10-java-interview-questions-for-3-to-4-years-experienced-programmers-c4bf6d8b5e7b">Java</a>.</p><p>And even without an extra library, the JavaFX Components and Canvas provide many animation and gaming possibilities.</p><p>Let’s learn from experts why Java should be on your game-development-language-list!</p><p><a href="https://app.springcast.fm/18707/game-development-with-java-javafx-and-fxgl-25">Game Development with Java, JavaFX, and FXGL (#25)</a></p><p><strong>Guests</strong></p><ul><li>Chengen Zhao<br>- <a href="https://twitter.com/WhiteWoodCity">https://twitter.com/WhiteWoodCity</a><br>- <a href="https://www.linkedin.com/in/chengenzhao/">https://www.linkedin.com/in/chengenzhao/</a><br>- <a href="https://store.steampowered.com/app/658250/Xtrike/">Steam game created with JavaFX: Xtrike</a></li><li>Almas Baim<br>- <a href="https://github.com/AlmasB">https://github.com/AlmasB</a><br>- <a href="https://twitter.com/AlmasBaim">https://twitter.com/AlmasBaim</a><br>- <a href="https://www.youtube.com/almasb0/videos">https://www.youtube.com/almasb0/videos</a><br>- <a href="https://github.com/almasb/fxgl">https://github.com/almasb/fxgl</a></li><li>Gerrit Grunwald<br>- <a href="https://twitter.com/hansolo_/">https://twitter.com/hansolo_/</a><br>- <a href="https://mastodon.social/@hansolo_">https://mastodon.social/@hansolo_</a><br>- <a href="https://github.com/HanSolo/jarkanoid">https://github.com/HanSolo/jarkanoid</a><br>- <a href="https://github.com/HanSolo/SpaceFX">https://github.com/HanSolo/SpaceFX</a></li></ul><p><strong>Host</strong></p><ul><li>Frank Delporte<br>- <a href="https://www.linkedin.com/in/frankdelporte/">https://www.linkedin.com/in/frankdelporte/</a><br>- <a href="https://foojay.social/@frankdelporte">https://foojay.social/@frankdelporte</a><br>- <a href="https://twitter.com/FrankDelporte">https://twitter.com/FrankDelporte</a></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*lVUZV-igbzxURG7H.png" /></figure><p><strong>Content</strong></p><ul><li>00&#39;00 Intro and introduction of the guests<br>- <a href="https://foojay.io/today/foojay-podcast-9/">https://foojay.io/today/foojay-podcast-9/</a></li><li>04&#39;00 About FXGL<br>- <a href="https://foojay.io/today/book-review-learn-javafx-game-and-app-development-with-fxgl-17/">https://foojay.io/today/book-review-learn-javafx-game-and-app-development-with-fxgl-17/</a><br>- <a href="https://foojay.io/today/creating-a-snake-game-with-javafx-fxgl-in-three-pair-programming-sessions/">https://foojay.io/today/creating-a-snake-game-with-javafx-fxgl-in-three-pair-programming-sessions/</a></li><li>08&#39;48 How Chengen used FXGL to improve his Xtrike game</li><li>10&#39;15 Combining 2D and 3D</li><li>11&#39;20 The fascination of Gerrit for retro games</li><li>13&#39;36 JavaFX components versus Canvas<br>- <a href="https://twitter.com/AlmasBaim/status/1658565437053980691">https://twitter.com/AlmasBaim/status/1658565437053980691</a><br>- <a href="https://twitter.com/AlmasBaim/status/1649882265986424832">https://twitter.com/AlmasBaim/status/1649882265986424832</a><br>- <a href="https://twitter.com/AlmasBaim/status/1642277058033139712">https://twitter.com/AlmasBaim/status/1642277058033139712</a><br>- <a href="https://twitter.com/AlmasBaim/status/1640102122350944257">https://twitter.com/AlmasBaim/status/1640102122350944257</a></li><li>19&#39;09 Creating games while waiting in airports…</li><li>22&#39;19 Convert to mobile and Steam apps</li><li>23&#39;22 Question of Chengen if FXGL can extend view components</li><li>24&#39;58 How students are involved in the FXGL project<br>- <a href="https://foojay.io/today/java-in-education-combining-java-with-raspberry-pi-and-the-pi4j-library/">https://foojay.io/today/java-in-education-combining-java-with-raspberry-pi-and-the-pi4j-library/</a></li><li>29&#39;53 Why FXGL has a mix of Java and Kotlin</li><li>32’22 Building for mobile and the hassle with the app stores…<br>- <a href="https://foojay.io/today/cross-platform-development-in-java-with-gluon-and-graalvm-part-2/">https://foojay.io/today/cross-platform-development-in-java-with-gluon-and-graalvm-part-2/</a><br>- <a href="https://foojay.io/today/porting-an-existing-javafx-app-to-ios/">https://foojay.io/today/porting-an-existing-javafx-app-to-ios/</a><br>- <a href="https://foojay.io/today/creating-mobile-apps-with-javafx-part-3/">https://foojay.io/today/creating-mobile-apps-with-javafx-part-3/</a></li><li>38’58 3D in JavaFX<br>- <a href="https://foojay.io/today/visualizing-brain-computer-interface-data-using-javafx/">https://foojay.io/today/visualizing-brain-computer-interface-data-using-javafx/</a><br>- <a href="https://foojay.io/today/javafx-3d-a-look-back-in-history-and-some-experiments/">https://foojay.io/today/javafx-3d-a-look-back-in-history-and-some-experiments/</a><br>- <a href="https://github.com/FXyz/FXyz">https://github.com/FXyz/FXyz</a></li><li>44&#39;14 Status of Swing</li><li>47&#39;13 About the Java community in China</li><li>49&#39;23 Could a drag-and-drop animation tool be created for FXGL?<br>- <a href="https://github.com/AlmasB/FXGL/blob/dev/fxgl-tools/src/main/java/com/almasb/fxgl/tools/editor/EditorApp.java">https://github.com/AlmasB/FXGL/blob/dev/fxgl-tools/src/main/java/com/almasb/fxgl/tools/editor/EditorApp.java</a></li><li>51&#39;13 Use JavaFX FXML markup files? And can SceneBuilder provide a code-only approach?</li><li>55&#39;34 Conclusion</li></ul><p>Don’t Forget to Share This Post!</p><p><em>Originally published at </em><a href="https://foojay.io/today/foojay-podcast-25/"><em>https://foojay.io</em></a><em> on June 19, 2023.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1b7519b3138e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/javarevisited/foojay-podcast-25-game-development-with-java-javafx-fxgl-1b7519b3138e">Foojay Podcast #25: Game Development with Java, JavaFX, FXGL</a> was originally published in <a href="https://medium.com/javarevisited">Javarevisited</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Running a CRaC Java application on Raspberry Pi]]></title>
            <link>https://medium.com/javarevisited/running-a-crac-java-application-on-raspberry-pi-9017d31567d1?source=rss-a6ee926d3fc8------2</link>
            <guid isPermaLink="false">https://medium.com/p/9017d31567d1</guid>
            <category><![CDATA[azul]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[raspberry-pi]]></category>
            <category><![CDATA[cracs]]></category>
            <category><![CDATA[zulu]]></category>
            <dc:creator><![CDATA[Frank Delporte]]></dc:creator>
            <pubDate>Thu, 15 Jun 2023 18:18:47 GMT</pubDate>
            <atom:updated>2023-06-23T15:36:13.734Z</atom:updated>
            <content:encoded><![CDATA[<p>With the April release of the Zulu Build of OpenJDK, Azul announced the integration of CRaC in its version 17 of Java for Linux. Coordinated Restore at Checkpoint (CRaC) is a feature introduced in OpenJDK to improve Java’s application startup and warmup times to milliseconds from seconds or even minutes, by allowing a running application to pause, snapshot its state, and restart later, even on a different machine.</p><p>CRaC is the final step after previous projects by Azul in multiple client projects in the automotive and IoT industry. Infotainment systems for car, gateways in electronic systems, and other use-cases require high-speed startup of their applications running on embedded ARM32 and ARM64 systems.</p><p>The Raspberry Pi also has an ARM processor, so I wanted to know if CRaC can improve the speedup of Java applications on Raspberry Pi OS. This post is the result of my first experiments.</p><blockquote><strong>TL;DR; It does work perfectly but still needs a modified kernel and changes in Zulu which will be part of the next release in July.</strong></blockquote><h3>Raspberry Pi OS</h3><p>On the <a href="https://www.azul.com/downloads/?package=jdk-crac#zulu">download page of Azul</a>, two versions of Zulu are available now, with CRaC included. As you can see in the screenshot, both aim Linux, one for x86 64-bit platforms and the other one for ARM v8 64-bit. The second one is the same processor used in the Raspberry Pi 4.</p><p>With the Raspberry Pi Imager Tool, I prepared an SD card with the 64-bit version of Raspberry Pi OS. I started with a 16GB card but had to restart as this isn’t enough to build the kernel as is currently necessary, as you can read further. Luckily, I had a 64GB card available for a second attempt.</p><p>When the device has started for the first time, make sure to update it fully and we can start with a “fresh up-to-date” system.</p><pre>$ sudo apt update<br>$ sudo apt upgrade</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*V00RNUrOZM5rfbNhKNpISg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*etxupKUbcTMlDqjbUyG6JA.png" /></figure><h3>Install Azul Zulu OpenJDK</h3><h3>Manual Install Steps</h3><p>Download the “ARM 64-bit” version from the Azul website and follow these steps to unpack it and make a link to easy use it for our tests.</p><pre># Download<br>$ cd Downloads<br>$ wget https://cdn.azul.com/zulu/bin/zulu17.42.21-ca-crac-jdk17.0.7-linux_aarch64.tar.gz<br><br># Move and unpack in /opt/<br>$ sudo mv ~/Downloads/zulu17.42.21-ca-crac-jdk17.0.7-linux_aarch64.tar.gz /opt/<br>$ cd /opt/<br>$ sudo tar -xzvf zulu17.42.21-ca-crac-jdk17.0.7-linux_aarch64.tar.gz<br><br># Make a link for easier use<br>$ sudo ln -s zulu17.42.21-ca-crac-jdk17.0.7-linux_aarch64/ zulu-crac<br><br># Checking the installed version<br>$ /opt/zulu-crac/bin/java -version<br>openjdk version &quot;17.0.7&quot; 2023-04-18 LTS<br>OpenJDK Runtime Environment Zulu17.42+21-CRaC-CA (build 17.0.7+7-LTS)<br>OpenJDK 64-Bit Server VM Zulu17.42+21-CRaC-CA (build 17.0.7+7-LTS, mixed mode)</pre><h3>Using SDKMAN</h3><p>Another approach is to use <a href="https://sdkman.io/">SDKMAN</a>. When I started this test, the CRaC version of Zulu was not included yet in the list of Java distributions in SDKMAN, but thanks to a quick intervention of Gerrit Grunwald (creator of the <a href="https://github.com/foojayio/discoapi">DiscoAPI</a>) and the SDKMAN-team, this got solved within minutes.</p><pre># Install SDKMAN<br>$ sudo apt install zip<br>$ curl -s &quot;https://get.sdkman.io&quot; | bash<br>$ source &quot;$HOME/.sdkman/bin/sdkman-init.sh&quot;<br><br># Check all available Java distributions for the system<br>$ sdk list java<br>================================================================================<br>Available Java Versions for Linux ARM 64bit<br>================================================================================<br> Vendor        | Use | Version      | Dist    | Status     | Identifier<br>--------------------------------------------------------------------------------<br> AdoptOpenJDK  |     | 8.0.275+1.hs | adpt    |            | 8.0.275+1.hs-adpt<br>               |     | 8.0.252.hs   | adpt    |            | 8.0.252.hs-adpt<br> Corretto      |     | 20           | amzn    |            | 20-amzn<br>               |     | 20.0.1       | amzn    |            | 20.0.1-amzn<br>...<br> Zulu          |     | 20           | zulu    |            | 20-zulu<br>               |     | 20.0.1       | zulu    |            | 20.0.1-zulu<br>               |     | 19.0.2       | zulu    |            | 19.0.2-zulu<br>               |     | 19.0.1       | zulu    |            | 19.0.1-zulu<br>               |     | 17.0.7       | zulu    |            | 17.0.7-zulu<br>               |     | 17.0.7.crac  | zulu    |            | 17.0.7.crac-zulu<br>               |     | 17.0.6       | zulu    |            | 17.0.6-zulu<br>...<br><br># Install Zulu 17 with CRaC<br>$ sdk install java 17.0.7.crac-zulu<br>Downloading: java 17.0.7.crac-zulu<br>In progress...<br>########...######## 100.0%<br>Repackaging Java 17.0.7.crac-zulu...<br>Done repackaging...<br>Installing: java 17.0.7.crac-zulu<br>Done installing!<br>Do you want java 17.0.7.crac-zulu to be set as default? (Y/n): y<br>Setting java 17.0.7.crac-zulu as default.<br><br># Checking the installed version<br>pi@crowpi2:~/.m2 $ java -version<br>openjdk version &quot;17.0.7&quot; 2023-04-18 LTS<br>OpenJDK Runtime Environment Zulu17.42+21-CRaC-CA (build 17.0.7+7-LTS)<br>OpenJDK 64-Bit Server VM Zulu17.42+21-CRaC-CA (build 17.0.7+7-LTS, mixed mode)</pre><h3>Create a Checkpoint with a Java Test Application</h3><p>Within the CRaC-project, a demo application was created to explain the usage of the checkpoint and restore system, as <a href="https://github.com/CRaC/docs/blob/master/STEP-BY-STEP.md">described here</a>. Clone this project, build it with Maven, and execute it with an extra command line argument -XX:CRaCCheckpointTo=cr to define the directory where the checkpoint must be created.</p><pre># Get the project<br>$ git clone https://github.com/CRaC/example-jetty.git<br>$ cd example-jetty<br><br># Install Maven (if not done before)<br>$ sdk install maven<br>$ mvn -version<br>Apache Maven 3.9.2 (c9616018c7a021c1c39be70fb2843d6f5f9b8a1c)<br>Maven home: /home/crac/.sdkman/candidates/maven/current<br>Java version: 17.0.7, vendor: Azul Systems, Inc., runtime: /home/crac/.sdkman/candidates/java/17.0.7.crac-zulu<br>Default locale: en_US, platform encoding: ANSI_X3.4-1968<br>OS name: &quot;linux&quot;, version: &quot;6.1.21-v8+&quot;, arch: &quot;aarch64&quot;, family: &quot;unix&quot;<br><br># Build the application<br>$ mvn package<br><br># Run the application<br>$ java -XX:CRaCCheckpointTo=cr -jar target/example-jetty-1.0-SNAPSHOT.jar<br>[0.003s][warning][os] CRaC closing file descriptor 63: pipe:[18796]<br>2023-06-15 07:51:28.611:INFO::main: Logging initialized @540ms to org.eclipse.jetty.util.log.StdErrLog<br>2023-06-15 07:51:28.817:INFO:oejs.Server:main: jetty-9.4.48.v20220622; built: 2022-06-21T20:42:25.880Z; git: 6b67c5719d1f4371b33655ff2d047d24e171e49a; jvm 17.0.7+7-LTS<br>2023-06-15 07:51:28.938:INFO:oejs.AbstractConnector:main: Started ServerConnector@7b69c6ba{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}<br>2023-06-15 07:51:28.948:INFO:oejs.Server:main: Started @895ms</pre><p>The application started in 895ms but didn’t do anything yet. At this point, we must open a second terminal to trigger an action in the application to “warm it up”, and we can request the creation of the checkpoint.</p><pre>$ curl localhost:8080<br>Hello World<br><br>$ jcmd target/example-jetty-1.0-SNAPSHOT.jar JDK.checkpoint<br>3467:<br>CR: Checkpoint ...</pre><p>The expected result in the first terminal should be that the application log shows that the checkpoint is created and the application terminated. Unfortunately, this is the output I got, ending with an exception:</p><pre>2023-06-15 07:53:10.571:INFO:oejs.AbstractConnector:Attach Listener: Stopped ServerConnector@7b69c6ba{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}<br>Jun 15, 2023 7:53:10 AM jdk.internal.util.jar.PersistentJarFile beforeCheckpoint<br>INFO: /home/crac/example-jetty/target/dependency/crac-1.3.0.jar is recorded as always available on restore<br>Jun 15, 2023 7:53:10 AM jdk.internal.util.jar.PersistentJarFile beforeCheckpoint<br>INFO: /home/crac/example-jetty/target/dependency/jetty-http-9.4.48.v20220622.jar is recorded as always available on restore<br>Jun 15, 2023 7:53:10 AM jdk.internal.util.jar.PersistentJarFile beforeCheckpoint<br>INFO: /home/crac/example-jetty/target/dependency/jetty-server-9.4.48.v20220622.jar is recorded as always available on restore<br>Jun 15, 2023 7:53:10 AM jdk.internal.util.jar.PersistentJarFile beforeCheckpoint<br>INFO: /home/crac/example-jetty/target/dependency/jetty-util-9.4.48.v20220622.jar is recorded as always available on restore<br>Jun 15, 2023 7:53:10 AM jdk.internal.util.jar.PersistentJarFile beforeCheckpoint<br>INFO: /home/crac/example-jetty/target/dependency/jetty-io-9.4.48.v20220622.jar is recorded as always available on restore<br>Jun 15, 2023 7:53:10 AM jdk.internal.util.jar.PersistentJarFile beforeCheckpoint<br>INFO: /home/crac/example-jetty/target/example-jetty-1.0-SNAPSHOT.jar is recorded as always available on restore<br>Jun 15, 2023 7:53:10 AM jdk.internal.util.jar.PersistentJarFile beforeCheckpoint<br>INFO: /home/crac/example-jetty/target/dependency/javax.servlet-api-3.1.0.jar is recorded as always available on restore<br>JVM: invalid info for restore provided: queued code -1<br>2023-06-15 07:53:12.650:INFO:oejs.Server:Attach Listener: jetty-9.4.48.v20220622; built: 2022-06-21T20:42:25.880Z; git: 6b67c5719d1f4371b33655ff2d047d24e171e49a; jvm 17.0.7+7-LTS<br>2023-06-15 07:53:12.661:INFO:oejs.AbstractConnector:Attach Listener: Started ServerConnector@7b69c6ba{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}<br>2023-06-15 07:53:12.662:INFO:oejs.Server:Attach Listener: Started @104609ms<br>An exception during a checkpoint operation:<br>jdk.internal.crac.CheckpointException<br>	at java.base/jdk.internal.crac.Core.checkpointRestore1(Core.java:141)<br>	at java.base/jdk.internal.crac.Core.checkpointRestore(Core.java:246)<br>	at java.base/jdk.internal.crac.Core.checkpointRestoreInternal(Core.java:262)</pre><p>The file created in example-jetty/cr/dump4.log seems to lead to a possible cause, as it says that CRIU does not exist.</p><pre>(00.000127) Version: 3.17.1-crac (gitid v3.14-889-gfe637c2+1)<br>(00.000201) Running on crowpi2 Linux 5.10.92-v8+ #1514 SMP PREEMPT Mon Jan 17 17:39:38 GMT 2022 aarch64<br>(00.000240) File /run/criu.kdat does not exist<br>(00.000322) sockets: Probing sock diag modules<br>(00.007306) Warn  (criu/sockets.c:209): sockets: Diag module missing (-2)<br>(00.011884) Warn  (criu/sockets.c:209): sockets: Diag module missing (-2)<br>(00.019999) Warn  (criu/sockets.c:209): sockets: Diag module missing (-2)<br>(00.056952) sockets: Done probing<br>(00.057128) Pagemap provides flags only<br>(00.057348) Found anon-shmem device at 1<br>(00.057389) Reset 3527&#39;s dirty tracking<br>(00.057425) Dirty tracking support is OFF<br>(00.057437) Zero page detection failed, optimization turns off.<br>(00.057569) Found task size of 8000000000<br>(00.057651) Warn  (criu/proc_parse.c:930): Write 4294967295 to /proc/self/loginuid failed: Operation not permitted<br>(00.075370) Warn  (criu/net.c:3430): Unable to get tun network namespace<br>(00.075518) Warn  (criu/sk-unix.c:224): unix: Unable to open a socket file: Operation not permitted<br>(00.076455) Warn  (criu/net.c:3714): Unable create a network namespace: Operation not permitted<br>(00.077347) Warn  (criu/net.c:3770): NSID isn&#39;t reported for network links<br>(00.077463) Error (criu/kerndat.c:508): Unexpected error from memfd_create(&quot;&quot;, MFD_HUGETLB): Function not implemented<br>(00.077481) Error (criu/kerndat.c:1590): kerndat_has_memfd_hugetlb failed when initializing kerndat.<br>(00.077601) Adjust mmap_min_addr 0x1000 -&gt; 0x10000<br>(00.077619) Found mmap_min_addr 0x10000<br>(00.077660) files stat: fs/nr_open 1048576<br>(00.077677) Error (criu/crtools.c:260): Could not initialize kernel features detection.</pre><h3>Fix 1: Add CRIU to the Kernel</h3><p>Thanks to the support of my colleague Sergey Nazarkin, it quickly became apparent how we needed to solve this problem… It turned out that Raspberry Pi OS doesn’t support CRIU out-of-the-box yet. Because this Linux component is used by CRaC, at this moment, to create checkpoints and restore them, we must add this to the kernel.</p><h3>Building the Kernel Without Change</h3><p>On the Raspberry Pi website, it’s <a href="https://www.raspberrypi.com/documentation/computers/linux_kernel.html">clearly described how the Linux kernel can be compiled</a>. To validate this process, I built the kernel without modifications to ensure I understood this flow. This is an overview of all the steps:</p><pre># Check current kernel<br>$ uname -a<br>Linux raspberrypi 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr  3 17:24:16 BST 2023 aarch64 GNU/Linux<br><br># Get dependencies and kernel sources<br>$ sudo apt install git bc bison flex libssl-dev make<br>$ git clone --depth=1 https://github.com/raspberrypi/linux<br><br># Configuration for 64bit<br>$ cd linux<br>$ KERNEL=kernel8<br><br># Apply default configuration<br>$ make bcm2711_defconfig<br><br># Change the existing line with CONFIG_LOCALVERSION to make clear a custom kernel is used<br>$ nano .config<br>CONFIG_LOCALVERSION=&quot;-v8-CRAC&quot;<br><br># Build and install the kernel using 4 cores (-j4)<br>$ make -j4 Image.gz modules dtbs<br>$ sudo make modules_install<br>$ sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/<br>$ sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/overlays/<br>$ sudo cp arch/arm64/boot/dts/overlays/README /boot/overlays/<br>$ sudo cp arch/arm64/boot/Image.gz /boot/kernel8.img<br><br># Restart<br>$ sync<br>$ sudo reboot<br><br># Check kernel version and timestamp<br>$ uname -a<br>Linux crac 6.1.32-v8-CRAC+ #1 SMP PREEMPT Thu Jun 15 09:30:31 BST 2023 aarch64 GNU/Linux</pre><p>The last line proves that we could build our own kernel version, and the board has successfully started with it! On to the next step…</p><p>FYI: the command make -j4 Image.gz modules dtbs takes the longest time: 2 hours!</p><h3>Change the Kernel to Support Checkpoint/Restore</h3><p>Within the same linux directory, run the following commands:</p><pre>$ sudo apt install libncurses5-dev <br>$ make menuconfig</pre><ul><li>Go to “General setup”</li><li>Scroll down and select “Checkpoint/restore support”</li><li>Save and exit</li><li>Repeat the process to build the kernel starting from make -j4 Image.gz modules dtbs</li><li>After reboot, check that the new kernel is used, by checking the new timestamp</li></ul><pre>$ uname -a<br>Linux crac 6.1.32-v8-CRAC+ #2 SMP PREEMPT Thu Jun 15 11:08:18 BST 2023 aarch64 GNU/Linux</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ylwiFBxzWzj_SzDL7XCGMQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VAzjyz0J8yXks_JOymngow.png" /></figure><h3>Retry the Checkpoint Creation with Fix 1</h3><p>Unfortunately, this kernel change is insufficient, as the same error occurs during checkpoint creation…</p><h3>Fix 2: Replace Zulu with a Dev Version</h3><p>As it turns out, the current Zulu version 17.0.7 with CRaC doesn’t support this Linux kernel. Luckily, Sergey could provide me a dev-version of Zulu with changes that will be part of the next release in July. First, I needed to upload them to my Raspberry Pi.</p><pre>% scp zulu17.42.21-dev-20230613095837-jdk17.0.7-linux-aarch64.tar.gz crac@172.16.1.145:/home/crac/</pre><p>And then installed in the /opt/ directory as described above.</p><pre>$ sudo mv zulu17.42.21-dev-20230614092542-jdk17.0.7-linux-aarch64.tar.gz /opt/<br>$ cd /opt/<br>$ sudo tar -xzvf zulu17.42.21-dev-20230614092542-jdk17.0.7-linux-aarch64.tar.gz<br>$ sudo ln -s zulu17.42.21-dev-20230614092542-jdk17.0.7-linux-aarch64 zulu-crac<br>$ sudo rm zulu17.42.21-dev-20230614092542-jdk17.0.7-linux-aarch64.tar.gz<br>$ /opt/zulu-crac/bin/java -version<br>openjdk version &quot;17.0.7&quot; 2023-04-18 LTS<br>OpenJDK Runtime Environment Zulu17.42+21-CRaC-CA-dev-20230614092542 (build 17.0.7+7-LTS-dev-20230614092542)<br>OpenJDK 64-Bit Server VM Zulu17.42+21-CRaC-CA-dev-20230614092542 (build 17.0.7+7-LTS-dev-20230614092542, mixed mode, sharing)</pre><h3>Retry the Checkpoint Creation with Fix 1 and 2</h3><p>With the modified kernel in place and the dev-version of Zulu, the checkpoint creation command shows this result in the application log:</p><p>In Terminal 1:</p><pre>/opt/zulu-crac/bin/java -XX:CRaCCheckpointTo=cr -jar target/example-jetty-1.0-SNAPSHOT.jar<br><br>[0.002s][warning][os] CRaC closing file descriptor 63: pipe:[17763]<br>2023-06-15 11:30:33.400:INFO::main: Logging initialized @327ms to org.eclipse.jetty.util.log.StdErrLog<br>2023-06-15 11:30:33.620:INFO:oejs.Server:main: jetty-9.4.48.v20220622; built: 2022-06-21T20:42:25.880Z; git: 6b67c5719d1f4371b33655ff2d047d24e171e49a; jvm 17.0.7+7-LTS-dev-20230614092542<br>2023-06-15 11:30:33.739:INFO:oejs.AbstractConnector:main: Started ServerConnector@63d4e2ba{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}<br>2023-06-15 11:30:33.745:INFO:oejs.Server:main: Started @684ms<br>2023-06-15 11:32:14.765:INFO:oejs.AbstractConnector:Attach Listener: Stopped ServerConnector@63d4e2ba{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}<br>Jun 15, 2023 11:32:14 AM jdk.internal.crac.LoggerContainer info<br>INFO: /home/crac/example-jetty/target/dependency/crac-1.3.0.jar is recorded as always available on restore<br>Jun 15, 2023 11:32:14 AM jdk.internal.crac.LoggerContainer info<br>INFO: /home/crac/example-jetty/target/dependency/jetty-io-9.4.48.v20220622.jar is recorded as always available on restore<br>Jun 15, 2023 11:32:14 AM jdk.internal.crac.LoggerContainer info<br>INFO: /home/crac/example-jetty/target/dependency/jetty-util-9.4.48.v20220622.jar is recorded as always available on restore<br>Jun 15, 2023 11:32:14 AM jdk.internal.crac.LoggerContainer info<br>INFO: /home/crac/example-jetty/target/dependency/jetty-http-9.4.48.v20220622.jar is recorded as always available on restore<br>Jun 15, 2023 11:32:14 AM jdk.internal.crac.LoggerContainer info<br>INFO: /home/crac/example-jetty/target/dependency/javax.servlet-api-3.1.0.jar is recorded as always available on restore<br>Jun 15, 2023 11:32:14 AM jdk.internal.crac.LoggerContainer info<br>INFO: /home/crac/example-jetty/target/dependency/jetty-server-9.4.48.v20220622.jar is recorded as always available on restore<br>Jun 15, 2023 11:32:14 AM jdk.internal.crac.LoggerContainer info<br>INFO: /home/crac/example-jetty/target/example-jetty-1.0-SNAPSHOT.jar is recorded as always available on restore<br>Killed</pre><p>In Terminal 2:</p><pre>$ curl localhost:8080<br>Hello World<br><br>$ /opt/zulu-crac/bin/jcmd target/example-jetty-1.0-SNAPSHOT.jar JDK.checkpoint<br>10429:<br>CR: Checkpoint ...</pre><p>It seems we have a breakthrough here, and the checkpoint was successfully created, after which the application was killed!</p><h3>Restart From Checkpoint</h3><p>In the cr directory that we defined at startup of the application with -XX:CRaCCheckpointTo=cr, we can now find the following files:</p><pre>ls -lh cr<br>total 28M<br>-rw-r--r-- 1 crac crac 2.0K Jun 15 11:33 core-10429.img<br>-rw-r--r-- 1 crac crac  571 Jun 15 11:33 core-10430.img<br>-rw-r--r-- 1 crac crac  558 Jun 15 11:33 core-10432.img<br>-rw-r--r-- 1 crac crac  535 Jun 15 11:33 core-10433.img<br>-rw-r--r-- 1 crac crac  569 Jun 15 11:33 core-10434.img<br>-rw-r--r-- 1 crac crac  549 Jun 15 11:33 core-10435.img<br>-rw-r--r-- 1 crac crac  568 Jun 15 11:33 core-10436.img<br>-rw-r--r-- 1 crac crac  626 Jun 15 11:33 core-10437.img<br>-rw-r--r-- 1 crac crac  565 Jun 15 11:33 core-10438.img<br>-rw-r--r-- 1 crac crac  532 Jun 15 11:33 core-10439.img<br>-rw-r--r-- 1 crac crac  571 Jun 15 11:33 core-10440.img<br>-rw-r--r-- 1 crac crac  551 Jun 15 11:33 core-10441.img<br>-rw-r--r-- 1 crac crac  574 Jun 15 11:33 core-10442.img<br>-rw-r--r-- 1 crac crac  576 Jun 15 11:33 core-10443.img<br>-rw-r--r-- 1 crac crac  568 Jun 15 11:33 core-10444.img<br>-rw-r--r-- 1 crac crac  573 Jun 15 11:33 core-10445.img<br>-rw-r--r-- 1 crac crac  557 Jun 15 11:33 core-10446.img<br>-rw-r--r-- 1 crac crac  547 Jun 15 11:33 core-10447.img<br>-rw-r--r-- 1 crac crac  532 Jun 15 11:33 core-10448.img<br>-rw-r--r-- 1 crac crac  580 Jun 15 11:33 core-10457.img<br>-rw-r--r-- 1 crac crac  553 Jun 15 11:33 core-10615.img<br>-rw-r--r-- 1 crac crac  592 Jun 15 11:33 core-10616.img<br>-rw-r--r-- 1 crac crac  586 Jun 15 11:33 core-10617.img<br>-rw-r--r-- 1 crac crac   27 Jun 15 11:33 cppath<br>-rw------- 1 crac crac 209K Jun 15 11:33 dump4.log<br>-rw-r--r-- 1 crac crac  152 Jun 15 11:33 fdinfo-2.img<br>-rw-r--r-- 1 crac crac 3.9K Jun 15 11:33 files.img<br>-rw-r--r-- 1 crac crac   18 Jun 15 11:33 fs-10429.img<br>-rw-r--r-- 1 crac crac   36 Jun 15 11:33 ids-10429.img<br>-rw-r--r-- 1 crac crac   46 Jun 15 11:33 inventory.img<br>-rw-r--r-- 1 crac crac 7.7K Jun 15 11:33 mm-10429.img<br>-rw-r--r-- 1 crac crac 3.3K Jun 15 11:33 pagemap-10429.img<br>-rw-r--r-- 1 crac crac  28M Jun 15 11:33 pages-1.img<br>-rw------- 1 crac crac  32K Jun 15 11:33 perfdata<br>-rw-r--r-- 1 crac crac   92 Jun 15 11:33 pstree.img<br>-rw-r--r-- 1 crac crac   12 Jun 15 11:33 seccomp.img<br>-rw-r--r-- 1 crac crac   52 Jun 15 11:33 stats-dump<br>-rw-r--r-- 1 crac crac   34 Jun 15 11:33 timens-0.img<br>-rw-r--r-- 1 crac crac  199 Jun 15 11:33 tty-info.img</pre><p>As mentioned on <a href="https://docs.azul.com/core/crac/crac-debugging#failures-in-native-checkpoint-or-restore">Azul Docs &gt; Debugging Coordinated Restore at Checkpoint Failures &gt; Failures in Native Checkpoint or Restore</a>, the permissions of criu with the JDK must be set correctly.</p><pre>$ ls -l /opt/zulu-crac/lib/criu<br>-rwxr-xr-x 1 1001 1001 7241504 Jun 14 10:40 /opt/zulu-crac/lib/criu<br>$ sudo chown root:root  /opt/zulu-crac/lib/criu<br>$ sudo chmod u+s /opt/zulu-crac/lib/criu<br>$ ls -l /opt/zulu-crac/lib/criu<br>-rwsr-xr-x 1 root root 7241504 Jun 14 10:40 /opt/zulu-crac/lib/criu</pre><p>When this is done, we can restart the application from the checkpoint:</p><pre>$ /opt/zulu-crac/bin/java -XX:CRaCRestoreFrom=cr<br>2023-06-15 12:32:38.430:INFO:oejs.Server:Attach Listener: jetty-9.4.48.v20220622; built: 2022-06-21T20:42:25.880Z; git: 6b67c5719d1f4371b33655ff2d047d24e171e49a; jvm 17.0.7+7-LTS-dev-20230614092542<br>2023-06-15 12:32:38.449:INFO:oejs.AbstractConnector:Attach Listener: Started ServerConnector@63d4e2ba{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}<br>2023-06-15 12:32:38.450:INFO:oejs.Server:Attach Listener: Started @3578432ms</pre><p>There is still a fix required to show the correct startup duration, but based on the timestamps we can see that it only took 450-430 = 20 milliseconds!</p><h3>Conclusion</h3><p>You can’t run this test in a few minutes as the kernel takes a long time to build. But this first test shows that CRaC on embedded / Raspberry Pi is definitely possible and dramatically improves the startup time!</p><p>I’m checking how <a href="https://forums.raspberrypi.com/viewtopic.php?t=352607">CRIU can be enabled in the Raspberry Pi Linux Kernel by default</a>, and Azul is working on a subsequent iteration of the CRaC implementation in Zulu for even more improvements!</p><p>CRaC is, again, a fantastic piece of engineering within OpenJDK and can be used on a big number of (embedded) devices.</p><p><em>Originally published at </em><a href="https://webtechie.be/post/2023-06-15-crac-on-raspberry-pi/"><em>https://webtechie.be</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9017d31567d1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/javarevisited/running-a-crac-java-application-on-raspberry-pi-9017d31567d1">Running a CRaC Java application on Raspberry Pi</a> was originally published in <a href="https://medium.com/javarevisited">Javarevisited</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[One Year as a Technical Writer at Azul: A Journey of Growth and Learning.]]></title>
            <link>https://medium.com/javarevisited/one-year-as-a-technical-writer-at-azul-a-journey-of-growth-and-learning-20a17fc22aec?source=rss-a6ee926d3fc8------2</link>
            <guid isPermaLink="false">https://medium.com/p/20a17fc22aec</guid>
            <category><![CDATA[java]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[technical-writing]]></category>
            <dc:creator><![CDATA[Frank Delporte]]></dc:creator>
            <pubDate>Wed, 14 Jun 2023 07:22:46 GMT</pubDate>
            <atom:updated>2023-06-23T15:33:58.578Z</atom:updated>
            <content:encoded><![CDATA[<p>Writing has always been my passion, and even in my previous jobs as a developer, I stood out as the one who enjoyed creating and maintaining documentation. But June 9th, 2023, marked my first birthday as a full-time technical writer at Azul. Yes, it’s already a year ago that I changed from being a developer-who-also-writes to a writer-who-also-develops. Let’s take a moment to reflect on my incredible journey over the past year.</p><p>NOTE: I’m not mentioning any names here, as a lot of people have helped me to evolve to where I am now, and I can not name them all :-)</p><h3>Highlights</h3><p>Due to the COVID-19 pandemic, I had been working from home for a longer time already, but that was for local companies. So I could still visit the office whenever needed, to sit together with a few people, or test something on one of the devices I have been working on. But as I am now the “complete Belgium division of Azul,” it’s harder to meet my colleagues in real life. However, I quickly realized that Zoom became an invaluable tool for building personal connections despite being physically distant. Because the Azul team is spread across the globe, the biggest challenge was to determine the time zones everyone for everyone and when the best times to have a call. But again, this also brings an advantage as I can prepare a new document or suggest updates before the end of my working day, and by the following morning, it has been reviewed, or I have a bunch of Slack messages to handle and create a next iteration.</p><h3>Documentation and Articles</h3><p>I joined Azul because I wanted to learn more about Java. I had been developing with it for over ten years, but I hardly knew what was happening “inside” the JVM executing that code. And I sure arrived at the perfect company! The amount of knowledge and years of experience within this company is impressive.</p><p>The main task for the docs team is to maintain, extend and keep <a href="https://docs.azul.com/">docs.azul.com</a> up-to-date. Next to the docs site, we also write blog posts for <a href="https://www.azul.com/blog/">www.azul.com</a>. For example, I wanted to write articles to explain the <a href="https://www.azul.com/blog/jit-performance-ahead-of-time-versus-just-in-time/">difference between Just-In-Time (JIT) and Ahead-Of-Time (AOT) compilers</a> and <a href="https://www.azul.com/blog/what-should-i-know-about-garbage-collection-as-a-java-developer/">how the Garbage Collector in the JVM works</a>. I had the opportunity to directly connect and collaborate with the creators and experts behind these technologies. I could have a chat with them and review the article. These were my first blog posts for the Azul website, but <a href="https://www.azul.com/blog/author/fdelporte/">a lot more got published</a> since then.</p><h3>Trips</h3><p>To meet my colleagues in person, I had a short trip to Prague and a week in New Orleans, which were great. Actually my first-ever trip across the ocean! However, for my colleagues who are constantly traveling, that’s quite hard to understand ;-)</p><h3>Conferences</h3><p>I wanted to start speaking at Java conferences just when the pandemic changed our way of living. The only benefit was the opportunity to <a href="https://webtechie.be/presentations/">speak at virtual conferences across the globe</a>. Fortunately, in 2022, circumstances changed for the better. I spoke (in-person) at Devoxx Belgium (twice!) and J-Fall in the Netherlands. At Devoxx, I was even part of the Azul team in the conference hall, which gave me the opportunity to speak to a lot of Java developers and learn about the real needs of running Java in production in small and big environments. A few weeks ago, I also had a “quickie” at VoxxedDaysBrussels, and on June 21st I will be closing <a href="https://jspring.nl/timetable-2023/">J-Spring in the Netherlands</a>.</p><h3>Java User Group (JUG)</h3><p>During Devoxx, BeJUG was “reborn,” and I organized my very first own <a href="https://www.meetup.com/belgian-java-user-group/events/290693260/">JUG in Kortrijk</a>. I’m happy to be a small part of this organization and look forward to contributing more to this community next season after the summer.</p><p>I’m convinced that being a part of the Azul team and writing about Java for both the Azul blog and <a href="https://foojay.io/today/author/frankdelporte/">Foojay.io</a> has helped me to get invited to these conferences and to be able to invite excellent speakers to BeJUG.</p><h3>Podcasts</h3><p>As part of my role at Azul, I aim to promote the Java ecosystem.” That’s why I took the initiative to relaunch the Foojay Podcasts. Thanks to my current job, I could invite many community members to discuss various topics. The complete list of the podcasts <a href="https://foojay.io/today/category/podcast/">can be found here</a>.</p><h3>Java Champion</h3><p>To my surprise, earlier this year, I became a Java Champion! I’m convinced more people noticed me and invited me to join <a href="https://javachampions.org/members.html">this group of Java “speakers and lecturers,”</a> thanks to my presentations at Devoxx and the articles I wrote for the Azul blog and Foojay.</p><h3>The Side Projects</h3><p>Since embarking on my book project, <a href="https://webtechie.be/books/">“Getting Started with Java on the Raspberry Pi”</a>, I got involved in the <a href="https://pi4j.com/">Pi4J project</a>. As with all open-source “pet” projects, it can only progress based on the contributions of individuals with available time. I wish I could have done more, but there is a steady flow of contributions by different people, and it is nice to see that the library itself is stable and only minor bugs were discovered.</p><p>Nevertheless, despite my limited availability, I had another idea in my head for over a year. In my previous job, we used <a href="https://lottiefiles.com/">Lottie animations</a> in the mobile app to guide the user through the installation process of a robot. I like the idea of this project as it reminds me a bit of the Flash animations from many years ago. As I couldn’t find a player for these animations in JavaFX, I started the <a href="https://lottie4j.com/">Lottie4J project</a>. The first part of this project to read and parse Lottie files to Java objects is working for the most significant part. But the player gave me some headaches as the Lottie format regarding animations and timelines is quite complex. So I didn’t get as far as I hoped in the first steps. But I hope to pick up this project soon and use it to fully master all the new features introduced in Java regarding instanceOf, like &quot; <a href="https://openjdk.org/jeps/443">JEP 443: Unnamed Patterns and Variables</a>&quot; and &quot; <a href="https://openjdk.org/jeps/441">JEP 441: Pattern Matching for switch</a> &quot;, as they can reduce code and improve readability.</p><h3>The Bad</h3><p>The past year we have been presented with significant personal challenges for our family. Our son changed from the local school to the secondary school in the city. Combined with puberty and the struggle with being adopted, this has brought a lot of conflicts and bad events. With long waiting lists, we discovered that psychological help is tough in Belgium. It has taken us a lot of time to see what could be a solution and a way forward, and we hope that a specialized school will bring back stability and the special care he needs.</p><p>Working from home and flexibly arranging my work have been critical factors in handling the stress involved in this process. Again a reason why I love my job.</p><h3>Conclusion</h3><p>When I started this new job at Azul, one of my JavaFX heroes asked me if this was now my permanent new direction or if I would go back to programming one day. Frankly, I have no idea what the future will bring. But I do know I’m currently in the position I want and need to be. Doing what I need to do, with a lot of freedom when to do it, and continuously learning from the brightest people in the industry? Yes, I am excited to continue this fulfilling journey for the foreseeable future…</p><p><em>Originally published at </em><a href="https://webtechie.be/post/2023-06-11-review-first-year-as-tech-writer/"><em>https://webtechie.be</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=20a17fc22aec" width="1" height="1" alt=""><hr><p><a href="https://medium.com/javarevisited/one-year-as-a-technical-writer-at-azul-a-journey-of-growth-and-learning-20a17fc22aec">One Year as a Technical Writer at Azul: A Journey of Growth and Learning.</a> was originally published in <a href="https://medium.com/javarevisited">Javarevisited</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>